Add EMCICs classes
authorakisiel <akisiel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 29 Jul 2010 10:21:02 +0000 (10:21 +0000)
committerakisiel <akisiel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 29 Jul 2010 10:21:02 +0000 (10:21 +0000)
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoBPLCMS3DCorrFctnEMCIC.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoBPLCMS3DCorrFctnEMCIC.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctn3DSphericalEMCIC.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctn3DSphericalEMCIC.h [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoQinvCorrFctnEMCIC.cxx [new file with mode: 0644]
PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoQinvCorrFctnEMCIC.h [new file with mode: 0644]
PWG2/PWG2femtoscopyUserLinkDef.h
PWG2/libPWG2femtoscopyUser.pkg

diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoBPLCMS3DCorrFctnEMCIC.cxx b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoBPLCMS3DCorrFctnEMCIC.cxx
new file mode 100644 (file)
index 0000000..20960d6
--- /dev/null
@@ -0,0 +1,322 @@
+/***************************************************************************
+ *
+ * $Id: AliFemtoBPLCMS3DCorrFctnEMCIC.cxx  $
+ *
+ * Author: Nicolas Bock, Ohio State University, bock@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: Calculates of the 3D Correlation Function, and also
+ *              produces histograms to calculate Energy Momentum Conservation
+ *              Induced Correlations  (EMCICs)
+ *
+ * This Class produces the following histograms as function of Qinv
+ * (for both real and mixed pairs):
+ *        1)   E1 + E2
+ *        2)   E1 * E2
+ *        3)   Pt1*Pt2
+ *        4)   Pz1*Pz2
+ *  
+ * The class is derived from AliFemtoBPLCMS3DCorrFctn, therefore it produces
+ * also the histograms in that class. 
+ * 
+ * NOTE: The EMCIC histograms are not averaged in this class, to obtain 
+ * the average, the user needs to divide the real pair histograms by 
+ * the numerator, and the mixed pair histograms by the denominator
+ *
+ ***************************************************************************
+ *
+ **************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                       //
+// AliFemtoBPLCMS3DCorrFctn: a class to calculate 3D correlation         //
+// for pairs of identical particles.                                     //
+// It also stored the weighted qinv per bin histogram for the coulomb    //
+// correction.                                                           //
+// In analysis the function should be first created in a macro, then     //
+// added to the analysis, and at the end of the macro the procedure to   //
+// write out histograms should be called.                                //
+//                                                                       //
+///////////////////////////////////////////////////////////////////////////
+
+#include "AliFemtoBPLCMS3DCorrFctnEMCIC.h"
+#include "AliFemtoKTPairCut.h"
+#include "AliFemtoAnalysisReactionPlane.h"
+//#include "AliFemtoHisto.h"
+#include <cstdio>
+#include <TVector2.h>
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoBPLCMS3DCorrFctnEMCIC)
+#endif
+
+//____________________________
+AliFemtoBPLCMS3DCorrFctnEMCIC::AliFemtoBPLCMS3DCorrFctnEMCIC(char* title, const int& nbins, const float& QLo, const float& QHi)
+:
+AliFemtoBPLCMS3DCorrFctn(title,nbins, QLo, QHi),
+  fEnergyTotalReal(0),  
+  fEnergyMultReal(0),        
+  fPzMultReal(0),      
+  fPtMultReal(0),            
+  fEnergyTotalMix(0),      
+  fEnergyMultMix(0),      
+  fPzMultMix(0),            
+  fPtMultMix(0) 
+{
+  
+  //Setup EnergyTotalReal
+  char tTitNum1[100] = "ESumReal";
+  strcat(tTitNum1,title);
+  fEnergyTotalReal = new TH3D(tTitNum1,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  
+  //Setup EnergyMultReal
+  char tTitNum2[100] = "EMultReal";
+  strcat(tTitNum2,title);
+  fEnergyMultReal = new TH3D(tTitNum2,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  
+  //Setup Pz MultReal
+  char tTitNum3[100] = "PzMultReal";
+  strcat(tTitNum3,title);
+  fPzMultReal = new TH3D(tTitNum3,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  
+  //Setup Pt MultReal
+  char tTitNum4[100] = "PtMultReal";
+  strcat(tTitNum4,title);
+  fPtMultReal = new TH3D(tTitNum4,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  
+  //Setup EnergyTotalMix
+  char tTitNum5[100] = "ESumMix";
+  strcat(tTitNum5,title);
+  fEnergyTotalMix = new TH3D(tTitNum5,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  
+  //Setup EnergyMultMix
+  char tTitNum6[100] = "EMultMix";
+  strcat(tTitNum6,title);
+  fEnergyMultMix = new TH3D(tTitNum6,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  
+  //Setup Pz MultMix
+  char tTitNum7[100] = "PzMultMix";
+  strcat(tTitNum7,title);
+  fPzMultMix = new TH3D(tTitNum7,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  
+  //Setup Pt MultMix
+  char tTitNum8[100] = "PtMultMix";
+  strcat(tTitNum8,title);
+  fPtMultMix = new TH3D(tTitNum8,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
+  // To enable error bar calculation
+  
+  fEnergyTotalReal->Sumw2();
+  fEnergyMultReal->Sumw2();
+  fPzMultReal->Sumw2();
+  fPtMultReal->Sumw2();
+  fEnergyTotalMix->Sumw2();
+  fEnergyMultMix->Sumw2();
+  fPzMultMix->Sumw2();
+  fPtMultMix->Sumw2();
+  
+}
+
+AliFemtoBPLCMS3DCorrFctnEMCIC::AliFemtoBPLCMS3DCorrFctnEMCIC(const AliFemtoBPLCMS3DCorrFctnEMCIC& aCorrFctn) :
+  AliFemtoBPLCMS3DCorrFctn(aCorrFctn),
+  fEnergyTotalReal(0),  
+  fEnergyMultReal(0),        
+  fPzMultReal(0),      
+  fPtMultReal(0),            
+  fEnergyTotalMix (0),      
+  fEnergyMultMix (0),  
+  fPzMultMix(0),          
+  fPtMultMix(0) 
+{
+  // Copy constructor
+  
+  fEnergyTotalReal = new TH3D(*aCorrFctn.fEnergyTotalReal);
+  fEnergyMultReal = new TH3D(*aCorrFctn.fEnergyMultReal);
+  fPzMultReal = new TH3D(*aCorrFctn.fPzMultReal);
+  fPtMultReal = new TH3D(*aCorrFctn.fPtMultReal);
+  fEnergyTotalMix = new TH3D(*aCorrFctn.fEnergyTotalMix);
+  fEnergyMultMix = new TH3D(*aCorrFctn.fEnergyMultMix);
+  fPzMultMix = new TH3D(*aCorrFctn.fPzMultMix);
+  fPtMultMix = new TH3D(*aCorrFctn.fPtMultMix);
+}
+//____________________________
+AliFemtoBPLCMS3DCorrFctnEMCIC::~AliFemtoBPLCMS3DCorrFctnEMCIC(){
+  // Destructor
+  delete fEnergyTotalReal;
+  delete fEnergyMultReal;        
+  delete fPzMultReal;     
+  delete fPtMultReal;            
+  delete fEnergyTotalMix;      
+  delete fEnergyMultMix; 
+  delete fPzMultMix;   
+  delete fPtMultMix;
+}
+//_________________________
+AliFemtoBPLCMS3DCorrFctnEMCIC& AliFemtoBPLCMS3DCorrFctnEMCIC::operator=(const AliFemtoBPLCMS3DCorrFctnEMCIC& aCorrFctn)
+{
+  // assignment operator
+  if (this == &aCorrFctn)
+    return *this;
+  
+  //Emcics
+  if (fEnergyTotalReal) delete fEnergyTotalReal;
+  fEnergyTotalReal = new TH3D(*aCorrFctn.fEnergyTotalReal);
+  if (fEnergyMultReal) delete fEnergyMultReal;
+  fEnergyMultReal = new TH3D(*aCorrFctn.fEnergyMultReal);
+  if (fPzMultReal) delete fPzMultReal;
+  fPzMultReal = new TH3D(*aCorrFctn.fPzMultReal);
+  if (fPtMultReal) delete fPtMultReal;
+  fPtMultReal = new TH3D(*aCorrFctn.fPtMultReal);
+  if (fEnergyTotalMix) delete fEnergyTotalMix;
+  fEnergyTotalMix = new TH3D(*aCorrFctn.fEnergyTotalMix);
+  if (fEnergyMultMix) delete fEnergyMultMix;
+  fEnergyMultMix = new TH3D(*aCorrFctn.fEnergyMultMix);
+  if (fPzMultMix) delete fPzMultMix;
+  fPzMultMix = new TH3D(*aCorrFctn.fPzMultMix);
+  if (fPtMultMix) delete fPtMultMix;
+  fPtMultMix = new TH3D(*aCorrFctn.fPtMultMix);
+  
+  return *this;
+}
+
+//_________________________
+void AliFemtoBPLCMS3DCorrFctnEMCIC::WriteOutHistos(){
+  TH3D* Num3D = Numerator();
+  TH3D* Den3D = Denominator();
+  Num3D->Write();
+  Den3D->Write();
+  fEnergyTotalReal->Write();
+  fEnergyMultReal->Write();        
+  fPzMultReal->Write();      
+  fPtMultReal->Write();            
+  fEnergyTotalMix->Write();      
+  fEnergyMultMix->Write();      
+  fPzMultMix->Write();            
+  fPtMultMix->Write(); 
+  cout << "write histos emcics" << endl;
+}
+//______________________________
+TList* AliFemtoBPLCMS3DCorrFctnEMCIC::GetOutputList()
+{
+  // Prepare the list of objects to be written to the output
+  TList *tOutputList = new TList();
+  cout << "Getting list from CFemcic" << endl;
+  tOutputList->Add(Numerator());
+  tOutputList->Add(Denominator());
+  tOutputList->Add(fEnergyTotalReal);
+  tOutputList->Add(fEnergyMultReal);        
+  tOutputList->Add(fPzMultReal);      
+  tOutputList->Add(fPtMultReal);            
+  tOutputList->Add(fEnergyTotalMix );      
+  tOutputList->Add(fEnergyMultMix );      
+  tOutputList->Add(fPzMultMix);            
+  tOutputList->Add(fPtMultMix);
+  return tOutputList;
+}
+
+
+
+//____________________________
+void AliFemtoBPLCMS3DCorrFctnEMCIC::AddRealPair( AliFemtoPair* pair){
+  // perform operations on real pairs
+  
+  //WILL WE NEED THIS PART HERE>?????????? I think so. 
+  cout << "ADDing real Pair to 3D emcics!" << endl; 
+
+ if (fPairCut){
+    if (fUseRPSelection) {
+      AliFemtoKTPairCut *ktc = dynamic_cast<AliFemtoKTPairCut *>(fPairCut);
+      if (!ktc) { 
+       cout << "RP aware cut requested, but not connected to the CF" << endl;
+       if (!(fPairCut->Pass(pair))) return;
+      }
+      else {
+       AliFemtoAnalysisReactionPlane *arp = dynamic_cast<AliFemtoAnalysisReactionPlane *> (HbtAnalysis());
+       if (!arp) {
+         cout << "RP aware cut requested, but not connected to the CF" << endl;
+         if (!(fPairCut->Pass(pair))) return;
+       }
+       if (!(ktc->Pass(pair, arp->GetCurrentReactionPlane()))) return;
+      }
+    }
+    else
+      if (!(fPairCut->Pass(pair))) return;
+      }
+
+  
+  double qOut = fabs(pair->QOutCMS());
+  double qSide = fabs(pair->QSideCMS());
+  double qLong = fabs(pair->QLongCMS());
+
+  AliFemtoBPLCMS3DCorrFctn::Numerator()->Fill(qOut,qSide,qLong);
+
+  AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
+  AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
+  double tE1 = tMom1.e();
+  double tE2 = tMom2.e();
+  double tPz1 = tMom1.pz();
+  double tPz2 = tMom2.pz();
+  TVector2 tPt1;
+  TVector2 tPt2;
+  cout <<"AddRealPair3D" << "E1,E2,Qosl" <<  
+    tE1 <<" " << tE2<<" " <<  qOut <<" " <<  qSide <<" " << qLong <<endl;
+  tPt1.Set(tMom1.px(),tMom1.py());
+  tPt2.Set(tMom2.px(),tMom2.py());
+  double tPt1DotPt2=tPt1*tPt2;
+  
+  fEnergyTotalReal->Fill(qOut,qSide,qLong,tE1+tE2);
+  fEnergyMultReal->Fill(qOut,qSide,qLong,tE1*tE2);
+  fPzMultReal->Fill(qOut,qSide,qLong,tPz1*tPz2);
+  fPtMultReal->Fill(qOut,qSide,qLong,tPt1DotPt2); 
+}
+//____________________________
+void AliFemtoBPLCMS3DCorrFctnEMCIC::AddMixedPair( AliFemtoPair* pair){
+  // perform operations on mixed pairs
+//   if (fPairCut){
+//     if (!(fPairCut->Pass(pair))) return;
+//   }
+  if (fPairCut){
+    if (fUseRPSelection) {
+      AliFemtoKTPairCut *ktc = dynamic_cast<AliFemtoKTPairCut *>(fPairCut);
+      if (!ktc) { 
+       cout << "RP aware cut requested, but not connected to the CF" << endl;
+       if (!(fPairCut->Pass(pair))) return;
+      }
+      else {
+       AliFemtoAnalysisReactionPlane *arp = dynamic_cast<AliFemtoAnalysisReactionPlane *> (HbtAnalysis());
+       if (!arp) {
+         cout << "RP aware cut requested, but not connected to the CF" << endl;
+         if (!(fPairCut->Pass(pair))) return;
+       }
+       if (!(ktc->Pass(pair, arp->GetCurrentReactionPlane()))) return;
+      }
+    }
+    else
+      if (!(fPairCut->Pass(pair))) return;
+  }
+
+  
+  double qOut = fabs(pair->QOutCMS());
+  double qSide = fabs(pair->QSideCMS());
+  double qLong = fabs(pair->QLongCMS());
+
+  AliFemtoBPLCMS3DCorrFctn::Denominator()->Fill(qOut,qSide,qLong);
+
+  AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
+  AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
+  double tE1 = tMom1.e();
+  double tE2 = tMom2.e();
+  double tPz1 = tMom1.pz();
+  double tPz2 = tMom2.pz();
+  TVector2 tPt1;
+  TVector2 tPt2;
+  tPt1.Set(tMom1.px(),tMom1.py());
+  tPt2.Set(tMom2.px(),tMom2.py());
+  double tPt1DotPt2=tPt1*tPt2;
+  
+  fEnergyTotalMix->Fill(qOut,qSide,qLong,tE1+tE2);
+  fEnergyMultMix->Fill(qOut,qSide,qLong,tE1*tE2);
+  fPzMultMix->Fill(qOut,qSide,qLong,tPz1*tPz2);
+  fPtMultMix->Fill(qOut,qSide,qLong,tPt1DotPt2);
+  
+}
+
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoBPLCMS3DCorrFctnEMCIC.h b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoBPLCMS3DCorrFctnEMCIC.h
new file mode 100644 (file)
index 0000000..0a77bd7
--- /dev/null
@@ -0,0 +1,80 @@
+/***************************************************************************
+ *
+ * $Id: AliFemtoBPLCMS3DCorrFctnEMCIC.h  $
+ *
+ * Author: Nicolas Bock, Ohio State University, bock@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: Calculates of the 3D Correlation Function, and also
+ *              produces histograms to calculate Energy Momentum Conservation
+ *              Induced Correlations  (EMCICs)
+ *
+ * This Class produces the following histograms as function of Qinv
+ * (for both real and mixed pairs):
+ *        1)   E1 + E2
+ *        2)   E1 * E2
+ *        3)   Pt1*Pt2
+ *        4)   Pz1*Pz2
+ *  
+ * The class is derived from AliFemtoBPLCMS3DCorrFctn, therefore it produces
+ * also the histograms in that class. 
+ * 
+ * NOTE: The EMCIC histograms are not averaged in this class, to obtain 
+ * the average, the user needs to divide the real pair histograms by 
+ * the numerator, and the mixed pair histograms by the denominator
+ *
+ ***************************************************************************
+ *
+ **************************************************************************/
+
+
+#ifndef ALIFEMTOBPLCMS3DCORRFCTNEMCIC_H
+#define ALIFEMTOBPLCMS3DCORRFCTNEMCIC_H
+
+#include "AliFemtoCorrFctn.h"
+#include "AliFemtoBPLCMS3DCorrFctn.h"
+//#include "AliFemtoCoulomb.h"
+#include "AliFemtoPairCut.h"
+//#include "AliFemtoHisto.h"
+#include "TH3D.h"
+//#include "AliFemtoSmearPair.h"
+
+class AliFemtoBPLCMS3DCorrFctnEMCIC : public AliFemtoBPLCMS3DCorrFctn {
+public:
+  AliFemtoBPLCMS3DCorrFctnEMCIC(char* title, const int& nbins, const float& QLo, const float& QHi);
+  AliFemtoBPLCMS3DCorrFctnEMCIC(const AliFemtoBPLCMS3DCorrFctnEMCIC& aCorrFctn);
+  virtual ~AliFemtoBPLCMS3DCorrFctnEMCIC();
+
+  AliFemtoBPLCMS3DCorrFctnEMCIC& operator=(const AliFemtoBPLCMS3DCorrFctnEMCIC& aCorrFctn);
+
+  virtual void AddRealPair( AliFemtoPair* aPair);
+  virtual void AddMixedPair( AliFemtoPair* aPair);
+
+
+  void WriteOutHistos();
+  virtual TList* GetOutputList();
+
+private:
+  
+    
+  //EMCIC histograms
+  TH3D* fEnergyTotalReal;       // E1+E2 from real pairs
+  TH3D* fEnergyMultReal;        // E1*E2
+  TH3D* fPzMultReal;            // Pz1*Pz2
+  TH3D* fPtMultReal;            // Pt1*Pt2
+  TH3D* fEnergyTotalMix;       // E1+E2 from mixed pairs
+  TH3D* fEnergyMultMix;        // E1*E2
+  TH3D* fPzMultMix;            // Pz1*Pz2
+  TH3D* fPtMultMix;            // Pt1*Pt2
+  
+  
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoBPLCMS3DCorrFctnEMCIC, 1)
+#endif
+};
+
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctn3DSphericalEMCIC.cxx b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctn3DSphericalEMCIC.cxx
new file mode 100644 (file)
index 0000000..1c17e59
--- /dev/null
@@ -0,0 +1,350 @@
+/***************************************************************************
+ *
+ * $Id: AliFemtoCorrFctn3DSphercicalEMCIC.h  $
+ *
+ * Author: Nicolas Bock, Ohio State University, bock@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: Calculates of the 3D Correlation Function in Spherical
+ *              coordinates, and also produces histograms to calculate 
+ *              Energy Momentum Conservation Induced Correlations  (EMCICs)
+ *
+ * This Class produces the following histograms as function of Q, theta, phi
+ * (for both real and mixed pairs):
+ *        1)   E1 + E2
+ *        2)   E1 * E2
+ *        3)   Pt1*Pt2
+ *        4)   Pz1*Pz2
+ *  
+ * This class is similar to AliFemtoCorrFctn3DSpherical, but it uses Q
+ * instead of K to do the binning. 
+ * 
+ * NOTE: The EMCIC histograms are not averaged in this class, to obtain 
+ * the average, the user needs to divide the real pair histograms by 
+ * the numerator, and the mixed pair histograms by the denominator.
+ *
+ ***************************************************************************
+ *
+ **************************************************************************/
+
+#include "AliFemtoCorrFctn3DSphericalEMCIC.h"
+#include <TMath.h>
+#include <TVector2.h>
+#include <cstdio>
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoCorrFctn3DSphericalEMCIC)
+#endif
+
+
+//____________________________
+AliFemtoCorrFctn3DSphericalEMCIC::AliFemtoCorrFctn3DSphericalEMCIC(char* title, const int& nqbins, const float& QLo, const float& QHi, const int& nphibins, const int& ncthetabins):
+  AliFemtoCorrFctn(),
+  fNumerator(0),
+  fDenominator(0),
+  fEnergyTotalReal(0),  
+  fEnergyMultReal(0),        
+  fPzMultReal(0),      
+  fPtMultReal(0),            
+  fEnergyTotalMix (0),      
+  fEnergyMultMix (0),      
+  fPzMultMix(0),            
+  fPtMultMix(0),
+  fPairCut(0x0)
+{
+  
+  // To better sample on phi shift bin low edge by binsize/2 = Pi/numBins.
+  Double_t shiftPhi=TMath::Pi()/nphibins;
+  // set up numerator
+  char tTitNum[100] = "Num";
+  strcat(tTitNum,title);
+  fNumerator = new TH3D(tTitNum,title,nqbins,QLo,QHi,nphibins,
+                       -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+  // set up denominator
+  char tTitDen[100] = "Den";
+  strcat(tTitDen,title);
+  fDenominator = new TH3D(tTitDen,title,nqbins,QLo,QHi,nphibins,
+                         -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+
+  //Added histograms to calculate EMCICs , Nicolas Bock 19.01.2010
+  //Setup EnergyTotalReal
+  char tTitNum1[100] = "ESumReal";
+  strcat(tTitNum1,title);
+  fEnergyTotalReal = new TH3D(tTitNum1,title,nqbins,QLo,QHi,nphibins,
+                             -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+  //Setup EnergyMultReal
+  char tTitNum2[100] = "EMultReal";
+  strcat(tTitNum2,title);
+  fEnergyMultReal = new TH3D(tTitNum2,title,nqbins,QLo,QHi,nphibins,
+                            -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+  
+  //Setup Pz MultReal
+  char tTitNum3[100] = "PzMultReal";
+  strcat(tTitNum3,title);
+  fPzMultReal = new TH3D(tTitNum3,title,nqbins,QLo,QHi,nphibins,
+                        -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+
+  //Setup Pt MultReal
+  char tTitNum4[100] = "PtMultReal";
+  strcat(tTitNum4,title);
+  fPtMultReal = new TH3D(tTitNum4,title,nqbins,QLo,QHi,nphibins,
+                        -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+  
+
+
+  //Setup EnergyTotalMix
+  char tTitNum5[100] = "ESumMix";
+  strcat(tTitNum5,title);
+  fEnergyTotalMix = new TH3D(tTitNum5,title,nqbins,QLo,QHi,nphibins,
+                            -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+  
+  //Setup EnergyMultMix
+  char tTitNum6[100] = "EMultMix";
+  strcat(tTitNum6,title);
+  fEnergyMultMix = new TH3D(tTitNum6,title,nqbins,QLo,QHi,nphibins,
+                           -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+  
+  //Setup Pz MultMix
+  char tTitNum7[100] = "PzMultMix";
+  strcat(tTitNum7,title);
+  fPzMultMix = new TH3D(tTitNum7,title,nqbins,QLo,QHi,nphibins,
+                       -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,ncthetabins,-1.0,1.0);
+
+  //Setup Pt MultMix
+  char tTitNum8[100] = "PtMultMix";
+  strcat(tTitNum8,title);
+  fPtMultMix = new TH3D(tTitNum8,title,nqbins,QLo,QHi,nphibins,
+                       -TMath::Pi()-shiftPhi,TMath::Pi()-shiftPhi,
+                       ncthetabins,-1.0,1.0);
+
+  // to enable error bar calculation...
+  fNumerator->Sumw2();
+  fDenominator->Sumw2();
+  fEnergyTotalReal->Sumw2();
+  fEnergyMultReal->Sumw2();
+  fPzMultReal->Sumw2();
+  fPtMultReal->Sumw2();
+  fEnergyTotalMix->Sumw2();
+  fEnergyMultMix->Sumw2();
+  fPzMultMix->Sumw2();
+  fPtMultMix->Sumw2();
+
+
+}
+
+AliFemtoCorrFctn3DSphericalEMCIC::AliFemtoCorrFctn3DSphericalEMCIC(const AliFemtoCorrFctn3DSphericalEMCIC& aCorrFctn) :
+  AliFemtoCorrFctn(),
+  fNumerator(0),
+  fDenominator(0),
+  fEnergyTotalReal(0),
+  fEnergyMultReal(0),        
+  fPzMultReal(0),      
+  fPtMultReal(0),            
+  fEnergyTotalMix (0),      
+  fEnergyMultMix (0),      
+  fPzMultMix(0),            
+  fPtMultMix(0),
+  fPairCut(0x0)
+{
+  // Copy constructor
+  fNumerator = new TH3D(*aCorrFctn.fNumerator);
+  fDenominator = new TH3D(*aCorrFctn.fDenominator);
+  fEnergyTotalReal = new TH3D(*aCorrFctn.fEnergyTotalReal);
+  fEnergyMultReal = new TH3D(*aCorrFctn.fEnergyMultReal);
+  fPzMultReal = new TH3D(*aCorrFctn.fPzMultReal);
+  fPtMultReal = new TH3D(*aCorrFctn.fPtMultReal);
+  fEnergyTotalMix = new TH3D(*aCorrFctn.fEnergyTotalMix);
+  fEnergyMultMix = new TH3D(*aCorrFctn.fEnergyMultMix);
+  fPzMultMix = new TH3D(*aCorrFctn.fPzMultMix);
+  fPtMultMix = new TH3D(*aCorrFctn.fPtMultMix);
+  fPairCut = aCorrFctn.fPairCut;
+}
+//____________________________
+AliFemtoCorrFctn3DSphericalEMCIC::~AliFemtoCorrFctn3DSphericalEMCIC(){
+  // Destructor
+  delete fNumerator;
+  delete fDenominator;
+  delete fEnergyTotalReal;
+  delete fEnergyMultReal;        
+  delete fPzMultReal;     
+  delete fPtMultReal;            
+  delete fEnergyTotalMix;      
+  delete fEnergyMultMix; 
+  delete fPzMultMix;   
+  delete fPtMultMix;
+}
+//_________________________
+AliFemtoCorrFctn3DSphericalEMCIC& AliFemtoCorrFctn3DSphericalEMCIC::operator=(const AliFemtoCorrFctn3DSphericalEMCIC& aCorrFctn)
+{
+  // assignment operator
+  if (this == &aCorrFctn)
+    return *this;
+
+  if (fNumerator) delete fNumerator;
+  fNumerator = new TH3D(*aCorrFctn.fNumerator);
+  if (fDenominator) delete fDenominator;
+  fDenominator = new TH3D(*aCorrFctn.fDenominator);
+  if (fEnergyTotalReal) delete fEnergyTotalReal;
+  fEnergyTotalReal = new TH3D(*aCorrFctn.fEnergyTotalReal);
+  if (fEnergyMultReal) delete fEnergyMultReal;
+  fEnergyMultReal = new TH3D(*aCorrFctn.fEnergyMultReal);
+  if (fPzMultReal) delete fPzMultReal;
+  fPzMultReal = new TH3D(*aCorrFctn.fPzMultReal);
+  if (fPtMultReal) delete fPtMultReal;
+  fPtMultReal = new TH3D(*aCorrFctn.fPtMultReal);
+  if (fEnergyTotalMix) delete fEnergyTotalMix;
+  fEnergyTotalMix = new TH3D(*aCorrFctn.fEnergyTotalMix);
+  if (fEnergyMultMix) delete fEnergyMultMix;
+  fEnergyMultMix = new TH3D(*aCorrFctn.fEnergyMultMix);
+  if (fPzMultMix) delete fPzMultMix;
+  fPzMultMix = new TH3D(*aCorrFctn.fPzMultMix);
+  if (fPtMultMix) delete fPtMultMix;
+  fPtMultMix = new TH3D(*aCorrFctn.fPtMultMix);
+  fPairCut = aCorrFctn.fPairCut;
+  
+  return *this;
+}
+
+//_________________________
+void AliFemtoCorrFctn3DSphericalEMCIC::WriteOutHistos(){
+  // Write out all histograms to file
+  fNumerator->Write();
+  fDenominator->Write();
+  fEnergyTotalReal->Write();
+  fEnergyMultReal->Write();        
+  fPzMultReal->Write();      
+  fPtMultReal->Write();            
+  fEnergyTotalMix->Write();      
+  fEnergyMultMix->Write();      
+  fPzMultMix->Write();            
+  fPtMultMix->Write();
+}
+//______________________________
+TList* AliFemtoCorrFctn3DSphericalEMCIC::GetOutputList()
+{
+  // Prepare the list of objects to be written to the output
+  TList *tOutputList = new TList();
+
+  tOutputList->Add(fNumerator); 
+  tOutputList->Add(fDenominator);  
+  tOutputList->Add(fEnergyTotalReal);
+  tOutputList->Add(fEnergyMultReal);        
+  tOutputList->Add(fPzMultReal);      
+  tOutputList->Add(fPtMultReal);            
+  tOutputList->Add(fEnergyTotalMix );      
+  tOutputList->Add(fEnergyMultMix );      
+  tOutputList->Add(fPzMultMix);            
+  tOutputList->Add(fPtMultMix);
+  return tOutputList;
+}
+
+//_________________________
+void AliFemtoCorrFctn3DSphericalEMCIC::Finish(){
+  // here is where we should normalize, fit, etc...
+}
+
+//____________________________
+AliFemtoString AliFemtoCorrFctn3DSphericalEMCIC::Report(){
+  // Construct the report
+  string stemp = "PRF Frame SphericalEMCIC 3D Correlation Function Report:\n";
+  char ctemp[100];
+  sprintf(ctemp,"Number of entries in numerator:\t%E\n",fNumerator->GetEntries());
+  stemp += ctemp;
+  sprintf(ctemp,"Number of entries in denominator:\t%E\n",fDenominator->GetEntries());
+  stemp += ctemp;
+
+  if (fPairCut){
+    sprintf(ctemp,"Here is the PairCut specific to this CorrFctn\n");
+    stemp += ctemp;
+    stemp += fPairCut->Report();
+  }
+  else{
+    sprintf(ctemp,"No PairCut specific to this CorrFctn\n");
+    stemp += ctemp;
+  }
+
+  //  
+  AliFemtoString returnThis = stemp;
+  return returnThis;
+}
+//____________________________
+void AliFemtoCorrFctn3DSphericalEMCIC::AddRealPair( AliFemtoPair* pair){
+  // perform operations on real pairs
+  if (fPairCut){
+    if (!(fPairCut->Pass(pair))) return;
+  }
+
+  //                          //Changed K to Q to be in LCMS, N. Bock
+  double tKO = pair->QOutCMS();  //KOut();
+  double tKS = pair->QSideCMS();  //KSide(); 
+  double tKL = pair->QLongCMS();  //  KLong();
+
+  double tKR = sqrt(tKO*tKO + tKS*tKS + tKL*tKL);
+  double tKC;
+  if ( fabs(tKR) < 1e-10 ) tKC = 0.0;
+  else tKC=tKL/tKR;
+  double tKP=atan2(tKS,tKO);
+
+  fNumerator->Fill(tKR,tKP,tKC);
+  
+  // EMCICs  
+  AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
+  AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
+  double tE1 = tMom1.e();
+  double tE2 = tMom2.e();
+  double tPz1 = tMom1.pz();
+  double tPz2 = tMom2.pz();
+  TVector2 tPt1;
+  TVector2 tPt2;
+  cout <<"AddRealPair" << "E1,E2, K,Ks,KL" <<  
+    tE1 <<" " << tE2<<" " <<  tKR <<" " <<  tKS <<" " << tKL<<endl;
+  tPt1.Set(tMom1.px(),tMom1.py());
+  tPt2.Set(tMom2.px(),tMom2.py());
+  double tPt1DotPt2=tPt1*tPt2;
+  
+  fEnergyTotalReal->Fill(tKR,tKP,tKC,tE1+tE2);
+  fEnergyMultReal->Fill(tKR,tKP,tKC,tE1*tE2);
+  fPzMultReal->Fill(tKR,tKP,tKC,tPz1*tPz2);
+  fPtMultReal->Fill(tKR,tKP,tKC,tPt1DotPt2);
+   
+
+}
+//____________________________
+void AliFemtoCorrFctn3DSphericalEMCIC::AddMixedPair( AliFemtoPair* pair){
+  // perform operations on mixed pairs
+  if (fPairCut){
+    if (!(fPairCut->Pass(pair))) return;
+  }
+ //                          //Changed K to Q to be in LCMS, N. Bock
+  double tKO = pair->QOutCMS();  //KOut();
+  double tKS = pair->QSideCMS();  //KSide(); 
+  double tKL = pair->QLongCMS();  //  KLong();
+
+  double tKR = sqrt(tKO*tKO + tKS*tKS + tKL*tKL);
+  double tKC;
+  if ( fabs(tKR) < 1e-10 ) tKC = 0.0;
+  else tKC=tKL/tKR;
+  double tKP=atan2(tKS,tKO);
+
+  fDenominator->Fill(tKR,tKP,tKC);
+
+  // EMCICs   
+  AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
+  AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
+  double tE1 = tMom1.e();
+  double tE2 = tMom2.e();
+  double tPz1 = tMom1.pz();
+  double tPz2 = tMom2.pz();
+  TVector2 tPt1;
+  TVector2 tPt2;
+  tPt1.Set(tMom1.px(),tMom1.py());
+  tPt2.Set(tMom2.px(),tMom2.py());
+  double tPt1DotPt2=tPt1*tPt2;
+  
+  fEnergyTotalMix->Fill(tKR,tKP,tKC,tE1+tE2);
+  fEnergyMultMix->Fill(tKR,tKP,tKC,tE1*tE2);
+  fPzMultMix->Fill(tKR,tKP,tKC,tPz1*tPz2);
+  fPtMultMix->Fill(tKR,tKP,tKC,tPt1DotPt2);
+  
+}
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctn3DSphericalEMCIC.h b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctn3DSphericalEMCIC.h
new file mode 100644 (file)
index 0000000..5a5f43d
--- /dev/null
@@ -0,0 +1,60 @@
+
+///////////////////////////////////////////////////////////////////////////
+//                                                                       //
+// AliFemtoCorrFctn3DSpherical: a class to calculate 3D correlation      //
+// for pairs of identical particles, binned in spherical coordinates     //
+// (q_inv, phi, cos(theta))
+//                                                                       //
+///////////////////////////////////////////////////////////////////////////
+
+#ifndef ALIFEMTOCORRFCTN3DSPHERICALEMCIC_H
+#define ALIFEMTOCORRFCTN3DSPHERICALEMCIC_H
+
+#include "AliFemtoCorrFctn.h"
+#include "AliFemtoPairCut.h"
+#include "TH3D.h"
+
+class AliFemtoCorrFctn3DSphericalEMCIC : public AliFemtoCorrFctn{
+public:
+  AliFemtoCorrFctn3DSphericalEMCIC(char* title, 
+                             const int& nqbins, const float& QLo, const float& QHi,
+                             const int& nphibins, const int& ncthetabins);
+  AliFemtoCorrFctn3DSphericalEMCIC(const AliFemtoCorrFctn3DSphericalEMCIC& aCorrFctn);
+  virtual ~AliFemtoCorrFctn3DSphericalEMCIC();
+
+  AliFemtoCorrFctn3DSphericalEMCIC& operator=(const AliFemtoCorrFctn3DSphericalEMCIC& aCorrFctn);
+
+  virtual AliFemtoString Report();
+  virtual void AddRealPair( AliFemtoPair* aPair);
+  virtual void AddMixedPair( AliFemtoPair* aPair);
+
+  virtual void Finish();
+
+  void WriteOutHistos();
+  virtual TList* GetOutputList();
+
+  void SetSpecificPairCut(AliFemtoPairCut* aCut);
+
+private:
+  
+  TH3D* fNumerator;         // numerator
+  TH3D* fDenominator;       // denominator
+  //EMCIC histograms:
+  TH3D* fEnergyTotalReal;       // E1+E2 from real pairs
+  TH3D* fEnergyMultReal;        // E1*E2
+  TH3D* fPzMultReal;            // Pz1*Pz2
+  TH3D* fPtMultReal;            // Pt1*Pt2
+  TH3D* fEnergyTotalMix;       // E1+E2 from mixed pairs
+  TH3D* fEnergyMultMix;        // E1*E2
+  TH3D* fPzMultMix;            // Pz1*Pz2
+  TH3D* fPtMultMix;            // Pt1*Pt2
+  AliFemtoPairCut* fPairCut;    //! this is a PairCut specific to THIS CorrFctn, not the Analysis
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoCorrFctn3DSphericalEMCIC, 1)
+#endif
+};
+
+inline  void AliFemtoCorrFctn3DSphericalEMCIC::SetSpecificPairCut(AliFemtoPairCut* pc){fPairCut=pc;}
+
+#endif
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoQinvCorrFctnEMCIC.cxx b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoQinvCorrFctnEMCIC.cxx
new file mode 100644 (file)
index 0000000..90cc82e
--- /dev/null
@@ -0,0 +1,238 @@
+/***************************************************************************
+ *
+ * $Id: AliFemtoQinvCorrFctnEMCIC.cxx  $
+ *
+ * Author: Nicolas Bock, Ohio State University, bock@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: Calculates of the Qinv Correlation Function, and also
+ *              produces histograms to calculate EMCICs          
+ *
+ ***************************************************************************
+ *
+ **************************************************************************/
+
+
+#include "AliFemtoQinvCorrFctnEMCIC.h"
+//#include "AliFemtoHisto.h"
+#include <cstdio>
+#include <TVector2.h>
+
+#ifdef __ROOT__ 
+ClassImp(AliFemtoQinvCorrFctnEMCIC)
+#endif
+
+//____________________________
+AliFemtoQinvCorrFctnEMCIC::AliFemtoQinvCorrFctnEMCIC(char* title, const int& nbins, const float& QinvLo, const float& QinvHi):
+AliFemtoQinvCorrFctn(title, nbins, QinvLo, QinvHi),
+  fESumReal(0),
+  fEMultReal(0),
+  fPtMultReal(0),
+  fPzMultReal(0),
+  fESumMix(0),
+  fEMultMix(0),
+  fPtMultMix(0),
+  fPzMultMix(0)
+
+{
+  
+
+  // set up emcic histograms
+  char tTitESum[100] = "ESumReal";
+  strcat(tTitESum,title);
+  fESumReal = new TH1D(tTitESum,title,nbins,QinvLo,QinvHi);
+  char tTitEMult[100] = "EMultReal";
+  strcat(tTitEMult,title);
+  fEMultReal = new TH1D(tTitEMult,title,nbins,QinvLo,QinvHi);
+  char tTitPt[100] = "PtMultReal";
+  strcat(tTitPt,title);
+  fPtMultReal = new TH1D(tTitPt,title,nbins,QinvLo,QinvHi);
+  char tTitPz[100] = "PzMultReal";
+  strcat(tTitPz,title);
+  fPzMultReal = new TH1D(tTitPz,title,nbins,QinvLo,QinvHi);
+  char tTitESum2[100] = "ESumMix";
+  strcat(tTitESum2,title);
+  fESumMix = new TH1D(tTitESum2,title,nbins,QinvLo,QinvHi);
+  char tTitEMult2[100] = "EMultMix";
+  strcat(tTitEMult2,title);
+  fEMultMix = new TH1D(tTitEMult2,title,nbins,QinvLo,QinvHi);
+  char tTitPt2[100] = "PtMultMix";
+  strcat(tTitPt2,title);
+  fPtMultMix = new TH1D(tTitPt2,title,nbins,QinvLo,QinvHi);
+  char tTitPz2[100] = "PzMultMix";
+  strcat(tTitPz2,title);
+  fPzMultMix = new TH1D(tTitPz2,title,nbins,QinvLo,QinvHi);
+
+
+
+  // to enable error bar calculation...
+  
+  fESumReal->Sumw2();
+  fEMultReal->Sumw2();
+  fPtMultReal->Sumw2();
+  fPzMultReal->Sumw2();
+  fESumMix->Sumw2();
+  fEMultMix->Sumw2();
+  fPtMultMix->Sumw2();
+  fPzMultMix->Sumw2();
+}
+
+//____________________________
+AliFemtoQinvCorrFctnEMCIC::AliFemtoQinvCorrFctnEMCIC(const AliFemtoQinvCorrFctnEMCIC& aCorrFctn) :
+  AliFemtoQinvCorrFctn(aCorrFctn),
+  fESumReal(0),
+  fEMultReal(0),
+  fPtMultReal(0),
+  fPzMultReal(0),
+  fESumMix(0),
+  fEMultMix(0),
+  fPtMultMix(0),
+  fPzMultMix(0)
+{
+  // copy constructor
+  
+  fESumReal= new TH1D(*aCorrFctn.fESumReal);
+  fEMultReal= new TH1D(*aCorrFctn.fEMultReal);
+  fPtMultReal= new TH1D(*aCorrFctn.fPtMultReal);
+  fPzMultReal= new TH1D(*aCorrFctn.fPzMultReal);
+  fESumMix= new TH1D(*aCorrFctn.fESumMix);
+  fEMultMix= new TH1D(*aCorrFctn.fEMultMix);
+  fPtMultMix= new TH1D(*aCorrFctn.fPtMultMix);
+  fPzMultMix= new TH1D(*aCorrFctn.fPzMultMix);
+
+}
+//____________________________
+AliFemtoQinvCorrFctnEMCIC::~AliFemtoQinvCorrFctnEMCIC(){
+  // destructor
+  
+  delete fESumReal;
+  delete fEMultReal;
+  delete fPtMultReal;
+  delete fPzMultReal;
+  delete fESumMix;
+  delete fEMultMix;
+  delete fPtMultMix;
+  delete fPzMultMix;
+
+}
+//_________________________
+AliFemtoQinvCorrFctnEMCIC& AliFemtoQinvCorrFctnEMCIC::operator=(const AliFemtoQinvCorrFctnEMCIC& aCorrFctn)
+{
+  // assignment operator
+  if (this == &aCorrFctn)
+    return *this;
+
+  if (fESumReal) delete fESumReal;
+  fESumReal= new TH1D(*aCorrFctn.fESumReal);
+  if (fEMultReal) delete fEMultReal;
+  fEMultReal= new TH1D(*aCorrFctn.fEMultReal);
+  if (fPtMultReal) delete fPtMultReal;
+  fPtMultReal= new TH1D(*aCorrFctn.fPtMultReal);
+  if (fPzMultReal) delete fPzMultReal;
+  fPzMultReal= new TH1D(*aCorrFctn.fPzMultReal);
+  if (fESumMix) delete fESumMix;
+  fESumMix= new TH1D(*aCorrFctn.fESumMix);
+  if (fEMultMix) delete fEMultMix;
+  fEMultMix= new TH1D(*aCorrFctn.fEMultMix);
+  if (fPtMultMix) delete fPtMultMix;
+  fPtMultMix= new TH1D(*aCorrFctn.fPtMultMix);
+  if (fPzMultMix) delete fPzMultMix;
+  fPzMultMix= new TH1D(*aCorrFctn.fPzMultMix);
+
+  return *this;
+}
+
+//____________________________
+void AliFemtoQinvCorrFctnEMCIC::AddRealPair(AliFemtoPair* pair){
+  // add true pair
+  if (fPairCut)
+    if (!fPairCut->Pass(pair)) return;
+
+  double tQinv = fabs(pair->QInv());   // note - qInv() will be negative for identical pairs...
+  
+    
+// The EMCICs are calculated here for real pairs
+  AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
+  AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
+  double tE1 = tMom1.e();
+  double tE2 = tMom2.e();
+  double tPz1 = tMom1.pz();
+  double tPz2 = tMom2.pz();
+  TVector2 tPt1;
+  TVector2 tPt2;
+  
+  tPt1.Set(tMom1.px(),tMom1.py());
+  tPt2.Set(tMom2.px(),tMom2.py());
+  double tPt1DotPt2=tPt1*tPt2;
+  
+  fESumReal->Fill(tQinv,tE1+tE2);
+  fEMultReal->Fill(tQinv,tE1*tE2);
+  fPzMultReal->Fill(tQinv,tPz1*tPz2);
+  fPtMultReal->Fill(tQinv,tPt1DotPt2);
+
+}
+//____________________________
+void AliFemtoQinvCorrFctnEMCIC::AddMixedPair(AliFemtoPair* pair){
+  // add mixed (background) pair
+  if (fPairCut)
+    if (!fPairCut->Pass(pair)) return;
+  double tQinv = fabs(pair->QInv());   // note - qInv() will be negative for identical pairs...
+  
+
+  // The EMCICs are calculated here for mixed pairs
+  AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
+  AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
+  double tE1 = tMom1.e();
+  double tE2 = tMom2.e();
+  double tPz1 = tMom1.pz();
+  double tPz2 = tMom2.pz();
+  TVector2 tPt1;
+  TVector2 tPt2;
+  
+  tPt1.Set(tMom1.px(),tMom1.py());
+  tPt2.Set(tMom2.px(),tMom2.py());
+  double tPt1DotPt2=tPt1*tPt2;
+  
+  fESumMix->Fill(tQinv,tE1+tE2);
+  fEMultMix->Fill(tQinv,tE1*tE2);
+  fPzMultMix->Fill(tQinv,tPz1*tPz2);
+  fPtMultMix->Fill(tQinv,tPt1DotPt2);
+
+
+
+}
+//____________________________
+void AliFemtoQinvCorrFctnEMCIC::Write(){
+  // Write out neccessary objects
+  
+  fESumReal->Write();
+  fEMultReal->Write();
+  fPtMultReal->Write();
+  fPzMultReal->Write();
+  fESumMix->Write();
+  fEMultMix->Write();
+  fPtMultMix->Write();
+  fPzMultMix->Write();
+
+}
+//______________________________
+TList* AliFemtoQinvCorrFctnEMCIC::GetOutputList()
+{
+  // Prepare the list of objects to be written to the output
+  TList *tOutputList = new TList();
+
+  cout << "Getting list from Qinv CF emicic" << endl;
+  tOutputList->Add(fESumReal);
+  tOutputList->Add(fEMultReal);
+  tOutputList->Add(fPtMultReal);
+  tOutputList->Add(fPzMultReal);
+  tOutputList->Add(fESumMix);
+  tOutputList->Add(fEMultMix);
+  tOutputList->Add(fPtMultMix);
+  tOutputList->Add(fPzMultMix);
+  return tOutputList;
+}
+
+
diff --git a/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoQinvCorrFctnEMCIC.h b/PWG2/FEMTOSCOPY/AliFemtoUser/AliFemtoQinvCorrFctnEMCIC.h
new file mode 100644 (file)
index 0000000..c0fe3be
--- /dev/null
@@ -0,0 +1,78 @@
+/***************************************************************************
+ *
+ * $Id: AliFemtoQinvCorrFctnEMCIC.h  $
+ *
+ * Author: Nicolas Bock, Ohio State University, bock@mps.ohio-state.edu
+ ***************************************************************************
+ *
+ * Description: Calculates of the Qinv Correlation Function, and also
+ *              produces histograms to calculate Energy Momentum Conservation
+ *              Induced Correlations  (EMCICs)
+ *
+ * This Class produces the following histograms as function of Qinv
+ * (for both real and mixed pairs):
+ *        1)   E1 + E2
+ *        2)   E1 * E2
+ *        3)   Pt1*Pt2
+ *        4)   Pz1*Pz2
+ *  
+ * The class is derived from AliFemtoQinvCorrFctn, therefore it produces
+ * also the histograms in that class. 
+ * 
+ * NOTE: The EMCIC histograms are not averaged in this class, to obtain 
+ * the average, the user needs to divide the real pair histograms by 
+ * the numerator, and the mixed pairs by denominator
+ *
+ ***************************************************************************
+ *
+ **************************************************************************/
+
+#ifndef ALIFEMTOQINVCORRFCTNEMCIC_H
+#define ALIFEMTOQINVCORRFCTNEMCIC_H
+
+#include "TH1D.h"
+#include "AliFemtoCorrFctn.h"
+#include "AliFemtoQinvCorrFctn.h"
+
+
+class AliFemtoQinvCorrFctnEMCIC : public AliFemtoQinvCorrFctn 
+{
+ public:
+  AliFemtoQinvCorrFctnEMCIC(char* title, const int& nbins, 
+                           const float& QinvLo, const float& QinvHi);
+  AliFemtoQinvCorrFctnEMCIC(const AliFemtoQinvCorrFctnEMCIC& aCorrFctn);
+  virtual ~AliFemtoQinvCorrFctnEMCIC();
+  
+  AliFemtoQinvCorrFctnEMCIC& operator=(const AliFemtoQinvCorrFctnEMCIC& aCorrFctn);
+
+  virtual void AddRealPair(AliFemtoPair* aPair);
+  virtual void AddMixedPair(AliFemtoPair* aPair);
+
+  
+
+  virtual TList* GetOutputList();
+  void Write();
+  
+ private:
+  //Emcic histograms:  
+  TH1D* fESumReal;   //  <E1+E2>   from real Pairs 
+  TH1D* fEMultReal;  //  <E1*E2>   from real Pairs 
+  TH1D* fPtMultReal; //  <Pt1*Pt2> from real Pairs 
+  TH1D* fPzMultReal; //  <Pz1*Pz2> from real Pairs 
+  TH1D* fESumMix;    //  <E1+E2>   from mixed Pairs 
+  TH1D* fEMultMix;   //  <E1*E2>   from mixed Pairs
+  TH1D* fPtMultMix;  //  <PT1*Pt2> from mixed Pairs
+  TH1D* fPzMultMix;  //  <Pz1*Pz2> from mixed Pairs
+
+
+
+
+#ifdef __ROOT__
+  ClassDef(AliFemtoQinvCorrFctnEMCIC, 1)
+#endif
+};
+
+
+
+#endif
+
index a1ab870..2267a44 100644 (file)
@@ -37,3 +37,6 @@
 #pragma link C++ class AliFemtoCorrFctnGammaMonitor;
 #pragma link C++ class AliFemtoPairCutAntiGamma;
 //#pragma link C++ class AliFemtoPhiPairCut;
+#pragma link C++ class AliFemtoQinvCorrFctnEMCIC;
+#pragma link C++ class AliFemtoCorrFctn3DSphericalEMCIC;
+#pragma link C++ class AliFemtoBPLCMS3DCorrFctnEMCIC;
index 7be4e7a..a55a7f6 100644 (file)
@@ -30,6 +30,9 @@ SRCS= FEMTOSCOPY/AliFemtoUser/AliFemtoShareQualityPairCut.cxx \
       FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnTPCNcls.cxx \
       FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnDEtaDPhi.cxx \
       FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctnGammaMonitor.cxx \
+      FEMTOSCOPY/AliFemtoUser/AliFemtoQinvCorrFctnEMCIC.cxx \
+      FEMTOSCOPY/AliFemtoUser/AliFemtoCorrFctn3DSphericalEMCIC.cxx \
+      FEMTOSCOPY/AliFemtoUser/AliFemtoBPLCMS3DCorrFctnEMCIC.cxx \
       FEMTOSCOPY/AliFemtoUser/AliFemtoPairCutAntiGamma.cxx \
       FEMTOSCOPY/AliFemtoUser/AliFemtoCutMonitorParticleEtCorr.cxx