1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 #include "Riostream.h" //needed as include
17 #include "AliFlowCommonConstants.h" //needed as include
18 #include "AliFlowCommonHist.h"
19 #include "AliFlowEventSimple.h"
20 #include "AliFlowTrackSimple.h"
24 #include "TMath.h" //needed as include
27 #include "AliFlowVector.h"
35 // Description: Class to organise common histograms for Flow Analysis
37 // authors: N. van der Kolk (kolk@nikhef.nl), A. Bilandzic (anteb@nikhef.nl), RS
40 ClassImp(AliFlowCommonHist)
42 //-----------------------------------------------------------------------
44 AliFlowCommonHist::AliFlowCommonHist():
63 fHistProMeanPtperBin(NULL),
73 AliFlowCommonHist::AliFlowCommonHist(const AliFlowCommonHist& a):
75 fHistMultOrig(new TH1F(*a.fHistMultOrig)),
76 fHistMultRP(new TH1F(*a.fHistMultRP)),
77 fHistMultPOI(new TH1F(*a.fHistMultPOI)),
78 fHistPtRP(new TH1F(*a.fHistPtRP)),
79 fHistPtPOI(new TH1F(*a.fHistPtPOI)),
80 fHistPtSub0(new TH1F(*a.fHistPtSub0)),
81 fHistPtSub1(new TH1F(*a.fHistPtSub1)),
82 fHistPhiRP(new TH1F(*a.fHistPhiRP)),
83 fHistPhiPOI(new TH1F(*a.fHistPhiPOI)),
84 fHistPhiSub0(new TH1F(*a.fHistPhiSub0)),
85 fHistPhiSub1(new TH1F(*a.fHistPhiSub1)),
86 fHistEtaRP(new TH1F(*a.fHistEtaRP)),
87 fHistEtaPOI(new TH1F(*a.fHistEtaPOI)),
88 fHistEtaSub0(new TH1F(*a.fHistEtaSub0)),
89 fHistEtaSub1(new TH1F(*a.fHistEtaSub1)),
90 fHistPhiEtaRP(new TH2F(*a.fHistPhiEtaRP)),
91 fHistPhiEtaPOI(new TH2F(*a.fHistPhiEtaPOI)),
92 fHistProMeanPtperBin(new TProfile(*a.fHistProMeanPtperBin)),
93 fHistQ(new TH1F(*a.fHistQ)),
94 fHarmonic(new TProfile(*a.fHarmonic)),
99 fHistList = new TList();
100 fHistList-> Add(fHistMultOrig);
101 fHistList-> Add(fHistMultRP);
102 fHistList-> Add(fHistMultPOI);
103 fHistList-> Add(fHistPtRP);
104 fHistList-> Add(fHistPtPOI);
105 fHistList-> Add(fHistPtSub0);
106 fHistList-> Add(fHistPtSub1);
107 fHistList-> Add(fHistPhiRP);
108 fHistList-> Add(fHistPhiPOI);
109 fHistList-> Add(fHistPhiSub0);
110 fHistList-> Add(fHistPhiSub1);
111 fHistList-> Add(fHistEtaRP);
112 fHistList-> Add(fHistEtaPOI);
113 fHistList-> Add(fHistEtaSub0);
114 fHistList-> Add(fHistEtaSub1);
115 fHistList-> Add(fHistPhiEtaRP);
116 fHistList-> Add(fHistPhiEtaPOI);
117 fHistList-> Add(fHistProMeanPtperBin);
118 fHistList-> Add(fHarmonic);
119 fHistList-> Add(fHistQ);
120 // TListIter next = TListIter(a.fHistList);
124 // AliFlowCommonHist& AliFlowCommonHist::operator=(const AliFlowCommonHist& a)
126 // *fHistMultOrig = *a.fHistMultOrig;
127 // *fHistMultInt = *a.fHistMultInt;
128 // *fHistMultDiff = *a.fHistMultDiff;
129 // *fHistPtInt = *a.fHistPtInt;
130 // *fHistPtDiff = *a.fHistPtDiff;
131 // *fHistPhiInt = *a.fHistPhiInt;
132 // *fHistPhiDiff = *a.fHistPhiDiff;
133 // *fHistEtaInt = *a.fHistEtaInt;
134 // *fHistEtaDiff = *a.fHistEtaDiff;
135 // *fHistProMeanPtperBin = *a.fHistProMeanPtperBin;
136 // *fHistQ = *a.fHistQ;
137 // // *fHistList = *a.fHistList;
143 //-----------------------------------------------------------------------
145 AliFlowCommonHist::AliFlowCommonHist(const char *anInput,const char *title):
146 TNamed(anInput,title),
163 fHistPhiEtaPOI(NULL),
164 fHistProMeanPtperBin(NULL),
170 //constructor creating histograms
171 Int_t iNbinsMult = AliFlowCommonConstants::GetMaster()->GetNbinsMult();
172 Int_t iNbinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();
173 Int_t iNbinsPhi = AliFlowCommonConstants::GetMaster()->GetNbinsPhi();
174 Int_t iNbinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta();
175 Int_t iNbinsQ = AliFlowCommonConstants::GetMaster()->GetNbinsQ();
178 Double_t dMultMin = AliFlowCommonConstants::GetMaster()->GetMultMin();
179 Double_t dMultMax = AliFlowCommonConstants::GetMaster()->GetMultMax();
180 Double_t dPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin();
181 Double_t dPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax();
182 Double_t dPhiMin = AliFlowCommonConstants::GetMaster()->GetPhiMin();
183 Double_t dPhiMax = AliFlowCommonConstants::GetMaster()->GetPhiMax();
184 Double_t dEtaMin = AliFlowCommonConstants::GetMaster()->GetEtaMin();
185 Double_t dEtaMax = AliFlowCommonConstants::GetMaster()->GetEtaMax();
186 Double_t dQMin = AliFlowCommonConstants::GetMaster()->GetQMin();
187 Double_t dQMax = AliFlowCommonConstants::GetMaster()->GetQMax();
189 cout<<"The settings for the common histograms are as follows:"<<endl;
190 cout<<"Multiplicity: "<<iNbinsMult<<" bins between "<<dMultMin<<" and "<<dMultMax<<endl;
191 cout<<"Pt: "<<iNbinsPt<<" bins between "<<dPtMin<<" and "<<dPtMax<<endl;
192 cout<<"Phi: "<<iNbinsPhi<<" bins between "<<dPhiMin<<" and "<<dPhiMax<<endl;
193 cout<<"Eta: "<<iNbinsEta<<" bins between "<<dEtaMin<<" and "<<dEtaMax<<endl;
194 cout<<"Q: "<<iNbinsQ<<" bins between "<<dQMin<<" and "<<dQMax<<endl;
197 sName = "Control_Flow_OrigMult_";
199 fHistMultOrig = new TH1F(sName.Data(), sName.Data(),iNbinsMult, dMultMin, dMultMax);
200 fHistMultOrig ->SetXTitle("Original Multiplicity");
201 fHistMultOrig ->SetYTitle("Counts");
203 sName = "Control_Flow_MultRP_";
205 fHistMultRP = new TH1F(sName.Data(), sName.Data(),iNbinsMult, dMultMin, dMultMax);
206 fHistMultRP ->SetXTitle("Multiplicity for RP selection");
207 fHistMultRP ->SetYTitle("Counts");
209 sName = "Control_Flow_MultPOI_";
211 fHistMultPOI = new TH1F(sName.Data(), sName.Data(),iNbinsMult, dMultMin, dMultMax);
212 fHistMultPOI ->SetXTitle("Multiplicity for POI selection");
213 fHistMultPOI ->SetYTitle("Counts");
216 sName = "Control_Flow_PtRP_";
218 fHistPtRP = new TH1F(sName.Data(), sName.Data(),iNbinsPt, dPtMin, dPtMax);
219 fHistPtRP ->SetXTitle("P_{t} (GeV/c) for RP selection");
220 fHistPtRP ->SetYTitle("Counts");
222 sName = "Control_Flow_PtPOI_";
224 fHistPtPOI = new TH1F(sName.Data(), sName.Data(),iNbinsPt, dPtMin, dPtMax);
225 //binning has to be the same as for fHistProVPt! use to get Nprime!
226 fHistPtPOI ->SetXTitle("P_{t} (GeV/c) for POI selection");
227 fHistPtPOI ->SetYTitle("Counts");
229 sName = "Control_Flow_PtSub0_";
231 fHistPtSub0 = new TH1F(sName.Data(), sName.Data(),iNbinsPt, dPtMin, dPtMax);
232 fHistPtSub0 ->SetXTitle("P_{t} (GeV/c) for Subevent 0 selection");
233 fHistPtSub0 ->SetYTitle("Counts");
235 sName = "Control_Flow_PtSub1_";
237 fHistPtSub1 = new TH1F(sName.Data(), sName.Data(),iNbinsPt, dPtMin, dPtMax);
238 fHistPtSub1 ->SetXTitle("P_{t} (GeV/c) for Subevent 1 selection");
239 fHistPtSub1 ->SetYTitle("Counts");
242 sName = "Control_Flow_PhiRP_";
244 fHistPhiRP = new TH1F(sName.Data(), sName.Data(),iNbinsPhi, dPhiMin, dPhiMax);
245 fHistPhiRP ->SetXTitle("#phi for RP selection");
246 fHistPhiRP ->SetYTitle("Counts");
248 sName = "Control_Flow_PhiPOI_";
250 fHistPhiPOI = new TH1F(sName.Data(), sName.Data(),iNbinsPhi, dPhiMin, dPhiMax);
251 fHistPhiPOI ->SetXTitle("#phi for POI selection");
252 fHistPhiPOI ->SetYTitle("Counts");
254 sName = "Control_Flow_PhiSub0_";
256 fHistPhiSub0 = new TH1F(sName.Data(), sName.Data(),iNbinsPhi, dPhiMin, dPhiMax);
257 fHistPhiSub0 ->SetXTitle("#phi for Subevent 0 selection");
258 fHistPhiSub0 ->SetYTitle("Counts");
260 sName = "Control_Flow_PhiSub1_";
262 fHistPhiSub1 = new TH1F(sName.Data(), sName.Data(),iNbinsPhi, dPhiMin, dPhiMax);
263 fHistPhiSub1 ->SetXTitle("#phi for Subevent 1 selection");
264 fHistPhiSub1 ->SetYTitle("Counts");
267 sName = "Control_Flow_EtaRP_";
269 fHistEtaRP = new TH1F(sName.Data(), sName.Data(),iNbinsEta, dEtaMin, dEtaMax);
270 fHistEtaRP ->SetXTitle("#eta for RP selection");
271 fHistEtaRP ->SetYTitle("Counts");
273 sName = "Control_Flow_EtaPOI_";
275 fHistEtaPOI = new TH1F(sName.Data(), sName.Data(),iNbinsEta, dEtaMin, dEtaMax);
276 fHistEtaPOI ->SetXTitle("#eta for POI selection");
277 fHistEtaPOI ->SetYTitle("Counts");
279 sName = "Control_Flow_EtaSub0_";
281 fHistEtaSub0 = new TH1F(sName.Data(), sName.Data(),iNbinsEta, dEtaMin, dEtaMax);
282 fHistEtaSub0 ->SetXTitle("#eta for Subevent 0 selection");
283 fHistEtaSub0 ->SetYTitle("Counts");
285 sName = "Control_Flow_EtaSub1_";
287 fHistEtaSub1 = new TH1F(sName.Data(), sName.Data(),iNbinsEta, dEtaMin, dEtaMax);
288 fHistEtaSub1 ->SetXTitle("#eta for Subevent 1 selection");
289 fHistEtaSub1 ->SetYTitle("Counts");
292 sName = "Control_Flow_PhiEtaRP_";
294 fHistPhiEtaRP = new TH2F(sName.Data(), sName.Data(),iNbinsEta, dEtaMin, dEtaMax, iNbinsPhi, dPhiMin, dPhiMax);
295 fHistPhiEtaRP ->SetXTitle("#eta");
296 fHistPhiEtaRP ->SetYTitle("#phi");
298 sName = "Control_Flow_PhiEtaPOI_";
300 fHistPhiEtaPOI = new TH2F(sName.Data(), sName.Data(),iNbinsEta, dEtaMin, dEtaMax, iNbinsPhi, dPhiMin, dPhiMax);
301 fHistPhiEtaPOI ->SetXTitle("#eta");
302 fHistPhiEtaPOI ->SetYTitle("#phi");
305 sName = "Control_FlowPro_MeanPtperBin_";
307 fHistProMeanPtperBin = new TProfile(sName.Data(), sName.Data(),iNbinsPt,dPtMin,dPtMax);
308 fHistProMeanPtperBin ->SetXTitle("P_{t} (GeV/c) ");
309 fHistProMeanPtperBin ->SetYTitle("<P_{t}> (GeV/c) ");
312 sName = "Control_Flow_Q_";
314 fHistQ = new TH1F(sName.Data(), sName.Data(),iNbinsQ, dQMin, dQMax);
315 fHistQ ->SetXTitle("Q_{vector}/Mult");
316 fHistQ ->SetYTitle("Counts");
319 sName = "Control_Flow_Harmonic_";
321 fHarmonic = new TProfile(sName.Data(),sName.Data(),1,0,1);
322 fHarmonic ->SetYTitle("harmonic");
324 //list of histograms if added here also add in copy constructor
325 fHistList = new TList();
326 fHistList-> Add(fHistMultOrig);
327 fHistList-> Add(fHistMultRP);
328 fHistList-> Add(fHistMultPOI);
329 fHistList-> Add(fHistPtRP);
330 fHistList-> Add(fHistPtPOI);
331 fHistList-> Add(fHistPtSub0);
332 fHistList-> Add(fHistPtSub1);
333 fHistList-> Add(fHistPhiRP);
334 fHistList-> Add(fHistPhiPOI);
335 fHistList-> Add(fHistPhiSub0);
336 fHistList-> Add(fHistPhiSub1);
337 fHistList-> Add(fHistEtaRP);
338 fHistList-> Add(fHistEtaPOI);
339 fHistList-> Add(fHistEtaSub0);
340 fHistList-> Add(fHistEtaSub1);
341 fHistList-> Add(fHistPhiEtaRP);
342 fHistList-> Add(fHistPhiEtaPOI);
343 fHistList-> Add(fHistProMeanPtperBin);
344 fHistList-> Add(fHarmonic);
345 fHistList-> Add(fHistQ);
350 //-----------------------------------------------------------------------
352 AliFlowCommonHist::~AliFlowCommonHist()
355 delete fHistMultOrig;
370 delete fHistPhiEtaRP;
371 delete fHistPhiEtaPOI;
372 delete fHistProMeanPtperBin;
379 //-----------------------------------------------------------------------
381 Bool_t AliFlowCommonHist::FillControlHistograms(AliFlowEventSimple* anEvent)
383 //Fills the control histograms
385 cout<<"##### FillControlHistograms: FlowEvent pointer null"<<endl;
389 Double_t dPt, dPhi, dEta, dWeight;
392 //fill the histograms
393 Int_t iNumberOfTracks = anEvent->NumberOfTracks();
394 fHistMultOrig->Fill(iNumberOfTracks);
396 AliFlowVector vQ = anEvent->GetQ();
397 //weight by the Multiplicity
400 if (vQ.GetMult()!=0) {
401 dQX = vQ.X()/vQ.GetMult();
402 dQY = vQ.Y()/vQ.GetMult();
405 fHistQ->Fill(vQ.Mod());
407 Double_t dMultRP = 0.;
408 Double_t dMultPOI = 0.;
410 AliFlowTrackSimple* pTrack = NULL;
412 for (Int_t i=0;i<iNumberOfTracks;i++) {
413 pTrack = anEvent->GetTrack(i);
415 dWeight = pTrack->Weight();
416 if (pTrack->InRPSelection()){
419 fHistPtRP->Fill(dPt,dWeight);
421 dPhi = pTrack->Phi();
422 if (dPhi<0.) dPhi+=2*TMath::Pi();
423 fHistPhiRP->Fill(dPhi,dWeight);
425 dEta = pTrack->Eta();
426 fHistEtaRP->Fill(dEta,dWeight);
428 fHistPhiEtaRP->Fill(dEta,dPhi,dWeight);
431 if (pTrack->InSubevent(0)){
432 //Fill distributions for the subevent
433 fHistPtSub0 -> Fill(dPt,dWeight);
434 fHistPhiSub0 -> Fill(dPhi,dWeight);
435 fHistEtaSub0 -> Fill(dEta,dWeight);
437 else if (pTrack->InSubevent(1)){
438 //Fill distributions for the subevent
439 fHistPtSub1 -> Fill(dPt,dWeight);
440 fHistPhiSub1 -> Fill(dPhi,dWeight);
441 fHistEtaSub1 -> Fill(dEta,dWeight);
444 if (pTrack->InPOISelection()){
447 fHistPtPOI->Fill(dPt,dWeight);
449 dPhi = pTrack->Phi();
450 if (dPhi<0.) dPhi+=2*TMath::Pi();
451 fHistPhiPOI->Fill(dPhi,dWeight);
453 dEta = pTrack->Eta();
454 fHistEtaPOI->Fill(dEta,dWeight);
456 fHistPhiEtaPOI->Fill(dEta,dPhi,dWeight);
458 fHistProMeanPtperBin->Fill(dPt,dPt,dWeight);
465 fHistMultRP->Fill(dMultRP);
466 fHistMultPOI->Fill(dMultPOI);
471 //-----------------------------------------------------------------------
473 Double_t AliFlowCommonHist::GetEntriesInPtBinRP(Int_t aBin)
475 //get entries in bin aBin from fHistPtRP
476 Double_t dEntries = fHistPtRP->GetBinContent(aBin);
482 //-----------------------------------------------------------------------
484 Double_t AliFlowCommonHist::GetEntriesInPtBinPOI(Int_t aBin)
486 //get entries in bin aBin from fHistPtPOI
487 Double_t dEntries = fHistPtPOI->GetBinContent(aBin);
493 //-----------------------------------------------------------------------
495 Double_t AliFlowCommonHist::GetEntriesInEtaBinRP(Int_t aBin)
497 //get entries in bin aBin from fHistPtRP
498 Double_t dEntries = fHistEtaRP->GetBinContent(aBin);
504 //-----------------------------------------------------------------------
506 Double_t AliFlowCommonHist::GetEntriesInEtaBinPOI(Int_t aBin)
508 //get entries in bin aBin from fHistPtPOI
509 Double_t dEntries = fHistEtaPOI->GetBinContent(aBin);
515 //-----------------------------------------------------------------------
517 Double_t AliFlowCommonHist::GetMeanPt(Int_t aBin)
519 //Get entry from bin aBin from fHistProMeanPtperBin
520 Double_t dMeanPt = fHistProMeanPtperBin->GetBinContent(aBin);
527 //-----------------------------------------------------------------------
528 Double_t AliFlowCommonHist::Merge(TCollection *aList)
531 //cout<<"entering merge function"<<endl;
532 if (!aList) return 0;
533 if (aList->IsEmpty()) return 0; //no merging is needed
536 TIter next(aList); // list is supposed to contain only objects of the same type as this
537 AliFlowCommonHist *toMerge;
538 // make a temporary list
539 TList *pTemp = new TList();
540 while ((toMerge=(AliFlowCommonHist*)next())) {
541 pTemp->Add(toMerge->GetHistList());
544 // Now call merge for fHistList providing temp list
545 fHistList->Merge(pTemp);
549 //cout<<"Merged"<<endl;
550 return (double)iCount;
554 void AliFlowCommonHist::Print(Option_t *option) const
556 // -*-*-*-*-*Print some global quantities for this histogram collection class *-*-*-*-*-*-*-*
557 // ===============================================
558 // printf( "TH1.Print Name = %s, Entries= %d, Total sum= %g\n",GetName(),Int_t(fEntries),GetSumOfWeights());
559 printf( "Class.Print Name = %s, Histogram list:\n",GetName());
562 fHistList->Print(option);
566 printf( "Empty histogram list \n");
570 //-----------------------------------------------------------------------
571 void AliFlowCommonHist::Browse(TBrowser *b)
575 if (fHistList) b->Add(fHistList,"AliFlowCommonHistList");