SND@LHC Software
Loading...
Searching...
No Matches
readMilleBinary.py
Go to the documentation of this file.
1#!/usr/bin32/python
2
3
44
45from __future__ import print_function
46import array, sys
47
48# ############### read millepede binary file #################
49#
50
51Cfiles = 1 # Cfiles
52#Cfiles = 0 # Fortran files
53#
54
55intfmt = 'i' # SL5, gcc-4
56#intfmt = 'l' # SL4, gcc-3
57#
58
59fname = "milleBinaryISN.dat"
60#
61
62mrec = 10
63
64skiprec = 0
65
66minval = None # allows for NaNs
67#
68# ## C. Kleinwort - DESY ########################
69
70# ## use command line arguments ?
71narg = len(sys.argv)
72if narg > 1:
73 if narg < 3:
74 print(" usage: readMilleBinary.py <file name> <number of records> [<number of records to skip> <minimum value to print derivative>]")
75 sys.exit(2)
76 else:
77 fname = sys.argv[1]
78 mrec = int(sys.argv[2])
79 if narg > 3:
80 skiprec = int(sys.argv[3])
81 if narg > 4:
82 minval = float(sys.argv[4])
83
84#print " input ", fname, mrec, skiprec
85
86f = open(fname, "rb")
87
88nrec = 0
89try:
90 while (nrec < mrec + skiprec) or (mrec < 0):
91# read 1 record
92 nr = 0
93 if (Cfiles == 0):
94 lenf = array.array(intfmt)
95 lenf.fromfile(f, 2)
96
97 length = array.array(intfmt)
98 length.fromfile(f, 1)
99 nr = abs(length[0] / 2)
100 nrec += 1
101
102 if length[0] > 0:
103 glder = array.array('f')
104 else:
105 glder = array.array('d')
106 glder.fromfile(f, nr)
107
108 inder = array.array(intfmt)
109 inder.fromfile(f, nr)
110
111 if (Cfiles == 0):
112 lenf = array.array(intfmt)
113 lenf.fromfile(f, 2)
114
115 if (nrec <= skiprec): # must be after last fromfile
116 continue
117
118 print(" === NR ", nrec, length[0] / 2)
119
120 # no details, only header
121 if (mrec < -1):
122 continue
123
124 i = 0
125 nh = 0
126 ja = 0
127 jb = 0
128 jsp = 0
129 nsp = 0
130 while (i < (nr - 1)):
131 i += 1
132 while (i < nr) and (inder[i] != 0): i += 1
133 ja = i
134 i += 1
135 while (i < nr) and (inder[i] != 0): i += 1
136 jb = i
137 i += 1
138 # special data ?
139 if (ja + 1 == jb) and (glder[jb] < 0.):
140 jsp = jb
141 nsp = int(-glder[jb])
142 i += nsp - 1
143 print(' ### spec. ', nsp, inder[jsp + 1:i + 1], glder[jsp + 1:i + 1])
144 continue
145 while (i < nr) and (inder[i] != 0): i += 1
146 i -= 1
147 nh += 1
148 if (jb < i):
149# measurement with global derivatives
150 print(' -g- meas. ', nh, inder[jb + 1], jb - ja - 1, i - jb, glder[ja], glder[jb])
151 else:
152# measurement without global derivatives
153 print(' -l- meas. ', nh, inder[ja + 1], jb - ja - 1, i - jb, glder[ja], glder[jb])
154 if (ja + 1 < jb):
155 lab = []
156 val = []
157 for k in range(ja + 1, jb):
158 if minval is None:
159 lab.append(inder[k])
160 val.append(glder[k])
161 elif abs(glder[k]) >= minval:
162 lab.append(inder[k])
163 val.append(glder[k])
164 print(" local ", lab)
165 print(" local ", val)
166 if (jb + 1 < i + 1):
167 lab = []
168 val = []
169 for k in range(jb + 1, i + 1):
170 if minval is None:
171 lab.append(inder[k])
172 val.append(glder[k])
173 elif abs(glder[k]) >= minval:
174 lab.append(inder[k])
175 val.append(glder[k])
176 print(" global ", lab)
177 print(" global ", val)
178
179except EOFError:
180 print()
181 if (nr > 0):
182 print(" >>> error: end of file before end of record", nrec)
183 else:
184 print(" end of file after", nrec, "records")
185
186f.close()