1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Friederike Bock, Baldo Sahlmueller *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // Class handling all kinds of selection cuts for
19 // Photon from EMCAL clusters
20 //---------------------------------------------
21 ////////////////////////////////////////////////
23 #include "AliCaloPhotonCuts.h"
24 #include "AliAnalysisManager.h"
25 #include "AliInputEventHandler.h"
26 #include "AliMCEventHandler.h"
27 #include "AliAODHandler.h"
32 #include "AliAODConversionMother.h"
33 #include "AliAODConversionPhoton.h"
34 #include "TObjString.h"
35 #include "AliAODEvent.h"
36 #include "AliESDEvent.h"
37 #include "AliCentrality.h"
41 #include "AliV0ReaderV1.h"
42 #include "AliAODMCParticle.h"
43 #include "AliAODMCHeader.h"
44 #include "AliPicoTrack.h"
45 #include "AliEMCALRecoUtils.h"
46 #include "AliTrackerBase.h"
52 ClassImp(AliCaloPhotonCuts)
55 const char* AliCaloPhotonCuts::fgkCutNames[AliCaloPhotonCuts::kNCuts] = {
56 "ClusterType", //0 0: all, 1: EMCAL, 2: PHOS
57 "EtaMin", //1 0: -10, 1: -0.6687, 2: -0,5, 3: -2
58 "EtaMax", //2 0: 10, 1: 0.66465, 2: 0.5, 3: 2
59 "PhiMin", //3 0: -10000, 1: 1.39626
60 "PhiMax", //4 0: 10000, 1: 3.125
61 "DistanceToBadChannel", //5 0: 0, 1: 5
62 "Timing", //6 0: no cut
63 "TrackMatching", //7 0: 0, 1: 5
64 "ExoticCell", //8 0: no cut
65 "MinEnergy", //9 0: no cut, 1: 0.05, 2: 0.1, 3: 0.15, 4: 0.2, 5: 0.3, 6: 0.5, 7: 0.75, 8: 1, 9: 1.25 (all GeV)
66 "MinNCells", //10 0: no cut, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6
71 "MaximumDispersion", //15
76 //________________________________________________________________________
77 AliCaloPhotonCuts::AliCaloPhotonCuts(const char *name,const char *title) :
78 AliAnalysisCuts(name,title),
87 fMinDistanceToBadChannel(0),
88 fUseDistanceToBadChannel(0),
91 fMinDistTrackToCluster(0),
92 fUseDistTrackToCluster(0),
105 fMaxDispersion(1000),
112 fHistAcceptanceCuts(NULL),
113 fHistClusterIdentificationCuts(NULL),
114 fHistClusterEtavsPhiBeforeAcc(NULL),
115 fHistClusterEtavsPhiAfterAcc(NULL),
116 fHistClusterEtavsPhiAfterQA(NULL),
117 //fHistDistanceToBadChannelBeforeAcc(NULL),
118 //fHistDistanceToBadChannelAfterAcc(NULL),
119 fHistClusterTimevsEBeforeQA(NULL),
120 fHistClusterTimevsEAfterQA(NULL),
121 //fHistExoticCellBeforeQA(NULL),
122 //fHistExoticCellAfterQA(NULL),
123 //fHistNMatchedTracks(NULL),
124 fHistEnergyOfClusterBeforeQA(NULL),
125 fHistEnergyOfClusterAfterQA(NULL),
126 fHistNCellsBeforeQA(NULL),
127 fHistNCellsAfterQA(NULL),
128 fHistM02BeforeQA(NULL),
129 fHistM02AfterQA(NULL),
130 fHistM20BeforeQA(NULL),
131 fHistM20AfterQA(NULL),
132 fHistDispersionBeforeQA(NULL),
133 fHistDispersionAfterQA(NULL),
134 //fHistNLMBeforeQA(NULL),
135 //fHistNLMAfterQA(NULL),
136 fHistClusterRBeforeQA(NULL),
137 fHistClusterRAfterQA(NULL),
138 fHistClusterdEtadPhiPosTracksBeforeQA(NULL),
139 fHistClusterdEtadPhiNegTracksBeforeQA(NULL),
140 fHistClusterdEtadPhiAfterQA(NULL),
141 fHistDistanceTrackToClusterBeforeQA(NULL),
142 fHistDistanceTrackToClusterAfterQA(NULL)
144 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
145 fCutString=new TObjString((GetCutNumber()).Data());
148 //________________________________________________________________________
149 AliCaloPhotonCuts::AliCaloPhotonCuts(const AliCaloPhotonCuts &ref) :
150 AliAnalysisCuts(ref),
152 fClusterType(ref.fClusterType),
153 fMinEtaCut(ref.fMinEtaCut),
154 fMaxEtaCut(ref.fMaxEtaCut),
155 fUseEtaCut(ref.fUseEtaCut),
156 fMinPhiCut(ref.fMinPhiCut),
157 fMaxPhiCut(ref.fMaxPhiCut),
158 fUsePhiCut(ref.fUsePhiCut),
159 fMinDistanceToBadChannel(ref.fMinDistanceToBadChannel),
160 fUseDistanceToBadChannel(ref.fUseDistanceToBadChannel),
161 fMaxTimeDiff(ref.fMaxTimeDiff),
162 fUseTimeDiff(ref.fUseTimeDiff),
163 fMinDistTrackToCluster(ref.fMinDistTrackToCluster),
164 fUseDistTrackToCluster(ref.fUseDistTrackToCluster),
165 fExoticCell(ref.fExoticCell),
166 fUseExoticCell(ref.fUseExoticCell),
167 fMinEnergy(ref.fMinEnergy),
168 fUseMinEnergy(ref.fUseMinEnergy),
169 fMinNCells(ref.fMinNCells),
170 fUseNCells(ref.fUseNCells),
171 fMaxM02(ref.fMaxM02),
172 fMinM02(ref.fMinM02),
173 fUseM02(ref.fUseM02),
174 fMaxM20(ref.fMaxM20),
175 fMinM20(ref.fMinM20),
176 fUseM20(ref.fUseDispersion),
177 fMaxDispersion(ref.fMaxDispersion),
178 fUseDispersion(ref.fUseDispersion),
179 fMinNLM(ref.fMinNLM),
180 fMaxNLM(ref.fMaxNLM),
181 fUseNLM(ref.fUseNLM),
184 fHistAcceptanceCuts(NULL),
185 fHistClusterIdentificationCuts(NULL),
186 fHistClusterEtavsPhiBeforeAcc(NULL),
187 fHistClusterEtavsPhiAfterAcc(NULL),
188 fHistClusterEtavsPhiAfterQA(NULL),
189 //fHistDistanceToBadChannelBeforeAcc(NULL),
190 //fHistDistanceToBadChannelAfterAcc(NULL),
191 fHistClusterTimevsEBeforeQA(NULL),
192 fHistClusterTimevsEAfterQA(NULL),
193 //fHistExoticCellBeforeQA(NULL),
194 //fHistExoticCellAfterQA(NULL),
195 //fHistNMatchedTracks(NULL),
196 fHistEnergyOfClusterBeforeQA(NULL),
197 fHistEnergyOfClusterAfterQA(NULL),
198 fHistNCellsBeforeQA(NULL),
199 fHistNCellsAfterQA(NULL),
200 fHistM02BeforeQA(NULL),
201 fHistM02AfterQA(NULL),
202 fHistM20BeforeQA(NULL),
203 fHistM20AfterQA(NULL),
204 fHistDispersionBeforeQA(NULL),
205 fHistDispersionAfterQA(NULL),
206 //fHistNLMBeforeQA(NULL),
207 //fHistNLMAfterQA(NULL),
208 fHistClusterRBeforeQA(NULL),
209 fHistClusterRAfterQA(NULL),
210 fHistClusterdEtadPhiPosTracksBeforeQA(NULL),
211 fHistClusterdEtadPhiNegTracksBeforeQA(NULL),
212 fHistClusterdEtadPhiAfterQA(NULL),
213 fHistDistanceTrackToClusterBeforeQA(NULL),
214 fHistDistanceTrackToClusterAfterQA(NULL)
217 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
218 fCutString=new TObjString((GetCutNumber()).Data());
223 //________________________________________________________________________
224 AliCaloPhotonCuts::~AliCaloPhotonCuts() {
226 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
228 // delete fHistograms;
229 // fHistograms = NULL;
230 if(fCutString != NULL){
236 //________________________________________________________________________
237 void AliCaloPhotonCuts::InitCutHistograms(TString name){
239 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
240 TH1::AddDirectory(kFALSE);
242 if(fHistograms != NULL){
246 if(fHistograms==NULL){
247 fHistograms=new TList();
248 fHistograms->SetOwner(kTRUE);
249 if(name=="")fHistograms->SetName(Form("CaloCuts_%s",GetCutNumber().Data()));
250 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
254 fHistCutIndex=new TH1F(Form("IsPhotonSelected %s",GetCutNumber().Data()),"IsPhotonSelected",5,-0.5,4.5);
255 fHistCutIndex->GetXaxis()->SetBinLabel(kPhotonIn+1,"in");
256 fHistCutIndex->GetXaxis()->SetBinLabel(kDetector+1,"detector");
257 fHistCutIndex->GetXaxis()->SetBinLabel(kAcceptance+1,"acceptance");
258 fHistCutIndex->GetXaxis()->SetBinLabel(kClusterQuality+1,"cluster QA");
259 fHistCutIndex->GetXaxis()->SetBinLabel(kPhotonOut+1,"out");
260 fHistograms->Add(fHistCutIndex);
263 fHistAcceptanceCuts=new TH1F(Form("AcceptanceCuts %s",GetCutNumber().Data()),"AcceptanceCuts",5,-0.5,4.5);
264 fHistAcceptanceCuts->GetXaxis()->SetBinLabel(1,"in");
265 fHistAcceptanceCuts->GetXaxis()->SetBinLabel(2,"eta");
266 fHistAcceptanceCuts->GetXaxis()->SetBinLabel(3,"phi");
267 fHistAcceptanceCuts->GetXaxis()->SetBinLabel(4,"distance to bad channel");
268 fHistAcceptanceCuts->GetXaxis()->SetBinLabel(5,"out");
269 fHistograms->Add(fHistAcceptanceCuts);
272 fHistClusterIdentificationCuts =new TH1F(Form("ClusterQualityCuts %s",GetCutNumber().Data()),"ClusterQualityCuts",11,-0.5,10.5);
273 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(1,"in");
274 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(2,"timing");
275 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(3,"track matching");
276 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(4,"Exotics");
277 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(5,"minimum energy");
278 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(6,"minimum NCells");
279 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(7,"M02");
280 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(8,"M20");
281 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(9,"dispersion");
282 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(10,"NLM");
283 fHistClusterIdentificationCuts->GetXaxis()->SetBinLabel(11,"out");
284 fHistograms->Add(fHistClusterIdentificationCuts);
286 // Acceptance related histogramms
287 fHistClusterEtavsPhiBeforeAcc=new TH2F(Form("EtaPhi_beforeAcceptance %s",GetCutNumber().Data()),"EtaPhi_beforeAcceptance",462,-TMath::Pi(),TMath::Pi(),110,-0.7,0.7);
288 fHistograms->Add(fHistClusterEtavsPhiBeforeAcc);
289 fHistClusterEtavsPhiAfterAcc=new TH2F(Form("EtaPhi_afterAcceptance %s",GetCutNumber().Data()),"EtaPhi_afterAcceptance",462,-TMath::Pi(),TMath::Pi(),110,-0.7,0.7);
290 fHistograms->Add(fHistClusterEtavsPhiAfterAcc);
291 fHistClusterEtavsPhiAfterQA=new TH2F(Form("EtaPhi_afterClusterQA %s",GetCutNumber().Data()),"EtaPhi_afterClusterQA",462,-TMath::Pi(),TMath::Pi(),110,-0.7,0.7);
292 fHistograms->Add(fHistClusterEtavsPhiAfterQA);
293 //fHistDistanceToBadChannelBeforeAcc = new TH1F(Form("DistanceToBadChannel_beforeAcceptance %s",GetCutNumber().Data()),"DistanceToBadChannel_beforeAcceptance",200,0,40);
294 //fHistograms->Add(fHistDistanceToBadChannelBeforeAcc);
295 //fHistDistanceToBadChannelAfterAcc = new TH1F(Form("DistanceToBadChannel_afterAcceptance %s",GetCutNumber().Data()),"DistanceToBadChannel_afterAcceptance",200,0,40);
296 //fHistograms->Add(fHistDistanceToBadChannelAfterAcc);
298 // Cluster quality related histograms
299 fHistClusterTimevsEBeforeQA=new TH2F(Form("ClusterTimeVsE_beforeClusterQA %s",GetCutNumber().Data()),"ClusterTimeVsE_beforeClusterQA",400,-10e-6,10e-6,100,0.,40);
300 fHistograms->Add(fHistClusterTimevsEBeforeQA);
301 fHistClusterTimevsEAfterQA=new TH2F(Form("ClusterTimeVsE_afterClusterQA %s",GetCutNumber().Data()),"ClusterTimeVsE_afterClusterQA",400,-10e-6,10e-6,100,0.,40);
302 fHistograms->Add(fHistClusterTimevsEAfterQA);
303 //fHistExoticCellBeforeQA=new TH2F(Form("ExoticCell_beforeClusterQA %s",GetCutNumber().Data()),"ExoticCell_beforeClusterQA",400,0,40,50,0.75,1);
304 //fHistograms->Add(fHistExoticCellBeforeQA);
305 //fHistExoticCellAfterQA=new TH2F(Form("ExoticCell_afterClusterQA %s",GetCutNumber().Data()),"ExoticCell_afterClusterQA",400,0,40,50,0.75,1);
306 //fHistograms->Add(fHistExoticCellAfterQA);
307 //fHistNMatchedTracks = new TH1F(Form("NMatchedTracks_%s",GetCutNumber().Data()),"NMatchedTracks",22,-1.5,20.5);
308 //fHistograms->Add(fHistNMatchedTracks);
309 fHistEnergyOfClusterBeforeQA = new TH1F(Form("EnergyOfCluster_beforeClusterQA %s",GetCutNumber().Data()),"EnergyOfCluster_beforeClusterQA",300,0,30);
310 fHistograms->Add(fHistEnergyOfClusterBeforeQA);
311 fHistEnergyOfClusterAfterQA = new TH1F(Form("EnergyOfCluster_afterClusterQA %s",GetCutNumber().Data()),"EnergyOfCluster_afterClusterQA",300,0,30);
312 fHistograms->Add(fHistEnergyOfClusterAfterQA);
313 fHistNCellsBeforeQA = new TH1F(Form("NCellPerCluster_beforeClusterQA %s",GetCutNumber().Data()),"NCellPerCluster_beforeClusterQA",50,0,50);
314 fHistograms->Add(fHistNCellsBeforeQA);
315 fHistNCellsAfterQA = new TH1F(Form("NCellPerCluster_afterClusterQA %s",GetCutNumber().Data()),"NCellPerCluster_afterClusterQA",50,0,50);
316 fHistograms->Add(fHistNCellsAfterQA);
317 fHistM02BeforeQA = new TH1F(Form("M02_beforeClusterQA %s",GetCutNumber().Data()),"M02_beforeClusterQA",400,0,5);
318 fHistograms->Add(fHistM02BeforeQA);
319 fHistM02AfterQA = new TH1F(Form("M02_afterClusterQA %s",GetCutNumber().Data()),"M02_afterClusterQA",400,0,5);
320 fHistograms->Add(fHistM02AfterQA);
321 fHistM20BeforeQA = new TH1F(Form("M20_beforeClusterQA %s",GetCutNumber().Data()),"M20_beforeClusterQA",400,0,2.5);
322 fHistograms->Add(fHistM20BeforeQA);
323 fHistM20AfterQA = new TH1F(Form("M20_afterClusterQA %s",GetCutNumber().Data()),"M20_afterClusterQA",400,0,2.5);
324 fHistograms->Add(fHistM20AfterQA);
325 fHistDispersionBeforeQA = new TH1F(Form("Dispersion_beforeClusterQA %s",GetCutNumber().Data()),"Dispersion_beforeClusterQA",100,0,4);
326 fHistograms->Add(fHistDispersionBeforeQA);
327 fHistDispersionAfterQA = new TH1F(Form("Dispersion_afterClusterQA %s",GetCutNumber().Data()),"Dispersion_afterClusterQA",100,0,4);
328 fHistograms->Add(fHistDispersionAfterQA);
329 //fHistNLMBeforeQA = new TH1F(Form("NLM_beforeClusterQA %s",GetCutNumber().Data()),"NLM_beforeClusterQA",10,0,10);
330 //fHistograms->Add(fHistNLMBeforeQA);
331 //fHistNLMAfterQA = new TH1F(Form("NLM_afterClusterQA %s",GetCutNumber().Data()),"NLM_afterClusterQA",10,0,10);
332 //fHistograms->Add(fHistNLMAfterQA);
334 //TrackMatching histograms
335 if(fUseDistTrackToCluster) {
336 fHistClusterRBeforeQA = new TH1F(Form("R_Cluster_beforeClusterQA %s",GetCutNumber().Data()),"R of cluster",200,400,500);
337 fHistograms->Add(fHistClusterRBeforeQA);
338 fHistClusterRAfterQA = new TH1F(Form("R_Cluster_afterClusterQA %s",GetCutNumber().Data()),"R of cluster_matched",200,400,500);
339 fHistograms->Add(fHistClusterRAfterQA);
340 fHistClusterdEtadPhiPosTracksBeforeQA=new TH2F(Form("dEtaVsdPhi_posTracks_beforeClusterQA %s",GetCutNumber().Data()),"dEtaVsdPhi_posTracks_beforeClusterQA",240,-0.3,0.3,240,-0.3,0.3);
341 fHistograms->Add(fHistClusterdEtadPhiPosTracksBeforeQA);
342 fHistClusterdEtadPhiNegTracksBeforeQA=new TH2F(Form("dEtaVsdPhi_negTracks_beforeClusterQA %s",GetCutNumber().Data()),"dEtaVsdPhi_negTracks_beforeClusterQA",240,-0.3,0.3,240,-0.3,0.3);
343 fHistograms->Add(fHistClusterdEtadPhiNegTracksBeforeQA);
344 fHistClusterdEtadPhiAfterQA=new TH2F(Form("dEtaVsdPhi_afterClusterQA %s",GetCutNumber().Data()),"dEtaVsdPhi_afterClusterQA",240,-0.3,0.3,240,-0.3,0.3);
345 fHistograms->Add(fHistClusterdEtadPhiAfterQA);
346 fHistDistanceTrackToClusterBeforeQA = new TH1F(Form("DistanceToTrack_beforeClusterQA %s",GetCutNumber().Data()),"DistanceToTrack_beforeClusterQA",200,0,2);
347 fHistograms->Add(fHistDistanceTrackToClusterBeforeQA);
348 fHistDistanceTrackToClusterAfterQA = new TH1F(Form("DistanceToTrack_afterClusterQA %s",GetCutNumber().Data()),"DistanceToTrack_afterClusterQA",200,0,2);
349 fHistograms->Add(fHistDistanceTrackToClusterAfterQA);
352 TH1::AddDirectory(kTRUE);
356 ///________________________________________________________________________
357 Bool_t AliCaloPhotonCuts::ClusterIsSelectedMC(TParticle *particle,AliStack *fMCStack){
358 // MonteCarlo Photon Selection
360 if(!fMCStack)return kFALSE;
362 if (particle->GetPdgCode() == 22){
364 if ( particle->Eta() < fMinEtaCut || particle->Eta() > fMaxEtaCut ) return kFALSE;
365 if ( particle->Phi() < fMinPhiCut || particle->Phi() > fMaxPhiCut ) return kFALSE;
367 if(particle->GetMother(0) >-1 && fMCStack->Particle(particle->GetMother(0))->GetPdgCode() == 22){
368 return kFALSE; // no photon as mothers!
370 if(particle->GetMother(0) >= fMCStack->GetNprimary()){
371 return kFALSE; // the gamma has a mother, and it is not a primary particle
377 ///________________________________________________________________________
378 Bool_t AliCaloPhotonCuts::ClusterIsSelectedAODMC(AliAODMCParticle *particle,TClonesArray *aodmcArray){
379 // MonteCarlo Photon Selection
381 if(!aodmcArray)return kFALSE;
382 if (particle->GetPdgCode() == 22){
383 if ( particle->Eta() < fMinEtaCut || particle->Eta() > fMaxEtaCut ) return kFALSE;
384 if ( particle->Phi() < fMinPhiCut || particle->Phi() > fMaxPhiCut ) return kFALSE;
385 if(particle->GetMother() > -1){
386 if((static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother())))->GetPdgCode() == 22){
387 return kFALSE; // no photon as mothers!
389 if(!(static_cast<AliAODMCParticle*>(aodmcArray->At(particle->GetMother()))->IsPrimary())){
390 return kFALSE; // the gamma has a mother, and it is not a primary particle
393 return kTRUE; // return in case of accepted gamma
400 ///________________________________________________________________________
401 // This function selects the clusters based on their quality criteria
402 ///________________________________________________________________________
403 Bool_t AliCaloPhotonCuts::ClusterQualityCuts(AliVCluster* cluster, AliVEvent *event, Bool_t isMC)
404 { // Specific Photon Cuts
407 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex);
410 // Double_t minR = 999.0;
411 // get the minimum radius of tracks to cluster
412 // if(fHistDistanceTrackToClusterBeforeQA || fHistDistanceTrackToClusterAfterQA){
414 // cluster->GetPosition(pos); // Get cluster position
417 // int NtrMatched = 0;
418 // NtrMatched = cluster->GetNTracksMatched();
419 // fHistNMatchedTracks->Fill(NtrMatched);
420 // //loop over tracks for Jet QA
421 // TList *l = event->GetList();
422 // TClonesArray *tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
423 // for(int itrack = 0; itrack < NtrMatched; itrack++){
424 // AliVTrack *trackcluster = static_cast<AliVTrack*>(tracks->At(itrack));
425 // if (! trackcluster) {
426 // AliError(Form("Couldn't get ESD track %d\n", itrack));
429 // Double_t dphi = -999.0;
430 // Double_t deta = -999.0;
431 // AliPicoTrack::GetEtaPhiDiff(trackcluster, cluster, dphi, deta);
432 // cout << "here" << endl;
433 // Double_t dr = sqrt(dphi*dphi + deta+deta);
436 // }//loop over tracks
439 // Fill Histos before Cuts
440 if(fHistClusterTimevsEBeforeQA) fHistClusterTimevsEBeforeQA->Fill(cluster->GetTOF(), cluster->E());
441 // if(fHistExoticCellBeforeQA) fHistExoticCellBeforeQA->Fill(cluster->E(), );
442 // if(fHistDistanceTrackToClusterBeforeQA) fHistDistanceTrackToClusterBeforeQA->Fill(minR);
443 if(fHistEnergyOfClusterBeforeQA) fHistEnergyOfClusterBeforeQA->Fill(cluster->E());
444 if(fHistNCellsBeforeQA) fHistNCellsBeforeQA->Fill(cluster->GetNCells());
445 if(fHistM02BeforeQA) fHistM02BeforeQA->Fill(cluster->GetM02());
446 if(fHistM20BeforeQA) fHistM20BeforeQA->Fill(cluster->GetM20());
447 if(fHistDispersionBeforeQA) fHistDispersionBeforeQA->Fill(cluster->GetDispersion());
448 // if(fHistNLMBeforeQA) fHistNLMBeforeQA->Fill(cluster->GetNExMax());
450 // Check wether timing is ok
452 if(abs(cluster->GetTOF()) > fMaxTimeDiff && !isMC){
453 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //1
457 cutIndex++; //2, next cut
459 // Minimum distance to track
460 // if (fUseDistTrackToCluster){
462 // cluster->GetPosition(pos); // Get cluster position
464 // int NtrMatched = 0;
465 // NtrMatched = cluster->GetNTracksMatched();
466 // fHistNMatchedTracks->Fill(NtrMatched);
467 // if(NtrMatched > 0){
468 // //loop over tracks for QA
469 // TList *l = event->GetList();
470 // TClonesArray *tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
472 // Double_t dphi = 999.0;
473 // Double_t deta = 999.0;
474 // Double_t dr2 = 999.0;
476 // for(int itrack = 0; itrack < NtrMatched; itrack++){
477 // AliVTrack *trackcluster = NULL;
478 // trackcluster = static_cast<AliVTrack*>(tracks->At(itrack));
479 // if (! trackcluster) {
480 // AliError(Form("Couldn't get ESD track %d\n", itrack));
483 // AliPicoTrack::GetEtaPhiDiff(trackcluster, cluster, dphi, deta);
484 // dr2 = dphi*dphi + deta+deta;
485 // //cout << dr << endl;
486 // if(dr2 < fMinDistTrackToCluster*fMinDistTrackToCluster){
487 // // if(dphi < fMinDistTrackToCluster || deta < fMinDistTrackToCluster){
488 // if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //2
492 // }//loop over tracks
494 // // if(cluster->GetEmcCpvDistance() < fMinDistTrackToCluster){
495 // // if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //2
499 cutIndex++;//3, next cut
501 // exotic cell cut --IMPLEMENT LATER---
502 // if(!AcceptanceCuts(photon)){
503 // if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //3
506 cutIndex++; //4, next cut
508 // minimum cell energy cut
510 if(cluster->E() < fMinEnergy){
511 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //4
515 cutIndex++; //5, next cut
517 // minimum number of cells
519 if(cluster->GetNCells() < fMinNCells) {
520 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //5
524 cutIndex++; //6, next cut
528 if( cluster->GetM02()< fMinM02 || cluster->GetM02() > fMaxM02 ) {
529 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //6
533 cutIndex++; //7, next cut
537 if( cluster->GetM20()< fMinM20 || cluster->GetM20() > fMaxM20 ) {
538 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //7
542 cutIndex++; //8, next cut
546 if( cluster->GetDispersion()> fMaxDispersion) {
547 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //8
551 cutIndex++; //9, next cut
553 // NLM cut --IMPLEMENT LATER---
555 // if( cluster->GetDispersion()> fMaxDispersion) {
556 // if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //9
560 cutIndex++; //9, next cut
562 // DONE with selecting photons
563 if(fHistClusterIdentificationCuts)fHistClusterIdentificationCuts->Fill(cutIndex); //10
566 Double_t vertex[3] = {0};
567 event->GetPrimaryVertex()->GetXYZ(vertex);
568 // TLorentzvector with cluster
569 TLorentzVector clusterVector;
570 cluster->GetMomentum(clusterVector,vertex);
571 Double_t etaCluster = clusterVector.Eta();
572 Double_t phiCluster = clusterVector.Phi();
574 if(fHistClusterEtavsPhiAfterQA) fHistClusterEtavsPhiAfterQA->Fill(phiCluster,etaCluster);
575 if(fHistClusterTimevsEAfterQA) fHistClusterTimevsEAfterQA->Fill(cluster->GetTOF(), cluster->E());
576 // if(fHistExoticCellAfterQA) fHistExoticCellAfterQA->Fill(cluster->E(), );
577 // if(fHistDistanceTrackToClusterAfterQA) fHistDistanceTrackToClusterAfterQA->Fill(minR);
578 if(fHistEnergyOfClusterAfterQA) fHistEnergyOfClusterAfterQA->Fill(cluster->E());
579 if(fHistNCellsAfterQA) fHistNCellsAfterQA->Fill(cluster->GetNCells());
580 if(fHistM02AfterQA) fHistM02AfterQA->Fill(cluster->GetM02());
581 if(fHistM20AfterQA) fHistM20AfterQA->Fill(cluster->GetM20());
582 if(fHistDispersionAfterQA) fHistDispersionAfterQA->Fill(cluster->GetDispersion());
583 // if(fHistNLMBeforeQA) fHistNLMAfterQA->Fill(cluster->GetNExMax());
590 ///________________________________________________________________________
591 Bool_t AliCaloPhotonCuts::ClusterIsSelected(AliVCluster *cluster, AliVEvent * event, Bool_t isMC)
593 //Selection of Reconstructed photon clusters with Calorimeters
595 FillClusterCutIndex(kPhotonIn);
597 Double_t vertex[3] = {0};
598 event->GetPrimaryVertex()->GetXYZ(vertex);
599 // TLorentzvector with cluster
600 TLorentzVector clusterVector;
601 cluster->GetMomentum(clusterVector,vertex);
602 Double_t etaCluster = clusterVector.Eta();
603 Double_t phiCluster = clusterVector.Phi();
605 // Histos before cuts
606 if(fHistClusterEtavsPhiBeforeAcc) fHistClusterEtavsPhiBeforeAcc->Fill(phiCluster,etaCluster);
608 // Cluster Selection - 0= accept any calo cluster
609 if (fClusterType > 0){
610 //Select EMCAL cluster
611 if (fClusterType == 1 && !cluster->IsEMCAL()){
612 FillClusterCutIndex(kDetector);
615 //Select PHOS cluster
616 if (fClusterType == 2 && !cluster->IsPHOS()){
617 FillClusterCutIndex(kDetector);
623 if(!AcceptanceCuts(cluster,event)){
624 FillClusterCutIndex(kAcceptance);
627 // Cluster Quality Cuts
628 if(!ClusterQualityCuts(cluster,event,isMC)){
629 FillClusterCutIndex(kClusterQuality);
633 // Photon passed cuts
634 FillClusterCutIndex(kPhotonOut);
639 ///________________________________________________________________________
640 Bool_t AliCaloPhotonCuts::AcceptanceCuts(AliVCluster *cluster, AliVEvent* event)
642 // Exclude certain areas for photon reconstruction
645 if(fHistAcceptanceCuts)fHistAcceptanceCuts->Fill(cutIndex);
649 Double_t vertex[3] = {0,0,0};
650 // event->GetPrimaryVertex()->GetXYZ(vertex);
651 // TLorentzvector with cluster
652 TLorentzVector clusterVector;
653 cluster->GetMomentum(clusterVector,vertex);
654 Double_t etaCluster = clusterVector.Eta();
655 Double_t phiCluster = clusterVector.Phi();
659 if (etaCluster < fMinEtaCut || etaCluster > fMaxEtaCut){
660 if(fHistAcceptanceCuts)fHistAcceptanceCuts->Fill(cutIndex);
668 if (phiCluster < fMinPhiCut || phiCluster > fMaxEtaCut){
669 if(fHistAcceptanceCuts)fHistAcceptanceCuts->Fill(cutIndex);
675 // check distance to bad channel
676 if (fUseDistanceToBadChannel){
677 if (cluster->GetDistanceToBadChannel() < fMinDistanceToBadChannel){
678 if(fHistAcceptanceCuts)fHistAcceptanceCuts->Fill(cutIndex);
683 if(fHistAcceptanceCuts)fHistAcceptanceCuts->Fill(cutIndex);
686 if(fHistClusterEtavsPhiAfterAcc) fHistClusterEtavsPhiAfterAcc->Fill(phiCluster,etaCluster);
691 Bool_t AliCaloPhotonCuts::MatchConvPhotonToCluster(AliAODConversionPhoton* convPhoton, AliVCluster* cluster, AliVEvent* event ){
693 if (!fUseDistTrackToCluster) return kFALSE;
695 AliESDEvent *esdev = dynamic_cast<AliESDEvent*>(event);
696 AliAODEvent *aodev = 0;
698 aodev = dynamic_cast<AliAODEvent*>(event);
700 AliError("Task needs AOD or ESD event, returning");
705 Double_t vertex[3] = {0,0,0};
706 event->GetPrimaryVertex()->GetXYZ(vertex);
708 if(!cluster->IsEMCAL() && !cluster->IsPHOS()){AliError("Cluster is neither EMCAL nor PHOS, returning"); return kFALSE;}
710 Float_t clusterPosition[3] = {0,0,0};
711 cluster->GetPosition(clusterPosition);
712 Double_t clusterR = TMath::Sqrt( clusterPosition[0]*clusterPosition[0] + clusterPosition[1]*clusterPosition[1] );
713 if(fHistClusterRBeforeQA) fHistClusterRBeforeQA->Fill(clusterR);
715 //cout << "+++++++++ Cluster: x, y, z, R" << clusterPosition[0] << ", " << clusterPosition[1] << ", " << clusterPosition[2] << ", " << clusterR << "+++++++++" << endl;
717 Bool_t matched = kFALSE;
718 for (Int_t i = 0; i < 2; i++){
719 Int_t tracklabel = convPhoton->GetLabel(i);
720 AliVTrack *inTrack = 0x0;
722 if(tracklabel > event->GetNumberOfTracks() ) continue;
723 inTrack = esdev->GetTrack(tracklabel);
725 if(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1"))->AreAODsRelabeled()){
726 inTrack = dynamic_cast<AliVTrack*>(event->GetTrack(tracklabel));
728 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
729 inTrack = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
731 if(inTrack->GetID() == tracklabel) {
738 // if( inTrack->Pt() < 0.005 ) continue;
740 AliESDtrack *esdt = dynamic_cast<AliESDtrack*>(inTrack);
741 AliAODTrack *aodt = 0;
743 aodt = dynamic_cast<AliAODTrack*>(inTrack);
744 if (!aodt){AliError("Track is neither ESD nor AOD, continue"); continue;}
747 AliExternalTrackParam *trackParam = 0;
749 const AliExternalTrackParam *in = esdt->GetInnerParam();
750 if (!in){AliError("Could not get InnerParam of Track, continue"); continue;}
751 trackParam = new AliExternalTrackParam(*in);
753 Double_t xyz[3] = {0}, pxpypz[3] = {0}, cv[21] = {0};
754 aodt->PxPyPz(pxpypz);
756 aodt->GetCovarianceXYZPxPyPz(cv);
757 trackParam = new AliExternalTrackParam(xyz,pxpypz,cv,aodt->Charge());
759 if (!trackParam){AliError("Could not get TrackParameters, continue"); continue;}
761 Bool_t propagated = kFALSE;
762 AliExternalTrackParam emcParam(*trackParam);
766 if(cluster->IsEMCAL()){
767 Float_t eta = 0; Float_t phi = 0; Float_t pt = 0;
768 propagated = AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(&emcParam, 430, 0.000510999, 20, eta, phi, pt);
770 propagated = AliEMCALRecoUtils::ExtrapolateTrackToCluster(&emcParam, cluster, 0.000510999, 5, dEta, dPhi);
773 if(cluster->IsPHOS()){
774 propagated = AliTrackerBase::PropagateTrackToBxByBz(&emcParam, clusterR, 0.000510999, 20, kTRUE, 0.8, -1);
776 Double_t trkPos[3] = {0,0,0};
777 emcParam.GetXYZ(trkPos);
778 TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
779 TVector3 clsPosVec(clusterPosition);
780 dPhi = clsPosVec.DeltaPhi(trkPosVec);
781 dEta = clsPosVec.Eta()-trkPosVec.Eta();
786 Float_t dR2 = dPhi*dPhi + dEta*dEta;
787 if (fHistDistanceTrackToClusterBeforeQA)fHistDistanceTrackToClusterBeforeQA->Fill(TMath::Sqrt(dR2));
788 if (fHistClusterdEtadPhiPosTracksBeforeQA && inTrack->Charge()< 0) fHistClusterdEtadPhiPosTracksBeforeQA->Fill(dEta, dPhi);
789 if (fHistClusterdEtadPhiNegTracksBeforeQA && inTrack->Charge()> 0) fHistClusterdEtadPhiNegTracksBeforeQA->Fill(dEta, dPhi);
790 if(dR2 < fMinDistTrackToCluster*fMinDistTrackToCluster){
792 if (fHistDistanceTrackToClusterAfterQA)fHistDistanceTrackToClusterAfterQA->Fill(TMath::Sqrt(dR2));
793 if (fHistClusterdEtadPhiAfterQA) fHistClusterdEtadPhiAfterQA->Fill(dEta, dPhi);
794 if (fHistClusterRAfterQA) fHistClusterRAfterQA->Fill(clusterR);
804 //____________________________________________________________________________________________
807 ///________________________________________________________________________
808 Bool_t AliCaloPhotonCuts::UpdateCutString() {
809 ///Update the cut string (if it has been created yet)
811 if(fCutString && fCutString->GetString().Length() == kNCuts) {
812 fCutString->SetString(GetCutNumber());
819 ///________________________________________________________________________
820 Bool_t AliCaloPhotonCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
821 // Initialize Cuts from a given Cut string
822 AliInfo(Form("Set CaloCut Number: %s",analysisCutSelection.Data()));
823 if(analysisCutSelection.Length()!=kNCuts) {
824 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
827 if(!analysisCutSelection.IsDigit()){
828 AliError("Cut selection contains characters");
832 const char *cutSelection = analysisCutSelection.Data();
833 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
834 for(Int_t ii=0;ii<kNCuts;ii++){
838 // Set Individual Cuts
839 for(Int_t ii=0;ii<kNCuts;ii++){
840 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
842 PrintCutsWithValues();
846 ///________________________________________________________________________
847 Bool_t AliCaloPhotonCuts::SetCut(cutIds cutID, const Int_t value) {
848 ///Set individual cut ID
853 if( SetClusterTypeCut(value)) {
854 fCuts[kClusterType] = value;
857 } else return kFALSE;
860 if( SetMinEtaCut(value)) {
861 fCuts[kEtaMin] = value;
864 } else return kFALSE;
867 if( SetMaxEtaCut(value)) {
868 fCuts[kEtaMax] = value;
871 } else return kFALSE;
874 if( SetMinPhiCut(value)) {
875 fCuts[kPhiMin] = value;
878 } else return kFALSE;
881 if( SetMaxPhiCut(value)) {
882 fCuts[kPhiMax] = value;
885 } else return kFALSE;
887 case kDistanceToBadChannel:
888 if( SetDistanceToBadChannelCut(value)) {
889 fCuts[kDistanceToBadChannel] = value;
892 } else return kFALSE;
895 if( SetTimingCut(value)) {
896 fCuts[kTiming] = value;
899 } else return kFALSE;
902 if( SetTrackMatchingCut(value)) {
903 fCuts[kTrackMatching] = value;
906 } else return kFALSE;
909 if( SetExoticCellCut(value)) {
910 fCuts[kExoticCell] = value;
913 } else return kFALSE;
916 if( SetMinEnergyCut(value)) {
917 fCuts[kMinEnery] = value;
920 } else return kFALSE;
923 if( SetMinNCellsCut(value)) {
924 fCuts[kNMinCells] = value;
927 } else return kFALSE;
930 if( SetMinM02(value)) {
931 fCuts[kMinM02] = value;
934 } else return kFALSE;
937 if( SetMaxM02(value)) {
938 fCuts[kMaxM02] = value;
941 } else return kFALSE;
944 if( SetMinM20(value)) {
945 fCuts[kMinM20] = value;
948 } else return kFALSE;
951 if( SetMaxM20(value)) {
952 fCuts[kMaxM20] = value;
955 } else return kFALSE;
958 if( SetDispersion(value)) {
959 fCuts[kDispersion] = value;
962 } else return kFALSE;
969 } else return kFALSE;
972 AliError("Cut id out of range");
976 AliError("Cut id %d not recognized");
981 ///________________________________________________________________________
982 void AliCaloPhotonCuts::PrintCuts() {
983 // Print out current Cut Selection
984 for(Int_t ic = 0; ic < kNCuts; ic++) {
985 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
989 void AliCaloPhotonCuts::PrintCutsWithValues() {
990 // Print out current Cut Selection with value
991 printf("\nCluster cutnumber \n");
992 for(Int_t ic = 0; ic < kNCuts; ic++) {
993 printf("%d",fCuts[ic]);
997 printf("Acceptance cuts: \n");
998 if (fClusterType == 0) printf("\tall calorimeter clusters are used\n");
999 if (fClusterType == 1) printf("\tEMCAL calorimeter clusters are used\n");
1000 if (fClusterType == 2) printf("\tPHOS calorimeter clusters are used\n");
1001 if (fUseEtaCut) printf("\t%3.2f < eta_{cluster} < %3.2f\n", fMinEtaCut, fMaxEtaCut );
1002 if (fUsePhiCut) printf("\t%3.2f < phi_{cluster} < %3.2f\n", fMinPhiCut, fMaxPhiCut );
1003 if (fUseDistanceToBadChannel) printf("\tcut on exotics applied \n");
1005 printf("Cluster Quality cuts: \n");
1006 if (fUseTimeDiff) printf("\t time difference < %3.2f\n", fMaxTimeDiff );
1007 if (fUseDistTrackToCluster) printf("\tmin distance to track > %3.2f\n", fMinDistTrackToCluster );
1008 if (fUseExoticCell)printf("\t min distance to track > %3.2f\n", fMinDistTrackToCluster );
1009 if (fUseMinEnergy)printf("\t E_{cluster} > %3.2f\n", fMinEnergy );
1010 if (fUseNCells) printf("\t number of cells per cluster >= %d\n", fMinNCells );
1011 if (fUseM02) printf("\t %3.2f < M02 < %3.2f\n", fMinM02, fMaxM02 );
1012 if (fUseM20) printf("\t %3.2f < M20 < %3.2f\n", fMinM20, fMaxM20 );
1013 if (fUseDispersion) printf("\t dispersion < %3.2f\n", fMaxDispersion );
1014 if (fUseNLM) printf("\t %d < NLM < %d\n", fMinNLM, fMaxNLM );
1018 // EMCAL acceptance 2011
1019 // 1.39626, 3.125 (phi)
1020 // -0.66687,,0.66465
1023 ///________________________________________________________________________
1024 Bool_t AliCaloPhotonCuts::SetClusterTypeCut(Int_t clusterType)
1026 switch(clusterType){
1027 case 0: // all clusters
1030 case 1: // EMCAL clusters
1033 case 2: // PHOS clusters
1037 AliError(Form("ClusterTypeCut not defined %d",clusterType));
1043 //___________________________________________________________________
1044 Bool_t AliCaloPhotonCuts::SetMinEtaCut(Int_t minEta)
1048 if (!fUseEtaCut) fUseEtaCut=0;
1052 if (!fUseEtaCut) fUseEtaCut=1;
1056 if (!fUseEtaCut) fUseEtaCut=1;
1060 if (!fUseEtaCut) fUseEtaCut=1;
1064 AliError(Form("MinEta Cut not defined %d",minEta));
1071 //___________________________________________________________________
1072 Bool_t AliCaloPhotonCuts::SetMaxEtaCut(Int_t maxEta)
1076 if (!fUseEtaCut) fUseEtaCut=0;
1080 if (!fUseEtaCut) fUseEtaCut=1;
1084 if (!fUseEtaCut) fUseEtaCut=1;
1088 if (!fUseEtaCut) fUseEtaCut=1;
1092 AliError(Form("MaxEta Cut not defined %d",maxEta));
1098 //___________________________________________________________________
1099 Bool_t AliCaloPhotonCuts::SetMinPhiCut(Int_t minPhi)
1103 if (!fUsePhiCut) fUsePhiCut=0;
1107 if (!fUsePhiCut) fUsePhiCut=1;
1111 AliError(Form("MinPhi Cut not defined %d",minPhi));
1117 //___________________________________________________________________
1118 Bool_t AliCaloPhotonCuts::SetMaxPhiCut(Int_t maxPhi)
1122 if (!fUsePhiCut) fUsePhiCut=0;
1126 if (!fUsePhiCut) fUsePhiCut=1;
1130 AliError(Form("Max Phi Cut not defined %d",maxPhi));
1136 //___________________________________________________________________
1137 Bool_t AliCaloPhotonCuts::SetDistanceToBadChannelCut(Int_t distanceToBadChannel)
1139 switch(distanceToBadChannel){
1141 fUseDistanceToBadChannel=0;
1142 fMinDistanceToBadChannel=0;
1145 if (!fUseDistanceToBadChannel) fUseDistanceToBadChannel=1;
1146 fMinDistanceToBadChannel=5;
1149 AliError(Form("minimum distance to bad channel Cut not defined %d",distanceToBadChannel));
1155 //___________________________________________________________________
1156 Bool_t AliCaloPhotonCuts::SetTimingCut(Int_t timing)
1164 if (!fUseTimeDiff) fUseTimeDiff=1;
1165 fMaxTimeDiff=10e-7; //1000ns
1168 if (!fUseTimeDiff) fUseTimeDiff=1;
1169 fMaxTimeDiff=50e-8; //500ns
1172 if (!fUseTimeDiff) fUseTimeDiff=1;
1173 fMaxTimeDiff=20e-8; //200ns
1176 if (!fUseTimeDiff) fUseTimeDiff=1;
1177 fMaxTimeDiff=10e-8; //100ns
1180 if (!fUseTimeDiff) fUseTimeDiff=1;
1181 fMaxTimeDiff=50e-9; //50ns
1185 AliError(Form("Timing Cut not defined %d",timing));
1191 //___________________________________________________________________
1192 Bool_t AliCaloPhotonCuts::SetTrackMatchingCut(Int_t trackMatching)
1194 switch(trackMatching){
1196 fUseDistTrackToCluster=0;
1197 fMinDistTrackToCluster=0;
1200 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1201 fMinDistTrackToCluster= 0.03; //0.04;
1204 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1205 fMinDistTrackToCluster= 0.035; //0.05;
1208 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1209 fMinDistTrackToCluster= 0.04; //0.1;
1212 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1213 fMinDistTrackToCluster= 0.045; //0.13;
1216 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1217 fMinDistTrackToCluster= 0.05; //0.15
1220 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1221 fMinDistTrackToCluster= 0.055; //0.2;
1224 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1225 fMinDistTrackToCluster= 0.06; //0.3;
1228 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1229 fMinDistTrackToCluster= 0.07; //0.4;
1232 if (!fUseDistTrackToCluster) fUseDistTrackToCluster=1;
1233 fMinDistTrackToCluster= 0.1; //0.5;
1237 AliError(Form("Track Matching Cut not defined %d",trackMatching));
1243 //___________________________________________________________________
1244 Bool_t AliCaloPhotonCuts::SetExoticCellCut(Int_t exoticCell)
1252 if (!fUseExoticCell) fUseExoticCell=1;
1256 AliError(Form("Exotic cell Cut not defined %d",exoticCell));
1262 //___________________________________________________________________
1263 Bool_t AliCaloPhotonCuts::SetMinEnergyCut(Int_t minEnergy)
1267 if (!fUseMinEnergy) fUseMinEnergy=0;
1271 if (!fUseMinEnergy) fUseMinEnergy=1;
1275 if (!fUseMinEnergy) fUseMinEnergy=1;
1279 if (!fUseMinEnergy) fUseMinEnergy=1;
1283 if (!fUseMinEnergy) fUseMinEnergy=1;
1287 if (!fUseMinEnergy) fUseMinEnergy=1;
1291 if (!fUseMinEnergy) fUseMinEnergy=1;
1295 if (!fUseMinEnergy) fUseMinEnergy=1;
1299 if (!fUseMinEnergy) fUseMinEnergy=1;
1303 if (!fUseMinEnergy) fUseMinEnergy=1;
1307 AliError(Form("Minimum Energy Cut not defined %d",minEnergy));
1313 //___________________________________________________________________
1314 Bool_t AliCaloPhotonCuts::SetMinNCellsCut(Int_t minNCells)
1318 if (!fUseNCells) fUseNCells=0;
1322 if (!fUseNCells) fUseNCells=1;
1326 if (!fUseNCells) fUseNCells=1;
1330 if (!fUseNCells) fUseNCells=1;
1334 if (!fUseNCells) fUseNCells=1;
1338 if (!fUseNCells) fUseNCells=1;
1342 if (!fUseNCells) fUseNCells=1;
1347 AliError(Form("Min N cells Cut not defined %d",minNCells));
1353 //___________________________________________________________________
1354 Bool_t AliCaloPhotonCuts::SetMaxM02(Int_t maxM02)
1358 if (!fUseM02) fUseM02=0;
1362 if (!fUseM02) fUseM02=1;
1366 if (!fUseM02) fUseM02=1;
1370 if (!fUseM02) fUseM02=1;
1374 if (!fUseM02) fUseM02=1;
1378 AliError(Form("Max M02 Cut not defined %d",maxM02));
1384 //___________________________________________________________________
1385 Bool_t AliCaloPhotonCuts::SetMinM02(Int_t minM02)
1389 if (!fUseM02) fUseM02=0;
1393 if (!fUseM02) fUseM02=1;
1397 AliError(Form("Min M02 not defined %d",minM02));
1403 //___________________________________________________________________
1404 Bool_t AliCaloPhotonCuts::SetMaxM20(Int_t maxM20)
1408 if (!fUseM20) fUseM20=0;
1412 if (!fUseM20) fUseM20=1;
1416 AliError(Form("Max M20 Cut not defined %d",maxM20));
1422 //___________________________________________________________________
1423 Bool_t AliCaloPhotonCuts::SetMinM20(Int_t minM20)
1427 if (!fUseM20) fUseM20=0;
1431 if (!fUseM20) fUseM20=1;
1435 AliError(Form("Min M20 Cut not defined %d",minM20));
1441 //___________________________________________________________________
1442 Bool_t AliCaloPhotonCuts::SetDispersion(Int_t dispersion)
1446 if (!fUseDispersion) fUseDispersion=0;
1447 fMaxDispersion =100;
1450 if (!fUseDispersion) fUseDispersion=1;
1454 AliError(Form("Maximum Dispersion Cut not defined %d",dispersion));
1460 //___________________________________________________________________
1461 Bool_t AliCaloPhotonCuts::SetNLM(Int_t nlm)
1465 if (!fUseNLM) fUseNLM=0;
1470 if (!fUseNLM) fUseNLM=1;
1475 AliError(Form("NLM Cut not defined %d",nlm));
1481 ///________________________________________________________________________
1482 TString AliCaloPhotonCuts::GetCutNumber(){
1483 // returns TString with current cut number
1485 for(Int_t ii=0;ii<kNCuts;ii++){
1486 a.Append(Form("%d",fCuts[ii]));