//////////////////////////////////////////////////////////////////////////////// // // // 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 "AliFemtoModelHiddenInfo.h" //#include "AliFemtoHisto.hh" #include #include #ifdef __ROOT__ ClassImp(AliFemtoCorrFctnDEtaDPhi) #endif #define PIH 1.57079632679489656 #define PIT 6.28318530717958623 #define PIQ 4.71238898038468967 //____________________________ AliFemtoCorrFctnDEtaDPhi::AliFemtoCorrFctnDEtaDPhi(char* title, const int& aPhiBins=20, const int& aEtaBins=20): AliFemtoCorrFctn(), fDPhiDEtaNumerator(0), fDPhiDEtaDenominator(0), fDPhiNumerator(0), fDPhiDenominator(0), fDCosNumerator(0), fDCosDenominator(0), fDoPtAnalysis(0), fDPhiPtNumerator(0), fDPhiPtDenominator(0), fDCosPtNumerator(0), fDCosPtDenominator(0) { // set up numerator char tTitNumD[101] = "NumDPhiDEta"; strncat(tTitNumD,title, 100); fDPhiDEtaNumerator = new TH2D(tTitNumD,title,aPhiBins,-0.5*TMath::Pi(),1.5*TMath::Pi(),aEtaBins,-2.5,2.5); // set up denominator char tTitDenD[101] = "DenDPhiDEta"; strncat(tTitDenD,title, 100); fDPhiDEtaDenominator = new TH2D(tTitDenD,title,aPhiBins,-0.5*TMath::Pi(),1.5*TMath::Pi(),aEtaBins,-2.5,2.5); // set up numerator char tTitNumDPhi[101] = "NumDPhi"; strncat(tTitNumDPhi,title, 100); fDPhiNumerator = new TH1D(tTitNumDPhi,title,aPhiBins*2,-0.5*TMath::Pi(),1.5*TMath::Pi()); // set up denominator char tTitDenDPhi[101] = "DenDPhi"; strncat(tTitDenDPhi,title, 100); fDPhiDenominator = new TH1D(tTitDenDPhi,title,aPhiBins*2,-0.5*TMath::Pi(),1.5*TMath::Pi()); // set up numerator char tTitNumDCos[101] = "NumDCos"; strncat(tTitNumDCos,title, 100); fDCosNumerator = new TH1D(tTitNumDCos,title,aPhiBins*2,-1.0,1.0); // set up denominator char tTitDenDCos[101] = "DenDCos"; strncat(tTitDenDCos,title, 100); fDCosDenominator = new TH1D(tTitDenDCos,title,aPhiBins*2,-1.0,1.0); // to enable error bar calculation... fDPhiDEtaNumerator->Sumw2(); fDPhiDEtaDenominator->Sumw2(); fDPhiNumerator->Sumw2(); fDPhiDenominator->Sumw2(); fDCosNumerator->Sumw2(); fDCosDenominator->Sumw2(); } //____________________________ AliFemtoCorrFctnDEtaDPhi::AliFemtoCorrFctnDEtaDPhi(const AliFemtoCorrFctnDEtaDPhi& aCorrFctn) : AliFemtoCorrFctn(), fDPhiDEtaNumerator(0), fDPhiDEtaDenominator(0), fDPhiNumerator(0), fDPhiDenominator(0), fDCosNumerator(0), fDCosDenominator(0), fDoPtAnalysis(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.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 fDPhiNumerator; delete fDPhiDenominator; delete fDCosNumerator; delete fDCosDenominator; if (fDoPtAnalysis) { 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.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]; snprintf(ctemp , 100, "Number of entries in numerator:\t%E\n",fDPhiDEtaNumerator->GetEntries()); stemp += ctemp; snprintf(ctemp , 100, "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 if (fPairCut) if (!fPairCut->Pass(pair)) return; 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<-PIH) dphi+=PIT; while (dphi>PIQ) dphi-=PIT; 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); fDPhiNumerator->Fill(dphi); // fDCosNumerator->Fill(cosphi); if (fDoPtAnalysis) { // fDPhiPtNumerator->Fill(dphi, ptmin); // fDCosPtNumerator->Fill(cosphi, ptmin); } } //____________________________ void AliFemtoCorrFctnDEtaDPhi::AddMixedPair( AliFemtoPair* pair){ // add mixed (background) pair if (fPairCut) if (!fPairCut->Pass(pair)) return; 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<-PIH) dphi+=PIT; while (dphi>PIQ) dphi-=PIT; 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); fDPhiDenominator->Fill(dphi); // fDCosDenominator->Fill(cosphi); if (fDoPtAnalysis) { // fDPhiPtDenominator->Fill(dphi, ptmin); // fDCosPtDenominator->Fill(cosphi, ptmin); } } void AliFemtoCorrFctnDEtaDPhi::WriteHistos() { // Write out result histograms fDPhiDEtaNumerator->Write(); fDPhiDEtaDenominator->Write(); fDPhiNumerator->Write(); fDPhiDenominator->Write(); fDCosNumerator->Write(); fDCosDenominator->Write(); if (fDoPtAnalysis) { 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(fDPhiNumerator); tOutputList->Add(fDPhiDenominator); tOutputList->Add(fDCosNumerator); tOutputList->Add(fDCosDenominator); if (fDoPtAnalysis) { tOutputList->Add(fDPhiPtNumerator); tOutputList->Add(fDPhiPtDenominator); tOutputList->Add(fDCosPtNumerator); tOutputList->Add(fDCosPtDenominator); } return tOutputList; } void AliFemtoCorrFctnDEtaDPhi::SetDoPtAnalysis(int do2d) { fDoPtAnalysis = do2d; int aPhiBins = fDPhiDEtaNumerator->GetNbinsX(); const char *title = fDPhiDEtaNumerator->GetTitle(); // set up numerator char tTitNumDPhiPt[101] = "NumDPhiPt"; strncat(tTitNumDPhiPt,title, 100); 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[101] = "DenDPhiPt"; strncat(tTitDenDPhiPt,title, 100); 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[101] = "NumDCosPt"; strncat(tTitNumDCosPt,title, 100); fDCosPtNumerator = new TH2D(tTitNumDCosPt,title,aPhiBins*2,-1.0,1.0, 30, 0.0, 3.0); // set up denominator char tTitDenDCosPt[101] = "DenDCosPt"; strncat(tTitDenDCosPt,title, 100); fDCosPtDenominator = new TH2D(tTitDenDCosPt,title,aPhiBins*2,-1.0,1.0, 30, 0.0, 3.0); fDPhiPtNumerator->Sumw2(); fDPhiPtDenominator->Sumw2(); fDCosPtNumerator->Sumw2(); fDCosPtDenominator->Sumw2(); }