]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/RESONANCES/AliRsnCutPrimaryVertex.cxx
method added to add a run list (A.Pulvirenti)
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutPrimaryVertex.cxx
1 //
2 // Class AliRsnCutPrimaryVertex
3 //
4 // This cut implementation checks the quality of event primary vertex.
5 // It currently works only with ESD events (not AOD).
6 //
7 // authors: Martin Vala (martin.vala@cern.ch)
8 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
9 //
10
11 #include "AliRsnCutPrimaryVertex.h"
12
13 ClassImp(AliRsnCutPrimaryVertex)
14
15 //_________________________________________________________________________________________________
16 AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex
17 (const char *name, Double_t maxVz, Int_t nContributors, Bool_t acceptTPC) :
18   AliRsnCut(name, AliRsnCut::kEvent, 0, nContributors - 1, 0.0, maxVz),
19   fAcceptTPC(acceptTPC),
20   fCheckPileUp(kFALSE)
21 {
22 //
23 // Main constructor.
24 // Defines the cut range between 0 and
25 // the minimum required number of contributors.
26 // The cut will be passed when if the event has a
27 // primary vertex with number of contributors outside this interval.
28 // ---
29 // If the 'acceptTPC' argument is true, events with TPC
30 // primary vertex will be checked, otherwise they will be
31 // rejected by default.
32 // ---
33 // Since the range check uses the '>=' and '<=', the high edge
34 // must be decreased by 1 to get the right behaviour, since this is integer.
35 //
36
37   fMinD = 0.0;
38   fMaxD = maxVz + 1E-6;
39 }
40
41 //_________________________________________________________________________________________________
42 Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *object)
43 {
44 //
45 // Cut checker
46 //
47   
48   // retrieve ESD event
49   AliRsnEvent *rsn = dynamic_cast<AliRsnEvent*>(object);
50   if (!rsn) return kFALSE;
51   AliESDEvent *esd = rsn->GetRefESD();
52   AliAODEvent *aod = rsn->GetRefAOD();
53   
54   if (esd)
55   {
56     // pile-up check
57     if (fCheckPileUp)
58     {
59       if (esd->IsPileupFromSPD()) return kFALSE;
60     }
61     
62     // get the best primary vertex:
63     // first try the one with tracks
64     const AliESDVertex *vTrk  = esd->GetPrimaryVertexTracks();
65     const AliESDVertex *vSPD  = esd->GetPrimaryVertexSPD();
66     const AliESDVertex *vTPC  = esd->GetPrimaryVertexTPC();
67     Int_t               ncTrk = -1;
68     Int_t               ncSPD = -1;
69     Int_t               ncTPC = -1;
70     Double_t            vzTrk = 1000000.0;
71     Double_t            vzSPD = 1000000.0;
72     Double_t            vzTPC = 1000000.0;
73     if (vTrk) vzTrk = TMath::Abs(vTrk->GetZv());
74     if (vSPD) vzSPD = TMath::Abs(vSPD->GetZv());
75     if (vTPC) vzTPC = TMath::Abs(vTPC->GetZv());
76     if (vTrk) ncTrk = (Int_t)vTrk->GetNContributors();
77     if (vSPD) ncSPD = (Int_t)vSPD->GetNContributors();
78     if (vTPC) ncTPC = (Int_t)vTPC->GetNContributors();
79     if(vTrk && ncTrk > 0)
80     {
81       fCutValueI = ncTrk;
82       fCutValueD = vzTrk;
83     }
84     else if (vSPD && ncSPD > 0)
85     {
86       fCutValueI = ncSPD;
87       fCutValueD = vzSPD;
88     }
89     else if (vTPC && ncTPC > 0)
90     {
91       if (!fAcceptTPC) 
92         return kFALSE;
93       else
94       {
95         fCutValueI = ncTPC;
96         fCutValueD = vzTPC;
97       }
98     }
99     else
100       return kFALSE;
101   }
102   else if (aod)
103   {
104     // pile-up check is not yet available for AODs
105     
106     // lines suggested by Andrea to reject TPC-only events
107     if(!fAcceptTPC)
108     {
109       if (!aod->GetPrimaryVertexSPD()) return kFALSE;
110       else if(aod->GetPrimaryVertexSPD()->GetNContributors() < 1) return kFALSE;
111     }
112     
113     AliAODVertex *prim = (AliAODVertex*)aod->GetPrimaryVertex();
114     if (!prim) return kFALSE;
115
116     fCutValueI = prim->GetNContributors();
117     fCutValueD = prim->GetZ();
118   }
119   else
120     return kFALSE;
121     
122   // output
123   Bool_t result = ((!OkRangeI()) && OkRangeD());
124   return result;
125 }
126
127 //_________________________________________________________________________________________________
128 void AliRsnCutPrimaryVertex::Print(const Option_t *) const
129 {
130 //
131 // Print information on this cut
132 //
133
134   AliInfo(Form("Cut name                     : %s", GetName()));
135   AliInfo(Form("Accepting TPC primary vertex : %s", (fAcceptTPC ? "YES" : "NO")));
136   AliInfo(Form("Contributors range (outside) : %d - %d", fMinI, fMaxI));
137   AliInfo(Form("Z-vertex     range (inside)  : %f - %f", fMinD, fMaxD));
138 }