From 30be04cc303cae1e17621fab64c3e21bf7253cbb Mon Sep 17 00:00:00 2001 From: Mark Jones <jones@jlab.org> Date: Mon, 27 Apr 2020 07:56:23 -0400 Subject: [PATCH] Modified THcShower, THcShowerArray and THcShowerPlane 1) Add parameter fPedDefault which can be used as the pedestal. When the raw pulse amplitude = 0, this means that there was a pulse in the ADC time window where the pedestal is determined. This makes the pedestal wrong. so use the fPedDefault which is the average pedestal. 2) Use hodoscope OffsetTime in calculation of the difference between the Hodoscope StartTime and the ADC pulse time to compensate for difference between ADC reference time and the TDC reference time. --- src/THcShower.cxx | 10 ++++++++ src/THcShower.h | 15 +++++++++++- src/THcShowerArray.cxx | 33 +++++++++++++++++++------ src/THcShowerArray.h | 1 + src/THcShowerPlane.cxx | 55 +++++++++++++++++++++++++++--------------- 5 files changed, 87 insertions(+), 27 deletions(-) diff --git a/src/THcShower.cxx b/src/THcShower.cxx index bdaf608..fccca69 100644 --- a/src/THcShower.cxx +++ b/src/THcShower.cxx @@ -36,6 +36,7 @@ THcShower::THcShower( const char* name, const char* description, THaNonTrackingDetector(name,description,apparatus), fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0), fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0), + fPedPosDefault(0),fPedNegDefault(0), fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0), fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0), fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0) @@ -53,6 +54,7 @@ THcShower::THcShower( ) : THaNonTrackingDetector(), fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0), fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0), + fPedPosDefault(0),fPedNegDefault(0), fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0), fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0), fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0) @@ -388,6 +390,8 @@ Int_t THcShower::ReadDatabase( const TDatime& date ) fNegAdcTimeWindowMin = new Double_t [fNTotBlocks]; fPosAdcTimeWindowMax = new Double_t [fNTotBlocks]; fNegAdcTimeWindowMax = new Double_t [fNTotBlocks]; + fPedPosDefault = new Int_t [fNTotBlocks]; + fPedNegDefault = new Int_t [fNTotBlocks]; DBRequest list[]={ {"cal_pos_cal_const", hcal_pos_cal_const, kDouble, fNTotBlocks}, @@ -400,6 +404,8 @@ Int_t THcShower::ReadDatabase( const TDatime& date ) {"cal_neg_AdcTimeWindowMin", fNegAdcTimeWindowMin, kDouble, static_cast<UInt_t>(fNTotBlocks),1}, {"cal_pos_AdcTimeWindowMax", fPosAdcTimeWindowMax, kDouble, static_cast<UInt_t>(fNTotBlocks),1}, {"cal_neg_AdcTimeWindowMax", fNegAdcTimeWindowMax, kDouble, static_cast<UInt_t>(fNTotBlocks),1}, + {"cal_PedNegDefault", fPedNegDefault, kInt, static_cast<UInt_t>(fNTotBlocks),1}, + {"cal_PedPosDefault", fPedNegDefault, kInt, static_cast<UInt_t>(fNTotBlocks),1}, {"cal_min_peds", &fShMinPeds, kInt,0,1}, {0} }; @@ -410,6 +416,8 @@ Int_t THcShower::ReadDatabase( const TDatime& date ) fNegAdcTimeWindowMin[ip] = -1000.; fPosAdcTimeWindowMax[ip] = 1000.; fNegAdcTimeWindowMax[ip] = 1000.; + fPedNegDefault[ip] = 0; + fPedPosDefault[ip] = 0; } gHcParms->LoadParmValues((DBRequest*)&list, prefix); @@ -617,6 +625,8 @@ void THcShower::DeleteArrays() delete [] fNegAdcTimeWindowMin; fNegAdcTimeWindowMin = 0; delete [] fPosAdcTimeWindowMax; fPosAdcTimeWindowMax = 0; delete [] fNegAdcTimeWindowMax; fNegAdcTimeWindowMax = 0; + delete [] fPedNegDefault; fPedNegDefault = 0; + delete [] fPedPosDefault; fPedPosDefault = 0; delete [] fShPosPedLimit; fShPosPedLimit = 0; delete [] fShNegPedLimit; fShNegPedLimit = 0; delete [] fPosGain; fPosGain = 0; diff --git a/src/THcShower.h b/src/THcShower.h index 9b39f4e..a0e425d 100644 --- a/src/THcShower.h +++ b/src/THcShower.h @@ -71,6 +71,17 @@ public: return ( Side == 0 ? fPosGain[nelem] : fNegGain[nelem]); } + Double_t GetPedDefault(Int_t NBlock, Int_t NLayer, Int_t Side) { + if (Side!=0&&Side!=1) { + cout << "*** Wrong Side in GetPedDefault:" << Side << " ***" << endl; + return -1; + } + Int_t nelem = 0; + for (Int_t i=0; i<NLayer; i++) nelem += fNBlocks[i]; + nelem += NBlock; + return ( Side == 0 ? fPedPosDefault[nelem] : fPedNegDefault[nelem] ); + } + Double_t GetWindowMin(Int_t NBlock, Int_t NLayer, Int_t Side) { if (Side!=0&&Side!=1) { cout << "*** Wrong Side in GetWindowMin:" << Side << " ***" << endl; @@ -187,7 +198,9 @@ protected: Double_t* fNegAdcTimeWindowMin; Double_t* fPosAdcTimeWindowMax; Double_t* fNegAdcTimeWindowMax; - Double_t fAdcTdcOffset; + Int_t* fPedPosDefault; + Int_t* fPedNegDefault; + Double_t fAdcTdcOffset; Int_t fAnalyzePedestals; // Flag for pedestal analysis. diff --git a/src/THcShowerArray.cxx b/src/THcShowerArray.cxx index b1817da..2f1170e 100644 --- a/src/THcShowerArray.cxx +++ b/src/THcShowerArray.cxx @@ -105,6 +105,7 @@ THcShowerArray::~THcShowerArray() delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = 0; delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = 0; + delete [] fPedDefault; fPedDefault = 0; } //_____________________________________________________________________________ @@ -280,6 +281,7 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date ) fAdcTimeWindowMin = new Double_t [fNelem]; fAdcTimeWindowMax = new Double_t [fNelem]; + fPedDefault = new Int_t [fNelem]; DBRequest list1[]={ {"cal_arr_ped_limit", fPedLimit, kInt, static_cast<UInt_t>(fNelem),1}, @@ -287,12 +289,14 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date ) {"cal_arr_gain_cor", cal_arr_gain_cor, kDouble, static_cast<UInt_t>(fNelem)}, {"cal_arr_AdcTimeWindowMin", fAdcTimeWindowMin, kDouble, static_cast<UInt_t>(fNelem),1}, {"cal_arr_AdcTimeWindowMax", fAdcTimeWindowMax, kDouble, static_cast<UInt_t>(fNelem),1}, + {"cal_arr_PedDefault", fPedDefault, kInt, static_cast<UInt_t>(fNelem),1}, {0} }; for(Int_t ip=0;ip<fNelem;ip++) { fAdcTimeWindowMin[ip] = -1000.; fAdcTimeWindowMax[ip] = 1000.; + fPedDefault[ip] = 0; } gHcParms->LoadParmValues((DBRequest*)&list1, prefix); @@ -873,6 +877,8 @@ void THcShowerArray::FillADC_DynamicPedestal() { Double_t StartTime = 0.0; if( fglHod ) StartTime = fglHod->GetStartTime(); + Double_t OffsetTime = 0.0; + if( fglHod ) OffsetTime = fglHod->GetOffsetTime(); for (Int_t ielem=0;ielem<frAdcPulseInt->GetEntries();ielem++) { Int_t npad = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1; @@ -881,15 +887,10 @@ 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(); + Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime; Bool_t pulseTimeCut = (adctdcdiffTime > fAdcTimeWindowMin[npad]) && (adctdcdiffTime < fAdcTimeWindowMax[npad]); - - if (!errorflag) - { fGoodAdcMult.at(npad) += 1; - } - if (!errorflag && pulseTimeCut) { + if (pulseTimeCut) { fTotNumAdcHits++; fGoodAdcPulseIntRaw.at(npad) = pulseIntRaw; @@ -982,6 +983,24 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit) } else { ((THcSignalHit*) frAdcErrorFlag->ConstructedAt(nrAdcHits))->Set(padnum,1); } + + if (rawAdcHit.GetPulseAmpRaw(thit) <= 0) { + Double_t PeakPedRatio= rawAdcHit.GetF250_PeakPedestalRatio(); + Int_t NPedSamples= rawAdcHit.GetF250_NPedestalSamples(); + Double_t AdcToC = rawAdcHit.GetAdcTopC(); + Double_t AdcToV = rawAdcHit.GetAdcTomV(); + if (fPedDefault[padnum-1] !=0) { + Double_t tPulseInt = AdcToC*(rawAdcHit.GetPulseIntRaw(thit) - fPedDefault[padnum-1]*PeakPedRatio); + ((THcSignalHit*) frAdcPulseInt->ConstructedAt(nrAdcHits))->Set(padnum, tPulseInt); + ((THcSignalHit*) frAdcPedRaw->ConstructedAt(nrAdcHits))->Set(padnum, fPedDefault[padnum-1]); + ((THcSignalHit*) frAdcPed->ConstructedAt(nrAdcHits))->Set(padnum, float(fPedDefault[padnum-1])/float(NPedSamples)*AdcToV); + + } + ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(nrAdcHits))->Set(padnum, 0.); + + } + + ++nrAdcHits; } ihit++; diff --git a/src/THcShowerArray.h b/src/THcShowerArray.h index f63d1d6..229653f 100644 --- a/src/THcShowerArray.h +++ b/src/THcShowerArray.h @@ -148,6 +148,7 @@ protected: static const Int_t kADCSampIntDynPed=3; Double_t *fAdcTimeWindowMin ; Double_t *fAdcTimeWindowMax ; + Int_t *fPedDefault ; Double_t fAdcThreshold ; Double_t fAdcTdcOffset; diff --git a/src/THcShowerPlane.cxx b/src/THcShowerPlane.cxx index f82ae9b..e839139 100644 --- a/src/THcShowerPlane.cxx +++ b/src/THcShowerPlane.cxx @@ -612,6 +612,21 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) } else { ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(padnum,1); } + if (rawPosAdcHit.GetPulseAmpRaw(thit) <= 0) { + Double_t PeakPedRatio= rawPosAdcHit.GetF250_PeakPedestalRatio(); + Int_t NPedSamples= rawPosAdcHit.GetF250_NPedestalSamples(); + Double_t AdcToC = rawPosAdcHit.GetAdcTopC(); + Double_t AdcToV = rawPosAdcHit.GetAdcTomV(); + Int_t PedDefaultTemp = static_cast<THcShower*>(fParent)->GetPedDefault(padnum-1,fLayerNum-1,0); + if (PedDefaultTemp !=0) { + Double_t tPulseInt = AdcToC*(rawPosAdcHit.GetPulseIntRaw(thit) - PedDefaultTemp*PeakPedRatio); + ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(nrPosAdcHits))->Set(padnum, tPulseInt); + ((THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, PedDefaultTemp); + ((THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(padnum, float(PedDefaultTemp)/float(NPedSamples)*AdcToV); + + } + ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(nrPosAdcHits))->Set(padnum, 0.); + } ++nrPosAdcHits; fTotNumAdcHits++; fTotNumPosAdcHits++; @@ -637,6 +652,21 @@ Int_t THcShowerPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) } else { ((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(padnum,1); } + if (rawNegAdcHit.GetPulseAmpRaw(thit) <= 0) { + Double_t PeakPedRatio= rawNegAdcHit.GetF250_PeakPedestalRatio(); + Int_t NPedSamples= rawNegAdcHit.GetF250_NPedestalSamples(); + Double_t AdcToC = rawNegAdcHit.GetAdcTopC(); + Double_t AdcToV = rawNegAdcHit.GetAdcTomV(); + Int_t PedDefaultTemp = static_cast<THcShower*>(fParent)->GetPedDefault(padnum-1,fLayerNum-1,1); + if (PedDefaultTemp !=0) { + Double_t tPulseInt = AdcToC*(rawNegAdcHit.GetPulseIntRaw(thit) - PedDefaultTemp*PeakPedRatio); + ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(nrNegAdcHits))->Set(padnum, tPulseInt); + ((THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, PedDefaultTemp); + ((THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(padnum, float(PedDefaultTemp)/float(NPedSamples)*AdcToV); + + } + ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits))->Set(padnum, 0.); + } ++nrNegAdcHits; fTotNumAdcHits++; fTotNumNegAdcHits++; @@ -744,6 +774,8 @@ void THcShowerPlane::FillADC_DynamicPedestal() { Double_t StartTime = 0.0; if( fglHod ) StartTime = fglHod->GetStartTime(); + Double_t OffsetTime = 0.0; + if( fglHod ) OffsetTime = fglHod->GetOffsetTime(); for (Int_t ielem=0;ielem<frNegAdcPulseInt->GetEntries();ielem++) { Int_t npad = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1; Double_t pulseInt = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetData(); @@ -751,18 +783,11 @@ 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 adctdcdiffTime = StartTime-pulseTime+OffsetTime; Double_t threshold = ((THcSignalHit*) frNegAdcThreshold->ConstructedAt(ielem))->GetData(); - Bool_t errorflag = ((THcSignalHit*) frNegAdcErrorFlag->ConstructedAt(ielem))->GetData(); Bool_t pulseTimeCut = (adctdcdiffTime > static_cast<THcShower*>(fParent)->GetWindowMin(npad,fLayerNum-1,1)) && (adctdcdiffTime < static_cast<THcShower*>(fParent)->GetWindowMax(npad,fLayerNum-1,1) ); - - - - if (!errorflag) - { fGoodNegAdcMult.at(npad) += 1; - } - if (!errorflag && pulseTimeCut) { + if (pulseTimeCut) { fGoodNegAdcPulseIntRaw.at(npad) =pulseIntRaw; if(fGoodNegAdcPulseIntRaw.at(npad) > threshold && fGoodNegAdcPulseInt.at(npad)==0) { @@ -793,18 +818,10 @@ 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(); - Double_t adctdcdiffTime = StartTime-pulseTime; - Bool_t errorflag = ((THcSignalHit*) frPosAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime; Bool_t pulseTimeCut = (adctdcdiffTime > static_cast<THcShower*>(fParent)->GetWindowMin(npad,fLayerNum-1,0)) && (adctdcdiffTime < static_cast<THcShower*>(fParent)->GetWindowMax(npad,fLayerNum-1,0) ); - - - - if (!errorflag) - { fGoodPosAdcMult.at(npad) += 1; - } - - if (!errorflag && pulseTimeCut) { + if (pulseTimeCut) { fGoodPosAdcPulseIntRaw.at(npad) = pulseIntRaw; if(fGoodPosAdcPulseIntRaw.at(npad) > threshold && fGoodPosAdcPulseInt.at(npad)==0) { -- GitLab