diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx index b03eddaaafe54b4743d2feb8fa8cbfa39995ff27..4dacafa7ae7b736a79db2a666db0e824b1c9cdeb 100644 --- a/src/THcCherenkov.cxx +++ b/src/THcCherenkov.cxx @@ -136,6 +136,7 @@ void THcCherenkov::DeleteArrays() delete [] fPed; fPed = NULL; delete [] fThresh; fThresh = NULL; + delete [] fPedDefault; fPedDefault = 0; delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = 0; delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = 0; delete [] fRegionValue; fRegionValue = 0; @@ -212,6 +213,7 @@ Int_t THcCherenkov::ReadDatabase( const TDatime& date ) fPedMean = new Double_t[fNelem]; fAdcTimeWindowMin = new Double_t[fNelem]; fAdcTimeWindowMax= new Double_t[fNelem]; + fPedDefault= new Int_t[fNelem]; // Region parameters fRegionsValueMax = fNRegions * 8; fRegionValue = new Double_t[fRegionsValueMax]; @@ -234,6 +236,7 @@ Int_t THcCherenkov::ReadDatabase( const TDatime& date ) {"_debug_adc", &fDebugAdc, kInt, 0, 1}, {"_adcTimeWindowMin", fAdcTimeWindowMin, kDouble,(UInt_t) fNelem,1}, {"_adcTimeWindowMax", fAdcTimeWindowMax, kDouble, (UInt_t) fNelem,1}, + {"_PedDefault", fPedDefault, kInt, (UInt_t) fNelem,1}, {"_adc_tdc_offset", &fAdcTdcOffset, kDouble, 0, 1}, {"_region", &fRegionValue[0], kDouble, (UInt_t) fRegionsValueMax}, {"_adcrefcut", &fADC_RefTimeCut, kInt, 0, 1}, @@ -242,6 +245,7 @@ Int_t THcCherenkov::ReadDatabase( const TDatime& date ) for (Int_t i=0;i<fNelem;i++) { fAdcTimeWindowMin[i]=-1000.; fAdcTimeWindowMax[i]=1000.; + fPedDefault[i]=0; } fDebugAdc = 0; // Set ADC debug parameter to false unless set in parameter file fAdcTdcOffset = 0.0; @@ -321,7 +325,8 @@ Int_t THcCherenkov::DefineVariables( EMode mode ) {"goodAdcPulseAmp", "Good ADC pulse amplitudes", "fGoodAdcPulseAmp"}, {"goodAdcPulseTime", "Good ADC pulse times", "fGoodAdcPulseTime"}, {"goodAdcTdcDiffTime", "Good Hodo Start - ADC pulse times", "fGoodAdcTdcDiffTime"}, - { 0 } + {"RefTime", "Raw ADC RefTime (chan) ", "fRefTime"}, // Raw reference time + { 0 } }; return DefineVarsFromList(vars, mode); @@ -341,6 +346,7 @@ void THcCherenkov::Clear(Option_t* opt) fYAtCer = 0.0; fNpeSum = 0.0; + fRefTime=kBig; frAdcPedRaw->Clear(); frAdcPulseIntRaw->Clear(); @@ -385,6 +391,9 @@ Int_t THcCherenkov::Decode( const THaEvData& evdata ) } fNhits = DecodeToHitList(evdata, !present); + //THcHallCSpectrometer *app = dynamic_cast<THcHallCSpectrometer*>(GetApparatus()); + // cout << "Cerenkov Event num = " << evdata.GetEvNum() << " spec = " << app->GetName() << endl; + if(gHaCuts->Result("Pedestal_event")) { AccumulatePedestals(fRawHitList); fAnalyzePedestals = 1; // Analyze pedestals first normal events @@ -400,11 +409,14 @@ Int_t THcCherenkov::Decode( const THaEvData& evdata ) UInt_t nrAdcHits = 0; while(ihit < fNhits) { - + THcCherenkovHit* hit = (THcCherenkovHit*) fRawHitList->At(ihit); Int_t npmt = hit->fCounter; THcRawAdcHit& rawAdcHit = hit->GetRawAdcHitPos(); - + if (rawAdcHit.GetNPulses() >0 && rawAdcHit.HasRefTime()) { + fRefTime=rawAdcHit.GetRefTime() ; + } + //if (rawAdcHit.GetNPulses()>0) cout << "Cer npmt = " << " ped = " << rawAdcHit.GetPed() << endl; for (UInt_t thit = 0; thit < rawAdcHit.GetNPulses(); thit++) { ((THcSignalHit*) frAdcPedRaw->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPedRaw()); @@ -422,6 +434,23 @@ Int_t THcCherenkov::Decode( const THaEvData& evdata ) if (rawAdcHit.GetPulseAmpRaw(thit) > 0) ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(nrAdcHits))->Set(npmt, 0); if (rawAdcHit.GetPulseAmpRaw(thit) <= 0) ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(nrAdcHits))->Set(npmt, 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[npmt-1] !=0) { + Double_t tPulseInt = AdcToC*(rawAdcHit.GetPulseIntRaw(thit) - fPedDefault[npmt-1]*PeakPedRatio); + ((THcSignalHit*) frAdcPulseInt->ConstructedAt(nrAdcHits))->Set(npmt, tPulseInt); + ((THcSignalHit*) frAdcPedRaw->ConstructedAt(nrAdcHits))->Set(npmt, fPedDefault[npmt-1]); + ((THcSignalHit*) frAdcPed->ConstructedAt(nrAdcHits))->Set(npmt, float(fPedDefault[npmt-1])/float(NPedSamples)*AdcToV); + + } + ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(nrAdcHits))->Set(npmt, 0.); + + } + + ++nrAdcHits; fTotNumAdcHits++; fNumAdcHits.at(npmt-1) = npmt; @@ -442,7 +471,9 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) { Double_t StartTime = 0.0; if( fglHod ) StartTime = fglHod->GetStartTime(); - for(Int_t ipmt = 0; ipmt < fNelem; ipmt++) { + Double_t OffsetTime = 0.0; + // if( fglHod ) OffsetTime = fglHod->GetOffsetTime(); + for(Int_t ipmt = 0; ipmt < fNelem; ipmt++) { fAdcPulseAmpTest[ipmt] = -1000.; fAdcGoodElem[ipmt]=-1; } @@ -451,17 +482,18 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) Int_t npmt = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1; Double_t pulseTime = ((THcSignalHit*) frAdcPulseTime->ConstructedAt(ielem))->GetData(); Double_t pulseAmp = ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(ielem))->GetData(); - Double_t adctdcdiffTime = StartTime-pulseTime; - Bool_t errorFlag = ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Bool_t errorFlag = ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Double_t adctdcdiffTime = StartTime-pulseTime-OffsetTime; Bool_t pulseTimeCut = adctdcdiffTime > fAdcTimeWindowMin[npmt] && adctdcdiffTime < fAdcTimeWindowMax[npmt]; - if (!errorFlag) - { - fGoodAdcMult.at(npmt) += 1; - } - if (!errorFlag && pulseTimeCut && pulseAmp > fAdcPulseAmpTest[npmt]) { - fAdcGoodElem[npmt]=ielem; - fAdcPulseAmpTest[npmt] = pulseAmp; - } + fGoodAdcMult.at(npmt) += 1; + if (!errorFlag) { + if (pulseTimeCut && pulseAmp > fAdcPulseAmpTest[npmt]) { + fAdcGoodElem[npmt]=ielem; + fAdcPulseAmpTest[npmt] = pulseAmp; + } + } else { + if (pulseTimeCut) fAdcGoodElem[npmt]=ielem; + } } // Loop over the npmt for(Int_t npmt = 0; npmt < fNelem; npmt++) { @@ -472,8 +504,7 @@ 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(); - Double_t adctdcdiffTime = StartTime-pulseTime; - // By default, the last hit within the timing cut will be considered "good" + Double_t adctdcdiffTime = StartTime-pulseTime-OffsetTime; fGoodAdcPed.at(npmt) = pulsePed; fGoodAdcHitUsed.at(npmt) = ielem+1; fGoodAdcPulseInt.at(npmt) = pulseInt; @@ -481,8 +512,8 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) fGoodAdcPulseAmp.at(npmt) = pulseAmp; fGoodAdcPulseTime.at(npmt) = pulseTime; fGoodAdcTdcDiffTime.at(npmt) = adctdcdiffTime; - - fNpe.at(npmt) = fGain[npmt]*fGoodAdcPulseInt.at(npmt); + + fNpe.at(npmt) = fGain[npmt]*pulseInt; fNpeSum += fNpe.at(npmt); fTotNumGoodAdcHits++; diff --git a/src/THcCherenkov.h b/src/THcCherenkov.h index 2edaf496825025a15cf428be520190dc96c12d2b..63136fdb13ee892337ab45f7f2e24cd4c322402d 100644 --- a/src/THcCherenkov.h +++ b/src/THcCherenkov.h @@ -58,6 +58,7 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList { Int_t fTotNumGoodAdcHits; Int_t fTotNumTracksMatched; Int_t fTotNumTracksFired; + Double_t fRefTime; Double_t fNpeSum; Double_t* fGain; @@ -91,6 +92,7 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList { Double_t fNpeThresh; Double_t* fAdcTimeWindowMin; Double_t* fAdcTimeWindowMax; + Int_t* fPedDefault; Double_t fAdcTdcOffset; Double_t* fRegionValue;