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] = {
55 "kPiDedxSigmaITSCut", // 5
56 "kPiDedxSigmaTPCCut", // 6
57 "kPiTOFSigmaCut", // 7
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),
104 fStringITSClusterCut("")
107 for(Int_t jj=0;jj<kNCuts;jj++){ fCuts[jj]=0; }
108 fCutString=new TObjString((GetCutNumber()).Data());
110 // Using standard function for setting Cuts
111 Bool_t selectPrimaries=kFALSE;
112 if (fEsdTrackCuts==NULL)fEsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
115 //________________________________________________________________________
116 AliPrimaryPionCuts::~AliPrimaryPionCuts() {
118 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
120 // delete fHistograms;
121 // fHistograms = NULL;
123 if(fCutString != NULL){
129 //________________________________________________________________________
130 void AliPrimaryPionCuts::InitCutHistograms(TString name, Bool_t preCut,TString cutNumber){
132 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
134 TString cutName = "";
137 cutName = GetCutNumber().Data();
140 cutName = cutNumber.Data();
143 if(fHistograms != NULL){
147 if(fHistograms==NULL){
148 fHistograms=new TList();
149 if(name=="")fHistograms->SetName(Form("PionCuts_%s",cutName.Data()));
150 else fHistograms->SetName(Form("%s_%s",name.Data(),cutName.Data()));
154 fHistCutIndex=new TH1F(Form("IsPionSelected %s",cutName.Data()),"IsPionSelected",10,-0.5,9.5);
155 fHistCutIndex->GetXaxis()->SetBinLabel(kPionIn+1,"in");
156 fHistCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
157 fHistCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
158 fHistCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
159 fHistCutIndex->GetXaxis()->SetBinLabel(kPionOut+1,"out");
160 fHistograms->Add(fHistCutIndex);
163 fHistdEdxCuts=new TH1F(Form("dEdxCuts %s",cutName.Data()),"dEdxCuts",5,-0.5,4.5);
164 fHistdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
165 fHistdEdxCuts->GetXaxis()->SetBinLabel(2,"ITSpion");
166 fHistdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCpion");
167 fHistdEdxCuts->GetXaxis()->SetBinLabel(4,"TOFpion");
168 fHistdEdxCuts->GetXaxis()->SetBinLabel(5,"out");
169 fHistograms->Add(fHistdEdxCuts);
171 TAxis *axisBeforeITS = NULL;
172 TAxis *axisBeforedEdx = NULL;
173 TAxis *axisBeforeTOF = NULL;
174 TAxis *axisBeforedEdxSignal = NULL;
177 fHistITSdEdxbefore=new TH2F(Form("Pion_ITS_before %s",cutName.Data()),"ITS dEdx pion before" ,150,0.05,20,400,-10,10);
178 fHistograms->Add(fHistITSdEdxbefore);
179 axisBeforeITS = fHistITSdEdxbefore->GetXaxis();
181 fHistTPCdEdxbefore=new TH2F(Form("Pion_dEdx_before %s",cutName.Data()),"dEdx pion before" ,150,0.05,20,400,-10,10);
182 fHistograms->Add(fHistTPCdEdxbefore);
183 axisBeforedEdx = fHistTPCdEdxbefore->GetXaxis();
185 fHistTPCdEdxSignalbefore=new TH2F(Form("Pion_dEdxSignal_before %s",cutName.Data()),"dEdx pion signal before" ,150,0.05,20.0,800,0.0,200);
186 fHistograms->Add(fHistTPCdEdxSignalbefore);
187 axisBeforedEdxSignal = fHistTPCdEdxSignalbefore->GetXaxis();
189 fHistTOFbefore=new TH2F(Form("Pion_TOF_before %s",cutName.Data()),"TOF pion before" ,150,0.05,20,400,-6,10);
190 fHistograms->Add(fHistTOFbefore);
191 axisBeforeTOF = fHistTOFbefore->GetXaxis();
193 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.);
194 fHistograms->Add(fHistTrackDCAxyPtbefore);
196 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.);
197 fHistograms->Add(fHistTrackDCAzPtbefore);
199 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.);
200 fHistograms->Add(fHistTrackNFindClsPtTPCbefore);
203 fHistITSdEdxafter=new TH2F(Form("Pion_ITS_after %s",cutName.Data()),"ITS dEdx pion after" ,150,0.05,20,400, -10,10);
204 fHistograms->Add(fHistITSdEdxafter);
206 fHistTPCdEdxafter=new TH2F(Form("Pion_dEdx_after %s",cutName.Data()),"dEdx pion after" ,150,0.05,20,400, -10,10);
207 fHistograms->Add(fHistTPCdEdxafter);
209 fHistTPCdEdxSignalafter=new TH2F(Form("Pion_dEdxSignal_after %s",cutName.Data()),"dEdx pion signal after" ,150,0.05,20.0,800,0.0,200);
210 fHistograms->Add(fHistTPCdEdxSignalafter);
212 fHistTOFafter=new TH2F(Form("Pion_TOF_after %s",cutName.Data()),"TOF pion after" ,150,0.05,20,400,-6,10);
213 fHistograms->Add(fHistTOFafter);
215 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.);
216 fHistograms->Add(fHistTrackDCAxyPtafter);
218 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.);
219 fHistograms->Add(fHistTrackDCAzPtafter);
221 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.);
222 fHistograms->Add(fHistTrackNFindClsPtTPCafter);
224 TAxis *AxisAfter = fHistTPCdEdxafter->GetXaxis();
225 Int_t bins = AxisAfter->GetNbins();
226 Double_t from = AxisAfter->GetXmin();
227 Double_t to = AxisAfter->GetXmax();
228 Double_t *newBins = new Double_t[bins+1];
230 Double_t factor = TMath::Power(to/from, 1./bins);
231 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
232 AxisAfter->Set(bins, newBins);
233 AxisAfter = fHistTOFafter->GetXaxis();
234 AxisAfter->Set(bins, newBins);
235 AxisAfter = fHistITSdEdxafter->GetXaxis();
236 AxisAfter->Set(bins,newBins);
237 AxisAfter = fHistTPCdEdxSignalafter->GetXaxis();
238 AxisAfter->Set(bins,newBins);
241 axisBeforeITS->Set(bins, newBins);
242 axisBeforedEdx->Set(bins, newBins);
243 axisBeforedEdxSignal->Set(bins,newBins);
244 axisBeforeTOF->Set(bins, newBins);
249 // Event Cuts and Info
253 //________________________________________________________________________
254 Bool_t AliPrimaryPionCuts::InitPIDResponse(){
256 // Set Pointer to AliPIDResponse
258 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
261 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
262 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
263 if(fPIDResponse)return kTRUE;
269 ///________________________________________________________________________
270 Bool_t AliPrimaryPionCuts::PionIsSelectedMC(Int_t labelParticle,AliStack *fMCStack){
272 if( labelParticle < 0 || labelParticle >= fMCStack->GetNtrack() ) return kFALSE;
273 if( fMCStack->IsPhysicalPrimary(labelParticle) == kFALSE ) return kFALSE;
275 TParticle* particle = fMCStack->Particle(labelParticle);
277 if( TMath::Abs( particle->GetPdgCode() ) != 211 ) return kFALSE;
280 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
288 ///________________________________________________________________________
289 Bool_t AliPrimaryPionCuts::PionIsSelected(AliESDtrack* lTrack){
290 //Selection of Reconstructed electrons
294 lTrack->GetImpactParameters(b,bCov);
296 if (bCov[0]<=0 || bCov[2]<=0) {
297 AliDebug(1, "Estimated b resolution lower or equal zero!");
298 bCov[0]=0; bCov[2]=0;
301 Float_t dcaToVertexXY = b[0];
302 Float_t dcaToVertexZ = b[1];
303 Double_t clsToF = GetNFindableClustersTPC(lTrack);
306 if (fHistCutIndex) fHistCutIndex->Fill(kPionIn);
309 if (fHistCutIndex) fHistCutIndex->Fill(kNoTracks);
312 if (fHistTrackDCAxyPtbefore) fHistTrackDCAxyPtbefore->Fill(dcaToVertexXY,lTrack->Pt());
313 if (fHistTrackDCAzPtbefore) fHistTrackDCAzPtbefore->Fill( dcaToVertexZ, lTrack->Pt());
314 if (fHistTrackNFindClsPtTPCbefore) fHistTrackNFindClsPtTPCbefore->Fill( clsToF, lTrack->Pt());
317 if ( ! lTrack->GetConstrainedParam() ){
320 AliVTrack * track = dynamic_cast<AliVTrack*>(lTrack);
323 if( !TrackIsSelected(lTrack) ){
324 if (fHistCutIndex) fHistCutIndex->Fill(kTrackCuts);
329 if( ! dEdxCuts( track ) ) {
330 if(fHistCutIndex)fHistCutIndex->Fill(kdEdxCuts);
335 //Pion passed the cuts
336 if (fHistCutIndex) fHistCutIndex->Fill(kPionOut);
337 if (fHistTrackDCAxyPtafter) fHistTrackDCAxyPtafter->Fill(dcaToVertexXY,lTrack->Pt());
338 if (fHistTrackDCAzPtafter) fHistTrackDCAzPtafter->Fill(dcaToVertexZ,lTrack->Pt());
339 if (fHistTrackNFindClsPtTPCafter) fHistTrackNFindClsPtTPCafter->Fill( clsToF, lTrack->Pt());
344 ///________________________________________________________________________
345 Bool_t AliPrimaryPionCuts::TrackIsSelected(AliESDtrack* lTrack) {
346 // Track Selection for Photon Reconstruction
348 Double_t clsToF = GetNFindableClustersTPC(lTrack);
350 if( ! fEsdTrackCuts->AcceptTrack(lTrack) ){
355 if( lTrack->Eta() > (fEtaCut + fEtaShift) || lTrack->Eta() < (-fEtaCut + fEtaShift) ) {
360 if( lTrack->Pt() < fPtCut ) {
364 if( clsToF < fMinClsTPCToF){
371 ///________________________________________________________________________
372 Bool_t AliPrimaryPionCuts::dEdxCuts(AliVTrack *fCurrentTrack){
374 // Pion Identification Cuts for Photon reconstruction
376 if(!fPIDResponse){ InitPIDResponse(); }// Try to reinitialize PID Response
377 if(!fPIDResponse){ AliError("No PID Response"); return kFALSE;}// if still missing fatal error
381 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
382 if(fHistITSdEdxbefore)fHistITSdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kPion));
383 if(fHistTPCdEdxbefore)fHistTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kPion));
384 if(fHistTPCdEdxSignalbefore)fHistTPCdEdxSignalbefore->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
388 if( fDodEdxSigmaITSCut == kTRUE ){
389 if( fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kPion)<fPIDnSigmaBelowPionLineITS ||
390 fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kPion)> fPIDnSigmaAbovePionLineITS ){
391 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
396 if(fHistITSdEdxafter)fHistITSdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kPion));
402 if(fDodEdxSigmaTPCCut == kTRUE){
404 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaBelowPionLineTPC ||
405 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)>fPIDnSigmaAbovePionLineTPC){
406 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
410 } else { cutIndex+=1; }
412 if( ( fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid ) && ( !( fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch) ) ){
413 if(fHistTOFbefore) fHistTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion));
415 if( fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion)>fPIDnSigmaAbovePionLineTOF ||
416 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion)<fPIDnSigmaBelowPionLineTOF ){
417 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
421 if(fHistTOFafter)fHistTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kPion));
422 } else if ( fRequireTOF == kTRUE ) {
423 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
428 if(fHistdEdxCuts)fHistdEdxCuts->Fill(cutIndex);
429 if(fHistTPCdEdxafter)fHistTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kPion));
430 if(fHistTPCdEdxSignalafter)fHistTPCdEdxSignalafter->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
435 ///________________________________________________________________________
436 AliVTrack *AliPrimaryPionCuts::GetTrack(AliVEvent * event, Int_t label){
437 //Returns pointer to the track with given ESD label
438 //(Important for AOD implementation, since Track array in AOD data is different
439 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
441 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
443 if(label > event->GetNumberOfTracks() ) return NULL;
444 AliESDtrack * track = esdEvent->GetTrack(label);
447 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
448 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
450 if(track->GetID() == label) {
456 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
460 ///________________________________________________________________________
461 Double_t AliPrimaryPionCuts::GetNFindableClustersTPC(AliESDtrack* lTrack){
464 if ( !fUseCorrectedTPCClsInfo ){
465 if(lTrack->GetTPCNclsF()!=0){
466 clsToF = (Double_t)lTrack->GetNcls(1)/(Double_t)lTrack->GetTPCNclsF();
469 clsToF = lTrack->GetTPCClusterInfo(2,0); //NOTE ask friederike
475 ///________________________________________________________________________
476 Bool_t AliPrimaryPionCuts::UpdateCutString() {
477 ///Update the cut string (if it has been created yet)
479 if(fCutString && fCutString->GetString().Length() == kNCuts) {
480 fCutString->SetString(GetCutNumber());
488 ///________________________________________________________________________
489 Bool_t AliPrimaryPionCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
490 // Initialize Cuts from a given Cut string
492 AliInfo(Form("Set PionCuts Number: %s",analysisCutSelection.Data()));
494 if(analysisCutSelection.Length()!=kNCuts) {
495 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
498 if(!analysisCutSelection.IsDigit()){
499 AliError("Cut selection contains characters");
503 const char *cutSelection = analysisCutSelection.Data();
504 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
505 for(Int_t ii=0;ii<kNCuts;ii++){
509 // Set Individual Cuts
510 for(Int_t ii=0;ii<kNCuts;ii++){
511 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
514 PrintCutsWithValues();
517 ///________________________________________________________________________
518 Bool_t AliPrimaryPionCuts::SetCut(cutIds cutID, const Int_t value) {
519 ///Set individual cut ID
521 //cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
525 if( SetEtaCut(value)) {
526 fCuts[kEtaCut] = value;
529 } else return kFALSE;
531 if( SetITSClusterCut(value) ) {
532 fCuts[kClsITSCut] = value;
535 } else return kFALSE;
537 if( SetTPCClusterCut(value)) {
538 fCuts[kClsTPCCut] = value;
541 } else return kFALSE;
543 if( SetDCACut(value)) {
544 fCuts[kDCACut] = value;
547 } else return kFALSE;
549 if( SetPtCut(value)) {
550 fCuts[kPtCut] = value;
553 } else return kFALSE;
554 case kPidedxSigmaITSCut:
555 if( SetITSdEdxCutPionLine(value)) {
556 fCuts[kPidedxSigmaITSCut] = value;
559 } else return kFALSE;
560 case kPidedxSigmaTPCCut:
561 if( SetTPCdEdxCutPionLine(value)) {
562 fCuts[kPidedxSigmaTPCCut] = value;
565 } else return kFALSE;
567 if( SetTOFPionPIDCut(value)) {
568 fCuts[kPiTOFSigmaPID] = value;
571 } else return kFALSE;
573 if( SetMassCut(value)) {
574 fCuts[kMassCut] = value;
577 } else return kFALSE;
579 cout << "Error:: Cut id out of range"<< endl;
583 cout << "Error:: Cut id " << cutID << " not recognized "<< endl;
587 ///________________________________________________________________________
588 void AliPrimaryPionCuts::PrintCuts() {
589 // Print out current Cut Selection
590 for(Int_t ic = 0; ic < kNCuts; ic++) {
591 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
595 ///________________________________________________________________________
596 void AliPrimaryPionCuts::PrintCutsWithValues() {
597 // Print out current Cut Selection with value
598 printf("\nCharged Pion cutnumber \n");
599 for(Int_t ic = 0; ic < kNCuts; ic++) {
600 printf("%d",fCuts[ic]);
604 printf("Acceptance cuts \n");
605 if (fDoEtaCut) printf("\t |eta_{pi+-}| < %3.2f \n", fEtaCut);
606 else printf("\t none \n");
607 printf("Track cuts \n");
608 printf("\t %s \n", fStringITSClusterCut.Data());
609 printf("\t min N cluster TPC > %3.2f \n", fMinClsTPC);
610 printf("\t min N cluster TPC/ findable > %3.2f \n", fMinClsTPCToF);
611 // printf("\t dca > %3.2f \n", fMinClsTPCToF);
613 printf("\t min pT > %3.2f \n", fPtCut);
614 printf("PID cuts \n");
615 if (fDodEdxSigmaITSCut)printf("\t %3.2f < ITS n_sigma pi < %3.2f \n", fPIDnSigmaBelowPionLineITS, fPIDnSigmaAbovePionLineITS );
616 if (fDodEdxSigmaTPCCut)printf("\t %3.2f < TPC n_sigma pi < %3.2f \n", fPIDnSigmaBelowPionLineTPC, fPIDnSigmaAbovePionLineTPC );
617 if (fDoTOFsigmaCut)printf("\t %3.2f < TOF n_sigma pi < %3.2f \n", fPIDnSigmaBelowPionLineTOF, fPIDnSigmaAbovePionLineTOF );
618 if (fDoMassCut) printf("two-pion mass cut < %3.2f \n", fMassCut);
624 ///________________________________________________________________________
625 Bool_t AliPrimaryPionCuts::SetITSdEdxCutPionLine(Int_t ededxSigmaCut){
626 switch(ededxSigmaCut){
628 fDodEdxSigmaITSCut = kFALSE;
629 fPIDnSigmaBelowPionLineITS=-100;
630 fPIDnSigmaAbovePionLineITS= 100;
633 fDodEdxSigmaITSCut = kTRUE;
634 fPIDnSigmaBelowPionLineITS=-10;
635 fPIDnSigmaAbovePionLineITS=10;
638 fDodEdxSigmaITSCut = kTRUE;
639 fPIDnSigmaBelowPionLineITS=-6;
640 fPIDnSigmaAbovePionLineITS=7;
643 fDodEdxSigmaITSCut = kTRUE;
644 fPIDnSigmaBelowPionLineITS=-5;
645 fPIDnSigmaAbovePionLineITS=5;
648 fDodEdxSigmaITSCut = kTRUE;
649 fPIDnSigmaBelowPionLineITS=-4;
650 fPIDnSigmaAbovePionLineITS=5;
653 fDodEdxSigmaITSCut = kTRUE;
654 fPIDnSigmaBelowPionLineITS=-3;
655 fPIDnSigmaAbovePionLineITS=5;
658 fDodEdxSigmaITSCut = kTRUE;
659 fPIDnSigmaBelowPionLineITS=-4;
660 fPIDnSigmaAbovePionLineITS=4;
663 fDodEdxSigmaITSCut = kTRUE;
664 fPIDnSigmaBelowPionLineITS=-2.5;
665 fPIDnSigmaAbovePionLineITS=4;
668 fDodEdxSigmaITSCut = kTRUE;
669 fPIDnSigmaBelowPionLineITS=-2;
670 fPIDnSigmaAbovePionLineITS=3.5;
673 cout<<"Warning: ITSdEdxCutPionLine not defined"<<ededxSigmaCut<<endl;
680 ///________________________________________________________________________
681 Bool_t AliPrimaryPionCuts::SetTPCdEdxCutPionLine(Int_t ededxSigmaCut){
682 switch(ededxSigmaCut){
684 fDodEdxSigmaTPCCut = kFALSE;
685 fPIDnSigmaBelowPionLineTPC=-10;
686 fPIDnSigmaAbovePionLineTPC=10;
689 fDodEdxSigmaTPCCut = kTRUE;
690 fPIDnSigmaBelowPionLineTPC=-10;
691 fPIDnSigmaAbovePionLineTPC=10;
694 fDodEdxSigmaTPCCut = kTRUE;
695 fPIDnSigmaBelowPionLineTPC=-6;
696 fPIDnSigmaAbovePionLineTPC=7;
699 fDodEdxSigmaTPCCut = kTRUE;
700 fPIDnSigmaBelowPionLineTPC=-5;
701 fPIDnSigmaAbovePionLineTPC=5;
704 fDodEdxSigmaTPCCut = kTRUE;
705 fPIDnSigmaBelowPionLineTPC=-4;
706 fPIDnSigmaAbovePionLineTPC=5;
709 fDodEdxSigmaTPCCut = kTRUE;
710 fPIDnSigmaBelowPionLineTPC=-4;
711 fPIDnSigmaAbovePionLineTPC=4;
714 fDodEdxSigmaTPCCut = kTRUE;
715 fPIDnSigmaBelowPionLineTPC=-3;
716 fPIDnSigmaAbovePionLineTPC=4;
719 fDodEdxSigmaTPCCut = kTRUE;
720 fPIDnSigmaBelowPionLineTPC=-3;
721 fPIDnSigmaAbovePionLineTPC=3;
724 fDodEdxSigmaTPCCut = kTRUE;
725 fPIDnSigmaBelowPionLineTPC=-2;
726 fPIDnSigmaAbovePionLineTPC=3.;
729 cout<<"Warning: TPCdEdxCutPionLine not defined"<<ededxSigmaCut<<endl;
735 ///________________________________________________________________________
736 Bool_t AliPrimaryPionCuts::SetITSClusterCut(Int_t clsITSCut){
737 if( !fEsdTrackCuts ) {
738 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
744 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
745 fStringITSClusterCut= "no SPD cluster requirement";
748 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
749 fStringITSClusterCut= "first SPD cluster required";
750 break; //1 hit first layer of SPD
752 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
753 fStringITSClusterCut= "first or second SPD cluster required";
754 break; //1 hit in any layer of SPD
756 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
757 fEsdTrackCuts->SetMinNClustersITS(4);
758 fStringITSClusterCut= "first SPD cluster required, min number of ITS clusters = 4";
759 // 4 hits in total in the ITS. At least 1 hit in the first layer of SPD
762 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
763 fEsdTrackCuts->SetMinNClustersITS(3);
764 fStringITSClusterCut= "first or second SPD cluster required, min number of ITS clusters = 3";
765 // 3 hits in total in the ITS. At least 1 hit in any layer of SPD
768 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
769 fEsdTrackCuts->SetMinNClustersITS(4);
770 fStringITSClusterCut= "first or second SPD cluster required, min number of ITS clusters = 4";
771 // 4 hits in total in the ITS. At least 1 hit in any layer of SPD
774 fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
775 fEsdTrackCuts->SetMinNClustersITS(5);
776 fStringITSClusterCut= "first or second SPD cluster required, min number of ITS clusters = 5";
777 // 5 hits in total in the ITS. At least 1 hit in any layer of SPD
780 cout<<"Warning: clsITSCut not defined "<<clsITSCut<<endl;
786 ///________________________________________________________________________
787 Bool_t AliPrimaryPionCuts::SetTPCClusterCut(Int_t clsTPCCut){
791 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
795 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
799 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
803 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
805 case 4: // 0% of findable clusters
807 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
809 fUseCorrectedTPCClsInfo=0;
811 case 5: // 35% of findable clusters
813 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
815 fUseCorrectedTPCClsInfo=0;
817 case 6: // 60% of findable clusters
819 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
821 fUseCorrectedTPCClsInfo=0;
823 case 7: // 70% of findable clusters
825 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
827 fUseCorrectedTPCClsInfo=0;
829 case 8: fMinClsTPC = 0.;
830 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
832 fUseCorrectedTPCClsInfo=0;
834 case 9: // 35% of findable clusters
836 fEsdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
838 fUseCorrectedTPCClsInfo=1;
842 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
848 ///________________________________________________________________________
849 Bool_t AliPrimaryPionCuts::SetEtaCut(Int_t etaCut){
877 fEtaCut = 0.6; //changed from 0.4 to 0.6 2013.06.10
881 fEtaCut = 0.5; //changed from 0.3 to 0.5 2013.06.10
889 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
895 ///________________________________________________________________________
896 Bool_t AliPrimaryPionCuts::SetPtCut(Int_t ptCut){
911 cout<<"Warning: PtCut not defined "<<ptCut<<endl;
918 ///________________________________________________________________________
919 Bool_t AliPrimaryPionCuts::SetDCACut(Int_t dcaCut)
922 if( !fEsdTrackCuts ) {
923 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
930 fEsdTrackCuts->SetMaxDCAToVertexZ(1000);
931 fEsdTrackCuts->SetMaxDCAToVertexXY(1000);
932 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
935 fEsdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
936 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
939 fEsdTrackCuts->SetMaxDCAToVertexZ(2);
940 fEsdTrackCuts->SetMaxDCAToVertexXY(1);
941 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
944 cout<<"Warning: dcaCut not defined "<<dcaCut<<endl;
950 ///________________________________________________________________________
951 Bool_t AliPrimaryPionCuts::SetTOFPionPIDCut(Int_t TOFelectronPID){
953 switch(TOFelectronPID){
955 fRequireTOF = kFALSE;
957 fPIDnSigmaBelowPionLineTOF=-100;
958 fPIDnSigmaAbovePionLineTOF=100;
961 fRequireTOF = kFALSE;
963 fPIDnSigmaBelowPionLineTOF=-7;
964 fPIDnSigmaAbovePionLineTOF=7;
967 fRequireTOF = kFALSE;
969 fPIDnSigmaBelowPionLineTOF=-5;
970 fPIDnSigmaAbovePionLineTOF=5;
973 fRequireTOF = kFALSE;
975 fPIDnSigmaBelowPionLineTOF=-3;
976 fPIDnSigmaAbovePionLineTOF=5;
979 fRequireTOF = kFALSE;
981 fPIDnSigmaBelowPionLineTOF=-2;
982 fPIDnSigmaAbovePionLineTOF=3;
984 case 5: // -3, 3 TOF mandatory
987 fPIDnSigmaBelowPionLineTOF= -3;
988 fPIDnSigmaAbovePionLineTOF= 3;
991 cout<<"Warning: TOFPionCut not defined "<<TOFelectronPID<<endl;
997 ///________________________________________________________________________
998 Bool_t AliPrimaryPionCuts::SetMassCut(Int_t massCut){
1002 fDoMassCut = kFALSE;
1005 case 1: // cut at 1 GeV/c^2
1009 case 2: // cut at 0.7 GeV/c^2
1013 case 3: // cut at 0.6 GeV/c^2
1017 case 4: // cut at eta mass
1019 fMassCut = 0.547853;
1021 case 5: // cut at 0.5 GeV/c^2
1026 cout<<"Warning: MassCut not defined "<<massCut<<endl;
1033 ///________________________________________________________________________
1034 TString AliPrimaryPionCuts::GetCutNumber(){
1035 // returns TString with current cut number
1037 for(Int_t ii=0;ii<kNCuts;ii++){
1038 a.Append(Form("%d",fCuts[ii]));
1044 ///________________________________________________________________________
1045 AliPrimaryPionCuts* AliPrimaryPionCuts::GetStandardCuts2010PbPb(){
1046 //Create and return standard 2010 PbPb cuts
1047 AliPrimaryPionCuts *cuts=new AliPrimaryPionCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
1048 if(!cuts->InitializeCutsFromCutString("000000400")){
1049 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;
1054 ///________________________________________________________________________
1055 AliPrimaryPionCuts* AliPrimaryPionCuts::GetStandardCuts2010pp(){
1056 //Create and return standard 2010 PbPb cuts
1057 AliPrimaryPionCuts *cuts=new AliPrimaryPionCuts("StandardCuts2010pp","StandardCuts2010pp");
1059 if(!cuts->InitializeCutsFromCutString("000000400")){
1060 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;