source: trunk/FACT++/src/DataCalib.cc@ 11731

Last change on this file since 11731 was 11726, checked in by tbretz, 14 years ago
File size: 5.1 KB
Line 
1#include "DataCalib.h"
2
3#include "FAD.h"
4#include "FitsFile.h"
5#include "DimDescriptionService.h"
6
7using namespace std;
8
9int DataCalib::fStep = 0;
10
11vector<int32_t> DataCalib::fOffset(1440*1024, 0);
12vector<int32_t> DataCalib::fGain (1440*1024, 2);
13vector<int32_t> DataCalib::fTrgOff(1440*1024, 0);
14vector<float> DataCalib::fStats (1440*1024*6+3);
15
16uint64_t DataCalib::fNumOffset = 1;
17uint64_t DataCalib::fNumGain = 1;
18uint64_t DataCalib::fNumTrgOff = 1;
19
20void DataCalib::Restart()
21{
22 // Default gain:
23 // 0.575*[45590]*2.5V / 2^16 = 0.99999 V
24 fOffset.assign(1440*1024, 0);
25 fGain.assign (1440*1024, 2);
26 fTrgOff.assign(1440*1024, 0);
27
28 fNumOffset = 1;
29 fNumGain = 1;
30 fNumTrgOff = 1;
31
32 reinterpret_cast<uint32_t*>(fStats.data())[0] = 0;
33 reinterpret_cast<uint32_t*>(fStats.data())[1] = 0;
34 reinterpret_cast<uint32_t*>(fStats.data())[2] = 0;
35
36 int i=0;
37 while (i<1024*1440*2+3) // Set mean and RMS to 0
38 fStats[i++] = 0;
39 while (i<1024*1440*3+3)
40 fStats[i++] = 0.5; // Set mean to 0.5
41 while (i<1024*1440*6+3)
42 fStats[i++] = 0; // Set everything else to 0
43
44 fStep = 0;
45}
46
47void DataCalib::Update(DimDescribedService &dim)
48{
49 dim.Update(fStats);
50}
51
52bool DataCalib::Open(RUN_HEAD* h)
53{
54 if (fStep==4)
55 {
56 fMsg.Warn("DRS Calibration already finished... please restart!");
57 return false;
58 }
59
60 if (h->NPix != 1440)
61 {
62 fMsg.Error("Number of pixels in header not 1440.");
63 return false;
64 }
65
66 if (h->Nroi != 1024)
67 {
68 fMsg.Error("Region of interest not 1024.");
69 return false;
70 }
71
72 ostringstream name;
73 name << "drs-calib-" << fStep;
74 fFileName = name.str();
75
76 Reset();
77 InitSize(1440, 1024);
78
79 fFileName = FormFileName(GetRunId(), "drs.fits");
80
81 return true;
82}
83
84bool DataCalib::WriteEvt(EVENT *e)
85{
86 // FIXME: SET StartPix to 0 if StartPix is -1
87
88 if (fStep==0)
89 {
90 AddRel(e->Adc_Data, e->StartPix);
91 }
92 if (fStep==1)
93 {
94 AddRel(e->Adc_Data, e->StartPix, fOffset.data(), fNumOffset);
95 }
96 if (fStep==2)
97 {
98 AddAbs(e->Adc_Data, e->StartPix, fOffset.data(), fNumOffset);
99 }
100
101 return true;
102}
103
104void DataCalib::WriteFits()
105{
106#ifdef HAVE_FITS
107 FitsFile file(fMsg);
108
109 file.AddColumn('I', "RunNumberBaseline");
110 file.AddColumn('I', "RunNumberGain");
111 file.AddColumn('I', "RunNumberTriggerOffset");
112 file.AddColumn('F', "BaselineMean", 1024*1440);
113 file.AddColumn('F', "BaselineRms", 1024*1440);
114 file.AddColumn('F', "GainMean", 1024*1440);
115 file.AddColumn('F', "GainRms", 1024*1440);
116 file.AddColumn('F', "TriggerOffsetMean", 1024*1440);
117 file.AddColumn('F', "TriggerOffsetRms", 1024*1440);
118
119 if (!file.OpenFile(fFileName))
120 return;
121
122 if (!file.OpenTable("DrsCalibration"))
123 return;
124
125 if (!file.WriteDefaultKeys("fadctrl"))
126 return;
127
128 if (!file.WriteKeyNT("STEP", fStep, ""))
129 return;
130
131 vector<char> buf;
132 buf.reserve(fStats.size()*sizeof(float));
133
134 char *src = reinterpret_cast<char*>(fStats.data());
135 char *end = reinterpret_cast<char*>(fStats.data()+1024*1440*6+3);
136 char *dest = buf.data();
137
138 while (src<end)
139 {
140 reverse_copy(src, src+sizeof(float), dest);
141 src += sizeof(float);
142 dest += sizeof(float);
143 }
144
145 if (!file.AddRow())
146 return;
147
148 if (!file.WriteData(buf.data(), 1024*1440*sizeof(float)*6+3))
149 return;
150#endif
151}
152
153bool DataCalib::Close(RUN_TAIL *)
154{
155 if (fStep==0)
156 {
157 fOffset.assign(fSum.begin(), fSum.end());
158 fNumOffset = fNumEntries;
159
160 // 0.5: Scale from ADC to Millivolt
161 GetSampleStats(fStats.data()+3, 0.5);
162 reinterpret_cast<uint32_t*>(fStats.data())[0] = GetRunId();;
163 }
164 if (fStep==1)
165 {
166 fGain.assign(fSum.begin(), fSum.end());
167 //fNumGain = fNumEntries*1000;
168
169 // DAC: 0..2.5V == 0..65535
170 // V-mV: 1000
171 for (int i=0; i<1024*1440; i++)
172 fGain[i] *= 125;
173 fNumGain = fNumEntries * 65535;
174
175 // 0.5: Scale from ADC to Millivolt
176 GetSampleStats(fStats.data()+1024*1440*2+3, 0.5);
177 reinterpret_cast<uint32_t*>(fStats.data())[1] = GetRunId();;
178 }
179 if (fStep==2)
180 {
181 fTrgOff.assign(fSum.begin(), fSum.end());
182 fNumTrgOff = fNumEntries;
183
184 // 0.5: Scale from ADC to Millivolt
185 GetSampleStats(fStats.data()+1024*1440*4+3, 0.5);
186 reinterpret_cast<uint32_t*>(fStats.data())[2] = GetRunId();;
187 }
188
189 if (fStep>=0 && fStep<=2)
190 WriteFits();
191
192 fDim.Update(fStats);
193
194 fStep++;
195
196 return true;
197}
198
199void DataCalib::Apply(int16_t *val, const int16_t *start, uint32_t roi)
200{
201 CalibData::Apply(val, start, roi,
202 fOffset.data(), fNumOffset,
203 fGain.data(), fNumGain,
204 fTrgOff.data(), fNumTrgOff);
205}
206
207void DataCalib::Apply(float *vec, int16_t *val, const int16_t *start, uint32_t roi)
208{
209 CalibData::Apply(vec, val, start, roi,
210 fOffset.data(), fNumOffset,
211 fGain.data(), fNumGain,
212 fTrgOff.data(), fNumTrgOff);
213}
214
Note: See TracBrowser for help on using the repository browser.