diff --git a/src/THcShower.cxx b/src/THcShower.cxx index bdaf6084e7ba152ccba87527dcb44f1dd9801509..fccca69fe4cf3a19cf790963ed78ecf017e5369a 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 9b39f4e69ebd6d6ea893a59fc8068f801129a0b1..a0e425ddd6c7b74a2d35ad001caf68a8b6dc9b67 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 b1817da04863c6fd43c08fc0015ef20ffca363f0..2f1170e26d62bfec508b3dee665c2c470dbe664f 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 f63d1d6a7654aa98e2aec9a5d49b665032d72cf4..229653f1adcfad1fb68255b7b8ed9aab5532b776 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 f82ae9b7016458440cf8ad96d4b95e184d71384a..e839139001f1b39cf22d519166c78760f04b10bb 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) {