Major dielectron framework update; includes "alignment" to updates in
[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
33 #include "AliDielectronEventCuts.h"
34
35 ClassImp(AliDielectronEventCuts)
36
37 AliDielectronEventCuts::AliDielectronEventCuts() :
38   AliAnalysisCuts(),
39   fVtxZmin(0.),
40   fVtxZmax(0.),
41   fRequireVtx(kFALSE),
42   fMinVtxContributors(0),
43   fMultITSTPC(kFALSE),
44   fVtxType(kVtxTracks),
45   fRequireV0and(0),
46   fTriggerAnalysis(0x0),
47   fkVertex(0x0)
48 {
49   //
50   // Default Constructor
51   //
52   
53 }
54
55 //______________________________________________
56 AliDielectronEventCuts::AliDielectronEventCuts(const char* name, const char* title) :
57   AliAnalysisCuts(name, title),
58   fVtxZmin(0.),
59   fVtxZmax(0.),
60   fRequireVtx(kFALSE),
61   fMinVtxContributors(0),
62   fMultITSTPC(kFALSE),
63   fVtxType(kVtxTracks),
64   fRequireV0and(0),
65   fTriggerAnalysis(0x0),
66   fkVertex(0x0)
67 {
68   //
69   // Named Constructor
70   //
71 }
72
73 //______________________________________________
74 AliDielectronEventCuts::~AliDielectronEventCuts()
75 {
76   //
77   // Default Destructor
78   //
79   if (fTriggerAnalysis) delete fTriggerAnalysis;
80 }
81
82 //______________________________________________
83 Bool_t AliDielectronEventCuts::IsSelected(TObject* event)
84 {
85   //
86   // check the cuts
87   //
88   
89   AliESDEvent *ev=dynamic_cast<AliESDEvent*>(event);
90   if (!ev) return kFALSE;
91
92   fkVertex=0x0;
93   switch(fVtxType){
94   case kVtxTracks: fkVertex=ev->GetPrimaryVertexTracks(); break;
95   case kVtxSPD:    fkVertex=ev->GetPrimaryVertexSPD(); break;
96   case kVtxTPC:    fkVertex=ev->GetPrimaryVertexTPC(); break;
97   case kVtxAny:    fkVertex=ev->GetPrimaryVertex(); break;
98   }
99
100   if ((fRequireVtx||fVtxZmin<fVtxZmax||fMinVtxContributors>0)&&!fkVertex) return kFALSE;
101   
102   if (fVtxZmin<fVtxZmax){
103     Double_t zvtx=fkVertex->GetZv();
104     if (zvtx<fVtxZmin||zvtx>fVtxZmax) return kFALSE;
105   }
106
107   if (fMinVtxContributors>0){
108     Int_t nCtrb = fkVertex->GetNContributors();
109     if (nCtrb<fMinVtxContributors) return kFALSE;
110   }
111
112   if (fRequireV0and){
113     if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
114     Bool_t v0AND = kFALSE;
115     if (fRequireV0and==1){
116       Bool_t v0A       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0A);
117       Bool_t v0C       = fTriggerAnalysis->IsOfflineTriggerFired(ev, AliTriggerAnalysis::kV0C);
118       v0AND = v0A && v0C;
119     }
120
121     if (fRequireV0and==2){
122       Bool_t v0AHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);
123       Bool_t v0CHW     = (fTriggerAnalysis->V0Trigger(ev, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);
124       v0AND = v0AHW && v0CHW;
125     }
126
127     if (!v0AND) return kFALSE;
128   }
129
130   if (fMultITSTPC){
131     const AliESDVertex *vtxESDTPC=ev->GetPrimaryVertexTPC();
132     const AliMultiplicity *multESD = ev->GetMultiplicity();
133     if ( vtxESDTPC && multESD && vtxESDTPC->GetNContributors() < (-10.+0.25*multESD->GetNumberOfITSClusters(0)) )
134       return kFALSE;
135   }
136   
137   return kTRUE;
138 }
139