Hall C ROOT/C++ Analyzer (hcana)
Loading...
Searching...
No Matches
THcTrigDet.cxx
Go to the documentation of this file.
1
96//TODO: Check if fNumAdc < fMaxAdcChannels && fNumTdc < fMaxTdcChannels.
97
98#include "THcTrigDet.h"
99
100#include <algorithm>
101#include <iostream>
102#include <stdexcept>
103
104#include "TDatime.h"
105#include "TString.h"
106
107#include "THaApparatus.h"
108#include "THaEvData.h"
109#include "Textvars.h" // for Podd::vsplit
110
111#include "THcDetectorMap.h"
112#include "THcGlobals.h"
113#include "THcParmList.h"
114#include "THcRawAdcHit.h"
115#include "THcRawTdcHit.h"
116#include "THcTrigApp.h"
117#include "THcTrigRawHit.h"
118
119//_____________________________________________________________________________
121
122//_____________________________________________________________________________
124 const char* name, const char* description, THaApparatus* app
125) :
126 THaDetector(name, description, app), THcHitList(),
127 fKwPrefix(""),
128 fNumAdc(0), fNumTdc(0), fAdcNames(), fTdcNames(),
129 fTdcTimeRaw(), fTdcTime(),
130 fAdcPedRaw(), fAdcPulseIntRaw(), fAdcPulseAmpRaw(), fAdcPulseTimeRaw(),
131 fAdcPed(), fAdcPulseInt(), fAdcPulseAmp(), fAdcPulseTime(),
132 fTdcMultiplicity(), fAdcMultiplicity()
133{
134 // Guess at spectrometer name that this trigger detector is associated with
135 // Can override with SetSpectName
136 fSpectName = name[0];
137}
138
139//_____________________________________________________________________________
141 delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = NULL;
142 delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = NULL;
143 delete [] fTdcTimeWindowMin; fTdcTimeWindowMin = NULL;
144 delete [] fTdcTimeWindowMax; fTdcTimeWindowMax = NULL;
145
146}
147
148//_____________________________________________________________________________
150 // Call `Setup` before everything else.
151 Setup(GetName(), GetTitle());
152
153 // Initialize all variables.
154 for (int i=0; i<fMaxAdcChannels; ++i) {
155 fAdcPedRaw[i] = 0;
156 fAdcPulseIntRaw[i] = 0;
157 fAdcPulseAmpRaw[i] = 0;
158 fAdcPulseTimeRaw[i] = 0;
159 fAdcPulseTime[i] = kBig;
160 fAdcPed[i] = 0.0;
161 fAdcPulseInt[i] = 0.0;
162 fAdcPulseAmp[i] = 0.0;
163 fAdcMultiplicity[i] = 0;
164 };
165 for (int i=0; i<fMaxTdcChannels; ++i) {
166 fTdcTimeRaw[i] = 0;
167 fTdcTime[i] = 0.0;
168 fVecTdcTimeRaw[i].clear();
169 fVecTdcTime[i].clear();
170 fTdcMultiplicity[i] = 0;
171 };
172
173 // Call initializer for base class.
174 // This also calls `ReadDatabase` and `DefineVariables`.
175 EStatus status = THaDetector::Init(date);
176 if (status) {
177 fStatus = status;
178 return fStatus;
179
180}
181 // Fill in detector map.
182 string EngineDID = string(GetApparatus()->GetName()).substr(0, 1) + GetName();
183 std::transform(EngineDID.begin(), EngineDID.end(), EngineDID.begin(), ::toupper);
184 if (gHcDetectorMap->FillMap(fDetMap, EngineDID.c_str()) < 0) {
185 static const char* const here = "Init()";
186 Error(Here(here), "Error filling detectormap for %s.", EngineDID.c_str());
187 return kInitError;
188 }
189 DBRequest listextra[]={
190 {"_trig_tdcrefcut", &fTDC_RefTimeCut, kInt, 0, 1},
191 {"_trig_adcrefcut", &fADC_RefTimeCut, kInt, 0, 1},
192 {0}
193 };
194 fTDC_RefTimeCut = -1000; // Minimum allowed reference times
195 fADC_RefTimeCut = -1000;
196 gHcParms->LoadParmValues((DBRequest*)&listextra,fKwPrefix.c_str());
197 // Initialize hitlist part of the class.
198 // printf(" Init trig det hitlist\n");
199 InitHitList(fDetMap, "THcTrigRawHit", 200,fTDC_RefTimeCut,fADC_RefTimeCut);
201
202 fPresentP = 0;
203 THaVar* vpresent = gHaVars->Find(Form("%s.present",fSpectName.Data()));
204 if(vpresent) {
205 fPresentP = (Bool_t *) vpresent->GetValuePointer();
206 }
207
208 fStatus = kOK;
209 return fStatus;
210}
211
212//_____________________________________________________________________________
215
216 // Reset all data.
218 for (int i=0; i<fNumAdc; ++i) {
219 fAdcPedRaw[i] = 0;
220 fAdcPulseIntRaw[i] = 0;
221 fAdcPulseAmpRaw[i] = 0;
222 fAdcPulseTimeRaw[i] = 0;
223 fAdcPulseTime[i] = kBig;
224 fAdcPed[i] = 0.0;
225 fAdcPulseInt[i] = 0.0;
226 fAdcPulseAmp[i] = 0.0;
227 fAdcMultiplicity[i] = 0;
228 fAdcSampPedRaw[i] = 0;
229 fAdcSampPulseIntRaw[i] = 0;
230 fAdcSampPulseAmpRaw[i] = 0;
233 fAdcSampPed[i] = 0.0;
234 fAdcSampPulseInt[i] = 0.0;
235 fAdcSampPulseAmp[i] = 0.0;
237 };
238 for (int i=0; i<fNumTdc; ++i) {
239 fTdcTimeRaw[i] = 0;
240 fTdcTime[i] = 0.0;
241 fVecTdcTimeRaw[i].clear();
242 fVecTdcTime[i].clear();
243 fTdcMultiplicity[i] = 0;
244 };
245 fSampWaveform.clear();
246}
247
248//_____________________________________________________________________________
250
251 // Decode raw data for this event.
252 Bool_t present = kTRUE; // Don't suppress reference time warnings
253 if(HaveIgnoreList()) {
254 if(IsIgnoreType(evData.GetEvType())) {
255 present = kFALSE;
256 }
257 } else if(fPresentP) { // if this spectrometer not part of trigger
258 present = *fPresentP;
259 }
260 Int_t numHits = DecodeToHitList(evData, !present);
261
262 // Process each hit and fill variables.
263 Int_t iHit = 0;
264 while (iHit < numHits) {
265 THcTrigRawHit* hit = dynamic_cast<THcTrigRawHit*>(fRawHitList->At(iHit));
266
267 Int_t cnt = hit->fCounter-1;
268 if (hit->fPlane == 1) {
269 THcRawAdcHit& rawAdcHit = hit->GetRawAdcHit();
270 fAdcMultiplicity[cnt] = rawAdcHit.GetNPulses();
271 UInt_t good_hit=999;
272 for (UInt_t thit=0; thit<rawAdcHit.GetNPulses(); ++thit) {
273 Int_t TestTime=rawAdcHit.GetPulseTimeRaw(thit);
274 if (TestTime>=fAdcTimeWindowMin[cnt]&&TestTime<=fAdcTimeWindowMax[cnt]&&good_hit==999) {
275 good_hit=thit;
276 }
277 }
278 if (good_hit<rawAdcHit.GetNPulses()) {
279 fAdcPedRaw[cnt] = rawAdcHit.GetPedRaw();
280 fAdcPulseIntRaw[cnt] = rawAdcHit.GetPulseIntRaw(good_hit);
281 fAdcPulseAmpRaw[cnt] = rawAdcHit.GetPulseAmpRaw(good_hit);
282 fAdcPulseTimeRaw[cnt] = rawAdcHit.GetPulseTimeRaw(good_hit);
283 fAdcPulseTime[cnt] = rawAdcHit.GetPulseTime(good_hit)+fAdcTdcOffset;
284 fAdcPed[cnt] = rawAdcHit.GetPed();
285 fAdcPulseInt[cnt] = rawAdcHit.GetPulseInt(good_hit);
286 fAdcPulseAmp[cnt] = rawAdcHit.GetPulseAmp(good_hit);
287 }
288 if (rawAdcHit.GetNSamples() >0 ) {
290 if (fSampNSA == 0) fSampNSA=rawAdcHit.GetF250_NSA();
291 if (fSampNSB == 0) fSampNSB=rawAdcHit.GetF250_NSB();
292 rawAdcHit.SetF250Params(fSampNSA,fSampNSB,4); // Set NPED =4
293 if (fSampNSAT != 2) rawAdcHit.SetSampNSAT(fSampNSAT);
294 rawAdcHit.SetSampIntTimePedestalPeak();
295 if (fOutputSampWaveform==1) {
296 fSampWaveform.push_back(float(cnt));
297 fSampWaveform.push_back(float(rawAdcHit.GetNSamples()));
298 for (UInt_t thit = 0; thit < rawAdcHit.GetNSamples(); thit++) {
299 fSampWaveform.push_back(rawAdcHit.GetSample(thit)); // ped subtracted sample (mV)
300 }
301 }
303 UInt_t sampgood_hit=999;
304 for (UInt_t thit=0; thit<rawAdcHit.GetNSampPulses(); ++thit) {
305 Int_t TestTime=rawAdcHit.GetSampPulseTimeRaw(thit);
306 if (TestTime>=fAdcTimeWindowMin[cnt]&&TestTime<=fAdcTimeWindowMax[cnt]&&sampgood_hit==999) {
307 sampgood_hit=thit;
308 }
309 }
310 if (sampgood_hit<rawAdcHit.GetNSampPulses()) {
311 fAdcSampPedRaw[cnt] = rawAdcHit.GetSampPedRaw();
312 fAdcSampPulseIntRaw[cnt] = rawAdcHit.GetSampPulseIntRaw(sampgood_hit);
313 fAdcSampPulseAmpRaw[cnt] = rawAdcHit.GetSampPulseAmpRaw(sampgood_hit);
314 fAdcSampPulseTimeRaw[cnt] = rawAdcHit.GetSampPulseTimeRaw(sampgood_hit);
315 fAdcSampPulseTime[cnt] = rawAdcHit.GetSampPulseTime(sampgood_hit)+fAdcTdcOffset;
316 fAdcSampPed[cnt] = rawAdcHit.GetSampPed();
317 fAdcSampPulseInt[cnt] = rawAdcHit.GetSampPulseInt(sampgood_hit);
318 fAdcSampPulseAmp[cnt] = rawAdcHit.GetSampPulseAmp(sampgood_hit);
319 if ( rawAdcHit.GetNPulses() ==0 || fUseSampWaveform ==1 ) {
320 fAdcPedRaw[cnt] = rawAdcHit.GetSampPedRaw();
321 fAdcPulseIntRaw[cnt] = rawAdcHit.GetSampPulseIntRaw(sampgood_hit);
322 fAdcPulseAmpRaw[cnt] = rawAdcHit.GetSampPulseAmpRaw(sampgood_hit);
323 fAdcPulseTimeRaw[cnt] = rawAdcHit.GetSampPulseTimeRaw(sampgood_hit);
324 fAdcPulseTime[cnt] = rawAdcHit.GetSampPulseTime(sampgood_hit)+fAdcTdcOffset;
325 fAdcPed[cnt] = rawAdcHit.GetSampPed();
326 fAdcPulseInt[cnt] = rawAdcHit.GetSampPulseInt(sampgood_hit);
327 fAdcPulseAmp[cnt] = rawAdcHit.GetSampPulseAmp(sampgood_hit);
328 }
329 }
330 }
331 }
332 else if (hit->fPlane == 2) {
333 THcRawTdcHit& rawTdcHit = hit->GetRawTdcHit();
334 if (rawTdcHit.GetNHits() >0 && rawTdcHit.HasRefTime() && fTdcRefTime == kBig) fTdcRefTime=rawTdcHit.GetRefTime() ;
335 UInt_t good_hit=999;
336 UInt_t closest_hit=999;
337 Int_t TimeDiff=1000000;
338 for (UInt_t thit=0; thit<rawTdcHit.GetNHits(); ++thit) {
339 Int_t TestTime= rawTdcHit.GetTimeRaw(thit);
340 if (abs(TestTime-fTdcTimeWindowMin[cnt]) < TimeDiff) {
341 closest_hit=thit;
342 TimeDiff=abs(TestTime-fTdcTimeWindowMin[cnt]);
343 }
344 if (TestTime>=fTdcTimeWindowMin[cnt]&&TestTime<=fTdcTimeWindowMax[cnt]) {
345 fVecTdcTimeRaw[cnt].push_back(rawTdcHit.GetTimeRaw(thit));
346 fVecTdcTime[cnt].push_back(rawTdcHit.GetTime(thit)*fTdcChanperNS+fTdcOffset);
347 if (good_hit==999) {
348 good_hit=thit;
349 }
350 }
351 }
352 if (good_hit == 999 and closest_hit != 999) {
353 good_hit=closest_hit;
354 fVecTdcTimeRaw[cnt].push_back(rawTdcHit.GetTimeRaw(good_hit));
355 fVecTdcTime[cnt].push_back(rawTdcHit.GetTime(good_hit)*fTdcChanperNS+fTdcOffset);
356 }
357 if (good_hit<rawTdcHit.GetNHits()) {
358 fTdcTimeRaw[cnt] = rawTdcHit.GetTimeRaw(good_hit);
359 fTdcTime[cnt] = rawTdcHit.GetTime(good_hit)*fTdcChanperNS+fTdcOffset;
360 }
361 if (good_hit == 999 and closest_hit == 999) {
362 fVecTdcTimeRaw[cnt].push_back(0);
363 fVecTdcTime[cnt].push_back(0);
364 }
365 std::sort(fVecTdcTimeRaw[cnt].begin(), fVecTdcTimeRaw[cnt].end());
366 std::sort(fVecTdcTime[cnt].begin(), fVecTdcTime[cnt].end());
367
368 fTdcMultiplicity[cnt] = rawTdcHit.GetNHits();
369 }
370 else {
371 throw std::out_of_range(
372 "`THcTrigDet::Decode`: only planes `1` and `2` available!"
373 );
374 }
375
376 ++iHit;
377 }
378
379 return 0;
380}
381
382//_____________________________________________________________________________
383void THcTrigDet::Setup(const char* name, const char* description) {
384 // Prefix for parameters in `param` file.
385 string kwPrefix = string(GetApparatus()->GetName()) + "_" + name;
386 std::transform(kwPrefix.begin(), kwPrefix.end(), kwPrefix.begin(), ::tolower);
387 fKwPrefix = kwPrefix;
388}
389
390//_____________________________________________________________________________
392 std::string adcNames, tdcNames;
393
394 std::string trigNames="pTRIG1_ROC1 pTRIG4_ROC1 pTRIG1_ROC2 pTRIG4_ROC2";
395
396 //C.Y. Sep 08, 2021 | changed pTRIG4 to pTRIG3 (Since in hardware, pTRIG3 -> h3/4 trigger)
397 // SJDK - 22/02/22 - Switched back, keep names here as is, can set in param files later
398 //std::string trigNames="pTRIG1_ROC1 pTRIG3_ROC1 pTRIG1_ROC2 pTRIG3_ROC2";
399
400 // SJDK 12/04/21 - Added new RF names for use in getter
401 std::string RFNames="pRF hRF";
402 DBRequest list[] = {
403 {"_numAdc", &fNumAdc, kInt}, // Number of ADC channels.
404 {"_numTdc", &fNumTdc, kInt}, // Number of TDC channels.
405 {"_adcNames", &adcNames, kString}, // Names of ADC channels.
406 {"_tdcNames", &tdcNames, kString}, // Names of TDC channels.
407 {"_trigNames", &trigNames, kString,0,1}, // Names of Triggers for coincidence time.
408 {"_RFNames", &RFNames, kString,0, 1}, // SJDK 12/04/21 - Names for RF time
409 {"_tdcoffset", &fTdcOffset, kDouble,0,1}, // Offset of tdc channels
410 {"_adc_tdc_offset", &fAdcTdcOffset, kDouble,0,1}, // Offset of Adc Pulse time (ns)
411 {"_tdcchanperns", &fTdcChanperNS, kDouble,0,1}, // Convert channesl to ns
412 {0}
413 };
414 fTdcChanperNS=0.09766;
415 fTdcOffset=300.;
416 fAdcTdcOffset=200.;
417 gHcParms->LoadParmValues(list, fKwPrefix.c_str());
418
423 for(Int_t ip=0;ip<fNumAdc;ip++) { // Set a large default window
424 fAdcTimeWindowMin[ip]=0;
425 fAdcTimeWindowMax[ip]=100000;
426 }
427 for(Int_t ip=0;ip<fNumTdc;ip++) { // Set a large default window
428 fTdcTimeWindowMin[ip]=0;
429 fTdcTimeWindowMax[ip]=100000;
430 }
431 DBRequest list2[]={
432 {"_SampThreshold", &fSampThreshold, kDouble,0,1},
433 {"_SampNSA", &fSampNSA, kInt,0,1},
434 {"_SampNSAT", &fSampNSAT, kInt,0,1},
435 {"_SampNSB", &fSampNSB, kInt,0,1},
436 {"_OutputSampWaveform", &fOutputSampWaveform, kInt,0,1},
437 {"_UseSampWaveform", &fUseSampWaveform, kInt,0,1},
438 {"_AdcTimeWindowMin", fAdcTimeWindowMin, kDouble, (UInt_t) fNumAdc, 1},
439 {"_AdcTimeWindowMax", fAdcTimeWindowMax, kDouble, (UInt_t) fNumAdc, 1},
440 {"_TdcTimeWindowMin", fTdcTimeWindowMin, kDouble, (UInt_t) fNumTdc, 1},
441 {"_TdcTimeWindowMax", fTdcTimeWindowMax, kDouble, (UInt_t) fNumTdc, 1},
442 {0}
443 };
444
445 fSampThreshold = 5.;
446 fSampNSA = 0; // use value stored in event 125 info
447 fSampNSB = 0; // use value stored in event 125 info
448 fSampNSAT = 2; // default value in THcRawHit::SetF250Params
449 fOutputSampWaveform = 0; // 0= no output , 1 = output Sample Waveform
450 fUseSampWaveform = 0; // 0= do not use , 1 = use Sample Waveform
451
452 gHcParms->LoadParmValues(list2, fKwPrefix.c_str());
453 for(Int_t ip=0;ip<fNumTdc;ip++) {
454 // cout << ip << " " << fTdcNames.at(ip) << " " << fTdcTimeWindowMin[ip] << " " << fTdcTimeWindowMax[ip] << endl;
455 }
456 // Split the names to std::vector<std::string>.
457 fAdcNames = Podd::vsplit(adcNames);
458 fTdcNames = Podd::vsplit(tdcNames);
459 fTrigNames = Podd::vsplit(trigNames);
460 fRFNames = Podd::vsplit(RFNames); // SJDK 12/04/21 - For RF getter
461 //default index values
462
463 //Assign an index to coincidence trigger times strings
464 for (UInt_t j = 0; j <fTrigNames.size(); j++) {
465 fTrigId[j]=-1;
466 }
467 for (int i = 0; i <fNumTdc; i++) {
468 for (UInt_t j = 0; j <fTrigNames.size(); j++) {
469 if(fTdcNames.at(i)==fTrigNames[j]) fTrigId[j]=i;
470 }
471 }
472
473 cout << " Trig = " << fTrigNames.size() << endl;
474 for (UInt_t j = 0; j <fTrigNames.size(); j++) {
475 cout << fTrigNames[j] << " " << fTrigId[j] << endl;
476
477 }
478
479 // SJDK - 12/04/21 - For RF getter
480 // Assign an index to RF times strings
481 for (UInt_t j = 0; j <fRFNames.size(); j++) {
482 fRFId[j]=-1;
483 }
484 for (int i = 0; i <fNumTdc; i++) {
485 for (UInt_t j = 0; j <fRFNames.size(); j++) {
486 if(fTdcNames.at(i)==fRFNames[j]) fRFId[j]=i;
487 }
488 }
489 for (UInt_t j = 0; j <fRFNames.size(); j++) {
490 cout << fRFNames[j] << " " << fRFId[j] << endl;
491 }
492
493 return kOK;
494}
495
496//_____________________________________________________________________________
498
499 if (mode == kDefine && fIsSetup) return kOK;
500 fIsSetup = (mode == kDefine);
501
502 std::vector<RVarDef> vars;
503
504 //Push the variable names for ADC channels.
505 std::vector<TString> adcPedRawTitle(fNumAdc), adcPedRawVar(fNumAdc);
506 std::vector<TString> adcPulseIntRawTitle(fNumAdc), adcPulseIntRawVar(fNumAdc);
507 std::vector<TString> adcPulseAmpRawTitle(fNumAdc), adcPulseAmpRawVar(fNumAdc);
508 std::vector<TString> adcPulseTimeRawTitle(fNumAdc), adcPulseTimeRawVar(fNumAdc);
509 std::vector<TString> adcPulseTimeTitle(fNumAdc), adcPulseTimeVar(fNumAdc);
510 std::vector<TString> adcPedTitle(fNumAdc), adcPedVar(fNumAdc);
511 std::vector<TString> adcPulseIntTitle(fNumAdc), adcPulseIntVar(fNumAdc);
512 std::vector<TString> adcPulseAmpTitle(fNumAdc), adcPulseAmpVar(fNumAdc);
513 std::vector<TString> adcMultiplicityTitle(fNumAdc), adcMultiplicityVar(fNumAdc);
514
515 std::vector<TString> adcSampPedRawTitle(fNumAdc), adcSampPedRawVar(fNumAdc);
516 std::vector<TString> adcSampPulseIntRawTitle(fNumAdc), adcSampPulseIntRawVar(fNumAdc);
517 std::vector<TString> adcSampPulseAmpRawTitle(fNumAdc), adcSampPulseAmpRawVar(fNumAdc);
518 std::vector<TString> adcSampPulseTimeRawTitle(fNumAdc), adcSampPulseTimeRawVar(fNumAdc);
519 std::vector<TString> adcSampPulseTimeTitle(fNumAdc), adcSampPulseTimeVar(fNumAdc);
520 std::vector<TString> adcSampPedTitle(fNumAdc), adcSampPedVar(fNumAdc);
521 std::vector<TString> adcSampPulseIntTitle(fNumAdc), adcSampPulseIntVar(fNumAdc);
522 std::vector<TString> adcSampPulseAmpTitle(fNumAdc), adcSampPulseAmpVar(fNumAdc);
523 std::vector<TString> adcSampMultiplicityTitle(fNumAdc), adcSampMultiplicityVar(fNumAdc);
524
525 TString RefTimeTitle= "TdcRefTime";
526 TString RefTimeVar= "fTdcRefTime";
527 RVarDef entryRefTime {
528 RefTimeTitle.Data(),
529 RefTimeTitle.Data(),
530 RefTimeVar.Data()
531 };
532 vars.push_back(entryRefTime);
533
534 for (int i=0; i<fNumAdc; ++i) {
535 adcPedRawTitle.at(i) = fAdcNames.at(i) + "_adcPedRaw";
536 adcPedRawVar.at(i) = TString::Format("fAdcPedRaw[%d]", i);
537 RVarDef entry1 {
538 adcPedRawTitle.at(i).Data(),
539 adcPedRawTitle.at(i).Data(),
540 adcPedRawVar.at(i).Data()
541 };
542 vars.push_back(entry1);
543
544 adcSampPedRawTitle.at(i) = fAdcNames.at(i) + "_adcSampPedRaw";
545 adcSampPedRawVar.at(i) = TString::Format("fAdcSampPedRaw[%d]", i);
546 RVarDef entry11 {
547 adcSampPedRawTitle.at(i).Data(),
548 adcSampPedRawTitle.at(i).Data(),
549 adcSampPedRawVar.at(i).Data()
550 };
551 vars.push_back(entry11);
552
553 adcPulseIntRawTitle.at(i) = fAdcNames.at(i) + "_adcPulseIntRaw";
554 adcPulseIntRawVar.at(i) = TString::Format("fAdcPulseIntRaw[%d]", i);
555 RVarDef entry2 {
556 adcPulseIntRawTitle.at(i).Data(),
557 adcPulseIntRawTitle.at(i).Data(),
558 adcPulseIntRawVar.at(i).Data()
559 };
560 vars.push_back(entry2);
561
562
563 adcSampPulseIntRawTitle.at(i) = fAdcNames.at(i) + "_adcSampPulseIntRaw";
564 adcSampPulseIntRawVar.at(i) = TString::Format("fAdcSampPulseIntRaw[%d]", i);
565 RVarDef entry22 {
566 adcSampPulseIntRawTitle.at(i).Data(),
567 adcSampPulseIntRawTitle.at(i).Data(),
568 adcSampPulseIntRawVar.at(i).Data()
569 };
570 vars.push_back(entry22);
571
572 adcPulseAmpRawTitle.at(i) = fAdcNames.at(i) + "_adcPulseAmpRaw";
573 adcPulseAmpRawVar.at(i) = TString::Format("fAdcPulseAmpRaw[%d]", i);
574 RVarDef entry3 {
575 adcPulseAmpRawTitle.at(i).Data(),
576 adcPulseAmpRawTitle.at(i).Data(),
577 adcPulseAmpRawVar.at(i).Data()
578 };
579 vars.push_back(entry3);
580
581
582 adcSampPulseAmpRawTitle.at(i) = fAdcNames.at(i) + "_adcSampPulseAmpRaw";
583 adcSampPulseAmpRawVar.at(i) = TString::Format("fAdcSampPulseAmpRaw[%d]", i);
584 RVarDef entry33 {
585 adcSampPulseAmpRawTitle.at(i).Data(),
586 adcSampPulseAmpRawTitle.at(i).Data(),
587 adcSampPulseAmpRawVar.at(i).Data()
588 };
589 vars.push_back(entry33);
590
591 adcPulseTimeRawTitle.at(i) = fAdcNames.at(i) + "_adcPulseTimeRaw";
592 adcPulseTimeRawVar.at(i) = TString::Format("fAdcPulseTimeRaw[%d]", i);
593 RVarDef entry4 {
594 adcPulseTimeRawTitle.at(i).Data(),
595 adcPulseTimeRawTitle.at(i).Data(),
596 adcPulseTimeRawVar.at(i).Data()
597 };
598 vars.push_back(entry4);
599
600 adcSampPulseTimeRawTitle.at(i) = fAdcNames.at(i) + "_adcSampPulseTimeRaw";
601 adcSampPulseTimeRawVar.at(i) = TString::Format("fAdcSampPulseTimeRaw[%d]", i);
602 RVarDef entry44 {
603 adcSampPulseTimeRawTitle.at(i).Data(),
604 adcSampPulseTimeRawTitle.at(i).Data(),
605 adcSampPulseTimeRawVar.at(i).Data()
606 };
607 vars.push_back(entry44);
608
609 adcPedTitle.at(i) = fAdcNames.at(i) + "_adcPed";
610 adcPedVar.at(i) = TString::Format("fAdcPed[%d]", i);
611 RVarDef entry5 {
612 adcPedTitle.at(i).Data(),
613 adcPedTitle.at(i).Data(),
614 adcPedVar.at(i).Data()
615 };
616 vars.push_back(entry5);
617
618
619 adcSampPedTitle.at(i) = fAdcNames.at(i) + "_adcSampPed";
620 adcSampPedVar.at(i) = TString::Format("fAdcSampPed[%d]", i);
621 RVarDef entry55 {
622 adcSampPedTitle.at(i).Data(),
623 adcSampPedTitle.at(i).Data(),
624 adcSampPedVar.at(i).Data()
625 };
626 vars.push_back(entry55);
627
628 adcPulseIntTitle.at(i) = fAdcNames.at(i) + "_adcPulseInt";
629 adcPulseIntVar.at(i) = TString::Format("fAdcPulseInt[%d]", i);
630 RVarDef entry6 {
631 adcPulseIntTitle.at(i).Data(),
632 adcPulseIntTitle.at(i).Data(),
633 adcPulseIntVar.at(i).Data()
634 };
635 vars.push_back(entry6);
636
637
638 adcSampPulseIntTitle.at(i) = fAdcNames.at(i) + "_adcSampPulseInt";
639 adcSampPulseIntVar.at(i) = TString::Format("fAdcSampPulseInt[%d]", i);
640 RVarDef entry66 {
641 adcSampPulseIntTitle.at(i).Data(),
642 adcSampPulseIntTitle.at(i).Data(),
643 adcSampPulseIntVar.at(i).Data()
644 };
645 vars.push_back(entry66);
646
647 adcPulseAmpTitle.at(i) = fAdcNames.at(i) + "_adcPulseAmp";
648 adcPulseAmpVar.at(i) = TString::Format("fAdcPulseAmp[%d]", i);
649 RVarDef entry7 {
650 adcPulseAmpTitle.at(i).Data(),
651 adcPulseAmpTitle.at(i).Data(),
652 adcPulseAmpVar.at(i).Data()
653 };
654 vars.push_back(entry7);
655
656
657 adcSampPulseAmpTitle.at(i) = fAdcNames.at(i) + "_adcSampPulseAmp";
658 adcSampPulseAmpVar.at(i) = TString::Format("fAdcSampPulseAmp[%d]", i);
659 RVarDef entry77 {
660 adcSampPulseAmpTitle.at(i).Data(),
661 adcSampPulseAmpTitle.at(i).Data(),
662 adcSampPulseAmpVar.at(i).Data()
663 };
664 vars.push_back(entry77);
665
666 adcMultiplicityTitle.at(i) = fAdcNames.at(i) + "_adcMultiplicity";
667 adcMultiplicityVar.at(i) = TString::Format("fAdcMultiplicity[%d]", i);
668 RVarDef entry8 {
669 adcMultiplicityTitle.at(i).Data(),
670 adcMultiplicityTitle.at(i).Data(),
671 adcMultiplicityVar.at(i).Data()
672 };
673 vars.push_back(entry8);
674
675
676 adcSampMultiplicityTitle.at(i) = fAdcNames.at(i) + "_adcSampMultiplicity";
677 adcSampMultiplicityVar.at(i) = TString::Format("fAdcSampMultiplicity[%d]", i);
678 RVarDef entry88 {
679 adcSampMultiplicityTitle.at(i).Data(),
680 adcSampMultiplicityTitle.at(i).Data(),
681 adcSampMultiplicityVar.at(i).Data()
682 };
683 vars.push_back(entry88);
684
685 adcPulseTimeTitle.at(i) = fAdcNames.at(i) + "_adcPulseTime";
686 adcPulseTimeVar.at(i) = TString::Format("fAdcPulseTime[%d]", i);
687 RVarDef entry9 {
688 adcPulseTimeTitle.at(i).Data(),
689 adcPulseTimeTitle.at(i).Data(),
690 adcPulseTimeVar.at(i).Data()
691 };
692 vars.push_back(entry9);
693
694 adcSampPulseTimeTitle.at(i) = fAdcNames.at(i) + "_adcSampPulseTime";
695 adcSampPulseTimeVar.at(i) = TString::Format("fAdcSampPulseTime[%d]", i);
696 RVarDef entry99 {
697 adcSampPulseTimeTitle.at(i).Data(),
698 adcSampPulseTimeTitle.at(i).Data(),
699 adcSampPulseTimeVar.at(i).Data()
700 };
701 vars.push_back(entry99);
702
703 } // loop over fNumAdc
704 // Push the variable names for TDC channels.
705 std::vector<TString> tdcTimeRawTitle(fNumTdc), tdcTimeRawVar(fNumTdc);
706 std::vector<TString> tdcTimeTitle(fNumTdc), tdcTimeVar(fNumTdc);
707 std::vector<TString> vecTdcTimeRawTitle(fNumTdc), vecTdcTimeRawVar(fNumTdc);
708 std::vector<TString> vecTdcTimeTitle(fNumTdc), vecTdcTimeVar(fNumTdc);
709 std::vector<TString> tdcMultiplicityTitle(fNumTdc), tdcMultiplicityVar(fNumTdc);
710
711 for (int i=0; i<fNumTdc; ++i) {
712 tdcTimeRawTitle.at(i) = fTdcNames.at(i) + "_tdcTimeRaw";
713 tdcTimeRawVar.at(i) = TString::Format("fTdcTimeRaw[%d]", i);
714 vecTdcTimeRawTitle.at(i) = fTdcNames.at(i) + "_vecTdcTimeRaw";
715 vecTdcTimeRawVar.at(i) = TString::Format("fVecTdcTimeRaw[%d]", i);
716 RVarDef entry1 {
717 tdcTimeRawTitle.at(i).Data(),
718 tdcTimeRawTitle.at(i).Data(),
719 tdcTimeRawVar.at(i).Data()
720 };
721 vars.push_back(entry1);
722
723 RVarDef entry1vec {
724 vecTdcTimeRawTitle.at(i).Data(),
725 vecTdcTimeRawTitle.at(i).Data(),
726 vecTdcTimeRawVar.at(i).Data()
727 };
728 vars.push_back(entry1vec);
729
730 tdcTimeTitle.at(i) = fTdcNames.at(i) + "_tdcTime";
731 tdcTimeVar.at(i) = TString::Format("fTdcTime[%d]", i);
732 vecTdcTimeTitle.at(i) = fTdcNames.at(i) + "_vecTdcTime";
733 vecTdcTimeVar.at(i) = TString::Format("fVecTdcTime[%d]", i);
734
735 RVarDef entry2 {
736 tdcTimeTitle.at(i).Data(),
737 tdcTimeTitle.at(i).Data(),
738 tdcTimeVar.at(i).Data()
739 };
740 vars.push_back(entry2);
741
742 RVarDef entry2vec {
743 vecTdcTimeTitle.at(i).Data(),
744 vecTdcTimeTitle.at(i).Data(),
745 vecTdcTimeVar.at(i).Data()
746 };
747 vars.push_back(entry2vec);
748
749 tdcMultiplicityTitle.at(i) = fTdcNames.at(i) + "_tdcMultiplicity";
750 tdcMultiplicityVar.at(i) = TString::Format("fTdcMultiplicity[%d]", i);
751 RVarDef entry3 {
752 tdcMultiplicityTitle.at(i).Data(),
753 tdcMultiplicityTitle.at(i).Data(),
754 tdcMultiplicityVar.at(i).Data()
755 };
756 vars.push_back(entry3);
757 }
758
759 RVarDef end {0};
760 vars.push_back(end);
761
762 if (fOutputSampWaveform==1) {
763 RVarDef vars2[] = {
764 {"adcSampWaveform", "FADC Sample Waveform", "fSampWaveform"},
765 { 0 }
766 };
767 DefineVarsFromList( vars2, mode);
768 }
769
770 return DefineVarsFromList(vars.data(), mode);
771}
772void THcTrigDet::SetSpectName( const char* name)
773{
774 fSpectName = name;
775}
776
777void THcTrigDet::AddEvtType(int evtype) {
778 eventtypes.push_back(evtype);
779}
780
781void THcTrigDet::SetEvtType(int evtype) {
782 eventtypes.clear();
783 AddEvtType(evtype);
784}
785
786//_____________________________________________________________________________
788{
789 for (UInt_t i=0; i < eventtypes.size(); i++) {
790 if (evtype == eventtypes[i]) return kTRUE;
791 }
792 return kFALSE;
793}
794
795//_____________________________________________________________________________
797{
798 return( (eventtypes.size()>0) ? kTRUE : kFALSE);
799}
800
801//_____________________________________________________________________________
803{
804 MissReport(Form("%s.%s", GetApparatus()->GetName(), GetName()));
805 return 0;
806}
807
int Int_t
unsigned int UInt_t
const Data_t kBig
bool Bool_t
const Bool_t kFALSE
double Double_t
const Bool_t kTRUE
const char Option_t
Option_t Option_t TPoint TPoint const char mode
R__EXTERN class THaVarList * gHaVars
ClassImp(VDC::AnalyticTTDConv) using namespace std
R__EXTERN class THcParmList * gHcParms
Definition THcGlobals.h:11
R__EXTERN class THcDetectorMap * gHcDetectorMap
Definition THcGlobals.h:12
char * Form(const char *fmt,...)
static Int_t DefineVarsFromList(const void *list, EType type, EMode mode, const char *def_prefix, const TObject *obj, const char *prefix, const char *here, const char *comment_subst="")
virtual const char * Here(const char *) const
virtual void Clear(Option_t *="")
THaDetMap * fDetMap
THaApparatus * GetApparatus() const
UInt_t GetEvType() const
virtual THaVar * Find(const char *name) const
const void * GetValuePointer() const
virtual Int_t FillMap(THaDetMap *detmap, const char *detectorname)
Builds a Hall C ENGx1INE style list of raw hits from raw data.
Definition THcHitList.h:27
virtual Int_t DecodeToHitList(const THaEvData &evdata, Bool_t suppress=kFALSE)
Populate the hitlist from the raw event data.
TClonesArray * fRawHitList
Definition THcHitList.h:51
void CreateMissReportParms(const char *prefix) const
void InitHitList(THaDetMap *detmap, const char *hitclass, Int_t maxhits, Int_t tdcref_cut=0, Int_t adcref_cut=0)
Save the electronics module to detector mapping and initialize a hit array of hits of class hitclass.
void MissReport(const char *name) const
Int_t LoadParmValues(const DBRequest *list, const char *prefix="")
Retrieve parameter values from the parameter cache.
Class representing a single raw ADC hit.
Definition THcRawAdcHit.h:7
Int_t GetSampPulseIntRaw(UInt_t iPulse=0) const
UInt_t GetNSampPulses() const
Double_t GetSampPulseInt(UInt_t iPulse=0) const
Int_t GetPedRaw() const
Gets raw signal pedestal. In channels.
Int_t GetSampPulseAmpRaw(UInt_t iPulse=0) const
Double_t GetSampPulseTime(UInt_t iPulse=0) const
UInt_t GetNPulses() const
Gets number of set pulses.
Int_t GetF250_NSB() const
UInt_t GetNSamples() const
Gets number of set samples.
Int_t GetSampPedRaw() const
void SetSampNSAT(Int_t nsat)
void SetSampThreshold(Double_t thres)
Double_t GetPulseAmp(UInt_t iPulse=0) const
Gets pedestal subtracted pulse amplitude. In channels.
Double_t GetSample(UInt_t iSample=0) const
void SetSampIntTimePedestalPeak()
Int_t GetPulseAmpRaw(UInt_t iPulse=0) const
Gets raw pulse amplitude. In channels.
Double_t GetPed() const
Gets sample pedestal. In channels.
Int_t GetPulseTimeRaw(UInt_t iPulse=0) const
Gets raw pulse time. In subsamples.
Double_t GetSampPulseAmp(UInt_t iPulse=0) const
Double_t GetPulseTime(UInt_t iPulse=0) const
Int_t GetPulseIntRaw(UInt_t iPulse=0) const
Gets raw pulse integral. In channels.
Int_t GetSampPulseTimeRaw(UInt_t iPulse=0) const
Double_t GetSampPed() const
Int_t GetF250_NSA() const
void SetF250Params(Int_t NSA, Int_t NSB, Int_t NPED)
Sets F250 parameters used for pedestal subtraction.
Double_t GetPulseInt(UInt_t iPulse=0) const
Gets pedestal subtracted pulse integral. In channels.
Int_t fPlane
Definition THcRawHit.h:52
Int_t fCounter
Definition THcRawHit.h:53
Class representing a single raw TDC hit.
Definition THcRawTdcHit.h:7
Int_t GetRefTime() const
Gets reference time. In channels.
Int_t GetTimeRaw(UInt_t iHit=0) const
Gets raw TDC time. In channels.
Int_t GetTime(UInt_t iHit=0) const
Gets TDC time. In channels.
UInt_t GetNHits() const
Gets the number of set hits.
Bool_t HasRefTime() const
Queries whether reference time has been set.
A mock detector to hold trigger related data.
Definition THcTrigDet.h:16
Bool_t * fPresentP
Definition THcTrigDet.h:115
Double_t fAdcTdcOffset
Definition THcTrigDet.h:54
Int_t fTdcTimeRaw[fMaxTdcChannels]
Definition THcTrigDet.h:73
Int_t fRFId[2]
Definition THcTrigDet.h:52
vector< Int_t > fVecTdcTimeRaw[fMaxTdcChannels]
Definition THcTrigDet.h:75
Int_t fAdcSampMultiplicity[fMaxAdcChannels]
Definition THcTrigDet.h:110
Int_t fAdcMultiplicity[fMaxAdcChannels]
Definition THcTrigDet.h:109
Int_t fAdcSampPulseIntRaw[fMaxAdcChannels]
Definition THcTrigDet.h:97
Double_t fAdcSampPed[fMaxAdcChannels]
Definition THcTrigDet.h:101
Int_t fNumAdc
Definition THcTrigDet.h:49
Double_t fAdcSampPulseTime[fMaxAdcChannels]
Definition THcTrigDet.h:104
Int_t fUseSampWaveform
Definition THcTrigDet.h:59
Double_t fAdcPulseInt[fMaxAdcChannels]
Definition THcTrigDet.h:92
Double_t fAdcPulseTime[fMaxAdcChannels]
Definition THcTrigDet.h:94
void Setup(const char *name, const char *description)
Int_t fAdcPedRaw[fMaxAdcChannels]
Definition THcTrigDet.h:86
Double_t fTdcOffset
Definition THcTrigDet.h:55
Double_t * fAdcTimeWindowMin
Definition THcTrigDet.h:81
static const int fMaxTdcChannels
Definition THcTrigDet.h:71
Int_t fTdcMultiplicity[fMaxTdcChannels]
Definition THcTrigDet.h:108
Int_t fTrigId[4]
Definition THcTrigDet.h:51
virtual void SetSpectName(const char *name)
std::vector< std::string > fTrigNames
Definition THcTrigDet.h:67
std::vector< Int_t > eventtypes
Definition THcTrigDet.h:114
Int_t Decode(const THaEvData &evData)
Decodes and processes events.
virtual void Clear(Option_t *opt="")
Clears variables before next event.
Int_t fSampNSA
Definition THcTrigDet.h:61
std::vector< std::string > fRFNames
Definition THcTrigDet.h:68
TString fSpectName
Definition THcTrigDet.h:113
Int_t fSampNSAT
Definition THcTrigDet.h:62
Double_t * fTdcTimeWindowMin
Definition THcTrigDet.h:83
Int_t fNumTdc
Definition THcTrigDet.h:50
Int_t fAdcPulseIntRaw[fMaxAdcChannels]
Definition THcTrigDet.h:87
std::string fKwPrefix
Definition THcTrigDet.h:47
Double_t fTdcTime[fMaxTdcChannels]
Definition THcTrigDet.h:74
Int_t fAdcSampPulseAmpRaw[fMaxAdcChannels]
Definition THcTrigDet.h:98
Int_t fAdcSampPulseTimeRaw[fMaxAdcChannels]
Definition THcTrigDet.h:99
virtual Int_t ReadDatabase(const TDatime &date)
static const int fMaxAdcChannels
Definition THcTrigDet.h:70
Double_t fAdcPed[fMaxAdcChannels]
Definition THcTrigDet.h:91
Double_t fAdcSampPulseAmp[fMaxAdcChannels]
Definition THcTrigDet.h:103
virtual Bool_t IsIgnoreType(Int_t evtype) const
Int_t fSampNSB
Definition THcTrigDet.h:63
virtual void SetEvtType(int evtype)
std::vector< std::string > fAdcNames
Definition THcTrigDet.h:65
virtual Int_t DefineVariables(EMode mode=kDefine)
Int_t fTDC_RefTimeCut
Definition THcTrigDet.h:78
virtual void AddEvtType(int evtype)
Double_t fSampThreshold
Definition THcTrigDet.h:60
Double_t fTdcChanperNS
Definition THcTrigDet.h:56
std::vector< std::string > fTdcNames
Definition THcTrigDet.h:66
Int_t End(THaRunBase *run)
vector< Double_t > fVecTdcTime[fMaxTdcChannels]
Definition THcTrigDet.h:76
Int_t fAdcSampPedRaw[fMaxAdcChannels]
Definition THcTrigDet.h:96
Int_t fOutputSampWaveform
Definition THcTrigDet.h:58
Double_t fAdcSampPulseInt[fMaxAdcChannels]
Definition THcTrigDet.h:102
~THcTrigDet()
A destructor.
Double_t fAdcPulseAmp[fMaxAdcChannels]
Definition THcTrigDet.h:93
Double_t * fTdcTimeWindowMax
Definition THcTrigDet.h:84
std::vector< Double_t > fSampWaveform
Definition THcTrigDet.h:106
Int_t fAdcPulseAmpRaw[fMaxAdcChannels]
Definition THcTrigDet.h:88
virtual Bool_t HaveIgnoreList() const
Double_t fTdcRefTime
Definition THcTrigDet.h:111
Int_t fADC_RefTimeCut
Definition THcTrigDet.h:79
Int_t fAdcPulseTimeRaw[fMaxAdcChannels]
Definition THcTrigDet.h:89
Double_t * fAdcTimeWindowMax
Definition THcTrigDet.h:82
Class representing a single raw hit for the THcTrigDet.
THcRawAdcHit & GetRawAdcHit()
Gets reference to THcRawAdcHit.
THcRawTdcHit & GetRawTdcHit()
Gets reference to THcRawTdcHit.
const char * GetName() const override
const char * GetTitle() const override
TObject * At(Int_t idx) const override
virtual void Error(const char *method, const char *msgfmt,...) const
const char * Data() const
RVec< PromoteType< T > > abs(const RVec< T > &v)
end
const char * cnt