]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/RESONANCES/AliRsnAnalysisPhiKK.cxx
Missing macro commented out
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnAnalysisPhiKK.cxx
CommitLineData
b0d3d6b9 1//
2// Class AliRsnAnalysisPhiKK
3//
4// Virtual Class derivated from AliRsnVAnalysisTaskSE which will be base class
5// for all RSN SE tasks
6//
7// authors: Martin Vala (martin.vala@cern.ch)
8// Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
9//
10
11#include <Riostream.h>
12#include <TList.h>
13
14#include "AliRsnFunction.h"
15#include "AliRsnAnalysisPhiKK.h"
16
17ClassImp(AliRsnAnalysisPhiKK)
18
19//_____________________________________________________________________________
20AliRsnAnalysisPhiKK::AliRsnAnalysisPhiKK(const char *name, Bool_t useKine) :
21 AliRsnVAnalysisTaskSE(name, useKine),
f073c807 22
b0d3d6b9 23 fPairDef(AliPID::kKaon, '+', AliPID::kKaon, '-', 333, 1.019455),
f073c807 24
25 fCutEvent (Form("%s_cutEvent" , name), AliRsnTarget::kEvent),
b0d3d6b9 26 fCutTrackCommon(Form("%s_cutTrackCom", name), AliRsnTarget::kDaughter),
f073c807 27 fCutTrackPos (Form("%s_cutTrackPos", name), AliRsnTarget::kDaughter),
28 fCutTrackNeg (Form("%s_cutTrackNeg", name), AliRsnTarget::kDaughter),
29 fCutPair (Form("%s_cutPair", name), AliRsnTarget::kMother),
30
31 fFuncPM ("AliRsnFunction", 0),
32 fFuncPP ("AliRsnFunction", 0),
33 fFuncMM ("AliRsnFunction", 0),
b0d3d6b9 34 fFuncTrue("AliRsnFunction", 0),
f073c807 35
b0d3d6b9 36 fOutList(0x0)
37{
38//
39// Default constructor.
40// Defines another output slot for histograms/ntuples
41//
42
43 DefineOutput(2, TList::Class());
44}
45
46//_____________________________________________________________________________
47AliRsnAnalysisPhiKK::AliRsnAnalysisPhiKK(const AliRsnAnalysisPhiKK& copy) :
48 AliRsnVAnalysisTaskSE(copy),
f073c807 49
b0d3d6b9 50 fPairDef(AliPID::kKaon, '+', AliPID::kKaon, '-', 333, 1.019455),
f073c807 51
52 fCutEvent (copy.fCutEvent),
53 fCutTrackCommon(copy.fCutTrackCommon),
54 fCutTrackPos (copy.fCutTrackPos),
55 fCutTrackNeg (copy.fCutTrackNeg),
56 fCutPair (copy.fCutPair),
57
58 fFuncPM (copy.fFuncPM),
59 fFuncPP (copy.fFuncPP),
60 fFuncMM (copy.fFuncMM),
b0d3d6b9 61 fFuncTrue(copy.fFuncTrue),
f073c807 62
b0d3d6b9 63 fOutList(0x0)
64{
65//
66// Copy constructor.
67//
68}
69
70//_____________________________________________________________________________
71AliRsnAnalysisPhiKK& AliRsnAnalysisPhiKK::operator=(const AliRsnAnalysisPhiKK& copy)
72{
73//
74// Assigment operator.
75//
76
77 AliRsnVAnalysisTaskSE::operator=(copy);
78
79 fFuncPM = copy.fFuncPM;
80 fFuncPP = copy.fFuncPP;
81 fFuncMM = copy.fFuncMM;
82 fFuncTrue = copy.fFuncTrue;
83
84 fCutEvent = copy.fCutEvent;
85 fCutTrackCommon = copy.fCutTrackCommon;
86 fCutTrackPos = copy.fCutTrackPos;
87 fCutTrackNeg = copy.fCutTrackNeg;
88 fCutPair = copy.fCutPair;
89
90 if (fOutList) fOutList->Clear();
91
92 return (*this);
93}
94
95//_____________________________________________________________________________
96void AliRsnAnalysisPhiKK::AddFunction(AliRsnFunction* const fcn)
97{
98//
99// Adds a new computing function to each collection,
100// in order to have exactly the sames for each kind of pair.
101//
102
103 Int_t size = fFuncPM.GetEntries();
104
105 new (fFuncPM [size]) AliRsnFunction(*fcn);
106 new (fFuncPP [size]) AliRsnFunction(*fcn);
107 new (fFuncMM [size]) AliRsnFunction(*fcn);
108 new (fFuncTrue[size]) AliRsnFunction(*fcn);
109}
110
111//_____________________________________________________________________________
112void AliRsnAnalysisPhiKK::RsnUserCreateOutputObjects()
113{
114//
115// Creation of output objects.
116// These are created through the utility methods in the analysis manager,
117// which asks all the AliRsnPair objects to initialize their output which
118// is then linked to the TList data member of this, which will contain all the output.
119//
120
121 if (!fOutList) fOutList = new TList;
122 fOutList->Clear();
123
124 Int_t i, j, nFunc = fFuncPM.GetEntries();
125 TString hName(""), suf[4] = {"PM", "PP", "MM", "True"};
126 AliRsnFunction *fcn[4] = {0, 0, 0, 0};
127
128 for (i = 0; i < nFunc; i++)
129 {
130 fcn[0] = (AliRsnFunction*)fFuncPM.At(i);
131 fcn[1] = (AliRsnFunction*)fFuncPP.At(i);
132 fcn[2] = (AliRsnFunction*)fFuncMM.At(i);
133 fcn[3] = (AliRsnFunction*)fFuncTrue.At(i);
134 for (j = 0; j < 4; j++)
135 {
b0d3d6b9 136 hName = GetName();
137 hName += '_';
138 hName += suf[j];
139 hName += '_';
140 hName += fcn[j]->GetName();
141 if (fcn[j]->IsUsingTH1()) fOutList->Add(fcn[j]->CreateHistogram(hName.Data(), ""));
142 else fOutList->Add(fcn[j]->CreateHistogramSparse(hName.Data(), ""));
143 }
144 }
145
146 PostData(2, fOutList);
147}
148
149//_____________________________________________________________________________
150void AliRsnAnalysisPhiKK::RsnUserExec(Option_t*)
151{
152//
153// Execution of the analysis task.
154// Recovers the input event and processes it with all included pair objects,
155// using 'reconstructed' or 'MonteCarlo' functions depending on MC-only flag.
156//
157
f073c807 158 // allocate statically all class objects used here
159 static TArrayI good(0);
160 static AliRsnDaughter kaon[2], temp;
161 static AliRsnMother phi;
162 static AliRsnDaughter::ERefType type;
163 static AliRsnFunction *fcn = 0x0;
164 static TClonesArray *ref = 0x0;
165
166 // define constants used for kinematics
167 static const Double_t kaonMass = 0.493677;
168
169 // simpler variables are declared non static
170 Int_t i, j, k, index, ngood = 0;
171 Int_t tot = AliRsnTarget::GetCurrentEvent()->GetAbsoluteSum();
172 Bool_t assignOK, truePair;
173
174 // point to first event in the target
b0d3d6b9 175 AliRsnTarget::SwitchToFirst();
f073c807 176 if (!AliRsnTarget::GetCurrentEvent()) return;
b0d3d6b9 177
f073c807 178 // initially, set the array of good indexes
179 // to the full number of tracks and reset the counter
180 good.Set(tot);
181 ngood = 0;
182
183 // loop on tracks and get those which satisfy cuts
b0d3d6b9 184 for (i = 0; i < tot; i++)
185 {
186 // assign track and skip all that are not charged tracks
f073c807 187 assignOK = AliRsnTarget::GetCurrentEvent()->ConvertAbsoluteIndex(i, index, type);
188 if (!assignOK) continue;
189 if (type != AliRsnDaughter::kTrack) continue;
190 AliRsnTarget::GetCurrentEvent()->SetDaughter(temp, index, AliRsnDaughter::kTrack);
b0d3d6b9 191
192 // skip tracks which don't pass common cuts
f073c807 193 if (!fCutTrackCommon.IsSelected(&temp)) continue;
b0d3d6b9 194
195 // accept tracks which pass also charge-related cuts
f073c807 196 if ( (temp.Charge() > 0) && (fCutTrackPos.IsSelected(&temp)) )
b0d3d6b9 197 {
f073c807 198 good[ngood] = index;
b0d3d6b9 199 ++ngood;
200 }
f073c807 201 else if ( (temp.Charge() < 0) && (fCutTrackNeg.IsSelected(&temp)) )
b0d3d6b9 202 {
f073c807 203 good[ngood] = index;
b0d3d6b9 204 ++ngood;
205 }
206 }
f073c807 207
208 // rese the arrays to the real counts
209 good.Set(ngood);
b0d3d6b9 210
211 // now that the 'tot' value is useless, set it to
f073c807 212 // the total number of functions, which by construction
213 // is THE SAME for all collections
b0d3d6b9 214 tot = fFuncPM.GetEntries();
215
f073c807 216 // fill histograms: do a unique loop on all good indexes
217 // and choose the histogram to fill from track charges
218 for (i = 0; i < ngood; i++)
b0d3d6b9 219 {
f073c807 220 AliRsnTarget::GetCurrentEvent()->SetDaughter(kaon[0], good[i], AliRsnDaughter::kTrack);
b0d3d6b9 221
f073c807 222 for (j = 0; j < ngood; j++)
b0d3d6b9 223 {
f073c807 224 // reject equal indexes
225 if (good[i] == good[j]) continue;
226 AliRsnTarget::GetCurrentEvent()->SetDaughter(kaon[1], good[j], AliRsnDaughter::kTrack);
227
b0d3d6b9 228 // adjust charges of pair def
f073c807 229 fPairDef.SetDaughters(AliPID::kKaon, kaon[0].ChargeChar(), AliPID::kKaon, kaon[1].ChargeChar());
b0d3d6b9 230
231 // fill the pair using the kaon masses and the passed daughters
f073c807 232 phi.SetDaughters(&kaon[0], kaonMass, &kaon[1], kaonMass);
b0d3d6b9 233
234 // check pair cuts
f073c807 235 if (!fCutPair.IsSelected(&phi)) continue;
b0d3d6b9 236
f073c807 237 // choose the functions to fill according to charges
b0d3d6b9 238 if (fPairDef.IsLikeSign())
239 {
f073c807 240 if (kaon[0].IsPos()) ref = &fFuncPP; else ref = &fFuncMM;
241 truePair = kFALSE;
b0d3d6b9 242 }
243 else
244 {
f073c807 245 ref = &fFuncPM;
246 truePair = IsTruePair(&kaon[0], &kaon[1]);
247 }
248
249 // loop on functions in chosen collection and fill
250 for (k = 0; k < tot; k++)
251 {
252 // fill standard histogram
253 fcn = (AliRsnFunction*)fFuncPP[k];
254 fcn->SetPairDef(&fPairDef);
255 fcn->SetPair(&phi);
256 fcn->Fill();
b0d3d6b9 257
f073c807 258 // in case of true pair, fill its histogram
259 if (truePair)
b0d3d6b9 260 {
f073c807 261 fcn = (AliRsnFunction*)fFuncTrue[k];
b0d3d6b9 262 fcn->Fill();
b0d3d6b9 263 }
264 }
f073c807 265 } // end internal loop
266 } // end external loop
b0d3d6b9 267
268 PostData(2, fOutList);
269}
270
271//_____________________________________________________________________________
272void AliRsnAnalysisPhiKK::RsnTerminate(Option_t*)
273{
274//
275// Termination.
276// Could be added some monitor histograms here.
277//
278}
279
280//______________________________________________________________________________
281Bool_t AliRsnAnalysisPhiKK::EventProcess()
282{
283//
284// Customized event pre-processing.
285// First checks if the current event passes all cuts,
286// and if it does, updates the informations and then
287// call the operations which are already defined in the
288// omonyme function in mother class
289//
290
291 // initially, an event is expected to be bad
292 fTaskInfo.SetEventUsed(kFALSE);
293
294 // check #1: number of tracks in event (reject empty events)
295 Int_t ntracks = fRsnEvent.GetMultiplicity();
296 if (ntracks < 1)
297 {
298 // empty events are rejected by default
299 fTaskInfo.SetEventUsed(kFALSE);
300 AliDebug(AliLog::kDebug, "Empty event. Skipping...");
301 return kFALSE;
302 }
303
304 // check the event cuts and update the info data accordingly
305 // events not passing the cuts must be rejected
306 if (!fCutEvent.IsSelected(&fRsnEvent))
307 {
308 fTaskInfo.SetEventUsed(kFALSE);
309 return kFALSE;
310 }
311
312 // if we reach this point, cuts were passed;
313 // then additional operations can be done
314
315 // find leading particle (without any PID/momentum restriction)
316 fRsnEvent.SelectLeadingParticle(0);
317
318 // final return value is positive
319 // but call the mother class method which updates info object
320 fTaskInfo.SetEventUsed(kTRUE);
321 return AliRsnVAnalysisTaskSE::EventProcess();
322}
f073c807 323
324//______________________________________________________________________________
325Bool_t AliRsnAnalysisPhiKK::IsTruePair(AliRsnDaughter *d1, AliRsnDaughter *d2)
326{
327//
328// Checks if the two daughters in argument come from the same phi resonance
329// and, if they do, check also that they are both kaons
330//
331
332 // constants related to PDG
333 static const Int_t phiPDG = 333;
334 static const Int_t kaonPDG = 321;
335
336 // check #1: is MC present?
337 if (!d1->GetRefMC() || !d2->GetRefMC()) return kFALSE;
338
339 // check #2: same mother?
340 Int_t m1 = -1;
341 Int_t m2 = -2;
342 if (d1->IsESD() && d2->IsESD() )
343 {
344 if (d1->GetRefMCESD() && d2->GetRefMCESD())
345 {
346 m1 = d1->GetRefMCESD()->Particle()->GetFirstMother();
347 m2 = d2->GetRefMCESD()->Particle()->GetFirstMother();
348 }
349 }
350 if (d1->IsAOD() && d2->IsAOD())
351 {
352 if (d1->GetRefMCAOD() && d2->GetRefMCAOD())
353 {
354 m1 = d1->GetRefMCAOD()->GetMother();
355 m2 = d2->GetRefMCAOD()->GetMother();
356 }
357 }
358 if (m1 < 0 || m2 < 0 || (m1 > 0 && m2 > 0 && m1 != m2)) return kFALSE;
359
360 // check #3: is the common mother a phi (PDG = 333)?
361 if (d1->GetMotherPDG() != phiPDG) return kFALSE;
362
363 // check #4: are the two particles a K+K- pair?
364 m1 = d1->GetPDG();
365 m2 = d2->GetPDG();
366 if (m1 == kaonPDG && m2 == -kaonPDG)
367 return kTRUE;
368 else if (m1 == -kaonPDG && m2 == kaonPDG)
369 return kTRUE;
370 else
371 return kFALSE;
372}