20 #include "THaTrackProj.h"
36 const
char* description,
38 THaDetectorBase* parent )
39 : THaSubDetector(name,description,parent)
45 frPosAdcErrorFlag =
new TClonesArray(
"THcSignalHit", 16);
47 frPosAdcThreshold =
new TClonesArray(
"THcSignalHit", 16);
48 frPosAdcPulseIntRaw =
new TClonesArray(
"THcSignalHit", 16);
49 frPosAdcPulseAmpRaw =
new TClonesArray(
"THcSignalHit", 16);
50 frPosAdcPulseTimeRaw =
new TClonesArray(
"THcSignalHit", 16);
55 frPosAdcPulseTime =
new TClonesArray(
"THcSignalHit", 16);
57 frNegAdcErrorFlag =
new TClonesArray(
"THcSignalHit", 16);
59 frNegAdcThreshold =
new TClonesArray(
"THcSignalHit", 16);
60 frNegAdcPulseIntRaw =
new TClonesArray(
"THcSignalHit", 16);
61 frNegAdcPulseAmpRaw =
new TClonesArray(
"THcSignalHit", 16);
62 frNegAdcPulseTimeRaw =
new TClonesArray(
"THcSignalHit", 16);
67 frNegAdcPulseTime =
new TClonesArray(
"THcSignalHit", 16);
81 delete fPosADCHits; fPosADCHits = NULL;
82 delete fNegADCHits; fNegADCHits = NULL;
84 delete frPosAdcErrorFlag; frPosAdcErrorFlag = NULL;
85 delete frPosAdcPedRaw; frPosAdcPedRaw = NULL;
86 delete frPosAdcThreshold; frPosAdcThreshold = NULL;
87 delete frPosAdcPulseIntRaw; frPosAdcPulseIntRaw = NULL;
88 delete frPosAdcPulseAmpRaw; frPosAdcPulseAmpRaw = NULL;
89 delete frPosAdcPulseTimeRaw; frPosAdcPulseTimeRaw = NULL;
91 delete frPosAdcPed; frPosAdcPed = NULL;
92 delete frPosAdcPulseInt; frPosAdcPulseInt = NULL;
93 delete frPosAdcPulseAmp; frPosAdcPulseAmp = NULL;
94 delete frPosAdcPulseTime; frPosAdcPulseTime = NULL;
96 delete frNegAdcErrorFlag; frNegAdcErrorFlag = NULL;
97 delete frNegAdcPedRaw; frNegAdcPedRaw = NULL;
98 delete frNegAdcThreshold; frNegAdcThreshold = NULL;
99 delete frNegAdcPulseIntRaw; frNegAdcPulseIntRaw = NULL;
100 delete frNegAdcPulseAmpRaw; frNegAdcPulseAmpRaw = NULL;
101 delete frNegAdcPulseTimeRaw; frNegAdcPulseTimeRaw = NULL;
103 delete frNegAdcPed; frNegAdcPed = NULL;
104 delete frNegAdcPulseInt; frNegAdcPulseInt = NULL;
105 delete frNegAdcPulseAmp; frNegAdcPulseAmp = NULL;
106 delete frNegAdcPulseTime; frNegAdcPulseTime = NULL;
108 delete [] fPosPedSum;
109 delete [] fPosPedSum2;
110 delete [] fPosPedLimit;
111 delete [] fPosPedCount;
113 delete [] fNegPedSum;
114 delete [] fNegPedSum2;
115 delete [] fNegPedLimit;
116 delete [] fNegPedCount;
120 delete [] fPosThresh;
124 delete [] fNegThresh;
137 return fStatus = kInitError;
142 fParent = GetParent();
146 if (fParent->GetPrefix()[0] ==
'P') {
147 fCherenkov =
dynamic_cast<THcCherenkov*
>(app->GetDetector(
"hgcer"));
149 fCherenkov =
dynamic_cast<THcCherenkov*
>(app->GetDetector(
"cer"));
152 cout <<
"****** THcShowerPlane::Init Cherenkov not found! ******" << endl;
153 cout <<
"****** THcShowerPlane::Accumulate will be skipped ******" << endl;
157 !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector(
"hod"))) ) {
158 static const char*
const here =
"ReadDatabase()";
159 Warning(Here(here),
"Hodoscope \"%s\" not found. ",
"hod");
163 if( (status=THaSubDetector::Init( date )) )
164 return fStatus = status;
166 return fStatus = kOK;
178 prefix[0]=tolower(fParent->GetPrefix()[0]);
190 {
"cal_AdcNegThreshold", &fAdcNegThreshold, kDouble, 0, 1},
191 {
"cal_AdcPosThreshold", &fAdcPosThreshold, kDouble, 0, 1},
192 {
"cal_ped_sample_low", &fPedSampLow, kInt, 0, 1},
193 {
"cal_ped_sample_high", &fPedSampHigh, kInt, 0, 1},
194 {
"cal_data_sample_low", &fDataSampLow, kInt, 0, 1},
195 {
"cal_data_sample_high", &fDataSampHigh, kInt, 0, 1},
196 {
"cal_debug_adc", &fDebugAdc, kInt, 0, 1},
197 {
"stat_cermin", &fStatCerMin, kDouble, 0, 1},
198 {
"stat_slop", &fStatSlop, kDouble, 0, 1},
199 {
"stat_maxchisq", &fStatMaxChi2, kDouble, 0, 1},
224 parent->
GetXPos(fLayerNum-1,fNelem-1))/2 +
228 parent->
GetYPos(fLayerNum-1,1))/2;
232 fOrigin.SetXYZ(xOrig, yOrig, zOrig);
241 fPosPedLimit =
new Int_t [fNelem];
242 fNegPedLimit =
new Int_t [fNelem];
244 for(
Int_t i=0;i<fNelem;i++) {
245 fPosPedLimit[i] = parent->
GetPedLimit(i,fLayerNum-1,0);
246 fNegPedLimit[i] = parent->
GetPedLimit(i,fLayerNum-1,1);
251 InitializePedestals();
253 fNumGoodPosAdcHits = vector<Int_t> (fNelem, 0.0);
254 fNumGoodNegAdcHits = vector<Int_t> (fNelem, 0.0);
256 fGoodPosAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0);
257 fGoodNegAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0);
259 fGoodPosAdcPed = vector<Double_t> (fNelem, 0.0);
260 fGoodPosAdcPulseInt = vector<Double_t> (fNelem, 0.0);
261 fGoodPosAdcPulseAmp = vector<Double_t> (fNelem, 0.0);
262 fGoodPosAdcPulseTime = vector<Double_t> (fNelem, 0.0);
263 fGoodPosAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0);
265 fGoodNegAdcPed = vector<Double_t> (fNelem, 0.0);
266 fGoodNegAdcPulseInt = vector<Double_t> (fNelem, 0.0);
267 fGoodNegAdcPulseAmp = vector<Double_t> (fNelem, 0.0);
268 fGoodNegAdcPulseTime = vector<Double_t> (fNelem, 0.0);
269 fGoodNegAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0);
271 fGoodPosAdcMult = vector<Double_t> (fNelem, 0.0);
272 fGoodNegAdcMult = vector<Double_t> (fNelem, 0.0);
276 fEpos = vector<Double_t> (fNelem, 0.0);
277 fEneg = vector<Double_t> (fNelem, 0.0);
278 fEmean = vector<Double_t> (fNelem, 0.0);
285 fStatNumTrk = vector<Int_t> (fNelem, 0);
286 fStatNumHit = vector<Int_t> (fNelem, 0);
293 cout <<
"---------------------------------------------------------------\n";
294 cout <<
"Debug output from THcShowerPlane::ReadDatabase for "
295 << fParent->GetPrefix() <<
":" << endl;
297 cout <<
" Layer #" << fLayerNum <<
", number of elements " << dec << fNelem
300 cout <<
" Origin of Layer at X = " << fOrigin.X()
301 <<
" Y = " << fOrigin.Y() <<
" Z = " << fOrigin.Z() << endl;
303 cout <<
" fPosPedLimit:";
304 for(
Int_t i=0;i<fNelem;i++) cout <<
" " << fPosPedLimit[i];
306 cout <<
" fNegPedLimit:";
307 for(
Int_t i=0;i<fNelem;i++) cout <<
" " << fNegPedLimit[i];
310 cout <<
" fMinPeds = " << fMinPeds << endl;
311 cout <<
"---------------------------------------------------------------\n";
322 if( mode == kDefine && fIsSetup )
return kOK;
323 fIsSetup = ( mode == kDefine );
329 {
"posAdcPedRaw",
"List of positive raw ADC pedestals",
"frPosAdcPedRaw.THcSignalHit.GetData()"},
330 {
"posAdcPulseIntRaw",
"List of positive raw ADC pulse integrals.",
"frPosAdcPulseIntRaw.THcSignalHit.GetData()"},
331 {
"posAdcPulseAmpRaw",
"List of positive raw ADC pulse amplitudes.",
"frPosAdcPulseAmpRaw.THcSignalHit.GetData()"},
332 {
"posAdcPulseTimeRaw",
"List of positive raw ADC pulse times.",
"frPosAdcPulseTimeRaw.THcSignalHit.GetData()"},
334 {
"posAdcPed",
"List of positive ADC pedestals",
"frPosAdcPed.THcSignalHit.GetData()"},
335 {
"posAdcPulseInt",
"List of positive ADC pulse integrals.",
"frPosAdcPulseInt.THcSignalHit.GetData()"},
336 {
"posAdcPulseAmp",
"List of positive ADC pulse amplitudes.",
"frPosAdcPulseAmp.THcSignalHit.GetData()"},
337 {
"posAdcPulseTime",
"List of positive ADC pulse times.",
"frPosAdcPulseTime.THcSignalHit.GetData()"},
339 {
"negAdcPedRaw",
"List of negative raw ADC pedestals",
"frNegAdcPedRaw.THcSignalHit.GetData()"},
340 {
"negAdcPulseIntRaw",
"List of negative raw ADC pulse integrals.",
"frNegAdcPulseIntRaw.THcSignalHit.GetData()"},
341 {
"negAdcPulseAmpRaw",
"List of negative raw ADC pulse amplitudes.",
"frNegAdcPulseAmpRaw.THcSignalHit.GetData()"},
342 {
"negAdcPulseTimeRaw",
"List of negative raw ADC pulse times.",
"frNegAdcPulseTimeRaw.THcSignalHit.GetData()"},
344 {
"negAdcPed",
"List of negative ADC pedestals",
"frNegAdcPed.THcSignalHit.GetData()"},
345 {
"negAdcPulseInt",
"List of negative ADC pulse integrals.",
"frNegAdcPulseInt.THcSignalHit.GetData()"},
346 {
"negAdcPulseAmp",
"List of negative ADC pulse amplitudes.",
"frNegAdcPulseAmp.THcSignalHit.GetData()"},
347 {
"negAdcPulseTime",
"List of negative ADC pulse times.",
"frNegAdcPulseTime.THcSignalHit.GetData()"},
350 DefineVarsFromList( vars, mode);
356 gHcParms->Define(
Form(
"%sstat_trksum%d", fParent->GetPrefix(), fLayerNum),
357 Form(
"Number of tracks in calo. layer %d",fLayerNum), fTotStatNumTrk);
358 gHcParms->Define(
Form(
"%sstat_hitsum%d", fParent->GetPrefix(), fLayerNum),
359 Form(
"Number of hits in calo. layer %d", fLayerNum), fTotStatNumHit);
361 cout <<
"THcShowerPlane::DefineVariables: registered counters "
362 <<
Form(
"%sstat_trksum%d",fParent->GetPrefix(),fLayerNum) <<
" and "
363 <<
Form(
"%sstat_hitsum%d",fParent->GetPrefix(),fLayerNum) << endl;
367 {
"posAdcErrorFlag",
"List of positive raw ADC Error Flags",
"frPosAdcErrorFlag.THcSignalHit.GetData()"},
368 {
"negAdcErrorFlag",
"List of negative raw ADC Error Flags ",
"frNegAdcErrorFlag.THcSignalHit.GetData()"},
370 {
"posAdcCounter",
"List of positive ADC counter numbers.",
"frPosAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
371 {
"negAdcCounter",
"List of negative ADC counter numbers.",
"frNegAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
373 {
"totNumPosAdcHits",
"Total Number of Positive ADC Hits",
"fTotNumPosAdcHits"},
374 {
"totNumNegAdcHits",
"Total Number of Negative ADC Hits",
"fTotNumNegAdcHits"},
375 {
"totnumAdcHits",
"Total Number of ADC Hits Per PMT",
"fTotNumAdcHits"},
377 {
"numGoodPosAdcHits",
"Number of Good Positive ADC Hits Per PMT",
"fNumGoodPosAdcHits"},
378 {
"numGoodNegAdcHits",
"Number of Good Negative ADC Hits Per PMT",
"fNumGoodNegAdcHits"},
379 {
"totNumGoodPosAdcHits",
"Total Number of Good Positive ADC Hits",
"fTotNumGoodPosAdcHits"},
380 {
"totNumGoodNegAdcHits",
"Total Number of Good Negative ADC Hits",
"fTotNumGoodNegAdcHits"},
381 {
"totnumGoodAdcHits",
"TotalNumber of Good ADC Hits Per PMT",
"fTotNumGoodAdcHits"},
383 {
"goodPosAdcPulseIntRaw",
"Good Positive Raw ADC Pulse Integrals",
"fGoodPosAdcPulseIntRaw"},
384 {
"goodNegAdcPulseIntRaw",
"Good Negative Raw ADC Pulse Integrals",
"fGoodNegAdcPulseIntRaw"},
386 {
"goodPosAdcPed",
"Good Positive ADC pedestals",
"fGoodPosAdcPed"},
387 {
"goodPosAdcPulseInt",
"Good Positive ADC integrals",
"fGoodPosAdcPulseInt"},
388 {
"goodPosAdcPulseAmp",
"Good Positive ADC amplitudes",
"fGoodPosAdcPulseAmp"},
389 {
"goodPosAdcPulseTime",
"Good Positive ADC times",
"fGoodPosAdcPulseTime"},
390 {
"goodPosAdcTdcDiffTime",
"Good Positive Hodo Start time-ADC times",
"fGoodPosAdcTdcDiffTime"},
392 {
"goodNegAdcPed",
"Good Negative ADC pedestals",
"fGoodNegAdcPed"},
393 {
"goodNegAdcPulseInt",
"Good Negative ADC integrals",
"fGoodNegAdcPulseInt"},
394 {
"goodNegAdcPulseAmp",
"Good Negative ADC amplitudes",
"fGoodNegAdcPulseAmp"},
395 {
"goodNegAdcPulseTime",
"Good Negative ADC times",
"fGoodNegAdcPulseTime"},
396 {
"goodNegAdcTdcDiffTime",
"Good Negative Hodo Start time-ADC times",
"fGoodNegAdcTdcDiffTime"},
397 {
"goodPosAdcMult",
"Good Positive ADC Multiplicity",
"fGoodPosAdcMult"},
398 {
"goodNegAdcMult",
"Good Negative ADC Multiplicity",
"fGoodNegAdcMult"},
399 {
"epos",
"Energy Depositions from Positive Side PMTs",
"fEpos"},
400 {
"eneg",
"Energy Depositions from Negative Side PMTs",
"fEneg"},
401 {
"emean",
"Mean Energy Depositions",
"fEmean"},
402 {
"eplane",
"Energy Deposition per plane",
"fEplane"},
403 {
"eplane_pos",
"Energy Deposition per plane from pos. PMTs",
"fEplane_pos"},
404 {
"eplane_neg",
"Energy Deposition per plane from neg. PMTs",
"fEplane_neg"},
408 return DefineVarsFromList(vars, mode);
416 fPosADCHits->Clear();
417 fNegADCHits->Clear();
419 frPosAdcErrorFlag->Clear();
420 frPosAdcPedRaw->Clear();
421 frPosAdcThreshold->Clear();
422 frPosAdcPulseIntRaw->Clear();
423 frPosAdcPulseAmpRaw->Clear();
424 frPosAdcPulseTimeRaw->Clear();
426 frPosAdcPed->Clear();
427 frPosAdcPulseInt->Clear();
428 frPosAdcPulseAmp->Clear();
429 frPosAdcPulseTime->Clear();
431 frNegAdcErrorFlag->Clear();
432 frNegAdcPedRaw->Clear();
433 frNegAdcThreshold->Clear();
434 frNegAdcPulseIntRaw->Clear();
435 frNegAdcPulseAmpRaw->Clear();
436 frNegAdcPulseTimeRaw->Clear();
438 frNegAdcPed->Clear();
439 frNegAdcPulseInt->Clear();
440 frNegAdcPulseAmp->Clear();
441 frNegAdcPulseTime->Clear();
443 for (
UInt_t ielem = 0; ielem < fGoodPosAdcPed.size(); ielem++) {
444 fGoodPosAdcPed.at(ielem) = 0.0;
445 fGoodPosAdcPulseIntRaw.at(ielem) = 0.0;
446 fGoodPosAdcPulseInt.at(ielem) = 0.0;
447 fGoodPosAdcPulseAmp.at(ielem) = 0.0;
448 fGoodPosAdcPulseTime.at(ielem) =
kBig;
449 fGoodPosAdcTdcDiffTime.at(ielem) =
kBig;
450 fGoodPosAdcMult.at(ielem) = 0.0;
451 fEpos.at(ielem) = 0.0;
452 fNumGoodPosAdcHits.at(ielem) = 0.0;
455 for (
UInt_t ielem = 0; ielem < fGoodNegAdcPed.size(); ielem++) {
456 fGoodNegAdcPed.at(ielem) = 0.0;
457 fGoodNegAdcPulseIntRaw.at(ielem) = 0.0;
458 fGoodNegAdcPulseInt.at(ielem) = 0.0;
459 fGoodNegAdcPulseAmp.at(ielem) = 0.0;
460 fGoodNegAdcPulseTime.at(ielem) =
kBig;
461 fGoodNegAdcTdcDiffTime.at(ielem) =
kBig;
462 fGoodNegAdcMult.at(ielem) = 0.0;
463 fEneg.at(ielem) = 0.0;
464 fNumGoodNegAdcHits.at(ielem) = 0.0;
467 for (
UInt_t ielem = 0; ielem < fEmean.size(); ielem++) {
468 fEmean.at(ielem) = 0.0;
472 fTotNumPosAdcHits = 0;
473 fTotNumNegAdcHits = 0;
475 fTotNumGoodAdcHits = 0;
476 fTotNumGoodPosAdcHits = 0;
477 fTotNumGoodNegAdcHits = 0;
481 if ( static_cast<THcShower*>(GetParent())->fdbg_decoded_cal ) {
482 cout <<
"---------------------------------------------------------------\n";
483 cout <<
"Debug output from THcShowerPlane::Clear for "
484 << GetParent()->GetPrefix() <<
":" << endl;
486 cout <<
" Cleared ADC hits for plane " <<
GetName() << endl;
487 cout <<
"---------------------------------------------------------------\n";
497 if ( static_cast<THcShower*>(fParent)->fdbg_decoded_cal ) {
498 cout <<
"---------------------------------------------------------------\n";
499 cout <<
"Debug output from THcShowerPlane::Decode for "
500 << fParent->GetPrefix() <<
":" << endl;
502 cout <<
" Called for plane " <<
GetName() << endl;
503 cout <<
"---------------------------------------------------------------\n";
534 fPosADCHits->Clear();
535 fNegADCHits->Clear();
537 frPosAdcErrorFlag->Clear();
538 frPosAdcPedRaw->Clear();
539 frPosAdcThreshold->Clear();
540 frPosAdcPulseIntRaw->Clear();
541 frPosAdcPulseAmpRaw->Clear();
542 frPosAdcPulseTimeRaw->Clear();
544 frPosAdcPed->Clear();
545 frPosAdcPulseInt->Clear();
546 frPosAdcPulseAmp->Clear();
547 frPosAdcPulseTime->Clear();
549 frNegAdcErrorFlag->Clear();
550 frNegAdcPedRaw->Clear();
551 frNegAdcThreshold->Clear();
552 frNegAdcPulseIntRaw->Clear();
553 frNegAdcPulseAmpRaw->Clear();
554 frNegAdcPulseTimeRaw->Clear();
556 frNegAdcPed->Clear();
557 frNegAdcPulseInt->Clear();
558 frNegAdcPulseAmp->Clear();
559 frNegAdcPulseTime->Clear();
582 Int_t ihit = nexthit;
584 while(ihit < nrawhits) {
589 if(hit->
fPlane > fLayerNum) {
597 ((
THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.
GetPedRaw());
599 ((
THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.
GetPed());
608 ((
THcSignalHit*) frPosAdcPulseTime->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.
GetPulseTime(thit)+fAdcTdcOffset);
611 ((
THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(padnum,0);
613 ((
THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(padnum,1);
620 Int_t PedDefaultTemp =
static_cast<THcShower*
>(fParent)->GetPedDefault(padnum-1,fLayerNum-1,0);
621 if (PedDefaultTemp !=0) {
623 ((
THcSignalHit*) frPosAdcPulseInt->ConstructedAt(nrPosAdcHits))->Set(padnum, tPulseInt);
624 ((
THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, PedDefaultTemp);
625 ((
THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(padnum,
float(PedDefaultTemp)/float(NPedSamples)*AdcToV);
628 ((
THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(nrPosAdcHits))->Set(padnum, 0.);
637 ((
THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.
GetPedRaw());
639 ((
THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.
GetPed());
648 ((
THcSignalHit*) frNegAdcPulseTime->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.
GetPulseTime(thit)+fAdcTdcOffset);
651 ((
THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(padnum,0);
653 ((
THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(padnum,1);
660 Int_t PedDefaultTemp =
static_cast<THcShower*
>(fParent)->GetPedDefault(padnum-1,fLayerNum-1,1);
661 if (PedDefaultTemp !=0) {
663 ((
THcSignalHit*) frNegAdcPulseInt->ConstructedAt(nrNegAdcHits))->Set(padnum, tPulseInt);
664 ((
THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, PedDefaultTemp);
665 ((
THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(padnum,
float(PedDefaultTemp)/float(NPedSamples)*AdcToV);
668 ((
THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits))->Set(padnum, 0.);
682 if(ADCMode == kADCDynamicPedestal) {
683 FillADC_DynamicPedestal();
684 }
else if (ADCMode == kADCSampleIntegral) {
685 FillADC_SampleIntegral();
686 }
else if (ADCMode == kADCSampIntDynPed) {
687 FillADC_SampIntDynPed();
692 if (static_cast<THcShower*>(fParent)->fdbg_decoded_cal) {
694 cout <<
"---------------------------------------------------------------\n";
695 cout <<
"Debug output from THcShowerPlane::ProcessHits for "
696 << fParent->GetPrefix() <<
":" << endl;
698 cout <<
" Sparsified hits for HMS calorimeter plane #" << fLayerNum
699 <<
", " <<
GetName() <<
":" << endl;
703 for (
Int_t i=0; i<fNelem; i++) {
705 if (GetAposP(i) > 0 || GetAnegP(i) >0) {
706 cout <<
" counter = " << i
707 <<
" Emean = " << fEmean[i]
708 <<
" Epos = " << fEpos[i]
709 <<
" Eneg = " << fEneg[i]
715 if (nspar == 0) cout <<
" No hits\n";
717 cout <<
" Eplane = " << fEplane
718 <<
" Eplane_pos = " << fEplane_pos
719 <<
" Eplane_neg = " << fEplane_neg
721 cout <<
"---------------------------------------------------------------\n";
748 for (
Int_t ielem=0;ielem<frNegAdcPulseIntRaw->GetEntries();ielem++) {
749 Int_t npad = ((
THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetPaddleNumber() - 1;
751 fGoodNegAdcPulseIntRaw.at(npad) = pulseIntRaw;
752 if(fGoodNegAdcPulseIntRaw.at(npad) > fNegThresh[npad]) {
753 fGoodNegAdcPulseInt.at(npad) = pulseIntRaw-fNegPed[npad];
754 fEneg.at(npad) = fGoodNegAdcPulseInt.at(npad)*
static_cast<THcShower*
>(fParent)->GetGain(npad,fLayerNum-1,1);
755 fEmean.at(npad) += fEneg.at(npad);
756 fEplane_neg += fEneg.at(npad);
759 for (
Int_t ielem=0;ielem<frPosAdcPulseIntRaw->GetEntries();ielem++) {
760 Int_t npad = ((
THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetPaddleNumber() - 1;
762 fGoodPosAdcPulseIntRaw.at(npad) =pulseIntRaw;
763 if(fGoodPosAdcPulseIntRaw.at(npad) > fPosThresh[npad]) {
764 fGoodPosAdcPulseInt.at(npad) =pulseIntRaw-fPosPed[npad] ;
765 fEpos.at(npad) =fGoodPosAdcPulseInt.at(npad)*
static_cast<THcShower*
>(fParent)->GetGain(npad,fLayerNum-1,0);
766 fEmean.at(npad) += fEpos.at(npad);
767 fEplane_pos += fEpos.at(npad);
770 fEplane= fEplane_neg+fEplane_pos;
776 if( fglHod ) StartTime = fglHod->GetStartTime();
778 if( fglHod ) OffsetTime = fglHod->GetOffsetTime();
779 for (
Int_t ielem=0;ielem<frNegAdcPulseInt->GetEntries();ielem++) {
780 Int_t npad = ((
THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
786 Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime;
788 Bool_t pulseTimeCut = (adctdcdiffTime >
static_cast<THcShower*
>(fParent)->GetWindowMin(npad,fLayerNum-1,1)) && (adctdcdiffTime < static_cast<THcShower*>(fParent)->GetWindowMax(npad,fLayerNum-1,1) );
789 fGoodNegAdcMult.at(npad) += 1;
791 fGoodNegAdcPulseIntRaw.at(npad) =pulseIntRaw;
793 if(fGoodNegAdcPulseIntRaw.at(npad) > threshold && fGoodNegAdcPulseInt.at(npad)==0) {
794 fGoodNegAdcPulseInt.at(npad) =pulseInt ;
795 fEneg.at(npad) = fGoodNegAdcPulseInt.at(npad)*
static_cast<THcShower*
>(fParent)->GetGain(npad,fLayerNum-1,1);
796 fEmean.at(npad) += fEneg.at(npad);
797 fEplane_neg += fEneg.at(npad);
799 fGoodNegAdcPed.at(npad) = pulsePed;
800 fGoodNegAdcPulseAmp.at(npad) = pulseAmp;
801 fGoodNegAdcPulseTime.at(npad) = pulseTime;
802 fGoodNegAdcTdcDiffTime.at(npad) = adctdcdiffTime;
804 fTotNumGoodAdcHits++;
805 fTotNumGoodNegAdcHits++;
806 fNumGoodNegAdcHits.at(npad) = npad + 1;
813 for (
Int_t ielem=0;ielem<frPosAdcPulseInt->GetEntries();ielem++) {
814 Int_t npad = ((
THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1;
821 Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime;
822 Bool_t pulseTimeCut = (adctdcdiffTime >
static_cast<THcShower*
>(fParent)->GetWindowMin(npad,fLayerNum-1,0)) && (adctdcdiffTime < static_cast<THcShower*>(fParent)->GetWindowMax(npad,fLayerNum-1,0) );
823 fGoodPosAdcMult.at(npad) += 1;
825 fGoodPosAdcPulseIntRaw.at(npad) = pulseIntRaw;
827 if(fGoodPosAdcPulseIntRaw.at(npad) > threshold && fGoodPosAdcPulseInt.at(npad)==0) {
829 fGoodPosAdcPulseInt.at(npad) =pulseInt ;
830 fEpos.at(npad) = fGoodPosAdcPulseInt.at(npad)*
static_cast<THcShower*
>(fParent)->GetGain(npad,fLayerNum-1,0);
831 fEmean.at(npad) += fEpos[npad];
832 fEplane_pos += fEpos.at(npad);
834 fGoodPosAdcPed.at(npad) = pulsePed;
835 fGoodPosAdcPulseAmp.at(npad) = pulseAmp;
836 fGoodPosAdcPulseTime.at(npad) = pulseTime;
837 fGoodPosAdcTdcDiffTime.at(npad) = adctdcdiffTime;
839 fTotNumGoodAdcHits++;
840 fTotNumGoodPosAdcHits++;
841 fNumGoodPosAdcHits.at(npad) = npad + 1;
847 fEplane= fEplane_neg+fEplane_pos;
858 Int_t ihit = nexthit;
859 while(ihit < nrawhits) {
864 if(hit->
fPlane > fLayerNum) {
871 if(adcpos <= fPosPedLimit[element]) {
872 fPosPedSum[element] += adcpos;
873 fPosPedSum2[element] += adcpos*adcpos;
874 fPosPedCount[element]++;
875 if(fPosPedCount[element] == fMinPeds/5) {
876 fPosPedLimit[element] = 100 + fPosPedSum[element]/fPosPedCount[element];
879 if(adcneg <= fNegPedLimit[element]) {
880 fNegPedSum[element] += adcneg;
881 fNegPedSum2[element] += adcneg*adcneg;
882 fNegPedCount[element]++;
883 if(fNegPedCount[element] == fMinPeds/5) {
884 fNegPedLimit[element] = 100 + fNegPedSum[element]/fNegPedCount[element];
894 if ( static_cast<THcShower*>(fParent)->fdbg_raw_cal ) {
896 cout <<
"---------------------------------------------------------------\n";
897 cout <<
"Debug output from THcShowerPlane::AcculatePedestals for "
898 << fParent->GetPrefix() <<
":" << endl;
900 cout <<
"Processed hit list for plane " <<
GetName() <<
":\n";
902 for (
Int_t ih=nexthit; ih<nrawhits; ih++) {
907 if(hit->
fPlane > fLayerNum) {
911 cout <<
" hit " << ih <<
":"
912 <<
" plane = " << hit->
fPlane
914 <<
" ADCpos = " << hit->
GetData(0)
915 <<
" ADCneg = " << hit->
GetData(1)
919 cout <<
"---------------------------------------------------------------\n";
932 for(
Int_t i=0; i<fNelem;i++) {
937 - fPosPed[i]*fPosPed[i]);
943 - fNegPed[i]*fNegPed[i]);
950 if ( static_cast<THcShower*>(fParent)->fdbg_raw_cal ) {
952 cout <<
"---------------------------------------------------------------\n";
953 cout <<
"Debug output from THcShowerPlane::CalculatePedestals for "
954 << fParent->GetPrefix() <<
":" << endl;
956 cout <<
" ADC pedestals and thresholds for calorimeter plane "
958 for(
Int_t i=0; i<fNelem;i++) {
959 cout <<
" element " << i <<
": "
960 <<
" Pos. pedestal = " << fPosPed[i]
961 <<
" Pos. threshold = " << fPosThresh[i]
962 <<
" Neg. pedestal = " << fNegPed[i]
963 <<
" Neg. threshold = " << fNegThresh[i]
966 cout <<
"---------------------------------------------------------------\n";
975 fNPedestalEvents = 0;
976 fPosPedSum =
new Int_t [fNelem];
977 fPosPedSum2 =
new Int_t [fNelem];
978 fPosPedCount =
new Int_t [fNelem];
979 fNegPedSum =
new Int_t [fNelem];
980 fNegPedSum2 =
new Int_t [fNelem];
981 fNegPedCount =
new Int_t [fNelem];
983 fPosSig =
new Float_t [fNelem];
984 fNegSig =
new Float_t [fNelem];
985 fPosPed =
new Float_t [fNelem];
986 fNegPed =
new Float_t [fNelem];
987 fPosThresh =
new Float_t [fNelem];
988 fNegThresh =
new Float_t [fNelem];
989 for(
Int_t i=0;i<fNelem;i++) {
1011 if(!fCherenkov)
return 0;
1013 THaTrack* BestTrack =
static_cast<THaTrack*
>( tracks[0]);
1014 if (BestTrack->GetChi2()/BestTrack->GetNDoF() > fStatMaxChi2)
return 0;
1016 if (fCherenkov->GetCerNPE() < fStatCerMin)
return 0;
1025 fOrigin = GetOrigin();
1026 static_cast<THcShower*
>(fParent)->CalcTrackIntercept(BestTrack, pathl, XTrk, YTrk);
1029 XTrk += GetOrigin().X();
1030 YTrk += GetOrigin().Y();
1032 for (
Int_t i=0; i<fNelem; i++) {
1034 if (
TMath::Abs(XTrk - static_cast<THcShower*>(fParent)->GetXPos(fLayerNum-1,i)) < fStatSlop &&
1035 YTrk > static_cast<THcShower*>(fParent)->GetYPos(fLayerNum-1,1) &&
1036 YTrk < static_cast<THcShower*>(fParent)->GetYPos(fLayerNum-1,0) ) {
1038 fStatNumTrk.at(i)++;
1041 if (fGoodPosAdcPulseInt.at(i) > 0. || fGoodNegAdcPulseInt.at(i) > 0.) {
1042 fStatNumHit.at(i)++;
1050 if ( static_cast<THcShower*>(fParent)->fdbg_tracks_cal ) {
1051 cout <<
"---------------------------------------------------------------\n";
1052 cout <<
"THcShowerPlane::AccumulateStat:" << endl;
1053 cout <<
" Chi2/NDF = " <<BestTrack->GetChi2()/BestTrack->GetNDoF() << endl;
1054 cout <<
" HGCER Npe = " << fCherenkov->GetCerNPE() << endl;
1055 cout <<
" XTrk, YTrk = " << XTrk <<
" " << YTrk << endl;
1056 for (
Int_t i=0; i<fNelem; i++) {
1057 if (
TMath::Abs(XTrk - static_cast<THcShower*>(fParent)->GetXPos(fLayerNum-1,i)) < fStatSlop) {
1059 cout <<
" Module " << i <<
", X=" <<
static_cast<THcShower*
>(fParent)->GetXPos(fLayerNum-1,i)
1060 <<
" matches track" << endl;
1062 if (fGoodPosAdcPulseInt.at(i) > 0. || fGoodNegAdcPulseInt.at(i) > 0.)
1063 cout <<
" PulseIntegrals = " << fGoodPosAdcPulseInt.at(i) <<
" "
1064 << fGoodNegAdcPulseInt.at(i) << endl;
1067 cout <<
"---------------------------------------------------------------\n";
Double_t GetF250_PeakPedestalRatio()
std::string GetName(const std::string &scope_name)
Double_t GetBlockThick(Int_t NLayer)
virtual Int_t ReadDatabase(const TDatime &date)
Class for gas Cherenkov detectors.
Double_t GetYPos(Int_t NLayer, Int_t Side) const
virtual Int_t DefineVariables(EMode mode=kDefine)
virtual EStatus Init(const TDatime &run_time)
Int_t GetPulseTimeRaw(UInt_t iPulse=0) const
Gets raw pulse time. In subsamples.
Short_t Min(Short_t a, Short_t b)
virtual Int_t FineProcess(TClonesArray &tracks)
virtual Int_t ProcessHits(TClonesArray *rawhits, Int_t nexthit)
virtual Int_t AccumulatePedestals(TClonesArray *rawhits, Int_t nexthit)
UInt_t threshold[NUMSLOTS][NADCCHAN]
virtual void FillADC_DynamicPedestal()
Int_t AccumulateStat(TClonesArray &tracks)
Double_t GetZPos(Int_t NLayer) const
virtual Int_t GetData(Int_t signal)
Double_t GetAdcTdcOffset()
Double_t GetPed() const
Gets sample pedestal. In channels.
VecExpr< UnaryOp< Sqrt< T >, SVector< T, D >, T >, T, D > sqrt(const SVector< T, D > &rhs)
ClassImp(THcShowerPlane) THcShowerPlane
virtual void FillADC_Standard()
THcRawAdcHit & GetRawAdcHitPos()
Int_t GetPulseAmpRaw(UInt_t iPulse=0) const
Gets raw pulse amplitude. In channels.
Double_t GetPulseAmp(UInt_t iPulse=0) const
Gets pedestal subtracted pulse amplitude. In channels.
Double_t GetPulseInt(UInt_t iPulse=0) const
Gets pedestal subtracted pulse integral. In channels.
char * Form(const char *fmt,...)
virtual void InitializePedestals()
void Warning(const char *location, const char *msgfmt,...)
virtual Int_t Decode(const THaEvData &)
Int_t GetPulseIntRaw(UInt_t iPulse=0) const
Gets raw pulse integral. In channels.
virtual void FillADC_SampIntDynPed()
virtual void CalculatePedestals()
Int_t LoadParmValues(const DBRequest *list, const char *prefix="")
Retrieve parameter values from the parameter cache.
UInt_t GetNPulses() const
Gets number of set pulses.
virtual void FillADC_SampleIntegral()
virtual Int_t CoarseProcess(TClonesArray &tracks)
Class representing a single raw hit for a shower paddle.
Generic segmented shower detector.
Int_t GetPedLimit(Int_t NBlock, Int_t NLayer, Int_t Side)
One plane of shower blocks with side readout.
virtual ~THcShowerPlane()
Int_t GetPedRaw() const
Gets raw signal pedestal. In channels.
Short_t Max(Short_t a, Short_t b)
virtual Int_t CoarseProcessHits()
Double_t GetPulseTime(UInt_t iPulse=0) const
R__EXTERN class THcParmList * gHcParms
THcRawAdcHit & GetRawAdcHitNeg()
TObject * At(Int_t idx) const
Int_t GetF250_NPedestalSamples()
void GetData(std::string s, double *x, double *y, double *ey)
Int_t GetNBlocks(Int_t NLayer) const
Double_t GetAdcTopC() const
Class representing a single raw ADC hit.
Double_t GetAdcTomV() const
Double_t GetXPos(Int_t NLayer, Int_t NRow) const
virtual void Clear(Option_t *opt="")
A standard Hall C spectrometer apparatus.