5af2966fa0dccaafe18516b3f2b8aaeb5a4e6fb1
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnAnalysisSE.cxx
1 //
2 // Class AliRsnAnalysisSE
3 //
4 // TODO
5 //
6 // authors: Martin Vala (martin.vala@cern.ch)
7 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
8 //
9
10 #include <Riostream.h>
11
12 #include <TSystem.h>
13 #include <TFile.h>
14 #include <TFolder.h>
15 #include <TROOT.h>
16
17 #include "AliLog.h"
18
19 #include "AliAnalysisManager.h"
20 #include "AliRsnPairMgr.h"
21 #include "AliRsnEventBuffer.h"
22
23 #include "AliMCEventHandler.h"
24 #include "AliESDEvent.h"
25
26 #include "AliRsnAnalysisSE.h"
27
28 ClassImp(AliRsnAnalysisSE)
29
30 //________________________________________________________________________
31 AliRsnAnalysisSE::AliRsnAnalysisSE(const char * name, Int_t bufferSize) :
32   AliRsnAnalysisTaskSEBase(name),
33   fDoesMixing(kFALSE),
34   fMixingNum(0),
35   fMixingCut(0x0),
36   fPairMgrs(0),
37   fOutList(0x0),
38   fBuffer(0x0),
39   fBufferSize(bufferSize)
40 {
41 //
42 // Default constructor
43 //
44
45   InitIOVars();
46   DefineOutput(1, TList::Class());
47 }
48
49 //________________________________________________________________________
50 AliRsnAnalysisSE::~AliRsnAnalysisSE()
51 {
52 //
53 // Destructor
54 //
55 }
56
57 //________________________________________________________________________
58 void AliRsnAnalysisSE::InitIOVars()
59 {
60 //
61 // Init input output values
62 //
63
64   AliRsnAnalysisTaskSEBase::InitIOVars();
65
66   fBuffer = 0;
67   fOutList = 0;
68 }
69
70 //________________________________________________________________________
71 void AliRsnAnalysisSE::UserCreateOutputObjects()
72 {
73 //
74 // UserCreateOutputObjects() of AliAnalysisTaskSE
75 //
76
77   OpenFile(0);
78   fOutList = new TList();
79   fOutList->SetOwner();
80   AliRsnPair *def=0;
81   AliRsnPairMgr *mgr=0;
82   TList *listTmp;
83   fDoesMixing = kFALSE;
84   for (Int_t iMgr=0 ;iMgr< fPairMgrs.GetEntries();iMgr++)
85   {
86     mgr = (AliRsnPairMgr *) fPairMgrs.At(iMgr);
87     if (!mgr) continue;
88     listTmp = new TList();
89     listTmp->SetName(mgr->GetName());
90     for (Int_t i=0;i< mgr->GetPairs()->GetEntriesFast();i++)
91     {
92       def = (AliRsnPair *) mgr->GetPairs()->At(i);
93       if (def)
94       {
95         listTmp->Add(def->GenerateHistograms(mgr->GetName()));
96         if (def->IsMixed()) fDoesMixing = kTRUE;
97       }
98     }
99     fOutList->Add(listTmp);
100   }
101
102   fBuffer = new AliRsnEventBuffer(fBufferSize);
103 }
104
105 //________________________________________________________________________
106 void AliRsnAnalysisSE::UserExec(Option_t *)
107 {
108 //
109 // UserExec() of AliAnalysisTaskSE
110 //
111
112   static UInt_t eventID = 0;
113
114   if (fEntry++ % 100 == 0) cout << "[" << GetName() << "] : processing entry " << fEntry-1 << endl;
115
116   AliRsnEvent *curEvent = GetRsnEventFromInputType();
117   if (!curEvent) return;
118   curEvent->SetUniqueID(eventID++);
119
120   ProcessEventAnalysis(curEvent);
121   PostEventProcess();
122
123   PostData(1, fOutList);
124 }
125
126 //________________________________________________________________________
127 void AliRsnAnalysisSE::Terminate(Option_t *)
128 {
129 //
130 // Terminate() of AliAnalysisTask
131 //
132
133   fOutList = dynamic_cast<TList*>(GetOutputData(1));
134   if (!fOutList) { AliError("At end of analysis, output list is NULL"); return; }
135   //fOutList->Print();
136 }
137
138 //________________________________________________________________________
139 void AliRsnAnalysisSE::ProcessEventAnalysis(AliRsnEvent *curEvent)
140 {
141 //
142 // Process of one event
143 //
144
145   // Adds event to Event Buffer
146   fBuffer->AddEvent(curEvent);
147   Int_t index = fBuffer->GetEventsBufferIndex();
148
149   Int_t nmatches;
150   TArrayI matched(0);
151   if (fDoesMixing) matched = FindGoodMatches(index, nmatches);
152
153   // loop over all Pair managers
154   AliRsnPairMgr *mgr=0;
155   for (Int_t iMgr=0 ;iMgr< fPairMgrs.GetEntries();iMgr++)
156   {
157     mgr = (AliRsnPairMgr *) fPairMgrs.At(iMgr);
158     AliRsnPair *pair=0;
159     for (Int_t i=0;i< mgr->GetPairs()->GetEntriesFast();i++)
160     {
161       pair = (AliRsnPair *) mgr->GetPairs()->At(i);
162       if (!pair->IsMixed()) {
163         pair->ProcessPair(curEvent, 0);
164       }
165       else {
166         Int_t i, iev;
167         for (i = 0; i < matched.GetSize(); i++) {
168           iev = matched[i];
169           if (iev < 0) continue;
170           AliRsnEvent *evmatch = fBuffer->GetEvent(iev);
171           pair->ProcessPair(curEvent, evmatch);
172           if (!pair->IsPairEqual()) pair->ProcessPair(evmatch, curEvent);
173         }
174       }
175     }
176   }
177 }
178
179 //________________________________________________________________________
180 void AliRsnAnalysisSE::PostEventProcess(const Short_t & index)
181 {
182 //
183 // Post process of one event
184 //
185
186   if (fInputType[index] != kRSN) return;
187
188   if (fBuffer->GetDeleteBufferWhenReset() == kFALSE) {
189     fRSN[index] = (AliRsnEvent*) fBuffer->GetNextEvent();
190     SetBranchAddress(0 , "rsnEvents", &fRSN[index]);
191   }
192 }
193
194 //________________________________________________________________________
195 void  AliRsnAnalysisSE::AddPairMgr(AliRsnPairMgr * pairmgr)
196 {
197   fPairMgrs.Add(pairmgr);
198 }
199
200 //________________________________________________________________________
201 void AliRsnAnalysisSE::AddPairMgrFromConfig(TString configfile)
202 {
203   gROOT->LoadMacro(configfile.Data());
204
205   configfile.ReplaceAll(".C","");
206
207   AliRsnPairMgr *mgrRsn = (AliRsnPairMgr *) gROOT->ProcessLine(Form("%s();", configfile.Data()));
208   if (!mgrRsn) return;
209
210   fPairMgrs.Add(mgrRsn);
211 }
212
213 //________________________________________________________________________
214 TArrayI AliRsnAnalysisSE::FindGoodMatches(Int_t iRef, Int_t &foundMatches)
215 {
216   // initialize the output array to the size of required mixed events
217   // and initialize all members to -1
218   Int_t i;
219   TArrayI matched(fMixingNum);
220   for (i = 0; i < fMixingNum; i++) matched[i] = -1;
221   foundMatches = 0;
222
223   // starts from the position behind the reference index
224   // and goes backward; if it reaches the value 0, stops
225   AliRsnEvent *refEvent = fBuffer->GetEvent(iRef);
226   if (!refEvent) return matched;
227   AliRsnEvent *matchEvent = 0x0;
228   Int_t checkIndex;
229   for (checkIndex = iRef - 1; ; checkIndex--) {
230     if (checkIndex < 0) checkIndex = fBuffer->GetEventsBufferSize() - 1;
231     if (checkIndex == iRef) break;
232     matchEvent = fBuffer->GetEvent(checkIndex);
233     if (!matchEvent) continue;
234     if (fMixingCut) {
235       if (!fMixingCut->IsSelected(AliRsnCut::kMixEvent, refEvent, matchEvent)) continue;
236     }
237     // assign to current array slot the matched event
238     // and increment current slot and stops if it exceeds array size
239     matched[foundMatches++] = checkIndex;
240     if (foundMatches >= fMixingNum) break;
241   }
242
243   // returns the current index value,
244   // which is also the number of matched events found
245   return matched;
246 }