// STEER includes
#include "AliVCluster.h"
#include "AliVCaloCells.h"
-#include "AliVEvent.h"
#include "AliLog.h"
#include "AliPID.h"
#include "AliESDEvent.h"
ClassImp(AliEMCALRecoUtils)
-//______________________________________________
+//_____________________________________
AliEMCALRecoUtils::AliEMCALRecoUtils():
- fParticleType(kPhoton), fPosAlgo(kUnchanged), fW0(4.),
- fNonLinearityFunction(kNoCorrection), fNonLinearThreshold(30),
+ fParticleType(0), fPosAlgo(0), fW0(0),
+ fNonLinearityFunction(0), fNonLinearThreshold(0),
fSmearClusterEnergy(kFALSE), fRandom(),
fCellsRecalibrated(kFALSE), fRecalibration(kFALSE), fEMCALRecalibrationFactors(),
fTimeRecalibration(kFALSE), fEMCALTimeRecalibrationFactors(),
fRemoveBadChannels(kFALSE), fRecalDistToBadChannels(kFALSE), fEMCALBadChannelMap(),
fNCellsFromEMCALBorder(0), fNoEMCALBorderAtEta0(kTRUE),
fRejectExoticCluster(kFALSE), fRejectExoticCells(kFALSE),
- fExoticCellFraction(0.97), fExoticCellDiffTime(1e6), fExoticCellMinAmplitude(0.5),
- fPIDUtils(), fAODFilterMask(32),
+ fExoticCellFraction(0), fExoticCellDiffTime(0), fExoticCellMinAmplitude(0),
+ fPIDUtils(), fAODFilterMask(0),
fMatchedTrackIndex(0x0), fMatchedClusterIndex(0x0),
- fResidualEta(0x0), fResidualPhi(0x0), fCutEtaPhiSum(kTRUE), fCutEtaPhiSeparate(kFALSE),
- fCutR(0.05), fCutEta(0.025), fCutPhi(0.05),
- fClusterWindow(100), fMass(0.139),
- fStepSurface(20.), fStepCluster(5.),
- fTrackCutsType(kLooseCut), fCutMinTrackPt(0), fCutMinNClusterTPC(-1),
- fCutMinNClusterITS(-1), fCutMaxChi2PerClusterTPC(1e10), fCutMaxChi2PerClusterITS(1e10),
+ fResidualEta(0x0), fResidualPhi(0x0), fCutEtaPhiSum(kFALSE), fCutEtaPhiSeparate(kFALSE),
+ fCutR(0), fCutEta(0), fCutPhi(0),
+ fClusterWindow(0), fMass(0),
+ fStepSurface(0), fStepCluster(0),
+ fTrackCutsType(0), fCutMinTrackPt(0), fCutMinNClusterTPC(0),
+ fCutMinNClusterITS(0), fCutMaxChi2PerClusterTPC(0), fCutMaxChi2PerClusterITS(0),
fCutRequireTPCRefit(kFALSE), fCutRequireITSRefit(kFALSE), fCutAcceptKinkDaughters(kFALSE),
- fCutMaxDCAToVertexXY(1e10), fCutMaxDCAToVertexZ(1e10), fCutDCAToVertex2D(kFALSE)
+ fCutMaxDCAToVertexXY(0), fCutMaxDCAToVertexZ(0), fCutDCAToVertex2D(kFALSE)
{
//
// Constructor.
// during Reco algorithm execution
//
- //Misalignment matrices
- for(Int_t i = 0; i < 15 ; i++) {
- fMisalTransShift[i] = 0.;
- fMisalRotShift[i] = 0.;
- }
-
- //Non linearity
- for(Int_t i = 0; i < 7 ; i++) fNonLinearityParams[i] = 0.;
-
- //For kBeamTestCorrected case, but default is no correction
- fNonLinearityParams[0] = 0.99078;
- fNonLinearityParams[1] = 0.161499;
- fNonLinearityParams[2] = 0.655166;
- fNonLinearityParams[3] = 0.134101;
- fNonLinearityParams[4] = 163.282;
- fNonLinearityParams[5] = 23.6904;
- fNonLinearityParams[6] = 0.978;
-
- //For kPi0GammaGamma case
- //fNonLinearityParams[0] = 0.1457/0.1349766/1.038;
- //fNonLinearityParams[1] = -0.02024/0.1349766/1.038;
- //fNonLinearityParams[2] = 1.046;
-
- //Cluster energy smearing
- fSmearClusterEnergy = kFALSE;
- fSmearClusterParam[0] = 0.07; // * sqrt E term
- fSmearClusterParam[1] = 0.00; // * E term
- fSmearClusterParam[2] = 0.00; // constant
+ // Init parameters
+ InitParameters();
//Track matching
fMatchedTrackIndex = new TArrayI();
if(fEMCALRecalibrationFactors) {
fEMCALRecalibrationFactors->Clear();
- delete fEMCALRecalibrationFactors;
+ delete fEMCALRecalibrationFactors;
}
if(fEMCALTimeRecalibrationFactors) {
- fEMCALTimeRecalibrationFactors->Clear();
- delete fEMCALTimeRecalibrationFactors;
- }
+ fEMCALTimeRecalibrationFactors->Clear();
+ delete fEMCALTimeRecalibrationFactors;
+ }
if(fEMCALBadChannelMap) {
fEMCALBadChannelMap->Clear();
- delete fEMCALBadChannelMap;
+ delete fEMCALBadChannelMap;
}
delete fMatchedTrackIndex ;
if(absID < 0 || absID >= 24*48*geom->GetNumberOfSuperModules()) return kFALSE;
Int_t imod = -1, iphi =-1, ieta=-1,iTower = -1, iIphi = -1, iIeta = -1;
- geom->GetCellIndex(absID,imod,iTower,iIphi,iIeta);
+
+ if(!geom->GetCellIndex(absID,imod,iTower,iIphi,iIeta))
+ {
+ // cell absID does not exist
+ amp=0; time = 1.e9;
+ return kFALSE;
+ }
+
geom->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,iphi,ieta);
// Do not include bad channels found in analysis,
- if( IsBadChannelsRemovalSwitchedOn() && GetEMCALChannelStatus(imod, ieta, iphi)) {
+ if( IsBadChannelsRemovalSwitchedOn() && GetEMCALChannelStatus(imod, ieta, iphi))
+ {
return kFALSE;
}
//Recalibrate energy
amp = cells->GetCellAmplitude(absID);
- if(IsRecalibrationOn())
+ if(!fCellsRecalibrated && IsRecalibrationOn())
amp *= GetEMCALChannelRecalibrationFactor(imod,ieta,iphi);
return kTRUE;
}
-//_______________________________________________________________
-Bool_t AliEMCALRecoUtils::CheckCellFiducialRegion(AliEMCALGeometry* geom, AliVCluster* cluster, AliVCaloCells* cells)
+//_____________________________________________________________________________
+Bool_t AliEMCALRecoUtils::CheckCellFiducialRegion(const AliEMCALGeometry* geom,
+ const AliVCluster* cluster,
+ AliVCaloCells* cells)
{
// Given the list of AbsId of the cluster, get the maximum cell and
// check if there are fNCellsFromBorder from the calorimeter border
if(iSM < 10){
if(iphi >= fNCellsFromEMCALBorder && iphi < 24-fNCellsFromEMCALBorder) okrow =kTRUE;
}
- else{
- if(iphi >= fNCellsFromEMCALBorder && iphi < 12-fNCellsFromEMCALBorder) okrow =kTRUE;
- }
+ else if (iSM >=10 && ( ( geom->GetEMCGeometry()->GetGeoName()).Contains("12SMV1"))) {
+ if(iphi >= fNCellsFromEMCALBorder && iphi < 8-fNCellsFromEMCALBorder) okrow =kTRUE; //1/3 sm case
+ }
+ else {
+ if(iphi >= fNCellsFromEMCALBorder && iphi < 12-fNCellsFromEMCALBorder) okrow =kTRUE; // half SM case
+ }
//Check columns/eta
if(!fNoEMCALBorderAtEta0){
}
-//_________________________________________________________________________________________________________
-Bool_t AliEMCALRecoUtils::ClusterContainsBadChannel(AliEMCALGeometry* geom, UShort_t* cellList, const Int_t nCells){
- // Check that in the cluster cells, there is no bad channel of those stored
- // in fEMCALBadChannelMap or fPHOSBadChannelMap
+//_______________________________________________________________________________
+Bool_t AliEMCALRecoUtils::ClusterContainsBadChannel(const AliEMCALGeometry* geom,
+ const UShort_t* cellList,
+ const Int_t nCells)
+{
+ // Check that in the cluster cells, there is no bad channel of those stored
+ // in fEMCALBadChannelMap or fPHOSBadChannelMap
- if(!fRemoveBadChannels) return kFALSE;
- if(!fEMCALBadChannelMap) return kFALSE;
+ if(!fRemoveBadChannels) return kFALSE;
+ if(!fEMCALBadChannelMap) return kFALSE;
- Int_t icol = -1;
- Int_t irow = -1;
- Int_t imod = -1;
- for(Int_t iCell = 0; iCell<nCells; iCell++){
+ Int_t icol = -1;
+ Int_t irow = -1;
+ Int_t imod = -1;
+ for(Int_t iCell = 0; iCell<nCells; iCell++){
- //Get the column and row
+ //Get the column and row
Int_t iTower = -1, iIphi = -1, iIeta = -1;
geom->GetCellIndex(cellList[iCell],imod,iTower,iIphi,iIeta);
if(fEMCALBadChannelMap->GetEntries() <= imod) continue;
return kTRUE;
}
- }// cell cluster loop
-
- return kFALSE;
+ }// cell cluster loop
+ return kFALSE;
}
-//_______________________________________________________________________
+//_____________________________________________________________________________________________
Bool_t AliEMCALRecoUtils::IsExoticCell(const Int_t absID, AliVCaloCells* cells, const Int_t bc)
{
// Look to cell neighbourhood and reject if it seems exotic
// Do before recalibrating the cells
+
if(!fRejectExoticCells) return kFALSE;
-
+
AliEMCALGeometry * geom = AliEMCALGeometry::GetInstance();
Int_t imod = -1, iphi =-1, ieta=-1,iTower = -1, iIphi = -1, iIeta = -1;
//printf("\t eCell %f, eCross %f, 1-eCross/eCell %f\n",ecell,eCross,1-eCross/ecell);
if(1-eCross/ecell > fExoticCellFraction) {
- AliDebug(2,Form("AliEMCALRecoUtils::IsExoticCell() - EXOTIC CELL id %d, eCell %f, eCross %f, 1-eCross/eCell %f\n",absID,ecell,eCross,1-eCross/ecell));
+ AliDebug(2,Form("AliEMCALRecoUtils::IsExoticCell() - EXOTIC CELL id %d, eCell %f, eCross %f, 1-eCross/eCell %f\n",
+ absID,ecell,eCross,1-eCross/ecell));
return kTRUE;
}
-
+
return kFALSE;
-
}
-//_________________________________________________
-Bool_t AliEMCALRecoUtils::IsExoticCluster(AliVCluster *cluster, AliVCaloCells *cells, const Int_t bc) {
+//___________________________________________________________________
+Bool_t AliEMCALRecoUtils::IsExoticCluster(const AliVCluster *cluster,
+ AliVCaloCells *cells,
+ const Int_t bc)
+{
// Check if the cluster highest energy tower is exotic
if(!cluster){
GetMaxEnergyCell(geom, cells, cluster, absId, iSupMod, ieta, iphi, shared);
return IsExoticCell(absId,cells,bc);
-
}
-//__________________________________________________
-Float_t AliEMCALRecoUtils::SmearClusterEnergy(AliVCluster* cluster) {
-
+//_______________________________________________________________________
+Float_t AliEMCALRecoUtils::SmearClusterEnergy(const AliVCluster* cluster)
+{
//In case of MC analysis, smear energy to match resolution/calibration in real data
if(!cluster){
AliDebug(2, Form("Energy: original %f, smeared %f\n", energy, rdmEnergy));
}
- return rdmEnergy ;
-
+ return rdmEnergy;
}
-//__________________________________________________
-Float_t AliEMCALRecoUtils::CorrectClusterEnergyLinearity(AliVCluster* cluster){
-// Correct cluster energy from non linearity functions
+//____________________________________________________________________________
+Float_t AliEMCALRecoUtils::CorrectClusterEnergyLinearity(AliVCluster* cluster)
+{
+ // Correct cluster energy from non linearity functions
if(!cluster){
AliInfo("Cluster pointer null!");
}
return energy;
-
}
+
//__________________________________________________
void AliEMCALRecoUtils::InitNonLinearityParam()
{
- //Initialising Non Linearity Parameters
+ //Initialising Non Linearity Parameters
- if(fNonLinearityFunction == kPi0MC)
- {
- fNonLinearityParams[0] = 1.014;
- fNonLinearityParams[1] = -0.03329;
- fNonLinearityParams[2] = -0.3853;
- fNonLinearityParams[3] = 0.5423;
- fNonLinearityParams[4] = -0.4335;
- }
-
- if(fNonLinearityFunction == kPi0GammaGamma)
- {
- fNonLinearityParams[0] = 1.04;
- fNonLinearityParams[1] = -0.1445;
- fNonLinearityParams[2] = 1.046;
- }
-
- if(fNonLinearityFunction == kPi0GammaConversion)
- {
- fNonLinearityParams[0] = 0.139393;
- fNonLinearityParams[1] = 0.0566186;
- fNonLinearityParams[2] = 0.982133;
- }
-
- if(fNonLinearityFunction == kBeamTest)
- {
- if(fNonLinearThreshold == 30)
- {
- fNonLinearityParams[0] = 1.007;
- fNonLinearityParams[1] = 0.894;
- fNonLinearityParams[2] = 0.246;
- }
- if(fNonLinearThreshold == 45)
- {
- fNonLinearityParams[0] = 1.003;
- fNonLinearityParams[1] = 0.719;
- fNonLinearityParams[2] = 0.334;
- }
- if(fNonLinearThreshold == 75)
- {
- fNonLinearityParams[0] = 1.002;
- fNonLinearityParams[1] = 0.797;
- fNonLinearityParams[2] = 0.358;
- }
- }
-
- if(fNonLinearityFunction == kBeamTestCorrected)
- {
- fNonLinearityParams[0] = 0.99078;
- fNonLinearityParams[1] = 0.161499;
- fNonLinearityParams[2] = 0.655166;
- fNonLinearityParams[3] = 0.134101;
- fNonLinearityParams[4] = 163.282;
- fNonLinearityParams[5] = 23.6904;
- fNonLinearityParams[6] = 0.978;
- }
+ if(fNonLinearityFunction == kPi0MC) {
+ fNonLinearityParams[0] = 1.014;
+ fNonLinearityParams[1] = -0.03329;
+ fNonLinearityParams[2] = -0.3853;
+ fNonLinearityParams[3] = 0.5423;
+ fNonLinearityParams[4] = -0.4335;
+ }
+
+ if(fNonLinearityFunction == kPi0GammaGamma) {
+ fNonLinearityParams[0] = 1.04;
+ fNonLinearityParams[1] = -0.1445;
+ fNonLinearityParams[2] = 1.046;
+ }
+
+ if(fNonLinearityFunction == kPi0GammaConversion) {
+ fNonLinearityParams[0] = 0.139393;
+ fNonLinearityParams[1] = 0.0566186;
+ fNonLinearityParams[2] = 0.982133;
+ }
+
+ if(fNonLinearityFunction == kBeamTest) {
+ if(fNonLinearThreshold == 30) {
+ fNonLinearityParams[0] = 1.007;
+ fNonLinearityParams[1] = 0.894;
+ fNonLinearityParams[2] = 0.246;
+ }
+ if(fNonLinearThreshold == 45) {
+ fNonLinearityParams[0] = 1.003;
+ fNonLinearityParams[1] = 0.719;
+ fNonLinearityParams[2] = 0.334;
+ }
+ if(fNonLinearThreshold == 75) {
+ fNonLinearityParams[0] = 1.002;
+ fNonLinearityParams[1] = 0.797;
+ fNonLinearityParams[2] = 0.358;
+ }
+ }
+
+ if(fNonLinearityFunction == kBeamTestCorrected) {
+ fNonLinearityParams[0] = 0.99078;
+ fNonLinearityParams[1] = 0.161499;
+ fNonLinearityParams[2] = 0.655166;
+ fNonLinearityParams[3] = 0.134101;
+ fNonLinearityParams[4] = 163.282;
+ fNonLinearityParams[5] = 23.6904;
+ fNonLinearityParams[6] = 0.978;
+ }
}
-//__________________________________________________
-Float_t AliEMCALRecoUtils::GetDepth(const Float_t energy, const Int_t iParticle, const Int_t iSM) const
+//_________________________________________________________
+Float_t AliEMCALRecoUtils::GetDepth(const Float_t energy,
+ const Int_t iParticle,
+ const Int_t iSM) const
{
//Calculate shower depth for a given cluster energy and particle type
}
return depth;
-
}
-//__________________________________________________
-void AliEMCALRecoUtils::GetMaxEnergyCell(AliEMCALGeometry *geom, AliVCaloCells* cells, AliVCluster* clu,
- Int_t & absId, Int_t& iSupMod, Int_t& ieta, Int_t& iphi, Bool_t &shared)
+//____________________________________________________________________
+void AliEMCALRecoUtils::GetMaxEnergyCell(const AliEMCALGeometry *geom,
+ AliVCaloCells* cells,
+ const AliVCluster* clu,
+ Int_t & absId,
+ Int_t & iSupMod,
+ Int_t & ieta,
+ Int_t & iphi,
+ Bool_t & shared)
{
//For a given CaloCluster gets the absId of the cell
//with maximum energy deposit.
shared = kTRUE;
//printf("AliEMCALRecoUtils::GetMaxEnergyCell() - SHARED CLUSTER\n");
}
- if(IsRecalibrationOn()) {
+ if(!fCellsRecalibrated && IsRecalibrationOn()) {
recalFactor = GetEMCALChannelRecalibrationFactor(iSupMod,ieta,iphi);
}
eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
iIphi, iIeta,iphi,ieta);
//printf("Max id %d, iSM %d, col %d, row %d\n",absId,iSupMod,ieta,iphi);
//printf("Max end---\n");
+}
+
+//______________________________________
+void AliEMCALRecoUtils::InitParameters()
+{
+ // Initialize data members with default values
+
+ fParticleType = kPhoton;
+ fPosAlgo = kUnchanged;
+ fW0 = 4.5;
+
+ fNonLinearityFunction = kNoCorrection;
+ fNonLinearThreshold = 30;
+
+ fExoticCellFraction = 0.97;
+ fExoticCellDiffTime = 1e6;
+ fExoticCellMinAmplitude = 0.5;
+
+ fAODFilterMask = 32;
+
+ fCutEtaPhiSum = kTRUE;
+ fCutEtaPhiSeparate = kFALSE;
+
+ fCutR = 0.05;
+ fCutEta = 0.025;
+ fCutPhi = 0.05;
+
+ fClusterWindow = 100;
+ fMass = 0.139;
+
+ fStepSurface = 20.;
+ fStepCluster = 5.;
+ fTrackCutsType = kLooseCut;
+
+ fCutMinTrackPt = 0;
+ fCutMinNClusterTPC = -1;
+ fCutMinNClusterITS = -1;
+
+ fCutMaxChi2PerClusterTPC = 1e10;
+ fCutMaxChi2PerClusterITS = 1e10;
+
+ fCutRequireTPCRefit = kFALSE;
+ fCutRequireITSRefit = kFALSE;
+ fCutAcceptKinkDaughters = kFALSE;
+
+ fCutMaxDCAToVertexXY = 1e10;
+ fCutMaxDCAToVertexZ = 1e10;
+ fCutDCAToVertex2D = kFALSE;
+
+
+ //Misalignment matrices
+ for(Int_t i = 0; i < 15 ; i++) {
+ fMisalTransShift[i] = 0.;
+ fMisalRotShift[i] = 0.;
+ }
+
+ //Non linearity
+ for(Int_t i = 0; i < 7 ; i++) fNonLinearityParams[i] = 0.;
+
+ //For kBeamTestCorrected case, but default is no correction
+ fNonLinearityParams[0] = 0.99078;
+ fNonLinearityParams[1] = 0.161499;
+ fNonLinearityParams[2] = 0.655166;
+ fNonLinearityParams[3] = 0.134101;
+ fNonLinearityParams[4] = 163.282;
+ fNonLinearityParams[5] = 23.6904;
+ fNonLinearityParams[6] = 0.978;
+
+ //For kPi0GammaGamma case
+ //fNonLinearityParams[0] = 0.1457/0.1349766/1.038;
+ //fNonLinearityParams[1] = -0.02024/0.1349766/1.038;
+ //fNonLinearityParams[2] = 1.046;
+ //Cluster energy smearing
+ fSmearClusterEnergy = kFALSE;
+ fSmearClusterParam[0] = 0.07; // * sqrt E term
+ fSmearClusterParam[1] = 0.00; // * E term
+ fSmearClusterParam[2] = 0.00; // constant
}
-//________________________________________________________________
-void AliEMCALRecoUtils::InitEMCALRecalibrationFactors(){
- //Init EMCAL recalibration factors
- AliDebug(2,"AliCalorimeterUtils::InitEMCALRecalibrationFactors()");
+//_____________________________________________________
+void AliEMCALRecoUtils::InitEMCALRecalibrationFactors()
+{
+ //Init EMCAL recalibration factors
+ AliDebug(2,"AliCalorimeterUtils::InitEMCALRecalibrationFactors()");
//In order to avoid rewriting the same histograms
- Bool_t oldStatus = TH1::AddDirectoryStatus();
- TH1::AddDirectory(kFALSE);
-
- fEMCALRecalibrationFactors = new TObjArray(10);
- for (int i = 0; i < 10; i++) fEMCALRecalibrationFactors->Add(new TH2F(Form("EMCALRecalFactors_SM%d",i),Form("EMCALRecalFactors_SM%d",i), 48, 0, 48, 24, 0, 24));
- //Init the histograms with 1
- for (Int_t sm = 0; sm < 10; sm++) {
- for (Int_t i = 0; i < 48; i++) {
- for (Int_t j = 0; j < 24; j++) {
- SetEMCALChannelRecalibrationFactor(sm,i,j,1.);
- }
- }
- }
- fEMCALRecalibrationFactors->SetOwner(kTRUE);
- fEMCALRecalibrationFactors->Compress();
+ Bool_t oldStatus = TH1::AddDirectoryStatus();
+ TH1::AddDirectory(kFALSE);
+
+ fEMCALRecalibrationFactors = new TObjArray(12);
+ for (int i = 0; i < 12; i++)
+ fEMCALRecalibrationFactors->Add(new TH2F(Form("EMCALRecalFactors_SM%d",i),
+ Form("EMCALRecalFactors_SM%d",i), 48, 0, 48, 24, 0, 24));
+ //Init the histograms with 1
+ for (Int_t sm = 0; sm < 12; sm++) {
+ for (Int_t i = 0; i < 48; i++) {
+ for (Int_t j = 0; j < 24; j++) {
+ SetEMCALChannelRecalibrationFactor(sm,i,j,1.);
+ }
+ }
+ }
+ fEMCALRecalibrationFactors->SetOwner(kTRUE);
+ fEMCALRecalibrationFactors->Compress();
- //In order to avoid rewriting the same histograms
- TH1::AddDirectory(oldStatus);
+ //In order to avoid rewriting the same histograms
+ TH1::AddDirectory(oldStatus);
}
-//________________________________________________________________
-void AliEMCALRecoUtils::InitEMCALTimeRecalibrationFactors(){
- //Init EMCAL recalibration factors
- AliDebug(2,"AliCalorimeterUtils::InitEMCALRecalibrationFactors()");
- //In order to avoid rewriting the same histograms
- Bool_t oldStatus = TH1::AddDirectoryStatus();
- TH1::AddDirectory(kFALSE);
-
- fEMCALTimeRecalibrationFactors = new TObjArray(4);
- for (int i = 0; i < 4; i++)
+//_________________________________________________________
+void AliEMCALRecoUtils::InitEMCALTimeRecalibrationFactors()
+{
+ //Init EMCAL recalibration factors
+ AliDebug(2,"AliCalorimeterUtils::InitEMCALRecalibrationFactors()");
+ //In order to avoid rewriting the same histograms
+ Bool_t oldStatus = TH1::AddDirectoryStatus();
+ TH1::AddDirectory(kFALSE);
+
+ fEMCALTimeRecalibrationFactors = new TObjArray(4);
+ for (int i = 0; i < 4; i++)
fEMCALTimeRecalibrationFactors->Add(new TH1F(Form("hAllTimeAvBC%d",i),
Form("hAllTimeAvBC%d",i),
- 48*24*10,0.,48*24*10) );
- //Init the histograms with 1
- for (Int_t bc = 0; bc < 4; bc++) {
- for (Int_t i = 0; i < 48*24*10; i++)
- SetEMCALChannelTimeRecalibrationFactor(bc,i,0.);
+ 48*24*12,0.,48*24*12) );
+ //Init the histograms with 1
+ for (Int_t bc = 0; bc < 4; bc++) {
+ for (Int_t i = 0; i < 48*24*12; i++)
+ SetEMCALChannelTimeRecalibrationFactor(bc,i,0.);
}
-
- fEMCALTimeRecalibrationFactors->SetOwner(kTRUE);
- fEMCALTimeRecalibrationFactors->Compress();
-
- //In order to avoid rewriting the same histograms
- TH1::AddDirectory(oldStatus);
+
+ fEMCALTimeRecalibrationFactors->SetOwner(kTRUE);
+ fEMCALTimeRecalibrationFactors->Compress();
+
+ //In order to avoid rewriting the same histograms
+ TH1::AddDirectory(oldStatus);
}
-//________________________________________________________________
-void AliEMCALRecoUtils::InitEMCALBadChannelStatusMap(){
- //Init EMCAL bad channels map
- AliDebug(2,"AliEMCALRecoUtils::InitEMCALBadChannelStatusMap()");
- //In order to avoid rewriting the same histograms
- Bool_t oldStatus = TH1::AddDirectoryStatus();
- TH1::AddDirectory(kFALSE);
-
- fEMCALBadChannelMap = new TObjArray(10);
- //TH2F * hTemp = new TH2I("EMCALBadChannelMap","EMCAL SuperModule bad channel map", 48, 0, 48, 24, 0, 24);
- for (int i = 0; i < 10; i++) {
- fEMCALBadChannelMap->Add(new TH2I(Form("EMCALBadChannelMap_Mod%d",i),Form("EMCALBadChannelMap_Mod%d",i), 48, 0, 48, 24, 0, 24));
- }
-
- fEMCALBadChannelMap->SetOwner(kTRUE);
- fEMCALBadChannelMap->Compress();
-
- //In order to avoid rewriting the same histograms
- TH1::AddDirectory(oldStatus);
+//____________________________________________________
+void AliEMCALRecoUtils::InitEMCALBadChannelStatusMap()
+{
+ //Init EMCAL bad channels map
+ AliDebug(2,"AliEMCALRecoUtils::InitEMCALBadChannelStatusMap()");
+ //In order to avoid rewriting the same histograms
+ Bool_t oldStatus = TH1::AddDirectoryStatus();
+ TH1::AddDirectory(kFALSE);
+
+ fEMCALBadChannelMap = new TObjArray(12);
+ //TH2F * hTemp = new TH2I("EMCALBadChannelMap","EMCAL SuperModule bad channel map", 48, 0, 48, 24, 0, 24);
+ for (int i = 0; i < 12; i++) {
+ fEMCALBadChannelMap->Add(new TH2I(Form("EMCALBadChannelMap_Mod%d",i),Form("EMCALBadChannelMap_Mod%d",i), 48, 0, 48, 24, 0, 24));
+ }
+
+ fEMCALBadChannelMap->SetOwner(kTRUE);
+ fEMCALBadChannelMap->Compress();
+
+ //In order to avoid rewriting the same histograms
+ TH1::AddDirectory(oldStatus);
}
-//________________________________________________________________
-void AliEMCALRecoUtils::RecalibrateClusterEnergy(AliEMCALGeometry* geom, AliVCluster * cluster, AliVCaloCells * cells, const Int_t bc){
- // Recalibrate the cluster energy and Time, considering the recalibration map
+//____________________________________________________________________________
+void AliEMCALRecoUtils::RecalibrateClusterEnergy(const AliEMCALGeometry* geom,
+ AliVCluster * cluster,
+ AliVCaloCells * cells,
+ const Int_t bc)
+{
+ // Recalibrate the cluster energy and Time, considering the recalibration map
// and the energy of the cells and time that compose the cluster.
// bc= bunch crossing number returned by esdevent->GetBunchCrossNumber();
return;
}
- //Get the cluster number of cells and list of absId, check what kind of cluster do we have.
- UShort_t * index = cluster->GetCellsAbsId() ;
- Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
- Int_t ncells = cluster->GetNCells();
+ //Get the cluster number of cells and list of absId, check what kind of cluster do we have.
+ UShort_t * index = cluster->GetCellsAbsId() ;
+ Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
+ Int_t ncells = cluster->GetNCells();
- //Initialize some used variables
- Float_t energy = 0;
- Int_t absId =-1;
+ //Initialize some used variables
+ Float_t energy = 0;
+ Int_t absId =-1;
Int_t icol =-1, irow =-1, imod=1;
- Float_t factor = 1, frac = 0;
+ Float_t factor = 1, frac = 0;
Int_t absIdMax = -1;
Float_t emax = 0;
- //Loop on the cells, get the cell amplitude and recalibration factor, multiply and and to the new energy
- for(Int_t icell = 0; icell < ncells; icell++){
- absId = index[icell];
- frac = fraction[icell];
- if(frac < 1e-5) frac = 1; //in case of EMCAL, this is set as 0 since unfolding is off
+ //Loop on the cells, get the cell amplitude and recalibration factor, multiply and and to the new energy
+ for(Int_t icell = 0; icell < ncells; icell++){
+ absId = index[icell];
+ frac = fraction[icell];
+ if(frac < 1e-5) frac = 1; //in case of EMCAL, this is set as 0 since unfolding is off
- if(!fCellsRecalibrated && IsRecalibrationOn()){
-
+ if(!fCellsRecalibrated && IsRecalibrationOn()) {
// Energy
Int_t iTower = -1, iIphi = -1, iIeta = -1;
geom->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
}
- energy += cells->GetCellAmplitude(absId)*factor*frac;
+ energy += cells->GetCellAmplitude(absId)*factor*frac;
if(emax < cells->GetCellAmplitude(absId)*factor*frac){
emax = cells->GetCellAmplitude(absId)*factor*frac;
absIdMax = absId;
}
-
- }
+ }
cluster->SetE(energy);
AliDebug(2,Form("AliEMCALRecoUtils::RecalibrateClusterEnergy - Energy before %f, after %f\n",cluster->E(),energy));
- // Recalculate time of cluster only for ESDs
- if(!strcmp("AliESDCaloCluster",Form("%s",cluster->ClassName()))){
-
+ // Recalculate time of cluster only for ESDs
+ if(!strcmp("AliESDCaloCluster",Form("%s",cluster->ClassName()))) {
+
// Time
Double_t weightedTime = 0;
Double_t weight = 0;
geom->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
factor = GetEMCALChannelRecalibrationFactor(imod,icol,irow);
- AliDebug(2,Form("AliEMCALRecoUtils::RecalibrateClusterEnergy - recalibrate cell: module %d, col %d, row %d, cell fraction %f,recalibration factor %f, cell energy %f\n",
+ AliDebug(2,Form("AliEMCALRecoUtils::RecalibrateClusterEnergy - recalibrate cell:"
+ " module %d, col %d, row %d, cell fraction %f,recalibration factor %f, cell energy %f\n",
imod,icol,irow,frac,factor,cells->GetCellTime(absId)));
}
weight = GetCellWeight(cells->GetCellAmplitude(absId)*factor*frac , energy );
weightTot += weight;
weightedTime += celltime * weight;
-
}
if(weightTot > 0)
cluster->SetTOF(weightedTime/weightTot);
else
cluster->SetTOF(maxcellTime);
-
}
}
-//________________________________________________________________
-void AliEMCALRecoUtils::RecalibrateCells(AliVCaloCells * cells, Int_t bc){
- // Recalibrate the cells time and energy, considering the recalibration map and the energy
+//_____________________________________________________________
+void AliEMCALRecoUtils::RecalibrateCells(AliVCaloCells * cells,
+ const Int_t bc)
+{
+ // Recalibrate the cells time and energy, considering the recalibration map and the energy
// of the cells that compose the cluster.
// bc= bunch crossing number returned by esdevent->GetBunchCrossNumber();
return;
}
- fCellsRecalibrated = kTRUE;
-
Int_t absId =-1;
Bool_t accept = kFALSE;
Float_t ecell = 0;
Double_t tcell = 0;
- Int_t nEMcell = cells->GetNumberOfCells() ;
+ Int_t nEMcell = cells->GetNumberOfCells() ;
for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
absId = cells->GetCellNumber(iCell);
//Set new values
cells->SetCell(iCell,absId,ecell, tcell);
-
}
-
+
+ fCellsRecalibrated = kTRUE;
}
-//_________________________________________________________________________________________________
-void AliEMCALRecoUtils::RecalibrateCellTime(const Int_t absId, const Int_t bc, Double_t & celltime)
+//_______________________________________________________________________________________________________
+void AliEMCALRecoUtils::RecalibrateCellTime(const Int_t absId, const Int_t bc, Double_t & celltime) const
{
- // Recalibrate time of cell with absID considering the recalibration map
+ // Recalibrate time of cell with absID considering the recalibration map
// bc= bunch crossing number returned by esdevent->GetBunchCrossNumber();
if(!fCellsRecalibrated && IsTimeRecalibrationOn() && bc >= 0){
-
celltime -= GetEMCALChannelTimeRecalibrationFactor(bc%4,absId)*1.e-9; ;
-
}
-
}
-//__________________________________________________
-void AliEMCALRecoUtils::RecalculateClusterPosition(AliEMCALGeometry *geom, AliVCaloCells* cells, AliVCluster* clu)
+//______________________________________________________________________________
+void AliEMCALRecoUtils::RecalculateClusterPosition(const AliEMCALGeometry *geom,
+ AliVCaloCells* cells,
+ AliVCluster* clu)
{
//For a given CaloCluster recalculates the position for a given set of misalignment shifts and puts it again in the CaloCluster.
if (fPosAlgo==kPosTowerGlobal) RecalculateClusterPositionFromTowerGlobal( geom, cells, clu);
else if(fPosAlgo==kPosTowerIndex) RecalculateClusterPositionFromTowerIndex ( geom, cells, clu);
else AliDebug(2,"Algorithm to recalculate position not selected, do nothing.");
-
}
-//__________________________________________________
-void AliEMCALRecoUtils::RecalculateClusterPositionFromTowerGlobal(AliEMCALGeometry *geom, AliVCaloCells* cells, AliVCluster* clu)
+//_____________________________________________________________________________________________
+void AliEMCALRecoUtils::RecalculateClusterPositionFromTowerGlobal(const AliEMCALGeometry *geom,
+ AliVCaloCells* cells,
+ AliVCluster* clu)
{
// For a given CaloCluster recalculates the position for a given set of misalignment shifts and puts it again in the CaloCluster.
// The algorithm is a copy of what is done in AliEMCALRecPoint
for (Int_t iDig=0; iDig< clu->GetNCells(); iDig++) {
- absId = clu->GetCellAbsId(iDig);
- fraction = clu->GetCellAmplitudeFraction(iDig);
- if(fraction < 1e-4) fraction = 1.; // in case unfolding is off
+ absId = clu->GetCellAbsId(iDig);
+ fraction = clu->GetCellAmplitudeFraction(iDig);
+ if(fraction < 1e-4) fraction = 1.; // in case unfolding is off
- if(!fCellsRecalibrated){
-
+ if (!fCellsRecalibrated){
geom->GetCellIndex(absId,iSM,iTower,iIphi,iIeta);
geom->GetCellPhiEtaIndexInSModule(iSM,iTower,iIphi, iIeta,iphi,ieta);
//printf("pLocal (%f,%f,%f)\n",pGlobal[0],pGlobal[1],pGlobal[2]);
for(int i=0; i<3; i++ ) newPos[i] += (weight*pGlobal[i]);
-
}// cell loop
if(totalWeight>0){
//printf("OldPos : %2.3f,%2.3f,%2.3f\n",pos[0],pos[1],pos[2]);
//printf("NewPos : %2.3f,%2.3f,%2.3f\n",newPos[0],newPos[1],newPos[2]);
- if(iSupModMax > 1) {//sector 1
- newPos[0] +=fMisalTransShift[3];//-=3.093;
- newPos[1] +=fMisalTransShift[4];//+=6.82;
- newPos[2] +=fMisalTransShift[5];//+=1.635;
+ if(iSupModMax > 1) {//sector 1
+ newPos[0] +=fMisalTransShift[3];//-=3.093;
+ newPos[1] +=fMisalTransShift[4];//+=6.82;
+ newPos[2] +=fMisalTransShift[5];//+=1.635;
//printf(" + : %2.3f,%2.3f,%2.3f\n",fMisalTransShift[3],fMisalTransShift[4],fMisalTransShift[5]);
-
- }
- else {//sector 0
- newPos[0] +=fMisalTransShift[0];//+=1.134;
- newPos[1] +=fMisalTransShift[1];//+=8.2;
- newPos[2] +=fMisalTransShift[2];//+=1.197;
+ } else {//sector 0
+ newPos[0] +=fMisalTransShift[0];//+=1.134;
+ newPos[1] +=fMisalTransShift[1];//+=8.2;
+ newPos[2] +=fMisalTransShift[2];//+=1.197;
//printf(" + : %2.3f,%2.3f,%2.3f\n",fMisalTransShift[0],fMisalTransShift[1],fMisalTransShift[2]);
-
- }
+ }
//printf("NewPos : %2.3f,%2.3f,%2.3f\n",newPos[0],newPos[1],newPos[2]);
clu->SetPosition(newPos);
-
}
-//__________________________________________________
-void AliEMCALRecoUtils::RecalculateClusterPositionFromTowerIndex(AliEMCALGeometry *geom, AliVCaloCells* cells, AliVCluster* clu)
+//____________________________________________________________________________________________
+void AliEMCALRecoUtils::RecalculateClusterPositionFromTowerIndex(const AliEMCALGeometry *geom,
+ AliVCaloCells* cells,
+ AliVCluster* clu)
{
// For a given CaloCluster recalculates the position for a given set of misalignment shifts and puts it again in the CaloCluster.
// The algorithm works with the tower indeces, averages the indeces and from them it calculates the global position
Int_t absId = -1;
Int_t iTower = -1;
Int_t iIphi = -1, iIeta = -1;
- Int_t iSupMod = -1, iSupModMax = -1;
+ Int_t iSupMod = -1, iSupModMax = -1;
Int_t iphi = -1, ieta =-1;
Bool_t shared = kFALSE;
geom->GetCellIndex(absId,iSupMod,iTower,iIphi,iIeta);
geom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphi,ieta);
- if(!fCellsRecalibrated){
-
+ if (!fCellsRecalibrated){
if(IsRecalibrationOn()) {
-
recalFactor = GetEMCALChannelRecalibrationFactor(iSupMod,ieta,iphi);
-
}
}
weightedRow += iphi*weight;
//printf("Max cell? cell %d, amplitude org %f, fraction %f, recalibration %f, amplitude new %f \n",cellAbsId, cells->GetCellAmplitude(cellAbsId), fraction, recalFactor, eCell) ;
-
- }// cell loop
+ }// cell loop
Float_t xyzNew[]={0.,0.,0.};
if(areInSameSM == kTRUE) {
weightedCol = weightedCol/totalWeight;
weightedRow = weightedRow/totalWeight;
geom->RecalculateTowerPosition(weightedRow, weightedCol, iSupModMax, depth, fMisalTransShift, fMisalRotShift, xyzNew);
- }
- else {
+ } else {
//printf("In Different SM\n");
geom->RecalculateTowerPosition(iphi, ieta, iSupModMax, depth, fMisalTransShift, fMisalRotShift, xyzNew);
}
clu->SetPosition(xyzNew);
-
}
-//____________________________________________________________________________
-void AliEMCALRecoUtils::RecalculateClusterDistanceToBadChannel(AliEMCALGeometry * geom, AliVCaloCells* cells, AliVCluster * cluster){
-
+//___________________________________________________________________________________________
+void AliEMCALRecoUtils::RecalculateClusterDistanceToBadChannel(const AliEMCALGeometry * geom,
+ AliVCaloCells* cells,
+ AliVCluster * cluster)
+{
//re-evaluate distance to bad channel with updated bad map
if(!fRecalDistToBadChannels) return;
return;
}
- //Get channels map of the supermodule where the cluster is.
+ //Get channels map of the supermodule where the cluster is.
Int_t absIdMax = -1, iSupMod =-1, icolM = -1, irowM = -1;
Bool_t shared = kFALSE;
GetMaxEnergyCell(geom, cells, cluster, absIdMax, iSupMod, icolM, irowM, shared);
TH2D* hMap = (TH2D*)fEMCALBadChannelMap->At(iSupMod);
Int_t dRrow, dRcol;
- Float_t minDist = 10000.;
- Float_t dist = 0.;
+ Float_t minDist = 10000.;
+ Float_t dist = 0.;
//Loop on tower status map
- for(Int_t irow = 0; irow < AliEMCALGeoParams::fgkEMCALRows; irow++){
- for(Int_t icol = 0; icol < AliEMCALGeoParams::fgkEMCALCols; icol++){
- //Check if tower is bad.
- if(hMap->GetBinContent(icol,irow)==0) continue;
+ for(Int_t irow = 0; irow < AliEMCALGeoParams::fgkEMCALRows; irow++){
+ for(Int_t icol = 0; icol < AliEMCALGeoParams::fgkEMCALCols; icol++){
+ //Check if tower is bad.
+ if(hMap->GetBinContent(icol,irow)==0) continue;
//printf("AliEMCALRecoUtils::RecalculateDistanceToBadChannels() - \n \t Bad channel in SM %d, col %d, row %d, \n \t Cluster max in col %d, row %d\n",
// iSupMod,icol, irow, icolM,irowM);
dRrow=TMath::Abs(irowM-irow);
dRcol=TMath::Abs(icolM-icol);
dist=TMath::Sqrt(dRrow*dRrow+dRcol*dRcol);
- if(dist < minDist){
+ if(dist < minDist){
//printf("MIN DISTANCE TO BAD %2.2f\n",dist);
minDist = dist;
}
-
- }
- }
+ }
+ }
- //In case the cluster is shared by 2 SuperModules, need to check the map of the second Super Module
- if (shared) {
- TH2D* hMap2 = 0;
- Int_t iSupMod2 = -1;
+ //In case the cluster is shared by 2 SuperModules, need to check the map of the second Super Module
+ if (shared) {
+ TH2D* hMap2 = 0;
+ Int_t iSupMod2 = -1;
- //The only possible combinations are (0,1), (2,3) ... (8,9)
- if(iSupMod%2) iSupMod2 = iSupMod-1;
- else iSupMod2 = iSupMod+1;
- hMap2 = (TH2D*)fEMCALBadChannelMap->At(iSupMod2);
+ //The only possible combinations are (0,1), (2,3) ... (8,9)
+ if(iSupMod%2) iSupMod2 = iSupMod-1;
+ else iSupMod2 = iSupMod+1;
+ hMap2 = (TH2D*)fEMCALBadChannelMap->At(iSupMod2);
- //Loop on tower status map of second super module
- for(Int_t irow = 0; irow < AliEMCALGeoParams::fgkEMCALRows; irow++){
- for(Int_t icol = 0; icol < AliEMCALGeoParams::fgkEMCALCols; icol++){
- //Check if tower is bad.
- if(hMap2->GetBinContent(icol,irow)==0) continue;
- //printf("AliEMCALRecoUtils::RecalculateDistanceToBadChannels(shared) - \n \t Bad channel in SM %d, col %d, row %d \n \t Cluster max in SM %d, col %d, row %d\n",
- // iSupMod2,icol, irow,iSupMod,icolM,irowM);
-
+ //Loop on tower status map of second super module
+ for(Int_t irow = 0; irow < AliEMCALGeoParams::fgkEMCALRows; irow++){
+ for(Int_t icol = 0; icol < AliEMCALGeoParams::fgkEMCALCols; icol++){
+ //Check if tower is bad.
+ if(hMap2->GetBinContent(icol,irow)==0) continue;
+ //printf("AliEMCALRecoUtils::RecalculateDistanceToBadChannels(shared) - \n \t Bad channel in SM %d, col %d, row %d \n \t Cluster max in SM %d, col %d, row %d\n",
+ // iSupMod2,icol, irow,iSupMod,icolM,irowM);
dRrow=TMath::Abs(irow-irowM);
if(iSupMod%2) {
- dRcol=TMath::Abs(icol-(AliEMCALGeoParams::fgkEMCALCols+icolM));
- }
- else {
+ dRcol=TMath::Abs(icol-(AliEMCALGeoParams::fgkEMCALCols+icolM));
+ } else {
dRcol=TMath::Abs(AliEMCALGeoParams::fgkEMCALCols+icol-icolM);
- }
+ }
- dist=TMath::Sqrt(dRrow*dRrow+dRcol*dRcol);
+ dist=TMath::Sqrt(dRrow*dRrow+dRcol*dRcol);
if(dist < minDist) minDist = dist;
-
- }
- }
-
- }// shared cluster in 2 SuperModules
+ }
+ }
+ }// shared cluster in 2 SuperModules
AliDebug(2,Form("Max cluster cell (SM,col,row)=(%d %d %d) - Distance to Bad Channel %2.2f",iSupMod, icolM, irowM, minDist));
cluster->SetDistanceToBadChannel(minDist);
-
}
-//____________________________________________________________________________
-void AliEMCALRecoUtils::RecalculateClusterPID(AliVCluster * cluster){
-
+//__________________________________________________________________
+void AliEMCALRecoUtils::RecalculateClusterPID(AliVCluster * cluster)
+{
//re-evaluate identification parameters with bayesian
if(!cluster){
return;
}
- if ( cluster->GetM02() != 0)
+ if ( cluster->GetM02() != 0)
fPIDUtils->ComputePID(cluster->E(),cluster->GetM02());
Float_t pidlist[AliPID::kSPECIESN+1];
for(Int_t i = 0; i < AliPID::kSPECIESN+1; i++) pidlist[i] = fPIDUtils->GetPIDFinal(i);
-
+
cluster->SetPID(pidlist);
-
}
-//____________________________________________________________________________
-void AliEMCALRecoUtils::RecalculateClusterShowerShapeParameters(AliEMCALGeometry * geom, AliVCaloCells* cells, AliVCluster * cluster)
+//____________________________________________________________________________________________
+void AliEMCALRecoUtils::RecalculateClusterShowerShapeParameters(const AliEMCALGeometry * geom,
+ AliVCaloCells* cells,
+ AliVCluster * cluster)
{
// Calculates new center of gravity in the local EMCAL-module coordinates
// and tranfers into global ALICE coordinates
fraction = cluster->GetCellAmplitudeFraction(iDigit);
if(fraction < 1e-4) fraction = 1.; // in case unfolding is off
- if(!fCellsRecalibrated){
-
+ if (!fCellsRecalibrated){
if(IsRecalibrationOn()) {
recalFactor = GetEMCALChannelRecalibrationFactor(iSupMod,ieta,iphi);
}
-
}
eCell = cells->GetCellAmplitude(cluster->GetCellAbsId(iDigit))*fraction*recalFactor;
zmean+= w * phii ;
dxz += w * etai * phii ;
}
- }
- else
+ } else
AliError(Form("Wrong energy %f and/or amplitude %f\n", eCell, cluster->E()));
}//cell loop
//Get the cell energy, if recalibration is on, apply factors
fraction = cluster->GetCellAmplitudeFraction(iDigit);
if(fraction < 1e-4) fraction = 1.; // in case unfolding is off
- if(IsRecalibrationOn()) {
+ if (IsRecalibrationOn()) {
recalFactor = GetEMCALChannelRecalibrationFactor(iSupMod,ieta,iphi);
}
eCell = cells->GetCellAmplitude(cluster->GetCellAbsId(iDigit))*fraction*recalFactor;
}
//____________________________________________________________________________
-void AliEMCALRecoUtils::FindMatches(AliVEvent *event,TObjArray * clusterArr, AliEMCALGeometry *geom)
+void AliEMCALRecoUtils::FindMatches(AliVEvent *event,
+ TObjArray * clusterArr,
+ const AliEMCALGeometry *geom)
{
//This function should be called before the cluster loop
//Before call this function, please recalculate the cluster positions
//Given the input event, loop over all the tracks, select the closest cluster as matched with fCutR
//Store matched cluster indexes and residuals
- fMatchedTrackIndex->Reset();
+ fMatchedTrackIndex ->Reset();
fMatchedClusterIndex->Reset();
fResidualPhi->Reset();
fResidualEta->Reset();
- fMatchedTrackIndex->Set(500);
- fMatchedClusterIndex->Set(500);
- fResidualPhi->Set(500);
- fResidualEta->Set(500);
+ fMatchedTrackIndex ->Set(1000);
+ fMatchedClusterIndex->Set(1000);
+ fResidualPhi->Set(1000);
+ fResidualEta->Set(1000);
AliESDEvent* esdevent = dynamic_cast<AliESDEvent*> (event);
AliAODEvent* aodevent = dynamic_cast<AliAODEvent*> (event);
+ // init the magnetic field if not already on
+ if(!TGeoGlobalMagField::Instance()->GetField()){
+ AliInfo("Init the magnetic field\n");
+ if (esdevent)
+ {
+ esdevent->InitMagneticField();
+ }
+ else if(aodevent)
+ {
+ Double_t curSol = 30000*aodevent->GetMagneticField()/5.00668;
+ Double_t curDip = 6000 *aodevent->GetMuonMagFieldScale();
+ AliMagF *field = AliMagF::CreateFieldMap(curSol,curDip);
+ TGeoGlobalMagField::Instance()->SetField(field);
+ }
+ else
+ {
+ AliInfo("Mag Field not initialized, null esd/aod evetn pointers");
+ }
+
+ } // Init mag field
+
TObjArray *clusterArray = 0x0;
if(!clusterArr)
{
continue;
}
- if(esdevent)
- {
- esdTrack->SetOuterParam(&emcalParam,AliExternalTrackParam::kMultSec);
- }
+// if(esdevent)
+// {
+// esdTrack->SetOuterParam(&emcalParam,AliExternalTrackParam::kMultSec);
+// }
if(TMath::Abs(eta)>0.75 || (phi) < 70*TMath::DegToRad() || (phi) > 190*TMath::DegToRad())
{
}
//________________________________________________________________________________
-Int_t AliEMCALRecoUtils::FindMatchedClusterInEvent(AliESDtrack *track, AliVEvent *event, AliEMCALGeometry *geom, Float_t &dEta, Float_t &dPhi)
+Int_t AliEMCALRecoUtils::FindMatchedClusterInEvent(const AliESDtrack *track,
+ const AliVEvent *event,
+ const AliEMCALGeometry *geom,
+ Float_t &dEta, Float_t &dPhi)
{
//
// This function returns the index of matched cluster to input track
return index;
}
-//________________________________________________________________________________
-Int_t AliEMCALRecoUtils::FindMatchedClusterInClusterArr(AliExternalTrackParam *emcalParam, AliExternalTrackParam *trkParam, TObjArray * clusterArr, Float_t &dEta, Float_t &dPhi)
+//________________________________________________________________________________________
+Int_t AliEMCALRecoUtils::FindMatchedClusterInClusterArr(AliExternalTrackParam *emcalParam,
+ AliExternalTrackParam *trkParam,
+ TObjArray * clusterArr,
+ Float_t &dEta, Float_t &dPhi)
{
dEta=-999, dPhi=-999;
Float_t dRMax = fCutR, dEtaMax=fCutEta, dPhiMax=fCutPhi;
return index;
}
-//
-//------------------------------------------------------------------------------
-//
-Bool_t AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(AliExternalTrackParam *trkParam, Double_t emcalR, Double_t mass, Double_t step, Float_t &eta, Float_t &phi)
+//------------------------------------------------------------------------------------
+Bool_t AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(AliExternalTrackParam *trkParam,
+ const Double_t emcalR,
+ const Double_t mass,
+ const Double_t step,
+ Float_t &eta,
+ Float_t &phi)
{
+ //Extrapolate track to EMCAL surface
+
eta = -999, phi = -999;
if(!trkParam) return kFALSE;
if(!AliTrackerBase::PropagateTrackToBxByBz(trkParam, emcalR, mass, step, kTRUE, 0.8, -1)) return kFALSE;
return kTRUE;
}
-
-//
-//------------------------------------------------------------------------------
-//
-Bool_t AliEMCALRecoUtils::ExtrapolateTrackToPosition(AliExternalTrackParam *trkParam, Float_t *clsPos, Double_t mass, Double_t step, Float_t &tmpEta, Float_t &tmpPhi)
+//-----------------------------------------------------------------------------------
+Bool_t AliEMCALRecoUtils::ExtrapolateTrackToPosition(AliExternalTrackParam *trkParam,
+ const Float_t *clsPos,
+ Double_t mass,
+ Double_t step,
+ Float_t &tmpEta,
+ Float_t &tmpPhi)
{
//
//Return the residual by extrapolating a track param to a global position
return kTRUE;
}
-
-//
-//------------------------------------------------------------------------------
-Bool_t AliEMCALRecoUtils::ExtrapolateTrackToCluster(AliExternalTrackParam *trkParam, AliVCluster *cluster, Double_t mass, Double_t step, Float_t &tmpEta, Float_t &tmpPhi)
+//----------------------------------------------------------------------------------
+Bool_t AliEMCALRecoUtils::ExtrapolateTrackToCluster(AliExternalTrackParam *trkParam,
+ AliVCluster *cluster,
+ const Double_t mass,
+ const Double_t step,
+ Float_t &tmpEta,
+ Float_t &tmpPhi)
{
//
//Return the residual by extrapolating a track param to a cluster
return ExtrapolateTrackToPosition(trkParam, clsPos, mass, step, tmpEta, tmpPhi);
}
-//
-//------------------------------------------------------------------------------
-Bool_t AliEMCALRecoUtils::ExtrapolateTrackToCluster(AliExternalTrackParam *trkParam, AliVCluster *cluster, Float_t &tmpEta, Float_t &tmpPhi)
+//---------------------------------------------------------------------------------
+Bool_t AliEMCALRecoUtils::ExtrapolateTrackToCluster(AliExternalTrackParam *trkParam,
+ AliVCluster *cluster,
+ Float_t &tmpEta,
+ Float_t &tmpPhi)
{
//
//Return the residual by extrapolating a track param to a clusterfStepCluster
return ExtrapolateTrackToCluster(trkParam, cluster, fMass, fStepCluster, tmpEta, tmpPhi);
}
-
-//________________________________________________________________________________
-void AliEMCALRecoUtils::GetMatchedResiduals(Int_t clsIndex, Float_t &dEta, Float_t &dPhi)
+//_______________________________________________________________________
+void AliEMCALRecoUtils::GetMatchedResiduals(const Int_t clsIndex,
+ Float_t &dEta, Float_t &dPhi)
{
//Given a cluster index as in AliESDEvent::GetCaloCluster(clsIndex)
//Get the residuals dEta and dPhi for this cluster to the closest track
dEta = fResidualEta->At(FindMatchedPosForCluster(clsIndex));
dPhi = fResidualPhi->At(FindMatchedPosForCluster(clsIndex));
}
-//________________________________________________________________________________
+
+//______________________________________________________________________________________________
void AliEMCALRecoUtils::GetMatchedClusterResiduals(Int_t trkIndex, Float_t &dEta, Float_t &dPhi)
{
//Given a track index as in AliESDEvent::GetTrack(trkIndex)
Float_t tmpR = fCutR;
UInt_t pos = 999;
- for(Int_t i=0; i<fMatchedClusterIndex->GetSize(); i++)
- {
- if(fMatchedClusterIndex->At(i)==clsIndex)
- {
- Float_t r = TMath::Sqrt(fResidualEta->At(i)*fResidualEta->At(i) + fResidualPhi->At(i)*fResidualPhi->At(i));
- if(r<tmpR)
- {
- pos=i;
- tmpR=r;
- AliDebug(3,Form("Matched cluster index: index: %d, dEta: %2.4f, dPhi: %2.4f.\n",fMatchedClusterIndex->At(i),fResidualEta->At(i),fResidualPhi->At(i)));
- }
+ for(Int_t i=0; i<fMatchedClusterIndex->GetSize(); i++) {
+ if(fMatchedClusterIndex->At(i)==clsIndex) {
+ Float_t r = TMath::Sqrt(fResidualEta->At(i)*fResidualEta->At(i) + fResidualPhi->At(i)*fResidualPhi->At(i));
+ if(r<tmpR) {
+ pos=i;
+ tmpR=r;
+ AliDebug(3,Form("Matched cluster index: index: %d, dEta: %2.4f, dPhi: %2.4f.\n",fMatchedClusterIndex->At(i),fResidualEta->At(i),fResidualPhi->At(i)));
}
+ }
}
return pos;
}
Float_t tmpR = fCutR;
UInt_t pos = 999;
- for(Int_t i=0; i<fMatchedTrackIndex->GetSize(); i++)
- {
- if(fMatchedTrackIndex->At(i)==trkIndex)
- {
- Float_t r = TMath::Sqrt(fResidualEta->At(i)*fResidualEta->At(i) + fResidualPhi->At(i)*fResidualPhi->At(i));
- if(r<tmpR)
- {
- pos=i;
- tmpR=r;
- AliDebug(3,Form("Matched track index: index: %d, dEta: %2.4f, dPhi: %2.4f.\n",fMatchedTrackIndex->At(i),fResidualEta->At(i),fResidualPhi->At(i)));
- }
+ for(Int_t i=0; i<fMatchedTrackIndex->GetSize(); i++) {
+ if(fMatchedTrackIndex->At(i)==trkIndex) {
+ Float_t r = TMath::Sqrt(fResidualEta->At(i)*fResidualEta->At(i) + fResidualPhi->At(i)*fResidualPhi->At(i));
+ if(r<tmpR) {
+ pos=i;
+ tmpR=r;
+ AliDebug(3,Form("Matched track index: index: %d, dEta: %2.4f, dPhi: %2.4f.\n",fMatchedTrackIndex->At(i),fResidualEta->At(i),fResidualPhi->At(i)));
}
+ }
}
return pos;
}
-//___________________________________________________________________________________
-Bool_t AliEMCALRecoUtils::IsGoodCluster(AliVCluster *cluster, AliEMCALGeometry *geom,
+//__________________________________________________________________________
+Bool_t AliEMCALRecoUtils::IsGoodCluster(AliVCluster *cluster,
+ const AliEMCALGeometry *geom,
AliVCaloCells* cells,const Int_t bc)
{
// check if the cluster survives some quality cut
return kTRUE;
}
-
-//__________________________________________________
+//_____________________________________
void AliEMCALRecoUtils::InitTrackCuts()
{
//Intilize the track cut criteria
//Also you can customize the cuts using the setters
switch (fTrackCutsType)
- {
+ {
case kTPCOnlyCut:
- {
- AliInfo(Form("Track cuts for matching: GetStandardTPCOnlyTrackCuts()"));
- //TPC
- SetMinNClustersTPC(70);
- SetMaxChi2PerClusterTPC(4);
- SetAcceptKinkDaughters(kFALSE);
- SetRequireTPCRefit(kFALSE);
-
- //ITS
- SetRequireITSRefit(kFALSE);
- SetMaxDCAToVertexZ(3.2);
- SetMaxDCAToVertexXY(2.4);
- SetDCAToVertex2D(kTRUE);
-
- break;
- }
-
+ {
+ AliInfo(Form("Track cuts for matching: GetStandardTPCOnlyTrackCuts()"));
+ //TPC
+ SetMinNClustersTPC(70);
+ SetMaxChi2PerClusterTPC(4);
+ SetAcceptKinkDaughters(kFALSE);
+ SetRequireTPCRefit(kFALSE);
+
+ //ITS
+ SetRequireITSRefit(kFALSE);
+ SetMaxDCAToVertexZ(3.2);
+ SetMaxDCAToVertexXY(2.4);
+ SetDCAToVertex2D(kTRUE);
+
+ break;
+ }
+
case kGlobalCut:
- {
- AliInfo(Form("Track cuts for matching: GetStandardITSTPCTrackCuts2010(kTURE)"));
- //TPC
- SetMinNClustersTPC(70);
- SetMaxChi2PerClusterTPC(4);
- SetAcceptKinkDaughters(kFALSE);
- SetRequireTPCRefit(kTRUE);
-
- //ITS
- SetRequireITSRefit(kTRUE);
- SetMaxDCAToVertexZ(2);
- SetMaxDCAToVertexXY();
- SetDCAToVertex2D(kFALSE);
-
- break;
- }
-
+ {
+ AliInfo(Form("Track cuts for matching: GetStandardITSTPCTrackCuts2010(kTURE)"));
+ //TPC
+ SetMinNClustersTPC(70);
+ SetMaxChi2PerClusterTPC(4);
+ SetAcceptKinkDaughters(kFALSE);
+ SetRequireTPCRefit(kTRUE);
+
+ //ITS
+ SetRequireITSRefit(kTRUE);
+ SetMaxDCAToVertexZ(2);
+ SetMaxDCAToVertexXY();
+ SetDCAToVertex2D(kFALSE);
+
+ break;
+ }
+
case kLooseCut:
- {
- AliInfo(Form("Track cuts for matching: Loose cut w/o DCA cut"));
- SetMinNClustersTPC(50);
- SetAcceptKinkDaughters(kTRUE);
-
- break;
- }
+ {
+ AliInfo(Form("Track cuts for matching: Loose cut w/o DCA cut"));
+ SetMinNClustersTPC(50);
+ SetAcceptKinkDaughters(kTRUE);
+
+ break;
}
+ }
}
-//__________________________________________________________________
-void AliEMCALRecoUtils::SetClusterMatchedToTrack(AliESDEvent *event)
+//________________________________________________________________________
+void AliEMCALRecoUtils::SetClusterMatchedToTrack(const AliESDEvent *event)
{
// Checks if tracks are matched to EMC clusters and set the matched EMCAL cluster index to ESD track.
else
track->ResetStatus(AliESDtrack::kEMCALmatch);
}
- AliDebug(2,"Track matched to closest cluster");
+ AliDebug(2,"Track matched to closest cluster");
}
-//_________________________________________________________________
-void AliEMCALRecoUtils::SetTracksMatchedToCluster(AliESDEvent *event)
+//_________________________________________________________________________
+void AliEMCALRecoUtils::SetTracksMatchedToCluster(const AliESDEvent *event)
{
// Checks if EMC clusters are matched to ESD track.
// Adds track indexes of all the tracks matched to a cluster withing residuals in ESDCalocluster.
cluster->SetTrackDistance(phi, eta);
}
- AliDebug(2,"Cluster matched to tracks");
+ AliDebug(2,"Cluster matched to tracks");
}
printf("MinNCulsterTPC = %d, MinNClusterITS = %d\n",fCutMinNClusterTPC,fCutMinNClusterITS);
printf("MaxChi2TPC = %2.2f, MaxChi2ITS = %2.2f\n",fCutMaxChi2PerClusterTPC,fCutMaxChi2PerClusterITS);
printf("DCSToVertex2D = %d, MaxDCAToVertexXY = %2.2f, MaxDCAToVertexZ = %2.2f\n",fCutDCAToVertex2D,fCutMaxDCAToVertexXY,fCutMaxDCAToVertexZ);
-
}
//_____________________________________________________________________
-void AliEMCALRecoUtils::SetRunDependentCorrections(Int_t runnumber){
+void AliEMCALRecoUtils::SetRunDependentCorrections(Int_t runnumber)
+{
//Get EMCAL time dependent corrections from file and put them in the recalibration histograms
//Do it only once and only if it is requested
}
}
}
- fRunCorrectionFactorsSet = kTRUE;
+ fRunCorrectionFactorsSet = kTRUE;
}
-