From 92236b27196163b4ae2c345cd270b0f6b7562f76 Mon Sep 17 00:00:00 2001 From: kharlov Date: Fri, 10 Jul 2009 20:03:32 +0000 Subject: [PATCH] Memory leak in AliPHOSRawFitterv0 is fixed. --- PHOS/AliPHOSQADataMakerRec.cxx | 4 +- PHOS/AliPHOSRawDigiProducer.cxx | 5 +- PHOS/AliPHOSRawFitterv0.cxx | 40 +++----- PHOS/AliPHOSRawFitterv0.h | 10 +- PHOS/AliPHOSRawFitterv1.cxx | 162 ++++++++++++++++---------------- PHOS/AliPHOSRawFitterv1.h | 2 +- PHOS/AliPHOSRawFitterv2.cxx | 33 +++---- PHOS/AliPHOSRawFitterv2.h | 2 +- PHOS/PHOSGAINda.cxx | 7 +- PHOS/PHOSLEDda.cxx | 7 +- 10 files changed, 129 insertions(+), 143 deletions(-) diff --git a/PHOS/AliPHOSQADataMakerRec.cxx b/PHOS/AliPHOSQADataMakerRec.cxx index 54c821eff73..bc6dfd92503 100644 --- a/PHOS/AliPHOSQADataMakerRec.cxx +++ b/PHOS/AliPHOSQADataMakerRec.cxx @@ -416,11 +416,11 @@ void AliPHOSQADataMakerRec::MakeRaws(AliRawReader* rawReader) Int_t sigStart = fRawStream->GetStartTimeBin(); Int_t sigLength = fRawStream->GetBunchLength(); fitter->SetSamples(sig,sigStart,sigLength); + fitter->SetChannelGeo(module,cellX,cellZ,caloFlag); + fitter->Eval(sig,sigStart,sigLength); } // End of NextBunch() fitter->SetNBunches(nBunches); - fitter->SetChannelGeo(module,cellX,cellZ,caloFlag); - fitter->Eval(); Double_t energy = fitter->GetEnergy() ; Double_t time = fitter->GetTime() ; diff --git a/PHOS/AliPHOSRawDigiProducer.cxx b/PHOS/AliPHOSRawDigiProducer.cxx index 31a1d5c12c5..f94e2756587 100644 --- a/PHOS/AliPHOSRawDigiProducer.cxx +++ b/PHOS/AliPHOSRawDigiProducer.cxx @@ -175,12 +175,11 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0 const UShort_t *sig = fRawStream->GetSignals(); Int_t sigStart = fRawStream->GetStartTimeBin(); Int_t sigLength = fRawStream->GetBunchLength(); - fitter->SetSamples(sig,sigStart,sigLength); + fitter->SetChannelGeo(relId[0],relId[2],relId[3],caloFlag); + fitter->Eval(sig,sigStart,sigLength); } // End of NextBunch() fitter->SetNBunches(nBunches); - fitter->SetChannelGeo(relId[0],relId[2],relId[3],caloFlag); - fitter->Eval(); Double_t energy = fitter->GetEnergy() ; Double_t time = fitter->GetTime() ; diff --git a/PHOS/AliPHOSRawFitterv0.cxx b/PHOS/AliPHOSRawFitterv0.cxx index 07bf4c98c70..0afdd36d8c0 100644 --- a/PHOS/AliPHOSRawFitterv0.cxx +++ b/PHOS/AliPHOSRawFitterv0.cxx @@ -48,13 +48,10 @@ ClassImp(AliPHOSRawFitterv0) //----------------------------------------------------------------------------- AliPHOSRawFitterv0::AliPHOSRawFitterv0(): TObject(), - fSignal(0), fModule(0), fCellX(0), fCellZ(0), fCaloFlag(0), - fStart(0), - fLength(0), fNBunches(0), fPedSubtract(kFALSE), fEnergy(-111), @@ -73,19 +70,15 @@ AliPHOSRawFitterv0::AliPHOSRawFitterv0(): AliPHOSRawFitterv0::~AliPHOSRawFitterv0() { //Destructor - delete [] fSignal; } //----------------------------------------------------------------------------- AliPHOSRawFitterv0::AliPHOSRawFitterv0(const AliPHOSRawFitterv0 &phosFitter ): TObject(), - fSignal (phosFitter.fSignal), fModule (phosFitter.fModule), fCellX (phosFitter.fCellX), fCellZ (phosFitter.fCellZ), fCaloFlag (phosFitter.fCaloFlag), - fStart (phosFitter.fStart), - fLength (phosFitter.fLength), fNBunches (phosFitter.fNBunches), fPedSubtract (phosFitter.fPedSubtract), fEnergy (phosFitter.fEnergy), @@ -106,13 +99,10 @@ AliPHOSRawFitterv0& AliPHOSRawFitterv0::operator = (const AliPHOSRawFitterv0 &ph //Assignment operator. if(this != &phosFitter) { - fSignal = phosFitter.fSignal; fModule = phosFitter.fModule; fCellX = phosFitter.fCellX; fCellZ = phosFitter.fCellZ; fCaloFlag = phosFitter.fCaloFlag; - fStart = phosFitter.fStart; - fLength = phosFitter.fLength; fNBunches = phosFitter.fNBunches; fPedSubtract = phosFitter.fPedSubtract; fEnergy = phosFitter.fEnergy; @@ -134,12 +124,13 @@ void AliPHOSRawFitterv0::SetSamples(const UShort_t *sig, Int_t sigStart, Int_t s { // Set the sample array, its start and length in time bin units - fStart = sigStart; - fLength = sigLength; - fSignal = new UShort_t[fLength]; - for (Int_t i=0; i maxSample) maxSample = fSignal[i]; - if(fSignal[i] == maxSample) nMax++; + if(signal[i] > maxSample) maxSample = signal[i]; + if(signal[i] == maxSample) nMax++; if(fPedSubtract) { - if( (fSignal[i]-(Float_t)(pedMean/nPed)) >kBaseLine ) fTime = (Double_t)i; + if( (signal[i]-(Float_t)(pedMean/nPed)) >kBaseLine ) fTime = (Double_t)i; } else //ZS - if( (fSignal[i]-(Float_t)fAmpOffset) >kBaseLine ) fTime = (Double_t)i; + if( (signal[i]-(Float_t)fAmpOffset ) >kBaseLine ) fTime = (Double_t)i; } fEnergy = (Double_t)maxSample; diff --git a/PHOS/AliPHOSRawFitterv0.h b/PHOS/AliPHOSRawFitterv0.h index 631d1e73378..2f9317f8262 100644 --- a/PHOS/AliPHOSRawFitterv0.h +++ b/PHOS/AliPHOSRawFitterv0.h @@ -30,7 +30,7 @@ public: void SetChannelGeo(const Int_t module, const Int_t cellX, const Int_t cellZ, const Int_t caloFlag); - virtual Bool_t Eval(); + virtual Bool_t Eval(const UShort_t *signal, Int_t sigStart, Int_t sigLength); Double_t GetEnergy() const { return fEnergy; } Double_t GetTime() const { return fTime; } Double_t GetSignalQuality() const { return fQuality; } @@ -45,13 +45,13 @@ public: protected: - UShort_t *fSignal; // array of samples +// UShort_t *fSignal; // array of samples Int_t fModule; // PHOS module number Int_t fCellX; // cell number along X-axis Int_t fCellZ; // cell number along Z-axis Int_t fCaloFlag; // 0=LG, 1=HG, 2=TRU - Int_t fStart; // time bin of start signal - Int_t fLength; // signal length in time bins +// Int_t fStart; // time bin of start signal +// Int_t fLength; // signal length in time bins Int_t fNBunches; // number of bunches in a signal Bool_t fPedSubtract; // pedestals subtraction (kTRUE="yes") Double_t fEnergy; // "digit" energy @@ -63,7 +63,7 @@ protected: Bool_t fOverflow ; // kTRUE is the signal overflows AliPHOSCalibData * fCalibData ; //! Calibration database if avalable - ClassDef(AliPHOSRawFitterv0,1) + ClassDef(AliPHOSRawFitterv0,2) }; #endif diff --git a/PHOS/AliPHOSRawFitterv1.cxx b/PHOS/AliPHOSRawFitterv1.cxx index 7359f799284..d9b9679152a 100644 --- a/PHOS/AliPHOSRawFitterv1.cxx +++ b/PHOS/AliPHOSRawFitterv1.cxx @@ -125,7 +125,7 @@ AliPHOSRawFitterv1& AliPHOSRawFitterv1::operator = (const AliPHOSRawFitterv1 &ph } //----------------------------------------------------------------------------- -Bool_t AliPHOSRawFitterv1::Eval() +Bool_t AliPHOSRawFitterv1::Eval(const UShort_t *signal, Int_t sigStart, Int_t sigLength) { //Extract an energy deposited in the crystal, //crystal' position (module,column,row), @@ -134,7 +134,7 @@ Bool_t AliPHOSRawFitterv1::Eval() //reasonable shape, fits it with Gamma2 function and extracts //energy and time. - if (fNBunches > 1) { + if (fCaloFlag == 2 || fNBunches > 1) { fQuality = 1000; return kTRUE; } @@ -145,19 +145,18 @@ Bool_t AliPHOSRawFitterv1::Eval() const Float_t kBaseLine = 1.0; const Int_t kPreSamples = 10; - TArrayI *fSamples = new TArrayI(fLength); // array of samples - TArrayI *fTimes = new TArrayI(fLength); // array of times corresponding to samples - for (Int_t i=0; iAddAt(fSignal[i],i); - fTimes ->AddAt( i ,i); + fSamples->AddAt(signal[i],i); + fTimes ->AddAt( i ,i); } - Int_t iBin = fSamples->GetSize() ; fEnergy = -111; fQuality= 999. ; const Float_t sampleMaxHG=102.332 ; //maximal height of HG sample with given parameterization @@ -192,61 +191,64 @@ Bool_t AliPHOSRawFitterv1::Eval() if (fEnergy < kBaseLine) fEnergy = 0; //calculate time and energy - Int_t maxBin=0 ; - Int_t maxAmp=0 ; - Double_t aMean=0. ; - Double_t aRMS=0. ; - Double_t wts=0 ; - Int_t tStart = 0 ; - for(Int_t i=0; iGetSize(); i++){ - if(fSamples->At(i) > pedestal){ - Double_t de=fSamples->At(i)-pedestal ; - if(de>1.){ - aMean+=de*i ; - aRMS+=de*i*i ; - wts+=de; + Int_t maxBin=0 ; + Int_t maxAmp=0 ; + Double_t aMean =0. ; + Double_t aRMS =0. ; + Double_t wts =0 ; + Int_t tStart=0 ; + + for (Int_t i=0; i pedestal){ + Double_t de = signal[i] - pedestal ; + if(de > 1.) { + aMean += de*i ; + aRMS += de*i*i ; + wts += de; } - if(de>2 && tStart==0) - tStart=i ; - if(maxAmpAt(i)){ - maxBin=i ; - maxAmp=fSamples->At(i) ; + if(de > 2 && tStart==0) + tStart = i ; + if(maxAmp < signal[i]){ + maxBin = i ; + maxAmp = signal[i] ; } } } - if(maxBin==fSamples->GetSize()-1){//bad "rising" sample - fEnergy=0. ; - fTime=-999.; - fQuality= 999. ; + + if (maxBin==sigLength-1){//bad "rising" sample + fEnergy = 0. ; + fTime = -999. ; + fQuality= 999. ; return kTRUE ; } + fEnergy=Double_t(maxAmp)-pedestal ; fOverflow =0 ; //look for plato on the top of sample - if(fEnergy>500 && //this is not fluctuation of soft sample - maxBinGetSize()-1 && fSamples->At(maxBin+1)==maxAmp){ //and there is a plato + if (fEnergy>500 && //this is not fluctuation of soft sample + maxBinAt(maxBin+1)==maxAmp){ //and there is a plato fOverflow = kTRUE ; } - - if(wts>0){ - aMean/=wts; - aRMS=aRMS/wts-aMean*aMean; + + if (wts > 0) { + aMean /= wts; + aRMS = aRMS/wts - aMean*aMean; } //do not take too small energies - if(fEnergy < kBaseLine) + if (fEnergy < kBaseLine) fEnergy = 0; //do not test quality of too soft samples - if(fEnergyAt(tStart); - if(aRMS<2.) //sigle peak - fQuality=999. ; + if (fEnergy < maxEtoFit){ + fTime = tStart; + if (aRMS < 2.) //sigle peak + fQuality = 999. ; else - fQuality= 0. ; + fQuality = 0. ; return kTRUE ; } - //IF sample has reasonable mean and RMS, try to fit it with gamma2 + // if sample has reasonable mean and RMS, try to fit it with gamma2 gMinuit->mncler(); // Reset Minuit's list of paramters gMinuit->SetPrintLevel(-1) ; // No Printout @@ -255,25 +257,25 @@ Bool_t AliPHOSRawFitterv1::Eval() fToFit->Clear("nodelete") ; Double_t b=0,bmin=0,bmax=0 ; - if(fCaloFlag == 0){ // Low gain + if (fCaloFlag == 0){ // Low gain fSampleParamsLow->AddAt(pedestal,4) ; - if(fOverflow) + if (fOverflow) fSampleParamsLow->AddAt(double(maxAmp),5) ; else fSampleParamsLow->AddAt(double(1023),5) ; - fSampleParamsLow->AddAt(double(iBin),6) ; + fSampleParamsLow->AddAt(double(sigLength),6) ; fToFit->AddFirst((TObject*)fSampleParamsLow) ; b=fSampleParamsLow->At(2) ; bmin=0.5 ; bmax=10. ; } - else if(fCaloFlag == 1){ // High gain + else if (fCaloFlag == 1){ // High gain fSampleParamsHigh->AddAt(pedestal,4) ; - if(fOverflow) + if (fOverflow) fSampleParamsHigh->AddAt(double(maxAmp),5) ; else fSampleParamsHigh->AddAt(double(1023),5); - fSampleParamsHigh->AddAt(double(iBin),6); + fSampleParamsHigh->AddAt(double(sigLength),6); fToFit->AddFirst((TObject*)fSampleParamsHigh) ; b=fSampleParamsHigh->At(2) ; bmin=0.05 ; @@ -287,36 +289,35 @@ Bool_t AliPHOSRawFitterv1::Eval() gMinuit->mnparm(0, "t0", 1.*tStart, 0.01, -500., 500., ierflg) ; if(ierflg != 0){ // AliWarning(Form("Unable to set initial value for fit procedure : t0=%e\n",1.*tStart) ) ; - fEnergy=0. ; - fTime=-999. ; - fQuality=999 ; + fEnergy = 0. ; + fTime =-999. ; + fQuality= 999. ; return kTRUE ; //will scan further } Double_t amp0=0; - if(fCaloFlag == 0) // Low gain - amp0=fEnergy/sampleMaxLG; - else if(fCaloFlag == 1) // High gain - amp0=fEnergy/sampleMaxHG; + if (fCaloFlag == 0) // Low gain + amp0 = fEnergy/sampleMaxLG; + else if (fCaloFlag == 1) // High gain + amp0 = fEnergy/sampleMaxHG; gMinuit->mnparm(1, "Energy", amp0 , 0.01*amp0, 0, 0, ierflg) ; if(ierflg != 0){ // AliWarning(Form("Unable to set initial value for fit procedure : E=%e\n", amp0)) ; - fEnergy=0. ; - fTime=-999. ; - fQuality=999 ; + fEnergy = 0. ; + fTime =-999. ; + fQuality= 999. ; return kTRUE ; //will scan further } gMinuit->mnparm(2, "p2", b, 0.01*b, bmin, bmax, ierflg) ; if(ierflg != 0){ // AliWarning(Form("Unable to set initial value for fit procedure : E=%e\n", amp0)) ; - fEnergy=0. ; - fTime=-999. ; - fQuality=999 ; + fEnergy = 0. ; + fTime =-999. ; + fQuality= 999. ; return kTRUE ; //will scan further } - Double_t p0 = 0.0001 ; // "Tolerance" Evaluation stops when EDM = 0.0001*p0 ; The number of function call slightly // depends on it. Double_t p1 = 1.0 ; @@ -330,23 +331,23 @@ Bool_t AliPHOSRawFitterv1::Eval() Double_t err,t0err ; Double_t t0,efit ; - gMinuit->GetParameter(0,t0, t0err) ; - gMinuit->GetParameter(1,efit, err) ; + gMinuit->GetParameter(0,t0, t0err) ; + gMinuit->GetParameter(1,efit, err) ; Double_t bfit, berr ; gMinuit->GetParameter(2,bfit,berr) ; //Calculate total energy - //this isparameterization of depetendence of pulse height on parameter b + //this is parameterization of dependence of pulse height on parameter b if(fCaloFlag == 0) // Low gain - efit*=99.54910 + 78.65038*bfit ; + efit *= 99.54910 + 78.65038*bfit ; else if(fCaloFlag == 1) // High gain - efit*=80.33109+128.6433*bfit ; + efit *= 80.33109 + 128.6433*bfit ; - if(efit<0. || efit > 10000.){ + if(efit < 0. || efit > 10000.){ //set energy to previously found max - fTime=-999.; - fQuality=999 ; + fTime =-999.; + fQuality= 999 ; return kTRUE; } @@ -354,15 +355,16 @@ Bool_t AliPHOSRawFitterv1::Eval() Double_t fmin,fedm,errdef ; Int_t npari,nparx,istat; gMinuit->mnstat(fmin,fedm,errdef,npari,nparx,istat) ; - fQuality=fmin/(fSamples->GetSize()-iBin) ; + fQuality = fmin/sigLength ; //compare quality with some parameterization - if(fCaloFlag == 0) // Low gain - fQuality/=2.+0.002*fEnergy ; - else if(fCaloFlag == 1) // High gain - fQuality/=0.75+0.0025*fEnergy ; + if (fCaloFlag == 0) // Low gain + fQuality /= 2.00 + 0.0020*fEnergy ; + else if (fCaloFlag == 1) // High gain + fQuality /= 0.75 + 0.0025*fEnergy ; - fEnergy=efit ; - fTime=t0-4.024*bfit ; //-10.402*bfit+4.669*bfit*bfit ; //Correction for 70 samples + fEnergy = efit ; + fTime = t0 - 4.024*bfit ; //-10.402*bfit+4.669*bfit*bfit ; //Correction for 70 samples + fTime += sigStart; delete fSamples ; delete fTimes ; diff --git a/PHOS/AliPHOSRawFitterv1.h b/PHOS/AliPHOSRawFitterv1.h index f02e41d42f8..0b42a76ba64 100644 --- a/PHOS/AliPHOSRawFitterv1.h +++ b/PHOS/AliPHOSRawFitterv1.h @@ -22,7 +22,7 @@ public: AliPHOSRawFitterv1& operator = (const AliPHOSRawFitterv1& rawFitter); virtual ~AliPHOSRawFitterv1(); - virtual Bool_t Eval(); + virtual Bool_t Eval(const UShort_t *signal, Int_t sigStart, Int_t sigLength); static Double_t Gamma2(Double_t dt,Double_t en,Double_t b,TArrayD * fitparams) ; // Shape of correct sample //class member function (not object member function) diff --git a/PHOS/AliPHOSRawFitterv2.cxx b/PHOS/AliPHOSRawFitterv2.cxx index f38114c0783..098bd8cf3b8 100644 --- a/PHOS/AliPHOSRawFitterv2.cxx +++ b/PHOS/AliPHOSRawFitterv2.cxx @@ -100,7 +100,7 @@ AliPHOSRawFitterv2& AliPHOSRawFitterv2::operator = (const AliPHOSRawFitterv2 &ph } //----------------------------------------------------------------------------- -Bool_t AliPHOSRawFitterv2::Eval() +Bool_t AliPHOSRawFitterv2::Eval(const UShort_t *signal, Int_t sigStart, Int_t sigLength) { //Extract an energy deposited in the crystal, //crystal' position (module,column,row), @@ -131,15 +131,15 @@ Bool_t AliPHOSRawFitterv2::Eval() if(!h) h = new TH1D("hSample","",200,0.,200.) ; Double_t pedestal = 0; - for (Int_t i=0; i maxSample) maxSample = fSignal[i]; - if(fSignal[i] == maxSample) nMax++; - h->SetBinContent(i+1,fSignal[i]) ; + if(signal[i] > maxSample) maxSample = signal[i]; + if(signal[i] == maxSample) nMax++; + h->SetBinContent(i+1,signal[i]) ; } fEnergy = (Double_t)maxSample; if (maxSample > 900 && nMax > 2) fOverflow = kTRUE; @@ -193,14 +193,14 @@ Bool_t AliPHOSRawFitterv2::Eval() fQuality = 0. ; - for(Int_t i=1; i0.){ fTime/=tW ; fQuality = tRMS/tW-fTime*fTime ; + fTime+=sigStart; } else{ fTime=-999. ; @@ -221,8 +222,8 @@ Bool_t AliPHOSRawFitterv2::Eval() } Bool_t isBad = 0 ; - for(Int_t i=1; i fSignal[i-1]+5 && fSignal[i] > fSignal[i+1]+5) { //single jump + for(Int_t i=1; i signal[i-1]+5 && signal[i] > signal[i+1]+5) { //single jump isBad=1 ; } } @@ -232,8 +233,8 @@ Bool_t AliPHOSRawFitterv2::Eval() if(fPedestalRMS > 0.1) isBad=1 ; - for(Int_t i=1; i 1) continue; sigStart = stream.GetStartTimeBin(); sigLength = stream.GetBunchLength(); - fitter.SetSamples(stream.GetSignals(),sigStart,sigLength); + fitter.SetChannelGeo(stream.GetModule(),cellX,cellZ,caloFlag); + fitter.Eval(stream.GetSignals(),sigStart,sigLength); } // End of NextBunch() - fitter.SetNBunches(nBunches); - fitter.SetChannelGeo(stream.GetModule(),cellX,cellZ,caloFlag); - fitter.Eval(); - if (nBunches>1) continue; e[cellX][cellZ][caloFlag] = fitter.GetEnergy(); diff --git a/PHOS/PHOSLEDda.cxx b/PHOS/PHOSLEDda.cxx index e453d41151b..c96ce97454b 100644 --- a/PHOS/PHOSLEDda.cxx +++ b/PHOS/PHOSLEDda.cxx @@ -188,13 +188,10 @@ int main(int argc, char **argv) { if (nBunches > 1) continue; sigStart = stream.GetStartTimeBin(); sigLength = stream.GetBunchLength(); - fitter.SetSamples(stream.GetSignals(),sigStart,sigLength); + fitter.SetChannelGeo(stream.GetModule(),cellX,cellZ,caloFlag); + fitter.Eval(stream.GetSignals(),sigStart,sigLength); } // End of NextBunch() - fitter.SetNBunches(nBunches); - fitter.SetChannelGeo(stream.GetModule(),cellX,cellZ,caloFlag); - fitter.Eval(); - if(nBunches>1) continue; // if (nBunches>1 || caloFlag!=0 || caloFlag!=1 || fitter.GetSignalQuality()>1) continue; -- 2.43.0