Small correction #alienfulldir# -> #alienfulldir#/.. thanks to Pablo
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutBetheBloch.cxx
CommitLineData
5eb970a4 1//
2// Class AliRsnCutBetheBloch
3//
4// General implementation of a single cut strategy, which can be:
5// - a value contained in a given interval [--> IsBetween() ]
6// - a value equal to a given reference [--> MatchesValue()]
7//
8// In all cases, the reference value(s) is (are) given as data members
9// and each kind of cut requires a given value type (Int, UInt, Double),
10// but the cut check procedure is then automatized and chosen thanks to
11// an enumeration of the implemented cut types.
12// At the end, the user (or any other point which uses this object) has
13// to use the method IsSelected() to check if this cut has been passed.
14//
15// authors: Martin Vala (martin.vala@cern.ch)
16// Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
17//
18#include "TMath.h"
19
5eb970a4 20#include "AliRsnDaughter.h"
21#include "AliRsnCutBetheBloch.h"
22
23ClassImp(AliRsnCutBetheBloch)
24
25//_________________________________________________________________________________________________
26AliRsnCutBetheBloch::AliRsnCutBetheBloch() :
4fbb2459 27 AliRsnCut(),
28 fCorrect(kTRUE),
29 fMIP(50.0),
30 fType(AliPID::kUnknown)
5eb970a4 31{
32//
33// Default constructor.
34//
35
36 fConst[0] = fConst[1] = fConst[2] = fConst[3] = fConst[4] = 0.0;
37}
38
39//_________________________________________________________________________________________________
40AliRsnCutBetheBloch::AliRsnCutBetheBloch
5eb970a4 41(const char *name, Double_t fractionRange, AliPID::EParticleType type, Double_t mip, Bool_t correct) :
4fbb2459 42 AliRsnCut(name, 0.0, fractionRange),
43 fCorrect(correct),
44 fMIP(mip),
45 fType(type)
5eb970a4 46{
47//
48// Main constructor.
49// the cut range is the relative fraction of the value:
50// BB*(1-fraction) < TPC < BB*(1+fraction)
51// which means:
52// -fraction < (TPC - BB)/BB < fraction
53//
54
5eb970a4 55 fConst[0] = fConst[1] = fConst[2] = fConst[3] = fConst[4] = 0.0;
56}
57
58//_____________________________________________________________________________
4fbb2459 59Double_t AliRsnCutBetheBloch::BetheBloch(AliRsnDaughter * const track)
5eb970a4 60{
61//
62// Computes the theoretical dE/dx according to
63// a given mass hypothesis, from which betaGamma is computed
64//
65// This is the empirical ALEPH parameterization of the Bethe-Bloch formula.
66// It is normalized to 1 at the minimum.
67//
68// The default values for the kp* parameters are for ALICE TPC.
69// The value is computed in MIP units, multiplied by 50 to have it in energy.
70//
71
cff22d54 72 AliPID pid;
73 Double_t mass = pid.ParticleMass(fType);
74
75 Double_t betaGamma = track->P() / mass;
5eb970a4 76 Double_t beta = betaGamma / TMath::Sqrt(1.0 + betaGamma * betaGamma);
77 Double_t aa = TMath::Power(beta, fConst[3]);
78 Double_t bb = TMath::Power(1.0 / betaGamma, fConst[4]);
79
80 bb = TMath::Log(fConst[2] + bb);
81
82 Double_t out = (fConst[1] - aa - bb) * fConst[0] / aa;
83
4fbb2459 84 if (fCorrect) {
5eb970a4 85 Double_t kMeanCorr = 0.1;
86 Double_t meanCorr = (1 + (out - 1) * kMeanCorr);
87 out *= meanCorr;
88 }
89
90 return out * fMIP;
91}
92
6f4a992c 93//_____________________________________________________________________________
94Double_t AliRsnCutBetheBloch::RelDiff(AliRsnDaughter *track)
95{
96//
97// Relative difference between BB value and TPC signal
98//
99
100 if (!track->GetRefESD()) return -99999.9;
101
102 // compute Bethe-Bloch with the given mass hypothesis
103 Double_t bb = BetheBloch(track);
104 return TMath::Abs((track->GetRefESD()->GetTPCsignal() - bb) / bb);
105}
106
5eb970a4 107//_________________________________________________________________________________________________
108Bool_t AliRsnCutBetheBloch::IsSelected(ETarget tgt, AliRsnDaughter *track)
109{
110//
111// Cut checker.
112//
113
114 // coherence check
4fbb2459 115 if (tgt != AliRsnCut::kParticle) {
5eb970a4 116 AliError(Form("Wrong target. Skipping cut", GetName()));
117 return kTRUE;
118 }
119
cff22d54 120 // if the required PID of the track is not the same as the
121 // reference of the cut, the cut is automatically skipped
122 if (track->RequiredPID() != fType) return kTRUE;
123
5eb970a4 124 // retrieve the TPC signal
4fbb2459 125 AliESDtrack *esd = track->GetRefESD();
5eb970a4 126 if (!esd) {
127 AliError("ESD information unavailable");
128 return kTRUE;
129 }
130
5eb970a4 131 // the cut range is the relative fraction of the value:
132 // BB*(1-fraction) < TPC < BB*(1+fraction)
133 // which means:
134 // -fraction < (TPC - BB)/BB < fraction
135 // so we must compute the cut value accordingly
6f4a992c 136 fCutValueD = RelDiff(track);
5eb970a4 137
138 // then, this cut is checked inside the range
139 return OkRange();
140}
141
142//_________________________________________________________________________________________________
e79f56bd 143Bool_t AliRsnCutBetheBloch::IsSelected(ETarget /*tgt*/, AliRsnPairParticle* /*pair*/)
5eb970a4 144{
145//
146// Cut checker
147//
148
149 AliWarning("Cannot apply this cut to pairs");
150 return kTRUE;
151}
152
153//_________________________________________________________________________________________________
e79f56bd 154Bool_t AliRsnCutBetheBloch::IsSelected(ETarget /*tgt*/, AliRsnEvent* /*event*/)
5eb970a4 155{
156//
157// Cut checker
158//
159
160 AliWarning("Cannot apply this cut to events");
161 return kTRUE;
162}
163
164//_________________________________________________________________________________________________
e79f56bd 165Bool_t AliRsnCutBetheBloch::IsSelected(ETarget /*tgt*/, AliRsnEvent* /*ev1*/, AliRsnEvent* /*ev2*/)
5eb970a4 166{
167//
168// Cut checker
169//
170
171 AliWarning("Cannot apply this cut to event mixing");
172 return kTRUE;
173}