2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Authors: Friederike Bock *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 ////////////////////////////////////////////////
18 //---------------------------------------------
19 // Class handling all kinds of selection cuts for
20 // Gamma Conversion analysis
21 //---------------------------------------------
22 ////////////////////////////////////////////////
25 #include "AliPrimaryPionCuts.h"
26 #include "AliAODConversionPhoton.h"
27 #include "AliKFVertex.h"
28 #include "AliAODTrack.h"
29 #include "AliESDtrack.h"
30 #include "AliAnalysisManager.h"
31 #include "AliInputEventHandler.h"
32 #include "AliMCEventHandler.h"
33 #include "AliAODHandler.h"
34 #include "AliPIDResponse.h"
38 #include "TObjString.h"
39 #include "AliAODEvent.h"
40 #include "AliESDEvent.h"
46 ClassImp(AliPrimaryPionCuts)
49 const char* AliPrimaryPionCuts::fgkCutNames[AliPrimaryPionCuts::kNCuts] = {
60 //________________________________________________________________________
61 AliPrimaryPionCuts::AliPrimaryPionCuts(const char *name,const char *title) : AliAnalysisCuts(name,title),
69 fMinClsTPC(0), // minimum clusters in the TPC
70 fMinClsTPCToF(0), // minimum clusters to findable clusters
71 fDodEdxSigmaITSCut(kFALSE),
72 fDodEdxSigmaTPCCut(kTRUE),
73 fDoTOFsigmaCut(kFALSE), // RRnewTOF
74 fPIDnSigmaAbovePionLineITS(100),
75 fPIDnSigmaBelowPionLineITS(-100),
76 fPIDnSigmaAbovePionLineTPC(100),
77 fPIDnSigmaBelowPionLineTPC(-100),
78 fPIDnSigmaAbovePionLineTOF(100), // RRnewTOF
79 fPIDnSigmaBelowPionLineTOF(-100), // RRnewTOF
80 fUseCorrectedTPCClsInfo(kFALSE),
87 fHistITSdEdxbefore(NULL),
88 fHistITSdEdxafter(NULL),
89 fHistTPCdEdxbefore(NULL),
90 fHistTPCdEdxafter(NULL),
91 fHistTPCdEdxSignalbefore(NULL),
92 fHistTPCdEdxSignalafter(NULL),
95 fHistTrackDCAxyPtbefore(NULL),
96 fHistTrackDCAxyPtafter(NULL),
97 fHistTrackDCAzPtbefore(NULL),
98 fHistTrackDCAzPtafter(NULL),
99 fHistTrackNFindClsPtTPCbefore(NULL),
100 fHistTrackNFindClsPtTPCafter(NULL)
103 for(Int_t jj=0;jj<kNCuts;jj++){ fCuts[jj]=0; }
104 fCutString=new TObjString((GetCutNumber()).Data());
106 // Using standard function for setting Cuts
107 Bool_t selectPrimaries=kFALSE;
108 fEsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
111 //________________________________________________________________________
112 AliPrimaryPionCuts::~AliPrimaryPionCuts() {
114 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
116 // delete fHistograms;
117 // fHistograms = NULL;
119 if(fCutString != NULL){
125 //________________________________________________________________________
126 void AliPrimaryPionCuts::InitCutHistograms(TString name, Bool_t preCut,TString cutNumber){
128 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
130 TString cutName = "";
133 cutName = GetCutNumber().Data();
136 cutName = cutNumber.Data();
139 if(fHistograms != NULL){
143 if(fHistograms==NULL){
144 fHistograms=new TList();
145 if(name=="")fHistograms->SetName(Form("PionCuts_%s",cutName.Data()));
146 else fHistograms->SetName(Form("%s_%s",name.Data(),cutName.Data()));
150 fHistCutIndex=new TH1F(Form("IsPionSelected %s",cutName.Data()),"IsPionSelected",10,-0.5,9.5);
151 fHistCutIndex->GetXaxis()->SetBinLabel(kPionIn+1,"in");
152 fHistCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
153 fHistCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
154 fHistCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
155 fHistCutIndex->GetXaxis()->SetBinLabel(kPionOut+1,"out");
156 fHistograms->Add(fHistCutIndex);
159 fHistdEdxCuts=new TH1F(Form("dEdxCuts %s",cutName.Data()),"dEdxCuts",5,-0.5,4.5);
160 fHistdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
161 fHistdEdxCuts->GetXaxis()->SetBinLabel(2,"ITSpion");
162 fHistdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
163 fHistdEdxCuts->GetXaxis()->SetBinLabel(4,"TOFpion");
164 fHistdEdxCuts->GetXaxis()->SetBinLabel(5,"out");
165 fHistograms->Add(fHistdEdxCuts);
167 TAxis *axisBeforeITS = NULL;
168 TAxis *axisBeforedEdx = NULL;
169 TAxis *axisBeforeTOF = NULL;
170 TAxis *axisBeforedEdxSignal = NULL;
173 fHistITSdEdxbefore=new TH2F(Form("Pion_ITS_before %s",cutName.Data()),"ITS dEdx pion before" ,150,0.05,20,400,-10,10);
174 fHistograms->Add(fHistITSdEdxbefore);
175 axisBeforeITS = fHistITSdEdxbefore->GetXaxis();
177 fHistTPCdEdxbefore=new TH2F(Form("Pion_dEdx_before %s",cutName.Data()),"dEdx pion before" ,150,0.05,20,400,-10,10);
178 fHistograms->Add(fHistTPCdEdxbefore);
179 axisBeforedEdx = fHistTPCdEdxbefore->GetXaxis();
181 fHistTPCdEdxSignalbefore=new TH2F(Form("Pion_dEdxSignal_before %s",cutName.Data()),"dEdx pion signal before" ,150,0.05,20.0,800,0.0,200);
182 fHistograms->Add(fHistTPCdEdxSignalbefore);
183 axisBeforedEdxSignal = fHistTPCdEdxSignalbefore->GetXaxis();
185 fHistTOFbefore=new TH2F(Form("Pion_TOF_before %s",cutName.Data()),"TOF pion before" ,150,0.05,20,400,-6,10);
186 fHistograms->Add(fHistTOFbefore);
187 axisBeforeTOF = fHistTOFbefore->GetXaxis();
189 fHistTrackDCAxyPtbefore = new TH2F(Form("hTrack_DCAxy_Pt_before %s",cutName.Data()),"DCAxy Vs Pt of tracks before",800,-4.0,4.0,400,0.,10.);
190 fHistograms->Add(fHistTrackDCAxyPtbefore);
192 fHistTrackDCAzPtbefore = new TH2F(Form("hTrack_DCAz_Pt_before %s",cutName.Data()), "DCAz Vs Pt of tracks before",800,-4.0,4.0,400,0.,10.);
193 fHistograms->Add(fHistTrackDCAzPtbefore);
195 fHistTrackNFindClsPtTPCbefore = new TH2F(Form("hTrack_NFindCls_Pt_TPC_before %s",cutName.Data()),"Track: N Findable Cls TPC Vs Pt before",100,0,1,400,0.,10.);
196 fHistograms->Add(fHistTrackNFindClsPtTPCbefore);
199 fHistITSdEdxafter=new TH2F(Form("Pion_ITS_after %s",cutName.Data()),"ITS dEdx pion after" ,150,0.05,20,400, -10,10);
200 fHistograms->Add(fHistITSdEdxafter);
202 fHistTPCdEdxafter=new TH2F(Form("Pion_dEdx_after %s",cutName.Data()),"dEdx pion after" ,150,0.05,20,400, -10,10);
203 fHistograms->Add(fHistTPCdEdxafter);
205 fHistTPCdEdxSignalafter=new TH2F(Form("Pion_dEdxSignal_after %s",cutName.Data()),"dEdx pion signal after" ,150,0.05,20.0,800,0.0,200);
206 fHistograms->Add(fHistTPCdEdxSignalafter);
208 fHistTOFafter=new TH2F(Form("Pion_TOF_after %s",cutName.Data()),"TOF pion after" ,150,0.05,20,400,-6,10);
209 fHistograms->Add(fHistTOFafter);
211 fHistTrackDCAxyPtafter = new TH2F(Form("hTrack_DCAxy_Pt_after %s",cutName.Data()),"DCAxy Vs Pt of tracks after",800,-4.0,4.0,400,0.,10.);
212 fHistograms->Add(fHistTrackDCAxyPtafter);
214 fHistTrackDCAzPtafter = new TH2F(Form("hTrack_DCAz_Pt_after %s",cutName.Data()), "DCAz Vs Pt of tracks after",800,-4.0,4.0,400,0.,10.);
215 fHistograms->Add(fHistTrackDCAzPtafter);
217 fHistTrackNFindClsPtTPCafter = new TH2F(Form("hTrack_NFindCls_Pt_TPC_after %s",cutName.Data()),"Track: N Findable Cls TPC Vs Pt after",100,0,1,400,0.,10.);
218 fHistograms->Add(fHistTrackNFindClsPtTPCafter);
220 TAxis *AxisAfter = fHistTPCdEdxafter->GetXaxis();
221 Int_t bins = AxisAfter->GetNbins();
222 Double_t from = AxisAfter->GetXmin();
223 Double_t to = AxisAfter->GetXmax();
224 Double_t *newBins = new Double_t[bins+1];
226 Double_t factor = TMath::Power(to/from, 1./bins);
227 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
228 AxisAfter->Set(bins, newBins);
229 AxisAfter = fHistTOFafter->GetXaxis();
230 AxisAfter->Set(bins, newBins);
231 AxisAfter = fHistITSdEdxafter->GetXaxis();
232 AxisAfter->Set(bins,newBins);
233 AxisAfter = fHistTPCdEdxSignalafter->GetXaxis();
234 AxisAfter->Set(bins,newBins);
237 axisBeforeITS->Set(bins, newBins);
238 axisBeforedEdx->Set(bins, newBins);
239 axisBeforedEdxSignal->Set(bins,newBins);
240 axisBeforeTOF->Set(bins, newBins);
245 // Event Cuts and Info
249 //________________________________________________________________________
250 Bool_t AliPrimaryPionCuts::InitPIDResponse(){
252 // Set Pointer to AliPIDResponse
254 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
257 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
258 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
259 if(fPIDResponse)return kTRUE;
265 ///________________________________________________________________________
266 Bool_t AliPrimaryPionCuts::PionIsSelectedMC(Int_t labelParticle,AliStack *fMCStack){
268 if( labelParticle < 0 || labelParticle >= fMCStack->GetNtrack() ) return kFALSE;
269 if( fMCStack->IsPhysicalPrimary(labelParticle) == kFALSE ) return kFALSE;
271 TParticle* particle = fMCStack->Particle(labelParticle);
273 if( TMath::Abs( particle->GetPdgCode() ) != 211 ) return kFALSE;
276 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
284 ///________________________________________________________________________
285 Bool_t AliPrimaryPionCuts::PionIsSelected(AliESDtrack* lTrack){
286 //Selection of Reconstructed electrons
290 lTrack->GetImpactParameters(b,bCov);
292 if (bCov[0]<=0 || bCov[2]<=0) {
293 AliDebug(1, "Estimated b resolution lower or equal zero!");
294 bCov[0]=0; bCov[2]=0;
297 Float_t dcaToVertexXY = b[0];
298 Float_t dcaToVertexZ = b[1];
299 Double_t clsToF = GetNFindableClustersTPC(lTrack);
301 if (fHistTrackDCAxyPtbefore) fHistTrackDCAxyPtbefore->Fill(dcaToVertexXY,lTrack->Pt());
302 if (fHistTrackDCAzPtbefore) fHistTrackDCAzPtbefore->Fill( dcaToVertexZ, lTrack->Pt());
303 if (fHistTrackNFindClsPtTPCbefore) fHistTrackNFindClsPtTPCbefore->Fill( clsToF, lTrack->Pt());
305 if (fHistCutIndex) fHistCutIndex->Fill(kPionIn);
308 if (fHistCutIndex) fHistCutIndex->Fill(kNoTracks);
312 if ( ! lTrack->GetConstrainedParam() ){
315 AliVTrack * track = dynamic_cast<AliVTrack*>(lTrack);
318 if( !TrackIsSelected(lTrack) ){
319 if (fHistCutIndex) fHistCutIndex->Fill(kTrackCuts);
324 if( ! dEdxCuts( track ) ) {
325 if(fHistCutIndex)fHistCutIndex->Fill(kdEdxCuts);
330 //Pion passed the cuts
331 if (fHistCutIndex) fHistCutIndex->Fill(kPionOut);
332 if (fHistTrackDCAxyPtafter) fHistTrackDCAxyPtafter->Fill(dcaToVertexXY,lTrack->Pt());
333 if (fHistTrackDCAzPtafter) fHistTrackDCAzPtafter->Fill(dcaToVertexZ,lTrack->Pt());
334 if (fHistTrackNFindClsPtTPCafter) fHistTrackNFindClsPtTPCafter->Fill( clsToF, lTrack->Pt());
339 ///________________________________________________________________________
340 Bool_t AliPrimaryPionCuts::TrackIsSelected(AliESDtrack* lTrack) {
341 // Track Selection for Photon Reconstruction
343 Double_t clsToF = GetNFindableClustersTPC(lTrack);
345 if( ! fEsdTrackCuts->AcceptTrack(lTrack) ){
350 if( lTrack->Eta() > (fEtaCut + fEtaShift) || lTrack->Eta() < (-fEtaCut + fEtaShift) ) {
355 if( lTrack->Pt() < fPtCut ) {
359 if( clsToF < fMinClsTPCToF){
366 ///________________________________________________________________________
367 Bool_t AliPrimaryPionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
369 // Pion Identification Cuts for Photon reconstruction
371 if(!fPIDResponse){ InitPIDResponse(); }// Try to reinitialize PID Response
372 if(!fPIDResponse){ AliError("No PID Response"); return kFALSE;}// if still missing fatal error
376 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
377 if(fHistITSdEdxbefore)fHistITSdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kPion));
378 if(fHistTPCdEdxbefore)fHistTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kPion));
379 if(fHistTPCdEdxSignalbefore)fHistTPCdEdxSignalbefore->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
383 if( fDodEdxSigmaITSCut == kTRUE ){
384 if( fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kPion)<fPIDnSigmaBelowPionLineITS ||
385 fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kPion)> fPIDnSigmaAbovePionLineITS ){
386 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
391 if(fHistITSdEdxafter)fHistITSdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kPion));
397 if(fDodEdxSigmaTPCCut == kTRUE){
399 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaBelowPionLineTPC ||
400 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)>fPIDnSigmaAbovePionLineTPC){
401 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
405 } else { cutIndex+=1; }
407 if( ( fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid ) && ( !( fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch) ) ){
408 if(fHistTOFbefore) fHistTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion));
410 if( fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion)>fPIDnSigmaAbovePionLineTOF ||
411 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion)<fPIDnSigmaBelowPionLineTOF ){
412 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
416 if(fHistTOFafter)fHistTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion));
417 } else if ( fRequireTOF == kTRUE ) {
418 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
423 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
424 if(fHistTPCdEdxafter)fHistTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kPion));
425 if(fHistTPCdEdxSignalafter)fHistTPCdEdxSignalafter->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
430 ///________________________________________________________________________
431 AliVTrack *AliPrimaryPionCuts::GetTrack(AliVEvent * event, Int_t label){
432 //Returns pointer to the track with given ESD label
433 //(Important for AOD implementation, since Track array in AOD data is different
434 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
436 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
438 if(label > event->GetNumberOfTracks() ) return NULL;
439 AliESDtrack * track = esdEvent->GetTrack(label);
442 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
443 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
445 if(track->GetID() == label) {
451 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
455 ///________________________________________________________________________
456 Double_t AliPrimaryPionCuts::GetNFindableClustersTPC(AliESDtrack* lTrack){
459 if ( !fUseCorrectedTPCClsInfo ){
460 if(lTrack->GetTPCNclsF()!=0){
461 clsToF = (Double_t)lTrack->GetNcls(1)/(Double_t)lTrack->GetTPCNclsF();
464 clsToF = lTrack->GetTPCClusterInfo(2,0); //NOTE ask friederike
470 ///________________________________________________________________________
471 Bool_t AliPrimaryPionCuts::UpdateCutString() {
472 ///Update the cut string (if it has been created yet)
474 if(fCutString && fCutString->GetString().Length() == kNCuts) {
475 fCutString->SetString(GetCutNumber());
483 ///________________________________________________________________________
484 Bool_t AliPrimaryPionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
485 // Initialize Cuts from a given Cut string
487 AliInfo(Form("Set PionCuts Number: %s",analysisCutSelection.Data()));
489 if(analysisCutSelection.Length()!=kNCuts) {
490 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
493 if(!analysisCutSelection.IsDigit()){
494 AliError("Cut selection contains characters");
498 const char *cutSelection = analysisCutSelection.Data();
499 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
500 for(Int_t ii=0;ii<kNCuts;ii++){
504 // Set Individual Cuts
505 for(Int_t ii=0;ii<kNCuts;ii++){
506 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
512 ///________________________________________________________________________
513 Bool_t AliPrimaryPionCuts::SetCut(cutIds cutID, const Int_t value) {
514 ///Set individual cut ID
516 //cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
520 if( SetEtaCut(value)) {
521 fCuts[kEtaCut] = value;
524 } else return kFALSE;
526 if( SetITSClusterCut(value) ) {
527 fCuts[kClsITSCut] = value;
530 } else return kFALSE;
532 if( SetTPCClusterCut(value)) {
533 fCuts[kClsTPCCut] = value;
536 } else return kFALSE;
538 if( SetDCACut(value)) {
539 fCuts[kDCACut] = value;
542 } else return kFALSE;
544 if( SetPtCut(value)) {
545 fCuts[kPtCut] = value;
548 } else return kFALSE;
549 case kPidedxSigmaITSCut:
550 if( SetITSdEdxCutPionLine(value)) {
551 fCuts[kPidedxSigmaITSCut] = value;
554 } else return kFALSE;
555 case kPidedxSigmaTPCCut:
556 if( SetTPCdEdxCutPionLine(value)) {
557 fCuts[kPidedxSigmaTPCCut] = value;
560 } else return kFALSE;
562 if( SetTOFPionPIDCut(value)) {
563 fCuts[kPiTOFSigmaPID] = value;
566 } else return kFALSE;
568 cout << "Error:: Cut id out of range"<< endl;
572 cout << "Error:: Cut id " << cutID << " not recognized "<< endl;
576 ///________________________________________________________________________
578 void AliPrimaryPionCuts::PrintCuts() {
579 // Print out current Cut Selection
580 for(Int_t ic = 0; ic < kNCuts; ic++) {
581 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
585 ///________________________________________________________________________
586 Bool_t AliPrimaryPionCuts::SetITSdEdxCutPionLine(Int_t ededxSigmaCut){
587 switch(ededxSigmaCut){
589 fDodEdxSigmaITSCut = kFALSE;
590 fPIDnSigmaBelowPionLineITS=-100;
591 fPIDnSigmaAbovePionLineITS= 100;
594 fDodEdxSigmaITSCut = kTRUE;
595 fPIDnSigmaBelowPionLineITS=-10;
596 fPIDnSigmaAbovePionLineITS=10;
599 fDodEdxSigmaITSCut = kTRUE;
600 fPIDnSigmaBelowPionLineITS=-6;
601 fPIDnSigmaAbovePionLineITS=7;
604 fDodEdxSigmaITSCut = kTRUE;
605 fPIDnSigmaBelowPionLineITS=-5;
606 fPIDnSigmaAbovePionLineITS=5;
609 fDodEdxSigmaITSCut = kTRUE;
610 fPIDnSigmaBelowPionLineITS=-4;
611 fPIDnSigmaAbovePionLineITS=5;
614 fDodEdxSigmaITSCut = kTRUE;
615 fPIDnSigmaBelowPionLineITS=-3;
616 fPIDnSigmaAbovePionLineITS=5;
619 fDodEdxSigmaITSCut = kTRUE;
620 fPIDnSigmaBelowPionLineITS=-4;
621 fPIDnSigmaAbovePionLineITS=4;
624 fDodEdxSigmaITSCut = kTRUE;
625 fPIDnSigmaBelowPionLineITS=-2.5;
626 fPIDnSigmaAbovePionLineITS=4;
629 fDodEdxSigmaITSCut = kTRUE;
630 fPIDnSigmaBelowPionLineITS=-2;
631 fPIDnSigmaAbovePionLineITS=3.5;
634 cout<<"Warning: ITSdEdxCutPionLine not defined"<<ededxSigmaCut<<endl;
641 ///________________________________________________________________________
642 Bool_t AliPrimaryPionCuts::SetTPCdEdxCutPionLine(Int_t ededxSigmaCut){
643 switch(ededxSigmaCut){
645 fDodEdxSigmaTPCCut = kFALSE;
646 fPIDnSigmaBelowPionLineTPC=-10;
647 fPIDnSigmaAbovePionLineTPC=10;
650 fDodEdxSigmaTPCCut = kTRUE;
651 fPIDnSigmaBelowPionLineTPC=-10;
652 fPIDnSigmaAbovePionLineTPC=10;
655 fDodEdxSigmaTPCCut = kTRUE;
656 fPIDnSigmaBelowPionLineTPC=-6;
657 fPIDnSigmaAbovePionLineTPC=7;
660 fDodEdxSigmaTPCCut = kTRUE;
661 fPIDnSigmaBelowPionLineTPC=-5;
662 fPIDnSigmaAbovePionLineTPC=5;
665 fDodEdxSigmaTPCCut = kTRUE;
666 fPIDnSigmaBelowPionLineTPC=-4;
667 fPIDnSigmaAbovePionLineTPC=5;
670 fDodEdxSigmaTPCCut = kTRUE;
671 fPIDnSigmaBelowPionLineTPC=-3;
672 fPIDnSigmaAbovePionLineTPC=5;
675 fDodEdxSigmaTPCCut = kTRUE;
676 fPIDnSigmaBelowPionLineTPC=-4;
677 fPIDnSigmaAbovePionLineTPC=4;
680 fDodEdxSigmaTPCCut = kTRUE;
681 fPIDnSigmaBelowPionLineTPC=-2.5;
682 fPIDnSigmaAbovePionLineTPC=4;
685 fDodEdxSigmaTPCCut = kTRUE;
686 fPIDnSigmaBelowPionLineTPC=-2;
687 fPIDnSigmaAbovePionLineTPC=3.5;
690 cout<<"Warning: TPCdEdxCutPionLine not defined"<<ededxSigmaCut<<endl;
696 ///________________________________________________________________________
697 Bool_t AliPrimaryPionCuts::SetITSClusterCut(Int_t clsITSCut){
698 if( !fEsdTrackCuts ) {
699 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
705 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
708 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
709 break; //1 hit first layer of SPD
711 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
712 break; //1 hit in any layer of SPD
714 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
715 fEsdTrackCuts->SetMinNClustersITS(4);
716 // 4 hits in total in the ITS. At least 1 hit in the first layer of SPD
719 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
720 fEsdTrackCuts->SetMinNClustersITS(3);
721 // 3 hits in total in the ITS. At least 1 hit in any layer of SPD
724 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
725 fEsdTrackCuts->SetMinNClustersITS(4);
726 // 4 hits in total in the ITS. At least 1 hit in any layer of SPD
729 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
730 fEsdTrackCuts->SetMinNClustersITS(5);
731 // 5 hits in total in the ITS. At least 1 hit in any layer of SPD
734 cout<<"Warning: clsITSCut not defined "<<clsITSCut<<endl;
740 ///________________________________________________________________________
741 Bool_t AliPrimaryPionCuts::SetTPCClusterCut(Int_t clsTPCCut){
745 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
749 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
753 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
757 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
759 case 4: // 0% of findable clusters
761 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
763 fUseCorrectedTPCClsInfo=0;
765 case 5: // 35% of findable clusters
767 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
769 fUseCorrectedTPCClsInfo=0;
771 case 6: // 60% of findable clusters
773 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
775 fUseCorrectedTPCClsInfo=0;
777 case 7: // 70% of findable clusters
779 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
781 fUseCorrectedTPCClsInfo=0;
783 case 8: fMinClsTPC = 0.;
784 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
786 fUseCorrectedTPCClsInfo=0;
788 case 9: // 35% of findable clusters
790 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
792 fUseCorrectedTPCClsInfo=1;
796 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
802 ///________________________________________________________________________
803 Bool_t AliPrimaryPionCuts::SetEtaCut(Int_t etaCut){
831 fEtaCut = 0.6; //changed from 0.4 to 0.6 2013.06.10
835 fEtaCut = 0.5; //changed from 0.3 to 0.5 2013.06.10
843 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
849 ///________________________________________________________________________
850 Bool_t AliPrimaryPionCuts::SetPtCut(Int_t ptCut){
865 cout<<"Warning: PtCut not defined "<<ptCut<<endl;
872 ///________________________________________________________________________
873 Bool_t AliPrimaryPionCuts::SetDCACut(Int_t dcaCut)
876 if( !fEsdTrackCuts ) {
877 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
884 fEsdTrackCuts->SetMaxDCAToVertexZ(1000);
885 fEsdTrackCuts->SetMaxDCAToVertexXY(1000);
886 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
889 fEsdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
890 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
892 case 2: fEsdTrackCuts->SetMaxDCAToVertexZ(2);
893 fEsdTrackCuts->SetMaxDCAToVertexXY(1);
894 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
897 cout<<"Warning: dcaCut not defined "<<dcaCut<<endl;
903 ///________________________________________________________________________
904 Bool_t AliPrimaryPionCuts::SetTOFPionPIDCut(Int_t TOFelectronPID){
906 switch(TOFelectronPID){
908 fRequireTOF = kFALSE;
910 fPIDnSigmaBelowPionLineTOF=-100;
911 fPIDnSigmaAbovePionLineTOF=100;
914 fRequireTOF = kFALSE;
916 fPIDnSigmaBelowPionLineTOF=-7;
917 fPIDnSigmaAbovePionLineTOF=7;
920 fRequireTOF = kFALSE;
922 fPIDnSigmaBelowPionLineTOF=-5;
923 fPIDnSigmaAbovePionLineTOF=5;
926 fRequireTOF = kFALSE;
928 fPIDnSigmaBelowPionLineTOF=-3;
929 fPIDnSigmaAbovePionLineTOF=5;
932 fRequireTOF = kFALSE;
934 fPIDnSigmaBelowPionLineTOF=-2;
935 fPIDnSigmaAbovePionLineTOF=3;
937 case 5: // -3, 3 TOF mandatory
940 fPIDnSigmaBelowPionLineTOF= -3;
941 fPIDnSigmaAbovePionLineTOF= 3;
944 cout<<"Warning: TOFPionCut not defined "<<TOFelectronPID<<endl;
951 ///________________________________________________________________________
952 TString AliPrimaryPionCuts::GetCutNumber(){
953 // returns TString with current cut number
955 for(Int_t ii=0;ii<kNCuts;ii++){
956 a.Append(Form("%d",fCuts[ii]));
962 ///________________________________________________________________________
963 AliPrimaryPionCuts* AliPrimaryPionCuts::GetStandardCuts2010PbPb(){
964 //Create and return standard 2010 PbPb cuts
965 AliPrimaryPionCuts *cuts=new AliPrimaryPionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
966 if(!cuts->InitializeCutsFromCutString("9069640364102")){
967 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;
972 ///________________________________________________________________________
973 AliPrimaryPionCuts* AliPrimaryPionCuts::GetStandardCuts2010pp(){
974 //Create and return standard 2010 PbPb cuts
975 AliPrimaryPionCuts *cuts=new AliPrimaryPionCuts("StandardCuts2010pp","StandardCuts2010pp");
977 if(!cuts->InitializeCutsFromCutString("9069640364102")){
978 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;