1 | #!/usr/bin/python -tt
|
---|
2 | #
|
---|
3 | #
|
---|
4 |
|
---|
5 | from pyfact import RawData
|
---|
6 | from drs_spikes import DRSSpikes
|
---|
7 | from fir_filter import CFD
|
---|
8 | from fir_filter import SlidingAverage
|
---|
9 |
|
---|
10 | import os.path
|
---|
11 | import sys
|
---|
12 | import numpy as np
|
---|
13 | try:
|
---|
14 | import h5py
|
---|
15 | except:
|
---|
16 | print 'module h5py needed for this process ... aborting'
|
---|
17 | sys.exit(1)
|
---|
18 |
|
---|
19 | data_filename = 'data/20111017_010.fits.gz'
|
---|
20 | calib_filename = 'data/20111017_006.drs.fits.gz'
|
---|
21 |
|
---|
22 | run = RawData(data_filename, calib_filename, return_dict = True, do_calibration=True)
|
---|
23 | despike = DRSSpikes()
|
---|
24 | smooth = SlidingAverage(7)
|
---|
25 | cfd = CFD()
|
---|
26 |
|
---|
27 | thr = 3
|
---|
28 | filter_delay = 3
|
---|
29 | search_window_size = 12
|
---|
30 | # shortcut
|
---|
31 | sws = search_window_size
|
---|
32 |
|
---|
33 |
|
---|
34 | # we try to determine the:
|
---|
35 | # * Position
|
---|
36 | # * and Height (in two versions: filtered, and unfiltered data)
|
---|
37 | # of dark count peaks in:
|
---|
38 | # a) all events
|
---|
39 | # b) all pixel
|
---|
40 | #
|
---|
41 | # we limit ourselfs to 10 peaks per pixel max!
|
---|
42 | # and 1000 events max!
|
---|
43 | #
|
---|
44 | # So in order to store this stuff, we prepare an n-dim-array
|
---|
45 |
|
---|
46 | PEAKS_MAX = 30
|
---|
47 |
|
---|
48 | # In order not to allocate so much mem, we use hdf5 files for storing this information
|
---|
49 | f = h5py.File('20111017_010-006.h5', 'w')
|
---|
50 |
|
---|
51 | # we write some meta data into the file, so we know afterwards, where this stuff
|
---|
52 | # came from
|
---|
53 | f.attrs['data_file'] = os.path.realpath(data_filename)
|
---|
54 | f.attrs['calib_file'] = os.path.realpath(calib_filename)
|
---|
55 | # this script
|
---|
56 | f.attrs['source_python_script'] = open(sys.argv[0], 'r').read()
|
---|
57 | # SVN revision, should go here ... but of what? this file??
|
---|
58 | f.attrs['settings'] = [
|
---|
59 | 'threshold = 3',
|
---|
60 | 'SlidingAverage = 7 --> Filter delay = 3'
|
---|
61 | 'Search Window Size = 12'
|
---|
62 | 'Maximum Number of Peaks, in data sets = 30'
|
---|
63 | 'Default value of peak_positions = -1'
|
---|
64 | 'Default value of peak_height_unfiltered = -np.inf'
|
---|
65 | 'Default value of peak_height_smoothed = -np.inf'
|
---|
66 | ]
|
---|
67 |
|
---|
68 | result_peak_positions = f.create_dataset('peak_positions',
|
---|
69 | (run.nevents, run.npix, PEAKS_MAX),
|
---|
70 | dtype=np.int16,
|
---|
71 | fillvalue=-1,
|
---|
72 | compression='gzip')
|
---|
73 | result_peak_unfiltered_height = f.create_dataset('peak_height_unfiltered',
|
---|
74 | (run.nevents, run.npix, PEAKS_MAX),
|
---|
75 | dtype=np.float32,
|
---|
76 | fillvalue=-np.inf,
|
---|
77 | compression='gzip')
|
---|
78 | result_peak_smoothed_height = f.create_dataset('peak_height_smoothed',
|
---|
79 | (run.nevents, run.npix, PEAKS_MAX),
|
---|
80 | dtype=np.float32,
|
---|
81 | fillvalue=-np.inf,
|
---|
82 | compression='gzip')
|
---|
83 |
|
---|
84 | result_baseline = f.create_dataset('baseline',
|
---|
85 | (run.nevents, run.npix),
|
---|
86 | dtype=np.float32,
|
---|
87 |
|
---|
88 |
|
---|
89 |
|
---|
90 | try:
|
---|
91 |
|
---|
92 | for event in run:
|
---|
93 | event_id = event['event_id'].value - 1
|
---|
94 |
|
---|
95 | data = event['acal_data']
|
---|
96 | data = despike(data)
|
---|
97 | data_orig = data.copy()
|
---|
98 | data = smooth(data)
|
---|
99 | filtered = cfd(data)
|
---|
100 | filtered = smooth(filtered)
|
---|
101 |
|
---|
102 | # this is a loop over all pixel of this event
|
---|
103 | pixel_id = -1
|
---|
104 | for dat, fil, orig in zip(data, filtered, data_orig):
|
---|
105 | pixel_id += 1
|
---|
106 | print event_id, pixel_id
|
---|
107 |
|
---|
108 | prod = fil[:-1] * fil[1:]
|
---|
109 | cand = np.where( prod <= 0)[0]
|
---|
110 | if len(cand) == 0:
|
---|
111 | continue
|
---|
112 | # zero crossing with rising edge
|
---|
113 | cross = cand[np.where(fil[cand] < 0)[0]]
|
---|
114 | if len(cross) == 0:
|
---|
115 | continue
|
---|
116 | over_thr = cross[np.where(dat[cross-4] > thr)[0]]
|
---|
117 |
|
---|
118 | # Now since we have these values, we will throw away all those,
|
---|
119 | # which are probably on a falling edge of its predecessor
|
---|
120 | dover = np.diff(over_thr)
|
---|
121 | if len(dover) == 0:
|
---|
122 | good = over_thr
|
---|
123 | else:
|
---|
124 | good = []
|
---|
125 | good.append(over_thr[0])
|
---|
126 | for i in range(len(dover)):
|
---|
127 | if dover[-i-1] > 100:
|
---|
128 | good.append(over_thr[-i-1])
|
---|
129 |
|
---|
130 | good = np.array(sorted(good))
|
---|
131 | # these positions, we just found, do not exactly point to the maximum
|
---|
132 | # of a peak, but the peak will be on the left side of it.
|
---|
133 | # we use the smoothed data to find the position of the local maximum
|
---|
134 | # and then stopre this position and the value of both
|
---|
135 | # the smoothed data and the original data.
|
---|
136 |
|
---|
137 | max_pos = np.zeros( good.shape )
|
---|
138 | max_smoothed = np.zeros( good.shape )
|
---|
139 | max_orig = np.zeros( good.shape )
|
---|
140 |
|
---|
141 | for i in range(len(good)):
|
---|
142 | # We search for a local maximum in a window of size 12
|
---|
143 | if len(dat[good[i]-sws:good[i]]) > 0:
|
---|
144 |
|
---|
145 | max_pos[i] = good[i]-sws + np.argmax(dat[good[i]-sws:good[i]])
|
---|
146 | max_smoothed[i] = dat[max_pos[i]]
|
---|
147 | max_orig[i] = orig[max_pos[i]-filter_delay]
|
---|
148 | if len(max_pos) > 0:
|
---|
149 | result_peak_positions[event_id,pixel_id, :len(max_pos)] = max_pos
|
---|
150 | result_peak_unfiltered_height[event_id,pixel_id, :len(max_pos)] =max_orig
|
---|
151 | result_peak_smoothed_height[event_id,pixel_id, :len(max_pos)] = max_smoothed
|
---|
152 |
|
---|
153 |
|
---|
154 | f.close()
|
---|
155 |
|
---|
156 | except:
|
---|
157 | print 'An Exception occured .. closing file'
|
---|
158 | f.close()
|
---|
159 | raise
|
---|
160 |
|
---|
161 |
|
---|
162 |
|
---|