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] = {
61 //________________________________________________________________________
62 AliPrimaryPionCuts::AliPrimaryPionCuts(const char *name,const char *title) : AliAnalysisCuts(name,title),
70 fMinClsTPC(0), // minimum clusters in the TPC
71 fMinClsTPCToF(0), // minimum clusters to findable clusters
72 fDodEdxSigmaITSCut(kFALSE),
73 fDodEdxSigmaTPCCut(kTRUE),
74 fDoTOFsigmaCut(kFALSE), // RRnewTOF
75 fPIDnSigmaAbovePionLineITS(100),
76 fPIDnSigmaBelowPionLineITS(-100),
77 fPIDnSigmaAbovePionLineTPC(100),
78 fPIDnSigmaBelowPionLineTPC(-100),
79 fPIDnSigmaAbovePionLineTOF(100), // RRnewTOF
80 fPIDnSigmaBelowPionLineTOF(-100), // RRnewTOF
81 fUseCorrectedTPCClsInfo(kFALSE),
90 fHistITSdEdxbefore(NULL),
91 fHistITSdEdxafter(NULL),
92 fHistTPCdEdxbefore(NULL),
93 fHistTPCdEdxafter(NULL),
94 fHistTPCdEdxSignalbefore(NULL),
95 fHistTPCdEdxSignalafter(NULL),
98 fHistTrackDCAxyPtbefore(NULL),
99 fHistTrackDCAxyPtafter(NULL),
100 fHistTrackDCAzPtbefore(NULL),
101 fHistTrackDCAzPtafter(NULL),
102 fHistTrackNFindClsPtTPCbefore(NULL),
103 fHistTrackNFindClsPtTPCafter(NULL)
106 for(Int_t jj=0;jj<kNCuts;jj++){ fCuts[jj]=0; }
107 fCutString=new TObjString((GetCutNumber()).Data());
109 // Using standard function for setting Cuts
110 Bool_t selectPrimaries=kFALSE;
111 fEsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
114 //________________________________________________________________________
115 AliPrimaryPionCuts::~AliPrimaryPionCuts() {
117 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
119 // delete fHistograms;
120 // fHistograms = NULL;
122 if(fCutString != NULL){
128 //________________________________________________________________________
129 void AliPrimaryPionCuts::InitCutHistograms(TString name, Bool_t preCut,TString cutNumber){
131 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
133 TString cutName = "";
136 cutName = GetCutNumber().Data();
139 cutName = cutNumber.Data();
142 if(fHistograms != NULL){
146 if(fHistograms==NULL){
147 fHistograms=new TList();
148 if(name=="")fHistograms->SetName(Form("PionCuts_%s",cutName.Data()));
149 else fHistograms->SetName(Form("%s_%s",name.Data(),cutName.Data()));
153 fHistCutIndex=new TH1F(Form("IsPionSelected %s",cutName.Data()),"IsPionSelected",10,-0.5,9.5);
154 fHistCutIndex->GetXaxis()->SetBinLabel(kPionIn+1,"in");
155 fHistCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
156 fHistCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
157 fHistCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
158 fHistCutIndex->GetXaxis()->SetBinLabel(kPionOut+1,"out");
159 fHistograms->Add(fHistCutIndex);
162 fHistdEdxCuts=new TH1F(Form("dEdxCuts %s",cutName.Data()),"dEdxCuts",5,-0.5,4.5);
163 fHistdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
164 fHistdEdxCuts->GetXaxis()->SetBinLabel(2,"ITSpion");
165 fHistdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
166 fHistdEdxCuts->GetXaxis()->SetBinLabel(4,"TOFpion");
167 fHistdEdxCuts->GetXaxis()->SetBinLabel(5,"out");
168 fHistograms->Add(fHistdEdxCuts);
170 TAxis *axisBeforeITS = NULL;
171 TAxis *axisBeforedEdx = NULL;
172 TAxis *axisBeforeTOF = NULL;
173 TAxis *axisBeforedEdxSignal = NULL;
176 fHistITSdEdxbefore=new TH2F(Form("Pion_ITS_before %s",cutName.Data()),"ITS dEdx pion before" ,150,0.05,20,400,-10,10);
177 fHistograms->Add(fHistITSdEdxbefore);
178 axisBeforeITS = fHistITSdEdxbefore->GetXaxis();
180 fHistTPCdEdxbefore=new TH2F(Form("Pion_dEdx_before %s",cutName.Data()),"dEdx pion before" ,150,0.05,20,400,-10,10);
181 fHistograms->Add(fHistTPCdEdxbefore);
182 axisBeforedEdx = fHistTPCdEdxbefore->GetXaxis();
184 fHistTPCdEdxSignalbefore=new TH2F(Form("Pion_dEdxSignal_before %s",cutName.Data()),"dEdx pion signal before" ,150,0.05,20.0,800,0.0,200);
185 fHistograms->Add(fHistTPCdEdxSignalbefore);
186 axisBeforedEdxSignal = fHistTPCdEdxSignalbefore->GetXaxis();
188 fHistTOFbefore=new TH2F(Form("Pion_TOF_before %s",cutName.Data()),"TOF pion before" ,150,0.05,20,400,-6,10);
189 fHistograms->Add(fHistTOFbefore);
190 axisBeforeTOF = fHistTOFbefore->GetXaxis();
192 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.);
193 fHistograms->Add(fHistTrackDCAxyPtbefore);
195 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.);
196 fHistograms->Add(fHistTrackDCAzPtbefore);
198 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.);
199 fHistograms->Add(fHistTrackNFindClsPtTPCbefore);
202 fHistITSdEdxafter=new TH2F(Form("Pion_ITS_after %s",cutName.Data()),"ITS dEdx pion after" ,150,0.05,20,400, -10,10);
203 fHistograms->Add(fHistITSdEdxafter);
205 fHistTPCdEdxafter=new TH2F(Form("Pion_dEdx_after %s",cutName.Data()),"dEdx pion after" ,150,0.05,20,400, -10,10);
206 fHistograms->Add(fHistTPCdEdxafter);
208 fHistTPCdEdxSignalafter=new TH2F(Form("Pion_dEdxSignal_after %s",cutName.Data()),"dEdx pion signal after" ,150,0.05,20.0,800,0.0,200);
209 fHistograms->Add(fHistTPCdEdxSignalafter);
211 fHistTOFafter=new TH2F(Form("Pion_TOF_after %s",cutName.Data()),"TOF pion after" ,150,0.05,20,400,-6,10);
212 fHistograms->Add(fHistTOFafter);
214 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.);
215 fHistograms->Add(fHistTrackDCAxyPtafter);
217 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.);
218 fHistograms->Add(fHistTrackDCAzPtafter);
220 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.);
221 fHistograms->Add(fHistTrackNFindClsPtTPCafter);
223 TAxis *AxisAfter = fHistTPCdEdxafter->GetXaxis();
224 Int_t bins = AxisAfter->GetNbins();
225 Double_t from = AxisAfter->GetXmin();
226 Double_t to = AxisAfter->GetXmax();
227 Double_t *newBins = new Double_t[bins+1];
229 Double_t factor = TMath::Power(to/from, 1./bins);
230 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
231 AxisAfter->Set(bins, newBins);
232 AxisAfter = fHistTOFafter->GetXaxis();
233 AxisAfter->Set(bins, newBins);
234 AxisAfter = fHistITSdEdxafter->GetXaxis();
235 AxisAfter->Set(bins,newBins);
236 AxisAfter = fHistTPCdEdxSignalafter->GetXaxis();
237 AxisAfter->Set(bins,newBins);
240 axisBeforeITS->Set(bins, newBins);
241 axisBeforedEdx->Set(bins, newBins);
242 axisBeforedEdxSignal->Set(bins,newBins);
243 axisBeforeTOF->Set(bins, newBins);
248 // Event Cuts and Info
252 //________________________________________________________________________
253 Bool_t AliPrimaryPionCuts::InitPIDResponse(){
255 // Set Pointer to AliPIDResponse
257 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
260 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
261 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
262 if(fPIDResponse)return kTRUE;
268 ///________________________________________________________________________
269 Bool_t AliPrimaryPionCuts::PionIsSelectedMC(Int_t labelParticle,AliStack *fMCStack){
271 if( labelParticle < 0 || labelParticle >= fMCStack->GetNtrack() ) return kFALSE;
272 if( fMCStack->IsPhysicalPrimary(labelParticle) == kFALSE ) return kFALSE;
274 TParticle* particle = fMCStack->Particle(labelParticle);
276 if( TMath::Abs( particle->GetPdgCode() ) != 211 ) return kFALSE;
279 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
287 ///________________________________________________________________________
288 Bool_t AliPrimaryPionCuts::PionIsSelected(AliESDtrack* lTrack){
289 //Selection of Reconstructed electrons
293 lTrack->GetImpactParameters(b,bCov);
295 if (bCov[0]<=0 || bCov[2]<=0) {
296 AliDebug(1, "Estimated b resolution lower or equal zero!");
297 bCov[0]=0; bCov[2]=0;
300 Float_t dcaToVertexXY = b[0];
301 Float_t dcaToVertexZ = b[1];
302 Double_t clsToF = GetNFindableClustersTPC(lTrack);
304 if (fHistTrackDCAxyPtbefore) fHistTrackDCAxyPtbefore->Fill(dcaToVertexXY,lTrack->Pt());
305 if (fHistTrackDCAzPtbefore) fHistTrackDCAzPtbefore->Fill( dcaToVertexZ, lTrack->Pt());
306 if (fHistTrackNFindClsPtTPCbefore) fHistTrackNFindClsPtTPCbefore->Fill( clsToF, lTrack->Pt());
308 if (fHistCutIndex) fHistCutIndex->Fill(kPionIn);
311 if (fHistCutIndex) fHistCutIndex->Fill(kNoTracks);
315 if ( ! lTrack->GetConstrainedParam() ){
318 AliVTrack * track = dynamic_cast<AliVTrack*>(lTrack);
321 if( !TrackIsSelected(lTrack) ){
322 if (fHistCutIndex) fHistCutIndex->Fill(kTrackCuts);
327 if( ! dEdxCuts( track ) ) {
328 if(fHistCutIndex)fHistCutIndex->Fill(kdEdxCuts);
333 //Pion passed the cuts
334 if (fHistCutIndex) fHistCutIndex->Fill(kPionOut);
335 if (fHistTrackDCAxyPtafter) fHistTrackDCAxyPtafter->Fill(dcaToVertexXY,lTrack->Pt());
336 if (fHistTrackDCAzPtafter) fHistTrackDCAzPtafter->Fill(dcaToVertexZ,lTrack->Pt());
337 if (fHistTrackNFindClsPtTPCafter) fHistTrackNFindClsPtTPCafter->Fill( clsToF, lTrack->Pt());
342 ///________________________________________________________________________
343 Bool_t AliPrimaryPionCuts::TrackIsSelected(AliESDtrack* lTrack) {
344 // Track Selection for Photon Reconstruction
346 Double_t clsToF = GetNFindableClustersTPC(lTrack);
348 if( ! fEsdTrackCuts->AcceptTrack(lTrack) ){
353 if( lTrack->Eta() > (fEtaCut + fEtaShift) || lTrack->Eta() < (-fEtaCut + fEtaShift) ) {
358 if( lTrack->Pt() < fPtCut ) {
362 if( clsToF < fMinClsTPCToF){
369 ///________________________________________________________________________
370 Bool_t AliPrimaryPionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
372 // Pion Identification Cuts for Photon reconstruction
374 if(!fPIDResponse){ InitPIDResponse(); }// Try to reinitialize PID Response
375 if(!fPIDResponse){ AliError("No PID Response"); return kFALSE;}// if still missing fatal error
379 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
380 if(fHistITSdEdxbefore)fHistITSdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kPion));
381 if(fHistTPCdEdxbefore)fHistTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kPion));
382 if(fHistTPCdEdxSignalbefore)fHistTPCdEdxSignalbefore->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
386 if( fDodEdxSigmaITSCut == kTRUE ){
387 if( fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kPion)<fPIDnSigmaBelowPionLineITS ||
388 fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kPion)> fPIDnSigmaAbovePionLineITS ){
389 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
394 if(fHistITSdEdxafter)fHistITSdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kPion));
400 if(fDodEdxSigmaTPCCut == kTRUE){
402 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaBelowPionLineTPC ||
403 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)>fPIDnSigmaAbovePionLineTPC){
404 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
408 } else { cutIndex+=1; }
410 if( ( fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid ) && ( !( fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch) ) ){
411 if(fHistTOFbefore) fHistTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion));
413 if( fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion)>fPIDnSigmaAbovePionLineTOF ||
414 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion)<fPIDnSigmaBelowPionLineTOF ){
415 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
419 if(fHistTOFafter)fHistTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion));
420 } else if ( fRequireTOF == kTRUE ) {
421 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
426 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
427 if(fHistTPCdEdxafter)fHistTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kPion));
428 if(fHistTPCdEdxSignalafter)fHistTPCdEdxSignalafter->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
433 ///________________________________________________________________________
434 AliVTrack *AliPrimaryPionCuts::GetTrack(AliVEvent * event, Int_t label){
435 //Returns pointer to the track with given ESD label
436 //(Important for AOD implementation, since Track array in AOD data is different
437 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
439 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
441 if(label > event->GetNumberOfTracks() ) return NULL;
442 AliESDtrack * track = esdEvent->GetTrack(label);
445 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
446 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
448 if(track->GetID() == label) {
454 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
458 ///________________________________________________________________________
459 Double_t AliPrimaryPionCuts::GetNFindableClustersTPC(AliESDtrack* lTrack){
462 if ( !fUseCorrectedTPCClsInfo ){
463 if(lTrack->GetTPCNclsF()!=0){
464 clsToF = (Double_t)lTrack->GetNcls(1)/(Double_t)lTrack->GetTPCNclsF();
467 clsToF = lTrack->GetTPCClusterInfo(2,0); //NOTE ask friederike
473 ///________________________________________________________________________
474 Bool_t AliPrimaryPionCuts::UpdateCutString() {
475 ///Update the cut string (if it has been created yet)
477 if(fCutString && fCutString->GetString().Length() == kNCuts) {
478 fCutString->SetString(GetCutNumber());
486 ///________________________________________________________________________
487 Bool_t AliPrimaryPionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
488 // Initialize Cuts from a given Cut string
490 AliInfo(Form("Set PionCuts Number: %s",analysisCutSelection.Data()));
492 if(analysisCutSelection.Length()!=kNCuts) {
493 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
496 if(!analysisCutSelection.IsDigit()){
497 AliError("Cut selection contains characters");
501 const char *cutSelection = analysisCutSelection.Data();
502 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
503 for(Int_t ii=0;ii<kNCuts;ii++){
507 // Set Individual Cuts
508 for(Int_t ii=0;ii<kNCuts;ii++){
509 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
515 ///________________________________________________________________________
516 Bool_t AliPrimaryPionCuts::SetCut(cutIds cutID, const Int_t value) {
517 ///Set individual cut ID
519 //cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
523 if( SetEtaCut(value)) {
524 fCuts[kEtaCut] = value;
527 } else return kFALSE;
529 if( SetITSClusterCut(value) ) {
530 fCuts[kClsITSCut] = value;
533 } else return kFALSE;
535 if( SetTPCClusterCut(value)) {
536 fCuts[kClsTPCCut] = value;
539 } else return kFALSE;
541 if( SetDCACut(value)) {
542 fCuts[kDCACut] = value;
545 } else return kFALSE;
547 if( SetPtCut(value)) {
548 fCuts[kPtCut] = value;
551 } else return kFALSE;
552 case kPidedxSigmaITSCut:
553 if( SetITSdEdxCutPionLine(value)) {
554 fCuts[kPidedxSigmaITSCut] = value;
557 } else return kFALSE;
558 case kPidedxSigmaTPCCut:
559 if( SetTPCdEdxCutPionLine(value)) {
560 fCuts[kPidedxSigmaTPCCut] = value;
563 } else return kFALSE;
565 if( SetTOFPionPIDCut(value)) {
566 fCuts[kPiTOFSigmaPID] = value;
569 } else return kFALSE;
571 if( SetMassCut(value)) {
572 fCuts[kMassCut] = value;
575 } else return kFALSE;
577 cout << "Error:: Cut id out of range"<< endl;
581 cout << "Error:: Cut id " << cutID << " not recognized "<< endl;
585 ///________________________________________________________________________
587 void AliPrimaryPionCuts::PrintCuts() {
588 // Print out current Cut Selection
589 for(Int_t ic = 0; ic < kNCuts; ic++) {
590 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
594 ///________________________________________________________________________
595 Bool_t AliPrimaryPionCuts::SetITSdEdxCutPionLine(Int_t ededxSigmaCut){
596 switch(ededxSigmaCut){
598 fDodEdxSigmaITSCut = kFALSE;
599 fPIDnSigmaBelowPionLineITS=-100;
600 fPIDnSigmaAbovePionLineITS= 100;
603 fDodEdxSigmaITSCut = kTRUE;
604 fPIDnSigmaBelowPionLineITS=-10;
605 fPIDnSigmaAbovePionLineITS=10;
608 fDodEdxSigmaITSCut = kTRUE;
609 fPIDnSigmaBelowPionLineITS=-6;
610 fPIDnSigmaAbovePionLineITS=7;
613 fDodEdxSigmaITSCut = kTRUE;
614 fPIDnSigmaBelowPionLineITS=-5;
615 fPIDnSigmaAbovePionLineITS=5;
618 fDodEdxSigmaITSCut = kTRUE;
619 fPIDnSigmaBelowPionLineITS=-4;
620 fPIDnSigmaAbovePionLineITS=5;
623 fDodEdxSigmaITSCut = kTRUE;
624 fPIDnSigmaBelowPionLineITS=-3;
625 fPIDnSigmaAbovePionLineITS=5;
628 fDodEdxSigmaITSCut = kTRUE;
629 fPIDnSigmaBelowPionLineITS=-4;
630 fPIDnSigmaAbovePionLineITS=4;
633 fDodEdxSigmaITSCut = kTRUE;
634 fPIDnSigmaBelowPionLineITS=-2.5;
635 fPIDnSigmaAbovePionLineITS=4;
638 fDodEdxSigmaITSCut = kTRUE;
639 fPIDnSigmaBelowPionLineITS=-2;
640 fPIDnSigmaAbovePionLineITS=3.5;
643 cout<<"Warning: ITSdEdxCutPionLine not defined"<<ededxSigmaCut<<endl;
650 ///________________________________________________________________________
651 Bool_t AliPrimaryPionCuts::SetTPCdEdxCutPionLine(Int_t ededxSigmaCut){
652 switch(ededxSigmaCut){
654 fDodEdxSigmaTPCCut = kFALSE;
655 fPIDnSigmaBelowPionLineTPC=-10;
656 fPIDnSigmaAbovePionLineTPC=10;
659 fDodEdxSigmaTPCCut = kTRUE;
660 fPIDnSigmaBelowPionLineTPC=-10;
661 fPIDnSigmaAbovePionLineTPC=10;
664 fDodEdxSigmaTPCCut = kTRUE;
665 fPIDnSigmaBelowPionLineTPC=-6;
666 fPIDnSigmaAbovePionLineTPC=7;
669 fDodEdxSigmaTPCCut = kTRUE;
670 fPIDnSigmaBelowPionLineTPC=-5;
671 fPIDnSigmaAbovePionLineTPC=5;
674 fDodEdxSigmaTPCCut = kTRUE;
675 fPIDnSigmaBelowPionLineTPC=-4;
676 fPIDnSigmaAbovePionLineTPC=5;
679 fDodEdxSigmaTPCCut = kTRUE;
680 fPIDnSigmaBelowPionLineTPC=-3;
681 fPIDnSigmaAbovePionLineTPC=5;
684 fDodEdxSigmaTPCCut = kTRUE;
685 fPIDnSigmaBelowPionLineTPC=-4;
686 fPIDnSigmaAbovePionLineTPC=4;
689 fDodEdxSigmaTPCCut = kTRUE;
690 fPIDnSigmaBelowPionLineTPC=-2.5;
691 fPIDnSigmaAbovePionLineTPC=4;
694 fDodEdxSigmaTPCCut = kTRUE;
695 fPIDnSigmaBelowPionLineTPC=-2;
696 fPIDnSigmaAbovePionLineTPC=3.5;
699 cout<<"Warning: TPCdEdxCutPionLine not defined"<<ededxSigmaCut<<endl;
705 ///________________________________________________________________________
706 Bool_t AliPrimaryPionCuts::SetITSClusterCut(Int_t clsITSCut){
707 if( !fEsdTrackCuts ) {
708 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
714 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
717 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
718 break; //1 hit first layer of SPD
720 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
721 break; //1 hit in any layer of SPD
723 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
724 fEsdTrackCuts->SetMinNClustersITS(4);
725 // 4 hits in total in the ITS. At least 1 hit in the first layer of SPD
728 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
729 fEsdTrackCuts->SetMinNClustersITS(3);
730 // 3 hits in total in the ITS. At least 1 hit in any layer of SPD
733 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
734 fEsdTrackCuts->SetMinNClustersITS(4);
735 // 4 hits in total in the ITS. At least 1 hit in any layer of SPD
738 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
739 fEsdTrackCuts->SetMinNClustersITS(5);
740 // 5 hits in total in the ITS. At least 1 hit in any layer of SPD
743 cout<<"Warning: clsITSCut not defined "<<clsITSCut<<endl;
749 ///________________________________________________________________________
750 Bool_t AliPrimaryPionCuts::SetTPCClusterCut(Int_t clsTPCCut){
754 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
758 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
762 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
766 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
768 case 4: // 0% of findable clusters
770 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
772 fUseCorrectedTPCClsInfo=0;
774 case 5: // 35% of findable clusters
776 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
778 fUseCorrectedTPCClsInfo=0;
780 case 6: // 60% of findable clusters
782 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
784 fUseCorrectedTPCClsInfo=0;
786 case 7: // 70% of findable clusters
788 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
790 fUseCorrectedTPCClsInfo=0;
792 case 8: fMinClsTPC = 0.;
793 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
795 fUseCorrectedTPCClsInfo=0;
797 case 9: // 35% of findable clusters
799 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
801 fUseCorrectedTPCClsInfo=1;
805 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
811 ///________________________________________________________________________
812 Bool_t AliPrimaryPionCuts::SetEtaCut(Int_t etaCut){
840 fEtaCut = 0.6; //changed from 0.4 to 0.6 2013.06.10
844 fEtaCut = 0.5; //changed from 0.3 to 0.5 2013.06.10
852 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
858 ///________________________________________________________________________
859 Bool_t AliPrimaryPionCuts::SetPtCut(Int_t ptCut){
874 cout<<"Warning: PtCut not defined "<<ptCut<<endl;
881 ///________________________________________________________________________
882 Bool_t AliPrimaryPionCuts::SetDCACut(Int_t dcaCut)
885 if( !fEsdTrackCuts ) {
886 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
893 fEsdTrackCuts->SetMaxDCAToVertexZ(1000);
894 fEsdTrackCuts->SetMaxDCAToVertexXY(1000);
895 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
898 fEsdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
899 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
901 case 2: fEsdTrackCuts->SetMaxDCAToVertexZ(2);
902 fEsdTrackCuts->SetMaxDCAToVertexXY(1);
903 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
906 cout<<"Warning: dcaCut not defined "<<dcaCut<<endl;
912 ///________________________________________________________________________
913 Bool_t AliPrimaryPionCuts::SetTOFPionPIDCut(Int_t TOFelectronPID){
915 switch(TOFelectronPID){
917 fRequireTOF = kFALSE;
919 fPIDnSigmaBelowPionLineTOF=-100;
920 fPIDnSigmaAbovePionLineTOF=100;
923 fRequireTOF = kFALSE;
925 fPIDnSigmaBelowPionLineTOF=-7;
926 fPIDnSigmaAbovePionLineTOF=7;
929 fRequireTOF = kFALSE;
931 fPIDnSigmaBelowPionLineTOF=-5;
932 fPIDnSigmaAbovePionLineTOF=5;
935 fRequireTOF = kFALSE;
937 fPIDnSigmaBelowPionLineTOF=-3;
938 fPIDnSigmaAbovePionLineTOF=5;
941 fRequireTOF = kFALSE;
943 fPIDnSigmaBelowPionLineTOF=-2;
944 fPIDnSigmaAbovePionLineTOF=3;
946 case 5: // -3, 3 TOF mandatory
949 fPIDnSigmaBelowPionLineTOF= -3;
950 fPIDnSigmaAbovePionLineTOF= 3;
953 cout<<"Warning: TOFPionCut not defined "<<TOFelectronPID<<endl;
959 ///________________________________________________________________________
960 Bool_t AliPrimaryPionCuts::SetMassCut(Int_t massCut){
967 case 1: // cut at 1 GeV/c^2
971 case 2: // cut at 0.7 GeV/c^2
975 case 3: // cut at 0.6 GeV/c^2
979 case 4: // cut at eta mass
983 case 5: // cut at 0.5 GeV/c^2
988 cout<<"Warning: MassCut not defined "<<massCut<<endl;
995 ///________________________________________________________________________
996 TString AliPrimaryPionCuts::GetCutNumber(){
997 // returns TString with current cut number
999 for(Int_t ii=0;ii<kNCuts;ii++){
1000 a.Append(Form("%d",fCuts[ii]));
1006 ///________________________________________________________________________
1007 AliPrimaryPionCuts* AliPrimaryPionCuts::GetStandardCuts2010PbPb(){
1008 //Create and return standard 2010 PbPb cuts
1009 AliPrimaryPionCuts *cuts=new AliPrimaryPionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
1010 if(!cuts->InitializeCutsFromCutString("000000400")){
1011 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;
1016 ///________________________________________________________________________
1017 AliPrimaryPionCuts* AliPrimaryPionCuts::GetStandardCuts2010pp(){
1018 //Create and return standard 2010 PbPb cuts
1019 AliPrimaryPionCuts *cuts=new AliPrimaryPionCuts("StandardCuts2010pp","StandardCuts2010pp");
1021 if(!cuts->InitializeCutsFromCutString("000000400")){
1022 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;