From 465e93d1a421b7d1dce176377ef3703a1916981b Mon Sep 17 00:00:00 2001 From: hallc-online <hallconline@gmail.com> Date: Sat, 9 Dec 2017 00:28:06 -0500 Subject: [PATCH] Modify Aerogel, Cherenkov, ShowerArray and ShowerPlane Add variable for the difference between the Hodoscope start time and the ADC pulse time. Select good adc hit based on window on this difference --- src/THcAerogel.cxx | 25 +++++++++++++++++++++++-- src/THcAerogel.h | 4 ++++ src/THcCherenkov.cxx | 23 ++++++++++++++++++++--- src/THcCherenkov.h | 3 +++ src/THcShowerArray.cxx | 16 +++++++++++++++- src/THcShowerArray.h | 3 +++ src/THcShowerPlane.cxx | 25 ++++++++++++++++++++++--- src/THcShowerPlane.h | 5 +++++ 8 files changed, 95 insertions(+), 9 deletions(-) diff --git a/src/THcAerogel.cxx b/src/THcAerogel.cxx index 3fa912a..475873c 100644 --- a/src/THcAerogel.cxx +++ b/src/THcAerogel.cxx @@ -6,6 +6,7 @@ */ #include "THcAerogel.h" +#include "THcHodoscope.h" #include "TClonesArray.h" #include "THcSignalHit.h" #include "THaEvData.h" @@ -23,6 +24,7 @@ #include "TMath.h" #include "THaTrackProj.h" #include "THcRawAdcHit.h" +#include "THcHallCSpectrometer.h" #include <cstring> #include <cstdio> @@ -190,6 +192,13 @@ THaAnalysisObject::EStatus THcAerogel::Init( const TDatime& date ) EStatus status; if( (status = THaNonTrackingDetector::Init( date )) ) return fStatus=status; + + THcHallCSpectrometer *app=dynamic_cast<THcHallCSpectrometer*>(GetApparatus()); + if( !app || + !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) { + static const char* const here = "ReadDatabase()"; + Warning(Here(here),"Hodoscope \"%s\" not found. ","hod"); + } fPresentP = 0; THaVar* vpresent = gHaVars->Find(Form("%s.present",GetApparatus()->GetName())); @@ -274,11 +283,13 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date ) fGoodPosAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0); fGoodPosAdcPulseAmp = vector<Double_t> (fNelem, 0.0); fGoodPosAdcPulseTime = vector<Double_t> (fNelem, 0.0); + fGoodPosAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPed = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPulseInt = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPulseAmp = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPulseTime = vector<Double_t> (fNelem, 0.0); + fGoodNegAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0); // 6 GeV variables fPosTDCHits = new TClonesArray("THcSignalHit", fNelem*16); @@ -452,12 +463,14 @@ Int_t THcAerogel::DefineVariables( EMode mode ) {"goodPosAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodPosAdcPulseIntRaw"}, {"goodPosAdcPulseAmp", "Good Negative ADC pulse amplitudes", "fGoodPosAdcPulseAmp"}, {"goodPosAdcPulseTime", "Good Negative ADC pulse times", "fGoodPosAdcPulseTime"}, + {"goodPosAdcTdcDiffTime", "Good Positive hodo Start - ADC pulse times", "fGoodPosAdcTdcDiffTime"}, {"goodNegAdcPed", "Good Negative ADC pedestals", "fGoodNegAdcPed"}, {"goodNegAdcPulseInt", "Good Negative ADC pulse integrals", "fGoodNegAdcPulseInt"}, {"goodNegAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodNegAdcPulseIntRaw"}, {"goodNegAdcPulseAmp", "Good Negative ADC pulse amplitudes", "fGoodNegAdcPulseAmp"}, {"goodNegAdcPulseTime", "Good Negative ADC pulse times", "fGoodNegAdcPulseTime"}, + {"goodNegAdcTdcDiffTime", "Good Negative hodo Start - ADC pulse times", "fGoodNegAdcTdcDiffTime"}, { 0 } }; @@ -525,6 +538,7 @@ void THcAerogel::Clear(Option_t* opt) fGoodPosAdcPulseIntRaw.at(ielem) = 0.0; fGoodPosAdcPulseAmp.at(ielem) = 0.0; fGoodPosAdcPulseTime.at(ielem) = kBig; + fGoodPosAdcTdcDiffTime.at(ielem) = kBig; fPosNpe.at(ielem) = 0.0; } for (UInt_t ielem = 0; ielem < fGoodNegAdcPed.size(); ielem++) { @@ -533,6 +547,7 @@ void THcAerogel::Clear(Option_t* opt) fGoodNegAdcPulseIntRaw.at(ielem) = 0.0; fGoodNegAdcPulseAmp.at(ielem) = 0.0; fGoodNegAdcPulseTime.at(ielem) = kBig; + fGoodNegAdcTdcDiffTime.at(ielem) = kBig; fNegNpe.at(ielem) = 0.0; } @@ -657,6 +672,8 @@ Int_t THcAerogel::ApplyCorrections( void ) //_____________________________________________________________________________ Int_t THcAerogel::CoarseProcess( TClonesArray& ) //tracks { + Double_t StartTime = 0.0; + if( fglHod ) StartTime = fglHod->GetStartTime(); // Loop over the elements in the TClonesArray for(Int_t ielem = 0; ielem < frPosAdcPulseInt->GetEntries(); ielem++) { @@ -667,8 +684,9 @@ Int_t THcAerogel::CoarseProcess( TClonesArray& ) //tracks Double_t pulseIntRaw = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); Double_t pulseAmp = ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(ielem))->GetData(); Double_t pulseTime = ((THcSignalHit*) frPosAdcPulseTime->ConstructedAt(ielem))->GetData(); + Double_t adctdcdiffTime = StartTime-pulseTime; Bool_t errorFlag = ((THcSignalHit*) fPosAdcErrorFlag->ConstructedAt(ielem))->GetData(); - Bool_t pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax; + Bool_t pulseTimeCut = adctdcdiffTime > fAdcTimeWindowMin && adctdcdiffTime < fAdcTimeWindowMax; // By default, the last hit within the timing cut will be considered "good" if (!errorFlag && pulseTimeCut) { @@ -677,6 +695,7 @@ Int_t THcAerogel::CoarseProcess( TClonesArray& ) //tracks fGoodPosAdcPulseIntRaw.at(npmt) = pulseIntRaw; fGoodPosAdcPulseAmp.at(npmt) = pulseAmp; fGoodPosAdcPulseTime.at(npmt) = pulseTime; + fGoodPosAdcTdcDiffTime.at(npmt) = adctdcdiffTime; fPosNpe.at(npmt) = fPosGain[npmt]*fGoodPosAdcPulseInt.at(npmt); fPosNpeSum += fPosNpe.at(npmt); @@ -696,8 +715,9 @@ Int_t THcAerogel::CoarseProcess( TClonesArray& ) //tracks Double_t pulseIntRaw = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); Double_t pulseAmp = ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(ielem))->GetData(); Double_t pulseTime = ((THcSignalHit*) frNegAdcPulseTime->ConstructedAt(ielem))->GetData(); + Double_t adctdcdiffTime = StartTime-pulseTime; Bool_t errorFlag = ((THcSignalHit*) fNegAdcErrorFlag->ConstructedAt(ielem))->GetData(); - Bool_t pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax; + Bool_t pulseTimeCut = adctdcdiffTime > fAdcTimeWindowMin && adctdcdiffTime < fAdcTimeWindowMax; // By default, the last hit within the timing cut will be considered "good" if (!errorFlag && pulseTimeCut) { @@ -706,6 +726,7 @@ Int_t THcAerogel::CoarseProcess( TClonesArray& ) //tracks fGoodNegAdcPulseIntRaw.at(npmt) = pulseIntRaw; fGoodNegAdcPulseAmp.at(npmt) = pulseAmp; fGoodNegAdcPulseTime.at(npmt) = pulseTime; + fGoodNegAdcTdcDiffTime.at(npmt) = adctdcdiffTime; fNegNpe.at(npmt) = fNegGain[npmt]*fGoodNegAdcPulseInt.at(npmt); fNegNpeSum += fNegNpe.at(npmt); diff --git a/src/THcAerogel.h b/src/THcAerogel.h index 6fb8e40..b084123 100644 --- a/src/THcAerogel.h +++ b/src/THcAerogel.h @@ -11,6 +11,7 @@ #include "THaNonTrackingDetector.h" #include "THcHitList.h" #include "THcAerogelHit.h" +class THcHodoscope; class THcAerogel : public THaNonTrackingDetector, public THcHitList { @@ -113,11 +114,13 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList { vector<Double_t> fGoodPosAdcPulseIntRaw; vector<Double_t> fGoodPosAdcPulseAmp; vector<Double_t> fGoodPosAdcPulseTime; + vector<Double_t> fGoodPosAdcTdcDiffTime; vector<Double_t> fGoodNegAdcPed; vector<Double_t> fGoodNegAdcPulseInt; vector<Double_t> fGoodNegAdcPulseIntRaw; vector<Double_t> fGoodNegAdcPulseAmp; vector<Double_t> fGoodNegAdcPulseTime; + vector<Double_t> fGoodNegAdcTdcDiffTime; // 6 GeV era variables Int_t fAnalyzePedestals; @@ -166,6 +169,7 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList { void Setup(const char* name, const char* description); virtual void InitializePedestals( ); + THcHodoscope* fglHod; // Hodoscope to get start time ClassDef(THcAerogel,0) // Generic aerogel class } diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx index 27d081d..a8e4dc6 100644 --- a/src/THcCherenkov.cxx +++ b/src/THcCherenkov.cxx @@ -6,6 +6,7 @@ */ #include "THcCherenkov.h" +#include "THcHodoscope.h" #include "TClonesArray.h" #include "THcSignalHit.h" #include "THaEvData.h" @@ -22,6 +23,7 @@ #include "TClonesArray.h" #include "TMath.h" #include "THaTrackProj.h" +#include "THcHallCSpectrometer.h" #include <algorithm> #include <cstring> @@ -31,6 +33,7 @@ #include <string> #include <iomanip> + using namespace std; using std::cout; @@ -65,6 +68,7 @@ THcCherenkov::THcCherenkov( const char* name, const char* description, fGoodAdcPulseIntRaw = vector<Double_t> (MaxNumCerPmt, 0.0); fGoodAdcPulseAmp = vector<Double_t> (MaxNumCerPmt, 0.0); fGoodAdcPulseTime = vector<Double_t> (MaxNumCerPmt, 0.0); + fGoodAdcTdcDiffTime = vector<Double_t> (MaxNumCerPmt, 0.0); InitArrays(); } @@ -152,6 +156,13 @@ THaAnalysisObject::EStatus THcCherenkov::Init( const TDatime& date ) if((status = THaNonTrackingDetector::Init( date ))) return fStatus=status; + THcHallCSpectrometer *app=dynamic_cast<THcHallCSpectrometer*>(GetApparatus()); + if( !app || + !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) { + static const char* const here = "ReadDatabase()"; + Warning(Here(here),"Hodoscope \"%s\" not found. ","hod"); + } + fPresentP = 0; THaVar* vpresent = gHaVars->Find(Form("%s.present",GetApparatus()->GetName())); if(vpresent) { @@ -290,7 +301,8 @@ Int_t THcCherenkov::DefineVariables( EMode mode ) {"goodAdcPulseIntRaw", "Good ADC raw pulse integrals", "fGoodAdcPulseIntRaw"}, {"goodAdcPulseAmp", "Good ADC pulse amplitudes", "fGoodAdcPulseAmp"}, {"goodAdcPulseTime", "Good ADC pulse times", "fGoodAdcPulseTime"}, - { 0 } + {"goodAdcTdcDiffTime", "Good Hodo Start - ADC pulse times", "fGoodAdcTdcDiffTime"}, + { 0 } }; return DefineVarsFromList(vars, mode); @@ -336,6 +348,7 @@ void THcCherenkov::Clear(Option_t* opt) fGoodAdcPulseIntRaw.at(ielem) = 0.0; fGoodAdcPulseAmp.at(ielem) = 0.0; fGoodAdcPulseTime.at(ielem) = kBig; + fGoodAdcTdcDiffTime.at(ielem) = kBig; fNpe.at(ielem) = 0.0; } @@ -406,6 +419,8 @@ Int_t THcCherenkov::ApplyCorrections( void ) //_____________________________________________________________________________ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) { + Double_t StartTime = 0.0; + if( fglHod ) StartTime = fglHod->GetStartTime(); // Loop over the elements in the TClonesArray for(Int_t ielem = 0; ielem < frAdcPulseInt->GetEntries(); ielem++) { @@ -416,8 +431,9 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) Double_t pulseIntRaw = ((THcSignalHit*) frAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); Double_t pulseAmp = ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(ielem))->GetData(); Double_t pulseTime = ((THcSignalHit*) frAdcPulseTime->ConstructedAt(ielem))->GetData(); - Bool_t errorFlag = ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(ielem))->GetData(); - Bool_t pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax; + Double_t adctdcdiffTime = StartTime-pulseTime; + Bool_t errorFlag = ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Bool_t pulseTimeCut = adctdcdiffTime > fAdcTimeWindowMin && adctdcdiffTime < fAdcTimeWindowMax; // By default, the last hit within the timing cut will be considered "good" if (!errorFlag && pulseTimeCut) { @@ -426,6 +442,7 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) fGoodAdcPulseIntRaw.at(npmt) = pulseIntRaw; fGoodAdcPulseAmp.at(npmt) = pulseAmp; fGoodAdcPulseTime.at(npmt) = pulseTime; + fGoodAdcTdcDiffTime.at(npmt) = adctdcdiffTime; fNpe.at(npmt) = fGain[npmt]*fGoodAdcPulseInt.at(npmt); fNpeSum += fNpe.at(npmt); diff --git a/src/THcCherenkov.h b/src/THcCherenkov.h index 0c83a6c..3ea8c93 100644 --- a/src/THcCherenkov.h +++ b/src/THcCherenkov.h @@ -11,6 +11,7 @@ #include "THaNonTrackingDetector.h" #include "THcHitList.h" #include "THcCherenkovHit.h" +class THcHodoscope; class THcCherenkov : public THaNonTrackingDetector, public THcHitList { @@ -65,6 +66,7 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList { vector<Double_t> fGoodAdcPulseIntRaw; vector<Double_t> fGoodAdcPulseAmp; vector<Double_t> fGoodAdcPulseTime; + vector<Double_t> fGoodAdcTdcDiffTime; vector<Double_t> fNpe; Int_t fNRegions; @@ -110,6 +112,7 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList { void Setup(const char* name, const char* description); virtual void InitializePedestals( ); + THcHodoscope* fglHod; // Hodoscope to get start time ClassDef(THcCherenkov,0) // Generic cherenkov class }; diff --git a/src/THcShowerArray.cxx b/src/THcShowerArray.cxx index aca7f40..80a69bc 100644 --- a/src/THcShowerArray.cxx +++ b/src/THcShowerArray.cxx @@ -6,6 +6,7 @@ */ #include "THcShowerArray.h" +#include "THcHodoscope.h" #include "TClonesArray.h" #include "THcSignalHit.h" #include "THcGlobals.h" @@ -107,6 +108,12 @@ THaAnalysisObject::EStatus THcShowerArray::Init( const TDatime& date ) // How to get information for parent // if( GetParent() ) // fOrigin = GetParent()->GetOrigin(); + THcHallCSpectrometer *app=dynamic_cast<THcHallCSpectrometer*>(GetApparatus()); + if( !app || + !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) { + static const char* const here = "ReadDatabase()"; + Warning(Here(here),"Hodoscope \"%s\" not found. ","hod"); + } EStatus status; if( (status=THaSubDetector::Init( date )) ) @@ -346,6 +353,7 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date ) fGoodAdcPulseInt = vector<Double_t> (fNelem, 0.0); fGoodAdcPulseAmp = vector<Double_t> (fNelem, 0.0); fGoodAdcPulseTime = vector<Double_t> (fNelem, 0.0); + fGoodAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0); fBlock_ClusterID = new Int_t[fNelem]; @@ -431,6 +439,7 @@ Int_t THcShowerArray::DefineVariables( EMode mode ) {"goodAdcPulseInt", "Good ADC Pulse Integrals", "fGoodAdcPulseInt"}, //this is defined as pulseInt, which is the pedestal subtracted pulse integrals, and is defined if threshold is passed {"goodAdcPulseAmp", "Good ADC Pulse Amplitudes", "fGoodAdcPulseAmp"}, {"goodAdcPulseTime", "Good ADC Pulse Times", "fGoodAdcPulseTime"}, //this is defined as pulseInt, which is the pedestal subtracted pulse integrals, and is defined if threshold is passed + {"goodAdcTdcDiffTime", "Good Hodo Starttime - ADC Pulse Times", "fGoodAdcTdcDiffTime"}, {"e", "Energy Depositions per block", "fE"}, //defined as fE = fA_p*fGain = pulseInt * Gain @@ -484,6 +493,7 @@ void THcShowerArray::Clear( Option_t* ) fGoodAdcPulseInt.at(ielem) = 0.0; fGoodAdcPulseAmp.at(ielem) = 0.0; fGoodAdcPulseTime.at(ielem) = kBig; + fGoodAdcTdcDiffTime.at(ielem) = kBig; fNumGoodAdcHits.at(ielem) = 0.0; fE.at(ielem) = 0.0; } @@ -849,6 +859,8 @@ void THcShowerArray::FillADC_Standard() //_____________________________________________________________________________ void THcShowerArray::FillADC_DynamicPedestal() { + Double_t StartTime = 0.0; + if( fglHod ) StartTime = fglHod->GetStartTime(); for (Int_t ielem=0;ielem<frAdcPulseInt->GetEntries();ielem++) { Int_t npad = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1; @@ -857,8 +869,9 @@ void THcShowerArray::FillADC_DynamicPedestal() Double_t pulseInt = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetData(); Double_t pulseAmp = ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(ielem))->GetData(); Double_t pulseTime = ((THcSignalHit*) frAdcPulseTime->ConstructedAt(ielem))->GetData(); + Double_t adctdcdiffTime = StartTime-pulseTime; Bool_t errorflag = ((THcSignalHit*) frAdcErrorFlag->ConstructedAt(ielem))->GetData(); - Bool_t pulseTimeCut = (pulseTime > fAdcTimeWindowMin) && (pulseTime < fAdcTimeWindowMax); + Bool_t pulseTimeCut = (adctdcdiffTime > fAdcTimeWindowMin) && (adctdcdiffTime < fAdcTimeWindowMax); if (!errorflag && pulseTimeCut) { @@ -874,6 +887,7 @@ void THcShowerArray::FillADC_DynamicPedestal() fGoodAdcPed.at(npad) = pulsePed; fGoodAdcPulseAmp.at(npad) = pulseAmp; fGoodAdcPulseTime.at(npad) = pulseTime; + fGoodAdcTdcDiffTime.at(npad) = adctdcdiffTime; fNumGoodAdcHits.at(npad) = npad + 1; } diff --git a/src/THcShowerArray.h b/src/THcShowerArray.h index 8c7033d..40edca4 100644 --- a/src/THcShowerArray.h +++ b/src/THcShowerArray.h @@ -27,6 +27,7 @@ class THaEvData; class THaSignalHit; +class THcHodoscope; class THcShowerArray : public THaSubDetector { @@ -113,6 +114,7 @@ protected: vector<Double_t> fGoodAdcPulseInt; // [fNelem] good pedestal subtracted pulse integrals vector<Double_t> fGoodAdcPulseAmp; vector<Double_t> fGoodAdcPulseTime; + vector<Double_t> fGoodAdcTdcDiffTime; vector<Double_t> fE; //[fNelem] energy deposition in shower blocks @@ -208,6 +210,7 @@ protected: virtual Int_t ReadDatabase( const TDatime& date ); virtual Int_t DefineVariables( EMode mode = kDefine ); + THcHodoscope* fglHod; // Hodoscope to get start time ClassDef(THcShowerArray,0); // Fly;s Eye calorimeter array }; diff --git a/src/THcShowerPlane.cxx b/src/THcShowerPlane.cxx index be73ef5..6f75b54 100644 --- a/src/THcShowerPlane.cxx +++ b/src/THcShowerPlane.cxx @@ -6,6 +6,7 @@ One plane of shower blocks with side readout */ #include "THcShowerPlane.h" +#include "THcHodoscope.h" #include "TClonesArray.h" #include "THcSignalHit.h" #include "THcGlobals.h" @@ -152,6 +153,12 @@ THaAnalysisObject::EStatus THcShowerPlane::Init( const TDatime& date ) cout << "****** THcShowerPlane::Accumulate will be skipped ******" << endl; } + if( !app || + !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector("hod"))) ) { + static const char* const here = "ReadDatabase()"; + Warning(Here(here),"Hodoscope \"%s\" not found. ","hod"); + } + EStatus status; if( (status=THaSubDetector::Init( date )) ) return fStatus = status; @@ -253,11 +260,13 @@ Int_t THcShowerPlane::ReadDatabase( const TDatime& date ) fGoodPosAdcPulseInt = vector<Double_t> (fNelem, 0.0); fGoodPosAdcPulseAmp = vector<Double_t> (fNelem, 0.0); fGoodPosAdcPulseTime = vector<Double_t> (fNelem, 0.0); + fGoodPosAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPed = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPulseInt = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPulseAmp = vector<Double_t> (fNelem, 0.0); fGoodNegAdcPulseTime = vector<Double_t> (fNelem, 0.0); + fGoodNegAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0); // Energy depositions per block (not corrected for track coordinate) @@ -375,11 +384,13 @@ Int_t THcShowerPlane::DefineVariables( EMode mode ) {"goodPosAdcPulseInt", "Good Positive ADC integrals", "fGoodPosAdcPulseInt"}, {"goodPosAdcPulseAmp", "Good Positive ADC amplitudes", "fGoodPosAdcPulseAmp"}, {"goodPosAdcPulseTime","Good Positive ADC times", "fGoodPosAdcPulseTime"}, + {"goodPosAdcTdcDiffTime","Good Positive Hodo Start time-ADC times", "fGoodPosAdcTdcDiffTime"}, {"goodNegAdcPed", "Good Negative ADC pedestals", "fGoodNegAdcPed"}, {"goodNegAdcPulseInt", "Good Negative ADC integrals", "fGoodNegAdcPulseInt"}, {"goodNegAdcPulseAmp", "Good Negative ADC amplitudes", "fGoodNegAdcPulseAmp"}, {"goodNegAdcPulseTime","Good Negative ADC times", "fGoodNegAdcPulseTime"}, + {"goodNegAdcTdcDiffTime","Good Negative Hodo Start time-ADC times", "fGoodNegAdcTdcDiffTime"}, {"epos", "Energy Depositions from Positive Side PMTs", "fEpos"}, {"eneg", "Energy Depositions from Negative Side PMTs", "fEneg"}, @@ -431,6 +442,7 @@ void THcShowerPlane::Clear( Option_t* ) fGoodPosAdcPulseInt.at(ielem) = 0.0; fGoodPosAdcPulseAmp.at(ielem) = 0.0; fGoodPosAdcPulseTime.at(ielem) = kBig; + fGoodPosAdcTdcDiffTime.at(ielem) = kBig; fEpos.at(ielem) = 0.0; fNumGoodPosAdcHits.at(ielem) = 0.0; } @@ -441,6 +453,7 @@ void THcShowerPlane::Clear( Option_t* ) fGoodNegAdcPulseInt.at(ielem) = 0.0; fGoodNegAdcPulseAmp.at(ielem) = 0.0; fGoodNegAdcPulseTime.at(ielem) = kBig; + fGoodNegAdcTdcDiffTime.at(ielem) = kBig; fEneg.at(ielem) = 0.0; fNumGoodNegAdcHits.at(ielem) = 0.0; } @@ -723,6 +736,8 @@ void THcShowerPlane::FillADC_Standard() //_____________________________________________________________________________ void THcShowerPlane::FillADC_DynamicPedestal() { + Double_t StartTime = 0.0; + if( fglHod ) StartTime = fglHod->GetStartTime(); Double_t AdcTimeWindowMin=static_cast<THcShower*>(fParent)->GetAdcTimeWindowMin(); Double_t AdcTimeWindowMax=static_cast<THcShower*>(fParent)->GetAdcTimeWindowMax(); for (Int_t ielem=0;ielem<frNegAdcPulseInt->GetEntries();ielem++) { @@ -732,9 +747,10 @@ void THcShowerPlane::FillADC_DynamicPedestal() Double_t pulseAmp = ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(ielem))->GetData(); Double_t pulseIntRaw = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); Double_t pulseTime = ((THcSignalHit*) frNegAdcPulseTime->ConstructedAt(ielem))->GetData(); + Double_t adctdcdiffTime = StartTime-pulseTime; Double_t threshold = ((THcSignalHit*) frNegAdcThreshold->ConstructedAt(ielem))->GetData(); Bool_t errorflag = ((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(ielem))->GetData(); - Bool_t pulseTimeCut = (pulseTime > AdcTimeWindowMin) && (pulseTime < AdcTimeWindowMax); + Bool_t pulseTimeCut = (adctdcdiffTime > AdcTimeWindowMin) && (adctdcdiffTime < AdcTimeWindowMax); if (!errorflag && pulseTimeCut) { fGoodNegAdcPulseIntRaw.at(npad) =pulseIntRaw; @@ -747,6 +763,7 @@ void THcShowerPlane::FillADC_DynamicPedestal() fGoodNegAdcPed.at(npad) = pulsePed; fGoodNegAdcPulseAmp.at(npad) = pulseAmp; fGoodNegAdcPulseTime.at(npad) = pulseTime; + fGoodNegAdcTdcDiffTime.at(npad) = adctdcdiffTime; fTotNumGoodAdcHits++; fTotNumGoodNegAdcHits++; @@ -765,8 +782,9 @@ void THcShowerPlane::FillADC_DynamicPedestal() Double_t pulseInt = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetData(); Double_t pulseIntRaw = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); Double_t pulseTime = ((THcSignalHit*) frPosAdcPulseTime->ConstructedAt(ielem))->GetData(); - Bool_t errorflag = ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(ielem))->GetData(); - Bool_t pulseTimeCut = (pulseTime > AdcTimeWindowMin) && (pulseTime < AdcTimeWindowMax); + Double_t adctdcdiffTime = StartTime-pulseTime; + Bool_t errorflag = ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Bool_t pulseTimeCut = (adctdcdiffTime > AdcTimeWindowMin) && (adctdcdiffTime < AdcTimeWindowMax); if (!errorflag && pulseTimeCut) { fGoodPosAdcPulseIntRaw.at(npad) = pulseIntRaw; @@ -780,6 +798,7 @@ void THcShowerPlane::FillADC_DynamicPedestal() fGoodPosAdcPed.at(npad) = pulsePed; fGoodPosAdcPulseAmp.at(npad) = pulseAmp; fGoodPosAdcPulseTime.at(npad) = pulseTime; + fGoodPosAdcTdcDiffTime.at(npad) = adctdcdiffTime; fTotNumGoodAdcHits++; fTotNumGoodPosAdcHits++; diff --git a/src/THcShowerPlane.h b/src/THcShowerPlane.h index ef68eca..29a06e6 100644 --- a/src/THcShowerPlane.h +++ b/src/THcShowerPlane.h @@ -24,6 +24,7 @@ using namespace std; class THaEvData; class THaSignalHit; +class THcHodoscope; class THcShowerPlane : public THaSubDetector { @@ -153,11 +154,13 @@ protected: vector<Double_t> fGoodPosAdcPulseInt; vector<Double_t> fGoodPosAdcPulseAmp; vector<Double_t> fGoodPosAdcPulseTime; + vector<Double_t> fGoodPosAdcTdcDiffTime; vector<Double_t> fGoodNegAdcPed; vector<Double_t> fGoodNegAdcPulseInt; vector<Double_t> fGoodNegAdcPulseAmp; vector<Double_t> fGoodNegAdcPulseTime; + vector<Double_t> fGoodNegAdcTdcDiffTime; vector<Double_t> fGoodPosAdcPulseIntRaw; vector<Double_t> fGoodNegAdcPulseIntRaw; @@ -237,6 +240,8 @@ protected: vector<Int_t> fStatNumHit; Int_t fTotStatNumTrk; Int_t fTotStatNumHit; + + THcHodoscope* fglHod; // Hodoscope to get start time ClassDef(THcShowerPlane,0); // Calorimeter bars in a plane }; -- GitLab