]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
move nested loops calculations for testing purposes to seperate class
authorsnelling <snelling@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Mar 2010 12:48:10 +0000 (12:48 +0000)
committersnelling <snelling@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Mar 2010 12:48:10 +0000 (12:48 +0000)
PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithNestedLoops.cxx [new file with mode: 0644]
PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithNestedLoops.h [new file with mode: 0644]
PWG2/FLOW/macros/runFlowAnalysisOnTheFly.C
PWG2/PWG2flowCommonLinkDef.h
PWG2/libPWG2flowCommon.pkg

diff --git a/PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithNestedLoops.cxx b/PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithNestedLoops.cxx
new file mode 100644 (file)
index 0000000..41733e7
--- /dev/null
@@ -0,0 +1,492 @@
+/*************************************************************************\r
+* Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *\r
+*                                                                        *\r
+* Author: The ALICE Off-line Project.                                    *\r
+* Contributors are mentioned in the code where appropriate.              *\r
+*                                                                        *\r
+* Permission to use, copy, modify and distribute this software and its   *\r
+* documentation strictly for non-commercial purposes is hereby granted   *\r
+* without fee, provided that the above copyright notice appears in all   *\r
+* copies and that both the copyright notice and this permission notice   *\r
+* appear in the supporting documentation. The authors make no claims     *\r
+* about the suitability of this software for any purpose. It is          *\r
+* provided "as is" without express or implied warranty.                  * \r
+**************************************************************************/
+
+/* $Id$ */\r
+\r
+/*************************************************************** 
+ * Only in this class nested loops are used for flow analysis. *
+ * Nested loops are used to evaluate:                          *
+ *                                                             *  
+ *  a) Distribution of relative angle difference (phi1-phi2).  *
+ *                                                             *
+ *       Author: Ante Bilandzic (abilandzic@gmail.com)         *
+ ***************************************************************/ \r
+\r
+#define AliFlowAnalysisWithNestedLoops_cxx\r
+\r
+#include "Riostream.h"\r
+#include "AliFlowCommonConstants.h"\r
+#include "AliFlowCommonHist.h"\r
+#include "AliFlowCommonHistResults.h"\r
+\r
+#include "TMath.h"\r
+#include "TFile.h"\r
+#include "TList.h"\r
+#include "TProfile.h"\r
+\r
+#include "AliFlowEventSimple.h"\r
+#include "AliFlowTrackSimple.h"\r
+#include "AliFlowAnalysisWithNestedLoops.h"\r
+\r
+class TH1;\r
+class TList;\r\r
+ClassImp(AliFlowAnalysisWithNestedLoops)\r
+\r
+//================================================================================================================
+
+AliFlowAnalysisWithNestedLoops::AliFlowAnalysisWithNestedLoops(): \r
+fHistList(NULL),
+fHistListName(NULL),\r
+fAnalysisLabel(NULL),
+fAnalysisSettings(NULL),\r
+fCommonHists(NULL),
+fnBinsPhi(0),\r
+fPhiMin(0),\r
+fPhiMax(0),\r
+fPhiBinWidth(0),\r
+fnBinsPt(0),\r
+fPtMin(0),\r
+fPtMax(0),\r
+fPtBinWidth(0),\r
+fnBinsEta(0),\r
+fEtaMin(0),\r
+fEtaMax(0),\r
+fEtaBinWidth(0),
+fWeightsList(NULL),\r
+fUsePhiWeights(kFALSE),\r
+fUsePtWeights(kFALSE),\r
+fUseEtaWeights(kFALSE),\r
+fUseParticleWeights(NULL),\r
+fPhiWeights(NULL),\r
+fPtWeights(NULL),\r
+fEtaWeights(NULL),
+fResultsList(NULL),
+fRelativeAngleDistribution(NULL)\r
+{\r
+ // Constructor. \r
\r // Base list to hold all output objects:\r
+ fHistList = new TList();
+ fHistListName = new TString("cobjNL");\r
+ fHistList->SetName(fHistListName->Data());\r
+ fHistList->SetOwner(kTRUE);
+ // List to hold histograms with phi, pt and eta weights:      \r
+ fWeightsList = new TList();
+ // List to hold objects with final results:      \r
+ fResultsList = new TList();
\r
+} // AliFlowAnalysisWithNestedLoops::AliFlowAnalysisWithNestedLoops()\r
\r
+//================================================================================================================  \r
+\r
+AliFlowAnalysisWithNestedLoops::~AliFlowAnalysisWithNestedLoops()\r
+{\r
+ // Destructor.\r
\r
+ delete fHistList;\r
+\r
+} // end of AliFlowAnalysisWithNestedLoops::~AliFlowAnalysisWithNestedLoops()\r
+\r
+//================================================================================================================\r
+\r
+void AliFlowAnalysisWithNestedLoops::Init()\r
+{
+ // Initialize and book all objects. 
+ // a) Cross check if the user settings make sense before starting; 
+ // b) Access all common constants;
+ // c) Book and nest all lists in the base list fHistList;
+ // d) Book profile holding seetings for analysis with nested loops;\r
+ // e) Book common control histograms;
+ // f) Book all objects relevant for distributions;
+ // g) Book and fill histograms to hold phi, pt and eta weights.
+ this->CrossCheckSettings();\r
+ this->AccessConstants();
+ this->BookAndNestAllLists();
+ this->BookProfileHoldingSettings();\r
+ this->BookCommonHistograms();
+ this->BookEverythingForDistributions();
+ this->BookAndFillWeightsHistograms();\r
+\r
+} // end of void AliFlowAnalysisWithNestedLoops::Init()\r
+\r
+//================================================================================================================\r
+\r
+void AliFlowAnalysisWithNestedLoops::Make(AliFlowEventSimple* anEvent)\r
+{\r
+ // Running over data only in this method.\r
+ // a) Check all pointers used in method Make();
+ // b) Define local variables;
+ // c) Fill common control histograms;
+ // d) Loop over data and store for each distinct pair phi1-phi2 in fRelativeAngleDistribution.\r
+ // a) Check all pointers used in method Make():
+ this->CheckPointersUsedInMake();
+ // b) Define local variables:
+ Double_t dPhi1=0., dPhi2=0.; // azimuthal angles in the laboratory frame\r
+ AliFlowTrackSimple *aftsTrack = NULL; // simple track
+ // c) Fill common control histograms:
+ fCommonHists->FillControlHistograms(anEvent);  
+ // d) Loop over data and store for each distinct pair phi1-phi2 in fRelativeAngleDistribution:\r
+ Int_t nPrim = anEvent->NumberOfTracks();  // nPrim = total number of primary tracks, i.e. nPrim = nRP + nPOI + rest, where:\r
+                                           // nRP   = # of particles used to determine the reaction plane ("Reference Particles");\r
+                                           // nPOI  = # of particles of interest for a detailed flow analysis ("Particles of Interest");\r
+                                           // rest  = # of particles which are not niether RPs nor POIs.  \r
+ // Start nested loops over data:
+ for(Int_t i=0;i<nPrim;i++) \r
+ { \r
+  aftsTrack=anEvent->GetTrack(i);\r
+  if(aftsTrack)
+  {\r
+   if(!aftsTrack->InRPSelection()) continue; // consider only tracks which are RPs \r
+   dPhi1 = aftsTrack->Phi();
+   for(Int_t j=0;j<nPrim;j++) \r
+   { \r
+    if(j==i) continue; // eliminating trivial contribution from autocorrelation
+    aftsTrack=anEvent->GetTrack(j);\r
+    if(aftsTrack)
+    {\r
+     if(!aftsTrack->InRPSelection()) continue; // consider only tracks which are RPs \r
+     dPhi2 = aftsTrack->Phi();
+     // Fill the histogram:
+     fRelativeAngleDistribution->Fill(dPhi1-dPhi2);
+    }
+   } // end of for(Int_t j=0;j<nPrim;j++)\r
+  } else // to if(aftsTrack)\r
+    {\r
+     cout<<endl;\r
+     cout<<" WARNING (NL): No particle! (i.e. aftsTrack is a NULL pointer in AFAWNL::Make().)"<<endl;\r
+     cout<<endl;       \r
+    }
+    \r
+ } // end of for(Int_t i=0;i<nPrim;i++) 
+  \r
+} // end of AliFlowAnalysisWithNestedLoops::Make(AliFlowEventSimple* anEvent)\r\r
+//================================================================================================================\r
+\r
+void AliFlowAnalysisWithNestedLoops::Finish()\r
+{\r
+ // Calculate the final results.
+ // a) Check all pointers used in this method;
+ // b) Access settings for analysis with mixed harmonics;
+ this->CheckPointersUsedInFinish();
+ this->AccessSettings();\r
+                                                                                                                                                                                                                                                                                                               \r
+} // end of AliFlowAnalysisWithNestedLoops::Finish()\r
+\r
+//================================================================================================================\r
+\r
+void AliFlowAnalysisWithNestedLoops::GetOutputHistograms(TList *outputListHistos)\r
+{\r
+ // Get pointers to all objects saved in the output file.
+ // a) Get pointers for common control histograms.\r \r
+ if(outputListHistos)\r
+ {     \r
+  this->SetHistList(outputListHistos);
+  if(!fHistList)
+  {
+   cout<<endl;
+   cout<<" WARNING (NL): fHistList is NULL in AFAWNL::GOH() !!!!"<<endl;
+   cout<<endl;
+   exit(0);
+  }
+  this->GetPointersForCommonHistograms();
+  this->GetPointersForResultsHistograms();\r
+ } else 
+   {
+    cout<<endl;
+    cout<<" WARNING (NL): outputListHistos is NULL in AFAWNL::GOH() !!!!"<<endl;
+    cout<<endl;
+    exit(0);
+   }
+   \r
+} // end of void AliFlowAnalysisWithNestedLoops::GetOutputHistograms(TList *outputListHistos)\r
+\r
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::GetPointersForCommonHistograms() \r
+{\r
+ // Get pointers to common control histograms.\r
\r
+ TString commonHistsName = "AliFlowCommonHistNL";\r
+ AliFlowCommonHist *commonHist = dynamic_cast<AliFlowCommonHist*>(fHistList->FindObject(commonHistsName.Data()));\r
+ if(commonHist) 
+ {
+  this->SetCommonHists(commonHist); 
+ } else
+   {
+    cout<<endl;
+    cout<<" WARNING (NL): commonHist is NULL in AFAWNL::GPFCH() !!!!"<<endl;
+    cout<<endl;
+    exit(0);  
+   }
+} // end of void AliFlowAnalysisWithNestedLoops::GetPointersForCommonHistograms()
+
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::GetPointersForResultsHistograms() \r
+{\r
+ // Get pointers to histograms holding final results.\r
\r
+ TList *resultsList = NULL;\r
+ resultsList = dynamic_cast<TList*>(fHistList->FindObject("Results"));\r
+ if(!resultsList) \r
+ {\r
+  cout<<"WARNING: resultsList is NULL in AFAWNL::GPFRH() !!!!"<<endl;\r
+  exit(0); \r
+ }  
+ TString relativeAngleDistributionName = "fRelativeAngleDistribution";\r
+ TH1D *relativeAngleDistribution = dynamic_cast<TH1D*>(resultsList->FindObject(relativeAngleDistributionName.Data()));\r
+ if(relativeAngleDistribution)\r
+ {\r
+  this->SetRelativeAngleDistribution(relativeAngleDistribution);  \r
+ }
+  
+} // end of void AliFlowAnalysisWithNestedLoops::GetPointersForResultsHistograms()
+\r
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::WriteHistograms(TString outputFileName)\r
+{\r
+ // Store the final results in output .root file.\r
+ TFile *output = new TFile(outputFileName.Data(),"RECREATE");\r
+ fHistList->Write(fHistList->GetName(),TObject::kSingleKey);\r
+ delete output;\r
+}\r
+\r
+//================================================================================================================\r
+
+void AliFlowAnalysisWithNestedLoops::WriteHistograms(TDirectoryFile *outputFileName)
+{
+ // Store the final results in output .root file.
+ fHistList->SetName("cobjNL");
+ fHistList->SetOwner(kTRUE);
+ outputFileName->Add(fHistList);
+ outputFileName->Write(outputFileName->GetName(),TObject::kSingleKey);
+}
+
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::BookAndNestAllLists()\r
+{
+ // Book and nest all list in base list fHistList.
+
+ // Weights:
+ fWeightsList->SetName("Weights");\r
+ fWeightsList->SetOwner(kTRUE);   \r
+ fHistList->Add(fWeightsList); 
+ // Results:
+ fResultsList->SetName("Results");\r
+ fResultsList->SetOwner(kTRUE);   \r
+ fHistList->Add(fResultsList); 
+
+} // end of void AliFlowAnalysisWithNestedLoops::BookAndNestAllLists()
+
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::BookProfileHoldingSettings()\r
+{
+ // Book profile to hold all analysis settings.
+
+ TString analysisSettingsName = "fAnalysisSettings";\r
+ fAnalysisSettings = new TProfile(analysisSettingsName.Data(),"Settings for analysis with nested loops",1,0,1);
+ //fAnalysisSettings->GetXaxis()->SetBinLabel(1," ... ");
+ //fAnalysisSettings->Fill(0.5, ... );\r
+ fHistList->Add(fAnalysisSettings);
+} // end of void AliFlowAnalysisWithNestedLoops::BookProfileHoldingSettings()
+\r
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::BookCommonHistograms()\r
+{\r
+ // Book common control histograms and common histograms for final results.
\r
+ TString commonHistsName = "AliFlowCommonHistNL";\r
+ fCommonHists = new AliFlowCommonHist(commonHistsName.Data());\r
+ fHistList->Add(fCommonHists);  \r
\r
+} // end of void AliFlowAnalysisWithNestedLoops::BookCommonHistograms()\r
+
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::BookEverythingForDistributions()\r
+{\r
+ // Book all objects relevant for distributions.
+ // Histogram to hold distribution of phi1-phi2:
+ TString relativeAngleDistributionName = "fRelativeAngleDistribution";\r
+ fRelativeAngleDistribution = new TH1D(relativeAngleDistributionName.Data(),"Relative angle distribution",720,-TMath::TwoPi(),TMath::TwoPi());
+ fRelativeAngleDistribution->GetYaxis()->SetTitle("#frac{dN}{#Delta #phi}"); 
+ fRelativeAngleDistribution->GetXaxis()->SetTitle("#Delta #phi");
+ fResultsList->Add(fRelativeAngleDistribution);
+
+} // end fo void AliFlowAnalysisWithNestedLoops::BookEverythingForDistributions()
+\r
+//================================================================================================================
+
+void AliFlowAnalysisWithNestedLoops::AccessConstants()\r
+{\r
+ // Access needed common constants from AliFlowCommonConstants.\r
\r
+ fnBinsPhi = AliFlowCommonConstants::GetMaster()->GetNbinsPhi();\r
+ fPhiMin = AliFlowCommonConstants::GetMaster()->GetPhiMin();        \r
+ fPhiMax = AliFlowCommonConstants::GetMaster()->GetPhiMax();\r
+ if(fnBinsPhi) fPhiBinWidth = (fPhiMax-fPhiMin)/fnBinsPhi;  \r
+ fnBinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();\r
+ fPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin();          \r
+ fPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax();\r
+ if(fnBinsPt) fPtBinWidth = (fPtMax-fPtMin)/fnBinsPt;  \r
+ fnBinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta();\r
+ fEtaMin = AliFlowCommonConstants::GetMaster()->GetEtaMin();        \r
+ fEtaMax = AliFlowCommonConstants::GetMaster()->GetEtaMax();\r
+ if(fnBinsEta) fEtaBinWidth = (fEtaMax-fEtaMin)/fnBinsEta;  \r
\r
+} // end of void AliFlowAnalysisWithNestedLoops::AccessConstants()
+
+//================================================================================================================\r
+\r
+void AliFlowAnalysisWithNestedLoops::CrossCheckSettings()\r
+{\r
+ // Cross-check if the user settings make sense. \r
\r
+} // end of void AliFlowAnalysisWithNestedLoops::CrossCheckSettings()\r
+
+//================================================================================================================\r
+
+void AliFlowAnalysisWithNestedLoops::BookAndFillWeightsHistograms()\r
+{\r
+ // Book and fill (by accessing file "weights.root") histograms which hold phi, pt and eta weights.\r
+\r
+ if(!fWeightsList)\r
+ {\r
+  cout<<"WARNING: fWeightsList is NULL in AFAWNL::BAFWH() !!!!"<<endl;\r
+  exit(0);  \r
+ }\r
+ // Profile to hold flags for weights:   \r
+ TString fUseParticleWeightsName = "fUseParticleWeightsNL";\r
+ fUseParticleWeights = new TProfile(fUseParticleWeightsName.Data(),"0 = particle weight not used, 1 = particle weight used ",3,0,3);\r
+ fUseParticleWeights->SetLabelSize(0.06);\r
+ (fUseParticleWeights->GetXaxis())->SetBinLabel(1,"w_{#phi}");\r
+ (fUseParticleWeights->GetXaxis())->SetBinLabel(2,"w_{p_{T}}");\r
+ (fUseParticleWeights->GetXaxis())->SetBinLabel(3,"w_{#eta}");\r
+ fUseParticleWeights->Fill(0.5,(Int_t)fUsePhiWeights);\r
+ fUseParticleWeights->Fill(1.5,(Int_t)fUsePtWeights);\r
+ fUseParticleWeights->Fill(2.5,(Int_t)fUseEtaWeights);\r
+ fWeightsList->Add(fUseParticleWeights); \r
+ // Phi-weights: \r
+ if(fUsePhiWeights)\r
+ {\r
+  if(fWeightsList->FindObject("phi_weights"))\r
+  {\r
+   fPhiWeights = dynamic_cast<TH1F*>(fWeightsList->FindObject("phi_weights"));\r
+   if(TMath::Abs(fPhiWeights->GetBinWidth(1)-fPhiBinWidth)>pow(10.,-6.))\r
+   {\r
+    cout<<endl;
+    cout<<"WARNING (NL): Inconsistent binning in histograms for phi-weights throughout the code."<<endl;\r
+    cout<<endl;
+    exit(0);\r
+   }\r
+  } else \r
+    {\r
+     cout<<"WARNING (NL): fWeightsList->FindObject(\"phi_weights\") is NULL in AFAWNL::BAFWH() !!!!"<<endl;\r
+     exit(0);\r
+    }\r
+ } // end of if(fUsePhiWeights)\r
+ // Pt-weights:\r
+ if(fUsePtWeights) \r
+ {\r
+  if(fWeightsList->FindObject("pt_weights"))\r
+  {\r
+   fPtWeights = dynamic_cast<TH1D*>(fWeightsList->FindObject("pt_weights"));\r
+   if(TMath::Abs(fPtWeights->GetBinWidth(1)-fPtBinWidth)>pow(10.,-6.))\r
+   {\r
+    cout<<endl;
+    cout<<"WARNING (NL): Inconsistent binning in histograms for pt-weights throughout the code."<<endl;\r
+    cout<<endl;
+    exit(0);\r
+   }\r
+  } else \r
+    {\r
+     cout<<"WARNING (NL): fWeightsList->FindObject(\"pt_weights\") is NULL in AFAWNL::BAFWH() !!!!"<<endl;\r
+     exit(0);\r
+    }\r
+ } // end of if(fUsePtWeights)    \r
+ // Eta-weights:\r
+ if(fUseEtaWeights) \r
+ {\r
+  if(fWeightsList->FindObject("eta_weights"))\r
+  {\r
+   fEtaWeights = dynamic_cast<TH1D*>(fWeightsList->FindObject("eta_weights"));\r
+   if(TMath::Abs(fEtaWeights->GetBinWidth(1)-fEtaBinWidth)>pow(10.,-6.))\r
+   {\r
+    cout<<endl;
+    cout<<"WARNING (NL): Inconsistent binning in histograms for eta-weights throughout the code."<<endl;\r
+    cout<<endl;
+    exit(0);\r
+   }\r
+  } else \r
+    {\r
+     cout<<"WARNING: fUseEtaWeights && fWeightsList->FindObject(\"eta_weights\") is NULL in AFAWNL::BAFWH() !!!!"<<endl;\r
+     exit(0);\r
+    }\r
+ } // end of if(fUseEtaWeights)\r
\r
+} // end of AliFlowAnalysisWithNestedLoops::BookAndFillWeightsHistograms()
+
+//================================================================================================================
+\r
+void AliFlowAnalysisWithNestedLoops::CheckPointersUsedInMake()\r
+{\r
+ // Check pointers used in method Make().\r
+                        
+ if(!fRelativeAngleDistribution)
+ {
+  cout<<endl;
+  cout<<" WARNING (NL): !fRelativeAngleDistribution is NULL !!!!"<<endl;
+  cout<<endl;
+  exit(0); 
+ }
+                                                                                                                                                                                                                                                                                                                                   \r
+} // end of AliFlowAnalysisWithNestedLoops::CheckPointersUsedInMake()
+
+//================================================================================================================
+\r
+void AliFlowAnalysisWithNestedLoops::CheckPointersUsedInFinish()\r
+{\r
+ // Check pointers used in method Finish().
+                                                                                                                                                                                                                                                                                                                                   \r
+} // end of AliFlowAnalysisWithNestedLoops::CheckPointersUsedInFinish()\r
+
+//================================================================================================================
+\r
+void AliFlowAnalysisWithNestedLoops::AccessSettings()\r
+{\r
+ // Access the settings for analysis with mixed harmonics.
+                                                                                                                                                                                                                                                                                                                                   \r
+} // end of AliFlowAnalysisWithNestedLoops::AccessSettings()
+
+//================================================================================================================
diff --git a/PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithNestedLoops.h b/PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithNestedLoops.h
new file mode 100644 (file)
index 0000000..ef51a16
--- /dev/null
@@ -0,0 +1,139 @@
+/* 
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. 
+ * See cxx source for full Copyright notice 
+ * $Id$ 
+ */
+
+/*************************************************************** 
+ * Only in this class nested loops are used for flow analysis. *
+ * Nested loops are used to evaluate:                          *
+ *                                                             *  
+ *  a) Distribution of relative angle difference (phi1-phi2).  *
+ *                                                             *
+ *       Author: Ante Bilandzic (abilandzic@gmail.com)         *
+ ***************************************************************/ 
+
+#ifndef ALIFLOWANALYSISNESTEDLOOPS_H
+#define ALIFLOWANALYSISNESTEDLOOPS_H
+
+#include "AliFlowCommonConstants.h" // needed as include
+
+class TList;
+class TFile;
+class TH1;
+class TProfile;
+
+class AliFlowEventSimple;
+class AliFlowCommonHist;
+class AliFlowCommonHistResults;
+
+//================================================================================================================
+
+class AliFlowAnalysisWithNestedLoops
+{
+ public:
+  AliFlowAnalysisWithNestedLoops();
+  virtual ~AliFlowAnalysisWithNestedLoops(); 
+  // 0.) Methods called in the constructor:
+  // 1.) Method Init() and methods called within Init():
+  virtual void Init();
+    virtual void CrossCheckSettings();
+    virtual void AccessConstants();
+    virtual void BookAndNestAllLists();
+    virtual void BookProfileHoldingSettings();
+    virtual void BookCommonHistograms();
+    virtual void BookEverythingForDistributions();
+    virtual void BookAndFillWeightsHistograms();
+  // 2.) Method Make() and methods called within Make():
+  virtual void Make(AliFlowEventSimple *anEvent);
+    virtual void CheckPointersUsedInMake();
+  // 3.) Method Finish() and methods called within Finish():
+  virtual void Finish();  
+    virtual void CheckPointersUsedInFinish(); 
+    virtual void AccessSettings();       
+  // 4.) Method GetOutputHistograms and method called within it:
+  virtual void GetOutputHistograms(TList *outputListHistos);
+    virtual void GetPointersForCommonHistograms();
+    virtual void GetPointersForResultsHistograms();
+  // 5.) Other methods:   
+  virtual void WriteHistograms(TString outputFileName);
+  virtual void WriteHistograms(TDirectoryFile *outputFileName);  
+  // 6.) Setters and getters:
+  void SetHistList(TList* const hl) {this->fHistList = hl;}
+  TList* GetHistList() const {return this->fHistList;}  
+  void SetHistListName(const char *hln) {this->fHistListName->Append(*hln);}; 
+  TString *GetHistListName() const {return this->fHistListName;};
+  void SetAnalysisLabel(const char *al) {this->fAnalysisLabel->Append(*al);}; 
+  TString *GetAnalysisLabel() const {return this->fAnalysisLabel;};
+  void SetAnalysisSettings(TProfile* const as) {this->fAnalysisSettings = as;};
+  TProfile* GetAnalysisSettings() const {return this->fAnalysisSettings;};
+  void SetCommonHists(AliFlowCommonHist* const ch) {this->fCommonHists = ch;};
+  AliFlowCommonHist* GetCommonHists() const {return this->fCommonHists;};
+  void SetWeightsList(TList* const wl) {this->fWeightsList = (TList*)wl->Clone();}
+  TList* GetWeightsList() const {return this->fWeightsList;}  
+  void SetUsePhiWeights(Bool_t const uPhiW) {this->fUsePhiWeights = uPhiW;};
+  Bool_t GetUsePhiWeights() const {return this->fUsePhiWeights;};
+  void SetUsePtWeights(Bool_t const uPtW) {this->fUsePtWeights = uPtW;};
+  Bool_t GetUsePtWeights() const {return this->fUsePtWeights;};
+  void SetUseEtaWeights(Bool_t const uEtaW) {this->fUseEtaWeights = uEtaW;};
+  Bool_t GetUseEtaWeights() const {return this->fUseEtaWeights;};
+  void SetUseParticleWeights(TProfile* const uPW) {this->fUseParticleWeights = uPW;};
+  TProfile* GetUseParticleWeights() const {return this->fUseParticleWeights;};
+  void SetPhiWeights(TH1F* const histPhiWeights) {this->fPhiWeights = histPhiWeights;};
+  TH1F* GetPhiWeights() const {return this->fPhiWeights;};
+  void SetPtWeights(TH1D* const histPtWeights) {this->fPtWeights = histPtWeights;};
+  TH1D* GetPtWeights() const {return this->fPtWeights;};
+  void SetEtaWeights(TH1D* const histEtaWeights) {this->fEtaWeights = histEtaWeights;};
+  TH1D* GetEtaWeights() const {return this->fEtaWeights;};
+  void SetResultsList(TList* const rlist) {this->fResultsList = rlist;}
+  TList* GetResultsList() const {return this->fResultsList;}  
+  void SetRelativeAngleDistribution(TH1D* const rad) {this->fRelativeAngleDistribution = rad;};
+  TH1D* GetRelativeAngleDistribution() const {return this->fRelativeAngleDistribution;};
+  
+ private:
+  AliFlowAnalysisWithNestedLoops(const AliFlowAnalysisWithNestedLoops& afawQc);
+  AliFlowAnalysisWithNestedLoops& operator=(const AliFlowAnalysisWithNestedLoops& afawQc); 
+  // 0.) Base:
+  TList *fHistList; // base list to hold all output objects
+  TString *fHistListName; // name of base list
+  TString *fAnalysisLabel; // analysis label 
+  TProfile *fAnalysisSettings; // profile to hold analysis settings
+  // 1.) Common:
+  AliFlowCommonHist *fCommonHists; // common control histograms (filled only with events with 3 or more tracks for 3-p correlators) 
+  Int_t fnBinsPhi; // number of phi bins
+  Double_t fPhiMin; // minimum phi   
+  Double_t fPhiMax; // maximum phi 
+  Double_t fPhiBinWidth; // bin width for phi histograms  
+  Int_t fnBinsPt; // number of pt bins
+  Double_t fPtMin; // minimum pt   
+  Double_t fPtMax; // maximum pt  
+  Double_t fPtBinWidth; // bin width for pt histograms  
+  Int_t fnBinsEta; // number of eta bins
+  Double_t fEtaMin; // minimum eta   
+  Double_t fEtaMax; // maximum eta
+  Double_t fEtaBinWidth; // bin width for eta histograms 
+  // 2a.) Particle weights:
+  TList *fWeightsList; // list to hold all histograms with particle weights: fUseParticleWeights, fPhiWeights, fPtWeights and fEtaWeights
+  Bool_t fUsePhiWeights; // use phi weights
+  Bool_t fUsePtWeights; // use pt weights
+  Bool_t fUseEtaWeights; // use eta weights
+  TProfile *fUseParticleWeights; // profile with three bins to hold values of fUsePhiWeights, fUsePtWeights and fUseEtaWeights
+  TH1F *fPhiWeights; // histogram holding phi weights
+  TH1D *fPtWeights; // histogram holding phi weights
+  TH1D *fEtaWeights; // histogram holding phi weights 
+  // 3.) Final results:
+  TList *fResultsList; // list holding objects with final results 
+  TH1D *fRelativeAngleDistribution; // distribution of phi1-phi2 for all distinct pairs of particles
+  
+  ClassDef(AliFlowAnalysisWithNestedLoops, 0);
+
+};
+
+//================================================================================================================
+
+#endif
+
+
+
+
+
index ff8ef75bb5af6ede49b44a3368094f1468249f42..564c0f62ad01d5119916795582262e4a9fade9aa 100644 (file)
@@ -17,6 +17,7 @@ Bool_t LYZ2SUM  = kFALSE;
 Bool_t LYZ2PROD = kFALSE;
 Bool_t LYZEP    = kFALSE;
 Bool_t MH       = kTRUE; // mixed harmonics 
+Bool_t NL       = kFALSE; // nested loops
 Bool_t MCEP_AH  = kFALSE; // MCEP in another harmonic 
 //--------------------------------------------------------------------------------------
 
@@ -261,6 +262,7 @@ int runFlowAnalysisOnTheFly(Int_t nEvts=1000, Int_t mode=mLocal)
  AliFlowAnalysisWithLYZEventPlane *lyzep = NULL;
  AliFlowAnalysisWithScalarProduct *sp = NULL;
  AliFlowAnalysisWithMixedHarmonics *mh = NULL;
+ AliFlowAnalysisWithNestedLoops *nl = NULL;
  AliFlowAnalysisWithMCEventPlane *mcep = NULL;   
  AliFlowAnalysisWithMCEventPlane *mcep_AH = NULL;   
 
@@ -284,12 +286,18 @@ int runFlowAnalysisOnTheFly(Int_t nEvts=1000, Int_t mode=mLocal)
  {
   AliFlowAnalysisWithMixedHarmonics *mh = new AliFlowAnalysisWithMixedHarmonics();
   mh->SetCorrelatorInteger(1); // integer n in expression cos[n(2phi1-phi2-phi3)] = v2n*vn^2
-  mh->SetMinMultiplicity(3); 
-  mh->SetNoOfMultipicityBins(10);  
-  mh->SetMultipicityBinWidth(100);   
+  mh->SetMinMultiplicity(100); 
+  mh->SetNoOfMultipicityBins(5);  
+  mh->SetMultipicityBinWidth(200);   
   mh->Init(); 
  }
  
+ // NL = nested loops:
+ if(NL) {
+   AliFlowAnalysisWithNestedLoops *nl = new AliFlowAnalysisWithNestedLoops();
+   nl->Init();
+ }
+
  // QC = Q-cumulants  
  if(QC) { 
    AliFlowAnalysisWithQCumulants* qc = new AliFlowAnalysisWithQCumulants();
@@ -522,6 +530,7 @@ int runFlowAnalysisOnTheFly(Int_t nEvts=1000, Int_t mode=mLocal)
    if(LYZEP)   lyzep->Make(event,ep);
    if(SP)      sp->Make(event);
    if(MH)      mh->Make(event);
+   if(NL)      nl->Make(event);
    if(MCEP_AH) mcep_ah->Make(event);
    
    delete event;
@@ -533,8 +542,8 @@ int runFlowAnalysisOnTheFly(Int_t nEvts=1000, Int_t mode=mLocal)
  TString outputFileName = "AnalysisResults.root";  
  TFile *outputFile = new TFile(outputFileName.Data(),"RECREATE");
  // create a new file for each method wich will hold list with final results:
- const Int_t nMethods = 12;
- TString method[nMethods] = {"MCEP","SP","GFC","QC","FQD","LYZ1SUM","LYZ1PROD","LYZ2SUM","LYZ2PROD","LYZEP","MH","MCEP_AH"};
+ const Int_t nMethods = 13;
+ TString method[nMethods] = {"MCEP","SP","GFC","QC","FQD","LYZ1SUM","LYZ1PROD","LYZ2SUM","LYZ2PROD","LYZEP","MH","NL","MCEP_AH"};
  TDirectoryFile *dirFileFinal[nMethods] = {NULL};
  TString fileName[nMethods]; 
  for(Int_t i=0;i<nMethods;i++)
@@ -558,7 +567,8 @@ int runFlowAnalysisOnTheFly(Int_t nEvts=1000, Int_t mode=mLocal)
  if(LYZ2PROD){lyz2prod->Finish();lyz2prod->WriteHistograms(dirFileFinal[8]);}
  if(LYZEP)   {lyzep->Finish();   lyzep->WriteHistograms(dirFileFinal[9]);}
  if(MH)      {mh->Finish();      mh->WriteHistograms(dirFileFinal[10]);}
- if(MCEP_AH) {mcep_ah->Finish(); mcep_ah->WriteHistograms(dirFileFinal[11]);}
+ if(NL)      {nl->Finish();      nl->WriteHistograms(dirFileFinal[11]);}
+ if(MCEP_AH) {mcep_ah->Finish(); mcep_ah->WriteHistograms(dirFileFinal[12]);}
  //---------------------------------------------------------------------------------------  
  
  outputFile->Close();
index 3d2bc60bb34040764d576260137b6ebebd27f806..699d8a5cf90a8eeee9c75c9e0aa27285254ee55e 100644 (file)
@@ -32,5 +32,6 @@
 #pragma link C++ class AliFlowAnalysisWithQCumulants+;
 #pragma link C++ class AliFlowAnalysisWithFittingQDistribution+;
 #pragma link C++ class AliFlowAnalysisWithMixedHarmonics+;
+#pragma link C++ class AliFlowAnalysisWithNestedLoops+;
 
 #endif
index 03b0261069aa131a01b30b9a08bbce6dd0bf86a6..655be1f25a9b5a7268e3af7a70deb82c8ee2ed7b 100644 (file)
@@ -21,7 +21,8 @@ SRCS= FLOW/AliFlowCommon/AliFlowEventSimple.cxx \
       FLOW/AliFlowCommon/AliFlowAnalysisWithQCumulants.cxx \
       FLOW/AliFlowCommon/AliCumulantsFunctions.cxx \
       FLOW/AliFlowCommon/AliFlowAnalysisWithFittingQDistribution.cxx \
-      FLOW/AliFlowCommon/AliFlowAnalysisWithMixedHarmonics.cxx 
+      FLOW/AliFlowCommon/AliFlowAnalysisWithMixedHarmonics.cxx \
+      FLOW/AliFlowCommon/AliFlowAnalysisWithNestedLoops.cxx
 
 HDRS= $(SRCS:.cxx=.h)