]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Add DEta DPhi correlation code
authorakisiel <akisiel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 1 Jul 2009 15:42:09 +0000 (15:42 +0000)
committerakisiel <akisiel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 1 Jul 2009 15:42:09 +0000 (15:42 +0000)
PWG2/FEMTOSCOPY/AliFemto/AliFemtoCutMonitorHandler.cxx
PWG2/FEMTOSCOPY/AliFemto/AliFemtoCutMonitorHandler.h
PWG2/FEMTOSCOPY/AliFemto/AliFemtoParticleCut.h
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnDEtaDPhi.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnDEtaDPhi.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCutMonitorParticleEtCorr.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCutMonitorParticleEtCorr.h [new file with mode: 0644]

index 1a0f46fa81394b799a089eeae548834f6ab5f1b8..efdb4b74c2596b0a09d06334b07af6069943db1c 100644 (file)
@@ -276,6 +276,42 @@ TList *AliFemtoCutMonitorHandler::GetOutputList()
 
   return tOutputList;
 }
+//_____________________________________________________________________________
+void AliFemtoCutMonitorHandler::EventBegin(const AliFemtoEvent* aEvent) 
+{ 
+  if (fCollectionsEmpty) return;
+
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* tCM;
+
+  for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+    tCM = *iter;
+    tCM->EventBegin(aEvent);
+  }
+  
+  for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+    tCM = *iter;
+    tCM->EventBegin(aEvent);
+  }
+}
+//_____________________________________________________________________________
+void AliFemtoCutMonitorHandler::EventEnd(const AliFemtoEvent* aEvent) 
+{ 
+  if (fCollectionsEmpty) return;
+
+  AliFemtoCutMonitorIterator iter;
+  AliFemtoCutMonitor* tCM;
+
+  for (iter=fPassColl->begin(); iter!=fPassColl->end(); iter++){
+    tCM = *iter;
+    tCM->EventEnd(aEvent);
+  }
+  
+  for (iter=fFailColl->begin(); iter!=fFailColl->end(); iter++){
+    tCM = *iter;
+    tCM->EventEnd(aEvent);
+  }
+}
 
 
  
index 3596f28b914a9d3c4e5d4fac120c7e3ea99edc41..78d912b72be0a38f104499370e13f9087c2b8928 100644 (file)
@@ -44,6 +44,9 @@ class AliFemtoCutMonitorHandler{
   void Finish();
 
   virtual TList *GetOutputList();
+
+  virtual void EventBegin(const AliFemtoEvent* aEvent);
+  virtual void EventEnd(const AliFemtoEvent* aEvent);
   
  private:
   bool fCollectionsEmpty;                  // Are the collections empty?
index fa811bcaa01eeef49bcfefba46ac960dc38af9a7..8a361206b09accea0a9fbe4d05b7b804f9d52590 100644 (file)
@@ -31,8 +31,6 @@ public:
   double Mass(){return fMass;};       // mass of the particle being selected
   virtual void SetMass(const double& mass) {fMass = mass;};
 
-  virtual void EventBegin(const AliFemtoEvent* aEvent);
-  virtual void EventEnd(const AliFemtoEvent* aEvent);
   virtual AliFemtoParticleCut* Clone() { return 0;}
 
   virtual AliFemtoParticleType Type()=0;
@@ -68,7 +66,4 @@ inline AliFemtoParticleCut& AliFemtoParticleCut::operator=(const AliFemtoParticl
     return tListSetttings;
   }
   
-inline void AliFemtoParticleCut::EventBegin(const AliFemtoEvent* /* aEvent */) { /* no-op */ }
-inline void AliFemtoParticleCut::EventEnd(const AliFemtoEvent* /* aEvent */) { /* no-op */ }
-
 #endif
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnDEtaDPhi.cxx b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnDEtaDPhi.cxx
new file mode 100644 (file)
index 0000000..0cdeb69
--- /dev/null
@@ -0,0 +1,409 @@
+////////////////////////////////////////////////////////////////////////////////
+//                                                                            //
+// AliFemtoCorrFctnDEtaDPhi - A correlation function that analyzes            //
+// two particle correlations with respect to the azimuthal angle (phi)        //
+// and pseudorapidity (eta) difference                                        //
+//                                                                            //
+// Authors: Adam Kisiel Adam.Kisiel@cern.ch                                   //
+//                                                                            //
+////////////////////////////////////////////////////////////////////////////////
+
+#include "AliFemtoCorrFctnDEtaDPhi.h"
+//#include "AliFemtoHisto.hh"
+#include <cstdio>
+#include <TMath.h>
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoCorrFctnDEtaDPhi)
+#endif
+
+//____________________________
+AliFemtoCorrFctnDEtaDPhi::AliFemtoCorrFctnDEtaDPhi(char* title, const int& aPhiBins=20, const int& aEtaBins=20):
+  AliFemtoCorrFctn(),
+  fDPhiDEtaNumerator(0),
+  fDPhiDEtaDenominator(0),
+  fDPhiDEtaColNumerator(0),
+  fDPhiDEtaColDenominator(0),
+  fDPhiNumerator(0),
+  fDPhiDenominator(0),
+  fDCosNumerator(0),
+  fDCosDenominator(0),
+  fDPhiPtNumerator(0),
+  fDPhiPtDenominator(0),
+  fDCosPtNumerator(0),
+  fDCosPtDenominator(0)
+{
+  // set up numerator
+  char tTitNumD[100] = "NumDPhiDEta";
+  strcat(tTitNumD,title);
+  fDPhiDEtaNumerator = new TH2D(tTitNumD,title,aPhiBins,-0.5*TMath::Pi(),1.5*TMath::Pi(),aEtaBins,-2.0,2.0);
+  // set up denominator
+  char tTitDenD[100] = "DenDPhiDEta";
+  strcat(tTitDenD,title);
+  fDPhiDEtaDenominator = new TH2D(tTitDenD,title,aPhiBins,-0.5*TMath::Pi(),1.5*TMath::Pi(),aEtaBins,-2.0,2.0);
+
+  // set up numerator
+  char tTitNumR[100] = "NumDPhiDEtaCol";
+  strcat(tTitNumR,title);
+  fDPhiDEtaColNumerator = new TH2D(tTitNumR,title,aPhiBins,-0.5*TMath::Pi(),1.5*TMath::Pi(),aEtaBins,-2.0,2.0);
+  // set up denominator
+  char tTitDenR[100] = "DenDPhiDEtaCol";
+  strcat(tTitDenR,title);
+  fDPhiDEtaColDenominator = new TH2D(tTitDenR,title,aPhiBins,-0.5*TMath::Pi(),1.5*TMath::Pi(),aEtaBins,-2.0,2.0);
+
+  // set up numerator
+  char tTitNumDPhi[100] = "NumDPhi";
+  strcat(tTitNumDPhi,title);
+  fDPhiNumerator = new TH1D(tTitNumDPhi,title,aPhiBins*2,-0.5*TMath::Pi(),1.5*TMath::Pi());
+  // set up denominator
+  char tTitDenDPhi[100] = "DenDPhi";
+  strcat(tTitDenDPhi,title);
+  fDPhiDenominator = new TH1D(tTitDenDPhi,title,aPhiBins*2,-0.5*TMath::Pi(),1.5*TMath::Pi());
+
+  // set up numerator
+  char tTitNumDCos[100] = "NumDCos";
+  strcat(tTitNumDCos,title);
+  fDCosNumerator = new TH1D(tTitNumDCos,title,aPhiBins*2,-1.0,1.0);
+  // set up denominator
+  char tTitDenDCos[100] = "DenDCos";
+  strcat(tTitDenDCos,title);
+  fDCosDenominator = new TH1D(tTitDenDCos,title,aPhiBins*2,-1.0,1.0);
+
+  // set up numerator
+  char tTitNumDPhiPt[100] = "NumDPhiPt";
+  strcat(tTitNumDPhiPt,title);
+  fDPhiPtNumerator = new TH2D(tTitNumDPhiPt,title,aPhiBins*2,-0.5*TMath::Pi(),1.5*TMath::Pi(), 30, 0.0, 3.0);
+  // set up denominator
+  char tTitDenDPhiPt[100] = "DenDPhiPt";
+  strcat(tTitDenDPhiPt,title);
+  fDPhiPtDenominator = new TH2D(tTitDenDPhiPt,title,aPhiBins*2,-0.5*TMath::Pi(),1.5*TMath::Pi(), 30, 0.0, 3.0);
+
+  // set up numerator
+  char tTitNumDCosPt[100] = "NumDCosPt";
+  strcat(tTitNumDCosPt,title);
+  fDCosPtNumerator = new TH2D(tTitNumDCosPt,title,aPhiBins*2,-1.0,1.0, 30, 0.0, 3.0);
+  // set up denominator
+  char tTitDenDCosPt[100] = "DenDCosPt";
+  strcat(tTitDenDCosPt,title);
+  fDCosPtDenominator = new TH2D(tTitDenDCosPt,title,aPhiBins*2,-1.0,1.0, 30, 0.0, 3.0);
+
+  // to enable error bar calculation...
+  fDPhiDEtaNumerator->Sumw2();
+  fDPhiDEtaDenominator->Sumw2();
+  fDPhiDEtaColNumerator->Sumw2();
+  fDPhiDEtaColDenominator->Sumw2();
+  fDPhiNumerator->Sumw2();
+  fDPhiDenominator->Sumw2();
+  fDCosNumerator->Sumw2();
+  fDCosDenominator->Sumw2();
+  fDPhiPtNumerator->Sumw2();
+  fDPhiPtDenominator->Sumw2();
+  fDCosPtNumerator->Sumw2();
+  fDCosPtDenominator->Sumw2();
+
+}
+
+//____________________________
+AliFemtoCorrFctnDEtaDPhi::AliFemtoCorrFctnDEtaDPhi(const AliFemtoCorrFctnDEtaDPhi& aCorrFctn) :
+  AliFemtoCorrFctn(),
+  fDPhiDEtaNumerator(0),
+  fDPhiDEtaDenominator(0),
+  fDPhiDEtaColNumerator(0),
+  fDPhiDEtaColDenominator(0),
+  fDPhiNumerator(0),
+  fDPhiDenominator(0),
+  fDCosNumerator(0),
+  fDCosDenominator(0),
+  fDPhiPtNumerator(0),
+  fDPhiPtDenominator(0),
+  fDCosPtNumerator(0),
+  fDCosPtDenominator(0)
+{
+  // copy constructor
+  if (aCorrFctn.fDPhiDEtaNumerator)
+    fDPhiDEtaNumerator = new TH2D(*aCorrFctn.fDPhiDEtaNumerator);
+  else
+    fDPhiDEtaNumerator = 0;
+  if (aCorrFctn.fDPhiDEtaDenominator)
+    fDPhiDEtaDenominator = new TH2D(*aCorrFctn.fDPhiDEtaDenominator);
+  else
+    fDPhiDEtaDenominator = 0;
+
+  if (aCorrFctn.fDPhiDEtaColNumerator)
+    fDPhiDEtaColNumerator = new TH2D(*aCorrFctn.fDPhiDEtaColNumerator);
+  else
+    fDPhiDEtaColNumerator = 0;
+  if (aCorrFctn.fDPhiDEtaColDenominator)
+    fDPhiDEtaColDenominator = new TH2D(*aCorrFctn.fDPhiDEtaColDenominator);
+  else
+    fDPhiDEtaColDenominator = 0;
+
+  if (aCorrFctn.fDPhiNumerator)
+    fDPhiNumerator = new TH1D(*aCorrFctn.fDPhiNumerator);
+  else
+    fDPhiNumerator = 0;
+  if (aCorrFctn.fDPhiDenominator)
+    fDPhiDenominator = new TH1D(*aCorrFctn.fDPhiDenominator);
+  else
+    fDPhiDenominator = 0;
+
+  if (aCorrFctn.fDCosNumerator)
+    fDCosNumerator = new TH1D(*aCorrFctn.fDCosNumerator);
+  else
+    fDCosNumerator = 0;
+  if (aCorrFctn.fDCosDenominator)
+    fDCosDenominator = new TH1D(*aCorrFctn.fDCosDenominator);
+  else
+    fDCosDenominator = 0;
+
+  if (aCorrFctn.fDPhiPtNumerator)
+    fDPhiPtNumerator = new TH2D(*aCorrFctn.fDPhiPtNumerator);
+  else
+    fDPhiPtNumerator = 0;
+  if (aCorrFctn.fDPhiPtDenominator)
+    fDPhiPtDenominator = new TH2D(*aCorrFctn.fDPhiPtDenominator);
+  else
+    fDPhiPtDenominator = 0;
+
+  if (aCorrFctn.fDCosPtNumerator)
+    fDCosPtNumerator = new TH2D(*aCorrFctn.fDCosPtNumerator);
+  else
+    fDCosPtNumerator = 0;
+  if (aCorrFctn.fDCosPtDenominator)
+    fDCosPtDenominator = new TH2D(*aCorrFctn.fDCosPtDenominator);
+  else
+    fDCosPtDenominator = 0;
+}
+//____________________________
+AliFemtoCorrFctnDEtaDPhi::~AliFemtoCorrFctnDEtaDPhi(){
+  // destructor
+  delete fDPhiDEtaNumerator;
+  delete fDPhiDEtaDenominator;
+  delete fDPhiDEtaColNumerator;
+  delete fDPhiDEtaColDenominator;
+  delete fDPhiNumerator;
+  delete fDPhiDenominator;
+  delete fDCosNumerator;
+  delete fDCosDenominator;
+  delete fDPhiPtNumerator;
+  delete fDPhiPtDenominator;
+  delete fDCosPtNumerator;
+  delete fDCosPtDenominator;
+}
+//_________________________
+AliFemtoCorrFctnDEtaDPhi& AliFemtoCorrFctnDEtaDPhi::operator=(const AliFemtoCorrFctnDEtaDPhi& aCorrFctn)
+{
+  // assignment operator
+  if (this == &aCorrFctn)
+    return *this;
+
+  if (aCorrFctn.fDPhiDEtaNumerator)
+    fDPhiDEtaNumerator = new TH2D(*aCorrFctn.fDPhiDEtaNumerator);
+  else
+    fDPhiDEtaNumerator = 0;
+  if (aCorrFctn.fDPhiDEtaDenominator)
+    fDPhiDEtaDenominator = new TH2D(*aCorrFctn.fDPhiDEtaDenominator);
+  else
+    fDPhiDEtaDenominator = 0;
+
+  if (aCorrFctn.fDPhiDEtaColNumerator)
+    fDPhiDEtaColNumerator = new TH2D(*aCorrFctn.fDPhiDEtaColNumerator);
+  else
+    fDPhiDEtaColNumerator = 0;
+  if (aCorrFctn.fDPhiDEtaColDenominator)
+    fDPhiDEtaColDenominator = new TH2D(*aCorrFctn.fDPhiDEtaColDenominator);
+  else
+    fDPhiDEtaColDenominator = 0;
+
+  if (aCorrFctn.fDPhiNumerator)
+    fDPhiNumerator = new TH1D(*aCorrFctn.fDPhiNumerator);
+  else
+    fDPhiNumerator = 0;
+  if (aCorrFctn.fDPhiDenominator)
+    fDPhiDenominator = new TH1D(*aCorrFctn.fDPhiDenominator);
+  else
+    fDPhiDenominator = 0;
+
+  if (aCorrFctn.fDCosNumerator)
+    fDCosNumerator = new TH1D(*aCorrFctn.fDCosNumerator);
+  else
+    fDCosNumerator = 0;
+  if (aCorrFctn.fDCosDenominator)
+    fDCosDenominator = new TH1D(*aCorrFctn.fDCosDenominator);
+  else
+    fDCosDenominator = 0;
+
+  if (aCorrFctn.fDPhiPtNumerator)
+    fDPhiPtNumerator = new TH2D(*aCorrFctn.fDPhiPtNumerator);
+  else
+    fDPhiPtNumerator = 0;
+  if (aCorrFctn.fDPhiPtDenominator)
+    fDPhiPtDenominator = new TH2D(*aCorrFctn.fDPhiPtDenominator);
+  else
+    fDPhiPtDenominator = 0;
+
+  if (aCorrFctn.fDCosPtNumerator)
+    fDCosPtNumerator = new TH2D(*aCorrFctn.fDCosPtNumerator);
+  else
+    fDCosPtNumerator = 0;
+  if (aCorrFctn.fDCosPtDenominator)
+    fDCosPtDenominator = new TH2D(*aCorrFctn.fDCosPtDenominator);
+  else
+    fDCosPtDenominator = 0;
+
+  return *this;
+}
+//_________________________
+void AliFemtoCorrFctnDEtaDPhi::Finish(){
+  // here is where we should normalize, fit, etc...
+  // we should NOT Draw() the histos (as I had done it below),
+  // since we want to insulate ourselves from root at this level
+  // of the code.  Do it instead at root command line with browser.
+  //  mShareNumerator->Draw();
+  //mShareDenominator->Draw();
+  //mRatio->Draw();
+
+}
+
+//____________________________
+AliFemtoString AliFemtoCorrFctnDEtaDPhi::Report(){
+  // create report
+  string stemp = "TPC Ncls Correlation Function Report:\n";
+  char ctemp[100];
+  sprintf(ctemp,"Number of entries in numerator:\t%E\n",fDPhiDEtaNumerator->GetEntries());
+  stemp += ctemp;
+  sprintf(ctemp,"Number of entries in denominator:\t%E\n",fDPhiDEtaDenominator->GetEntries());
+  stemp += ctemp;
+  //  stemp += mCoulombWeight->Report();
+  AliFemtoString returnThis = stemp;
+  return returnThis;
+}
+//____________________________
+void AliFemtoCorrFctnDEtaDPhi::AddRealPair( AliFemtoPair* pair){
+  // add real (effect) pair
+  double phi1 = pair->Track1()->Track()->P().phi();
+  double phi2 = pair->Track2()->Track()->P().phi();
+  double eta1 = pair->Track1()->Track()->P().pseudoRapidity();
+  double eta2 = pair->Track2()->Track()->P().pseudoRapidity();
+
+  double dphi = phi1 - phi2;
+  while (dphi<-TMath::Pi()/2) dphi+=TMath::Pi()*2;
+  while (dphi>3*TMath::Pi()/2) dphi-=TMath::Pi()*2;
+
+  double deta = eta1 - eta2;
+
+  double px1 = pair->Track1()->Track()->P().x();
+  double py1 = pair->Track1()->Track()->P().y();
+  double pz1 = pair->Track1()->Track()->P().z();
+
+  double px2 = pair->Track2()->Track()->P().x();
+  double py2 = pair->Track2()->Track()->P().y();
+  double pz2 = pair->Track2()->Track()->P().z();
+
+  double pt1 = TMath::Hypot(px1, py1);
+  double pt2 = TMath::Hypot(px2, py2);
+  double ptmin = pt1>pt2 ? pt2 : pt1;
+
+  double cosphi = (px1*px2 + py1*py2 + pz1*pz2)/
+    sqrt((px1*px1 + py1*py1 + pz1*pz1)*(px2*px2 + py2*py2 + pz2*pz2));
+
+  fDPhiDEtaNumerator->Fill(dphi, deta);
+
+  if (cosphi > 0) {
+    fDPhiDEtaColNumerator->Fill(dphi, deta);
+  }
+  else {
+    fDPhiDEtaColNumerator->Fill(dphi, -eta1-eta2);
+  }
+
+  fDPhiNumerator->Fill(dphi);
+  fDCosNumerator->Fill(cosphi);
+
+  fDPhiPtNumerator->Fill(dphi, ptmin);
+  fDCosPtNumerator->Fill(cosphi, ptmin);
+
+}
+//____________________________
+void AliFemtoCorrFctnDEtaDPhi::AddMixedPair( AliFemtoPair* pair){
+  // add mixed (background) pair
+  double phi1 = pair->Track1()->Track()->P().phi();
+  double phi2 = pair->Track2()->Track()->P().phi();
+  double eta1 = pair->Track1()->Track()->P().pseudoRapidity();
+  double eta2 = pair->Track2()->Track()->P().pseudoRapidity();
+
+  double dphi = phi1 - phi2;
+  while (dphi<-TMath::Pi()/2) dphi+=TMath::Pi()*2;
+  while (dphi>3*TMath::Pi()/2) dphi-=TMath::Pi()*2;
+
+  double deta = eta1 - eta2;
+
+  double px1 = pair->Track1()->Track()->P().x();
+  double py1 = pair->Track1()->Track()->P().y();
+  double pz1 = pair->Track1()->Track()->P().z();
+
+  double px2 = pair->Track2()->Track()->P().x();
+  double py2 = pair->Track2()->Track()->P().y();
+  double pz2 = pair->Track2()->Track()->P().z();
+
+  double pt1 = TMath::Hypot(px1, py1);
+  double pt2 = TMath::Hypot(px2, py2);
+  double ptmin = pt1>pt2 ? pt2 : pt1;
+
+  double cosphi = (px1*px2 + py1*py2 + pz1*pz2)/
+    sqrt((px1*px1 + py1*py1 + pz1*pz1)*(px2*px2 + py2*py2 + pz2*pz2));
+
+  fDPhiDEtaDenominator->Fill(dphi, deta);
+
+  if (cosphi > 0) {
+    fDPhiDEtaColDenominator->Fill(dphi, deta);
+  }
+  else {
+    fDPhiDEtaColDenominator->Fill(dphi, -eta1-eta2);
+  }
+
+  fDPhiDenominator->Fill(dphi);
+  fDCosDenominator->Fill(cosphi);
+
+  fDPhiPtDenominator->Fill(dphi, ptmin);
+  fDCosPtDenominator->Fill(cosphi, ptmin);
+}
+
+
+void AliFemtoCorrFctnDEtaDPhi::WriteHistos()
+{
+  // Write out result histograms
+  fDPhiDEtaNumerator->Write();
+  fDPhiDEtaDenominator->Write();
+  fDPhiDEtaColNumerator->Write();
+  fDPhiDEtaColDenominator->Write();
+  fDPhiNumerator->Write();
+  fDPhiDenominator->Write();
+  fDCosNumerator->Write();
+  fDCosDenominator->Write();
+  fDPhiPtNumerator->Write();
+  fDPhiPtDenominator->Write();
+  fDCosPtNumerator->Write();
+  fDCosPtDenominator->Write();
+}
+
+TList* AliFemtoCorrFctnDEtaDPhi::GetOutputList()
+{
+  // Prepare the list of objects to be written to the output
+  TList *tOutputList = new TList();
+
+  tOutputList->Add(fDPhiDEtaNumerator);
+  tOutputList->Add(fDPhiDEtaDenominator);
+  tOutputList->Add(fDPhiDEtaColNumerator);
+  tOutputList->Add(fDPhiDEtaColDenominator);
+  tOutputList->Add(fDPhiNumerator);
+  tOutputList->Add(fDPhiDenominator);
+  tOutputList->Add(fDCosNumerator);
+  tOutputList->Add(fDCosDenominator);
+  tOutputList->Add(fDPhiPtNumerator);
+  tOutputList->Add(fDPhiPtDenominator);
+  tOutputList->Add(fDCosPtNumerator);
+  tOutputList->Add(fDCosPtDenominator);
+
+  return tOutputList;
+
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnDEtaDPhi.h b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnDEtaDPhi.h
new file mode 100644 (file)
index 0000000..046b605
--- /dev/null
@@ -0,0 +1,61 @@
+////////////////////////////////////////////////////////////////////////////////
+//                                                                            //
+// AliFemtoCorrFctnDEtaDPhi - A correlation function that analyzes            //
+// two particle correlations with respect to the azimuthal angle (phi)        //
+// and pseudorapidity (eta) difference                                        //
+//                                                                            //
+// Authors: Adam Kisiel Adam.Kisiel@cern.ch                                   //
+//                                                                            //
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef ALIFEMTOCORRFCTNDETADPHI_H
+#define ALIFEMTOCORRFCTNDETADPHI_H
+
+#include "TH1D.h"
+#include "TH2D.h"
+#include "AliFemtoCorrFctn.h"
+
+class AliFemtoCorrFctnDEtaDPhi : public AliFemtoCorrFctn {
+public:
+  AliFemtoCorrFctnDEtaDPhi(char* title, const int& aPhiBins, const int& aEtaBins);
+  AliFemtoCorrFctnDEtaDPhi(const AliFemtoCorrFctnDEtaDPhi& aCorrFctn);
+  virtual ~AliFemtoCorrFctnDEtaDPhi();
+
+  AliFemtoCorrFctnDEtaDPhi& operator=(const AliFemtoCorrFctnDEtaDPhi& aCorrFctn);
+
+  virtual AliFemtoString Report();
+  virtual void AddRealPair(AliFemtoPair* aPair);
+  virtual void AddMixedPair(AliFemtoPair* aPair);
+
+  virtual void Finish();
+
+  void WriteHistos();
+  virtual TList* GetOutputList();
+private:
+  
+  TH2D *fDPhiDEtaNumerator;          // Numerator of dEta dPhi function
+  TH2D *fDPhiDEtaDenominator;        // Denominator of dEta dPhi function
+
+  TH2D *fDPhiDEtaColNumerator;       // Numerator of colinear dEta dPhi function 
+  TH2D *fDPhiDEtaColDenominator;     // Denominator of colinear dEta dPhi function
+
+  TH1D *fDPhiNumerator;              // Numerator of dPhi correlation
+  TH1D *fDPhiDenominator;            // Denominator of dPhi correlation
+
+  TH1D *fDCosNumerator;              // Numerator of colinearity correlation
+  TH1D *fDCosDenominator;            // Denominator of colinearity correlation
+
+  TH2D *fDPhiPtNumerator;            // Numerator of dPhi correlation vs. Pt min
+  TH2D *fDPhiPtDenominator;          // Denominator of dPhi correlation vs. Pt min
+
+  TH2D *fDCosPtNumerator;            // Numerator of colinearity correlation vs. Pt min
+  TH2D *fDCosPtDenominator;          // Denominator of colinearity correlation vs. Pt min
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoCorrFctnDEtaDPhi, 1)
+#endif
+};
+
+
+#endif
+
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCutMonitorParticleEtCorr.cxx b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCutMonitorParticleEtCorr.cxx
new file mode 100644 (file)
index 0000000..9167ab3
--- /dev/null
@@ -0,0 +1,157 @@
+////////////////////////////////////////////////////////////////////////////////
+//                                                                            //
+// AliFemtoCutMonitorParticleEtCorr - the cut monitor for particles           //
+// which saves particles' et histogram and makes the bin-by-bin correlation   //
+//                                                                            //
+// Author: Adam.Kisiel@cern.ch                                                //
+//                                                                            //
+////////////////////////////////////////////////////////////////////////////////
+#include "AliFemtoCutMonitorParticleEtCorr.h"
+#include "AliFemtoModelHiddenInfo.h"
+#include <TH1D.h>
+#include <TH2D.h>
+#include <TList.h>
+#include <TMath.h>
+
+AliFemtoCutMonitorParticleEtCorr::AliFemtoCutMonitorParticleEtCorr():
+  AliFemtoCutMonitor(),
+  fPhiBins(60),
+  fPtPerPhi(0),     
+  fPtCovPerPhi(0),
+  fPtMultPerPhi(0),
+  fNEventsProcessed(0)
+{
+  // Default constructor
+}
+
+AliFemtoCutMonitorParticleEtCorr::AliFemtoCutMonitorParticleEtCorr(const char *aName, int aPhiBins):
+  AliFemtoCutMonitor(),
+  fPhiBins(aPhiBins),
+  fPtPerPhi(0),     
+  fPtCovPerPhi(0),
+  fPtMultPerPhi(0),
+  fNEventsProcessed(0)
+{
+  // Normal constructor
+  char name[200];
+  snprintf(name, 200, "EtCorrAvgPt%s", aName);
+  fPtPerPhi = new TH1D(name, "Average Pt Per Phi", aPhiBins, -0.5, aPhiBins-0.5);
+  snprintf(name, 200, "EtCorrMult%s", aName);
+  fPtMultPerPhi = new TH2D(name, "Multiplicity Per Phi", aPhiBins, -0.5, aPhiBins-0.5, aPhiBins, -0.5, aPhiBins-0.5);
+  snprintf(name, 200, "EtCorrAvgPtCov%s", aName);
+  fPtCovPerPhi = new TH2D(name, "Covariance of Average Pt Per Phi", aPhiBins, -0.5, aPhiBins-0.5, aPhiBins, -0.5, aPhiBins-0.5);
+
+  fPtPerPhi->Sumw2();
+  fPtCovPerPhi->Sumw2();
+  fPtMultPerPhi->Sumw2();
+  fPhiBins = aPhiBins;
+}
+
+AliFemtoCutMonitorParticleEtCorr::AliFemtoCutMonitorParticleEtCorr(const AliFemtoCutMonitorParticleEtCorr &aCut):
+  AliFemtoCutMonitor(),
+  fPhiBins(0),
+  fPtPerPhi(0),     
+  fPtCovPerPhi(0),
+  fPtMultPerPhi(0),
+  fNEventsProcessed(0)
+{
+  // copy constructor
+  if (fPtCovPerPhi) delete fPtCovPerPhi;
+  fPtCovPerPhi = new TH2D(*aCut.fPtCovPerPhi);
+  if (fPtPerPhi) delete fPtPerPhi;
+  fPtPerPhi = new TH1D(*aCut.fPtPerPhi);
+  if (fPtMultPerPhi) delete fPtMultPerPhi;
+  fPtMultPerPhi = new TH2D(*aCut.fPtMultPerPhi);
+  fPhiBins = aCut.fPhiBins;
+  fNEventsProcessed = aCut.fNEventsProcessed;
+}
+
+AliFemtoCutMonitorParticleEtCorr::~AliFemtoCutMonitorParticleEtCorr()
+{
+  // Destructor
+  delete fPtPerPhi;
+  delete fPtMultPerPhi;
+  delete fPtCovPerPhi;
+}
+
+AliFemtoCutMonitorParticleEtCorr& AliFemtoCutMonitorParticleEtCorr::operator=(const AliFemtoCutMonitorParticleEtCorr& aCut)
+{
+  // assignment operator
+  if (this == &aCut) 
+    return *this;
+
+  if (fPtCovPerPhi) delete fPtCovPerPhi;
+  fPtCovPerPhi = new TH2D(*aCut.fPtCovPerPhi);
+  if (fPtPerPhi) delete fPtPerPhi;
+  fPtPerPhi = new TH1D(*aCut.fPtPerPhi);
+  if (fPtMultPerPhi) delete fPtMultPerPhi;
+  fPtMultPerPhi = new TH2D(*aCut.fPtMultPerPhi);
+  fPhiBins = aCut.fPhiBins;
+  fNEventsProcessed = aCut.fNEventsProcessed;
+  
+  return *this;
+}
+
+AliFemtoString AliFemtoCutMonitorParticleEtCorr::Report(){ 
+  // Prepare report from the execution
+  string stemp = "*** AliFemtoCutMonitorParticleEtCorr report"; 
+  AliFemtoString returnThis = stemp;
+  return returnThis; 
+}
+
+void AliFemtoCutMonitorParticleEtCorr::Fill(const AliFemtoTrack* aTrack)
+{
+  // Fill in the monitor histograms with the values from the current track
+  //  float tEnergy = ::sqrt(aTrack->P().mag2()+fMass*fMass);
+  //  float tRapidity = 0.5*::log((tEnergy+aTrack->P().z())/(tEnergy-aTrack->P().z()));
+  float tPt = ::sqrt((aTrack->P().x())*(aTrack->P().x())+(aTrack->P().y())*(aTrack->P().y()));
+  //  float tEta = -TMath::Log(TMath::Tan(aTrack->P().theta()/2.0));
+  float tPhi = aTrack->P().phi();
+  Double_t tPiTwo = TMath::Pi()*2;
+
+  while (tPhi > tPiTwo) tPhi -= tPiTwo;
+  while (tPhi < 0) tPhi += tPiTwo;
+
+  int nbin = (int) floor(tPhi * fPhiBins / tPiTwo);
+  fPtSumEvent[nbin] += tPt;
+  fMultSumEvent[nbin] += 1;
+}
+
+void AliFemtoCutMonitorParticleEtCorr::Write()
+{
+  // Write out the relevant histograms
+  fPtPerPhi->Write();
+  fPtCovPerPhi->Write();
+  fPtMultPerPhi->Write();
+}
+
+TList *AliFemtoCutMonitorParticleEtCorr::GetOutputList()
+{
+  TList *tOutputList = new TList();
+  tOutputList->Add(fPtPerPhi);
+  tOutputList->Add(fPtCovPerPhi);
+  tOutputList->Add(fPtMultPerPhi);
+
+  return tOutputList;
+}
+
+void AliFemtoCutMonitorParticleEtCorr::EventBegin(const AliFemtoEvent* aEvent)
+{
+  for (int iter=0; iter<fPhiBins; iter++) {
+    fPtSumEvent[iter] = 0;
+    fMultSumEvent[iter] = 0;
+  }
+}
+
+void AliFemtoCutMonitorParticleEtCorr::EventEnd(const AliFemtoEvent* aEvent)
+{
+  for (int ispt=0; ispt<fPhiBins; ispt++) {
+    fPtPerPhi->Fill(ispt, fPtSumEvent[ispt]);
+    for (int ispt2=0; ispt2<fPhiBins; ispt2++) {
+      fPtCovPerPhi->Fill(ispt, ispt2, fPtSumEvent[ispt]*fPtSumEvent[ispt2]);
+      fPtMultPerPhi->Fill(ispt, ispt2, fMultSumEvent[ispt]*fMultSumEvent[ispt2]);
+    }
+  }
+  fNEventsProcessed++;
+}
+
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCutMonitorParticleEtCorr.h b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCutMonitorParticleEtCorr.h
new file mode 100644 (file)
index 0000000..270ab1e
--- /dev/null
@@ -0,0 +1,61 @@
+////////////////////////////////////////////////////////////////////////////////
+//                                                                            //
+// AliFemtoCutMonitorParticleEtCorr - the cut monitor for particles           //
+// which saves particles' et histogram and makes the bin-by-bin correlation   //
+//                                                                            //
+// Author: Adam.Kisiel@cern.ch                                                //
+//                                                                            //
+////////////////////////////////////////////////////////////////////////////////
+#ifndef AliFemtoCutMonitorParticleEtCorr_hh
+#define AliFemtoCutMonitorParticleEtCorr_hh
+
+class AliFemtoEvent;
+class AliFemtoTrack;
+class AliFemtoV0;
+class AliFemtoKink;
+class AliFemtoPair; // Gael 12/04/02
+class TH1D;
+class TH2D;
+class TList;
+#include "AliFemtoString.h"
+#include "AliFemtoParticleCollection.h"
+#include "AliFemtoCutMonitor.h"
+
+class AliFemtoCutMonitorParticleEtCorr : public AliFemtoCutMonitor{
+  
+public:
+  AliFemtoCutMonitorParticleEtCorr();
+  AliFemtoCutMonitorParticleEtCorr(const char *aName, int aPhiBins);
+  AliFemtoCutMonitorParticleEtCorr(const AliFemtoCutMonitorParticleEtCorr &aCut);
+  virtual ~AliFemtoCutMonitorParticleEtCorr();
+
+  AliFemtoCutMonitorParticleEtCorr& operator=(const AliFemtoCutMonitorParticleEtCorr& aCut);
+
+  virtual void EventBegin(const AliFemtoEvent* aEvent);
+  virtual void EventEnd(const AliFemtoEvent* aEvent);
+
+  virtual AliFemtoString Report();
+  virtual void Fill(const AliFemtoEvent* aEvent) {AliFemtoCutMonitor::Fill(aEvent);}
+  virtual void Fill(const AliFemtoTrack* aTrack);
+  virtual void Fill(const AliFemtoV0* aV0) {AliFemtoCutMonitor::Fill(aV0);}
+  virtual void Fill(const AliFemtoKink* aKink) {AliFemtoCutMonitor::Fill(aKink);}
+  virtual void Fill(const AliFemtoPair* aPair) {AliFemtoCutMonitor::Fill(aPair);}
+  virtual void Fill(const AliFemtoParticleCollection* aCollection) {AliFemtoCutMonitor::Fill(aCollection);}
+  virtual void Fill(const AliFemtoEvent* aEvent,const AliFemtoParticleCollection* aCollection)
+  {AliFemtoCutMonitor::Fill(aEvent, aCollection);}
+
+  void Write();
+
+  virtual TList *GetOutputList();
+
+private:
+  Double_t fPtSumEvent[200];      // A table where Pt sum per event is stored
+  Double_t fMultSumEvent[200];    // A table where mult sum per event is stored
+  Int_t    fPhiBins;              // Number of Phi bins
+  TH1D    *fPtPerPhi;             // Histogram storing per-bin sum pt
+  TH2D    *fPtCovPerPhi;          // Histogram storing per-bin covariance
+  TH2D    *fPtMultPerPhi;         // Histogram storing per-bin multiplicity
+  Int_t    fNEventsProcessed;     // Count processed events
+};
+
+#endif