2 /**************************************************************************
\r
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
5 * Authors: Svein Lindal, Daniel Lohner *
\r
8 * Permission to use, copy, modify and distribute this software and its *
\r
9 * documentation strictly for non-commercial purposes is hereby granted *
\r
10 * without fee, provided that the above copyright notice appears in all *
\r
11 * copies and that both the copyright notice and this permission notice *
\r
12 * appear in the supporting documentation. The authors make no claims *
\r
13 * about the suitability of this software for any purpose. It is *
\r
14 * provided "as is" without express or implied warranty. *
\r
15 **************************************************************************/
\r
17 ////////////////////////////////////////////////
\r
18 //---------------------------------------------
\r
19 // Class handling all kinds of selection cuts for
\r
20 // Gamma Conversion analysis
\r
21 //---------------------------------------------
\r
22 ////////////////////////////////////////////////
\r
25 #include "AliDalitzElectronCuts.h"
\r
26 #include "AliAODConversionPhoton.h"
\r
27 #include "AliKFVertex.h"
\r
28 #include "AliAODTrack.h"
\r
29 #include "AliESDtrack.h"
\r
30 #include "AliAnalysisManager.h"
\r
31 #include "AliInputEventHandler.h"
\r
32 #include "AliMCEventHandler.h"
\r
33 #include "AliAODHandler.h"
\r
34 #include "AliPIDResponse.h"
\r
37 #include "AliStack.h"
\r
38 #include "TObjString.h"
\r
39 #include "AliAODEvent.h"
\r
40 #include "AliESDEvent.h"
\r
44 using namespace std;
\r
46 ClassImp(AliDalitzElectronCuts)
\r
49 const char* AliDalitzElectronCuts::fgkCutNames[AliDalitzElectronCuts::kNCuts] = {
\r
53 "pidedxSigmaTPCCut",
\r
54 "piMinMomdedxSigmaTPCCut",
\r
55 "piMaxMomdedxSigmaTPCCut",
\r
56 "LowPRejectionSigmaCut",
\r
62 "RejectSharedElecGamma",
\r
64 "NumberOfRotations",
\r
70 //________________________________________________________________________
\r
71 AliDalitzElectronCuts::AliDalitzElectronCuts(const char *name,const char *title) : AliAnalysisCuts(name,title),
\r
74 fesdTrackCuts(NULL),
\r
81 fDeltaPhiCutMin(0.),
\r
82 fDeltaPhiCutMax(0.12),
\r
83 fMinClsTPC(0), // minimum clusters in the TPC
\r
84 fMinClsTPCToF(0), // minimum clusters to findable clusters
\r
85 fDodEdxSigmaITSCut(kFALSE),
\r
86 fDodEdxSigmaTPCCut(kTRUE),
\r
87 fDoTOFsigmaCut(kFALSE), // RRnewTOF
\r
88 fDoRejectSharedElecGamma(kFALSE),
\r
89 fDoPsiPairCut(kFALSE),
\r
90 fPIDnSigmaAboveElectronLineITS(100),
\r
91 fPIDnSigmaBelowElectronLineITS(-100),
\r
92 fPIDnSigmaAboveElectronLineTPC(100),
\r
93 fPIDnSigmaBelowElectronLineTPC(-100),
\r
94 fPIDnSigmaAbovePionLineTPC(0),
\r
95 fPIDnSigmaAbovePionLineTPCHighPt(-100),
\r
96 fTofPIDnSigmaAboveElectronLine(100), // RRnewTOF
\r
97 fTofPIDnSigmaBelowElectronLine(-100), // RRnewTOF
\r
98 fPIDMinPnSigmaAbovePionLineTPC(0),
\r
99 fPIDMaxPnSigmaAbovePionLineTPC(0),
\r
100 fDoKaonRejectionLowP(kFALSE),
\r
101 fDoProtonRejectionLowP(kFALSE),
\r
102 fDoPionRejectionLowP(kFALSE),
\r
103 fPIDnSigmaAtLowPAroundKaonLine(0),
\r
104 fPIDnSigmaAtLowPAroundProtonLine(0),
\r
105 fPIDnSigmaAtLowPAroundPionLine(0),
\r
106 fPIDMinPKaonRejectionLowP(1.5),
\r
107 fPIDMinPProtonRejectionLowP(2.0),
\r
108 fPIDMinPPionRejectionLowP(0.5),
\r
109 fUseCorrectedTPCClsInfo(kFALSE),
\r
110 fUseTOFpid(kFALSE),
\r
111 fRequireTOF(kFALSE),
\r
112 fUseTrackMultiplicityForBG(kFALSE),
\r
114 fnumberOfRotationEventsForBG(0),
\r
115 fDoMassCut(kFALSE),
\r
116 fMassCutLowPt(999.),
\r
117 fMassCutHighPt(999.),
\r
118 fMassCutPtMin(-100.0),
\r
122 hITSdEdxbefore(NULL),
\r
123 hITSdEdxafter(NULL),
\r
124 hTPCdEdxbefore(NULL),
\r
125 hTPCdEdxafter(NULL),
\r
126 hTPCdEdxSignalbefore(NULL),
\r
127 hTPCdEdxSignalafter(NULL),
\r
130 hTrackDCAxyPtbefore(NULL),
\r
131 hTrackDCAxyPtafter(NULL),
\r
132 hTrackDCAzPtbefore(NULL),
\r
133 hTrackDCAzPtafter(NULL),
\r
134 hTrackNFindClsPtTPCbefore(NULL),
\r
135 hTrackNFindClsPtTPCafter(NULL)
\r
138 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
\r
139 fCutString=new TObjString((GetCutNumber()).Data());
\r
141 //fesdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
\r
142 // Using standard function for setting Cuts
\r
143 Bool_t selectPrimaries=kFALSE;
\r
144 fesdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
\r
147 //________________________________________________________________________
\r
148 AliDalitzElectronCuts::~AliDalitzElectronCuts() {
\r
150 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
\r
152 // delete fHistograms;
\r
153 // fHistograms = NULL;
\r
155 if(fCutString != NULL){
\r
163 //________________________________________________________________________
\r
164 void AliDalitzElectronCuts::InitCutHistograms(TString name, Bool_t preCut,TString cutNumber){
\r
166 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
\r
168 TString cutName = "";
\r
170 if( cutNumber==""){
\r
171 cutName = GetCutNumber().Data();
\r
174 cutName = cutNumber.Data();
\r
177 if(fHistograms != NULL){
\r
178 delete fHistograms;
\r
181 if(fHistograms==NULL){
\r
182 fHistograms=new TList();
\r
183 if(name=="")fHistograms->SetName(Form("ElectronCuts_%s",cutName.Data()));
\r
184 else fHistograms->SetName(Form("%s_%s",name.Data(),cutName.Data()));
\r
188 hCutIndex=new TH1F(Form("IsElectronSelected %s",cutName.Data()),"IsElectronSelected",10,-0.5,9.5);
\r
189 hCutIndex->GetXaxis()->SetBinLabel(kElectronIn+1,"in");
\r
190 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
\r
191 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
\r
192 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
\r
193 hCutIndex->GetXaxis()->SetBinLabel(kElectronOut+1,"out");
\r
194 fHistograms->Add(hCutIndex);
\r
199 hdEdxCuts=new TH1F(Form("dEdxCuts %s",cutName.Data()),"dEdxCuts",10,-0.5,9.5);
\r
200 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
\r
201 hdEdxCuts->GetXaxis()->SetBinLabel(2,"ITSelectron");
\r
202 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCelectron");
\r
203 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpion");
\r
204 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCpionhighp");
\r
205 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCkaonlowprej");
\r
206 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCprotonlowprej");
\r
207 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TPCpionlowprej");
\r
208 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TOFelectron");
\r
209 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
\r
210 fHistograms->Add(hdEdxCuts);
\r
214 TAxis *AxisBeforeITS = NULL;
\r
215 TAxis *AxisBeforedEdx = NULL;
\r
216 TAxis *AxisBeforeTOF = NULL;
\r
217 TAxis *AxisBeforedEdxSignal = NULL;
\r
222 hITSdEdxbefore=new TH2F(Form("Electron_ITS_before %s",cutName.Data()),"ITS dEdx electron before" ,150,0.05,20,400,-10,10);
\r
223 fHistograms->Add(hITSdEdxbefore);
\r
224 AxisBeforeITS = hITSdEdxbefore->GetXaxis();
\r
226 hTPCdEdxbefore=new TH2F(Form("Electron_dEdx_before %s",cutName.Data()),"dEdx electron before" ,150,0.05,20,400,-10,10);
\r
227 fHistograms->Add(hTPCdEdxbefore);
\r
228 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
\r
230 hTPCdEdxSignalbefore=new TH2F(Form("Electron_dEdxSignal_before %s",cutName.Data()),"dEdx electron signal before" ,150,0.05,20.0,800,0.0,200);
\r
231 fHistograms->Add(hTPCdEdxSignalbefore);
\r
232 AxisBeforedEdxSignal = hTPCdEdxSignalbefore->GetXaxis();
\r
234 hTOFbefore=new TH2F(Form("Electron_TOF_before %s",cutName.Data()),"TOF electron before" ,150,0.05,20,400,-6,10);
\r
235 fHistograms->Add(hTOFbefore);
\r
236 AxisBeforeTOF = hTOFbefore->GetXaxis();
\r
238 hTrackDCAxyPtbefore = new TH2F(Form("hTrack_DCAxy_Pt_before %s",cutName.Data()),"DCAxy Vs Pt of tracks before",800,-4.0,4.0,400,0.,10.);
\r
239 fHistograms->Add(hTrackDCAxyPtbefore);
\r
241 hTrackDCAzPtbefore = new TH2F(Form("hTrack_DCAz_Pt_before %s",cutName.Data()), "DCAz Vs Pt of tracks before",800,-4.0,4.0,400,0.,10.);
\r
242 fHistograms->Add(hTrackDCAzPtbefore);
\r
244 hTrackNFindClsPtTPCbefore = 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.);
\r
245 fHistograms->Add(hTrackNFindClsPtTPCbefore);
\r
252 hITSdEdxafter=new TH2F(Form("Electron_ITS_after %s",cutName.Data()),"ITS dEdx electron after" ,150,0.05,20,400, -10,10);
\r
253 fHistograms->Add(hITSdEdxafter);
\r
255 hTPCdEdxafter=new TH2F(Form("Electron_dEdx_after %s",cutName.Data()),"dEdx electron after" ,150,0.05,20,400, -10,10);
\r
256 fHistograms->Add(hTPCdEdxafter);
\r
258 hTPCdEdxSignalafter=new TH2F(Form("Electron_dEdxSignal_after %s",cutName.Data()),"dEdx electron signal after" ,150,0.05,20.0,800,0.0,200);
\r
259 fHistograms->Add(hTPCdEdxSignalafter);
\r
261 hTOFafter=new TH2F(Form("Electron_TOF_after %s",cutName.Data()),"TOF electron after" ,150,0.05,20,400,-6,10);
\r
262 fHistograms->Add(hTOFafter);
\r
264 hTrackDCAxyPtafter = new TH2F(Form("hTrack_DCAxy_Pt_after %s",cutName.Data()),"DCAxy Vs Pt of tracks after",800,-4.0,4.0,400,0.,10.);
\r
265 fHistograms->Add(hTrackDCAxyPtafter);
\r
267 hTrackDCAzPtafter = new TH2F(Form("hTrack_DCAz_Pt_after %s",cutName.Data()), "DCAz Vs Pt of tracks after",800,-4.0,4.0,400,0.,10.);
\r
268 fHistograms->Add(hTrackDCAzPtafter);
\r
270 hTrackNFindClsPtTPCafter = 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.);
\r
271 fHistograms->Add(hTrackNFindClsPtTPCafter);
\r
275 TAxis *AxisAfter = hTPCdEdxafter->GetXaxis();
\r
276 Int_t bins = AxisAfter->GetNbins();
\r
277 Double_t from = AxisAfter->GetXmin();
\r
278 Double_t to = AxisAfter->GetXmax();
\r
279 Double_t *newBins = new Double_t[bins+1];
\r
281 Double_t factor = TMath::Power(to/from, 1./bins);
\r
282 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
\r
283 AxisAfter->Set(bins, newBins);
\r
284 AxisAfter = hTOFafter->GetXaxis();
\r
285 AxisAfter->Set(bins, newBins);
\r
286 AxisAfter = hITSdEdxafter->GetXaxis();
\r
287 AxisAfter->Set(bins,newBins);
\r
288 AxisAfter = hTPCdEdxSignalafter->GetXaxis();
\r
289 AxisAfter->Set(bins,newBins);
\r
292 AxisBeforeITS->Set(bins, newBins);
\r
293 AxisBeforedEdx->Set(bins, newBins);
\r
294 AxisBeforedEdxSignal->Set(bins,newBins);
\r
295 AxisBeforeTOF->Set(bins, newBins);
\r
301 // Event Cuts and Info
\r
305 //________________________________________________________________________
\r
306 Bool_t AliDalitzElectronCuts::InitPIDResponse(){
\r
308 // Set Pointer to AliPIDResponse
\r
310 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
\r
314 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
\r
315 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
\r
316 if(fPIDResponse)return kTRUE;
\r
322 ///________________________________________________________________________
\r
323 Bool_t AliDalitzElectronCuts::ElectronIsSelectedMC(Int_t labelParticle,AliStack *fMCStack)
\r
325 if( labelParticle < 0 || labelParticle >= fMCStack->GetNtrack() ) return kFALSE;
\r
326 if( fMCStack->IsPhysicalPrimary(labelParticle) == kFALSE ) return kFALSE; //Ask Ana
\r
328 TParticle* particle = fMCStack->Particle(labelParticle);
\r
330 if( TMath::Abs( particle->GetPdgCode() ) != 11 ) return kFALSE;
\r
333 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
\r
342 ///________________________________________________________________________
\r
343 Bool_t AliDalitzElectronCuts::ElectronIsSelected(AliESDtrack* lTrack)
\r
345 //Selection of Reconstructed electrons
\r
350 lTrack->GetImpactParameters(b,bCov);
\r
352 if (bCov[0]<=0 || bCov[2]<=0) {
\r
353 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
354 bCov[0]=0; bCov[2]=0;
\r
359 Float_t dcaToVertexXY = b[0];
\r
360 Float_t dcaToVertexZ = b[1];
\r
361 Double_t clsToF = GetNFindableClustersTPC(lTrack);
\r
363 if( hTrackDCAxyPtbefore) hTrackDCAxyPtbefore->Fill(dcaToVertexXY,lTrack->Pt());
\r
364 if( hTrackDCAzPtbefore ) hTrackDCAzPtbefore->Fill( dcaToVertexZ, lTrack->Pt());
\r
365 if( hTrackNFindClsPtTPCbefore ) hTrackNFindClsPtTPCbefore->Fill( clsToF, lTrack->Pt());
\r
369 if(hCutIndex)hCutIndex->Fill(kElectronIn);
\r
371 if (lTrack == NULL){
\r
372 if(hCutIndex)hCutIndex->Fill(kNoTracks);
\r
376 if ( ! lTrack->GetConstrainedParam() ){
\r
379 AliVTrack * track = dynamic_cast<AliVTrack*>(lTrack);
\r
383 if( !TrackIsSelected(lTrack) ){
\r
384 if(hCutIndex)hCutIndex->Fill(kTrackCuts);
\r
390 if( ! dEdxCuts( track ) ) {
\r
391 if(hCutIndex)hCutIndex->Fill(kdEdxCuts);
\r
396 //Electron passed the cuts
\r
397 if(hCutIndex)hCutIndex->Fill(kElectronOut);
\r
399 if( hTrackDCAxyPtafter) hTrackDCAxyPtafter->Fill(dcaToVertexXY,lTrack->Pt());
\r
400 if( hTrackDCAzPtafter ) hTrackDCAzPtafter->Fill(dcaToVertexZ,lTrack->Pt());
\r
401 if( hTrackNFindClsPtTPCafter ) hTrackNFindClsPtTPCafter->Fill( clsToF, lTrack->Pt());
\r
407 ///________________________________________________________________________
\r
408 Bool_t AliDalitzElectronCuts::TrackIsSelected(AliESDtrack* lTrack) {
\r
409 // Track Selection for Photon Reconstruction
\r
412 Double_t clsToF = GetNFindableClustersTPC(lTrack);
\r
415 if( ! fesdTrackCuts->AcceptTrack(lTrack) ){
\r
421 if( lTrack->Eta() > (fEtaCut + fEtaShift) || lTrack->Eta() < (-fEtaCut + fEtaShift) ) {
\r
427 if( lTrack->Pt() < fPtCut ) {
\r
433 /*if( lTrack->GetNcls(1) < fMinClsTPC ) {
\r
438 //Findable clusters
\r
440 /*Double_t clsToF=0;
\r
443 if (!fUseCorrectedTPCClsInfo ){
\r
444 if(lTrack->GetTPCNclsF()!=0){
\r
446 clsToF = (Double_t)lTrack->GetNcls(1)/(Double_t)lTrack->GetTPCNclsF();
\r
447 }// Ncluster/Nfindablecluster
\r
451 //clsToF = lTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
\r
452 clsToF = lTrack->GetTPCClusterInfo(2,1); //NOTE ask friederike
\r
457 if( clsToF < fMinClsTPCToF){
\r
465 ///________________________________________________________________________
\r
466 Bool_t AliDalitzElectronCuts::dEdxCuts(AliVTrack *fCurrentTrack){
\r
468 // Electron Identification Cuts for Photon reconstruction
\r
470 if(!fPIDResponse){ InitPIDResponse(); }// Try to reinitialize PID Response
\r
471 if(!fPIDResponse){ AliError("No PID Response"); return kFALSE;}// if still missing fatal error
\r
475 //cout<<"dEdxCuts: //////////////////////////////////////////////////////////////////////////"<<endl;
\r
481 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
482 if(hITSdEdxbefore)hITSdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
\r
483 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
\r
484 if(hTPCdEdxSignalbefore)hTPCdEdxSignalbefore->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
\r
490 if( fDodEdxSigmaITSCut == kTRUE ){
\r
493 if( fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLineITS ||
\r
494 fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kElectron)> fPIDnSigmaAboveElectronLineITS ){
\r
496 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
502 if(hITSdEdxafter)hITSdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
\r
508 if(fDodEdxSigmaTPCCut == kTRUE){
\r
511 // TPC Electron Line
\r
512 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLineTPC ||
\r
513 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLineTPC){
\r
515 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
521 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLineTPC && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLineTPC ){
\r
522 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLineTPC &&
\r
523 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLineTPC &&
\r
524 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineTPC){
\r
526 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
532 // High Pt Pion rej
\r
533 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLineTPC ){
\r
534 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLineTPC &&
\r
535 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLineTPC&&
\r
536 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineTPCHighPt){
\r
538 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
546 else{ cutIndex+=3; }
\r
549 if( fDoKaonRejectionLowP == kTRUE ){
\r
551 if( fCurrentTrack->P() < fPIDMinPKaonRejectionLowP ){
\r
553 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
\r
555 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
563 if( fDoProtonRejectionLowP == kTRUE ){
\r
565 if( fCurrentTrack->P() < fPIDMinPProtonRejectionLowP ){
\r
566 if( TMath::Abs( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
\r
568 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
575 if(fDoPionRejectionLowP == kTRUE){
\r
576 if( fCurrentTrack->P() < fPIDMinPPionRejectionLowP ){
\r
577 if( TMath::Abs( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)) < fPIDnSigmaAtLowPAroundPionLine ){
\r
579 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
587 if( ( fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid ) && ( !( fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch) ) ){
\r
588 if(hTOFbefore) hTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
\r
590 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
\r
591 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
\r
592 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
596 if(hTOFafter)hTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
\r
598 else if ( fRequireTOF == kTRUE ) {
\r
600 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
605 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
606 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
\r
607 if(hTPCdEdxSignalafter)hTPCdEdxSignalafter->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
\r
611 ///________________________________________________________________________
\r
614 AliVTrack *AliDalitzElectronCuts::GetTrack(AliVEvent * event, Int_t label){
\r
615 //Returns pointer to the track with given ESD label
\r
616 //(Important for AOD implementation, since Track array in AOD data is different
\r
617 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
\r
619 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
\r
621 if(label > event->GetNumberOfTracks() ) return NULL;
\r
622 AliESDtrack * track = esdEvent->GetTrack(label);
\r
626 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
\r
627 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
\r
630 if(track->GetID() == label) {
\r
637 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
\r
640 ///________________________________________________________________________
\r
641 Bool_t AliDalitzElectronCuts::RejectSharedElecGamma(TList *photons, Int_t indexEle){
\r
644 for(Int_t i = 0;i<photons->GetEntries();i++){
\r
646 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
\r
648 Int_t posLabel = photonComp->GetTrackLabelPositive();
\r
649 Int_t negLabel = photonComp->GetTrackLabelNegative();
\r
651 if( (photonComp->GetConversionRadius() < fRadiusCut) && (posLabel == indexEle || negLabel == indexEle) ){
\r
658 Bool_t AliDalitzElectronCuts::MassCut(Double_t pi0CandidatePt , Double_t vphotonCandidateMass){
\r
660 if( pi0CandidatePt < fMassCutPtMin ){
\r
662 if( vphotonCandidateMass < fMassCutLowPt ){
\r
669 if( vphotonCandidateMass < fMassCutHighPt ){
\r
679 Double_t AliDalitzElectronCuts::GetNFindableClustersTPC(AliESDtrack* lTrack){
\r
685 if ( !fUseCorrectedTPCClsInfo ){
\r
686 if(lTrack->GetTPCNclsF()!=0){
\r
688 clsToF = (Double_t)lTrack->GetNcls(1)/(Double_t)lTrack->GetTPCNclsF();
\r
689 }// Ncluster/Nfindablecluster
\r
693 //clsToF = lTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
\r
694 clsToF = lTrack->GetTPCClusterInfo(2,1); //NOTE ask friederike
\r
703 Double_t AliDalitzElectronCuts::GetPsiPair( const AliESDtrack *trackPos, const AliESDtrack *trackNeg )
\r
706 // This angle is a measure for the contribution of the opening in polar
\r
707 // direction ??0 to the opening angle ?? Pair
\r
709 // Ref. Measurement of photons via conversion pairs with the PHENIX experiment at RHIC
\r
710 // Master Thesis. Thorsten Dahms. 2005
\r
711 // https://twiki.cern.ch/twiki/pub/ALICE/GammaPhysicsPublications/tdahms_thesis.pdf
\r
713 Double_t momPos[3];
\r
714 Double_t momNeg[3];
\r
715 if( trackPos->GetConstrainedPxPyPz(momPos) == 0 ) trackPos->GetPxPyPz( momPos );
\r
716 if( trackNeg->GetConstrainedPxPyPz(momNeg) == 0 ) trackNeg->GetPxPyPz( momNeg );
\r
718 TVector3 posDaughter;
\r
719 TVector3 negDaughter;
\r
721 posDaughter.SetXYZ( momPos[0], momPos[1], momPos[2] );
\r
722 negDaughter.SetXYZ( momNeg[0], momNeg[1], momNeg[2] );
\r
724 Double_t deltaTheta = negDaughter.Theta() - posDaughter.Theta();
\r
725 Double_t openingAngle = posDaughter.Angle( negDaughter ); //TMath::ACos( posDaughter.Dot(negDaughter)/(negDaughter.Mag()*posDaughter.Mag()) );
\r
727 if( openingAngle < 1e-20 ) return 0.;
\r
729 Double_t psiAngle = TMath::ASin( deltaTheta/openingAngle );
\r
734 Bool_t AliDalitzElectronCuts::IsFromGammaConversion( Double_t psiPair, Double_t deltaPhi )
\r
737 // Returns true if it is a gamma conversion according to psi pair value
\r
739 return ( (deltaPhi > fDeltaPhiCutMin && deltaPhi < fDeltaPhiCutMax) &&
\r
740 TMath::Abs(psiPair) < ( fPsiPairCut - fPsiPairCut/fDeltaPhiCutMax * deltaPhi ) );
\r
743 ///________________________________________________________________________
\r
744 Bool_t AliDalitzElectronCuts::UpdateCutString(cutIds cutID, Int_t value) {
\r
745 ///Update the cut string (if it has been created yet)
\r
747 if(fCutString && fCutString->GetString().Length() == kNCuts) {
\r
748 // cout << "Updating cut id in spot number " << cutID << " to " << value << endl;
\r
749 fCutString->SetString(GetCutNumber());
\r
751 // cout << "fCutString not yet initialized, will not be updated" << endl;
\r
754 // cout << fCutString->GetString().Data() << endl;
\r
758 ///________________________________________________________________________
\r
759 Bool_t AliDalitzElectronCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
\r
760 // Initialize Cuts from a given Cut string
\r
762 // out<<"Set Cut Number: "<<analysisCutSelection.Data()<<endl;
\r
763 AliInfo(Form("Set ElectronCuts Number: %s",analysisCutSelection.Data()));
\r
765 if(analysisCutSelection.Length()!=kNCuts) {
\r
766 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
\r
769 if(!analysisCutSelection.IsDigit()){
\r
770 AliError("Cut selection contains characters");
\r
774 const char *cutSelection = analysisCutSelection.Data();
\r
775 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
\r
776 for(Int_t ii=0;ii<kNCuts;ii++){
\r
782 AliError("Analysis Cut Selection does not start with 9");
\r
787 // Set Individual Cuts
\r
788 for(Int_t ii=0;ii<kNCuts;ii++){
\r
789 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
\r
796 ///________________________________________________________________________
\r
797 Bool_t AliDalitzElectronCuts::SetCut(cutIds cutID, const Int_t value) {
\r
798 ///Set individual cut ID
\r
800 //cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
\r
804 fCuts[kgoodId] = value;
\r
806 cout << "Error:: First value of cut string is wrong, aborting!!" << endl;
\r
812 case kededxSigmaITSCut:
\r
813 if( SetITSdEdxCutElectronLine(value)) { //NOTE SetITSdEdxCutElectronLine: To be implemented
\r
814 fCuts[kededxSigmaITSCut] = value;
\r
815 UpdateCutString(cutID, value);
\r
817 } else return kFALSE;
\r
819 case kededxSigmaTPCCut:
\r
820 if( SetTPCdEdxCutElectronLine(value)) { //NOTE SetITSdEdxCutElectronLine: To be implemented
\r
821 fCuts[kededxSigmaTPCCut] = value;
\r
822 UpdateCutString(cutID, value);
\r
824 } else return kFALSE;
\r
826 case kpidedxSigmaTPCCut:
\r
827 if( SetTPCdEdxCutPionLine(value)) { //NOTE SetITSdEdxCutPionLine: To be implemented
\r
828 fCuts[kpidedxSigmaTPCCut] = value;
\r
829 UpdateCutString(cutID, value);
\r
831 } else return kFALSE;
\r
833 case kpiMinMomdedxSigmaTPCCut:
\r
834 if( SetMinMomPiondEdxTPCCut(value)) {
\r
835 fCuts[kpiMinMomdedxSigmaTPCCut] = value;
\r
836 UpdateCutString(cutID, value);
\r
838 } else return kFALSE;
\r
840 case kpiMaxMomdedxSigmaTPCCut:
\r
841 if( SetMaxMomPiondEdxTPCCut(value)) {
\r
842 fCuts[kpiMaxMomdedxSigmaTPCCut] = value;
\r
843 UpdateCutString(cutID, value);
\r
845 } else return kFALSE;
\r
847 case kLowPRejectionSigmaCut:
\r
848 if( SetLowPRejectionCuts(value) ) {
\r
849 fCuts[kLowPRejectionSigmaCut] = value;
\r
850 UpdateCutString(cutID, value);
\r
852 } else return kFALSE;
\r
855 case kTOFelectronPID:
\r
856 if( SetTOFElectronPIDCut(value)) {
\r
857 fCuts[kTOFelectronPID] = value;
\r
858 UpdateCutString(cutID, value);
\r
860 } else return kFALSE;
\r
862 if( SetITSClusterCut(value) ) {
\r
863 fCuts[kclsITSCut] = value;
\r
864 UpdateCutString(cutID, value);
\r
866 } else return kFALSE;
\r
868 if( SetTPCClusterCut(value)) {
\r
869 fCuts[kclsTPCCut] = value;
\r
870 UpdateCutString(cutID, value);
\r
872 } else return kFALSE;
\r
875 if( SetEtaCut(value)) {
\r
876 fCuts[ketaCut] = value;
\r
877 UpdateCutString(cutID, value);
\r
879 } else return kFALSE;
\r
881 if( SetPtCut(value)) {
\r
882 fCuts[kptCut] = value;
\r
883 UpdateCutString(cutID, value);
\r
885 } else return kFALSE;
\r
888 if( SetDCACut(value)) {
\r
889 fCuts[kDCACut] = value;
\r
890 UpdateCutString(cutID, value);
\r
892 } else return kFALSE;
\r
896 if( SetPsiPairCut(value)) {
\r
897 fCuts[kPsiPair] = value;
\r
898 UpdateCutString(cutID, value);
\r
900 } else return kFALSE;
\r
902 case kRejectSharedElecGamma:
\r
903 if( SetRejectSharedElecGamma(value)) {
\r
904 fCuts[kRejectSharedElecGamma] = value;
\r
905 UpdateCutString(cutID, value);
\r
907 } else return kFALSE;
\r
909 case kBackgroundScheme:
\r
910 if( SetBackgroundScheme(value)) {
\r
911 fCuts[kBackgroundScheme] = value;
\r
912 UpdateCutString(cutID, value);
\r
914 } else return kFALSE;
\r
916 case kNumberOfRotations:
\r
917 if( SetNumberOfRotations(value)) {
\r
918 fCuts[kNumberOfRotations] = value;
\r
919 UpdateCutString(cutID, value);
\r
921 } else return kFALSE;
\r
924 if( SetMassCut(value)) {
\r
925 fCuts[kmassCut] = value;
\r
926 UpdateCutString(cutID, value);
\r
928 } else return kFALSE;
\r
931 cout << "Error:: Cut id out of range"<< endl;
\r
935 cout << "Error:: Cut id " << cutID << " not recognized "<< endl;
\r
942 ///________________________________________________________________________
\r
944 void AliDalitzElectronCuts::PrintCuts() {
\r
945 // Print out current Cut Selection
\r
946 for(Int_t ic = 0; ic < kNCuts; ic++) {
\r
947 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
\r
952 ///________________________________________________________________________
\r
953 Bool_t AliDalitzElectronCuts::SetITSdEdxCutElectronLine(Int_t ededxSigmaCut)
\r
956 switch(ededxSigmaCut){
\r
959 fDodEdxSigmaITSCut = kFALSE;
\r
960 fPIDnSigmaBelowElectronLineITS=-100;
\r
961 fPIDnSigmaAboveElectronLineITS= 100;
\r
964 fDodEdxSigmaITSCut = kTRUE;
\r
965 fPIDnSigmaBelowElectronLineITS=-10;
\r
966 fPIDnSigmaAboveElectronLineITS=10;
\r
969 fDodEdxSigmaITSCut = kTRUE;
\r
970 fPIDnSigmaBelowElectronLineITS=-6;
\r
971 fPIDnSigmaAboveElectronLineITS=7;
\r
974 fDodEdxSigmaITSCut = kTRUE;
\r
975 fPIDnSigmaBelowElectronLineITS=-5;
\r
976 fPIDnSigmaAboveElectronLineITS=5;
\r
979 fDodEdxSigmaITSCut = kTRUE;
\r
980 fPIDnSigmaBelowElectronLineITS=-4;
\r
981 fPIDnSigmaAboveElectronLineITS=5;
\r
984 fDodEdxSigmaITSCut = kTRUE;
\r
985 fPIDnSigmaBelowElectronLineITS=-3;
\r
986 fPIDnSigmaAboveElectronLineITS=5;
\r
989 fDodEdxSigmaITSCut = kTRUE;
\r
990 fPIDnSigmaBelowElectronLineITS=-4;
\r
991 fPIDnSigmaAboveElectronLineITS=4;
\r
994 fDodEdxSigmaITSCut = kTRUE;
\r
995 fPIDnSigmaBelowElectronLineITS=-2.5;
\r
996 fPIDnSigmaAboveElectronLineITS=4;
\r
999 fDodEdxSigmaITSCut = kTRUE;
\r
1000 fPIDnSigmaBelowElectronLineITS=-2;
\r
1001 fPIDnSigmaAboveElectronLineITS=3.5;
\r
1004 cout<<"Warning: ITSdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
\r
1011 ///________________________________________________________________________
\r
1012 Bool_t AliDalitzElectronCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
\r
1014 switch(ededxSigmaCut){
\r
1016 case 0: fDodEdxSigmaTPCCut = kFALSE;
\r
1017 fPIDnSigmaBelowElectronLineTPC=-10;
\r
1018 fPIDnSigmaAboveElectronLineTPC=10;
\r
1021 fDodEdxSigmaTPCCut = kTRUE;
\r
1022 fPIDnSigmaBelowElectronLineTPC=-10;
\r
1023 fPIDnSigmaAboveElectronLineTPC=10;
\r
1026 fDodEdxSigmaTPCCut = kTRUE;
\r
1027 fPIDnSigmaBelowElectronLineTPC=-6;
\r
1028 fPIDnSigmaAboveElectronLineTPC=7;
\r
1031 fDodEdxSigmaTPCCut = kTRUE;
\r
1032 fPIDnSigmaBelowElectronLineTPC=-5;
\r
1033 fPIDnSigmaAboveElectronLineTPC=5;
\r
1036 fDodEdxSigmaTPCCut = kTRUE;
\r
1037 fPIDnSigmaBelowElectronLineTPC=-4;
\r
1038 fPIDnSigmaAboveElectronLineTPC=5;
\r
1041 fDodEdxSigmaTPCCut = kTRUE;
\r
1042 fPIDnSigmaBelowElectronLineTPC=-3;
\r
1043 fPIDnSigmaAboveElectronLineTPC=5;
\r
1046 fDodEdxSigmaTPCCut = kTRUE;
\r
1047 fPIDnSigmaBelowElectronLineTPC=-4;
\r
1048 fPIDnSigmaAboveElectronLineTPC=4;
\r
1051 fDodEdxSigmaTPCCut = kTRUE;
\r
1052 fPIDnSigmaBelowElectronLineTPC=-2.5;
\r
1053 fPIDnSigmaAboveElectronLineTPC=4;
\r
1056 fDodEdxSigmaTPCCut = kTRUE;
\r
1057 fPIDnSigmaBelowElectronLineTPC=-2;
\r
1058 fPIDnSigmaAboveElectronLineTPC=3.5;
\r
1061 cout<<"Warning: TPCdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
\r
1068 ///________________________________________________________________________
\r
1069 Bool_t AliDalitzElectronCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
\r
1072 switch(pidedxSigmaCut){
\r
1074 case 0: fPIDnSigmaAbovePionLineTPC= 0;
\r
1075 fPIDnSigmaAbovePionLineTPCHighPt=-100;
\r
1078 fPIDnSigmaAbovePionLineTPC=3.0; //Update Sep-05-2013 from -10 to 3
\r
1079 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1082 fPIDnSigmaAbovePionLineTPC=-1;
\r
1083 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1086 fPIDnSigmaAbovePionLineTPC=0;
\r
1087 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1090 fPIDnSigmaAbovePionLineTPC=1;
\r
1091 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1094 fPIDnSigmaAbovePionLineTPC=2.;
\r
1095 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1098 fPIDnSigmaAbovePionLineTPC=2.5;
\r
1099 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1102 fPIDnSigmaAbovePionLineTPC = 2.0; // We need a bit less tight cut on dE/dx //Updated from 3.0 and -10 to +2.0 , +2.0
\r
1103 fPIDnSigmaAbovePionLineTPCHighPt = 2.0;
\r
1106 fPIDnSigmaAbovePionLineTPC = 1.5; // Updated May-16-2013 from 3.5 and -10 to +1.5, +1
\r
1107 fPIDnSigmaAbovePionLineTPCHighPt = 1.0;
\r
1110 fPIDnSigmaAbovePionLineTPC=1.5;
\r
1111 fPIDnSigmaAbovePionLineTPCHighPt=-1.0;
\r
1114 cout<<"Warning: pidedxSigmaCut not defined "<<pidedxSigmaCut<<endl;
\r
1120 ///________________________________________________________________________
\r
1121 Bool_t AliDalitzElectronCuts::SetMinMomPiondEdxTPCCut(Int_t piMomdedxSigmaCut)
\r
1123 switch(piMomdedxSigmaCut){
\r
1125 case 0: fPIDMinPnSigmaAbovePionLineTPC=0.;
\r
1127 case 1: // 50.0 GeV
\r
1128 fPIDMinPnSigmaAbovePionLineTPC=50.;
\r
1130 case 2: // 20.0 GeV
\r
1131 fPIDMinPnSigmaAbovePionLineTPC=20.;
\r
1133 case 3: // 1.5 GeV
\r
1134 fPIDMinPnSigmaAbovePionLineTPC=1.5;
\r
1137 fPIDMinPnSigmaAbovePionLineTPC=1.;
\r
1139 case 5: // 0.5 GeV
\r
1140 fPIDMinPnSigmaAbovePionLineTPC=0.5;
\r
1142 case 6: // 0.4 GeV
\r
1143 fPIDMinPnSigmaAbovePionLineTPC=0.4;
\r
1145 case 7: // 0.3 GeV
\r
1146 fPIDMinPnSigmaAbovePionLineTPC=0.3;
\r
1148 case 8: // 0.25 GeV
\r
1149 fPIDMinPnSigmaAbovePionLineTPC=0.25;
\r
1152 cout<<"Warning: piMomdedxSigmaCut not defined "<<piMomdedxSigmaCut<<endl;
\r
1157 ///________________________________________________________________________
\r
1158 Bool_t AliDalitzElectronCuts::SetITSClusterCut(Int_t clsITSCut){
\r
1161 if( !fesdTrackCuts ) {
\r
1163 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
\r
1167 switch(clsITSCut){
\r
1169 case 0: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
\r
1171 case 1: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
\r
1172 break; //1 hit first layer of SPD
\r
1173 case 2: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1174 break; //1 hit in any layer of SPD
\r
1175 case 3: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
\r
1176 fesdTrackCuts->SetMinNClustersITS(4);
\r
1177 // 4 hits in total in the ITS. At least 1 hit in the first layer of SPD
\r
1179 case 4: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1180 fesdTrackCuts->SetMinNClustersITS(3);
\r
1181 // 3 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1183 case 5: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1184 fesdTrackCuts->SetMinNClustersITS(4);
\r
1185 // 4 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1187 case 6: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1188 fesdTrackCuts->SetMinNClustersITS(5);
\r
1189 // 5 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1192 cout<<"Warning: clsITSCut not defined "<<clsITSCut<<endl;
\r
1199 ///________________________________________________________________________
\r
1200 Bool_t AliDalitzElectronCuts::SetTPCClusterCut(Int_t clsTPCCut)
\r
1202 switch(clsTPCCut){
\r
1205 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1209 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1213 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1217 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1219 case 4: // 0% of findable clusters
\r
1221 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1222 fMinClsTPCToF= 0.0;
\r
1223 fUseCorrectedTPCClsInfo=0;
\r
1225 case 5: // 35% of findable clusters
\r
1226 fMinClsTPC = 70.;
\r
1227 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1228 fMinClsTPCToF= 0.35;
\r
1229 fUseCorrectedTPCClsInfo=0;
\r
1231 case 6: // 60% of findable clusters
\r
1233 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1234 fMinClsTPCToF= 0.6;
\r
1235 fUseCorrectedTPCClsInfo=0;
\r
1237 case 7: // 70% of findable clusters
\r
1239 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1240 fMinClsTPCToF= 0.7;
\r
1241 fUseCorrectedTPCClsInfo=0;
\r
1243 case 8: fMinClsTPC = 0.;
\r
1244 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1245 fMinClsTPCToF= 0.35;
\r
1246 fUseCorrectedTPCClsInfo=0;
\r
1250 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
\r
1256 ///________________________________________________________________________
\r
1257 Bool_t AliDalitzElectronCuts::SetEtaCut(Int_t etaCut)
\r
1263 fDoEtaCut = kFALSE;
\r
1267 fDoEtaCut = kTRUE;
\r
1271 fDoEtaCut = kTRUE;
\r
1275 fDoEtaCut = kTRUE;
\r
1279 fDoEtaCut = kTRUE;
\r
1283 fDoEtaCut = kTRUE;
\r
1286 fEtaCut = 0.6; //changed from 0.4 to 0.6 2013.06.10
\r
1287 fDoEtaCut = kTRUE;
\r
1290 fEtaCut = 0.5; //changed from 0.3 to 0.5 2013.06.10
\r
1291 fDoEtaCut = kTRUE;
\r
1293 case 8: fEtaCut = 0.4;
\r
1294 fDoEtaCut = kTRUE;
\r
1297 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
\r
1303 ///________________________________________________________________________
\r
1304 Bool_t AliDalitzElectronCuts::SetPtCut(Int_t ptCut)
\r
1307 //0.1GeV, 0.125 GeV, 0.15 GeV
\r
1311 case 0: fPtCut = 0.075;
\r
1316 case 2: // 0.125 GeV
\r
1319 case 3: // 0.15 GeV
\r
1323 cout<<"Warning: PtCut not defined "<<ptCut<<endl;
\r
1330 ///________________________________________________________________________
\r
1331 Bool_t AliDalitzElectronCuts::SetDCACut(Int_t dcaCut)
\r
1335 if( !fesdTrackCuts ) {
\r
1337 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
\r
1345 fesdTrackCuts->SetMaxDCAToVertexZ(1000);
\r
1346 fesdTrackCuts->SetMaxDCAToVertexXY(1000);
\r
1347 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1351 fesdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
\r
1352 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1355 case 2: fesdTrackCuts->SetMaxDCAToVertexZ(2);
\r
1356 fesdTrackCuts->SetMaxDCAToVertexXY(1);
\r
1357 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1361 cout<<"Warning: dcaCut not defined "<<dcaCut<<endl;
\r
1370 ///________________________________________________________________________
\r
1371 Bool_t AliDalitzElectronCuts::SetMaxMomPiondEdxTPCCut(Int_t piMaxMomdedxSigmaCut)
\r
1373 switch(piMaxMomdedxSigmaCut){
\r
1376 fPIDMaxPnSigmaAbovePionLineTPC=0.;
\r
1378 case 1: // 100. GeV
\r
1379 fPIDMaxPnSigmaAbovePionLineTPC=100.;
\r
1382 fPIDMaxPnSigmaAbovePionLineTPC=5.;
\r
1385 fPIDMaxPnSigmaAbovePionLineTPC=4.;
\r
1387 case 4: // 3.5 GeV
\r
1388 fPIDMaxPnSigmaAbovePionLineTPC=3.5;
\r
1391 fPIDMaxPnSigmaAbovePionLineTPC=3.;
\r
1394 cout<<"Warning: piMaxMomdedxSigmaCut not defined "<<piMaxMomdedxSigmaCut<<endl;
\r
1400 ///________________________________________________________________________
\r
1401 Bool_t AliDalitzElectronCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
\r
1403 switch(LowPRejectionSigmaCut){
\r
1405 fDoKaonRejectionLowP=kFALSE;
\r
1406 fDoProtonRejectionLowP=kFALSE;
\r
1407 fDoPionRejectionLowP=kFALSE;
\r
1408 fPIDnSigmaAtLowPAroundKaonLine=0;
\r
1409 fPIDnSigmaAtLowPAroundProtonLine=0;
\r
1410 fPIDnSigmaAtLowPAroundPionLine=0;
\r
1411 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1414 fDoKaonRejectionLowP=kTRUE;
\r
1415 fDoProtonRejectionLowP=kTRUE;
\r
1416 fDoPionRejectionLowP=kTRUE;
\r
1417 fPIDnSigmaAtLowPAroundKaonLine=0.5;
\r
1418 fPIDnSigmaAtLowPAroundProtonLine=0.5;
\r
1419 fPIDnSigmaAtLowPAroundPionLine=0.5;
\r
1420 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1423 fDoKaonRejectionLowP=kTRUE;
\r
1424 fDoProtonRejectionLowP=kTRUE;
\r
1425 fDoPionRejectionLowP=kTRUE;
\r
1426 fPIDnSigmaAtLowPAroundKaonLine=1.0;
\r
1427 fPIDnSigmaAtLowPAroundProtonLine=1.0;
\r
1428 fPIDnSigmaAtLowPAroundPionLine=1.0;
\r
1429 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1432 fDoKaonRejectionLowP=kTRUE;
\r
1433 fDoProtonRejectionLowP=kTRUE;
\r
1434 fDoPionRejectionLowP=kTRUE;
\r
1435 fPIDnSigmaAtLowPAroundKaonLine=1.5;
\r
1436 fPIDnSigmaAtLowPAroundProtonLine=1.5;
\r
1437 fPIDnSigmaAtLowPAroundPionLine=1.5;
\r
1438 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1441 fDoKaonRejectionLowP=kTRUE;
\r
1442 fDoProtonRejectionLowP=kTRUE;
\r
1443 fDoPionRejectionLowP=kTRUE;
\r
1444 fPIDnSigmaAtLowPAroundKaonLine=2.0;
\r
1445 fPIDnSigmaAtLowPAroundProtonLine=2.0;
\r
1446 fPIDnSigmaAtLowPAroundPionLine=2.0;
\r
1447 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1450 fDoKaonRejectionLowP=kTRUE;
\r
1451 fDoProtonRejectionLowP=kTRUE;
\r
1452 fDoPionRejectionLowP=kTRUE;
\r
1453 fPIDnSigmaAtLowPAroundKaonLine=2.0;
\r
1454 fPIDnSigmaAtLowPAroundProtonLine=2.0;
\r
1455 fPIDnSigmaAtLowPAroundPionLine=2.5;
\r
1456 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1459 fDoKaonRejectionLowP=kTRUE;
\r
1460 fDoProtonRejectionLowP=kTRUE;
\r
1461 fDoPionRejectionLowP=kTRUE;
\r
1462 fPIDnSigmaAtLowPAroundKaonLine=0.;
\r
1463 fPIDnSigmaAtLowPAroundProtonLine=0.;
\r
1464 fPIDnSigmaAtLowPAroundPionLine=2.;
\r
1465 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1468 fDoKaonRejectionLowP=kFALSE;
\r
1469 fDoProtonRejectionLowP=kFALSE;
\r
1470 fDoPionRejectionLowP=kTRUE;
\r
1471 fPIDnSigmaAtLowPAroundKaonLine=0.0;
\r
1472 fPIDnSigmaAtLowPAroundProtonLine=0.0;
\r
1473 fPIDnSigmaAtLowPAroundPionLine=1.0;
\r
1474 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1477 fDoKaonRejectionLowP=kFALSE;
\r
1478 fDoProtonRejectionLowP=kFALSE;
\r
1479 fDoPionRejectionLowP=kTRUE;
\r
1480 fPIDnSigmaAtLowPAroundKaonLine=0.;
\r
1481 fPIDnSigmaAtLowPAroundProtonLine=0.;
\r
1482 fPIDnSigmaAtLowPAroundPionLine=0.5;
\r
1483 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1486 cout<<"Warning: LowPRejectionSigmaCut not defined "<<LowPRejectionSigmaCut<<endl;
\r
1492 ///________________________________________________________________________
\r
1493 Bool_t AliDalitzElectronCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
\r
1495 switch(TOFelectronPID){ // RRnewTOF start //////////////////////////////////////////////////////////////////////////
\r
1497 fRequireTOF = kFALSE;
\r
1498 fUseTOFpid = kFALSE;
\r
1499 fTofPIDnSigmaBelowElectronLine=-100;
\r
1500 fTofPIDnSigmaAboveElectronLine=100;
\r
1503 fRequireTOF = kFALSE;
\r
1504 fUseTOFpid = kTRUE;
\r
1505 fTofPIDnSigmaBelowElectronLine=-7;
\r
1506 fTofPIDnSigmaAboveElectronLine=7;
\r
1509 fRequireTOF = kFALSE;
\r
1510 fUseTOFpid = kTRUE;
\r
1511 fTofPIDnSigmaBelowElectronLine=-5;
\r
1512 fTofPIDnSigmaAboveElectronLine=5;
\r
1515 fRequireTOF = kFALSE;
\r
1516 fUseTOFpid = kTRUE;
\r
1517 fTofPIDnSigmaBelowElectronLine=-3;
\r
1518 fTofPIDnSigmaAboveElectronLine=5;
\r
1521 fRequireTOF = kFALSE;
\r
1522 fUseTOFpid = kTRUE;
\r
1523 fTofPIDnSigmaBelowElectronLine=-2;
\r
1524 fTofPIDnSigmaAboveElectronLine=3;
\r
1526 case 5: // -3, 3 TOF mandatory
\r
1527 fRequireTOF = kTRUE;
\r
1528 fUseTOFpid = kTRUE;
\r
1529 fTofPIDnSigmaBelowElectronLine= -3;
\r
1530 fTofPIDnSigmaAboveElectronLine= 3;
\r
1533 cout<<"Warning: TOFElectronCut not defined "<<TOFelectronPID<<endl;
\r
1535 } //////////////////////// RRnewTOF end //////////////////////////////////////////////////////////////////////////
\r
1538 ///_______________________________________________________________________________
\r
1540 Bool_t AliDalitzElectronCuts::SetPsiPairCut(Int_t psiCut) {
\r
1545 fDoPsiPairCut = kFALSE;
\r
1546 fPsiPairCut = 10000.; //
\r
1547 fDeltaPhiCutMin = -1000.;
\r
1548 fDeltaPhiCutMax = 1000.;
\r
1552 fDoPsiPairCut = kTRUE;
\r
1553 fPsiPairCut = 0.45; // Standard
\r
1554 fDeltaPhiCutMin = 0.;
\r
1555 fDeltaPhiCutMax = 0.12;
\r
1558 fDoPsiPairCut = kTRUE;
\r
1559 fPsiPairCut = 0.60;
\r
1560 fDeltaPhiCutMin = 0.;
\r
1561 fDeltaPhiCutMax = 0.12;
\r
1565 cout<<"Warning: PsiPairCut not defined "<<fPsiPairCut<<endl;
\r
1572 ///_______________________________________________________________________________
\r
1573 Bool_t AliDalitzElectronCuts::SetRejectSharedElecGamma(Int_t RCut) {
\r
1578 fDoRejectSharedElecGamma = kFALSE;
\r
1579 fRadiusCut = 10000; //
\r
1582 fDoRejectSharedElecGamma = kTRUE;
\r
1583 fRadiusCut = 2.0; // cm
\r
1586 fDoRejectSharedElecGamma = kTRUE;
\r
1587 fRadiusCut = 3.0; // Standard
\r
1590 fDoRejectSharedElecGamma = kTRUE;
\r
1591 fRadiusCut = 4.0; //
\r
1594 fDoRejectSharedElecGamma = kTRUE;
\r
1595 fRadiusCut = 5.0; //
\r
1598 fDoRejectSharedElecGamma = kTRUE;
\r
1599 fRadiusCut = 10.0; //
\r
1602 fDoRejectSharedElecGamma = kTRUE;
\r
1603 fRadiusCut = 15.0; //
\r
1606 cout<<"Warning: PsiPairCut not defined "<<fDoRejectSharedElecGamma<<endl;
\r
1612 ///__________________________________________________________________________
\r
1613 Bool_t AliDalitzElectronCuts::SetBackgroundScheme(Int_t BackgroundScheme){
\r
1616 switch(BackgroundScheme){
\r
1618 case 0: //Rotation
\r
1620 fUseTrackMultiplicityForBG = kFALSE;
\r
1622 case 1: // mixed event with V0 multiplicity
\r
1624 fUseTrackMultiplicityForBG = kFALSE;
\r
1626 case 2: // mixed event with track multiplicity
\r
1627 fUseTrackMultiplicityForBG = kTRUE;
\r
1630 case 3: //Rotation
\r
1631 fUseTrackMultiplicityForBG = kFALSE;
\r
1634 case 4: //Rotation
\r
1635 fUseTrackMultiplicityForBG = kTRUE;
\r
1638 case 5: fUseTrackMultiplicityForBG = kTRUE;
\r
1643 cout<<"Warning: BackgroundScheme not defined "<<BackgroundScheme<<endl;
\r
1649 ///________________________________________________________________________
\r
1650 Bool_t AliDalitzElectronCuts::SetNumberOfRotations(Int_t NumberOfRotations)
\r
1652 switch(NumberOfRotations){
\r
1654 fnumberOfRotationEventsForBG = 5;
\r
1657 fnumberOfRotationEventsForBG = 10;
\r
1660 fnumberOfRotationEventsForBG = 15;
\r
1663 fnumberOfRotationEventsForBG = 20;
\r
1666 fnumberOfRotationEventsForBG = 2;
\r
1669 fnumberOfRotationEventsForBG = 50;
\r
1672 fnumberOfRotationEventsForBG = 80;
\r
1675 fnumberOfRotationEventsForBG = 100;
\r
1678 cout<<"Warning: NumberOfRotations not defined "<<NumberOfRotations<<endl;
\r
1686 ///________________________________________________________________________
\r
1687 Bool_t AliDalitzElectronCuts::SetMassCut(Int_t massCut)
\r
1693 fMassCutPtMin = -999.; //GeV
\r
1694 fMassCutLowPt = 999.; //GeV/c^2
\r
1695 fMassCutHighPt = 999.; //GeV/c^2
\r
1696 fDoMassCut = kFALSE;
\r
1699 //fMassCut = 0.135; //GeV/c^2
\r
1700 fMassCutPtMin = -999.; //GeV
\r
1701 fMassCutLowPt = 0.135; //GeV/c^2
\r
1702 fMassCutHighPt = 0.135; //GeV/c^2
\r
1703 fDoMassCut = kTRUE;
\r
1706 //fMassCut = 0.100; //GeV/c^2
\r
1707 fMassCutPtMin = -999.; //GeV
\r
1708 fMassCutLowPt = 0.100; //GeV/c^2
\r
1709 fMassCutHighPt = 0.100; //GeV/c^2
\r
1710 fDoMassCut = kTRUE;
\r
1713 //fMassCut = 0.075; //GeV/c^2
\r
1714 fMassCutPtMin = -999.; //GeV
\r
1715 fMassCutLowPt = 0.075; //GeV/c^2
\r
1716 fMassCutHighPt = 0.075; //GeV/c^2
\r
1717 fDoMassCut = kTRUE;
\r
1720 //fMassCut = 0.050; //GeV/c^2
\r
1721 fMassCutPtMin = -999.; //GeV
\r
1722 fMassCutLowPt = 0.050; //GeV/c^2
\r
1723 fMassCutHighPt = 0.050; //GeV/c^2
\r
1724 fDoMassCut = kTRUE;
\r
1728 fMassCutPtMin = -999.; //GeV
\r
1729 fMassCutLowPt = 0.035; //GeV/c^2
\r
1730 fMassCutHighPt = 0.035; //GeV/c^2
\r
1731 fDoMassCut = kTRUE;
\r
1734 fMassCutPtMin = -999.; //GeV
\r
1735 fMassCutLowPt = 0.015; //GeV/c^2
\r
1736 fMassCutHighPt = 0.015; //GeV/c^2
\r
1737 fDoMassCut = kTRUE;
\r
1739 case 7: fMassCutPtMin = 1.0; //GeV
\r
1740 fMassCutLowPt = 0.015; //GeV/c^2
\r
1741 fMassCutHighPt = 0.035; //GeV/c^2
\r
1742 fDoMassCut = kTRUE;
\r
1745 cout<<"Warning: MassCut not defined "<<massCut<<endl;
\r
1751 ///________________________________________________________________________
\r
1752 TString AliDalitzElectronCuts::GetCutNumber(){
\r
1753 // returns TString with current cut number
\r
1754 TString a(kNCuts);
\r
1755 for(Int_t ii=0;ii<kNCuts;ii++){
\r
1756 a.Append(Form("%d",fCuts[ii]));
\r
1762 ///________________________________________________________________________
\r
1763 AliDalitzElectronCuts* AliDalitzElectronCuts::GetStandardCuts2010PbPb(){
\r
1764 //Create and return standard 2010 PbPb cuts
\r
1765 AliDalitzElectronCuts *cuts=new AliDalitzElectronCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
\r
1766 if(!cuts->InitializeCutsFromCutString("9069640364102")){
\r
1767 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
\r
1771 ///________________________________________________________________________
\r
1772 AliDalitzElectronCuts* AliDalitzElectronCuts::GetStandardCuts2010pp(){
\r
1773 //Create and return standard 2010 PbPb cuts
\r
1774 AliDalitzElectronCuts *cuts=new AliDalitzElectronCuts("StandardCuts2010pp","StandardCuts2010pp");
\r
1776 if(!cuts->InitializeCutsFromCutString("9069640364102")){
\r
1777 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
\r