]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronEventCuts.cxx
79766f17825394a0d93e28e377630707bc469013
[u/mrichter/AliRoot.git] / PWGDQ / 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
29 #include <AliTriggerAnalysis.h>
30 #include <AliESDVertex.h>
31 #include <AliAODVertex.h>
32 #include <AliESDEvent.h>
33 #include <AliAODEvent.h>
34 #include <AliMultiplicity.h>
35 #include <AliCentrality.h>
36
37 #include "AliDielectronEventCuts.h"
38
39 ClassImp(AliDielectronEventCuts)
40
41 AliDielectronEventCuts::AliDielectronEventCuts() :
42   AliAnalysisCuts(),
43   fVtxZmin(0.),
44   fVtxZmax(0.),
45   fRequireVtx(kFALSE),
46   fMinVtxContributors(0),
47   fMultITSTPC(kFALSE),
48   fCentMin(1.),
49   fCentMax(0.),
50   fVtxType(kVtxTracks),
51   fRequireV0and(0),
52   fTriggerAnalysis(0x0),
53   fkVertex(0x0),
54   fkVertexAOD(0x0)
55 {
56   //
57   // Default Constructor
58   //
59   
60 }
61
62 //______________________________________________
63 AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* title) :
64   AliAnalysisCuts(name, title),
65   fVtxZmin(0.),
66   fVtxZmax(0.),
67   fRequireVtx(kFALSE),
68   fMinVtxContributors(0),
69   fMultITSTPC(kFALSE),
70   fCentMin(1.),
71   fCentMax(0.),
72   fVtxType(kVtxTracks),
73   fRequireV0and(0),
74   fTriggerAnalysis(0x0),
75   fkVertex(0x0),
76   fkVertexAOD(0x0)
77 {
78   //
79   // Named Constructor
80   //
81 }
82
83 //______________________________________________
84 AliDielectronEventCuts::~AliDielectronEventCuts()
85 {
86   //
87   // Default Destructor
88   //
89   if (fTriggerAnalysis) delete fTriggerAnalysis;
90 }
91
92 //______________________________________________
93 Bool_t AliDielectronEventCuts::IsSelected(TObject* event)
94 {
95   //
96   // check the cuts
97   //
98   
99   if(event->IsA() == AliESDEvent::Class()) return IsSelectedESD(event);
100   else if(event->IsA() == AliAODEvent::Class()) return IsSelectedAOD(event);
101   else return kFALSE;
102 }
103 //____________________________________________________________________
104 Bool_t AliDielectronEventCuts::IsSelectedESD(TObject* event)
105 {
106   //
107   // check the cuts
108   //
109   
110   AliESDEvent *ev=dynamic_cast<AliESDEvent*>(event);
111   if (!ev) return kFALSE;
112
113   if (fCentMin<fCentMax){
114     AliCentrality *centrality=ev->GetCentrality();
115     Double_t centralityF=-1;
116     if (centrality) centralityF = centrality->GetCentralityPercentile("V0M");
117     if (centralityF<fCentMin || centralityF>=fCentMax) return kFALSE;
118   }
119
120   fkVertex=0x0;
121
122   switch(fVtxType){
123   case kVtxTracks:
124   case kVtxTracksOrSPD:
125     fkVertex=ev->GetPrimaryVertexTracks();
126     break;
127   case kVtxSPD:    fkVertex=ev->GetPrimaryVertexSPD(); break;
128   case kVtxTPC:    fkVertex=ev->GetPrimaryVertexTPC(); break;
129   case kVtxAny:    fkVertex=ev->GetPrimaryVertex(); break;
130   }
131
132   if ((fRequireVtx||fVtxZmin<fVtxZmax||fMinVtxContributors>0)&&!fkVertex) return kFALSE;
133   
134
135   if (fMinVtxContributors>0){
136     Int_t nCtrb = fkVertex->GetNContributors();
137     if (nCtrb<fMinVtxContributors){
138       if (fVtxType==kVtxTracksOrSPD){
139         fkVertex=ev->GetPrimaryVertexSPD();
140         nCtrb = fkVertex->GetNContributors();
141         if (nCtrb<fMinVtxContributors) return kFALSE;
142       } else {
143         return kFALSE;
144       }
145     }
146   }
147
148   if (fVtxZmin<fVtxZmax){
149     Double_t zvtx=fkVertex->GetZv();
150     if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
151   }
152   
153   if (fRequireV0and){
154     if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
155     Bool_t v0AND = kFALSE;
156     if (fRequireV0and==1){
157       Bool_t v0A       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0A);
158       Bool_t v0C       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0C);
159       v0AND = v0A && v0C;
160     }
161
162     if (fRequireV0and==2){
163       Bool_t v0AHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);
164       Bool_t v0CHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);
165       v0AND = v0AHW && v0CHW;
166     }
167
168     if (!v0AND) return kFALSE;
169   }
170
171   if (fMultITSTPC){
172     const AliESDVertex *vtxESDTPC=ev->GetPrimaryVertexTPC();
173     const AliMultiplicity *multESD = ev->GetMultiplicity();
174     if ( vtxESDTPC && multESD && vtxESDTPC->GetNContributors() < (-10.+0.25*multESD->GetNumberOfITSClusters(0)) )
175       return kFALSE;
176   }
177
178   
179   return kTRUE;
180 }
181 //______________________________________________
182 Bool_t AliDielectronEventCuts::IsSelectedAOD(TObject* event)
183 {
184   //
185   // check the cuts
186   //
187   
188   AliAODEvent *ev=dynamic_cast<AliAODEvent*>(event);
189   if (!ev) return kFALSE;
190
191   if (fCentMin<fCentMax){
192     AliCentrality *centrality=ev->GetCentrality();
193     Double_t centralityF=-1;
194     if (centrality) centralityF = centrality->GetCentralityPercentile("V0M");
195     if (centralityF<fCentMin || centralityF>=fCentMax) return kFALSE;
196   }
197
198   fkVertexAOD=0x0;
199
200   switch(fVtxType){
201   case kVtxTracks:         fkVertexAOD=0x0;                       break;
202   case kVtxTPC:            fkVertexAOD=GetPrimaryVertexTPC(ev);   break;
203   case kVtxSPD:
204   case kVtxTracksOrSPD:    fkVertexAOD=ev->GetPrimaryVertexSPD(); break;
205   case kVtxAny:            fkVertexAOD=ev->GetPrimaryVertex();    break;
206   }
207
208   if ((fRequireVtx||fVtxZmin<fVtxZmax||fMinVtxContributors>0)&&!fkVertexAOD) return kFALSE;
209   
210   if (fMinVtxContributors>0){
211     Int_t nCtrb = fkVertexAOD->GetNContributors();
212     if (nCtrb<fMinVtxContributors){
213       // if (fVtxType==kVtxTracksOrSPD){
214       //   fkVertexAOD=ev->GetVertex(AliAODVertex::kPrimary);
215       //   nCtrb = fkVertexAOD->GetNContributors();
216       //   if (nCtrb<fMinVtxContributors) return kFALSE;
217       //      } else {
218       return kFALSE;
219       //}
220     }
221   }
222   
223
224   if (fVtxZmin<fVtxZmax){
225     Double_t zvtx=fkVertexAOD->GetZ();
226     if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
227   }
228
229   /*
230   if (fRequireV0and){
231     //    if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
232     Bool_t v0AND = kFALSE;
233     if (fRequireV0and==1){
234       Bool_t v0A       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0A);
235       Bool_t v0A       = header->GetOfflineTrigger(); //TODO
236       Bool_t v0C       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0C);
237       v0AND = v0A && v0C;
238     }
239
240     if (fRequireV0and==2){
241       Bool_t v0AHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);
242       Bool_t v0CHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);
243       v0AND = v0AHW && v0CHW;
244     }
245
246     if (!v0AND) return kFALSE;
247   }
248   */
249   /*  if (fMultITSTPC){
250     const AliESDVertex *vtxESDTPC=ev->GetPrimaryVertexTPC();
251     const AliMultiplicity *multESD = ev->GetMultiplicity();
252     if ( vtxESDTPC && multESD && vtxESDTPC->GetNContributors() < (-10.+0.25*multESD->GetNumberOfITSClusters(0)) )
253       return kFALSE;
254   }
255   */
256   
257   return kTRUE;
258 }
259