1 //_________________________________________________________________________
2 // Utility Class for transverse energy studies
3 // Selection class for EMCAL
5 //*-- Authors: Oystein Djuvsland (Bergen)
6 //_________________________________________________________________________
9 #include "AliAnalysisEtSelectorEmcal.h"
10 #include "AliAnalysisEtCuts.h"
11 #include "AliEMCALTrack.h"
12 #include "TParticle.h"
14 AliAnalysisEtSelectorEmcal::AliAnalysisEtSelectorEmcal(AliAnalysisEtCuts* cuts):AliAnalysisEtSelector(cuts)
18 AliAnalysisEtSelectorEmcal::AliAnalysisEtSelectorEmcal():AliAnalysisEtSelector()
22 AliAnalysisEtSelectorEmcal::~AliAnalysisEtSelectorEmcal()
27 void AliAnalysisEtSelectorEmcal::Init()
29 AliAnalysisEtSelector::Init();
32 Int_t AliAnalysisEtSelectorEmcal::Init(const AliESDEvent* event)
35 AliAnalysisEtSelector::Init(event);
36 Printf("Initializing selector for run: %d", event->GetRunNumber());
41 TRefArray* AliAnalysisEtSelectorEmcal::GetClusters()
44 if(!fClusterArray) fClusterArray = new TRefArray;
48 fEvent->GetEMCALClusters(fClusterArray);
52 Printf("Could not initialize cluster array");
57 Bool_t AliAnalysisEtSelectorEmcal::PassMinEnergyCut(const AliESDCaloCluster& cl) const
62 return TMath::Sin(cp.Theta())*cl.E() > fCuts->GetReconstructedEmcalClusterEnergyCut();
65 Bool_t AliAnalysisEtSelectorEmcal::PassMinEnergyCut(const TParticle& p) const
67 return TMath::Sin(p.Theta())*p.Energy() > fCuts->GetReconstructedEmcalClusterEnergyCut();
70 Bool_t AliAnalysisEtSelectorEmcal::PassDistanceToBadChannelCut(const AliESDCaloCluster& ) const
75 Bool_t AliAnalysisEtSelectorEmcal::PassTrackMatchingCut(const AliESDCaloCluster& cluster) const
78 Int_t nTracksMatched = cluster.GetNTracksMatched();
79 if(nTracksMatched == 0){
83 Int_t trackMatchedIndex = cluster.GetTrackMatchedIndex();
84 if(trackMatchedIndex < 0){
87 AliVParticle *track = fEvent->GetTrack(trackMatchedIndex);
88 if(track->Pt()<0.5) return kTRUE;//Track matches below about 500 MeV are mostly random. It takes ~460 MeV to reach the EMCal
90 //Float_t recoE = cluster.E();
93 // //cluster.GetPosition(pos);
94 // Int_t trackMatchIdx = cluster.GetTrackMatchedIndex();
95 // //Double_t distance = 9999.0;
96 // if(trackMatchIdx>-1)
99 // //distance = CalcTrackClusterDistance(pos, &trackMatchIdx);
104 //return distance > fCuts->GetEmcalTrackDistanceCut();
107 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const TParticle& part)
109 float myphi = part.Phi();
110 myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
111 return TMath::Abs(part.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
112 && myphi < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
113 && myphi > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
116 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const AliVTrack& part)
118 float myphi = part.Phi();
119 myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
120 return TMath::Abs(part.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
121 && myphi < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
122 && myphi > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
125 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const AliESDCaloCluster& cluster)
128 cluster.GetPosition(pos);
130 float myphi = cp.Phi();
131 myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
132 return TMath::Abs(cp.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
133 && myphi < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
134 && myphi > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
139 AliAnalysisEtSelectorEmcal::CalcTrackClusterDistance(const Float_t clsPos[3],Int_t *trkMatchId) const
140 { // calculate distance between cluster and closest track
142 Double_t trkPos[3] = {0,0,0};
144 Int_t bestTrkMatchId = -1;
145 Double_t distance = 9999; // init to a big number
148 Double_t distX = 0, distY = 0, distZ = 0;
150 for (Int_t iTrack = 0; iTrack < fEvent->GetNumberOfTracks(); iTrack++) {
151 AliESDtrack *track = static_cast<AliESDtrack*>( fEvent->GetTrack(iTrack) );
153 AliError(Form("ERROR: Could not get track %d", iTrack));
157 // check for approx. eta and phi range before we propagate..
160 AliEMCALTrack emctrack(*track);
161 if (!emctrack.PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) ) {
164 emctrack.GetXYZ(trkPos);
166 distX = clsPos[0]-trkPos[0];
167 distY = clsPos[1]-trkPos[1];
168 distZ = clsPos[2]-trkPos[2];
169 dist = TMath::Sqrt(distX*distX + distY*distY + distZ*distZ);
171 if (dist < distance) {
173 bestTrkMatchId = iTrack;
177 // printf("CalcTrackClusterDistance: bestTrkMatch %d origTrkMatch %d distance %f\n", bestTrkMatchId, *trkMatchId, distance);
178 *trkMatchId = bestTrkMatchId;