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
435 if( clsToF < fMinClsTPCToF){
\r
443 ///________________________________________________________________________
\r
444 Bool_t AliDalitzElectronCuts::dEdxCuts(AliVTrack *fCurrentTrack){
\r
446 // Electron Identification Cuts for Photon reconstruction
\r
448 if(!fPIDResponse){ InitPIDResponse(); }// Try to reinitialize PID Response
\r
449 if(!fPIDResponse){ AliError("No PID Response"); return kFALSE;}// if still missing fatal error
\r
453 //cout<<"dEdxCuts: //////////////////////////////////////////////////////////////////////////"<<endl;
\r
459 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
460 if(hITSdEdxbefore)hITSdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
\r
461 if(hTPCdEdxbefore)hTPCdEdxbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
\r
462 if(hTPCdEdxSignalbefore)hTPCdEdxSignalbefore->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
\r
468 if( fDodEdxSigmaITSCut == kTRUE ){
\r
471 if( fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLineITS ||
\r
472 fPIDResponse->NumberOfSigmasITS(fCurrentTrack,AliPID::kElectron)> fPIDnSigmaAboveElectronLineITS ){
\r
474 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
480 if(hITSdEdxafter)hITSdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasITS(fCurrentTrack, AliPID::kElectron));
\r
486 if(fDodEdxSigmaTPCCut == kTRUE){
\r
489 // TPC Electron Line
\r
490 if( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaBelowElectronLineTPC ||
\r
491 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaAboveElectronLineTPC){
\r
493 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
499 if( fCurrentTrack->P()>fPIDMinPnSigmaAbovePionLineTPC && fCurrentTrack->P()<fPIDMaxPnSigmaAbovePionLineTPC ){
\r
500 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLineTPC &&
\r
501 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLineTPC &&
\r
502 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineTPC){
\r
504 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
510 // High Pt Pion rej
\r
511 if( fCurrentTrack->P()>fPIDMaxPnSigmaAbovePionLineTPC ){
\r
512 if(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)>fPIDnSigmaBelowElectronLineTPC &&
\r
513 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kElectron)<fPIDnSigmaAboveElectronLineTPC&&
\r
514 fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)<fPIDnSigmaAbovePionLineTPCHighPt){
\r
516 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
524 else{ cutIndex+=3; }
\r
527 if( fDoKaonRejectionLowP == kTRUE ){
\r
529 if( fCurrentTrack->P() < fPIDMinPKaonRejectionLowP ){
\r
531 if( TMath::Abs(fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kKaon))<fPIDnSigmaAtLowPAroundKaonLine){
\r
533 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
541 if( fDoProtonRejectionLowP == kTRUE ){
\r
543 if( fCurrentTrack->P() < fPIDMinPProtonRejectionLowP ){
\r
544 if( TMath::Abs( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kProton))<fPIDnSigmaAtLowPAroundProtonLine){
\r
546 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
553 if(fDoPionRejectionLowP == kTRUE){
\r
554 if( fCurrentTrack->P() < fPIDMinPPionRejectionLowP ){
\r
555 if( TMath::Abs( fPIDResponse->NumberOfSigmasTPC(fCurrentTrack,AliPID::kPion)) < fPIDnSigmaAtLowPAroundPionLine ){
\r
557 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
565 if( ( fCurrentTrack->GetStatus() & AliESDtrack::kTOFpid ) && ( !( fCurrentTrack->GetStatus() & AliESDtrack::kTOFmismatch) ) ){
\r
566 if(hTOFbefore) hTOFbefore->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
\r
568 if(fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)>fTofPIDnSigmaAboveElectronLine ||
\r
569 fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron)<fTofPIDnSigmaBelowElectronLine ){
\r
570 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
574 if(hTOFafter)hTOFafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTOF(fCurrentTrack, AliPID::kElectron));
\r
576 else if ( fRequireTOF == kTRUE ) {
\r
578 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
583 if(hdEdxCuts)hdEdxCuts->Fill(cutIndex);
\r
584 if(hTPCdEdxafter)hTPCdEdxafter->Fill(fCurrentTrack->P(),fPIDResponse->NumberOfSigmasTPC(fCurrentTrack, AliPID::kElectron));
\r
585 if(hTPCdEdxSignalafter)hTPCdEdxSignalafter->Fill(fCurrentTrack->P(),TMath::Abs(fCurrentTrack->GetTPCsignal()));
\r
589 ///________________________________________________________________________
\r
592 AliVTrack *AliDalitzElectronCuts::GetTrack(AliVEvent * event, Int_t label){
\r
593 //Returns pointer to the track with given ESD label
\r
594 //(Important for AOD implementation, since Track array in AOD data is different
\r
595 //from ESD array, but ESD tracklabels are stored in AOD Tracks)
\r
597 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(event);
\r
599 if(label > event->GetNumberOfTracks() ) return NULL;
\r
600 AliESDtrack * track = esdEvent->GetTrack(label);
\r
604 for(Int_t ii=0; ii<event->GetNumberOfTracks(); ii++) {
\r
605 AliVTrack * track = dynamic_cast<AliVTrack*>(event->GetTrack(ii));
\r
608 if(track->GetID() == label) {
\r
615 cout << "track not found " << label << " " << event->GetNumberOfTracks() << endl;
\r
618 ///________________________________________________________________________
\r
619 Bool_t AliDalitzElectronCuts::RejectSharedElecGamma(TList *photons, Int_t indexEle){
\r
622 for(Int_t i = 0;i<photons->GetEntries();i++){
\r
624 AliAODConversionPhoton *photonComp = (AliAODConversionPhoton*) photons->At(i);
\r
626 Int_t posLabel = photonComp->GetTrackLabelPositive();
\r
627 Int_t negLabel = photonComp->GetTrackLabelNegative();
\r
629 if( (photonComp->GetConversionRadius() < fRadiusCut) && (posLabel == indexEle || negLabel == indexEle) ){
\r
636 Bool_t AliDalitzElectronCuts::MassCut(Double_t pi0CandidatePt , Double_t vphotonCandidateMass){
\r
638 if( pi0CandidatePt < fMassCutPtMin ){
\r
640 if( vphotonCandidateMass < fMassCutLowPt ){
\r
647 if( vphotonCandidateMass < fMassCutHighPt ){
\r
657 Double_t AliDalitzElectronCuts::GetNFindableClustersTPC(AliESDtrack* lTrack){
\r
663 if ( !fUseCorrectedTPCClsInfo ){
\r
664 if(lTrack->GetTPCNclsF()!=0){
\r
666 clsToF = (Double_t)lTrack->GetNcls(1)/(Double_t)lTrack->GetTPCNclsF();
\r
667 }// Ncluster/Nfindablecluster
\r
671 //clsToF = lTrack->GetTPCClusterInfo(2,0,GetFirstTPCRow(photon->GetConversionRadius()));
\r
672 clsToF = lTrack->GetTPCClusterInfo(2,0); //NOTE ask friederike
\r
681 Double_t AliDalitzElectronCuts::GetPsiPair( const AliESDtrack *trackPos, const AliESDtrack *trackNeg )
\r
684 // This angle is a measure for the contribution of the opening in polar
\r
685 // direction ??0 to the opening angle ?? Pair
\r
687 // Ref. Measurement of photons via conversion pairs with the PHENIX experiment at RHIC
\r
688 // Master Thesis. Thorsten Dahms. 2005
\r
689 // https://twiki.cern.ch/twiki/pub/ALICE/GammaPhysicsPublications/tdahms_thesis.pdf
\r
691 Double_t momPos[3];
\r
692 Double_t momNeg[3];
\r
693 if( trackPos->GetConstrainedPxPyPz(momPos) == 0 ) trackPos->GetPxPyPz( momPos );
\r
694 if( trackNeg->GetConstrainedPxPyPz(momNeg) == 0 ) trackNeg->GetPxPyPz( momNeg );
\r
696 TVector3 posDaughter;
\r
697 TVector3 negDaughter;
\r
699 posDaughter.SetXYZ( momPos[0], momPos[1], momPos[2] );
\r
700 negDaughter.SetXYZ( momNeg[0], momNeg[1], momNeg[2] );
\r
702 Double_t deltaTheta = negDaughter.Theta() - posDaughter.Theta();
\r
703 Double_t openingAngle = posDaughter.Angle( negDaughter ); //TMath::ACos( posDaughter.Dot(negDaughter)/(negDaughter.Mag()*posDaughter.Mag()) );
\r
705 if( openingAngle < 1e-20 ) return 0.;
\r
707 Double_t psiAngle = TMath::ASin( deltaTheta/openingAngle );
\r
712 Bool_t AliDalitzElectronCuts::IsFromGammaConversion( Double_t psiPair, Double_t deltaPhi )
\r
715 // Returns true if it is a gamma conversion according to psi pair value
\r
717 return ( (deltaPhi > fDeltaPhiCutMin && deltaPhi < fDeltaPhiCutMax) &&
\r
718 TMath::Abs(psiPair) < ( fPsiPairCut - fPsiPairCut/fDeltaPhiCutMax * deltaPhi ) );
\r
721 ///________________________________________________________________________
\r
722 Bool_t AliDalitzElectronCuts::UpdateCutString(cutIds cutID, Int_t value) {
\r
723 ///Update the cut string (if it has been created yet)
\r
725 if(fCutString && fCutString->GetString().Length() == kNCuts) {
\r
726 // cout << "Updating cut id in spot number " << cutID << " to " << value << endl;
\r
727 fCutString->SetString(GetCutNumber());
\r
729 // cout << "fCutString not yet initialized, will not be updated" << endl;
\r
732 // cout << fCutString->GetString().Data() << endl;
\r
736 ///________________________________________________________________________
\r
737 Bool_t AliDalitzElectronCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
\r
738 // Initialize Cuts from a given Cut string
\r
740 // out<<"Set Cut Number: "<<analysisCutSelection.Data()<<endl;
\r
741 AliInfo(Form("Set ElectronCuts Number: %s",analysisCutSelection.Data()));
\r
743 if(analysisCutSelection.Length()!=kNCuts) {
\r
744 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
\r
747 if(!analysisCutSelection.IsDigit()){
\r
748 AliError("Cut selection contains characters");
\r
752 const char *cutSelection = analysisCutSelection.Data();
\r
753 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
\r
754 for(Int_t ii=0;ii<kNCuts;ii++){
\r
760 AliError("Analysis Cut Selection does not start with 9");
\r
765 // Set Individual Cuts
\r
766 for(Int_t ii=0;ii<kNCuts;ii++){
\r
767 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
\r
774 ///________________________________________________________________________
\r
775 Bool_t AliDalitzElectronCuts::SetCut(cutIds cutID, const Int_t value) {
\r
776 ///Set individual cut ID
\r
778 //cout << "Updating cut " << fgkCutNames[cutID] << " (" << cutID << ") to " << value << endl;
\r
782 fCuts[kgoodId] = value;
\r
784 cout << "Error:: First value of cut string is wrong, aborting!!" << endl;
\r
790 case kededxSigmaITSCut:
\r
791 if( SetITSdEdxCutElectronLine(value)) { //NOTE SetITSdEdxCutElectronLine: To be implemented
\r
792 fCuts[kededxSigmaITSCut] = value;
\r
793 UpdateCutString(cutID, value);
\r
795 } else return kFALSE;
\r
797 case kededxSigmaTPCCut:
\r
798 if( SetTPCdEdxCutElectronLine(value)) { //NOTE SetITSdEdxCutElectronLine: To be implemented
\r
799 fCuts[kededxSigmaTPCCut] = value;
\r
800 UpdateCutString(cutID, value);
\r
802 } else return kFALSE;
\r
804 case kpidedxSigmaTPCCut:
\r
805 if( SetTPCdEdxCutPionLine(value)) { //NOTE SetITSdEdxCutPionLine: To be implemented
\r
806 fCuts[kpidedxSigmaTPCCut] = value;
\r
807 UpdateCutString(cutID, value);
\r
809 } else return kFALSE;
\r
811 case kpiMinMomdedxSigmaTPCCut:
\r
812 if( SetMinMomPiondEdxTPCCut(value)) {
\r
813 fCuts[kpiMinMomdedxSigmaTPCCut] = value;
\r
814 UpdateCutString(cutID, value);
\r
816 } else return kFALSE;
\r
818 case kpiMaxMomdedxSigmaTPCCut:
\r
819 if( SetMaxMomPiondEdxTPCCut(value)) {
\r
820 fCuts[kpiMaxMomdedxSigmaTPCCut] = value;
\r
821 UpdateCutString(cutID, value);
\r
823 } else return kFALSE;
\r
825 case kLowPRejectionSigmaCut:
\r
826 if( SetLowPRejectionCuts(value) ) {
\r
827 fCuts[kLowPRejectionSigmaCut] = value;
\r
828 UpdateCutString(cutID, value);
\r
830 } else return kFALSE;
\r
833 case kTOFelectronPID:
\r
834 if( SetTOFElectronPIDCut(value)) {
\r
835 fCuts[kTOFelectronPID] = value;
\r
836 UpdateCutString(cutID, value);
\r
838 } else return kFALSE;
\r
840 if( SetITSClusterCut(value) ) {
\r
841 fCuts[kclsITSCut] = value;
\r
842 UpdateCutString(cutID, value);
\r
844 } else return kFALSE;
\r
846 if( SetTPCClusterCut(value)) {
\r
847 fCuts[kclsTPCCut] = value;
\r
848 UpdateCutString(cutID, value);
\r
850 } else return kFALSE;
\r
853 if( SetEtaCut(value)) {
\r
854 fCuts[ketaCut] = value;
\r
855 UpdateCutString(cutID, value);
\r
857 } else return kFALSE;
\r
859 if( SetPtCut(value)) {
\r
860 fCuts[kptCut] = value;
\r
861 UpdateCutString(cutID, value);
\r
863 } else return kFALSE;
\r
866 if( SetDCACut(value)) {
\r
867 fCuts[kDCACut] = value;
\r
868 UpdateCutString(cutID, value);
\r
870 } else return kFALSE;
\r
874 if( SetPsiPairCut(value)) {
\r
875 fCuts[kPsiPair] = value;
\r
876 UpdateCutString(cutID, value);
\r
878 } else return kFALSE;
\r
880 case kRejectSharedElecGamma:
\r
881 if( SetRejectSharedElecGamma(value)) {
\r
882 fCuts[kRejectSharedElecGamma] = value;
\r
883 UpdateCutString(cutID, value);
\r
885 } else return kFALSE;
\r
887 case kBackgroundScheme:
\r
888 if( SetBackgroundScheme(value)) {
\r
889 fCuts[kBackgroundScheme] = value;
\r
890 UpdateCutString(cutID, value);
\r
892 } else return kFALSE;
\r
894 case kNumberOfRotations:
\r
895 if( SetNumberOfRotations(value)) {
\r
896 fCuts[kNumberOfRotations] = value;
\r
897 UpdateCutString(cutID, value);
\r
899 } else return kFALSE;
\r
902 if( SetMassCut(value)) {
\r
903 fCuts[kmassCut] = value;
\r
904 UpdateCutString(cutID, value);
\r
906 } else return kFALSE;
\r
909 cout << "Error:: Cut id out of range"<< endl;
\r
913 cout << "Error:: Cut id " << cutID << " not recognized "<< endl;
\r
920 ///________________________________________________________________________
\r
922 void AliDalitzElectronCuts::PrintCuts() {
\r
923 // Print out current Cut Selection
\r
924 for(Int_t ic = 0; ic < kNCuts; ic++) {
\r
925 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
\r
930 ///________________________________________________________________________
\r
931 Bool_t AliDalitzElectronCuts::SetITSdEdxCutElectronLine(Int_t ededxSigmaCut)
\r
934 switch(ededxSigmaCut){
\r
937 fDodEdxSigmaITSCut = kFALSE;
\r
938 fPIDnSigmaBelowElectronLineITS=-100;
\r
939 fPIDnSigmaAboveElectronLineITS= 100;
\r
942 fDodEdxSigmaITSCut = kTRUE;
\r
943 fPIDnSigmaBelowElectronLineITS=-10;
\r
944 fPIDnSigmaAboveElectronLineITS=10;
\r
947 fDodEdxSigmaITSCut = kTRUE;
\r
948 fPIDnSigmaBelowElectronLineITS=-6;
\r
949 fPIDnSigmaAboveElectronLineITS=7;
\r
952 fDodEdxSigmaITSCut = kTRUE;
\r
953 fPIDnSigmaBelowElectronLineITS=-5;
\r
954 fPIDnSigmaAboveElectronLineITS=5;
\r
957 fDodEdxSigmaITSCut = kTRUE;
\r
958 fPIDnSigmaBelowElectronLineITS=-4;
\r
959 fPIDnSigmaAboveElectronLineITS=5;
\r
962 fDodEdxSigmaITSCut = kTRUE;
\r
963 fPIDnSigmaBelowElectronLineITS=-3;
\r
964 fPIDnSigmaAboveElectronLineITS=5;
\r
967 fDodEdxSigmaITSCut = kTRUE;
\r
968 fPIDnSigmaBelowElectronLineITS=-4;
\r
969 fPIDnSigmaAboveElectronLineITS=4;
\r
972 fDodEdxSigmaITSCut = kTRUE;
\r
973 fPIDnSigmaBelowElectronLineITS=-2.5;
\r
974 fPIDnSigmaAboveElectronLineITS=4;
\r
977 fDodEdxSigmaITSCut = kTRUE;
\r
978 fPIDnSigmaBelowElectronLineITS=-2;
\r
979 fPIDnSigmaAboveElectronLineITS=3.5;
\r
982 cout<<"Warning: ITSdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
\r
989 ///________________________________________________________________________
\r
990 Bool_t AliDalitzElectronCuts::SetTPCdEdxCutElectronLine(Int_t ededxSigmaCut)
\r
992 switch(ededxSigmaCut){
\r
994 case 0: fDodEdxSigmaTPCCut = kFALSE;
\r
995 fPIDnSigmaBelowElectronLineTPC=-10;
\r
996 fPIDnSigmaAboveElectronLineTPC=10;
\r
999 fDodEdxSigmaTPCCut = kTRUE;
\r
1000 fPIDnSigmaBelowElectronLineTPC=-10;
\r
1001 fPIDnSigmaAboveElectronLineTPC=10;
\r
1004 fDodEdxSigmaTPCCut = kTRUE;
\r
1005 fPIDnSigmaBelowElectronLineTPC=-6;
\r
1006 fPIDnSigmaAboveElectronLineTPC=7;
\r
1009 fDodEdxSigmaTPCCut = kTRUE;
\r
1010 fPIDnSigmaBelowElectronLineTPC=-5;
\r
1011 fPIDnSigmaAboveElectronLineTPC=5;
\r
1014 fDodEdxSigmaTPCCut = kTRUE;
\r
1015 fPIDnSigmaBelowElectronLineTPC=-4;
\r
1016 fPIDnSigmaAboveElectronLineTPC=5;
\r
1019 fDodEdxSigmaTPCCut = kTRUE;
\r
1020 fPIDnSigmaBelowElectronLineTPC=-3;
\r
1021 fPIDnSigmaAboveElectronLineTPC=5;
\r
1024 fDodEdxSigmaTPCCut = kTRUE;
\r
1025 fPIDnSigmaBelowElectronLineTPC=-4;
\r
1026 fPIDnSigmaAboveElectronLineTPC=4;
\r
1029 fDodEdxSigmaTPCCut = kTRUE;
\r
1030 fPIDnSigmaBelowElectronLineTPC=-2.5;
\r
1031 fPIDnSigmaAboveElectronLineTPC=4;
\r
1034 fDodEdxSigmaTPCCut = kTRUE;
\r
1035 fPIDnSigmaBelowElectronLineTPC=-2;
\r
1036 fPIDnSigmaAboveElectronLineTPC=3.5;
\r
1039 cout<<"Warning: TPCdEdxCutElectronLine not defined"<<ededxSigmaCut<<endl;
\r
1046 ///________________________________________________________________________
\r
1047 Bool_t AliDalitzElectronCuts::SetTPCdEdxCutPionLine(Int_t pidedxSigmaCut)
\r
1050 switch(pidedxSigmaCut){
\r
1052 case 0: fPIDnSigmaAbovePionLineTPC= 0;
\r
1053 fPIDnSigmaAbovePionLineTPCHighPt=-100;
\r
1056 fPIDnSigmaAbovePionLineTPC=3.0; //Update Sep-05-2013 from -10 to 3
\r
1057 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1060 fPIDnSigmaAbovePionLineTPC=2; //Update Sep-09-2013 from -1 to 2
\r
1061 fPIDnSigmaAbovePionLineTPCHighPt=-1; //Update Sep-09-2013 from -10 to -1
\r
1064 fPIDnSigmaAbovePionLineTPC=2; //Update Sep-09-2013 from 0 to 2
\r
1065 fPIDnSigmaAbovePionLineTPCHighPt=0; //Update Sep-09-2013 from -10 to 0
\r
1068 fPIDnSigmaAbovePionLineTPC=1;
\r
1069 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1072 fPIDnSigmaAbovePionLineTPC=2.;
\r
1073 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1076 fPIDnSigmaAbovePionLineTPC=2.5;
\r
1077 fPIDnSigmaAbovePionLineTPCHighPt=-10;
\r
1080 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
1081 fPIDnSigmaAbovePionLineTPCHighPt = 2.0;
\r
1084 fPIDnSigmaAbovePionLineTPC = 1.5; // Updated May-16-2013 from 3.5 and -10 to +1.5, +1
\r
1085 fPIDnSigmaAbovePionLineTPCHighPt = 1.0;
\r
1088 fPIDnSigmaAbovePionLineTPC=1.5;
\r
1089 fPIDnSigmaAbovePionLineTPCHighPt=-1.0;
\r
1092 cout<<"Warning: pidedxSigmaCut not defined "<<pidedxSigmaCut<<endl;
\r
1098 ///________________________________________________________________________
\r
1099 Bool_t AliDalitzElectronCuts::SetMinMomPiondEdxTPCCut(Int_t piMomdedxSigmaCut)
\r
1101 switch(piMomdedxSigmaCut){
\r
1103 case 0: fPIDMinPnSigmaAbovePionLineTPC=0.;
\r
1105 case 1: // 50.0 GeV
\r
1106 fPIDMinPnSigmaAbovePionLineTPC=50.;
\r
1108 case 2: // 20.0 GeV
\r
1109 fPIDMinPnSigmaAbovePionLineTPC=20.;
\r
1111 case 3: // 1.5 GeV
\r
1112 fPIDMinPnSigmaAbovePionLineTPC=1.5;
\r
1115 fPIDMinPnSigmaAbovePionLineTPC=1.;
\r
1117 case 5: // 0.5 GeV
\r
1118 fPIDMinPnSigmaAbovePionLineTPC=0.5;
\r
1120 case 6: // 0.4 GeV
\r
1121 fPIDMinPnSigmaAbovePionLineTPC=0.4;
\r
1123 case 7: // 0.3 GeV
\r
1124 fPIDMinPnSigmaAbovePionLineTPC=0.3;
\r
1126 case 8: // 0.25 GeV
\r
1127 fPIDMinPnSigmaAbovePionLineTPC=0.25;
\r
1130 cout<<"Warning: piMomdedxSigmaCut not defined "<<piMomdedxSigmaCut<<endl;
\r
1135 ///________________________________________________________________________
\r
1136 Bool_t AliDalitzElectronCuts::SetITSClusterCut(Int_t clsITSCut){
\r
1139 if( !fesdTrackCuts ) {
\r
1141 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
\r
1145 switch(clsITSCut){
\r
1147 case 0: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
\r
1149 case 1: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
\r
1150 break; //1 hit first layer of SPD
\r
1151 case 2: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1152 break; //1 hit in any layer of SPD
\r
1153 case 3: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kFirst);
\r
1154 fesdTrackCuts->SetMinNClustersITS(4);
\r
1155 // 4 hits in total in the ITS. At least 1 hit in the first layer of SPD
\r
1157 case 4: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1158 fesdTrackCuts->SetMinNClustersITS(3);
\r
1159 // 3 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1161 case 5: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1162 fesdTrackCuts->SetMinNClustersITS(4);
\r
1163 // 4 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1165 case 6: fesdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
\r
1166 fesdTrackCuts->SetMinNClustersITS(5);
\r
1167 // 5 hits in total in the ITS. At least 1 hit in any layer of SPD
\r
1170 cout<<"Warning: clsITSCut not defined "<<clsITSCut<<endl;
\r
1177 ///________________________________________________________________________
\r
1178 Bool_t AliDalitzElectronCuts::SetTPCClusterCut(Int_t clsTPCCut)
\r
1180 switch(clsTPCCut){
\r
1183 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1187 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1191 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1195 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1197 case 4: // 0% of findable clusters
\r
1199 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1200 fMinClsTPCToF= 0.0;
\r
1201 fUseCorrectedTPCClsInfo=0;
\r
1203 case 5: // 35% of findable clusters
\r
1204 fMinClsTPC = 70.;
\r
1205 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1206 fMinClsTPCToF= 0.35;
\r
1207 fUseCorrectedTPCClsInfo=0;
\r
1209 case 6: // 60% of findable clusters
\r
1211 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1212 fMinClsTPCToF= 0.6;
\r
1213 fUseCorrectedTPCClsInfo=0;
\r
1215 case 7: // 70% of findable clusters
\r
1217 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1218 fMinClsTPCToF= 0.7;
\r
1219 fUseCorrectedTPCClsInfo=0;
\r
1221 case 8: fMinClsTPC = 0.;
\r
1222 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1223 fMinClsTPCToF= 0.35;
\r
1224 fUseCorrectedTPCClsInfo=0;
\r
1226 case 9: // 35% of findable clusters
\r
1227 fMinClsTPC = 70.;
\r
1228 fesdTrackCuts->SetMinNClustersTPC(fMinClsTPC);
\r
1229 fMinClsTPCToF= 0.35;
\r
1230 fUseCorrectedTPCClsInfo=1;
\r
1234 cout<<"Warning: clsTPCCut not defined "<<clsTPCCut<<endl;
\r
1240 ///________________________________________________________________________
\r
1241 Bool_t AliDalitzElectronCuts::SetEtaCut(Int_t etaCut)
\r
1247 fDoEtaCut = kFALSE;
\r
1251 fDoEtaCut = kTRUE;
\r
1255 fDoEtaCut = kTRUE;
\r
1259 fDoEtaCut = kTRUE;
\r
1263 fDoEtaCut = kTRUE;
\r
1267 fDoEtaCut = kTRUE;
\r
1270 fEtaCut = 0.6; //changed from 0.4 to 0.6 2013.06.10
\r
1271 fDoEtaCut = kTRUE;
\r
1274 fEtaCut = 0.5; //changed from 0.3 to 0.5 2013.06.10
\r
1275 fDoEtaCut = kTRUE;
\r
1277 case 8: fEtaCut = 0.4;
\r
1278 fDoEtaCut = kTRUE;
\r
1281 cout<<"Warning: EtaCut not defined "<<etaCut<<endl;
\r
1287 ///________________________________________________________________________
\r
1288 Bool_t AliDalitzElectronCuts::SetPtCut(Int_t ptCut)
\r
1291 //0.1GeV, 0.125 GeV, 0.15 GeV
\r
1295 case 0: fPtCut = 0.075;
\r
1300 case 2: // 0.125 GeV
\r
1303 case 3: // 0.15 GeV
\r
1307 cout<<"Warning: PtCut not defined "<<ptCut<<endl;
\r
1314 ///________________________________________________________________________
\r
1315 Bool_t AliDalitzElectronCuts::SetDCACut(Int_t dcaCut)
\r
1319 if( !fesdTrackCuts ) {
\r
1321 cout<<"Warning: AliESDtrackCut is not initialized "<<endl;
\r
1329 fesdTrackCuts->SetMaxDCAToVertexZ(1000);
\r
1330 fesdTrackCuts->SetMaxDCAToVertexXY(1000);
\r
1331 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1335 fesdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
\r
1336 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1339 case 2: fesdTrackCuts->SetMaxDCAToVertexZ(2);
\r
1340 fesdTrackCuts->SetMaxDCAToVertexXY(1);
\r
1341 fesdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
\r
1345 cout<<"Warning: dcaCut not defined "<<dcaCut<<endl;
\r
1354 ///________________________________________________________________________
\r
1355 Bool_t AliDalitzElectronCuts::SetMaxMomPiondEdxTPCCut(Int_t piMaxMomdedxSigmaCut)
\r
1357 switch(piMaxMomdedxSigmaCut){
\r
1360 fPIDMaxPnSigmaAbovePionLineTPC=0.;
\r
1362 case 1: // 100. GeV
\r
1363 fPIDMaxPnSigmaAbovePionLineTPC=100.;
\r
1366 fPIDMaxPnSigmaAbovePionLineTPC=5.;
\r
1369 fPIDMaxPnSigmaAbovePionLineTPC=4.;
\r
1371 case 4: // 3.5 GeV
\r
1372 fPIDMaxPnSigmaAbovePionLineTPC=3.5;
\r
1375 fPIDMaxPnSigmaAbovePionLineTPC=3.;
\r
1378 cout<<"Warning: piMaxMomdedxSigmaCut not defined "<<piMaxMomdedxSigmaCut<<endl;
\r
1384 ///________________________________________________________________________
\r
1385 Bool_t AliDalitzElectronCuts::SetLowPRejectionCuts(Int_t LowPRejectionSigmaCut)
\r
1387 switch(LowPRejectionSigmaCut){
\r
1389 fDoKaonRejectionLowP=kFALSE;
\r
1390 fDoProtonRejectionLowP=kFALSE;
\r
1391 fDoPionRejectionLowP=kFALSE;
\r
1392 fPIDnSigmaAtLowPAroundKaonLine=0;
\r
1393 fPIDnSigmaAtLowPAroundProtonLine=0;
\r
1394 fPIDnSigmaAtLowPAroundPionLine=0;
\r
1395 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1398 fDoKaonRejectionLowP=kTRUE;
\r
1399 fDoProtonRejectionLowP=kTRUE;
\r
1400 fDoPionRejectionLowP=kTRUE;
\r
1401 fPIDnSigmaAtLowPAroundKaonLine=0.5;
\r
1402 fPIDnSigmaAtLowPAroundProtonLine=0.5;
\r
1403 fPIDnSigmaAtLowPAroundPionLine=0.5;
\r
1404 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1407 fDoKaonRejectionLowP=kTRUE;
\r
1408 fDoProtonRejectionLowP=kTRUE;
\r
1409 fDoPionRejectionLowP=kTRUE;
\r
1410 fPIDnSigmaAtLowPAroundKaonLine=1.0;
\r
1411 fPIDnSigmaAtLowPAroundProtonLine=1.0;
\r
1412 fPIDnSigmaAtLowPAroundPionLine=1.0;
\r
1413 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1416 fDoKaonRejectionLowP=kTRUE;
\r
1417 fDoProtonRejectionLowP=kTRUE;
\r
1418 fDoPionRejectionLowP=kTRUE;
\r
1419 fPIDnSigmaAtLowPAroundKaonLine=1.5;
\r
1420 fPIDnSigmaAtLowPAroundProtonLine=1.5;
\r
1421 fPIDnSigmaAtLowPAroundPionLine=1.5;
\r
1422 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1425 fDoKaonRejectionLowP=kTRUE;
\r
1426 fDoProtonRejectionLowP=kTRUE;
\r
1427 fDoPionRejectionLowP=kTRUE;
\r
1428 fPIDnSigmaAtLowPAroundKaonLine=2.0;
\r
1429 fPIDnSigmaAtLowPAroundProtonLine=2.0;
\r
1430 fPIDnSigmaAtLowPAroundPionLine=2.0;
\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.5;
\r
1440 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1443 fDoKaonRejectionLowP=kTRUE;
\r
1444 fDoProtonRejectionLowP=kTRUE;
\r
1445 fDoPionRejectionLowP=kTRUE;
\r
1446 fPIDnSigmaAtLowPAroundKaonLine=0.;
\r
1447 fPIDnSigmaAtLowPAroundProtonLine=0.;
\r
1448 fPIDnSigmaAtLowPAroundPionLine=2.;
\r
1449 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1452 fDoKaonRejectionLowP=kFALSE;
\r
1453 fDoProtonRejectionLowP=kFALSE;
\r
1454 fDoPionRejectionLowP=kTRUE;
\r
1455 fPIDnSigmaAtLowPAroundKaonLine=0.0;
\r
1456 fPIDnSigmaAtLowPAroundProtonLine=0.0;
\r
1457 fPIDnSigmaAtLowPAroundPionLine=1.0;
\r
1458 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1461 fDoKaonRejectionLowP=kFALSE;
\r
1462 fDoProtonRejectionLowP=kFALSE;
\r
1463 fDoPionRejectionLowP=kTRUE;
\r
1464 fPIDnSigmaAtLowPAroundKaonLine=0.;
\r
1465 fPIDnSigmaAtLowPAroundProtonLine=0.;
\r
1466 fPIDnSigmaAtLowPAroundPionLine=0.5;
\r
1467 fPIDMinPPionRejectionLowP = fPIDMinPnSigmaAbovePionLineTPC;
\r
1470 cout<<"Warning: LowPRejectionSigmaCut not defined "<<LowPRejectionSigmaCut<<endl;
\r
1476 ///________________________________________________________________________
\r
1477 Bool_t AliDalitzElectronCuts::SetTOFElectronPIDCut(Int_t TOFelectronPID){
\r
1479 switch(TOFelectronPID){ // RRnewTOF start //////////////////////////////////////////////////////////////////////////
\r
1481 fRequireTOF = kFALSE;
\r
1482 fUseTOFpid = kFALSE;
\r
1483 fTofPIDnSigmaBelowElectronLine=-100;
\r
1484 fTofPIDnSigmaAboveElectronLine=100;
\r
1487 fRequireTOF = kFALSE;
\r
1488 fUseTOFpid = kTRUE;
\r
1489 fTofPIDnSigmaBelowElectronLine=-7;
\r
1490 fTofPIDnSigmaAboveElectronLine=7;
\r
1493 fRequireTOF = kFALSE;
\r
1494 fUseTOFpid = kTRUE;
\r
1495 fTofPIDnSigmaBelowElectronLine=-5;
\r
1496 fTofPIDnSigmaAboveElectronLine=5;
\r
1499 fRequireTOF = kFALSE;
\r
1500 fUseTOFpid = kTRUE;
\r
1501 fTofPIDnSigmaBelowElectronLine=-3;
\r
1502 fTofPIDnSigmaAboveElectronLine=5;
\r
1505 fRequireTOF = kFALSE;
\r
1506 fUseTOFpid = kTRUE;
\r
1507 fTofPIDnSigmaBelowElectronLine=-2;
\r
1508 fTofPIDnSigmaAboveElectronLine=3;
\r
1510 case 5: // -3, 3 TOF mandatory
\r
1511 fRequireTOF = kTRUE;
\r
1512 fUseTOFpid = kTRUE;
\r
1513 fTofPIDnSigmaBelowElectronLine= -3;
\r
1514 fTofPIDnSigmaAboveElectronLine= 3;
\r
1517 cout<<"Warning: TOFElectronCut not defined "<<TOFelectronPID<<endl;
\r
1519 } //////////////////////// RRnewTOF end //////////////////////////////////////////////////////////////////////////
\r
1522 ///_______________________________________________________________________________
\r
1524 Bool_t AliDalitzElectronCuts::SetPsiPairCut(Int_t psiCut) {
\r
1529 fDoPsiPairCut = kFALSE;
\r
1530 fPsiPairCut = 10000.; //
\r
1531 fDeltaPhiCutMin = -1000.;
\r
1532 fDeltaPhiCutMax = 1000.;
\r
1536 fDoPsiPairCut = kTRUE;
\r
1537 fPsiPairCut = 0.45; // Standard
\r
1538 fDeltaPhiCutMin = 0.0;
\r
1539 fDeltaPhiCutMax = 0.12;
\r
1542 fDoPsiPairCut = kTRUE;
\r
1543 fPsiPairCut = 0.60;
\r
1544 fDeltaPhiCutMin = 0.0;
\r
1545 fDeltaPhiCutMax = 0.12;
\r
1548 fDoPsiPairCut = kTRUE;
\r
1549 fPsiPairCut = 0.52;
\r
1550 fDeltaPhiCutMin = 0.0;
\r
1551 fDeltaPhiCutMax = 0.12;
\r
1555 cout<<"Warning: PsiPairCut not defined "<<fPsiPairCut<<endl;
\r
1562 ///_______________________________________________________________________________
\r
1563 Bool_t AliDalitzElectronCuts::SetRejectSharedElecGamma(Int_t RCut) {
\r
1568 fDoRejectSharedElecGamma = kFALSE;
\r
1569 fRadiusCut = 10000; //
\r
1572 fDoRejectSharedElecGamma = kTRUE;
\r
1573 fRadiusCut = 2.0; // cm
\r
1576 fDoRejectSharedElecGamma = kTRUE;
\r
1577 fRadiusCut = 3.0; // Standard
\r
1580 fDoRejectSharedElecGamma = kTRUE;
\r
1581 fRadiusCut = 4.0; //
\r
1584 fDoRejectSharedElecGamma = kTRUE;
\r
1585 fRadiusCut = 5.0; //
\r
1588 fDoRejectSharedElecGamma = kTRUE;
\r
1589 fRadiusCut = 10.0; //
\r
1592 fDoRejectSharedElecGamma = kTRUE;
\r
1593 fRadiusCut = 15.0; //
\r
1596 cout<<"Warning: PsiPairCut not defined "<<fDoRejectSharedElecGamma<<endl;
\r
1602 ///__________________________________________________________________________
\r
1603 Bool_t AliDalitzElectronCuts::SetBackgroundScheme(Int_t BackgroundScheme){
\r
1606 switch(BackgroundScheme){
\r
1608 case 0: //Rotation
\r
1610 fUseTrackMultiplicityForBG = kFALSE;
\r
1612 case 1: // mixed event with V0 multiplicity
\r
1614 fUseTrackMultiplicityForBG = kFALSE;
\r
1616 case 2: // mixed event with track multiplicity
\r
1617 fUseTrackMultiplicityForBG = kTRUE;
\r
1620 case 3: //Rotation
\r
1621 fUseTrackMultiplicityForBG = kFALSE;
\r
1624 case 4: //Rotation
\r
1625 fUseTrackMultiplicityForBG = kTRUE;
\r
1628 case 5: fUseTrackMultiplicityForBG = kTRUE;
\r
1633 cout<<"Warning: BackgroundScheme not defined "<<BackgroundScheme<<endl;
\r
1639 ///________________________________________________________________________
\r
1640 Bool_t AliDalitzElectronCuts::SetNumberOfRotations(Int_t NumberOfRotations)
\r
1642 switch(NumberOfRotations){
\r
1644 fnumberOfRotationEventsForBG = 5;
\r
1647 fnumberOfRotationEventsForBG = 10;
\r
1650 fnumberOfRotationEventsForBG = 15;
\r
1653 fnumberOfRotationEventsForBG = 20;
\r
1656 fnumberOfRotationEventsForBG = 2;
\r
1659 fnumberOfRotationEventsForBG = 50;
\r
1662 fnumberOfRotationEventsForBG = 80;
\r
1665 fnumberOfRotationEventsForBG = 100;
\r
1668 cout<<"Warning: NumberOfRotations not defined "<<NumberOfRotations<<endl;
\r
1676 ///________________________________________________________________________
\r
1677 Bool_t AliDalitzElectronCuts::SetMassCut(Int_t massCut)
\r
1683 fMassCutPtMin = -999.; //GeV
\r
1684 fMassCutLowPt = 999.; //GeV/c^2
\r
1685 fMassCutHighPt = 999.; //GeV/c^2
\r
1686 fDoMassCut = kFALSE;
\r
1689 //fMassCut = 0.135; //GeV/c^2
\r
1690 fMassCutPtMin = -999.; //GeV
\r
1691 fMassCutLowPt = 0.135; //GeV/c^2
\r
1692 fMassCutHighPt = 0.135; //GeV/c^2
\r
1693 fDoMassCut = kTRUE;
\r
1696 //fMassCut = 0.100; //GeV/c^2
\r
1697 fMassCutPtMin = -999.; //GeV
\r
1698 fMassCutLowPt = 0.100; //GeV/c^2
\r
1699 fMassCutHighPt = 0.100; //GeV/c^2
\r
1700 fDoMassCut = kTRUE;
\r
1703 //fMassCut = 0.075; //GeV/c^2
\r
1704 fMassCutPtMin = -999.; //GeV
\r
1705 fMassCutLowPt = 0.075; //GeV/c^2
\r
1706 fMassCutHighPt = 0.075; //GeV/c^2
\r
1707 fDoMassCut = kTRUE;
\r
1710 //fMassCut = 0.050; //GeV/c^2
\r
1711 fMassCutPtMin = -999.; //GeV
\r
1712 fMassCutLowPt = 0.050; //GeV/c^2
\r
1713 fMassCutHighPt = 0.050; //GeV/c^2
\r
1714 fDoMassCut = kTRUE;
\r
1718 fMassCutPtMin = -999.; //GeV
\r
1719 fMassCutLowPt = 0.035; //GeV/c^2
\r
1720 fMassCutHighPt = 0.035; //GeV/c^2
\r
1721 fDoMassCut = kTRUE;
\r
1724 fMassCutPtMin = -999.; //GeV
\r
1725 fMassCutLowPt = 0.015; //GeV/c^2
\r
1726 fMassCutHighPt = 0.015; //GeV/c^2
\r
1727 fDoMassCut = kTRUE;
\r
1729 case 7: fMassCutPtMin = 1.0; //GeV
\r
1730 fMassCutLowPt = 0.015; //GeV/c^2
\r
1731 fMassCutHighPt = 0.035; //GeV/c^2
\r
1732 fDoMassCut = kTRUE;
\r
1735 cout<<"Warning: MassCut not defined "<<massCut<<endl;
\r
1741 ///________________________________________________________________________
\r
1742 TString AliDalitzElectronCuts::GetCutNumber(){
\r
1743 // returns TString with current cut number
\r
1744 TString a(kNCuts);
\r
1745 for(Int_t ii=0;ii<kNCuts;ii++){
\r
1746 a.Append(Form("%d",fCuts[ii]));
\r
1752 ///________________________________________________________________________
\r
1753 AliDalitzElectronCuts* AliDalitzElectronCuts::GetStandardCuts2010PbPb(){
\r
1754 //Create and return standard 2010 PbPb cuts
\r
1755 AliDalitzElectronCuts *cuts=new AliDalitzElectronCuts("StandardCuts2010PbPb","StandardCuts2010PbPb");
\r
1756 if(!cuts->InitializeCutsFromCutString("9069640364102")){
\r
1757 cout<<"Warning: Initialization of Standardcuts2010PbPb failed"<<endl;}
\r
1761 ///________________________________________________________________________
\r
1762 AliDalitzElectronCuts* AliDalitzElectronCuts::GetStandardCuts2010pp(){
\r
1763 //Create and return standard 2010 PbPb cuts
\r
1764 AliDalitzElectronCuts *cuts=new AliDalitzElectronCuts("StandardCuts2010pp","StandardCuts2010pp");
\r
1766 if(!cuts->InitializeCutsFromCutString("9069640364102")){
\r
1767 cout<<"Warning: Initialization of Standardcuts2010pp failed"<<endl;}
\r