major dielectron update (included also the data and plotting macros for paper)
[u/mrichter/AliRoot.git] / PWG3 / dielectron / AliDielectronEventCuts.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////
17 //                Dielectron EventCuts                                  //
18 //                                                                       //
19 //                                                                       //
20 /*
21 Detailed description
22
23
24 */
25 //                                                                       //
26 ///////////////////////////////////////////////////////////////////////////
27
28 #include <AliTriggerAnalysis.h>
29 #include <AliESDVertex.h>
30 #include <AliESDEvent.h>
31 #include <AliMultiplicity.h>
32 #include <AliCentrality.h>
33
34 #include "AliDielectronEventCuts.h"
35
36 ClassImp(AliDielectronEventCuts)
37
38 AliDielectronEventCuts::AliDielectronEventCuts() :
39   AliAnalysisCuts(),
40   fVtxZmin(0.),
41   fVtxZmax(0.),
42   fRequireVtx(kFALSE),
43   fMinVtxContributors(0),
44   fMultITSTPC(kFALSE),
45   fCentMin(1.),
46   fCentMax(0.),
47   fVtxType(kVtxTracks),
48   fRequireV0and(0),
49   fTriggerAnalysis(0x0),
50   fkVertex(0x0)
51 {
52   //
53   // Default Constructor
54   //
55   
56 }
57
58 //______________________________________________
59 AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* title) :
60   AliAnalysisCuts(name, title),
61   fVtxZmin(0.),
62   fVtxZmax(0.),
63   fRequireVtx(kFALSE),
64   fMinVtxContributors(0),
65   fMultITSTPC(kFALSE),
66   fCentMin(1.),
67   fCentMax(0.),
68   fVtxType(kVtxTracks),
69   fRequireV0and(0),
70   fTriggerAnalysis(0x0),
71   fkVertex(0x0)
72 {
73   //
74   // Named Constructor
75   //
76 }
77
78 //______________________________________________
79 AliDielectronEventCuts::~AliDielectronEventCuts()
80 {
81   //
82   // Default Destructor
83   //
84   if (fTriggerAnalysis) delete fTriggerAnalysis;
85 }
86
87 //______________________________________________
88 Bool_t AliDielectronEventCuts::IsSelected(TObject* event)
89 {
90   //
91   // check the cuts
92   //
93   
94   AliESDEvent *ev=dynamic_cast<AliESDEvent*>(event);
95   if (!ev) return kFALSE;
96
97   if (fCentMin<fCentMax){
98     AliCentrality *centrality=ev->GetCentrality();
99     Double_t centralityF=-1;
100     if (centrality) centralityF = centrality->GetCentralityPercentile("V0M");
101     if (centralityF<fCentMin || centralityF>=fCentMax) return kFALSE;
102   }
103
104   fkVertex=0x0;
105   switch(fVtxType){
106   case kVtxTracks:
107   case kVtxTracksOrSPD:
108     fkVertex=ev->GetPrimaryVertexTracks();
109     break;
110   case kVtxSPD:    fkVertex=ev->GetPrimaryVertexSPD(); break;
111   case kVtxTPC:    fkVertex=ev->GetPrimaryVertexTPC(); break;
112   case kVtxAny:    fkVertex=ev->GetPrimaryVertex(); break;
113   }
114
115   if ((fRequireVtx||fVtxZmin<fVtxZmax||fMinVtxContributors>0)&&!fkVertex) return kFALSE;
116   
117
118   if (fMinVtxContributors>0){
119     Int_t nCtrb = fkVertex->GetNContributors();
120     if (nCtrb<fMinVtxContributors){
121       if (fVtxType==kVtxTracksOrSPD){
122         fkVertex=ev->GetPrimaryVertexSPD();
123         nCtrb = fkVertex->GetNContributors();
124         if (nCtrb<fMinVtxContributors) return kFALSE;
125       } else {
126         return kFALSE;
127       }
128     }
129   }
130
131   if (fVtxZmin<fVtxZmax){
132     Double_t zvtx=fkVertex->GetZv();
133     if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
134   }
135   
136   if (fRequireV0and){
137     if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
138     Bool_t v0AND = kFALSE;
139     if (fRequireV0and==1){
140       Bool_t v0A       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0A);
141       Bool_t v0C       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0C);
142       v0AND = v0A && v0C;
143     }
144
145     if (fRequireV0and==2){
146       Bool_t v0AHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);
147       Bool_t v0CHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);
148       v0AND = v0AHW && v0CHW;
149     }
150
151     if (!v0AND) return kFALSE;
152   }
153
154   if (fMultITSTPC){
155     const AliESDVertex *vtxESDTPC=ev->GetPrimaryVertexTPC();
156     const AliMultiplicity *multESD = ev->GetMultiplicity();
157     if ( vtxESDTPC && multESD && vtxESDTPC->GetNContributors() < (-10.+0.25*multESD->GetNumberOfITSClusters(0)) )
158       return kFALSE;
159   }
160
161   
162   return kTRUE;
163 }
164