1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import numpy
16 import struct, logging
17 logger = logging.getLogger("GEimage")
18 from fabioimage import fabioimage
19 from fabioutils import next_filename, previous_filename
20
21 GE_HEADER_INFO = [
22
23 ('ImageFormat', 10, None),
24 ('VersionOfStandardHeader', 2, '=H'),
25 ('StandardHeaderSizeInBytes', 4, '=L'),
26 ('VersionOfUserHeader', 2, '=H'),
27 ('UserHeaderSizeInBytes', 4, '=L'),
28 ('NumberOfFrames', 2, '=H'),
29 ('NumberOfRowsInFrame', 2, '=H'),
30 ('NumberOfColsInFrame', 2, '=H'),
31 ('ImageDepthInBits', 2, '=H'),
32 ('AcquisitionDate', 20, None),
33 ('AcquisitionTime', 20, None),
34 ('DUTID', 20, None),
35 ('Operator', 50, None),
36 ('DetectorSignature', 20, None),
37 ('TestSystemName', 20, None),
38 ('TestStationRevision', 20, None),
39 ('CoreBundleRevision', 20, None),
40 ('AcquisitionName', 40, None),
41 ('AcquisitionParameterRevision', 20, None),
42 ('OriginalNumberOfRows', 2, '=H'),
43 ('OriginalNumberOfColumns', 2, '=H'),
44 ('RowNumberUpperLeftPointArchiveROI', 2, '=H'),
45 ('ColNumberUpperLeftPointArchiveROI', 2, '=H'),
46 ('Swapped', 2, '=H'),
47 ('Reordered', 2, '=H'),
48 ('HorizontalFlipped', 2, '=H'),
49 ('VerticalFlipped', 2, '=H'),
50 ('WindowValueDesired', 2, '=H'),
51 ('LevelValueDesired', 2, '=H'),
52 ('AcquisitionMode', 2, '=H'),
53 ('AcquisitionType', 2, '=H'),
54 ('UserAcquisitionCoffFileName1', 100, None),
55 ('UserAcquisitionCoffFileName2', 100, None),
56 ('FramesBeforeExpose', 2, '=H'),
57 ('FramesDuringExpose', 2, '=H'),
58 ('FramesAfterExpose', 2, '=H'),
59 ('IntervalBetweenFrames', 2, '=H'),
60 ('ExposeTimeDelayInMicrosecs', 8, '=d'),
61 ('TimeBetweenFramesInMicrosecs', 8, '=d'),
62 ('FramesToSkipExpose', 2, '=H'),
63 ('ExposureMode', 2, '=H'),
64 ('PrepPresetTimeInMicrosecs', 8, '=d'),
65 ('ExposePresetTimeInMicrosecs', 8, '=d'),
66 ('AcquisitionFrameRateInFps', 4, '=f'),
67 ('FOVSelect', 2, '=H'),
68 ('ExpertMode', 2, '=H'),
69 ('SetVCommon1', 8, '=d'),
70 ('SetVCommon2', 8, '=d'),
71 ('SetAREF', 8, '=d'),
72 ('SetAREFTrim', 4, '=L'),
73 ('SetSpareVoltageSource', 8, '=d'),
74 ('SetCompensationVoltageSource', 8, '=d'),
75 ('SetRowOffVoltage', 8, '=d'),
76 ('SetRowOnVoltage', 8, '=d'),
77 ('StoreCompensationVoltage', 4, '=L'),
78 ('RampSelection', 2, '=H'),
79 ('TimingMode', 2, '=H'),
80 ('Bandwidth', 2, '=H'),
81 ('ARCIntegrator', 2, '=H'),
82 ('ARCPostIntegrator', 2, '=H'),
83 ('NumberOfRows', 4, '=L'),
84 ('RowEnable', 2, '=H'),
85 ('EnableStretch', 2, '=H'),
86 ('CompEnable', 2, '=H'),
87 ('CompStretch', 2, '=H'),
88 ('LeftEvenTristate', 2, '=H'),
89 ('RightOddTristate', 2, '=H'),
90 ('TestModeSelect', 4, '=L'),
91 ('AnalogTestSource', 4, '=L'),
92 ('VCommonSelect', 4, '=L'),
93 ('DRCColumnSum', 4, '=L'),
94 ('TestPatternFrameDelta', 4, '=L'),
95 ('TestPatternRowDelta', 4, '=L'),
96 ('TestPatternColumnDelta', 4, '=L'),
97 ('DetectorHorizontalFlip', 2, '=H'),
98 ('DetectorVerticalFlip', 2, '=H'),
99 ('DFNAutoScrubOnOff', 2, '=H'),
100 ('FiberChannelTimeOutInMicrosecs', 4, '=L'),
101 ('DFNAutoScrubDelayInMicrosecs', 4, '=L'),
102 ('StoreAECROI', 2, '=H'),
103 ('TestPatternSaturationValue', 2, '=H'),
104 ('TestPatternSeed', 4, '=L'),
105 ('ExposureTimeInMillisecs', 4, '=f'),
106 ('FrameRateInFps', 4, '=f'),
107 ('kVp', 4, '=f'),
108 ('mA', 4, '=f'),
109 ('mAs', 4, '=f'),
110 ('FocalSpotInMM', 4, '=f'),
111 ('GeneratorType', 20, None),
112 ('StrobeIntensityInFtL', 4, '=f'),
113 ('NDFilterSelection', 2, '=H'),
114 ('RefRegTemp1', 8, '=d'),
115 ('RefRegTemp2', 8, '=d'),
116 ('RefRegTemp3', 8, '=d'),
117 ('Humidity1', 4, '=f'),
118 ('Humidity2', 4, '=f'),
119 ('DetectorControlTemp', 8, '=d'),
120 ('DoseValueInmR', 8, '=d'),
121 ('TargetLevelROIRow0', 2, '=H'),
122 ('TargetLevelROICol0', 2, '=H'),
123 ('TargetLevelROIRow1', 2, '=H'),
124 ('TargetLevelROICol1', 2, '=H'),
125 ('FrameNumberForTargetLevelROI', 2, '=H'),
126 ('PercentRangeForTargetLevel', 2, '=H'),
127 ('TargetValue', 2, '=H'),
128 ('ComputedMedianValue', 2, '=H'),
129 ('LoadZero', 2, '=H'),
130 ('MaxLUTOut', 2, '=H'),
131 ('MinLUTOut', 2, '=H'),
132 ('MaxLinear', 2, '=H'),
133 ('Reserved', 2, '=H'),
134 ('ElectronsPerCount', 2, '=H'),
135 ('ModeGain', 2, '=H'),
136 ('TemperatureInDegC', 8, '=d'),
137 ('LineRepaired', 2, '=H'),
138 ('LineRepairFileName', 100, None),
139 ('CurrentLongitudinalInMM', 4, '=f'),
140 ('CurrentTransverseInMM', 4, '=f'),
141 ('CurrentCircularInMM', 4, '=f'),
142 ('CurrentFilterSelection', 4, '=L'),
143 ('DisableScrubAck', 2, '=H'),
144 ('ScanModeSelect', 2, '=H'),
145 ('DetectorAppSwVersion', 20, None),
146 ('DetectorNIOSVersion', 20, None),
147 ('DetectorPeripheralSetVersion', 20, None),
148 ('DetectorPhysicalAddress', 20, None),
149 ('PowerDown', 2, '=H'),
150 ('InitialVoltageLevel_VCOMMON', 8, '=d'),
151 ('FinalVoltageLevel_VCOMMON', 8, '=d'),
152 ('DmrCollimatorSpotSize', 10, None),
153 ('DmrTrack', 5, None),
154 ('DmrFilter', 5, None),
155 ('FilterCarousel', 2, '=H'),
156 ('Phantom', 20, None),
157 ('SetEnableHighTime', 2, '=H'),
158 ('SetEnableLowTime', 2, '=H'),
159 ('SetCompHighTime', 2, '=H'),
160 ('SetCompLowTime', 2, '=H'),
161 ('SetSyncLowTime', 2, '=H'),
162 ('SetConvertLowTime', 2, '=H'),
163 ('SetSyncHighTime', 2, '=H'),
164 ('SetEOLTime', 2, '=H'),
165 ('SetRampOffsetTime', 2, '=H'),
166 ('FOVStartingValue', 2, '=H'),
167 ('ColumnBinning', 2, '=H'),
168 ('RowBinning', 2, '=H'),
169 ('BorderColumns64', 2, '=H'),
170 ('BorderRows64', 2, '=H'),
171 ('FETOffRows64', 2, '=H'),
172 ('FOVStartColumn128', 2, '=H'),
173 ('FOVStartRow128', 2, '=H'),
174 ('NumberOfColumns128', 2, '=H'),
175 ('NumberOfRows128', 2, '=H'),
176 ('VFPAquisition', 2000, None),
177 ('Comment', 200, None)
178 ]
179
180
182
183 _need_a_seek_to_read = True
184
186 """ Read a GE image header """
187
188 infile.seek(0)
189
190 self.header = {}
191 for name, nbytes, format in GE_HEADER_INFO:
192 if format is None:
193 self.header[ name ] = infile.read(nbytes)
194 else:
195 self.header[ name ] = struct.unpack(format,
196 infile.read(nbytes))[0]
197
198 - def read(self, fname, frame=None):
199 """
200 Read in header into self.header and
201 the data into self.data
202 """
203 if frame is None:
204 frame = 0
205 self.header = {}
206 self.resetvals()
207 infile = self._open(fname, "rb")
208 self.sequencefilename = fname
209 self._readheader(infile)
210 self.nframes = self.header['NumberOfFrames']
211 self._readframe(infile, frame)
212 infile.close()
213 return self
214
216 """ The thing to be printed for the user to represent a frame inside
217 a file """
218 self.filename = "%s$%04d" % (self.sequencefilename,
219 self.currentframe)
220
222 """
223 # Load only one image from the sequence
224 # Note: the first image in the sequence 0
225 # raises an exception if you give an invalid image
226 # otherwise fills in self.data
227 """
228 if(img_num > self.nframes or img_num < 0):
229 raise Exception("Bad image number")
230 imgstart = self.header['StandardHeaderSizeInBytes'] + \
231 self.header['UserHeaderSizeInBytes'] + \
232 img_num * self.header['NumberOfRowsInFrame'] * \
233 self.header['NumberOfColsInFrame'] * \
234 self.header['ImageDepthInBits'] / 8
235
236 filepointer.seek(imgstart, 0)
237
238 self.bpp = self.header['ImageDepthInBits'] / 8
239 imglength = self.header['NumberOfRowsInFrame'] * \
240 self.header['NumberOfColsInFrame'] * self.bpp
241 if self.bpp != 2:
242 logging.warning("Using uint16 for GE but seems to be wrong")
243
244
245 self.data = numpy.fromstring(filepointer.read(imglength), numpy.uint16)
246 self.data.shape = (self.header['NumberOfRowsInFrame'],
247 self.header['NumberOfColsInFrame'])
248 self.dim2 , self.dim1 = self.data.shape
249 self.currentframe = int(img_num)
250 self._makeframename()
251
252
253 - def write(self, fname, force_type=numpy.uint16):
254 """ Not yet implemented"""
255 raise Exception("Write is not implemented")
256
258 """
259 Returns a frame as a new fabioimage object
260 """
261 if num < 0 or num > self.nframes:
262 raise Exception("Requested frame number is out of range")
263
264 newheader = {}
265 for k in self.header.keys():
266 newheader[k] = self.header[k]
267 frame = GEimage(header=newheader)
268 frame.nframes = self.nframes
269 frame.sequencefilename = self.sequencefilename
270 infile = frame._open(self.sequencefilename, "rb")
271 frame._readframe(infile, num)
272 infile.close()
273 return frame
274
276 """
277 Get the next image in a series as a fabio image
278 """
279 if self.currentframe < (self.nframes - 1) and self.nframes > 1:
280 return self.getframe(self.currentframe + 1)
281 else:
282 newobj = GEimage()
283 newobj.read(next_filename(
284 self.sequencefilename))
285 return newobj
286
288 """
289 Get the previous image in a series as a fabio image
290 """
291 if self.currentframe > 0:
292 return self.getframe(self.currentframe - 1)
293 else:
294 newobj = GEimage()
295 newobj.read(previous_filename(
296 self.sequencefilename))
297 return newobj
298
299
301 import sys, time
302
303 if len(sys.argv) < 2:
304 print "USAGE: GE_script.py <GEaSi_raw_image_file>"
305 sys.exit()
306
307 image_file = sys.argv[1]
308
309 print "init read_GEaSi_data class and load header.."
310 sequence1 = GEimage()
311 sequence1.read(image_file)
312
313 print "TimeBetweenFramesInMicrosecs = ",
314 print sequence1.header['TimeBetweenFramesInMicrosecs']
315 print "AcquisitionTime = ",
316 print sequence1.header['AcquisitionTime']
317
318
319 print "Mean = ", sequence1.data.ravel().mean()
320
321 while 1:
322 start = time.time()
323 try:
324 sequence1 = sequence1.next()
325 print sequence1.currentframe, sequence1.data.ravel().mean(), \
326 time.time() - start
327 except Exception, ex:
328 raise ex
329
330
331
332
333 if __name__ == '__main__':
334 demo()
335