16 #define ALIFLOWANALYSISWITHSCALARPRODUCT_CXX
51 fApplyCorrectionForNUA(0),
53 fNormalizationType(1),
58 fHistProQaQbNorm(NULL),
59 fHistSumOfWeights(NULL),
65 fHistQNormQaQbNorm(NULL),
71 fHistNumberOfSubtractedDaughters(NULL),
77 for(
int i=0; i!=2; ++i) {
78 fPhiWeightsSub[i] = NULL;
79 for(
int j=0; j!=2; ++j) {
80 fHistProUQ[i][j] = NULL;
81 fHistProUQQaQb[i][j] = NULL;
82 fHistProNUAu[i][j][0] = NULL;
83 fHistProNUAu[i][j][1] = NULL;
84 for(
int k=0; k!=3; ++k)
85 fHistSumOfWeightsu[i][j][k] = NULL;
104 Bool_t oldHistAddStatus = TH1::AddDirectoryStatus();
105 TH1::AddDirectory(kFALSE);
112 uQRelated->SetName(
"uQ");
113 uQRelated->SetOwner();
116 nuaRelated->SetName(
"NUA");
117 nuaRelated->SetOwner();
120 errorRelated->SetName(
"error");
121 errorRelated->SetOwner();
124 tQARelated->SetName(
"QA");
125 tQARelated->SetOwner();
138 fHistProConfig =
new TProfile(
"FlowPro_Flags_SP",
"Flow_Flags_SP",4,0.5,4.5,
"s");
139 fHistProConfig->GetXaxis()->SetBinLabel(1,
"fApplyCorrectionForNUA");
149 fHistProQaQbNorm =
new TProfile(
"FlowPro_QaQbNorm_SP",
"FlowPro_QaQbNorm_SP", 1, 0.5, 1.5,
"s");
153 fHistProNUAq =
new TProfile(
"FlowPro_NUAq_SP",
"FlowPro_NUAq_SP", 6, 0.5, 6.5,
"s");
154 fHistProNUAq->GetXaxis()->SetBinLabel( 1,
"<<sin(#Phi_{a})>>");
155 fHistProNUAq->GetXaxis()->SetBinLabel( 2,
"<<cos(#Phi_{a})>>");
156 fHistProNUAq->GetXaxis()->SetBinLabel( 3,
"<<sin(#Phi_{b})>>");
157 fHistProNUAq->GetXaxis()->SetBinLabel( 4,
"<<cos(#Phi_{b})>>");
158 fHistProNUAq->GetXaxis()->SetBinLabel( 5,
"<<sin(#Phi_{t})>>");
159 fHistProNUAq->GetXaxis()->SetBinLabel( 6,
"<<cos(#Phi_{t})>>");
167 TString sPOI[2] = {
"RP",
"POI"};
168 TString sEta[2] = {
"Pt",
"eta"};
169 TString sTitle[2] = {
"p_{T} [GeV]",
"#eta"};
170 TString sWeights[3] = {
"uQ",
"uQuQ",
"uQQaQb"};
179 for(
Int_t iPOI=0; iPOI!=2; ++iPOI)
180 for(
Int_t iSpace=0; iSpace!=2; ++iSpace) {
182 fHistProUQ[iPOI][iSpace] =
new TProfile( Form(
"FlowPro_UQ_%s%s_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
183 Form(
"FlowPro_UQ%s%s_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
184 iNbins[iSpace], dMin[iSpace], dMax[iSpace],
"s");
190 fHistProNUAu[iPOI][iSpace][0] =
new TProfile( Form(
"FlowPro_NUAu_%s%s_IM_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
191 Form(
"FlowPro_NUAu_%s%s_IM_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
192 iNbins[iSpace], dMin[iSpace], dMax[iSpace]);
195 fHistProNUAu[iPOI][iSpace][1] =
new TProfile( Form(
"FlowPro_NUAu_%s%s_RE_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
196 Form(
"FlowPro_NUAu_%s%s_RE_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
197 iNbins[iSpace], dMin[iSpace], dMax[iSpace]);
202 fHistProUQQaQb[iPOI][iSpace] =
new TProfile( Form(
"FlowPro_UQQaQb_%s%s_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
203 Form(
"FlowPro_UQQaQb_%s%s_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ),
204 iNbins[iSpace], dMin[iSpace], dMax[iSpace]);
210 for(
Int_t i=0; i!=3; ++i) {
212 Form(
"Flow_SumOfWeights_%s%s_%s_SP",sWeights[i].
Data(),sPOI[iPOI].
Data(),sEta[iSpace].
Data()),
213 iNbins[iSpace], dMin[iSpace], dMax[iSpace]);
222 printf(
"WARNING: fWeightsList is NULL in the Scalar Product method.\n" );
228 printf(
"WARNING: phi_weights_sub0 not found in the Scalar Product method.\n" );
235 printf(
"WARNING: phi_weights_sub1 not found in the Scalar Product method.\n" );
242 fHistProQNorm =
new TProfile(
"FlowPro_QNorm_SP",
"FlowPro_QNorm_SP", 1,0.5,1.5,
"s");
246 fHistProQaQb =
new TProfile(
"FlowPro_QaQb_SP",
"FlowPro_QaQb_SP", 1,0.5,1.5,
"s");
250 fHistProQaQbM =
new TProfile(
"FlowPro_QaQbvsM_SP",
"FlowPro_QaQbvsM_SP",1000,0.0,10000);
256 fHistMaMb =
new TH2D(
"Flow_MavsMb_SP",
"Flow_MavsMb_SP",100,0.,100.,100,0.,100.);
266 fHistQaNormMa =
new TH2D(
"Flow_QaNormvsMa_SP",
"Flow_QaNormvsMa_SP",100,0.,100.,22,0.,1.1);
271 fHistQbNormMb =
new TH2D(
"Flow_QbNormvsMb_SP",
"Flow_QbNormvsMb_SP",100,0.,100.,22,0.,1.1);
276 fResolution =
new TH1D(
"Flow_resolution_SP",
"Flow_resolution_SP",100,-1.0,1.0);
277 fResolution->SetYTitle(
"dN/d(Cos2(#phi_a - #phi_b))");
281 fHistQaQb =
new TH1D(
"Flow_QaQb_SP",
"Flow_QaQb_SP",200,-100.,100.);
286 fHistQaQbCos =
new TH1D(
"Flow_QaQbCos_SP",
"Flow_QaQbCos_SP",63,0.,TMath::Pi());
300 TH1::AddDirectory(oldHistAddStatus);
306 if (!anEvent)
return;
321 if( dMa < 2 )
return;
323 if( dMb < 2 )
return;
377 for (
Int_t i=0;i<iNumberOfTracks;i++) {
379 if (!pTrack)
continue;
404 for(
Int_t inSubEvent=0; inSubEvent<2; ++inSubEvent) {
418 Int_t phiBin = 1+(
Int_t)(TMath::Floor(dPhi*iNBinsPhiSub/TMath::TwoPi()));
435 dMq = dMq-dW*pTrack->
Weight();
444 fHistQaQbCos->Fill(TMath::ACos((vQa*vQb)/vQa.Mod()/vQb.Mod()));
445 fResolution->Fill( TMath::Cos( vQa.Phi()-vQb.Phi() ) );
457 for(
Int_t iPOI=0; iPOI!=2; ++iPOI) {
465 fHistProUQQaQb[iPOI][0]-> Fill(dPt ,dUQ/dNq*dQaQb/dNa/dNb,dWq*dWa*dWb);
466 fHistProUQQaQb[iPOI][1]-> Fill(dEta,dUQ/dNq*dQaQb/dNa/dNb,dWq*dWa*dWb);
499 fHistProNUAq = (TProfile*) nua->FindObject(
"FlowPro_NUAq_SP");
500 if(!
fHistProNUAq) printf(
"Error loading fHistProNUAq\n");
504 TString sPOI[2] = {
"RP",
"POI"};
505 TString sEta[2] = {
"Pt",
"eta"};
506 TString sWeights[3] = {
"uQ",
"uQuQ",
"uQQaQb"};
507 for(
Int_t iPOI=0; iPOI!=2; ++iPOI)
for(
Int_t iSpace=0; iSpace!=2; ++iSpace) {
508 fHistProUQ[iPOI][iSpace] = (TProfile*) uQ->FindObject( Form(
"FlowPro_UQ_%s%s_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ) );
509 if(!
fHistProUQ[iPOI][iSpace]) printf(
"Error loading fHistProUQ[%d][%d]\n",iPOI,iSpace);
510 fHistProNUAu[iPOI][iSpace][0] = (TProfile*) nua->FindObject( Form(
"FlowPro_NUAu_%s%s_IM_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ) );
511 if(!
fHistProNUAu[iPOI][iSpace][0]) printf(
"Error loading fHistProNUAu[%d][%d][0]\n",iPOI,iSpace);
512 fHistProNUAu[iPOI][iSpace][1] = (TProfile*) nua->FindObject( Form(
"FlowPro_NUAu_%s%s_RE_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ) );
513 if(!
fHistProNUAu[iPOI][iSpace][1]) printf(
"Error loading fHistProNUAu[%d][%d][1]\n",iPOI,iSpace);
514 fHistProUQQaQb[iPOI][iSpace] = (TProfile*) error->FindObject( Form(
"FlowPro_UQQaQb_%s%s_SP", sEta[iSpace].
Data(), sPOI[iPOI].
Data() ) );
515 for(
Int_t i=0; i!=3; ++i){
517 if(!
fHistSumOfWeightsu[iPOI][iSpace][i]) printf(
"Error loading fHistSumOfWeightsu[%d][%d][%d]\n",iPOI,iSpace,i);
531 printf(
"AliFlowAnalysisWithScalarProduct::Finish()\n");
538 printf(
"*************************************\n");
539 printf(
"*************************************\n");
540 printf(
" Integrated flow from \n");
541 printf(
" Scalar Product \n\n");
543 printf(
" (BehaveAsEP) \n\n");
549 if( dEntriesQaQb < 1 )
562 dQaQb = dQaQb - dImQa*dImQb - dReQa*dReQb;
563 printf(
"QaQb = %f +- %f\n", dQaQb, (dSpreadQaQb/TMath::Sqrt(dEntriesQaQb)) );
566 printf(
"ResSub = %f\n", dV );
571 printf(
"An estimate of the event plane resolution is: %f\n", dV );
574 printf(
"ResTot = %f\n", dV );
583 if(dSumOfLinearWeights)
584 dTerm1 = pow(dSumOfQuadraticWeights,0.5)/dSumOfLinearWeights;
585 if(1.-pow(dTerm1,2.) > 0.)
586 dTerm2 = 1./pow(1-pow(dTerm1,2.),0.5);
587 Double_t dStatErrorQaQb = dTerm1 * dSpreadQaQb * dTerm2;
590 dVerr = (1./(2.*pow(dQaQb,0.5)))*dStatErrorQaQb;
592 printf(
"v%d(subevents) = %f +- %f\n",
fHarmonic,dV,dVerr);
601 for(
Int_t iRFPorPOI=0; iRFPorPOI != 2; ++iRFPorPOI)
602 for(
Int_t iPTorETA=0; iPTorETA != 2; ++iPTorETA)
603 for(
Int_t b=1; b != iNbins[iPTorETA]+1; ++b) {
610 if( TMath::Abs(dV!=0.) ) { dv2pro = duQpro/dV; }
613 if( (iRFPorPOI==0)&&(iPTorETA==0) )
615 if( (iRFPorPOI==0)&&(iPTorETA==1) )
617 if( (iRFPorPOI==1)&&(iPTorETA==0) )
619 if( (iRFPorPOI==1)&&(iPTorETA==1) )
625 printf(
"*************************************\n");
626 printf(
"*************************************\n");
633 outputFileName->Write(outputFileName->GetName(), TObject::kSingleKey);
650 dQaQb = dQaQb - dImQa*dImQb - dReQa*dReQb;
656 dTerm1 = (pow(sumOfMqSquared,0.5)/sumOfMq);
658 if(1.-pow(dTerm1,2.)>0.) {
659 dTerm2 = 1./pow(1.-pow(dTerm1,2.),0.5);
661 Double_t duQproErr = dTerm1*duQproSpread*dTerm2;
667 if(dTerm2Cov*dTerm3Cov>0.) {
668 Double_t dDenominator = 1.-dTerm1Cov/(dTerm2Cov*dTerm3Cov);
669 Double_t dPrefactor = dTerm1Cov/(dTerm2Cov*dTerm3Cov);
670 if(dDenominator!=0) {
672 dWeightedCovariance = dCovariance*dPrefactor;
677 Double_t dv2ProErrorSquared = (1./4.)*pow(dQaQb,-3.)*
678 (pow(
fHistProUQ[iRFPorPOI][iPTorETA]->GetBinContent(b),2.)*pow(aStatErrorQaQb,2.)
679 + 4.*pow(dQaQb,2.)*pow(duQproErr,2.)
680 - 4.*dQaQb*
fHistProUQ[iRFPorPOI][iPTorETA]->GetBinContent(b)*dWeightedCovariance);
681 if(dv2ProErrorSquared>0.) dv2ProErr = pow(dv2ProErrorSquared,0.5);
689 printf(
"Warning: Estimation of total resolution might be WRONG. Please check!");
693 Double_t b = TMath::Exp(-a)*TMath::BesselI0(a)+TMath::Exp(-a)*TMath::BesselI1(a);
694 return TMath::Sqrt(TMath::PiOver2())/2*x*b;
700 printf(
"Warning: Resolution for subEvent is high. You reached the precision limit.");
704 Double_t xtmp=0, xmin=0, xmax=51.3, rtmp=0, delta=2*prec;
705 while( delta > prec ) {
706 xtmp = 0.5*(xmin+xmax);
708 delta = TMath::Abs( res-rtmp );
709 if(rtmp>res) xmax = xtmp;
710 if(rtmp<res) xmin = xtmp;
Double_t GetEtaMax() const
virtual ~AliFlowAnalysisWithScalarProduct()
ClassImp(AliFlowAnalysisWithScalarProduct) AliFlowAnalysisWithScalarProduct
TH2D * fHistQNormQaQbNorm
AliFlowTrackSimple * GetTrack(Int_t i)
Bool_t InSubevent(Int_t i) const
Int_t GetNumberOfRPs() const
Double_t GetPtMin() const
TH1D * fHistSumOfWeightsu[2][2][3]
Bool_t FillDifferentialFlowPtRP(Int_t aBin, Double_t av, Double_t anError)
Double_t CalculateStatisticalError(Int_t RFPorPOI, Int_t PTorETA, Int_t bin, Double_t errV) const
Double_t GetPtMax() const
TProfile * fHistProNUAu[2][2][2]
Int_t SubtractTrackWithDaughters(const AliFlowTrackSimple *track, Double_t extraWeight=1.)
Bool_t InRPSelection() const
Bool_t FillControlHistograms(AliFlowEventSimple *anEvent, TList *weightsList=NULL, Bool_t usePhiWeights=kFALSE, Bool_t usePtWeights=kFALSE, Bool_t useEtaWeights=kFALSE)
TH1I * fHistNumberOfSubtractedDaughters
void WriteHistograms(TDirectoryFile *outputFileName) const
TProfile * fHistProUQQaQb[2][2]
Int_t GetNbinsEta() const
static AliFlowCommonConstants * GetMaster()
TProfile * fHistProConfig
AliFlowCommonHistResults * fCommonHistsRes
TProfile * fHistProUQ[2][2]
AliFlowCommonHist * fCommonHists
virtual void Get2Qsub(AliFlowVector *Qarray, Int_t n=2, TList *weightsList=NULL, Bool_t usePhiWeights=kFALSE, Bool_t usePtWeights=kFALSE, Bool_t useEtaWeights=kFALSE)
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
Bool_t FillIntegratedFlow(Double_t aV, Double_t anError)
Bool_t FillDifferentialFlowEtaPOI(Int_t aBin, Double_t av, Double_t anError)
Int_t fApplyCorrectionForNUA
Bool_t FillDifferentialFlowPtPOI(Int_t aBin, Double_t av, Double_t anError)
Double_t GetEtaMin() const
Double_t FindXi(Double_t res, Double_t prec) const
Bool_t InPOISelection(Int_t poiType=1) const
void Make(AliFlowEventSimple *anEvent)
Bool_t FillDifferentialFlowEtaRP(Int_t aBin, Double_t av, Double_t anError)
void GetOutputHistograms(TList *outputListHistos)
Double_t ComputeResolution(Double_t x) const
TProfile * fHistProQaQbNorm
Int_t NumberOfTracks() const