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
71 //________________________________________________________________________
\r
72 AliDalitzElectronCuts::AliDalitzElectronCuts(const char *name,const char *title) : AliAnalysisCuts(name,title),
\r
75 fesdTrackCuts(NULL),
\r
82 fDeltaPhiCutMin(0.),
\r
83 fDeltaPhiCutMax(0.12),
\r
84 fMinClsTPC(0), // minimum clusters in the TPC
\r
85 fMinClsTPCToF(0), // minimum clusters to findable clusters
\r
86 fDodEdxSigmaITSCut(kFALSE),
\r
87 fDodEdxSigmaTPCCut(kTRUE),
\r
88 fDoTOFsigmaCut(kFALSE), // RRnewTOF
\r
89 fDoRejectSharedElecGamma(kFALSE),
\r
90 fDoPsiPairCut(kFALSE),
\r
91 fPIDnSigmaAboveElectronLineITS(100),
\r
92 fPIDnSigmaBelowElectronLineITS(-100),
\r
93 fPIDnSigmaAboveElectronLineTPC(100),
\r
94 fPIDnSigmaBelowElectronLineTPC(-100),
\r
95 fPIDnSigmaAbovePionLineTPC(0),
\r
96 fPIDnSigmaAbovePionLineTPCHighPt(-100),
\r
97 fTofPIDnSigmaAboveElectronLine(100), // RRnewTOF
\r
98 fTofPIDnSigmaBelowElectronLine(-100), // RRnewTOF
\r
99 fPIDMinPnSigmaAbovePionLineTPC(0),
\r
100 fPIDMaxPnSigmaAbovePionLineTPC(0),
\r
101 fDoKaonRejectionLowP(kFALSE),
\r
102 fDoProtonRejectionLowP(kFALSE),
\r
103 fDoPionRejectionLowP(kFALSE),
\r
104 fPIDnSigmaAtLowPAroundKaonLine(0),
\r
105 fPIDnSigmaAtLowPAroundProtonLine(0),
\r
106 fPIDnSigmaAtLowPAroundPionLine(0),
\r
107 fPIDMinPKaonRejectionLowP(1.5),
\r
108 fPIDMinPProtonRejectionLowP(2.0),
\r
109 fPIDMinPPionRejectionLowP(0.5),
\r
110 fUseCorrectedTPCClsInfo(kFALSE),
\r
111 fUseTOFpid(kFALSE),
\r
112 fRequireTOF(kFALSE),
\r
113 fUseTrackMultiplicityForBG(kFALSE),
\r
115 fnumberOfRotationEventsForBG(0),
\r
116 fDoMassCut(kFALSE),
\r
117 fMassCutLowPt(999.),
\r
118 fMassCutHighPt(999.),
\r
119 fMassCutPtMin(-100.0),
\r
120 fDoWeights(kFALSE),
\r
124 hITSdEdxbefore(NULL),
\r
125 hITSdEdxafter(NULL),
\r
126 hTPCdEdxbefore(NULL),
\r
127 hTPCdEdxafter(NULL),
\r
128 hTPCdEdxSignalbefore(NULL),
\r
129 hTPCdEdxSignalafter(NULL),
\r
132 hTrackDCAxyPtbefore(NULL),
\r
133 hTrackDCAxyPtafter(NULL),
\r
134 hTrackDCAzPtbefore(NULL),
\r
135 hTrackDCAzPtafter(NULL),
\r
136 hTrackNFindClsPtTPCbefore(NULL),
\r
137 hTrackNFindClsPtTPCafter(NULL)
\r
140 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
\r
141 fCutString=new TObjString((GetCutNumber()).Data());
\r
143 //fesdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
\r
144 // Using standard function for setting Cuts
\r
145 Bool_t selectPrimaries=kFALSE;
\r
146 fesdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
\r
149 //________________________________________________________________________
\r
150 AliDalitzElectronCuts::~AliDalitzElectronCuts() {
\r
152 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
\r
154 // delete fHistograms;
\r
155 // fHistograms = NULL;
\r
157 if(fCutString != NULL){
\r
165 //________________________________________________________________________
\r
166 void AliDalitzElectronCuts::InitCutHistograms(TString name, Bool_t preCut,TString cutNumber){
\r
168 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
\r
170 TString cutName = "";
\r
172 if( cutNumber==""){
\r
173 cutName = GetCutNumber().Data();
\r
176 cutName = cutNumber.Data();
\r
179 if(fHistograms != NULL){
\r
180 delete fHistograms;
\r
183 if(fHistograms==NULL){
\r
184 fHistograms=new TList();
\r
185 if(name=="")fHistograms->SetName(Form("ElectronCuts_%s",cutName.Data()));
\r
186 else fHistograms->SetName(Form("%s_%s",name.Data(),cutName.Data()));
\r
190 hCutIndex=new TH1F(Form("IsElectronSelected %s",cutName.Data()),"IsElectronSelected",10,-0.5,9.5);
\r
191 hCutIndex->GetXaxis()->SetBinLabel(kElectronIn+1,"in");
\r
192 hCutIndex->GetXaxis()->SetBinLabel(kNoTracks+1,"no tracks");
\r
193 hCutIndex->GetXaxis()->SetBinLabel(kTrackCuts+1,"Track cuts");
\r
194 hCutIndex->GetXaxis()->SetBinLabel(kdEdxCuts+1,"dEdx");
\r
195 hCutIndex->GetXaxis()->SetBinLabel(kElectronOut+1,"out");
\r
196 fHistograms->Add(hCutIndex);
\r
201 hdEdxCuts=new TH1F(Form("dEdxCuts %s",cutName.Data()),"dEdxCuts",10,-0.5,9.5);
\r
202 hdEdxCuts->GetXaxis()->SetBinLabel(1,"in");
\r
203 hdEdxCuts->GetXaxis()->SetBinLabel(2,"ITSelectron");
\r
204 hdEdxCuts->GetXaxis()->SetBinLabel(3,"TPCelectron");
\r
205 hdEdxCuts->GetXaxis()->SetBinLabel(4,"TPCpion");
\r
206 hdEdxCuts->GetXaxis()->SetBinLabel(5,"TPCpionhighp");
\r
207 hdEdxCuts->GetXaxis()->SetBinLabel(6,"TPCkaonlowprej");
\r
208 hdEdxCuts->GetXaxis()->SetBinLabel(7,"TPCprotonlowprej");
\r
209 hdEdxCuts->GetXaxis()->SetBinLabel(8,"TPCpionlowprej");
\r
210 hdEdxCuts->GetXaxis()->SetBinLabel(9,"TOFelectron");
\r
211 hdEdxCuts->GetXaxis()->SetBinLabel(10,"out");
\r
212 fHistograms->Add(hdEdxCuts);
\r
216 TAxis *AxisBeforeITS = NULL;
\r
217 TAxis *AxisBeforedEdx = NULL;
\r
218 TAxis *AxisBeforeTOF = NULL;
\r
219 TAxis *AxisBeforedEdxSignal = NULL;
\r
224 hITSdEdxbefore=new TH2F(Form("Electron_ITS_before %s",cutName.Data()),"ITS dEdx electron before" ,150,0.05,20,400,-10,10);
\r
225 fHistograms->Add(hITSdEdxbefore);
\r
226 AxisBeforeITS = hITSdEdxbefore->GetXaxis();
\r
228 hTPCdEdxbefore=new TH2F(Form("Electron_dEdx_before %s",cutName.Data()),"dEdx electron before" ,150,0.05,20,400,-10,10);
\r
229 fHistograms->Add(hTPCdEdxbefore);
\r
230 AxisBeforedEdx = hTPCdEdxbefore->GetXaxis();
\r
232 hTPCdEdxSignalbefore=new TH2F(Form("Electron_dEdxSignal_before %s",cutName.Data()),"dEdx electron signal before" ,150,0.05,20.0,800,0.0,200);
\r
233 fHistograms->Add(hTPCdEdxSignalbefore);
\r
234 AxisBeforedEdxSignal = hTPCdEdxSignalbefore->GetXaxis();
\r
236 hTOFbefore=new TH2F(Form("Electron_TOF_before %s",cutName.Data()),"TOF electron before" ,150,0.05,20,400,-6,10);
\r
237 fHistograms->Add(hTOFbefore);
\r
238 AxisBeforeTOF = hTOFbefore->GetXaxis();
\r
240 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
241 fHistograms->Add(hTrackDCAxyPtbefore);
\r
243 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
244 fHistograms->Add(hTrackDCAzPtbefore);
\r
246 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
247 fHistograms->Add(hTrackNFindClsPtTPCbefore);
\r
254 hITSdEdxafter=new TH2F(Form("Electron_ITS_after %s",cutName.Data()),"ITS dEdx electron after" ,150,0.05,20,400, -10,10);
\r
255 fHistograms->Add(hITSdEdxafter);
\r
257 hTPCdEdxafter=new TH2F(Form("Electron_dEdx_after %s",cutName.Data()),"dEdx electron after" ,150,0.05,20,400, -10,10);
\r
258 fHistograms->Add(hTPCdEdxafter);
\r
260 hTPCdEdxSignalafter=new TH2F(Form("Electron_dEdxSignal_after %s",cutName.Data()),"dEdx electron signal after" ,150,0.05,20.0,800,0.0,200);
\r
261 fHistograms->Add(hTPCdEdxSignalafter);
\r
263 hTOFafter=new TH2F(Form("Electron_TOF_after %s",cutName.Data()),"TOF electron after" ,150,0.05,20,400,-6,10);
\r
264 fHistograms->Add(hTOFafter);
\r
266 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
267 fHistograms->Add(hTrackDCAxyPtafter);
\r
269 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
270 fHistograms->Add(hTrackDCAzPtafter);
\r
272 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
273 fHistograms->Add(hTrackNFindClsPtTPCafter);
\r
277 TAxis *AxisAfter = hTPCdEdxafter->GetXaxis();
\r
278 Int_t bins = AxisAfter->GetNbins();
\r
279 Double_t from = AxisAfter->GetXmin();
\r
280 Double_t to = AxisAfter->GetXmax();
\r
281 Double_t *newBins = new Double_t[bins+1];
\r
283 Double_t factor = TMath::Power(to/from, 1./bins);
\r
284 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
\r
285 AxisAfter->Set(bins, newBins);
\r
286 AxisAfter = hTOFafter->GetXaxis();
\r
287 AxisAfter->Set(bins, newBins);
\r
288 AxisAfter = hITSdEdxafter->GetXaxis();
\r
289 AxisAfter->Set(bins,newBins);
\r
290 AxisAfter = hTPCdEdxSignalafter->GetXaxis();
\r
291 AxisAfter->Set(bins,newBins);
\r
294 AxisBeforeITS->Set(bins, newBins);
\r
295 AxisBeforedEdx->Set(bins, newBins);
\r
296 AxisBeforedEdxSignal->Set(bins,newBins);
\r
297 AxisBeforeTOF->Set(bins, newBins);
\r
303 // Event Cuts and Info
\r
307 //________________________________________________________________________
\r
308 Bool_t AliDalitzElectronCuts::InitPIDResponse(){
\r
310 // Set Pointer to AliPIDResponse
\r
312 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
\r
316 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
\r
317 fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
\r
318 if(fPIDResponse)return kTRUE;
\r
324 ///________________________________________________________________________
\r
325 Bool_t AliDalitzElectronCuts::ElectronIsSelectedMC(Int_t labelParticle,AliStack *fMCStack)
\r
327 if( labelParticle < 0 || labelParticle >= fMCStack->GetNtrack() ) return kFALSE;
\r
328 if( fMCStack->IsPhysicalPrimary(labelParticle) == kFALSE ) return kFALSE; //Ask Ana
\r
330 TParticle* particle = fMCStack->Particle(labelParticle);
\r
332 if( TMath::Abs( particle->GetPdgCode() ) != 11 ) return kFALSE;
\r
335 if( particle->Eta() > (fEtaCut + fEtaShift) || particle->Eta() < (-fEtaCut + fEtaShift) )
\r
344 ///________________________________________________________________________
\r
345 Bool_t AliDalitzElectronCuts::ElectronIsSelected(AliESDtrack* lTrack)
\r
347 //Selection of Reconstructed electrons
\r
352 lTrack->GetImpactParameters(b,bCov);
\r
354 if (bCov[0]<=0 || bCov[2]<=0) {
\r
355 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
356 bCov[0]=0; bCov[2]=0;
\r
361 Float_t dcaToVertexXY = b[0];
\r
362 Float_t dcaToVertexZ = b[1];
\r
363 Double_t clsToF = GetNFindableClustersTPC(lTrack);
\r
365 if( hTrackDCAxyPtbefore) hTrackDCAxyPtbefore->Fill(dcaToVertexXY,lTrack->Pt());
\r
366 if( hTrackDCAzPtbefore ) hTrackDCAzPtbefore->Fill( dcaToVertexZ, lTrack->Pt());
\r
367 if( hTrackNFindClsPtTPCbefore ) hTrackNFindClsPtTPCbefore->Fill( clsToF, lTrack->Pt());
\r
371 if(hCutIndex)hCutIndex->Fill(kElectronIn);
\r
373 if (lTrack == NULL){
\r
374 if(hCutIndex)hCutIndex->Fill(kNoTracks);
\r
378 if ( ! lTrack->GetConstrainedParam() ){
\r
381 AliVTrack * track = dynamic_cast<AliVTrack*>(lTrack);
\r
385 if( !TrackIsSelected(lTrack) ){
\r
386 if(hCutIndex)hCutIndex->Fill(kTrackCuts);
\r
392 if( ! dEdxCuts( track ) ) {
\r
393 if(hCutIndex)hCutIndex->Fill(kdEdxCuts);
\r
398 //Electron passed the cuts
\r
399 if(hCutIndex)hCutIndex->Fill(kElectronOut);
\r
401 if( hTrackDCAxyPtafter) hTrackDCAxyPtafter->Fill(dcaToVertexXY,lTrack->Pt());
\r
402 if( hTrackDCAzPtafter ) hTrackDCAzPtafter->Fill(dcaToVertexZ,lTrack->Pt());
\r
403 if( hTrackNFindClsPtTPCafter ) hTrackNFindClsPtTPCafter->Fill( clsToF, lTrack->Pt());
\r
409 ///________________________________________________________________________
\r
410 Bool_t AliDalitzElectronCuts::TrackIsSelected(AliESDtrack* lTrack) {
\r
411 // Track Selection for Photon Reconstruction
\r
414 Double_t clsToF = GetNFindableClustersTPC(lTrack);
\r
417 if( ! fesdTrackCuts->AcceptTrack(lTrack) ){
\r
423 if( lTrack->Eta() > (fEtaCut + fEtaShift) || lTrack->Eta() < (-fEtaCut + fEtaShift) ) {
\r
429 if( lTrack->Pt() < fPtCut ) {
\r
437 if( clsToF < fMinClsTPCToF){
\r
445 ///________________________________________________________________________
\r
446 Bool_t AliDalitzElectronCuts::dEdxCuts(AliVTrack *fCurrentTrack){
\r
448 // Electron Identification Cuts for Photon reconstruction
\r
450 if(!fPIDResponse){ InitPIDResponse(); }// Try to reinitialize PID Response
\r
451 if(!fPIDResponse){ AliError("No PID Response"); return kFALSE;}// if still missing fatal error
\r
455 //cout<<"dEdxCuts: //////////////////////////////////////////////////////////////////////////"<<endl;
\r
461 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
462 if(hITSdEdxbefore)hITSdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
\r
463 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
\r
464 if(hTPCdEdxSignalbefore)hTPCdEdxSignalbefore->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
\r
470 if( fDodEdxSigmaITSCut == kTRUE ){
\r
473 if( fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLineITS ||
\r
474 fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kElectron)> fPIDnSigmaAboveElectronLineITS ){
\r
476 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
482 if(hITSdEdxafter)hITSdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
\r
488 if(fDodEdxSigmaTPCCut == kTRUE){
\r
491 // TPC Electron Line
\r
492 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLineTPC ||
\r
493 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLineTPC){
\r
495 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
501 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLineTPC && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLineTPC ){
\r
502 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLineTPC &&
\r
503 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLineTPC &&
\r
504 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineTPC){
\r
506 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
512 // High Pt Pion rej
\r
513 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLineTPC ){
\r
514 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLineTPC &&
\r
515 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLineTPC&&
\r
516 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineTPCHighPt){
\r
518 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
526 else{ cutIndex+=3; }
\r
529 if( fDoKaonRejectionLowP == kTRUE ){
\r
531 if( fCurrentTrack->P() < fPIDMinPKaonRejectionLowP ){
\r
533 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
\r
535 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
543 if( fDoProtonRejectionLowP == kTRUE ){
\r
545 if( fCurrentTrack->P() < fPIDMinPProtonRejectionLowP ){
\r
546 if( TMath::Abs( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
\r
548 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
555 if(fDoPionRejectionLowP == kTRUE){
\r
556 if( fCurrentTrack->P() < fPIDMinPPionRejectionLowP ){
\r
557 if( TMath::Abs( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)) < fPIDnSigmaAtLowPAroundPionLine ){
\r
559 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
567 if( ( fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid ) && ( !( fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch) ) ){
\r
568 if(hTOFbefore) hTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
\r
570 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
\r
571 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
\r
572 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
576 if(hTOFafter)hTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
\r
578 else if ( fRequireTOF == kTRUE ) {
\r
580 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
585 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
586 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
\r
587 if(hTPCdEdxSignalafter)hTPCdEdxSignalafter->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
\r
591 ///________________________________________________________________________
\r
594 AliVTrack *AliDalitzElectronCuts::GetTrack(AliVEvent * event, Int_t label){
\r
595 //Returns pointer to the track with given ESD label
\r
596 //(Important for AOD implementation, since Track array in AOD data is different
\r
597 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
\r
599 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
\r
601 if(label > event->GetNumberOfTracks() ) return NULL;
\r
602 AliESDtrack * track = esdEvent->GetTrack(label);
\r
606 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
\r
607 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
\r
610 if(track->GetID() == label) {
\r
617 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
\r
620 ///________________________________________________________________________
\r
621 Bool_t AliDalitzElectronCuts::RejectSharedElecGamma(TList *photons, Int_t indexEle){
\r
624 for(Int_t i = 0;i<photons->GetEntries();i++){
\r
626 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
\r
628 Int_t posLabel = photonComp->GetTrackLabelPositive();
\r
629 Int_t negLabel = photonComp->GetTrackLabelNegative();
\r
631 if( (photonComp->GetConversionRadius() < fRadiusCut) && (posLabel == indexEle || negLabel == indexEle) ){
\r
638 Bool_t AliDalitzElectronCuts::MassCut(Double_t pi0CandidatePt , Double_t vphotonCandidateMass){
\r
640 if( pi0CandidatePt < fMassCutPtMin ){
\r
642 if( vphotonCandidateMass < fMassCutLowPt ){
\r
649 if( vphotonCandidateMass < fMassCutHighPt ){
\r
659 Double_t AliDalitzElectronCuts::GetNFindableClustersTPC(AliESDtrack* lTrack){
\r
665 if ( !fUseCorrectedTPCClsInfo ){
\r
666 if(lTrack->GetTPCNclsF()!=0){
\r
668 clsToF = (Double_t)lTrack->GetNcls(1)/(Double_t)lTrack->GetTPCNclsF();
\r
669 }// Ncluster/Nfindablecluster
\r
673 //clsToF = lTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
\r
674 clsToF = lTrack->GetTPCClusterInfo(2,0); //NOTE ask friederike
\r
683 Double_t AliDalitzElectronCuts::GetPsiPair( const AliESDtrack *trackPos, const AliESDtrack *trackNeg )
\r
686 // This angle is a measure for the contribution of the opening in polar
\r
687 // direction ??0 to the opening angle ?? Pair
\r
689 // Ref. Measurement of photons via conversion pairs with the PHENIX experiment at RHIC
\r
690 // Master Thesis. Thorsten Dahms. 2005
\r
691 // https://twiki.cern.ch/twiki/pub/ALICE/GammaPhysicsPublications/tdahms_thesis.pdf
\r
693 Double_t momPos[3];
\r
694 Double_t momNeg[3];
\r
695 if( trackPos->GetConstrainedPxPyPz(momPos) == 0 ) trackPos->GetPxPyPz( momPos );
\r
696 if( trackNeg->GetConstrainedPxPyPz(momNeg) == 0 ) trackNeg->GetPxPyPz( momNeg );
\r
698 TVector3 posDaughter;
\r
699 TVector3 negDaughter;
\r
701 posDaughter.SetXYZ( momPos[0], momPos[1], momPos[2] );
\r
702 negDaughter.SetXYZ( momNeg[0], momNeg[1], momNeg[2] );
\r
704 Double_t deltaTheta = negDaughter.Theta() - posDaughter.Theta();
\r
705 Double_t openingAngle = posDaughter.Angle( negDaughter ); //TMath::ACos( posDaughter.Dot(negDaughter)/(negDaughter.Mag()*posDaughter.Mag()) );
\r
707 if( openingAngle < 1e-20 ) return 0.;
\r
709 Double_t psiAngle = TMath::ASin( deltaTheta/openingAngle );
\r
714 Bool_t AliDalitzElectronCuts::IsFromGammaConversion( Double_t psiPair, Double_t deltaPhi )
\r
717 // Returns true if it is a gamma conversion according to psi pair value
\r
719 return ( (deltaPhi > fDeltaPhiCutMin && deltaPhi < fDeltaPhiCutMax) &&
\r
720 TMath::Abs(psiPair) < ( fPsiPairCut - fPsiPairCut/fDeltaPhiCutMax * deltaPhi ) );
\r
723 ///________________________________________________________________________
\r
724 Bool_t AliDalitzElectronCuts::UpdateCutString() {
\r
725 ///Update the cut string (if it has been created yet)
\r
727 if(fCutString && fCutString->GetString().Length() == kNCuts) {
\r
728 // cout << "Updating cut id in spot number " << cutID << " to " << value << endl;
\r
729 fCutString->SetString(GetCutNumber());
\r
731 // cout << "fCutString not yet initialized, will not be updated" << endl;
\r
734 // cout << fCutString->GetString().Data() << endl;
\r
738 ///________________________________________________________________________
\r
739 Bool_t AliDalitzElectronCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
\r
740 // Initialize Cuts from a given Cut string
\r
742 // out<<"Set Cut Number: "<<analysisCutSelection.Data()<<endl;
\r
743 AliInfo(Form("Set ElectronCuts Number: %s",analysisCutSelection.Data()));
\r
745 if(analysisCutSelection.Length()!=kNCuts) {
\r
746 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
\r
749 if(!analysisCutSelection.IsDigit()){
\r
750 AliError("Cut selection contains characters");
\r
754 const char *cutSelection = analysisCutSelection.Data();
\r
755 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
\r
756 for(Int_t ii=0;ii<kNCuts;ii++){
\r
762 AliError("Analysis Cut Selection does not start with 9");
\r
767 // Set Individual Cuts
\r
768 for(Int_t ii=0;ii<kNCuts;ii++){
\r
769 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
\r
776 ///________________________________________________________________________
\r
777 Bool_t AliDalitzElectronCuts::SetCut(cutIds cutID, const Int_t value) {
\r
778 ///Set individual cut ID
\r
780 //cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
\r
784 fCuts[kgoodId] = value;
\r
786 cout << "Error:: First value of cut string is wrong, aborting!!" << endl;
\r
792 case kededxSigmaITSCut:
\r
793 if( SetITSdEdxCutElectronLine(value)) { //NOTE SetITSdEdxCutElectronLine: To be implemented
\r
794 fCuts[kededxSigmaITSCut] = value;
\r
797 } else return kFALSE;
\r
799 case kededxSigmaTPCCut:
\r
800 if( SetTPCdEdxCutElectronLine(value)) { //NOTE SetITSdEdxCutElectronLine: To be implemented
\r
801 fCuts[kededxSigmaTPCCut] = value;
\r
804 } else return kFALSE;
\r
806 case kpidedxSigmaTPCCut:
\r
807 if( SetTPCdEdxCutPionLine(value)) { //NOTE SetITSdEdxCutPionLine: To be implemented
\r
808 fCuts[kpidedxSigmaTPCCut] = value;
\r
811 } else return kFALSE;
\r
813 case kpiMinMomdedxSigmaTPCCut:
\r
814 if( SetMinMomPiondEdxTPCCut(value)) {
\r
815 fCuts[kpiMinMomdedxSigmaTPCCut] = value;
\r
818 } else return kFALSE;
\r
820 case kpiMaxMomdedxSigmaTPCCut:
\r
821 if( SetMaxMomPiondEdxTPCCut(value)) {
\r
822 fCuts[kpiMaxMomdedxSigmaTPCCut] = value;
\r
825 } else return kFALSE;
\r
827 case kLowPRejectionSigmaCut:
\r
828 if( SetLowPRejectionCuts(value) ) {
\r
829 fCuts[kLowPRejectionSigmaCut] = value;
\r
832 } else return kFALSE;
\r
835 case kTOFelectronPID:
\r
836 if( SetTOFElectronPIDCut(value)) {
\r
837 fCuts[kTOFelectronPID] = value;
\r
840 } else return kFALSE;
\r
842 if( SetITSClusterCut(value) ) {
\r
843 fCuts[kclsITSCut] = value;
\r
846 } else return kFALSE;
\r
848 if( SetTPCClusterCut(value)) {
\r
849 fCuts[kclsTPCCut] = value;
\r
852 } else return kFALSE;
\r
855 if( SetEtaCut(value)) {
\r
856 fCuts[ketaCut] = value;
\r
859 } else return kFALSE;
\r
861 if( SetPtCut(value)) {
\r
862 fCuts[kptCut] = value;
\r
865 } else return kFALSE;
\r
868 if( SetDCACut(value)) {
\r
869 fCuts[kDCACut] = value;
\r
872 } else return kFALSE;
\r
876 if( SetPsiPairCut(value)) {
\r
877 fCuts[kPsiPair] = value;
\r
880 } else return kFALSE;
\r
882 case kRejectSharedElecGamma:
\r
883 if( SetRejectSharedElecGamma(value)) {
\r
884 fCuts[kRejectSharedElecGamma] = value;
\r
887 } else return kFALSE;
\r
889 case kBackgroundScheme:
\r
890 if( SetBackgroundScheme(value)) {
\r
891 fCuts[kBackgroundScheme] = value;
\r
894 } else return kFALSE;
\r
896 case kNumberOfRotations:
\r
897 if( SetNumberOfRotations(value)) {
\r
898 fCuts[kNumberOfRotations] = value;
\r
901 } else return kFALSE;
\r
904 if( SetMassCut(value)) {
\r
905 fCuts[kmassCut] = value;
\r
908 } else return kFALSE;
\r
910 if( SetDoWeights(value)) {
\r
911 fCuts[kWeights] = value;
\r
914 } else return kFALSE;
\r
918 cout << "Error:: Cut id out of range"<< endl;
\r
922 cout << "Error:: Cut id " << cutID << " not recognized "<< endl;
\r
929 ///________________________________________________________________________
\r
931 void AliDalitzElectronCuts::PrintCuts() {
\r
932 // Print out current Cut Selection
\r
933 for(Int_t ic = 0; ic < kNCuts; ic++) {
\r
934 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
\r
939 ///________________________________________________________________________
\r
940 Bool_t AliDalitzElectronCuts::SetITSdEdxCutElectronLine(Int_t ededxSigmaCut)
\r
943 switch(ededxSigmaCut){
\r
946 fDodEdxSigmaITSCut = kFALSE;
\r
947 fPIDnSigmaBelowElectronLineITS=-100;
\r
948 fPIDnSigmaAboveElectronLineITS= 100;
\r
951 fDodEdxSigmaITSCut = kTRUE;
\r
952 fPIDnSigmaBelowElectronLineITS=-10;
\r
953 fPIDnSigmaAboveElectronLineITS=10;
\r
956 fDodEdxSigmaITSCut = kTRUE;
\r
957 fPIDnSigmaBelowElectronLineITS=-6;
\r
958 fPIDnSigmaAboveElectronLineITS=7;
\r
961 fDodEdxSigmaITSCut = kTRUE;
\r
962 fPIDnSigmaBelowElectronLineITS=-5;
\r
963 fPIDnSigmaAboveElectronLineITS=5;
\r
966 fDodEdxSigmaITSCut = kTRUE;
\r
967 fPIDnSigmaBelowElectronLineITS=-4;
\r
968 fPIDnSigmaAboveElectronLineITS=5;
\r
971 fDodEdxSigmaITSCut = kTRUE;
\r
972 fPIDnSigmaBelowElectronLineITS=-3;
\r
973 fPIDnSigmaAboveElectronLineITS=5;
\r
976 fDodEdxSigmaITSCut = kTRUE;
\r
977 fPIDnSigmaBelowElectronLineITS=-4;
\r
978 fPIDnSigmaAboveElectronLineITS=4;
\r
981 fDodEdxSigmaITSCut = kTRUE;
\r
982 fPIDnSigmaBelowElectronLineITS=-2.5;
\r
983 fPIDnSigmaAboveElectronLineITS=4;
\r
986 fDodEdxSigmaITSCut = kTRUE;
\r
987 fPIDnSigmaBelowElectronLineITS=-2;
\r
988 fPIDnSigmaAboveElectronLineITS=3.5;
\r
991 cout<<"Warning: ITSdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
\r
998 ///________________________________________________________________________
\r
999 Bool_t AliDalitzElectronCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
\r
1001 switch(ededxSigmaCut){
\r
1003 case 0: fDodEdxSigmaTPCCut = kFALSE;
\r
1004 fPIDnSigmaBelowElectronLineTPC=-10;
\r
1005 fPIDnSigmaAboveElectronLineTPC=10;
\r
1008 fDodEdxSigmaTPCCut = kTRUE;
\r
1009 fPIDnSigmaBelowElectronLineTPC=-10;
\r
1010 fPIDnSigmaAboveElectronLineTPC=10;
\r
1013 fDodEdxSigmaTPCCut = kTRUE;
\r
1014 fPIDnSigmaBelowElectronLineTPC=-6;
\r
1015 fPIDnSigmaAboveElectronLineTPC=7;
\r
1018 fDodEdxSigmaTPCCut = kTRUE;
\r
1019 fPIDnSigmaBelowElectronLineTPC=-5;
\r
1020 fPIDnSigmaAboveElectronLineTPC=5;
\r
1023 fDodEdxSigmaTPCCut = kTRUE;
\r
1024 fPIDnSigmaBelowElectronLineTPC=-4;
\r
1025 fPIDnSigmaAboveElectronLineTPC=5;
\r
1028 fDodEdxSigmaTPCCut = kTRUE;
\r
1029 fPIDnSigmaBelowElectronLineTPC=-3;
\r
1030 fPIDnSigmaAboveElectronLineTPC=5;
\r
1033 fDodEdxSigmaTPCCut = kTRUE;
\r
1034 fPIDnSigmaBelowElectronLineTPC=-4;
\r
1035 fPIDnSigmaAboveElectronLineTPC=4;
\r
1038 fDodEdxSigmaTPCCut = kTRUE;
\r
1039 fPIDnSigmaBelowElectronLineTPC=-2.5;
\r
1040 fPIDnSigmaAboveElectronLineTPC=4;
\r
1043 fDodEdxSigmaTPCCut = kTRUE;
\r
1044 fPIDnSigmaBelowElectronLineTPC=-2;
\r
1045 fPIDnSigmaAboveElectronLineTPC=3.5;
\r
1048 cout<<"Warning: TPCdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
\r
1055 ///________________________________________________________________________
\r
1056 Bool_t AliDalitzElectronCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
\r
1059 switch(pidedxSigmaCut){
\r
1061 case 0: fPIDnSigmaAbovePionLineTPC= 0;
\r
1062 fPIDnSigmaAbovePionLineTPCHighPt=-100;
\r
1065 fPIDnSigmaAbovePionLineTPC=3.0; //Update Sep-05-2013 from -10 to 3
\r
1066 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1069 fPIDnSigmaAbovePionLineTPC=2; //Update Sep-09-2013 from -1 to 2
\r
1070 fPIDnSigmaAbovePionLineTPCHighPt=-1; //Update Sep-09-2013 from -10 to -1
\r
1073 fPIDnSigmaAbovePionLineTPC=2; //Update Sep-09-2013 from 0 to 2
\r
1074 fPIDnSigmaAbovePionLineTPCHighPt=0; //Update Sep-09-2013 from -10 to 0
\r
1077 fPIDnSigmaAbovePionLineTPC=1;
\r
1078 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1081 fPIDnSigmaAbovePionLineTPC=2.;
\r
1082 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1085 fPIDnSigmaAbovePionLineTPC=2.5;
\r
1086 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1089 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
1090 fPIDnSigmaAbovePionLineTPCHighPt = 2.0;
\r
1093 fPIDnSigmaAbovePionLineTPC = 1.5; // Updated May-16-2013 from 3.5 and -10 to +1.5, +1
\r
1094 fPIDnSigmaAbovePionLineTPCHighPt = 1.0;
\r
1097 fPIDnSigmaAbovePionLineTPC=1.5;
\r
1098 fPIDnSigmaAbovePionLineTPCHighPt=-1.0;
\r
1101 cout<<"Warning: pidedxSigmaCut not defined "<<pidedxSigmaCut<<endl;
\r
1107 ///________________________________________________________________________
\r
1108 Bool_t AliDalitzElectronCuts::SetMinMomPiondEdxTPCCut(Int_t piMomdedxSigmaCut)
\r
1110 switch(piMomdedxSigmaCut){
\r
1112 case 0: fPIDMinPnSigmaAbovePionLineTPC=0.;
\r
1114 case 1: // 50.0 GeV
\r
1115 fPIDMinPnSigmaAbovePionLineTPC=50.;
\r
1117 case 2: // 20.0 GeV
\r
1118 fPIDMinPnSigmaAbovePionLineTPC=20.;
\r
1120 case 3: // 1.5 GeV
\r
1121 fPIDMinPnSigmaAbovePionLineTPC=1.5;
\r
1124 fPIDMinPnSigmaAbovePionLineTPC=1.;
\r
1126 case 5: // 0.5 GeV
\r
1127 fPIDMinPnSigmaAbovePionLineTPC=0.5;
\r
1129 case 6: // 0.4 GeV
\r
1130 fPIDMinPnSigmaAbovePionLineTPC=0.4;
\r
1132 case 7: // 0.3 GeV
\r
1133 fPIDMinPnSigmaAbovePionLineTPC=0.3;
\r
1135 case 8: // 0.25 GeV
\r
1136 fPIDMinPnSigmaAbovePionLineTPC=0.25;
\r
1139 cout<<"Warning: piMomdedxSigmaCut not defined "<<piMomdedxSigmaCut<<endl;
\r
1144 ///________________________________________________________________________
\r
1145 Bool_t AliDalitzElectronCuts::SetITSClusterCut(Int_t clsITSCut){
\r
1148 if( !fesdTrackCuts ) {
\r
1150 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
\r
1154 switch(clsITSCut){
\r
1156 case 0: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
\r
1158 case 1: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
\r
1159 break; //1 hit first layer of SPD
\r
1160 case 2: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1161 break; //1 hit in any layer of SPD
\r
1162 case 3: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
\r
1163 fesdTrackCuts->SetMinNClustersITS(4);
\r
1164 // 4 hits in total in the ITS. At least 1 hit in the first layer of SPD
\r
1166 case 4: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1167 fesdTrackCuts->SetMinNClustersITS(3);
\r
1168 // 3 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1170 case 5: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1171 fesdTrackCuts->SetMinNClustersITS(4);
\r
1172 // 4 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1174 case 6: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1175 fesdTrackCuts->SetMinNClustersITS(5);
\r
1176 // 5 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1179 cout<<"Warning: clsITSCut not defined "<<clsITSCut<<endl;
\r
1186 ///________________________________________________________________________
\r
1187 Bool_t AliDalitzElectronCuts::SetTPCClusterCut(Int_t clsTPCCut)
\r
1189 switch(clsTPCCut){
\r
1192 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1196 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1200 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1204 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1206 case 4: // 0% of findable clusters
\r
1208 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1209 fMinClsTPCToF= 0.0;
\r
1210 fUseCorrectedTPCClsInfo=0;
\r
1212 case 5: // 35% of findable clusters
\r
1214 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1215 fMinClsTPCToF= 0.35;
\r
1216 fUseCorrectedTPCClsInfo=0;
\r
1218 case 6: // 60% of findable clusters
\r
1220 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1221 fMinClsTPCToF= 0.6;
\r
1222 fUseCorrectedTPCClsInfo=0;
\r
1224 case 7: // 70% of findable clusters
\r
1226 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1227 fMinClsTPCToF= 0.7;
\r
1228 fUseCorrectedTPCClsInfo=0;
\r
1230 case 8: fMinClsTPC = 0;
\r
1231 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1232 fMinClsTPCToF= 0.35;
\r
1233 fUseCorrectedTPCClsInfo=0;
\r
1235 case 9: // 35% of findable clusters
\r
1237 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1238 fMinClsTPCToF= 0.35;
\r
1239 fUseCorrectedTPCClsInfo=1;
\r
1243 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
\r
1249 ///________________________________________________________________________
\r
1250 Bool_t AliDalitzElectronCuts::SetEtaCut(Int_t etaCut)
\r
1256 fDoEtaCut = kFALSE;
\r
1260 fDoEtaCut = kTRUE;
\r
1264 fDoEtaCut = kTRUE;
\r
1268 fDoEtaCut = kTRUE;
\r
1272 fDoEtaCut = kTRUE;
\r
1276 fDoEtaCut = kTRUE;
\r
1279 fEtaCut = 0.6; //changed from 0.4 to 0.6 2013.06.10
\r
1280 fDoEtaCut = kTRUE;
\r
1283 fEtaCut = 0.5; //changed from 0.3 to 0.5 2013.06.10
\r
1284 fDoEtaCut = kTRUE;
\r
1286 case 8: fEtaCut = 0.4;
\r
1287 fDoEtaCut = kTRUE;
\r
1290 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
\r
1296 ///________________________________________________________________________
\r
1297 Bool_t AliDalitzElectronCuts::SetPtCut(Int_t ptCut)
\r
1300 //0.1GeV, 0.125 GeV, 0.15 GeV
\r
1304 case 0: fPtCut = 0.075;
\r
1309 case 2: // 0.125 GeV
\r
1312 case 3: // 0.15 GeV
\r
1316 cout<<"Warning: PtCut not defined "<<ptCut<<endl;
\r
1323 ///________________________________________________________________________
\r
1324 Bool_t AliDalitzElectronCuts::SetDCACut(Int_t dcaCut)
\r
1328 if( !fesdTrackCuts ) {
\r
1330 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
\r
1338 fesdTrackCuts->SetMaxDCAToVertexZ(1000);
\r
1339 fesdTrackCuts->SetMaxDCAToVertexXY(1000);
\r
1340 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1344 fesdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
\r
1345 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1348 case 2: fesdTrackCuts->SetMaxDCAToVertexZ(2);
\r
1349 fesdTrackCuts->SetMaxDCAToVertexXY(1);
\r
1350 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1354 cout<<"Warning: dcaCut not defined "<<dcaCut<<endl;
\r
1363 ///________________________________________________________________________
\r
1364 Bool_t AliDalitzElectronCuts::SetMaxMomPiondEdxTPCCut(Int_t piMaxMomdedxSigmaCut)
\r
1366 switch(piMaxMomdedxSigmaCut){
\r
1369 fPIDMaxPnSigmaAbovePionLineTPC=0.;
\r
1371 case 1: // 100. GeV
\r
1372 fPIDMaxPnSigmaAbovePionLineTPC=100.;
\r
1375 fPIDMaxPnSigmaAbovePionLineTPC=5.;
\r
1378 fPIDMaxPnSigmaAbovePionLineTPC=4.;
\r
1380 case 4: // 3.5 GeV
\r
1381 fPIDMaxPnSigmaAbovePionLineTPC=3.5;
\r
1384 fPIDMaxPnSigmaAbovePionLineTPC=3.;
\r
1387 cout<<"Warning: piMaxMomdedxSigmaCut not defined "<<piMaxMomdedxSigmaCut<<endl;
\r
1393 ///________________________________________________________________________
\r
1394 Bool_t AliDalitzElectronCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
\r
1396 switch(LowPRejectionSigmaCut){
\r
1398 fDoKaonRejectionLowP=kFALSE;
\r
1399 fDoProtonRejectionLowP=kFALSE;
\r
1400 fDoPionRejectionLowP=kFALSE;
\r
1401 fPIDnSigmaAtLowPAroundKaonLine=0;
\r
1402 fPIDnSigmaAtLowPAroundProtonLine=0;
\r
1403 fPIDnSigmaAtLowPAroundPionLine=0;
\r
1404 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1407 fDoKaonRejectionLowP=kTRUE;
\r
1408 fDoProtonRejectionLowP=kTRUE;
\r
1409 fDoPionRejectionLowP=kTRUE;
\r
1410 fPIDnSigmaAtLowPAroundKaonLine=0.5;
\r
1411 fPIDnSigmaAtLowPAroundProtonLine=0.5;
\r
1412 fPIDnSigmaAtLowPAroundPionLine=0.5;
\r
1413 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1416 fDoKaonRejectionLowP=kTRUE;
\r
1417 fDoProtonRejectionLowP=kTRUE;
\r
1418 fDoPionRejectionLowP=kTRUE;
\r
1419 fPIDnSigmaAtLowPAroundKaonLine=1.0;
\r
1420 fPIDnSigmaAtLowPAroundProtonLine=1.0;
\r
1421 fPIDnSigmaAtLowPAroundPionLine=1.0;
\r
1422 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1425 fDoKaonRejectionLowP=kTRUE;
\r
1426 fDoProtonRejectionLowP=kTRUE;
\r
1427 fDoPionRejectionLowP=kTRUE;
\r
1428 fPIDnSigmaAtLowPAroundKaonLine=1.5;
\r
1429 fPIDnSigmaAtLowPAroundProtonLine=1.5;
\r
1430 fPIDnSigmaAtLowPAroundPionLine=1.5;
\r
1431 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1434 fDoKaonRejectionLowP=kTRUE;
\r
1435 fDoProtonRejectionLowP=kTRUE;
\r
1436 fDoPionRejectionLowP=kTRUE;
\r
1437 fPIDnSigmaAtLowPAroundKaonLine=2.0;
\r
1438 fPIDnSigmaAtLowPAroundProtonLine=2.0;
\r
1439 fPIDnSigmaAtLowPAroundPionLine=2.0;
\r
1440 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1443 fDoKaonRejectionLowP=kTRUE;
\r
1444 fDoProtonRejectionLowP=kTRUE;
\r
1445 fDoPionRejectionLowP=kTRUE;
\r
1446 fPIDnSigmaAtLowPAroundKaonLine=2.0;
\r
1447 fPIDnSigmaAtLowPAroundProtonLine=2.0;
\r
1448 fPIDnSigmaAtLowPAroundPionLine=2.5;
\r
1449 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1452 fDoKaonRejectionLowP=kTRUE;
\r
1453 fDoProtonRejectionLowP=kTRUE;
\r
1454 fDoPionRejectionLowP=kTRUE;
\r
1455 fPIDnSigmaAtLowPAroundKaonLine=0.;
\r
1456 fPIDnSigmaAtLowPAroundProtonLine=0.;
\r
1457 fPIDnSigmaAtLowPAroundPionLine=2.;
\r
1458 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1461 fDoKaonRejectionLowP=kFALSE;
\r
1462 fDoProtonRejectionLowP=kFALSE;
\r
1463 fDoPionRejectionLowP=kTRUE;
\r
1464 fPIDnSigmaAtLowPAroundKaonLine=0.0;
\r
1465 fPIDnSigmaAtLowPAroundProtonLine=0.0;
\r
1466 fPIDnSigmaAtLowPAroundPionLine=1.0;
\r
1467 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1470 fDoKaonRejectionLowP=kFALSE;
\r
1471 fDoProtonRejectionLowP=kFALSE;
\r
1472 fDoPionRejectionLowP=kTRUE;
\r
1473 fPIDnSigmaAtLowPAroundKaonLine=0.;
\r
1474 fPIDnSigmaAtLowPAroundProtonLine=0.;
\r
1475 fPIDnSigmaAtLowPAroundPionLine=0.5;
\r
1476 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1479 cout<<"Warning: LowPRejectionSigmaCut not defined "<<LowPRejectionSigmaCut<<endl;
\r
1485 ///________________________________________________________________________
\r
1486 Bool_t AliDalitzElectronCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
\r
1488 switch(TOFelectronPID){ // RRnewTOF start //////////////////////////////////////////////////////////////////////////
\r
1490 fRequireTOF = kFALSE;
\r
1491 fUseTOFpid = kFALSE;
\r
1492 fTofPIDnSigmaBelowElectronLine=-100;
\r
1493 fTofPIDnSigmaAboveElectronLine=100;
\r
1496 fRequireTOF = kFALSE;
\r
1497 fUseTOFpid = kTRUE;
\r
1498 fTofPIDnSigmaBelowElectronLine=-7;
\r
1499 fTofPIDnSigmaAboveElectronLine=7;
\r
1502 fRequireTOF = kFALSE;
\r
1503 fUseTOFpid = kTRUE;
\r
1504 fTofPIDnSigmaBelowElectronLine=-5;
\r
1505 fTofPIDnSigmaAboveElectronLine=5;
\r
1508 fRequireTOF = kFALSE;
\r
1509 fUseTOFpid = kTRUE;
\r
1510 fTofPIDnSigmaBelowElectronLine=-3;
\r
1511 fTofPIDnSigmaAboveElectronLine=5;
\r
1514 fRequireTOF = kFALSE;
\r
1515 fUseTOFpid = kTRUE;
\r
1516 fTofPIDnSigmaBelowElectronLine=-2;
\r
1517 fTofPIDnSigmaAboveElectronLine=3;
\r
1519 case 5: // -3, 3 TOF mandatory
\r
1520 fRequireTOF = kTRUE;
\r
1521 fUseTOFpid = kTRUE;
\r
1522 fTofPIDnSigmaBelowElectronLine= -3;
\r
1523 fTofPIDnSigmaAboveElectronLine= 3;
\r
1526 cout<<"Warning: TOFElectronCut not defined "<<TOFelectronPID<<endl;
\r
1528 } //////////////////////// RRnewTOF end //////////////////////////////////////////////////////////////////////////
\r
1531 ///_______________________________________________________________________________
\r
1533 Bool_t AliDalitzElectronCuts::SetPsiPairCut(Int_t psiCut) {
\r
1538 fDoPsiPairCut = kFALSE;
\r
1539 fPsiPairCut = 10000.; //
\r
1540 fDeltaPhiCutMin = -1000.;
\r
1541 fDeltaPhiCutMax = 1000.;
\r
1545 fDoPsiPairCut = kTRUE;
\r
1546 fPsiPairCut = 0.45; // Standard
\r
1547 fDeltaPhiCutMin = 0.0;
\r
1548 fDeltaPhiCutMax = 0.12;
\r
1551 fDoPsiPairCut = kTRUE;
\r
1552 fPsiPairCut = 0.60;
\r
1553 fDeltaPhiCutMin = 0.0;
\r
1554 fDeltaPhiCutMax = 0.12;
\r
1557 fDoPsiPairCut = kTRUE;
\r
1558 fPsiPairCut = 0.52;
\r
1559 fDeltaPhiCutMin = 0.0;
\r
1560 fDeltaPhiCutMax = 0.12;
\r
1564 cout<<"Warning: PsiPairCut not defined "<<fPsiPairCut<<endl;
\r
1571 ///_______________________________________________________________________________
\r
1572 Bool_t AliDalitzElectronCuts::SetRejectSharedElecGamma(Int_t RCut) {
\r
1577 fDoRejectSharedElecGamma = kFALSE;
\r
1578 fRadiusCut = 10000; //
\r
1581 fDoRejectSharedElecGamma = kTRUE;
\r
1582 fRadiusCut = 2.0; // cm
\r
1585 fDoRejectSharedElecGamma = kTRUE;
\r
1586 fRadiusCut = 3.0; // Standard
\r
1589 fDoRejectSharedElecGamma = kTRUE;
\r
1590 fRadiusCut = 4.0; //
\r
1593 fDoRejectSharedElecGamma = kTRUE;
\r
1594 fRadiusCut = 5.0; //
\r
1597 fDoRejectSharedElecGamma = kTRUE;
\r
1598 fRadiusCut = 10.0; //
\r
1601 fDoRejectSharedElecGamma = kTRUE;
\r
1602 fRadiusCut = 15.0; //
\r
1605 cout<<"Warning: PsiPairCut not defined "<<fDoRejectSharedElecGamma<<endl;
\r
1611 ///__________________________________________________________________________
\r
1612 Bool_t AliDalitzElectronCuts::SetBackgroundScheme(Int_t BackgroundScheme){
\r
1615 switch(BackgroundScheme){
\r
1617 case 0: //Rotation
\r
1619 fUseTrackMultiplicityForBG = kFALSE;
\r
1621 case 1: // mixed event with V0 multiplicity
\r
1623 fUseTrackMultiplicityForBG = kFALSE;
\r
1625 case 2: // mixed event with track multiplicity
\r
1626 fUseTrackMultiplicityForBG = kTRUE;
\r
1629 case 3: //Rotation
\r
1630 fUseTrackMultiplicityForBG = kFALSE;
\r
1633 case 4: //Rotation
\r
1634 fUseTrackMultiplicityForBG = kTRUE;
\r
1637 case 5: fUseTrackMultiplicityForBG = kTRUE;
\r
1642 cout<<"Warning: BackgroundScheme not defined "<<BackgroundScheme<<endl;
\r
1648 ///________________________________________________________________________
\r
1649 Bool_t AliDalitzElectronCuts::SetNumberOfRotations(Int_t NumberOfRotations)
\r
1651 switch(NumberOfRotations){
\r
1653 fnumberOfRotationEventsForBG = 5;
\r
1656 fnumberOfRotationEventsForBG = 10;
\r
1659 fnumberOfRotationEventsForBG = 15;
\r
1662 fnumberOfRotationEventsForBG = 20;
\r
1665 fnumberOfRotationEventsForBG = 2;
\r
1668 fnumberOfRotationEventsForBG = 50;
\r
1671 fnumberOfRotationEventsForBG = 80;
\r
1674 fnumberOfRotationEventsForBG = 100;
\r
1677 cout<<"Warning: NumberOfRotations not defined "<<NumberOfRotations<<endl;
\r
1685 ///________________________________________________________________________
\r
1686 Bool_t AliDalitzElectronCuts::SetDoWeights(Int_t opc)
\r
1690 case 0: fDoWeights = kFALSE;
\r
1692 case 1: fDoWeights = kTRUE;
\r
1695 cout<<"Warning: Weights option not defined "<<opc<<endl;
\r
1700 ///________________________________________________________________________
\r
1701 Bool_t AliDalitzElectronCuts::SetMassCut(Int_t massCut)
\r
1707 fMassCutPtMin = -999.; //GeV
\r
1708 fMassCutLowPt = 999.; //GeV/c^2
\r
1709 fMassCutHighPt = 999.; //GeV/c^2
\r
1710 fDoMassCut = kFALSE;
\r
1713 //fMassCut = 0.135; //GeV/c^2
\r
1714 fMassCutPtMin = -999.; //GeV
\r
1715 fMassCutLowPt = 0.135; //GeV/c^2
\r
1716 fMassCutHighPt = 0.135; //GeV/c^2
\r
1717 fDoMassCut = kTRUE;
\r
1720 //fMassCut = 0.100; //GeV/c^2
\r
1721 fMassCutPtMin = -999.; //GeV
\r
1722 fMassCutLowPt = 0.100; //GeV/c^2
\r
1723 fMassCutHighPt = 0.100; //GeV/c^2
\r
1724 fDoMassCut = kTRUE;
\r
1727 //fMassCut = 0.075; //GeV/c^2
\r
1728 fMassCutPtMin = -999.; //GeV
\r
1729 fMassCutLowPt = 0.075; //GeV/c^2
\r
1730 fMassCutHighPt = 0.075; //GeV/c^2
\r
1731 fDoMassCut = kTRUE;
\r
1734 //fMassCut = 0.050; //GeV/c^2
\r
1735 fMassCutPtMin = -999.; //GeV
\r
1736 fMassCutLowPt = 0.050; //GeV/c^2
\r
1737 fMassCutHighPt = 0.050; //GeV/c^2
\r
1738 fDoMassCut = kTRUE;
\r
1742 fMassCutPtMin = -999.; //GeV
\r
1743 fMassCutLowPt = 0.035; //GeV/c^2
\r
1744 fMassCutHighPt = 0.035; //GeV/c^2
\r
1745 fDoMassCut = kTRUE;
\r
1748 fMassCutPtMin = -999.; //GeV
\r
1749 fMassCutLowPt = 0.015; //GeV/c^2
\r
1750 fMassCutHighPt = 0.015; //GeV/c^2
\r
1751 fDoMassCut = kTRUE;
\r
1753 case 7: fMassCutPtMin = 1.0; //GeV
\r
1754 fMassCutLowPt = 0.015; //GeV/c^2
\r
1755 fMassCutHighPt = 0.035; //GeV/c^2
\r
1756 fDoMassCut = kTRUE;
\r
1759 cout<<"Warning: MassCut not defined "<<massCut<<endl;
\r
1767 ///________________________________________________________________________
\r
1768 TString AliDalitzElectronCuts::GetCutNumber(){
\r
1769 // returns TString with current cut number
\r
1770 TString a(kNCuts);
\r
1771 for(Int_t ii=0;ii<kNCuts;ii++){
\r
1772 a.Append(Form("%d",fCuts[ii]));
\r
1778 ///________________________________________________________________________
\r
1779 AliDalitzElectronCuts* AliDalitzElectronCuts::GetStandardCuts2010PbPb(){
\r
1780 //Create and return standard 2010 PbPb cuts
\r
1781 AliDalitzElectronCuts *cuts=new AliDalitzElectronCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
\r
1782 if(!cuts->InitializeCutsFromCutString("9069640364102")){
\r
1783 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
\r
1787 ///________________________________________________________________________
\r
1788 AliDalitzElectronCuts* AliDalitzElectronCuts::GetStandardCuts2010pp(){
\r
1789 //Create and return standard 2010 PbPb cuts
\r
1790 AliDalitzElectronCuts *cuts=new AliDalitzElectronCuts("StandardCuts2010pp","StandardCuts2010pp");
\r
1792 if(!cuts->InitializeCutsFromCutString("9069640364102")){
\r
1793 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
\r