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() ;
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() ;
//-----------------------------------------------------------------------------
AliPHOSRawFitterv0::AliPHOSRawFitterv0():
TObject(),
- fSignal(0),
fModule(0),
fCellX(0),
fCellZ(0),
fCaloFlag(0),
- fStart(0),
- fLength(0),
fNBunches(0),
fPedSubtract(kFALSE),
fEnergy(-111),
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),
//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;
{
// 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<fLength; i++) {
- fSignal[i] = sig[i];
- }
+// fStart = sigStart;
+// fLength = sigLength;
+// fSignal = sig;
+// fSignal = new UShort_t[fLength];
+// for (Int_t i=0; i<fLength; i++) {
+// fSignal[i] = sig[i];
+// }
}
//-----------------------------------------------------------------------------
}
//-----------------------------------------------------------------------------
-Bool_t AliPHOSRawFitterv0::Eval()
+Bool_t AliPHOSRawFitterv0::Eval(const UShort_t *signal, Int_t sigStart, Int_t sigLength)
{
// Calculate signal parameters (energy, time, quality) from array of samples
// Energy is a maximum sample minus pedestal 9
UShort_t maxSample = 0;
Int_t nMax = 0;
- for (Int_t i=0; i<fLength; i++) {
+ for (Int_t i=0; i<sigLength; i++) {
if (i<kPreSamples) {
nPed++;
- pedMean += fSignal[i];
- pedRMS += fSignal[i]*fSignal[i] ;
+ pedMean += signal[i];
+ pedRMS += signal[i]*signal[i] ;
}
-
- if(fSignal[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;
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; }
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
Bool_t fOverflow ; // kTRUE is the signal overflows
AliPHOSCalibData * fCalibData ; //! Calibration database if avalable
- ClassDef(AliPHOSRawFitterv0,1)
+ ClassDef(AliPHOSRawFitterv0,2)
};
#endif
}
//-----------------------------------------------------------------------------
-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),
//reasonable shape, fits it with Gamma2 function and extracts
//energy and time.
- if (fNBunches > 1) {
+ if (fCaloFlag == 2 || fNBunches > 1) {
fQuality = 1000;
return kTRUE;
}
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; i<fLength; i++) {
+ TArrayI *fSamples = new TArrayI(sigLength); // array of sample amplitudes
+ TArrayI *fTimes = new TArrayI(sigLength); // array of sample time stamps
+ for (Int_t i=0; i<sigLength; i++) {
if (i<kPreSamples) {
nPed++;
- pedMean += fSignal[i];
- pedRMS += fSignal[i]*fSignal[i] ;
+ pedMean += signal[i];
+ pedRMS += signal[i]*signal[i] ;
}
- fSamples->AddAt(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
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; i<fSamples->GetSize(); 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<sigLength; i++){
+ if(signal[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(maxAmp<fSamples->At(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
- maxBin<fSamples->GetSize()-1 && fSamples->At(maxBin+1)==maxAmp){ //and there is a plato
+ if (fEnergy>500 && //this is not fluctuation of soft sample
+ maxBin<sigLength-1 && fSamples->At(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(fEnergy<maxEtoFit){
- fTime=fTimes->At(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
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 ;
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 ;
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;
}
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 ;
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)
}
//-----------------------------------------------------------------------------
-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),
if(!h) h = new TH1D("hSample","",200,0.,200.) ;
Double_t pedestal = 0;
- for (Int_t i=0; i<fLength; i++) {
+ for (Int_t i=0; i<sigLength; i++) {
if (i<kPreSamples) {
nPed++;
- pedMean += fSignal[i];
- pedRMS += fSignal[i]*fSignal[i] ;
+ pedMean += signal[i];
+ pedRMS += signal[i]*signal[i] ;
}
- if(fSignal[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;
fQuality = 0. ;
- for(Int_t i=1; i<fLength && cnts<fNtimeSamples; i++){
- if(fSignal[i] < pedestal)
+ for(Int_t i=1; i<sigLength && cnts<fNtimeSamples; i++){
+ if(signal[i] < pedestal)
continue ;
- Double_t de = fSignal[i] - pedestal ;
- Double_t av = fSignal[i-1] - pedestal + de;
+ Double_t de = signal[i] - pedestal ;
+ Double_t av = signal[i-1] - pedestal + de;
if(av<=0.) //this is fluctuation around pedestal, skip it
continue ;
- Double_t ds = fSignal[i] - fSignal[i-1] ;
+ Double_t ds = signal[i] - signal[i-1] ;
Double_t ti = ds/av ; // calculate log. derivative
ti = a/(ti+b)-c*ti ; // and compare with parameterization
ti = i - ti ;
if(tW>0.){
fTime/=tW ;
fQuality = tRMS/tW-fTime*fTime ;
+ fTime+=sigStart;
}
else{
fTime=-999. ;
}
Bool_t isBad = 0 ;
- for(Int_t i=1; i<fLength-1&&!isBad; i++){
- if(fSignal[i] > fSignal[i-1]+5 && fSignal[i] > fSignal[i+1]+5) { //single jump
+ for(Int_t i=1; i<sigLength-1&&!isBad; i++){
+ if(signal[i] > signal[i-1]+5 && signal[i] > signal[i+1]+5) { //single jump
isBad=1 ;
}
}
if(fPedestalRMS > 0.1)
isBad=1 ;
- for(Int_t i=1; i<fLength-1&&!isBad; i++){
- if(fSignal[i] < pedestal-1)
+ for(Int_t i=1; i<sigLength-1&&!isBad; i++){
+ if(signal[i] < pedestal-1)
isBad=1 ;
}
AliPHOSRawFitterv2& operator = (const AliPHOSRawFitterv2& rawFitter);
virtual ~AliPHOSRawFitterv2();
- virtual Bool_t Eval();
+ virtual Bool_t Eval(const UShort_t *signal, Int_t sigStart, Int_t sigLength);
void SetNTimeSamples(Short_t n=25) { fNtimeSamples=n ;}
void SetLowGainTParams (Double_t *pars){ for(Int_t i=0;i<3;i++) fLGpar[i]=pars[i] ;}
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;
e[cellX][cellZ][caloFlag] = fitter.GetEnergy();
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;