// Create a shaper pulse object
AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
+
+ //Set Time step of sample
+ pulse->SetTimeStep(TMath::Abs(fgCalibData->GetSampleTimeStep())) ;
Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()];
Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()];
pulse->SetHG2LGRatio(r) ;
pulse->MakeSamples();
pulse->GetSamples(adcValuesHigh, adcValuesLow) ;
+
buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 0,
pulse->GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 1,
fCalibDataEmc->SetTimeShiftEmc(module,column,row,value);
}
//________________________________________________________________
+Float_t AliPHOSCalibData::GetSampleTimeStep() const
+{
+ //Get conversion coeff. from sample time step to seconds.
+ //Negative value means that it is not used in reconstruction
+ //but only in simulation of raw.
+ if(fCalibDataEmc)
+ return fCalibDataEmc->GetSampleTimeStep();
+ else
+ return 0.0; // default width of one EMC ADC channel in GeV
+}
+//________________________________________________________________
+void AliPHOSCalibData::SetSampleTimeStep(Float_t step)
+{
+ //Set conversion coeff. from sample time step to seconds.
+ //Negative value means that it is not used in reconstruction
+ //but only in simulation of raw.
+ if(!fCalibDataEmc)
+ fCalibDataEmc = new AliPHOSEmcCalibData("PHOS-EMC");
+
+ fCalibDataEmc->SetSampleTimeStep(step) ;
+}
+//________________________________________________________________
Int_t AliPHOSCalibData::GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const
{
// Return ALTRO pedestal coefficient
}
}
}
-
//________________________________________________________________
Bool_t AliPHOSCalibData::IsBadChannelEmc(Int_t module, Int_t col, Int_t row) const
{
else
return 0;
}
-
//________________________________________________________________
void AliPHOSCalibData::EmcBadChannelIds(Int_t *badIds)
{
Int_t GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const;
void SetAltroOffsetEmc(Int_t module, Int_t column, Int_t row, Int_t value) ;
+ Float_t GetSampleTimeStep() const ;
+ void SetSampleTimeStep(Float_t step) ;
+
//----Now CPV parameters-----------
Float_t GetADCchannelCpv(Int_t module, Int_t column, Int_t row) const;
void SetADCchannelCpv(Int_t module, Int_t column, Int_t row, Float_t value);
fW0 = recoParam->GetEMCLogWeight();
fW0CPV = recoParam->GetCPVLogWeight();
- fEmcTimeGate = 1.e-6 ;
+ fEmcTimeGate = 1.e-6 ; //10 sample steps
fEcoreRadius = recoParam->GetEMCEcoreRadius();
fToUnfold = recoParam->EMCToUnfold() ;
fEMCRecPoints->AddAt(new AliPHOSEmcRecPoint(""), fNumberOfEmcClusters) ;
clu = static_cast<AliPHOSEmcRecPoint *>( fEMCRecPoints->At(fNumberOfEmcClusters) ) ;
fNumberOfEmcClusters++ ;
- clu->AddDigit(*digit, Calibrate(digit->GetEnergy(),digit->GetId())) ;
+ clu->AddDigit(*digit, Calibrate(digit->GetEnergy(),digit->GetId()),CalibrateT(digit->GetTime(),digit->GetId())) ;
clusterdigitslist[iDigitInCluster] = digit->GetIndexInList() ;
iDigitInCluster++ ;
fDigitsUsed[i]=kTRUE ;
fCPVRecPoints->AddAt(new AliPHOSCpvRecPoint(""), fNumberOfCpvClusters) ;
clu = static_cast<AliPHOSCpvRecPoint *>( fCPVRecPoints->At(fNumberOfCpvClusters) ) ;
fNumberOfCpvClusters++ ;
- clu->AddDigit(*digit, Calibrate(digit->GetEnergy(),digit->GetId())) ;
+ clu->AddDigit(*digit, Calibrate(digit->GetEnergy(),digit->GetId()),0.) ; // no timing information in CPV
clusterdigitslist[iDigitInCluster] = digit->GetIndexInList() ;
iDigitInCluster++ ;
fDigitsUsed[i]=kTRUE ;
case 0 : // not a neighbour
break ;
case 1 : // are neighbours
- clu->AddDigit(*digitN, Calibrate(digitN->GetEnergy(),digit->GetId())) ;
+ clu->AddDigit(*digitN, Calibrate(digitN->GetEnergy(),digit->GetId()),CalibrateT(digitN->GetTime(),digit->GetId())) ;
clusterdigitslist[iDigitInCluster] = j ;
iDigitInCluster++ ;
fDigitsUsed[j]=kTRUE ;
// ratio = epar * ShowerShape(xDigit - xpar,zDigit - zpar,vIncid) / efit[iDigit] ;
ratio = epar * ShowerShape(xDigit - xpar,zDigit - zpar) / efit[iDigit] ;
eDigit = emcEnergies[iDigit] * ratio ;
- emcRP->AddDigit( *digit, eDigit ) ;
+ emcRP->AddDigit( *digit, eDigit,CalibrateT(digit->GetTime(),digit->GetId()) ) ;
}
}
}
//==================================================================================
-Float_t AliPHOSClusterizerv1::Calibrate(Float_t amp, Int_t absId){
+Float_t AliPHOSClusterizerv1::Calibrate(Float_t amp, Int_t absId) const{
// Calibrate EMC digit, i.e. multiply its Amp by a factor read from CDB
const AliPHOSGeometry *geom = AliPHOSGeometry::GetInstance() ;
return amp*calibration ;
}
}
+//==================================================================================
+Float_t AliPHOSClusterizerv1::CalibrateT(Float_t time, Int_t absId)const{
+ // Calibrate time in EMC digit
+
+ const AliPHOSGeometry *geom = AliPHOSGeometry::GetInstance() ;
+
+ //Determine rel.position of the cell absolute ID
+ Int_t relId[4];
+ geom->AbsToRelNumbering(absId,relId);
+ Int_t module=relId[0];
+ Int_t row =relId[2];
+ Int_t column=relId[3];
+ if(relId[1]){ //CPV
+ return 0. ;
+ }
+ else{ //EMC
+ time += fgCalibData->GetTimeShiftEmc(module,column,row);
+ return time ;
+ }
+}
+
virtual Bool_t IsInCpv (AliPHOSDigit * digit)const ; // Tells if id digit is in CPV
void CleanDigits(TClonesArray * digits) ;
void SetDistancesToBadChannels();
- virtual Float_t Calibrate(Float_t amp, Int_t absId) ; // Tranforms ADC counts to energy
+ virtual Float_t Calibrate(Float_t amp, Int_t absId) const ; // Tranforms ADC counts to energy
+ virtual Float_t CalibrateT(Float_t amp, Int_t absId) const ; //Tranforms Sample counts to sec.
private:
AliPHOSClusterizerv1(const AliPHOSClusterizerv1 & clu) ;
curSDigit = dynamic_cast<AliPHOSDigit*>(dynamic_cast<TClonesArray *>(sdigArray->At(i))->At(index[i])) ;
if(AliPHOSSimParam::GetInstance()->IsStreamDigits(i)){ //This is Digits Stream
curSDigit->SetEnergy(Calibrate(curSDigit->GetEnergy(),curSDigit->GetId())) ;
+ curSDigit->SetTime(CalibrateT(curSDigit->GetTime(),curSDigit->GetId())) ;
}
}
else
digits->RemoveAt(i) ;
continue ;
}
+
+ digit->SetEnergy(TMath::Ceil(digit->GetEnergy())-0.9999) ;
+
Float_t tres = TimeResolution(digit->GetEnergy()) ;
digit->SetTime(gRandom->Gaus(digit->GetTime(), tres) ) ;
}
Float_t calibration = fcdb->GetADCchannelEmc(module,column,row);
Float_t energy = digit->GetEnergy()/calibration;
digit->SetEnergy(energy); //Now digit measures E in ADC counts
+ Float_t time = digit->GetTime() ;
+ time-=fcdb->GetTimeShiftEmc(module,column,row);
+ digit->SetTime(time) ;
}
}
//____________________________________________________________________________
+Float_t AliPHOSDigitizer::CalibrateT(Float_t time,Int_t absId){
+ //Apply time calibration
+ const AliPHOSGeometry *geom = AliPHOSGeometry::GetInstance() ;
+
+ //Determine rel.position of the cell absolute ID
+ Int_t relId[4];
+ geom->AbsToRelNumbering(absId,relId);
+ Int_t module=relId[0];
+ Int_t row =relId[2];
+ Int_t column=relId[3];
+ time += fcdb->GetTimeShiftEmc(module,column,row);
+ return time ;
+}
+//____________________________________________________________________________
Int_t AliPHOSDigitizer::DigitizeCPV(Float_t charge, Int_t absId)
{
// Returns digitized value of the CPV charge in a pad absId
// Float_t FrontEdgeTime(TClonesArray * ticks) const ;
//Calculate digitized signal with gived ADC parameters
Float_t Calibrate(Float_t amp, Int_t absId) ;
+ Float_t CalibrateT(Float_t time, Int_t absId) ;
void Decalibrate(AliPHOSDigit * digit);
Int_t DigitizeCPV(Float_t charge, Int_t absId) ;
}
}
}
-
+ fSampleTimeStep=100.e-9 ; //100 ns
}
//________________________________________________________________
return fTimeShiftEmc[module-1][column-1][row-1];
}
//________________________________________________________________
+Float_t AliPHOSEmcCalibData::GetSampleTimeStep()const
+{
+ //Returns conversion coefficient from ALTRO smaple time step and secods
+ //Negative value not used in reconstruction (conversion taken from TRU trailer)
+ //and only in raw simulation
+ return fSampleTimeStep ;
+}
+//________________________________________________________________
Int_t AliPHOSEmcCalibData::GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const
{
//Return EMC altro offsets
//module 1:5, column 1:56, row 1:64
fAltroOffsets[module-1][column-1][row-1] = value;
}
+//________________________________________________________________
+void AliPHOSEmcCalibData::SetSampleTimeStep(Float_t step)
+{
+ //Sets conversion coefficient from ALTRO smaple time step and secods
+ //Negative value not used in reconstruction (conversion taken from TRU trailer)
+ //and only in raw simulation
+ fSampleTimeStep = step ;
+}
+
Float_t GetHighLowRatioEmc(Int_t module, Int_t column, Int_t row) const;
Float_t GetTimeShiftEmc(Int_t module, Int_t column, Int_t row) const;
Int_t GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const;
+ Float_t GetSampleTimeStep() const ;
//
void SetADCchannelEmc(Int_t module, Int_t column, Int_t row, Float_t value);
void SetADCpedestalEmc(Int_t module, Int_t column, Int_t row, Float_t value);
void SetHighLowRatioEmc(Int_t module, Int_t column, Int_t row, Float_t value);
void SetTimeShiftEmc(Int_t module, Int_t column, Int_t row, Float_t value);
void SetAltroOffsetEmc(Int_t module, Int_t column, Int_t row, Int_t value);
+ void SetSampleTimeStep(Float_t step) ;
protected:
+ Float_t fSampleTimeStep ; // Conversion between ALTRO sample time step and seconds
Float_t fADCchannelEmc[5][56][64] ; // width of one EMC ADC channel in GeV ([mod][col][row])
Float_t fADCpedestalEmc[5][56][64] ; // value of the EMC ADC pedestal ([mod][col][row])
Float_t fHighLowRatioEmc[5][56][64]; // ratio of High/Low gain ([mod][col][row])
Float_t fTimeShiftEmc[5][56][64] ; // channel-by-channel t0 shift ([mod][col][row])
UInt_t fAltroOffsets[5][56][64] ; // channel-by-channel offsets udes in ZS
//
- ClassDef(AliPHOSEmcCalibData,3) // PHOS EMC calibration data
+ ClassDef(AliPHOSEmcCalibData,4) // PHOS EMC calibration data
};
#endif
}
//____________________________________________________________________________
-void AliPHOSEmcRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy)
+void AliPHOSEmcRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy, Float_t time)
{
// Adds a digit to the RecPoint
// and accumulates the total amplitude and the multiplicity
delete [] tempoE ;
} // if
+ //time
+ Bool_t isMax=kTRUE ;
+ for(Int_t index = 0 ; index < fMulDigit ; index++ ){
+ if(fEnergyList[index]>Energy){
+ isMax=kFALSE ;
+ break ;
+ }
+ }
+ if(isMax){
+ fTime=time ;
+ }
+ //Alternative time calculation - still to be validated
+ // fTime = (fTime*fAmp + time*Energy)/(fAmp+Energy) ;
+
fDigitsList[fMulDigit] = digit.GetIndexInList() ;
fEnergyList[fMulDigit] = Energy ;
fMulDigit++ ;
fAmp += Energy ;
-
EvalPHOSMod(&digit) ;
}
return iDigitN ;
}
//____________________________________________________________________________
-void AliPHOSEmcRecPoint::EvalTime(TClonesArray * digits)
+void AliPHOSEmcRecPoint::EvalTime(TClonesArray * /*digits*/)
{
// Define a rec.point time as a time in the cell with the maximum energy
+ //Time already evaluated during AddDigit()
+/*
Float_t maxE = 0;
Int_t maxAt = 0;
for(Int_t idig=0; idig < fMulDigit; idig++){
}
}
fTime = ((AliPHOSDigit*) digits->At(fDigitsList[maxAt]))->GetTime() ;
-
+*/
}
//____________________________________________________________________________
void AliPHOSEmcRecPoint::Purify(Float_t threshold){
//This virtual function has signature different from AliPHOSRecPoint::AddDigit
//it hides, not overrides. using - declaration should fix the problem, at least for
//g++
- using AliPHOSRecPoint::AddDigit;
- virtual void AddDigit(AliPHOSDigit & digit, Float_t Energy) ; // add a digit to the digits list
+// using AliPHOSRecPoint::AddDigit;
+ virtual void AddDigit(AliPHOSDigit & digit, Float_t Energy, Float_t time=0.) ; // add a digit to the digits list
Int_t Compare(const TObject * obj) const; // method for sorting
virtual void EvalAll(TClonesArray * digits) ; //Those tasks which can be done without vertex
//-----------------------------------------------------------------------------
void AliPHOSPulseGenerator::Digitize()
{
- // Emulates ADC: rounds down to nearest integer value all amplitudes
+ // Emulates ADC: rounds up to nearest integer value all amplitudes
for (Int_t i=0; i<fkTimeBins; i++) {
- fDataHG[i] = (Double_t) ((Int_t)fDataHG[i]);
- fDataLG[i] = (Double_t) ((Int_t)fDataLG[i]);
+ fDataHG[i] = TMath::Ceil(fDataHG[i]);
+ fDataLG[i] = TMath::Ceil(fDataLG[i]);
}
}
void SetAmplitude(Double_t a) {fAmplitude = a ; Reset();}
void SetTZero (Double_t t0) {fTZero = t0 ; Reset();}
void SetHG2LGRatio(Double_t r=16.){fHG2LGratio = r ;}
+ void SetTimeStep(Double_t step=100.e-9){fgTimeTrigger=step ;}
void Reset();
// Raw Read Out
fEmcMinE(0.),
fCpvMinE(0.),
fSampleQualityCut(1.),
+ fSampleToSec(0.),
fEmcCrystals(0),
fGeom(0),
fPulseGenerator(0),
fEmcMinE(0.),
fCpvMinE(0.),
fSampleQualityCut(1.),
+ fSampleToSec(0.),
fEmcCrystals(0),
fGeom(0),
fPulseGenerator(0),
fEmcMinE(0.),
fCpvMinE(0.),
fSampleQualityCut(1.),
+ fSampleToSec(0.),
fEmcCrystals(0),
fGeom(0),
fPulseGenerator(0),
fEmcMinE = dp.fEmcMinE ;
fCpvMinE = dp.fCpvMinE ;
fSampleQualityCut = dp.fSampleQualityCut;
+ fSampleToSec = dp.fSampleToSec ;
fEmcCrystals = dp.fEmcCrystals ;
fPulseGenerator = new AliPHOSPulseGenerator();
fGeom = dp.fGeom ;
fEmcMinE = dp.fEmcMinE ;
fCpvMinE = dp.fCpvMinE ;
fSampleQualityCut = dp.fSampleQualityCut ;
+ fSampleToSec = dp.fSampleToSec ;
fEmcCrystals = dp.fEmcCrystals ;
fGeom = dp.fGeom ;
if(fPulseGenerator) delete fPulseGenerator ;
Int_t relId[4], absId=-1, caloFlag=-1;
const Double_t baseLine=1. ; //Minimal energy of digit in ADC ch.
+
+ //Calculate conversion coeff. from Sample time step to seconds
+ //If OCDB contains negative or zero value - use one from RCU trailer
+ //Negative value in OCDB is used only for simulation of raw digits
+ if(fgCalibData->GetSampleTimeStep()>0.)
+ fSampleToSec=fgCalibData->GetSampleTimeStep() ;
+ else
+ fSampleToSec=fRawStream->GetTSample() ;
//Temporary array for LowGain digits
TClonesArray tmpLG("AliPHOSDigit",10000) ;
// energy = CalibrateE(energy,relId,lowGainFlag) ;
// time = CalibrateT(time,relId,lowGainFlag) ;
+
+ //convert time from sample bin units to s
+ time*=fSampleToSec ;
if(energy <= 0.)
continue;
Float_t fEmcMinE ; // minimum energy of digit (ADC)
Float_t fCpvMinE ; // minimum energy of digit (ADC)
Float_t fSampleQualityCut; // Cut on sample shapes: 0: no samples; 1: default parameterization; 999: accept even obviously bad
+ Float_t fSampleToSec ; // Conversion coeff from sample time step to seconds
Int_t fEmcCrystals ; // number of EMC crystals
AliPHOSGeometry * fGeom ; //! PHOS geometry
static AliPHOSCalibData * fgCalibData ; //! Calibration database if avalable
virtual ~AliPHOSRecPoint();
- virtual void AddDigit(AliDigitNew &){
- Fatal("AddDigit", "use AddDigit(AliPHOSDigit & digit, Float_t Energy)") ;
- }
- virtual void AddDigit(AliPHOSDigit & digit, Float_t Energy) = 0 ;
+// virtual void AddDigit(AliDigitNew &){
+// Fatal("AddDigit", "use AddDigit(AliPHOSDigit & digit, Float_t Energy)") ;
+// }
+ virtual void AddDigit(AliPHOSDigit & digit, Float_t Energy, Float_t time=0) = 0 ;
virtual Int_t Compare(const TObject * obj) const = 0 ;
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py);
virtual void Draw(Option_t * option="") ;
const AliPHOSDigit * dig = (const AliPHOSDigit*)fgDigitsArray->At(idig);
if(dig->GetId() <= knEMC &&
Calibrate(dig->GetEnergy(),dig->GetId()) > GetRecoParam()->GetEMCMinE() ){
- phsCells.SetCell(idignew,dig->GetId(), Calibrate(dig->GetEnergy(),dig->GetId()), dig->GetTime());
+ phsCells.SetCell(idignew,dig->GetId(), Calibrate(dig->GetEnergy(),dig->GetId()),
+ CalibrateT(dig->GetTime(),dig->GetId()));
idignew++;
}
}
ec->SetNExMax(emcRP->GetNExMax()); //number of local maxima
ec->SetEmcCpvDistance(ts->GetCpvDistance("r")); //Only radius, what about separate x,z????
ec->SetClusterChi2(-1); //not yet implemented
- ec->SetTOF(emcRP->GetTime()); //Time of flight
+ ec->SetTOF(emcRP->GetTime()); //Time of flight - already calibrated in EMCRecPoint
//Cells contributing to clusters
ec->SetNCells(cellMult);
}
}
//==================================================================================
+Float_t AliPHOSReconstructor::CalibrateT(Float_t time, Int_t absId)const{
+ // Calibrate EMC digit, i.e. multiply its Amp by a factor read from CDB
+
+ const AliPHOSGeometry *geom = AliPHOSGeometry::GetInstance() ;
+
+ //Determine rel.position of the cell absolute ID
+ Int_t relId[4];
+ geom->AbsToRelNumbering(absId,relId);
+ Int_t module=relId[0];
+ Int_t row =relId[2];
+ Int_t column=relId[3];
+ if(relId[1]){ //CPV
+ return 0. ;
+ }
+ else{ //EMC
+ time += fgCalibData->GetTimeShiftEmc(module,column,row);
+ return time ;
+ }
+}
+//==================================================================================
void AliPHOSReconstructor::FillMisalMatrixes(AliESDEvent* esd)const{
//Store PHOS matrixes in ESD Header
virtual Bool_t HasDigitConversion() const {return kTRUE;};
virtual void ConvertDigits(AliRawReader* rawReader, TTree* digitsTree) const;
virtual Float_t Calibrate(Float_t amp, Int_t absId) const ;
+ virtual Float_t CalibrateT(Float_t time, Int_t absId) const ;
void FillMisalMatrixes(AliESDEvent* esd)const ;