New classes plus some renamed for a better user friendly interface
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnSimpleFcnResolution.cxx
1 //
2 // Class AliRsnSimpleFcnResolution
3 //
4 // This is the most fundamental AliRsnSimpleFunction,
5 // which computes the invariant mass spectrum of a resonance,
6 // by correlating pairs of tracks from an event (or mixing, for BG)
7 //
8
9 #include <TH1.h>
10
11 #include "AliLog.h"
12
13 #include "AliRsnDaughter.h"
14 #include "AliRsnEvent.h"
15 #include "AliRsnPID.h"
16 #include "AliRsnSimpleFcnResolution.h"
17
18 ClassImp(AliRsnSimpleFcnResolution)
19
20 //________________________________________________________________________________________
21 AliRsnSimpleFcnResolution::AliRsnSimpleFcnResolution() :
22   AliRsnSimpleFunction()
23 {
24 //
25 // Constructor.
26 // Only default initializations.
27 //
28
29     fTrueFlag = kTRUE;
30     fMixFlag = kFALSE;
31 }
32
33 //________________________________________________________________________________________
34 AliRsnSimpleFcnResolution::AliRsnSimpleFcnResolution
35 (const char *name, AliRsnPairDef *pd, 
36  AliRsnHistoDef *hd, AliRsnCutMgr *cuts, Option_t *option) :
37   AliRsnSimpleFunction(name, pd, hd, cuts, option)
38 {
39 //
40 // Constructor.
41 // Only default initializations.
42 //
43
44     fTrueFlag = kTRUE;
45     fMixFlag = kFALSE;
46 }
47
48 //________________________________________________________________________________________
49 Bool_t AliRsnSimpleFcnResolution::ProcessOne(AliRsnEvent* event)
50 {
51 //
52 // Process a single event to build the invariant mass resolution histogram
53 // from the correlation of track pairs, according to the AliRsnPairDef settings.
54 // This class uses always the perfect PID.
55 //
56
57     if (!event) {
58         AliError("Argument cannot be NULL.");
59         return kFALSE;
60     }
61     
62     // check event cut
63     if (!CutPass(event)) return kFALSE;
64
65     // assign pointers to the list of indexes to be used
66     AliRsnDaughter::EPIDMethod mtd = AliRsnDaughter::kPerfect;
67     TArrayI *plist1 = event->GetTracksArray(mtd, fPairDef->GetCharge(0), fPairDef->GetType(0));
68     TArrayI *plist2 = event->GetTracksArray(mtd, fPairDef->GetCharge(1), fPairDef->GetType(1));
69     if (!plist1 || !plist2) return 0.0;
70     TArrayI &list1 = *plist1;
71     TArrayI &list2 = *plist2;
72
73     Stat_t count = 0;
74     Int_t i1, i2, start2;
75     AliRsnDaughter *track1 = 0x0, *track2 = 0x0;
76
77     // loop on particle of type 1
78     for (i1 = 0; i1 < list1.GetSize(); i1++) {
79         track1 = event->GetTrack(list1[i1]);
80         if (!CutPass(track1)) continue;
81         // loop on particle of type 2
82         // in case we are building a like-sign histogram with particles
83         // of the same type, we must avoid that each pair is used twice
84         start2 = 0;
85         if (plist1 == plist2) start2 = i1 + 1;
86         for (i2 = start2; i2 < list2.GetSize(); i2++) {
87             track2 = event->GetTrack(list2[i2]);
88             if (!CutPass(track2)) continue;
89             if (Add(track1, track2)) count++;
90         }
91     }
92
93     return (count > (Stat_t)0);
94 }
95
96 //________________________________________________________________________________________
97 Bool_t AliRsnSimpleFcnResolution::Add
98 (AliRsnDaughter *track1, AliRsnDaughter *track2)
99 {
100 //
101 // Add a histogram entry from two tracks, if they pass the cuts.
102 // The order matters, because track1 is processed using first element
103 // in the AliRsnPairDef definition, and track2 is processed using second ones.
104 // In case the study is done only for true pairs, this is checked automatically.
105 //
106
107     // setup pair and check pair cuts
108     fPair.SetPair(track1, track2);
109     if (!CutPass(&fPair)) return kFALSE;
110
111     // computation variables
112     Double_t mass1 = fPairDef->GetMass(0);
113     Double_t mass2 = fPairDef->GetMass(1);
114     
115     // make computation
116     Double_t invmass = fPair.GetInvMass(mass1, mass2);
117     Double_t invmassMC = fPair.GetInvMassMC(mass1, mass2);
118     Double_t res = (invmassMC - invmass) / invmassMC;
119     
120     // fill
121     fHisto1D->Fill(res);
122
123     return kTRUE;
124 }