Changeset 12469
- Timestamp:
- 11/09/11 16:39:53 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/FACT++/src/DataCalib.cc
r12352 r12469 11 11 DrsCalibration DataCalib::fData; 12 12 bool DataCalib::fProcessing = false; 13 vector<float> DataCalib::fStats(1440*1024*6+ 3);13 vector<float> DataCalib::fStats(1440*1024*6+160*1024*2+4); 14 14 15 15 void DataCalib::Restart() … … 20 20 reinterpret_cast<uint32_t*>(fStats.data())[1] = 0; 21 21 reinterpret_cast<uint32_t*>(fStats.data())[2] = 0; 22 reinterpret_cast<uint32_t*>(fStats.data())[3] = 0; 22 23 23 24 int i=0; 24 while (i<1024*1440*2+ 3) // Set mean and RMS to 025 while (i<1024*1440*2+4) // Set mean and RMS to 0 25 26 fStats[i++] = 0; 26 while (i<1024*1440*3+ 3)27 while (i<1024*1440*3+4) 27 28 fStats[i++] = 2000./4096; // Set mean to 0.5 28 while (i<1 024*1440*6+3)29 while (i<1440*1024*6+160*1024*2+4) 29 30 fStats[i++] = 0; // Set everything else to 0 30 31 … … 34 35 void DataCalib::Update(DimDescribedService &dim) 35 36 { 36 dim.Update(fStats); 37 const uint16_t roi = fData.fRoi; 38 const uint16_t ntm = fData.fNumTm; 39 40 vector<float> buf(1440*1024*6+160*1024*2+4); 41 42 memcpy(buf.data(), fStats.data(), (4*1024*1440+4)*sizeof(float)); 43 44 for (int i=0; i<1440; i++) 45 { 46 memcpy(buf.data()+4+1440*1024*4 + i*1024, fStats.data()+4 + 4*1024*1440 + roi*i, roi*sizeof(float)); 47 memcpy(buf.data()+4+1440*1024*5 + i*1024, fStats.data()+4 + 4*1024*1440 + roi*1440 + roi*i, roi*sizeof(float)); 48 } 49 50 /* 51 for (int i=0; i<ntm; i++) 52 { 53 memcpy(buf.data()+4+1440*1024*6 + i*1024, fStats.data()+4 + 4*1024*1440 + 2*roi*1440, roi*sizeof(float)); 54 memcpy(buf.data()+4+1440*1024*6+160*1024 + i*1024, fStats.data()+4 + 4*1024*1440 + 2*roi*1440+i*roi, roi*sizeof(float)); 55 }*/ 56 57 dim.Update(buf); 37 58 } 38 59 … … 45 66 } 46 67 47 if (h->Nroi != 1024)48 {49 fMsg.Error("Region of interest not 1024.");50 return false;51 }52 53 68 if (fProcessing) 54 69 { … … 57 72 } 58 73 59 if (fData.fStep== 4)74 if (fData.fStep==3) 60 75 { 61 76 fMsg.Warn("DRS Calibration already finished... please restart!"); … … 63 78 } 64 79 80 if (fData.fStep!=2 && h->Nroi != 1024) 81 { 82 ostringstream msg; 83 msg << "Region of interest not 1024, but " << h->Nroi << " in step " << fData.fStep << " ... as it ought to be."; 84 fMsg.Error(msg); 85 return false; 86 } 87 88 vector<uint16_t> dac(8); 89 /* 90 // We don't check consistency over several boards because this is done 91 // by the eventCheck routine already 92 for (int i=0; i<h->NBoard; i++) 93 { 94 const PEVNT_HEADER &hh = h->FADhead[i]; 95 96 if (hh.start_package_flag==0) 97 continue; 98 99 for (int j=0; j<8; j++) 100 dac[j] = hh.dac[j]; 101 102 break; 103 } 104 105 for (int i=1; i<7; i++) 106 { 107 if (i==3 || dac[i]==dac[i+1]) 108 continue; 109 110 ostringstream msg; 111 msg << "Values of DAC" << i << " (" << dac[i] << ") and DAC" << i+1 <<" (" << dac[i+1] << ") do not match... cannot take DRS calibration!"; 112 fMsg.Error(msg); 113 return false; 114 } 115 116 if (fData.fStep>0) 117 { 118 for (int j=0; j<8; j++) 119 { 120 if (fData.fDAC[j]==dac[j]) 121 continue; 122 123 ostringstream msg; 124 msg << "DAC value from previous run (DAC" << j << "=" << fData.fDAC[j] << ") and current run "; 125 msg << "(DAC" << j << "=" << dac[j] << ") inconsistent... cannot take DRS calibration!"; 126 fMsg.Error(msg); 127 return false; 128 } 129 } 130 131 memcpy(fData.fDAC, dac.data(), 8*sizeof(uint16_t)); 132 */ 65 133 fProcessing = true; 66 134 135 const bool hastm = h->Nroi<=512 && h->NroiTM>=2*h->Nroi; 136 67 137 Reset(); 68 InitSize(1440, 1024); 138 InitSize(hastm ? 1600 : 1440, h->Nroi); 139 140 fData.fRoi = fNumSamples; 141 fData.fNumTm = hastm ? 160 : 0; 69 142 70 143 return DataWriteFits::Open(h); … … 115 188 } 116 189 190 void ReverseCopy(const void *src, void *dest) 191 { 192 reverse_copy(reinterpret_cast<const char*>(src), 193 reinterpret_cast<const char*>(src)+sizeof(float), 194 reinterpret_cast<char*>(dest)); 195 } 196 117 197 void DataCalib::WriteFits() 118 198 { 119 199 #ifdef HAVE_FITS 120 200 FitsFile file(fMsg); 201 202 const uint16_t roi = fData.fRoi; 203 const uint16_t ntm = fData.fNumTm; 121 204 122 205 file.AddColumn('I', "RunNumberBaseline"); 123 206 file.AddColumn('I', "RunNumberGain"); 124 207 file.AddColumn('I', "RunNumberTriggerOffset"); 125 file.AddColumn('F', "BaselineMean", 1024*1440, "mV"); 126 file.AddColumn('F', "BaselineRms", 1024*1440, "mV"); 127 file.AddColumn('F', "GainMean", 1024*1440, "mV"); 128 file.AddColumn('F', "GainRms", 1024*1440, "mV"); 129 file.AddColumn('F', "TriggerOffsetMean", 1024*1440, "mV"); 130 file.AddColumn('F', "TriggerOffsetRms", 1024*1440, "mV"); 208 file.AddColumn('F', "BaselineMean", 1024*1440, "mV"); 209 file.AddColumn('F', "BaselineRms", 1024*1440, "mV"); 210 file.AddColumn('F', "GainMean", 1024*1440, "mV"); 211 file.AddColumn('F', "GainRms", 1024*1440, "mV"); 212 file.AddColumn('F', "TriggerOffsetMean", roi*1440, "mV"); 213 file.AddColumn('F', "TriggerOffsetRms", roi*1440, "mV"); 214 file.AddColumn('F', "TriggerOffsetTMMean", roi*ntm, "mV"); 215 file.AddColumn('F', "TriggerOffsetTMRms", roi*ntm, "mV"); 131 216 132 217 const string filename = FormFileName("drs.fits"); … … 146 231 !file.WriteKeyNT("ADC", 12, "Resolution of ADC in bits") || 147 232 !file.WriteKeyNT("DAC", 16, "Resolution of DAC in bits") || 148 !file.WriteKeyNT("DACLEVEL", 50000, "Applied DAC level in counts") || 233 // !file.WriteKeyNT("DAC_A", fData.fDAC[0], "Level of DAC 0 in DAC counts") || 234 // !file.WriteKeyNT("DAC_B", fData.fDAC[1], "Leval of DAC 1-3 in DAC counts") || 235 // !file.WriteKeyNT("DAC_C", fData.fDAC[4], "Leval of DAC 4-7 in DAC counts") || 149 236 !file.WriteKeyNT("NBOFFSET", fData.fNumOffset, "Number of entries for offset calibration") || 150 237 !file.WriteKeyNT("NBGAIN", fData.fNumGain/1953125, "Number of entries for gain calibration") || 151 238 !file.WriteKeyNT("NBTRGOFF", fData.fNumTrgOff, "Number of entries for trigger offset calibration") || 152 239 !file.WriteKeyNT("NPIX", 1440, "Number of channels in the camera") || 153 !file.WriteKeyNT("NROI", 1024, "Region of interest") 240 !file.WriteKeyNT("NTM", ntm, "Number of time marker channels") || 241 !file.WriteKeyNT("NROI", roi, "Region of interest") 154 242 ) 155 243 return; 156 244 157 vector<char> buf; 158 buf.reserve(fStats.size()*sizeof(float)); 245 vector<char> buf(fStats.size()*sizeof(float)); 159 246 160 247 char *src = reinterpret_cast<char*>(fStats.data()); 161 char *end = reinterpret_cast<char*>(fStats.data()+ 1024*1440*6+3);248 char *end = reinterpret_cast<char*>(fStats.data()+fStats.size()); 162 249 char *dest = buf.data(); 163 250 … … 172 259 return; 173 260 174 if (!file.WriteData(buf.data(), 1024*1440*sizeof(float)*6+3))261 if (!file.WriteData(buf.data(), (1440*1024*4 + 1440*roi*2 + ntm*roi*2 + 3)*sizeof(float))) 175 262 return; 176 263 177 264 ostringstream str; 178 str << "Wrote DRS calibration data (step=" << fData.fStep << " ) to '" << filename << "'";265 str << "Wrote DRS calibration data (step=" << fData.fStep << ", roi=" << roi << ") to '" << filename << "'"; 179 266 Info(str.str()); 180 267 #endif … … 192 279 193 280 // Scale ADC data from 12bit to 2000mV 194 GetSampleStats(fStats.data()+ 3, 2000./4096);281 GetSampleStats(fStats.data()+4, 2000./4096); 195 282 reinterpret_cast<uint32_t*>(fStats.data())[0] = GetRunId();; 196 283 } … … 200 287 fData.fNumGain = fNumEntries; 201 288 202 // DAC: 0..2.5V == 0..65535 203 // V-mV: 1000 204 //fNumGain *= 2500*50000; 289 // DAC: 0..2.5V == 0..65535 2500*50000 625*50000 625*3125 290 // V-mV: 1000 ---------- --------- -------- 291 //fNumGain *= 2500*50000; 65536 16384 1024 205 292 //for (int i=0; i<1024*1440; i++) 206 293 // fGain[i] *= 65536; … … 210 297 211 298 // Scale ADC data from 12bit to 2000mV 212 GetSampleStats(fStats.data()+1024*1440*2+ 3, 2000./4096/fData.fNumOffset);//0.5);299 GetSampleStats(fStats.data()+1024*1440*2+4, 2000./4096/fData.fNumOffset);//0.5); 213 300 reinterpret_cast<uint32_t*>(fStats.data())[1] = GetRunId();; 214 301 } … … 219 306 220 307 // Scale ADC data from 12bit to 2000mV 221 GetSampleStats(fStats.data()+1024*1440*4+3, 2000./4096/fData.fNumOffset);//0.5); 222 reinterpret_cast<uint32_t*>(fStats.data())[2] = GetRunId();; 308 GetSampleStats(fStats.data()+1024*1440*4+4, 2000./4096/fData.fNumOffset);//0.5); 309 reinterpret_cast<uint32_t*>(fStats.data())[2] = GetRunId(); 310 reinterpret_cast<uint32_t*>(fStats.data())[3] = fNumSamples; 223 311 } 224 312 … … 226 314 WriteFits(); 227 315 228 fDim.Update(fStats);316 Update(fDim); 229 317 230 318 fData.fStep++;
Note:
See TracChangeset
for help on using the changeset viewer.