#include "AliPHOSPIDv1.h"
#include "AliPHOSTracker.h"
#include "AliRawReader.h"
+#include "AliPHOSCalibData.h"
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
#include "AliPHOSTrigger.h"
#include "AliPHOSGeometry.h"
-#include "AliPHOSRecoParam.h"
-#include "AliPHOSRecoParamEmc.h"
-#include "AliPHOSRecoParamCpv.h"
#include "AliPHOSDigit.h"
#include "AliPHOSTrackSegment.h"
#include "AliPHOSEmcRecPoint.h"
ClassImp(AliPHOSReconstructor)
Bool_t AliPHOSReconstructor::fgDebug = kFALSE ;
-AliPHOSRecoParam* AliPHOSReconstructor::fgkRecoParamEmc =0; // EMC rec. parameters
-AliPHOSRecoParam* AliPHOSReconstructor::fgkRecoParamCpv =0; // CPV rec. parameters
+TClonesArray* AliPHOSReconstructor::fgDigitsArray = 0; // Array of PHOS digits
+TObjArray* AliPHOSReconstructor::fgEMCRecPoints = 0; // Array of EMC rec.points
+AliPHOSCalibData * AliPHOSReconstructor::fgCalibData = 0 ;
+
//____________________________________________________________________________
AliPHOSReconstructor::AliPHOSReconstructor() :
- fGeom(NULL)
+ fGeom(NULL),fClusterizer(NULL),fTSM(NULL),fPID(NULL)
{
// ctor
-
- if (!fgkRecoParamEmc) {
- AliWarning("The Reconstruction parameters for EMC nonitialized - Used default one");
- fgkRecoParamEmc = AliPHOSRecoParamEmc::GetEmcDefaultParameters();
- }
-
- if (!fgkRecoParamCpv) {
- AliWarning("The Reconstruction parameters for CPV nonitialized - Used default one");
- fgkRecoParamCpv = AliPHOSRecoParamCpv::GetCpvDefaultParameters();
- }
-
- fGeom = AliPHOSGeometry::GetInstance("IHEP","");
+ fGeom = AliPHOSGeometry::GetInstance("IHEP","");
+ fClusterizer = new AliPHOSClusterizerv1 (fGeom);
+ fTSM = new AliPHOSTrackSegmentMakerv1(fGeom);
+ fPID = new AliPHOSPIDv1 (fGeom);
+ fgDigitsArray = new TClonesArray("AliPHOSDigit",100);
+ fgEMCRecPoints= new TObjArray(100) ;
+ if (!fgCalibData)
+ fgCalibData = new AliPHOSCalibData(-1); //use AliCDBManager's run number
+
}
//____________________________________________________________________________
{
// dtor
delete fGeom;
+ delete fClusterizer;
+ delete fTSM;
+ delete fPID;
+ delete fgDigitsArray;
+ delete fgEMCRecPoints;
}
//____________________________________________________________________________
// segment maker needs access to the AliESDEvent object to retrieve the tracks reconstructed by
// the global tracking.
- AliPHOSClusterizerv1 clu(fGeom);
- clu.SetInput(digitsTree);
- clu.SetOutput(clustersTree);
+ fClusterizer->InitParameters();
+ fClusterizer->SetInput(digitsTree);
+ fClusterizer->SetOutput(clustersTree);
if ( Debug() )
- clu.Digits2Clusters("deb all") ;
+ fClusterizer->Digits2Clusters("deb all") ;
else
- clu.Digits2Clusters("") ;
+ fClusterizer->Digits2Clusters("") ;
}
//____________________________________________________________________________
// then it creates AliESDtracks out of them and
// write tracks to the ESD
- AliPHOSTrackSegmentMaker *tsm = new AliPHOSTrackSegmentMakerv1(fGeom);
- AliPHOSPID *pid = new AliPHOSPIDv1 (fGeom);
// do current event; the loop over events is done by AliReconstruction::Run()
- tsm->SetESD(esd) ;
- tsm->SetInput(clustersTree);
+ fTSM->SetESD(esd) ;
+ fTSM->SetInput(clustersTree);
if ( Debug() )
- tsm->Clusters2TrackSegments("deb all") ;
+ fTSM->Clusters2TrackSegments("deb all") ;
else
- tsm->Clusters2TrackSegments("") ;
+ fTSM->Clusters2TrackSegments("") ;
+
+ fPID->SetEnergyCorrectionOn(GetRecoParam()->GetEMCEnergyCorrectionOn());
- pid->SetInput(clustersTree, tsm->GetTrackSegments()) ;
- pid->SetESD(esd) ;
+ fPID->SetInput(clustersTree, fTSM->GetTrackSegments()) ;
+ fPID->SetESD(esd) ;
if ( Debug() )
- pid->TrackSegments2RecParticles("deb all") ;
+ fPID->TrackSegments2RecParticles("deb all") ;
else
- pid->TrackSegments2RecParticles("") ;
+ fPID->TrackSegments2RecParticles("") ;
-
- // This function creates AliESDtracks from AliPHOSRecParticles
- // and
- // writes them to the ESD
-
- TClonesArray *recParticles = pid->GetRecParticles();
- Int_t nOfRecParticles = recParticles->GetEntries();
+ TClonesArray *recParticles = fPID->GetRecParticles();
+ Int_t nOfRecParticles = recParticles->GetEntriesFast();
esd->SetNumberOfPHOSClusters(nOfRecParticles) ;
esd->SetFirstPHOSCluster(esd->GetNumberOfCaloClusters()) ;
AliError("can't get the branch with the PHOS digits !");
return;
}
- TClonesArray *digitsArray = new TClonesArray("AliPHOSDigit",100);
- branch->SetAddress(&digitsArray);
+ branch->SetAddress(&fgDigitsArray);
branch->GetEntry(0);
// Get the clusters array
return;
}
- TObjArray *emcRecPoints = new TObjArray(100) ;
- emcbranch->SetAddress(&emcRecPoints);
+ emcbranch->SetAddress(&fgEMCRecPoints);
emcbranch->GetEntry(0);
//#########Calculate trigger and set trigger info###########
AliPHOSTrigger tr ;
// tr.SetPatchSize(1);//create 4x4 patches
tr.SetSimulation(kFALSE);
- tr.Trigger(digitsArray);
+ tr.Trigger(fgDigitsArray);
Float_t maxAmp2x2 = tr.Get2x2MaxAmplitude();
Float_t maxAmpnxn = tr.GetnxnMaxAmplitude();
//############# Fill CaloCells ###########
//########################################
- Int_t nDigits = digitsArray->GetEntries();
+ Int_t nDigits = fgDigitsArray->GetEntries();
Int_t idignew = 0 ;
AliDebug(1,Form("%d digits",nDigits));
// Add to CaloCells only EMC digits with non-zero energy
for (Int_t idig = 0 ; idig < nDigits ; idig++) {
- const AliPHOSDigit * dig = (const AliPHOSDigit*)digitsArray->At(idig);
- if(dig->GetId() <= knEMC && dig->GetEnergy() > 0 ){
- //printf("i %d; id %d; amp %f; time %e\n",
- //idignew,dig->GetId(),dig->GetEnergy(), dig->GetTime());
- phsCells.SetCell(idignew,dig->GetId(), dig->GetEnergy(), dig->GetTime());
+ 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());
idignew++;
}
}
if (Debug())
rp->Print();
// Get track segment and EMC rec.point associated with this rec.particle
- AliPHOSTrackSegment *ts = static_cast<AliPHOSTrackSegment *>(tsm->GetTrackSegments()
+ AliPHOSTrackSegment *ts = static_cast<AliPHOSTrackSegment *>(fTSM->GetTrackSegments()
->At(rp->GetPHOSTSIndex()));
- AliPHOSEmcRecPoint *emcRP = static_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(ts->GetEmcIndex()));
+ AliPHOSEmcRecPoint *emcRP = static_cast<AliPHOSEmcRecPoint *>(fgEMCRecPoints->At(ts->GetEmcIndex()));
AliESDCaloCluster *ec = new AliESDCaloCluster() ;
Float_t xyz[3];
Double_t *fracList = new Double_t[cellMult];
for (Int_t iCell=0; iCell<cellMult; iCell++) {
- AliPHOSDigit *digit = static_cast<AliPHOSDigit *>(digitsArray->At(digitsList[iCell]));
+ AliPHOSDigit *digit = static_cast<AliPHOSDigit *>(fgDigitsArray->At(digitsList[iCell]));
absIdList[iCell] = (UShort_t)(digit->GetId());
if (digit->GetEnergy() > 0)
- fracList[iCell] = rpElist[iCell]/digit->GetEnergy();
+ fracList[iCell] = rpElist[iCell]/(Calibrate(digit->GetEnergy(),digit->GetId()));
else
fracList[iCell] = 0;
}
Int_t primMult = 0;
Int_t *primList = emcRP->GetPrimaries(primMult);
+ Float_t energy;
+ if (GetRecoParam()->EMCEcore2ESD())
+ energy = emcRP->GetCoreEnergy();
+ else
+ energy = rp->Energy();
+
// fills the ESDCaloCluster
ec->SetClusterType(AliESDCaloCluster::kPHOSCluster);
ec->SetPosition(xyz); //rec.point position in MARS
- ec->SetE(rp->Energy()); //total particle energy
+ ec->SetE(energy); //total or core particle energy
ec->SetClusterDisp(emcRP->GetDispersion()); //cluster dispersion
ec->SetPid(rp->GetPID()) ; //array of particle identification
ec->SetM02(emcRP->GetM2x()) ; //second moment M2x
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->SetM11(-1) ; //not yet implemented
-
+ ec->SetTOF(emcRP->GetTime()); //Time of flight
+
//Cells contributing to clusters
ec->SetNCells(cellMult);
ec->SetCellsAbsId(absIdList);
//Array of MC indeces
TArrayI arrayPrim(primMult,primList);
ec->AddLabels(arrayPrim);
-
- //Array of tracks uncomment when available in future
- //TArrayS arrayTrackMatched(1);// Only one track, temporal solution.
- //arrayTrackMatched[0]= (Short_t)(matchedTrack[iClust]);
- //ec->AddTracksMatched(arrayTrackMatched);
- // add the track to the esd object
-
+ //Matched ESD track
+ TArrayI arrayTrackMatched(1);
+ arrayTrackMatched[0]= ts->GetTrackIndex();
+ ec->AddTracksMatched(arrayTrackMatched);
+
esd->AddCaloCluster(ec);
delete ec;
+ delete [] fracList;
+ delete [] absIdList;
}
- digitsArray ->Delete();
- delete digitsArray;
- emcRecPoints->Delete();
- delete emcRecPoints;
- delete tsm;
- delete pid;
+ fgDigitsArray ->Delete();
+ fgEMCRecPoints->Delete();
+ recParticles ->Delete();
}
//____________________________________________________________________________
// Converts raw data to
// PHOS digits
// Works on a single-event basis
-
rawReader->Reset() ;
AliPHOSRawDecoder * dc ;
- const TObjArray* maps = AliPHOSRecoParamEmc::GetMappings();
+ const TObjArray* maps = AliPHOSRecoParam::GetMappings();
if(!maps) AliFatal("Cannot retrieve ALTRO mappings!!");
AliAltroMapping *mapping[4];
mapping[i] = (AliAltroMapping*)maps->At(i);
}
- if(strcmp(fgkRecoParamEmc->DecoderVersion(),"v1")==0)
+ if (strcmp(GetRecoParam()->EMCDecoderVersion(),"v1")==0)
dc=new AliPHOSRawDecoderv1(rawReader,mapping);
- else
- if(strcmp(fgkRecoParamEmc->DecoderVersion(),"v2")==0)
- dc=new AliPHOSRawDecoderv2(rawReader,mapping);
- else
- dc=new AliPHOSRawDecoder(rawReader,mapping);
+ else if (strcmp(GetRecoParam()->EMCDecoderVersion(),"v2")==0)
+ dc=new AliPHOSRawDecoderv2(rawReader,mapping);
+ else
+ dc=new AliPHOSRawDecoder(rawReader,mapping);
+
+ dc->SubtractPedestals(GetRecoParam()->EMCSubtractPedestals());
+ dc->SetAmpOffset(GetRecoParam()->GetGlobalAltroOffset());
+ dc->SetAmpThreshold(GetRecoParam()->GetGlobalAltroThreshold());
- dc->SetOldRCUFormat(fgkRecoParamEmc->IsOldRCUFormat());
-
- dc->SubtractPedestals(fgkRecoParamEmc->SubtractPedestals());
-
TClonesArray *digits = new TClonesArray("AliPHOSDigit",1);
digits->SetName("DIGITS");
Int_t bufsize = 32000;
digitsTree->Branch("PHOS", &digits, bufsize);
- AliPHOSRawDigiProducer pr(fgkRecoParamEmc,fgkRecoParamCpv);
+ //AliPHOSRawDigiProducer pr(GetRecoParam());
+ AliPHOSRawDigiProducer pr;
+
+ pr.SetEmcMinAmp(GetRecoParam()->GetEMCRawDigitThreshold()); // in ADC
+ pr.SetCpvMinAmp(GetRecoParam()->GetCPVMinE());
+ pr.SetSampleQualityCut(GetRecoParam()->GetEMCSampleQualityCut());
pr.MakeDigits(digits,dc);
delete dc ;
digits->Delete();
delete digits;
}
+//==================================================================================
+Float_t AliPHOSReconstructor::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() ;
+
+ //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
+ Float_t calibration = fgCalibData->GetADCchannelCpv(module,column,row);
+ return amp*calibration ;
+ }
+ else{ //EMC
+ Float_t calibration = fgCalibData->GetADCchannelEmc(module,column,row);
+ return amp*calibration ;
+ }
+}
+
+