]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/RESONANCES/AliRsnCutPIDTOF.cxx
Some small code changes to adapt to requests for implementation of mixing.
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutPIDTOF.cxx
1 //
2 // Class AliRsnCutPIDTOF
3 //
4 // Implements the PID check with TOF detector,
5 // computed as a compatibility within a given range
6 // expressed in number of sigmas w.r. to expected time.
7 // Uses the default cut checking facilities of AliRsnCut
8 // to check this.
9 //
10 // authors: Martin Vala (martin.vala@cern.ch)
11 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
12 //
13
14 #include "AliAnalysisManager.h"
15 #include "AliESDInputHandler.h"
16
17 #include "AliRsnCutPIDTOF.h"
18
19 ClassImp(AliRsnCutPIDTOF)
20
21 //_________________________________________________________________________________________________
22 AliRsnCutPIDTOF::AliRsnCutPIDTOF
23 (const char *name, AliPID::EParticleType ref, Double_t min, Double_t max, Bool_t rejectUnmatched) :
24    AliRsnCut(name, AliRsnCut::kDaughter, min, max),
25    fInitialized(kFALSE),
26    fRejectUnmatched(rejectUnmatched),
27    fRefType(AliPID::kUnknown),
28    fRefMass(0.0),
29    fESDpid(),
30    fAODpid()
31 {
32 //
33 // Default constructor.
34 // To set the reference PID type, calls the SetRefType method,
35 // which sets the mass accordingly and coherently.
36 //
37
38    SetRefType(ref);
39 }
40
41 //_________________________________________________________________________________________________
42 AliRsnCutPIDTOF::AliRsnCutPIDTOF(const AliRsnCutPIDTOF& copy) :
43    AliRsnCut(copy),
44    fInitialized(kFALSE),
45    fRejectUnmatched(copy.fRejectUnmatched),
46    fRefType(AliPID::kUnknown),
47    fRefMass(0.0),
48    fESDpid(copy.fESDpid),
49    fAODpid(copy.fAODpid)
50 {
51 //
52 // Copy constructor.
53 // To set the reference PID type, calls the SetRefType method,
54 // which sets the mass accordingly and coherently.
55 //
56
57    SetRefType(copy.fRefType);
58 }
59
60 //_________________________________________________________________________________________________
61 AliRsnCutPIDTOF& AliRsnCutPIDTOF::operator=(const AliRsnCutPIDTOF& copy)
62 {
63 //
64 // Assignment operator.
65 // To set the reference PID type, calls the SetRefType method,
66 // which sets the mass accordingly and coherently.
67 //
68
69    fInitialized     = kFALSE;
70    fRejectUnmatched = copy.fRejectUnmatched;
71    fESDpid          = copy.fESDpid;
72    fAODpid          = copy.fAODpid;
73
74    SetRefType(copy.fRefType);
75
76    return (*this);
77 }
78
79 //_________________________________________________________________________________________________
80 Bool_t AliRsnCutPIDTOF::IsSelected(TObject *object)
81 {
82 //
83 // Cut checker.
84 //
85
86    // initialize if needed
87    if (!fInitialized) Initialize();
88
89    // coherence check
90    if (!TargetOK(object)) return kFALSE;
91
92    // reject always non-track objects
93    AliVTrack *vtrack = fDaughter->GetRefVtrack();
94    if (!vtrack) {
95       AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
96       return kFALSE;
97    }
98
99    // checks that track is matched in TOF:
100    // if not, the track is accepted or rejected
101    // depending on the 'fRejectUnmatched' data member:
102    // -- kTRUE  --> all unmatched tracks are rejected
103    // -- kFALSE --> all unmatched tracks are accepted (it is assumed that other PIDs are done)
104    if (!IsMatched(vtrack)) {
105       AliDebug(AliLog::kDebug + 2, "Track is not matched with TOF");
106       return (!fRejectUnmatched);
107    }
108
109    // retrieve real object type and
110    // prepare some useful variables
111    Double_t     tof, sigma, times[5];
112    Double_t    &ref = times[(Int_t)fRefType];
113    AliESDtrack *esdTrack = fDaughter->GetRefESDtrack();
114    AliAODTrack *aodTrack = fDaughter->GetRefAODtrack();
115
116    // cut check depends on the object type
117    if (esdTrack) {
118       // setup the ESD PID object
119       AliESDEvent *esd = 0x0;
120       if (fEvent) esd = fEvent->GetRefESD();
121       if (!esd) {
122          AliError("Processing an ESD track, but target is not an ESD event");
123          return kFALSE;
124       }
125       fESDpid.SetTOFResponse(esd, AliESDpid::kTOF_T0);
126
127       // get time of flight, reference times and sigma
128       esdTrack->GetIntegratedTimes(times);
129       tof   = (Double_t)(esdTrack->GetTOFsignal() - fESDpid.GetTOFResponse().GetStartTime(esdTrack->P()));
130       sigma = (Double_t)fESDpid.GetTOFResponse().GetExpectedSigma(esdTrack->P(), ref, fRefMass);
131
132       // port values to standard AliRsnCut checker
133       fCutValueD = (tof - ref) / sigma;
134       return OkRangeD();
135    } else if (aodTrack) {
136       // for AOD tracks, all operations are done by the AOD PID utility
137       fCutValueD = (Double_t)fAODpid.NumberOfSigmasTOF(aodTrack, fRefType);
138       return OkRangeD();
139    } else {
140       AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
141       return kFALSE;
142    }
143 }
144
145 //_________________________________________________________________________________________________
146 void AliRsnCutPIDTOF::Print(const Option_t *) const
147 {
148 //
149 // Print information on this cut
150 //
151
152    AliInfo(Form("Cut name, type            : %s %s", GetName(), ClassName()));
153    AliInfo(Form("TOF PID cut range (sigmas): %.3f %.3f", fMinD, fMaxD));
154    AliInfo(Form("Unmatched tracks are      : %s", (fRejectUnmatched ? "rejected" : "accepted")));
155 }
156
157 //_________________________________________________________________________________________________
158 void AliRsnCutPIDTOF::Initialize()
159 {
160 //
161 // Initialize ESD pid object from global one
162 //
163
164    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
165    AliESDInputHandler *handler = dynamic_cast<AliESDInputHandler*>(mgr->GetInputEventHandler());
166    if (handler) {
167       AliESDpid *pid = handler->GetESDpid();
168       if (pid) fESDpid = (*pid);
169    }
170
171    fInitialized = kTRUE;
172 }