c2b654bc8f5a17c2fb44b7ce95d582efe673c507
[u/mrichter/AliRoot.git] / PWGCF / EBYE / LRC / AliLRCProcess.cxx
1 /**************************************************************************\r
2  * Author: Andrey Ivanov.                                                 *\r
3  * Contributors are mentioned in the code where appropriate.              *\r
4  *                                                                        *\r
5  * Permission to use, copy, modify and distribute this software and its   *\r
6  * documentation strictly for non-commercial purposes is hereby granted   *\r
7  * without fee, provided that the above copyright notice appears in all   *\r
8  * copies and that both the copyright notice and this permission notice   *\r
9  * appear in the supporting documentation. The authors make no claims     *\r
10  * about the suitability of this software for any purpose. It is          *\r
11  * provided "as is" without express or implied warranty.                  *\r
12  **************************************************************************/\r
13 \r
14 // This class is creatig TH2D histogramms for Nch - Nch , Nch - Pt , Pt - Pt \r
15 // dirtributions for given ETA windows and some supplementary data for Long Range Correlation (LRC) analysis .  \r
16 // Class is designid to work with AliAnalysisTaskLRC\r
17 \r
18 // Author : Andrey Ivanov , St.Peterburg State University\r
19 // Email: Andrey.Ivanov@cern.ch\r
20 \r
21 #include "Riostream.h"\r
22 #include "AliLRCProcess.h"\r
23 #include "TH1F.h"\r
24 #include "TH1D.h"\r
25 #include "TH2D.h"\r
26 #include "TProfile.h"\r
27 #include "TList.h"\r
28 #include "TString.h"\r
29 #include "TMath.h"\r
30 ClassImp(AliLRCProcess)\r
31 \r
32 AliLRCProcess::AliLRCProcess():fIsEventOpend(kFALSE), fIsOnline(kFALSE), fDisplayInitOnDemandWarning(kTRUE), fEventCount(0),fStartForwardETA(0), fEndForwardETA(0), fStartForwardPhi(0),fEndForwardPhi(0),fStartBakwardETA(0), fEndBakwardETA(0),fStartBackwardPhi(0),fEndBackwardPhi(0),fHiPt(0),fLoPt(0),fHiMult(0),fLoMult(0),fMultBins(0),fPtBins(0),fSumPtFw(0),  fSumPtBw(0), fSumPtBw2(0), fNchFw(0), fNchBw(0),fOutList(0), fShortDef(0),fOutputSlot(0), fHistPt(0),fHistEta(0),fHistNN(0),fHistPtN(0),fHistPtPt(0),fProfNberr(0),fProfNberrPtPt(0),fProfdPtB(0),fProfTestLRC(0),fHistPtForward(0),fHistEtaForward(0),fHistNchForward(0),fHistPhiForward(0),fHistPtBakward(0),fHistEtaBakward(0),fHistNchBakward(0),fHistPhiBakward(0){};\r
33 \r
34 AliLRCProcess::AliLRCProcess(Double_t _StartForwardETA,Double_t _EndForwardETA,Double_t _StartBakwardETA,Double_t _EndBakwardETA): fIsEventOpend(kFALSE), fIsOnline(kFALSE), fDisplayInitOnDemandWarning(kTRUE), fEventCount(0),fStartForwardETA(0), fEndForwardETA(0), fStartForwardPhi(0),fEndForwardPhi(0),fStartBakwardETA(0), fEndBakwardETA(0),fStartBackwardPhi(0),fEndBackwardPhi(0),fHiPt(0),fLoPt(0),fHiMult(0),fLoMult(0),fMultBins(0),fPtBins(0),fSumPtFw(0),  fSumPtBw(0), fSumPtBw2(0),fNchFw(0), fNchBw(0),fOutList(0), fShortDef(0),fOutputSlot(0), fHistPt(0),fHistEta(0),fHistNN(0),fHistPtN(0),fHistPtPt(0),fProfNberr(0),fProfNberrPtPt(0),fProfdPtB(0),fProfTestLRC(0),fHistPtForward(0),fHistEtaForward(0),fHistNchForward(0),fHistPhiForward(0),fHistPtBakward(0),fHistEtaBakward(0),fHistNchBakward(0),fHistPhiBakward(0)\r
35 {\r
36 // Constructor with window setup makes ready-to-run processor\r
37 fEventCount=0;\r
38 \r
39 SetETAWindows( _StartForwardETA, _EndForwardETA,_StartBakwardETA,_EndBakwardETA);\r
40 SetHistPtRange(0.0,4.0,200);\r
41 SetHistMultRange(0,100);  \r
42 SetForwardWindowPhi(0,2*TMath::Pi());\r
43 SetBackwardWindowPhi(0,2*TMath::Pi());\r
44 }\r
45 \r
46 Bool_t AliLRCProcess::InitDataMembers()\r
47 {\r
48 // This method is actualy creating output histogramms\r
49 // Thist method  is to be called in CreateOutputObjects method of AliAnalysisTask\r
50 //cout<<" # Init for "<<fShortDef<<" this="<<this<<"\n";\r
51 if(fIsOnline)\r
52 {\r
53 Printf("Can't init data members more then one time! \n");\r
54 return kFALSE;\r
55 }\r
56 fEventCount=0;\r
57 fOutList = new TList();\r
58 fOutList->SetName(fShortDef);\r
59 \r
60    Double_t loMult,hiMult;\r
61    \r
62    loMult=fLoMult-0.5;\r
63    hiMult=fHiMult+0.5;\r
64 \r
65    // Window statistics histograms\r
66   \r
67    // Forward\r
68   \r
69   fHistPtForward = new TH1D("fHistPtForward", "P_{T} distribution in Forward window", 100, 0.0, 5);\r
70   fHistPtForward->GetXaxis()->SetTitle("P_{T} (GeV/c)");\r
71   fHistPtForward->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");\r
72   fHistPtForward->SetMarkerStyle(kFullCircle);\r
73   \r
74   \r
75   fHistEtaForward = new TH1D("fEtaForward", "#eta distribution in Forward window", 200, -2, 2);\r
76   fHistEtaForward->GetXaxis()->SetTitle("ETA");\r
77   fHistEtaForward->GetYaxis()->SetTitle("dN/ETA");\r
78   fHistEtaForward->SetMarkerStyle(kFullCircle);\r
79   \r
80     \r
81   fHistNchForward = new TH1D("fHistNchForward", "N_{ch} distribution in Forward window", fMultBins, loMult, hiMult);\r
82   fHistNchForward->GetXaxis()->SetTitle("N_{ch}");\r
83   fHistNchForward->GetYaxis()->SetTitle("dN/dN_{ch}");\r
84   fHistNchForward->SetMarkerStyle(kFullCircle);\r
85   \r
86   \r
87   fHistPhiForward = new TH1D("fPhiForward", "Phi distribution in Forward window", 36, 0, 2*TMath::Pi());\r
88   fHistPhiForward->GetXaxis()->SetTitle("Phi");\r
89   fHistPhiForward->GetYaxis()->SetTitle("dN/Phi");\r
90   fHistPhiForward->SetMarkerStyle(kFullCircle);\r
91   \r
92   \r
93  \r
94      // Bakward\r
95   \r
96   fHistPtBakward = new TH1D("fHistPtBakward", "P_{T} distribution in Bakward window", 100, 0.0, 5);\r
97   fHistPtBakward->GetXaxis()->SetTitle("P_{T} (GeV/c)");\r
98   fHistPtBakward->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");\r
99   fHistPtBakward->SetMarkerStyle(kFullCircle);\r
100   \r
101   \r
102   fHistEtaBakward = new TH1D("fEtaBakward", "#eta distribution in Bakward window", 200, -2, 2);\r
103   fHistEtaBakward->GetXaxis()->SetTitle("ETA");\r
104   fHistEtaBakward->GetYaxis()->SetTitle("dN/ETA");\r
105   fHistEtaBakward->SetMarkerStyle(kFullCircle);\r
106   \r
107   \r
108   fHistNchBakward = new TH1D("fHistNchBakward", "N_{ch} distribution in Bakward window", fMultBins, loMult, hiMult);\r
109   fHistNchBakward->GetXaxis()->SetTitle("P_{T} (GeV/c)");\r
110   fHistNchBakward->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");\r
111   fHistNchBakward->SetMarkerStyle(kFullCircle);\r
112 \r
113   fHistPhiBakward = new TH1D("fPhiBakward", "#Phi distribution in Bakward window", 36, 0, 2*TMath::Pi());\r
114   fHistPhiBakward->GetXaxis()->SetTitle("Phi");\r
115   fHistPhiBakward->GetYaxis()->SetTitle("dN/Phi");\r
116   fHistPhiBakward->SetMarkerStyle(kFullCircle);\r
117   \r
118 \r
119     //Overal statistics histograms\r
120   \r
121   fHistPt = new TH1F("fHistPt", "P_{T} distribution", 100, 0.0, 5.0);\r
122   fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");\r
123   fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");\r
124   fHistPt->SetMarkerStyle(kFullCircle);\r
125   \r
126   \r
127   fHistEta = new TH1F("fHistEta", "#eta distribution", 200, -2, 2);\r
128   fHistEta->GetXaxis()->SetTitle("ETA");\r
129   fHistEta->GetYaxis()->SetTitle("dN/ETA");\r
130   fHistEta->SetMarkerStyle(kFullCircle);\r
131     \r
132     \r
133     \r
134     // -------- LRC histograms\r
135   \r
136   fHistNN = new TH2D("NN","NN",fMultBins, loMult, hiMult,fMultBins, loMult, hiMult);\r
137   fHistPtN = new TH2D("PtN","PtN",fMultBins, loMult, hiMult,fPtBins,fLoPt,fHiPt);\r
138   fHistPtPt = new TH2D("PtPt","PtPt",fPtBins,fLoPt,fHiPt,fPtBins,fLoPt,fHiPt);\r
139   fProfNberr = new TProfile("nber","nber",fMultBins, loMult, hiMult);\r
140   fProfNberrPtPt = new TProfile("nberPtPt","nberPtPt",fPtBins,fLoPt,fHiPt);\r
141   fProfdPtB = new TProfile("dPtB","Overal multievent Pt_Backward (first bin) Pt_Backward^2 (sec. bin) ",16,0.5,16.5);  \r
142   fProfTestLRC = new TProfile("TestLRC","Test LRC calculaion via TProfile",fMultBins, loMult, hiMult);  \r
143 \r
144 \r
145    // ---------- Adding data members to output list\r
146   \r
147   // Adding overal statistics\r
148   \r
149   fOutList->Add(fHistPt);\r
150   fOutList->Add(fHistEta);\r
151   \r
152   //Adding LRC hists\r
153   \r
154   fOutList->Add(fHistNN);\r
155   fOutList->Add(fHistPtN);\r
156   fOutList->Add(fHistPtPt);\r
157   fOutList->Add(fProfNberr);\r
158   fOutList->Add(fProfNberrPtPt);\r
159   fOutList->Add(fProfdPtB);\r
160   fOutList->Add(fProfTestLRC);\r
161 \r
162   \r
163   //Adding window statistics\r
164 \r
165   fOutList->Add(fHistPtForward);\r
166   fOutList->Add(fHistEtaForward);\r
167   fOutList->Add(fHistNchForward);\r
168   fOutList->Add(fHistPtBakward);\r
169   fOutList->Add(fHistEtaBakward);\r
170   fOutList->Add(fHistNchBakward);\r
171   fOutList->Add(fHistPhiBakward);\r
172   fOutList->Add(fHistPhiForward);\r
173   \r
174   // Adding status to dPtB\r
175   \r
176   fProfdPtB->Fill(3 , fStartForwardETA);\r
177   fProfdPtB->Fill(4 , fEndForwardETA);\r
178   fProfdPtB->Fill(5 , fStartBakwardETA);\r
179   fProfdPtB->Fill(6 , fEndBakwardETA);\r
180   fProfdPtB->Fill(7 , fStartForwardPhi);\r
181   fProfdPtB->Fill(8 , fEndForwardPhi);\r
182   fProfdPtB->Fill(9 , fStartBackwardPhi);\r
183   fProfdPtB->Fill(10 , fEndBackwardPhi);\r
184   \r
185 \r
186 \r
187 \r
188 fIsOnline=kTRUE;\r
189 return kTRUE;\r
190 }\r
191 AliLRCProcess::~AliLRCProcess()\r
192 {\r
193 //Destructor\r
194 \r
195 }\r
196 \r
197 // ---------------------------------------  Setters ------------------\r
198   void AliLRCProcess::SetShortDef()\r
199   {\r
200   // Creating task and output container name \r
201    char str[80];\r
202    snprintf(str,80, "TaskLRCw%3.1fto%3.1fvs%3.1fto%3.1f",fStartForwardETA,fEndForwardETA,fStartBakwardETA,fEndBakwardETA);\r
203 \r
204    fShortDef= str;\r
205 \r
206   }\r
207 \r
208   void AliLRCProcess::SetForwardWindow(Double_t StartETA,Double_t EndETA)\r
209   {\r
210     //setter for the forward eta window\r
211   fStartForwardETA=StartETA;\r
212   fEndForwardETA=EndETA;\r
213   SetShortDef();\r
214   }\r
215   void AliLRCProcess::SetBackwardWindow(Double_t StartETA,Double_t EndETA)\r
216   {\r
217     //setter for the backward eta window\r
218   fStartBakwardETA=StartETA;\r
219   fEndBakwardETA=EndETA;\r
220   SetShortDef();\r
221   }\r
222   void AliLRCProcess::SetETAWindows(Double_t _StartForwardETA,Double_t _EndForwardETA,Double_t _StartBakwardETA,Double_t _EndBakwardETA)\r
223   {\r
224   //setter for the eta windows\r
225   fStartForwardETA=_StartForwardETA;\r
226   fEndForwardETA=_EndForwardETA;\r
227   fStartBakwardETA=_StartBakwardETA;\r
228   fEndBakwardETA=_EndBakwardETA;\r
229   SetShortDef();\r
230   }\r
231 \r
232   void AliLRCProcess::SetHistPtRange(Double_t LoPt,Double_t HiPt,Int_t PtBins)\r
233   {\r
234 // Sets Pt range and number of bins for Pt axis of histos\r
235   if(fIsOnline)\r
236   {\r
237     Printf("Can't change histos paramiters after InitDataMembers() was called! \n");\r
238     return ;\r
239   }\r
240   // Setter for Pt range and N bins in histos\r
241   fLoPt=LoPt;\r
242   fHiPt=HiPt;\r
243   fPtBins=PtBins;  \r
244   }\r
245   void AliLRCProcess::SetHistMultRange(Int_t LoMult,Int_t HiMult,Int_t MultBins)\r
246   {\r
247   // Setter for multiplicity range and N bins in histos\r
248   if(fIsOnline)\r
249   {\r
250     Printf("Can't change histos paramiters after InitDataMembers() was called! \n");\r
251     return ;\r
252   }\r
253   fLoMult=LoMult;\r
254   fHiMult=HiMult;\r
255   if(!MultBins)\r
256         {\r
257         fMultBins=fHiMult-fLoMult+1;\r
258         }else\r
259         {\r
260         fMultBins=MultBins;  \r
261         }\r
262   }\r
263 \r
264   void AliLRCProcess::SetOutputSlotNumber(Int_t SlotNumber)\r
265   {\r
266   //Sets number of output slot for LRCProcessor\r
267   fOutputSlot=SlotNumber;\r
268   }\r
269 \r
270 //________________________________________________________________________\r
271 \r
272 \r
273 \r
274 TList*   AliLRCProcess::CreateOutput() const\r
275 {\r
276 // Creates a link to output data TList\r
277 return fOutList;\r
278 }\r
279 \r
280  TString  AliLRCProcess::GetShortDef() const\r
281 {\r
282 return fShortDef;\r
283 }\r
284 \r
285 Int_t AliLRCProcess::GetOutputSlotNumber() const\r
286 {\r
287 // Returns number of output slot for LRCProcessor\r
288 return fOutputSlot;\r
289 }\r
290 \r
291 void AliLRCProcess::StartEvent()\r
292 {\r
293 // Open new Event for track by track event import\r
294 if(fIsEventOpend)                     // Check if trying to open event more than once !\r
295         {Printf("Event is already opened! Auto finishing ! \n");\r
296          cout<<fShortDef<<": event count = "<<fEventCount<<" ";\r
297          Printf("NchF = %i,NchB = %i \n",fNchFw,fNchBw);\r
298          \r
299          FinishEvent();\r
300         }\r
301 if(!fIsOnline)                        // Autocreating histos if InitDataMembers was not called by hand\r
302\r
303 Printf("InitDataMembers was not called by hand ! Autocreating histos...\n");\r
304 InitDataMembers();\r
305 }\r
306 \r
307 fNchFw=0;\r
308 fSumPtFw=0;\r
309 fNchBw=0;\r
310 fSumPtBw=0;\r
311 fSumPtBw2=0;\r
312 \r
313 fIsEventOpend=kTRUE;\r
314 }\r
315 void AliLRCProcess::AddTrackForward(Double_t Pt, Double_t Eta ,Double_t Phi)\r
316 {\r
317 // Imports track to the event directly to Forward window\r
318 if(!fIsEventOpend)\r
319         {Printf("Event is not opened!\n");\r
320         return;}\r
321 \r
322 fNchFw++;\r
323 fSumPtFw+=Pt;\r
324 fHistPtForward->Fill(Pt);\r
325 fHistEtaForward->Fill(Eta);\r
326 fHistPhiForward->Fill(Phi);\r
327 \r
328 }\r
329 void AliLRCProcess::AddTrackBackward(Double_t Pt, Double_t Eta ,Double_t Phi)\r
330 {\r
331 // Imports track to the event directly to Backward window\r
332 if(!fIsEventOpend)\r
333         {Printf("Event is not opened!\n");\r
334         return;}\r
335         \r
336 fNchBw++;\r
337 fSumPtBw+=Pt;\r
338 fSumPtBw2+=Pt*Pt;\r
339 fProfdPtB->Fill(1,Pt); \r
340 fProfdPtB->Fill(2,Pt*Pt);\r
341 fHistPtBakward->Fill(Pt);\r
342 fHistEtaBakward->Fill(Eta);\r
343 fHistPhiBakward->Fill(Phi);\r
344 }\r
345 \r
346 \r
347 \r
348 void AliLRCProcess::AddTrackPtEta(Double_t Pt, Double_t Eta ,Double_t Phi)\r
349 {\r
350 //Track by track event import :  Imports track to the event \r
351 \r
352 if(!fIsEventOpend)\r
353         {Printf("Event is not opened!\n");\r
354         return;}\r
355 \r
356     //  Glabal trak data\r
357     fHistPt->Fill(Pt);\r
358     fHistEta->Fill(Eta);\r
359 \r
360 \r
361     //Forward window\r
362     if( (fStartForwardETA<Eta)&&(Eta<fEndForwardETA))\r
363     if( (fStartForwardPhi<Phi)&&(Phi<fEndForwardPhi))\r
364         AddTrackForward(Pt,Eta,Phi);\r
365 \r
366     //Backward window\r
367     if((fStartBakwardETA<Eta)&&(Eta<fEndBakwardETA))\r
368     if((fStartBackwardPhi<Phi)&&(Phi<fEndBackwardPhi))\r
369         AddTrackBackward(Pt,Eta,Phi);\r
370 \r
371 }\r
372 void AliLRCProcess::FinishEvent()\r
373 {\r
374 // Track by track event import : Close opened event and fill event summary histos\r
375 \r
376 if(!fIsEventOpend)\r
377         {Printf("Event is not opened!\n");\r
378         return;}\r
379 \r
380  //Filling even-total data\r
381   \r
382   fHistNN->Fill(fNchFw,fNchBw);\r
383   \r
384   if(fNchBw!=0)\r
385   {\r
386         fSumPtBw=fSumPtBw/fNchBw;\r
387         fProfTestLRC->Fill(fNchFw,fSumPtBw);\r
388         fHistPtN->Fill(fNchFw,fSumPtBw);\r
389         fProfNberr->Fill(fNchFw,1.0/fNchBw);\r
390         \r
391         if(fNchFw!=0)\r
392         {\r
393                 fSumPtFw=fSumPtFw/fNchFw;\r
394                 fHistPtPt->Fill(fSumPtFw,fSumPtBw);\r
395                 fProfNberrPtPt->Fill(fSumPtFw,1.0/fNchBw);\r
396                 // dPtB for PtPt\r
397                 fProfdPtB->Fill(15,fSumPtBw,fNchBw);\r
398                 fProfdPtB->Fill(16,fSumPtBw2/fNchBw,fNchBw);\r
399         }\r
400   }\r
401         \r
402   \r
403  fHistNchForward->Fill(fNchFw);\r
404  fHistNchBakward->Fill(fNchBw);\r
405 \r
406 fEventCount++;\r
407 fIsEventOpend=kFALSE;\r
408 //cout<<fShortDef<<": event count = "<<fEventCount<<" ";\r
409 //       Printf("NchF = %i,NchB = %i",fNchFw,fNchBw);\r
410 }\r
411 \r