#if !defined(__CINT__) || defined(__MAKECINT__) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "AliAODRecoDecayHF.h" #include "AliRDHFCuts.h" #include "AliRDHFCutsDplustoKpipi.h" #include "AliRDHFCutsDStartoKpipi.h" #include "AliRDHFCutsD0toKpi.h" #include "AliHFMassFitter.h" #include "AliEventPlaneResolutionHandler.h" #include "AliVertexingHFUtils.h" #endif // Common variables: to be configured by the user TString filename="AnalysisResults_train63.root"; TString suffix="v2Dplus3050Cut4upcutPIDTPC"; TString partname="Dplus"; Int_t minCent=30; Int_t maxCent=50; //evPlane flag from AliEventPlaneResolutionHandler: //kTPCFullEta, kTPCPosEta,kVZERO,kVZEROA,kVZEROC Int_t evPlane=AliEventPlaneResolutionHandler::kTPCPosEta; //resolution flag fromAliEventPlaneResolutionHandler: //kTwoRandSub,kTwoChargeSub,kTwoEtaSub,kThreeSub,kThreeSubTPCGap Int_t evPlaneRes=AliEventPlaneResolutionHandler::kTwoEtaSub; Bool_t useNcollWeight=kFALSE; const Int_t nFinalPtBins=4; Double_t ptlims[nFinalPtBins+1]={3.,4.,6.,8.,12.}; Double_t sigmaRangeForSig=2.5; Double_t sigmaRangeForBkg=4.5; Int_t rebinHistoSideBands[nFinalPtBins]={2,2,2,2}; Bool_t useConstantvsBkgVsMass=kFALSE; Int_t rebinHistov2Mass[nFinalPtBins]={2,2,2,2}; Int_t factor4refl=0; Int_t minPtBin[nFinalPtBins]={-1,-1,-1,-1}; Int_t maxPtBin[nFinalPtBins]={-1,-1,-1,-1}; Bool_t saveAllCanvas=kFALSE; // systematic errors for D+, 30-50 TPC eventplane Double_t systErrMeth1[nFinalPtBins]={ (0.247359-0.152503)/2., (0.337073-0.290978)/2., (0.286888-0.222045)/2., (-0.078888+0.178259)/2. }; Double_t systErrMeth2[nFinalPtBins]={ (0.151019-0.066624)/2., (0.272252-0.232044)/2., (0.246019-0.143002)/2., (-0.026077+0.292956)/2. }; // systematic errors for 2-5, 5-8 and 8-12 (no run-by-run weights) /* Double_t systErrMeth1[nFinalPtBins]={ (0.308-0.169)/2., (0.14-0.1)/2., (0.04+0.02)/2. }; Double_t systErrMeth2[nFinalPtBins]={ (0.305-0.252)/2., (0.129-0.020)/2., (0.101+0.06)/2. }; */ // systematic errors for 2-5, 5-8 and 8-12 (93 runs with run-by-run weights) /* Double_t systErrMeth1[nFinalPtBins]={ (0.23-0.10)/2., (0.152-0.078)/2., (0.161-0.097)/2. }; Double_t systErrMeth2[nFinalPtBins]={ (0.164-0.097)/2., (0.110-0.012)/2., (0.131-0.036)/2. ; */ // systematic errors for 2-5, 5-8 and 8-12 (93 runs with run-by-run weights, RAA cuts) /* Double_t systErrMeth1[nFinalPtBins]={ (0.265-0.122)/2., (0.165-0.117)/2., (0.238-0.169)/2. }; Double_t systErrMeth2[nFinalPtBins]={ (0.174-0.135)/2., (0.18-0.11)/2., (0.311-0.28)/2. }; */ // output of mass fitter Int_t hMinBin; Int_t hMaxBin; Double_t signalFromFit,esignalFromFit; Double_t massFromFit,sigmaFromFit; TF1* fB1=0x0; TF1* fB2=0x0; TF1* fSB=0x0; void LoadMassHistos(TList* lst, TH2F** hMassDphi); Bool_t DefinePtBins(TDirectoryFile* df); Double_t v2vsMass(Double_t *x, Double_t *par); Double_t GetEPResolution(TList* lst, Double_t &rcflow, Double_t &rcfhigh); Double_t ComputeEventPlaneResolution(Double_t& error, TH1F* hsubev1, TH1F* hsubev2, TH1F* hsubev3); Bool_t FitMassSpectrum(TH1F* hMass, TPad* pad); TH1F* DoSideBands(Int_t iFinalPtBin, TH2F* hMassDphi, TH1F* hMass, Int_t rebin, TCanvas* c1, Int_t optBkg=0); TF1* DoFitv2vsMass(Int_t iFinalPtBin, TH2F* hMassDphi, TH1F* hMass, Int_t rebin, TCanvas* c2, Int_t optErrors=0, Bool_t useConst=kTRUE); //______________________________________________________________________________ void Extractv2from2Dhistos(){ // main function: computes v2 with side band and v2(M) methods gInterpreter->ExecuteMacro("$ALICE_ROOT/PWG3/vertexingHF/macros/LoadLibraries.C"); TString dirname=Form("PWGHF_D2H_HFv2_%s%s",partname.Data(),suffix.Data()); TString listname=Form("coutputv2%s%s",partname.Data(),suffix.Data()); TFile *f = TFile::Open(filename.Data()); if(!f){ printf("file %s not found, please check file name\n",filename.Data()); return; } TDirectoryFile* dir=(TDirectoryFile*)f->Get(dirname.Data()); if(!dir){ printf("Directory %s not found, please check dir name\n",dirname.Data()); return; } Bool_t binOK=DefinePtBins(dir); if(!binOK){ printf("ERROR: mismatch in pt binning\n"); return; } TList *lst =(TList*)dir->Get(listname.Data()); if(!lst){ printf("list %s not found in file, please check list name\n",listname.Data()); return; } // Double_t rcfmin,rcfmax; // Double_t resolFull=GetEPResolution(lst,rcfmin,rcfmax); // Double_t resolSyst=(rcfmax-rcfmin)/2./resolFull; // printf("Relative Systematic Error on RCF=%f\n",resolSyst); AliEventPlaneResolutionHandler* epres=new AliEventPlaneResolutionHandler(); epres->SetEventPlane(evPlane); epres->SetResolutionOption(evPlaneRes); epres->SetUseNcollWeights(useNcollWeight); Double_t resolFull=epres->GetEventPlaneResolution(minCent,maxCent); Double_t rcfmin=epres->GetEventPlaneResolution(minCent,minCent+2.5); Double_t rcfmax=epres->GetEventPlaneResolution(maxCent-2.5,maxCent); Double_t resolSyst=TMath::Abs(rcfmax-rcfmin)/2./resolFull; delete epres; printf("Event plane resolution %f\n",resolFull); TH2F** hMassDphi=new TH2F*[nFinalPtBins]; for(Int_t iFinalPtBin=0; iFinalPtBinSetPalette(1); gStyle->SetOptTitle(0); for(Int_t iFinalPtBin=0; iFinalPtBinProjectionY(); c1[iFinalPtBin]=new TCanvas(Form("cMeth1PtBin%d",iFinalPtBin),Form("Meth1PtBin%d",iFinalPtBin)); c1[iFinalPtBin]->Divide(2,2); c1[iFinalPtBin]->cd(1); hMassDphi[iFinalPtBin]->Draw("colz"); c1[iFinalPtBin]->cd(2); Bool_t out=FitMassSpectrum(hMass,(TPad*)gPad); if(!out) continue; TH1F* hCos2PhiSig=DoSideBands(iFinalPtBin,hMassDphi[iFinalPtBin],hMass,rebinHistoSideBands[iFinalPtBin],c1[iFinalPtBin]); Double_t v2obsM1=hCos2PhiSig->GetMean(); Double_t errv2obsM1=hCos2PhiSig->GetMeanError(); printf("v2obs = %f +- %f\n",v2obsM1,errv2obsM1); v2M1[iFinalPtBin]=v2obsM1/resolFull; errv2M1[iFinalPtBin]=errv2obsM1/resolFull; printf("v2 = %f +- %f\n",v2M1[iFinalPtBin],errv2M1[iFinalPtBin]); printf("\n--------- Method 2: S/S+B ----------\n"); c2[iFinalPtBin]=new TCanvas(Form("cMeth2PtBin%d",iFinalPtBin),Form("Meth2PtBin%d",iFinalPtBin)); TF1* fv2=DoFitv2vsMass(iFinalPtBin,hMassDphi[iFinalPtBin],hMass,rebinHistov2Mass[iFinalPtBin],c2[iFinalPtBin],0,useConstantvsBkgVsMass); Double_t v2obsM2=fv2->GetParameter(3); Double_t errv2obsM2=fv2->GetParError(3); printf("v2obs = %f +- %f\n",v2obsM2,errv2obsM2); v2M2[iFinalPtBin]=v2obsM2/resolFull; errv2M2[iFinalPtBin]=errv2obsM2/resolFull; printf("v2 = %f +- %f\n",v2M2[iFinalPtBin],errv2M2[iFinalPtBin]); if(saveAllCanvas){ c1[iFinalPtBin]->SaveAs(Form("cMeth1PtBin%d.root",iFinalPtBin)); c2[iFinalPtBin]->SaveAs(Form("cMeth2PtBin%d.root",iFinalPtBin)); c1[iFinalPtBin]->SaveAs(Form("cMeth1PtBin%d.eps",iFinalPtBin)); c2[iFinalPtBin]->SaveAs(Form("cMeth2PtBin%d.eps",iFinalPtBin)); } } printf("\n--------- Summary ------------\n"); TH1F* hv2m1=new TH1F("hv2m1","Side Band subtraction",nFinalPtBins,ptlims); TH1F* hv2m2=new TH1F("hv2m2","Fit to v2 vs. mass",nFinalPtBins,ptlims); for(Int_t iFinalPtBin=0; iFinalPtBinSetBinContent(iFinalPtBin+1,v2M1[iFinalPtBin]); hv2m1->SetBinError(iFinalPtBin+1,errv2M1[iFinalPtBin]); hv2m2->SetBinContent(iFinalPtBin+1,v2M2[iFinalPtBin]); hv2m2->SetBinError(iFinalPtBin+1,errv2M2[iFinalPtBin]); } TH1F* hSystErr1=(TH1F*)hv2m1->Clone("hSystErr1"); TH1F* hSystErr2=(TH1F*)hv2m2->Clone("hSystErr2"); for(Int_t iFinalPtBin=0; iFinalPtBinSetBinError(iFinalPtBin+1,syste1); hSystErr2->SetBinError(iFinalPtBin+1,syste2); } Double_t maxy=TMath::Max(hv2m2->GetMaximum(),hv2m1->GetMaximum())+0.1; Double_t miny=TMath::Min(hv2m2->GetMinimum(),hv2m1->GetMinimum())-0.1; TH2F* hempty=new TH2F("hempty","",10,0.,hv2m1->GetXaxis()->GetXmax()+2.,10,miny,maxy); hempty->GetXaxis()->SetTitle("p_{t} (GeV/c)"); hempty->GetYaxis()->SetTitle("v_{2}"); TCanvas* cv2=new TCanvas("cv2","v2"); hempty->Draw(); hv2m1->SetMarkerStyle(26); hSystErr1->SetFillColor(kGray); hSystErr1->SetFillStyle(3002); hSystErr1->Draw("e2same"); hv2m2->SetLineColor(kRed+1); hv2m2->SetMarkerColor(kRed+1); hv2m2->SetMarkerStyle(20); hSystErr2->SetFillColor(kRed-9); hSystErr2->SetFillStyle(3005); hSystErr2->Draw("e2same"); hv2m1->Draw("same"); hv2m2->Draw("same"); TLegend* leg2=new TLegend(0.5,0.7,0.89,0.89); leg2->SetFillStyle(0); TLegendEntry* ent=leg2->AddEntry(hv2m1,"Side Band subtraction","P"); ent->SetTextColor(hv2m1->GetMarkerColor()); ent=leg2->AddEntry(hv2m2,"Fit to v2 vs. mass","P"); ent->SetTextColor(hv2m2->GetMarkerColor()); leg2->Draw(); cv2->Update(); cv2->SaveAs(Form("v2%s-2Dmethods-%s.png",partname.Data(),suffix.Data())); cv2->SaveAs(Form("v2%s-2Dmethods-%s.eps",partname.Data(),suffix.Data())); TFile* outfil=new TFile(Form("v2Output2DMeth_%s_%d_%d_%s.root",partname.Data(),minCent,maxCent,suffix.Data()),"recreate"); outfil->cd(); hv2m1->Write(); hv2m2->Write(); hSystErr1->Write(); hSystErr2->Write(); outfil->Close(); } //______________________________________________________________________________ Double_t v2vsMass(Double_t *x, Double_t *par){ // Fit function for signal+background // par[0] = S/B at the mass peak // par[1] = mass // par[2] = sigma // par[3] = v2sig // par[4] = v2back Double_t fracsig=par[0]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/2./par[2]/par[2]); Double_t fracbkg=1-fracsig; return par[3]*fracsig+par[4]*fracbkg; } //______________________________________________________________________________ Double_t v2vsMassLin(Double_t *x, Double_t *par){ // Fit function for signal+background // par[0] = S/B at the mass peak // par[1] = mass // par[2] = sigma // par[3] = v2sig // par[4] = v2back constant // par[5] = v2back slope Double_t fracsig=par[0]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/2./par[2]/par[2]); Double_t fracbkg=1-fracsig; return par[3]*fracsig+(par[4]+par[5]*x[0])*fracbkg; } //______________________________________________________________________________ Bool_t FitMassSpectrum(TH1F* hMass, TPad* pad){ Int_t nMassBins=hMass->GetNbinsX(); hMinBin=3; hMaxBin=nMassBins-2; Double_t hmin=hMass->GetBinLowEdge(hMinBin); Double_t hmax=hMass->GetBinLowEdge(hMaxBin)+hMass->GetBinWidth(hMaxBin); Double_t massD; if(partname.Contains("Dzero")) { massD=TDatabasePDG::Instance()->GetParticle(421)->Mass(); }else if(partname.Contains("Dplus")){ massD=TDatabasePDG::Instance()->GetParticle(411)->Mass(); }else if(partname.Contains("Dstar")) { massD=(TDatabasePDG::Instance()->GetParticle(413)->Mass() - TDatabasePDG::Instance()->GetParticle(421)->Mass()); }else{ printf("Wrong particle name\n"); massD=TDatabasePDG::Instance()->GetParticle(421)->Mass(); } AliHFMassFitter* fitter=new AliHFMassFitter(hMass,hmin,hmax,2,0,0); fitter->SetReflectionSigmaFactor(factor4refl); fitter->SetInitialGaussianMean(massD); Bool_t out=fitter->MassFitter(0); if(!out) return kFALSE; fitter->Signal(sigmaRangeForSig, signalFromFit,esignalFromFit); massFromFit=fitter->GetMean(); sigmaFromFit=fitter->GetSigma(); fB1=fitter->GetBackgroundFullRangeFunc(); fB2=fitter->GetBackgroundRecalcFunc(); fSB=fitter->GetMassFunc(); if(!fB1) return kFALSE; if(!fB2) return kFALSE; if(!fSB) return kFALSE; if(pad){ fitter->DrawHere(gPad,3.,0.); } return kTRUE; } //______________________________________________________________________________ TH1F* DoSideBands(Int_t iFinalPtBin, TH2F* hMassDphi, TH1F* hMass, Int_t rebin, TCanvas* c1, Int_t optBkg){ // Build histo with cos(2*deltaphi) distribution for signal Double_t hmin=hMass->GetBinLowEdge(hMinBin); Double_t hmax=hMass->GetBinLowEdge(hMaxBin)+hMass->GetBinWidth(hMaxBin); Double_t minMassSig=massFromFit-sigmaRangeForSig*sigmaFromFit; Double_t maxMassSig=massFromFit+sigmaRangeForSig*sigmaFromFit; Int_t minBinSig=hMass->FindBin(minMassSig); Int_t maxBinSig=hMass->FindBin(maxMassSig); Double_t minMassSigBin=hMass->GetBinLowEdge(minBinSig); Double_t maxMassSigBin=hMass->GetBinLowEdge(maxBinSig)+hMass->GetBinWidth(maxBinSig); printf("Signal Fit Limits = %f %f\n",minMassSigBin,maxMassSigBin); Double_t maxMassBkgLow=massFromFit-sigmaRangeForBkg*sigmaFromFit; Int_t minBinBkgLow=hMinBin; Int_t maxBinBkgLow=hMass->FindBin(maxMassBkgLow); Double_t minMassBkgLowBin=hmin; Double_t maxMassBkgLowBin=hMass->GetBinLowEdge(maxBinBkgLow)+hMass->GetBinWidth(maxBinBkgLow); Double_t minMassBkgHi=massFromFit+sigmaRangeForBkg*sigmaFromFit; Int_t minBinBkgHi=hMass->FindBin(minMassBkgHi); Int_t maxBinBkgHi=hMaxBin; Double_t minMassBkgHiBin=hMass->GetBinLowEdge(minBinBkgHi); Double_t maxMassBkgHiBin=hmax; printf("BKG Fit Limits = %f %f && %f %f\n",minMassBkgLowBin,maxMassBkgLowBin,minMassBkgHiBin,maxMassBkgHiBin); Double_t bkgSig=fB2->Integral(minMassSigBin,maxMassSigBin); Double_t bkgLow=fB2->Integral(minMassBkgLowBin,maxMassBkgLowBin); Double_t bkgHi=fB2->Integral(minMassBkgHiBin,maxMassBkgHiBin); printf("Background integrals = %f %f %f\n",bkgLow,bkgSig,bkgHi); if(c1){ TBox* bleft=new TBox(minMassBkgLowBin,0.,maxMassBkgLowBin,hMass->GetMaximum()); bleft->SetFillColor(kRed+1); bleft->SetFillStyle(3002); bleft->Draw(); TBox* bright=new TBox(minMassBkgHiBin,0.,maxMassBkgHiBin,hMass->GetMaximum()); bright->SetFillColor(kBlue+1); bright->SetFillStyle(3002); bright->Draw(); TBox* bsig=new TBox(minMassSigBin,0.,maxMassSigBin,hMass->GetMaximum()*2); bsig->SetFillColor(1); bsig->SetFillStyle(3002); bsig->Draw(); } TH1F* hCos2PhiBkgLo=(TH1F*)hMassDphi->ProjectionX(Form("hCos2PhiBkgLoBin%d",iFinalPtBin),minBinBkgLow,maxBinBkgLow); TH1F* hCos2PhiBkgHi=(TH1F*)hMassDphi->ProjectionX(Form("hCos2PhiBkgHiBin%d",iFinalPtBin),minBinBkgHi,maxBinBkgHi); TH1F* hCos2PhiSigReg=(TH1F*)hMassDphi->ProjectionX(Form("hCos2PhiBkgSigBin%d",iFinalPtBin),minBinSig,maxBinSig); printf("Before Rebin11: BkgLo = %f+-%f BkgHi=%f+-%f SigReg=%f+-%f\n",hCos2PhiBkgLo->GetBinContent(11),hCos2PhiBkgLo->GetBinError(11), hCos2PhiBkgHi->GetBinContent(11),hCos2PhiBkgHi->GetBinError(11), hCos2PhiSigReg->GetBinContent(11),hCos2PhiSigReg->GetBinError(11)); printf("Before Rebin12: BkgLo = %f+-%f BkgHi=%f+-%f SigReg=%f+-%f\n",hCos2PhiBkgLo->GetBinContent(12),hCos2PhiBkgLo->GetBinError(12), hCos2PhiBkgHi->GetBinContent(12),hCos2PhiBkgHi->GetBinError(12), hCos2PhiSigReg->GetBinContent(12),hCos2PhiSigReg->GetBinError(12)); Double_t binc=hCos2PhiBkgLo->GetBinCenter(11); hCos2PhiBkgLo->Rebin(rebin); hCos2PhiBkgHi->Rebin(rebin); hCos2PhiSigReg->Rebin(rebin); hCos2PhiSigReg->SetLineWidth(2); hCos2PhiBkgLo->SetLineWidth(2); hCos2PhiBkgHi->SetLineWidth(2); hCos2PhiBkgLo->SetLineColor(kRed+1); hCos2PhiBkgHi->SetLineColor(kBlue+1); Int_t theBinR=hCos2PhiBkgLo->FindBin(binc); printf("After Rebin %d: BkgLo = %f+-%f BkgHi=%f+-%f SigReg=%f+-%f\n",theBinR, hCos2PhiBkgLo->GetBinContent(theBinR),hCos2PhiBkgLo->GetBinError(theBinR), hCos2PhiBkgHi->GetBinContent(theBinR),hCos2PhiBkgHi->GetBinError(theBinR), hCos2PhiSigReg->GetBinContent(theBinR),hCos2PhiSigReg->GetBinError(theBinR)); printf("Background Scaling: Lo->Sig= %f Hi->Sig=%f\n",bkgSig/bkgLow,bkgSig/bkgHi); hCos2PhiBkgLo->Sumw2(); hCos2PhiBkgHi->Sumw2(); TH1F* hCos2PhiBkgLoScal=(TH1F*)hCos2PhiBkgLo->Clone(Form("hCos2PhiBkgLoScalBin%d",iFinalPtBin)); hCos2PhiBkgLoScal->Scale(bkgSig/bkgLow); TH1F* hCos2PhiBkgHiScal=(TH1F*)hCos2PhiBkgHi->Clone(Form("hCos2PhiBkgHiScalBin%d",iFinalPtBin)); hCos2PhiBkgHiScal->Scale(bkgSig/bkgHi); hCos2PhiBkgLoScal->SetLineWidth(2); hCos2PhiBkgHiScal->SetLineWidth(2); hCos2PhiBkgLoScal->SetLineStyle(7); hCos2PhiBkgHiScal->SetLineStyle(2); hCos2PhiBkgLoScal->SetLineColor(kRed+1); hCos2PhiBkgHiScal->SetLineColor(kBlue+1); printf("After Scaling %d: BkgLo = %f+-%f BkgHi=%f+-%f \n",theBinR, hCos2PhiBkgLoScal->GetBinContent(theBinR),hCos2PhiBkgLoScal->GetBinError(theBinR), hCos2PhiBkgHiScal->GetBinContent(theBinR),hCos2PhiBkgHiScal->GetBinError(theBinR)); TH1F* hCos2PhiBkgAver=0x0; if(optBkg==0){ hCos2PhiBkgAver=(TH1F*)hCos2PhiBkgLoScal->Clone(Form("hCos2PhiBkgAverBin%d",iFinalPtBin)); hCos2PhiBkgAver->Add(hCos2PhiBkgHiScal); hCos2PhiBkgAver->Scale(0.5); }else if(optBkg==-1){ hCos2PhiBkgAver=(TH1F*)hCos2PhiBkgLoScal->Clone(Form("hCos2PhiBkgAverBin%d",iFinalPtBin)); }else{ hCos2PhiBkgAver=(TH1F*)hCos2PhiBkgHiScal->Clone(Form("hCos2PhiBkgAverBin%d",iFinalPtBin)); } printf("After Average %d: BkgLo = %f+-%f BkgHi=%f+-%f BkgAve=%f+-%f \n",theBinR, hCos2PhiBkgLoScal->GetBinContent(theBinR),hCos2PhiBkgLoScal->GetBinError(theBinR), hCos2PhiBkgHiScal->GetBinContent(theBinR),hCos2PhiBkgHiScal->GetBinError(theBinR), hCos2PhiBkgAver->GetBinContent(theBinR),hCos2PhiBkgAver->GetBinError(theBinR) ); hCos2PhiBkgAver->SetLineWidth(2); hCos2PhiBkgAver->SetLineColor(kGreen+1); hCos2PhiBkgAver->SetFillColor(kGreen+1); TH1F* hCos2PhiSig=(TH1F*)hCos2PhiSigReg->Clone(Form("hCos2PhiSigBin%d",iFinalPtBin)); hCos2PhiSig->Add(hCos2PhiBkgAver,-1.); printf("After Subtraction %d: All = %f+-%f BkgAve=%f+-%f Sig=%f+-%f \n",theBinR, hCos2PhiSigReg->GetBinContent(theBinR),hCos2PhiSigReg->GetBinError(theBinR), hCos2PhiBkgAver->GetBinContent(theBinR),hCos2PhiBkgAver->GetBinError(theBinR), hCos2PhiSig->GetBinContent(theBinR),hCos2PhiSig->GetBinError(theBinR) ); TLegend* leg0=new TLegend(0.3,0.6,0.75,0.89); TPaveText* t0= new TPaveText(0.15,0.70,0.45,0.89,"NDC"); if(c1){ c1->cd(3); hCos2PhiSigReg->Draw(); hCos2PhiBkgAver->Draw("same"); hCos2PhiBkgLoScal->Draw("same"); hCos2PhiBkgHiScal->Draw("same"); leg0->SetFillColor(0); TLegendEntry* ent=leg0->AddEntry(hCos2PhiSigReg,"Signal region","L"); ent->SetTextColor(hCos2PhiSigReg->GetLineColor()); ent=leg0->AddEntry(hCos2PhiBkgLoScal,"Left side band","L"); ent->SetTextColor(hCos2PhiBkgLoScal->GetLineColor()); ent=leg0->AddEntry(hCos2PhiBkgHiScal,"Right side band","L"); ent->SetTextColor(hCos2PhiBkgHiScal->GetLineColor()); ent=leg0->AddEntry(hCos2PhiBkgAver,"Average of side bands","F"); ent->SetTextColor(hCos2PhiBkgAver->GetLineColor()); leg0->Draw(); c1->cd(4); hCos2PhiSig->Draw("EP"); t0->SetFillColor(0); t0->AddText(Form("v2=%.3f+-%.3f\n",hCos2PhiSig->GetMean(),hCos2PhiSig->GetMeanError())); t0->Draw(); c1->Update(); } if(!c1){ delete leg0; delete t0; delete hCos2PhiBkgLo; delete hCos2PhiBkgHi; delete hCos2PhiSigReg; delete hCos2PhiBkgLoScal; delete hCos2PhiBkgHiScal; delete hCos2PhiBkgAver; } printf("Signal from mass fitter = %f Signal from subracted histo= %f\n", signalFromFit,hCos2PhiSig->Integral()); return hCos2PhiSig; } //______________________________________________________________________________ TF1* DoFitv2vsMass(Int_t iFinalPtBin, TH2F* hMassDphi, TH1F* hMass, Int_t rebin, TCanvas* c2, Int_t optErrors, Bool_t useConst){ Int_t npars=fSB->GetNpar(); Double_t sigmaSB=fSB->GetParameter(npars-1); Double_t massSB=fSB->GetParameter(npars-2); Double_t integr=fSB->GetParameter(npars-3); Double_t sOverAll=(fSB->Eval(massSB)-fB2->Eval(massSB))/fSB->Eval(massSB); printf("mass=%f S+B=%f bkg=%f S/(S+B)=%f\n",massSB,fSB->Eval(massSB),fB2->Eval(massSB),sOverAll); printf("Number of parameters: %d. Signal params: %f %f %f\n",npars,massSB,sigmaSB,integr); if(optErrors==1){ sOverAll+=fSB->GetParError(npars-3)/fSB->GetParameter(npars-3); } else if(optErrors==-1){ sOverAll-=fSB->GetParError(npars-3)/fSB->GetParameter(npars-3); } Int_t nbinsmass=hMassDphi->GetNbinsY(); Double_t minmass=hMassDphi->GetYaxis()->GetXmin(); Double_t maxmass=hMassDphi->GetYaxis()->GetXmax(); TF1* fSig=new TF1(Form("fSig%d",iFinalPtBin),"[0]/TMath::Sqrt(2.*TMath::Pi())/[2]*TMath::Exp(-(x-[1])*(x-[1])/2./[2]/[2])",minmass,maxmass); fSig->SetParameters(integr,massSB,sigmaSB); TH1F* hAverCos2Phi=new TH1F(Form("hAverCos2PhiBin%d",iFinalPtBin),"",nbinsmass,minmass,maxmass); TH1F* hFractionSig=new TH1F(Form("hFractionSigBin%d",iFinalPtBin),"",nbinsmass,minmass,maxmass); TH1F* hFractionBkg=new TH1F(Form("hFractionBkgBin%d",iFinalPtBin),"",nbinsmass,minmass,maxmass); for(Int_t iBin=1; iBin<=hMassDphi->GetNbinsY(); iBin++){ TH1F* htemp=(TH1F*)hMassDphi->ProjectionX("htemp",iBin,iBin); hAverCos2Phi->SetBinContent(iBin,htemp->GetMean()); hAverCos2Phi->SetBinError(iBin,htemp->GetMeanError()); Double_t sig=fSig->Eval(hFractionSig->GetBinCenter(iBin)); Double_t bkg=fB2->Eval(hFractionSig->GetBinCenter(iBin)); if(bkg<1 && sig<1){ hFractionSig->SetBinContent(iBin,0.); hFractionSig->SetBinError(iBin,0.); hFractionBkg->SetBinContent(iBin,1.); hFractionBkg->SetBinError(iBin,0.); }else{ Double_t fracs=sig/(sig+bkg); Double_t fracb=bkg/(sig+bkg); Double_t efracs=0.;//TMath::Sqrt(fracs*(1.-fracs)/(sig+bkg)); Double_t efracb=0.;//TMath::Sqrt(fracb*(1.-fracb)/(sig+bkg)); hFractionSig->SetBinContent(iBin,fracs); hFractionSig->SetBinError(iBin,efracs); hFractionBkg->SetBinContent(iBin,fracb); hFractionBkg->SetBinError(iBin,efracb); } delete htemp; } TF1* fv2=0x0; if(useConst){ fv2=new TF1(Form("fv2Bin%d",iFinalPtBin),v2vsMass,minmass,maxmass,5); }else{ fv2=new TF1(Form("fv2Bin%d",iFinalPtBin),v2vsMassLin,minmass,maxmass,6); fv2->SetParameter(5,0.); } fv2->SetParameter(0,sOverAll); fv2->SetParameter(1,massSB); fv2->SetParameter(2,sigmaSB); fv2->SetParameter(3,0.2); fv2->SetParameter(4,0.2); fv2->FixParameter(0,sOverAll); fv2->FixParameter(1,massSB); fv2->FixParameter(2,sigmaSB); printf("LOOP %d\n",rebin); if((hAverCos2Phi->GetNbinsX()%rebin)==0){ hAverCos2Phi->Rebin(rebin); hAverCos2Phi->Scale(1./(Double_t)rebin); } if(c2){ c2->Divide(2,2); c2->cd(1); hMassDphi->Draw("colz"); c2->cd(2); hMass->Rebin(2); hMass->SetMinimum(0.); hMass->SetMarkerStyle(20); hMass->Draw("E"); fSB->Draw("same"); fSig->Draw("same"); fB2->Draw("same"); c2->cd(3); hFractionSig->SetMaximum(1.2); hFractionSig->Draw(); hFractionSig->GetXaxis()->SetTitle("Mass (GeV/c^2)"); hFractionSig->GetYaxis()->SetTitle("Fraction"); hFractionBkg->SetLineColor(2); hFractionBkg->Draw("same"); TLegend* leg1=new TLegend(0.15,0.15,0.35,0.35); leg1->SetFillColor(0); TLegendEntry* ent=leg1->AddEntry(hFractionSig,"S/(S+B)","L"); ent->SetTextColor(hFractionSig->GetLineColor()); ent=leg1->AddEntry(hFractionBkg,"B/(S+B)","L"); ent->SetTextColor(hFractionBkg->GetLineColor()); leg1->Draw(); c2->cd(4); hAverCos2Phi->Fit(fv2); fv2->DrawCopy("same"); hAverCos2Phi->GetXaxis()->SetTitle("Mass (GeV/c^2)"); hAverCos2Phi->GetYaxis()->SetTitle("v_2^{obs}"); TPaveText* t1= new TPaveText(0.55,0.70,0.89,0.89,"NDC"); t1->SetFillColor(0); t1->AddText(Form("v2sig=%.3f+-%.3f\n",fv2->GetParameter(3),fv2->GetParError(3))); if(useConst){ t1->AddText(Form("v2bkg=%.3f+-%.3f\n",fv2->GetParameter(4),fv2->GetParError(4))); }else{ t1->AddText(Form("v2bkg=(%.3f+-%.3f) + (%.3g+-%.3g)*mass\n",fv2->GetParameter(4),fv2->GetParError(4),fv2->GetParameter(5),fv2->GetParError(5))); } t1->Draw(); c2->Update(); }else{ hAverCos2Phi->Fit(fv2); } return fv2; } //______________________________________________________________________________ Double_t GetEPResolution(TList* lst, Double_t &rcflow, Double_t &rcfhigh){ // Event plane resolution syst err (from wide centrality bin TH1F* hResolSubAB=0x0; TH1F* hResolSubBC=0x0; TH1F* hResolSubAC=0x0; Double_t xmin=1.; Double_t xmax=-1.; TGraphAsymmErrors* grSingle=new TGraphAsymmErrors(0); TGraphAsymmErrors* grInteg=new TGraphAsymmErrors(0); Int_t iPt=0; Int_t minCentTimesTen=minCent*10; Int_t maxCentTimesTen=maxCent*10; Double_t binHalfWid=25./20.; for(Int_t iHisC=minCentTimesTen; iHisC<=maxCentTimesTen-25; iHisC+=25){ TString hisnameAB=Form("hEvPlaneResocentr%d_%d",iHisC,iHisC+25); TString hisnameBC=Form("hEvPlaneReso2centr%d_%d",iHisC,iHisC+25); TString hisnameAC=Form("hEvPlaneReso3centr%d_%d",iHisC,iHisC+25); TH1F* hResolSubABsing=(TH1F*)lst->FindObject(hisnameAB.Data()); cout<GetName()<FindObject(hisnameBC.Data()); cout<GetName()<FindObject(hisnameAC.Data()); cout<GetName()<SetPoint(iPt,binCentr,resolFull); grSingle->SetPointEXlow(iPt,binHalfWid); grSingle->SetPointEXhigh(iPt,binHalfWid); grSingle->SetPointEYlow(iPt,resolFullmax-resolFull); grSingle->SetPointEYhigh(iPt,resolFull-resolFullmin); ++iPt; if(resolFullminxmax) xmax=resolFullmax; if(iHisC==minCentTimesTen){ hResolSubAB=(TH1F*)hResolSubABsing->Clone("hResolSubAB"); if(evPlaneRes==AliEventPlaneResolutionHandler::kThreeSub|| evPlaneRes==AliEventPlaneResolutionHandler::kThreeSubTPCGap){ hResolSubBC=(TH1F*)hResolSubBCsing->Clone("hResolSubAB"); hResolSubAC=(TH1F*)hResolSubACsing->Clone("hResolSubAB"); } }else{ hResolSubAB->Add(hResolSubABsing); if(evPlaneRes==AliEventPlaneResolutionHandler::kThreeSub|| evPlaneRes==AliEventPlaneResolutionHandler::kThreeSubTPCGap){ hResolSubBC->Add(hResolSubBCsing); hResolSubAC->Add(hResolSubACsing); } } printf("Adding histogram %s\n",hResolSubAB->GetName()); } rcflow=xmin; rcfhigh=xmax; Double_t error; Double_t resolFull=ComputeEventPlaneResolution(error,hResolSubAB,hResolSubBC,hResolSubAC); grInteg->SetPoint(0,40.,resolFull); grInteg->SetPointEXlow(0,10); grInteg->SetPointEXhigh(0,10.); grInteg->SetPointEYlow(0,error); grInteg->SetPointEYhigh(0,error); TCanvas* cEP=new TCanvas("cEP","EvPlaneResol"); cEP->Divide(1,2); cEP->cd(1); hResolSubAB->Draw(); if(evPlaneRes==AliEventPlaneResolutionHandler::kThreeSub|| evPlaneRes==AliEventPlaneResolutionHandler::kThreeSubTPCGap){ hResolSubBC->SetLineColor(2); hResolSubBC->Draw("same"); hResolSubAC->SetLineColor(4); hResolSubAC->Draw("same"); } TLatex* tres=new TLatex(0.15,0.7,Form("Resolution on full event = %.4f\n",resolFull)); tres->SetNDC(); tres->Draw(); cEP->cd(2); grSingle->SetMarkerStyle(20); grInteg->SetMarkerColor(kRed+1); grInteg->SetLineColor(kRed+1); grInteg->SetMarkerStyle(29); grSingle->Draw("AP"); grSingle->GetXaxis()->SetTitle("Centrality Percentile"); grSingle->GetYaxis()->SetTitle("Resolution Correction Factor"); grInteg->Draw("Psame"); return resolFull; } //______________________________________________________________________________ Double_t ComputeEventPlaneResolution(Double_t& error, TH1F* hsubev1, TH1F* hsubev2, TH1F* hsubev3){ Double_t resolFull; if(evPlaneRes==AliEventPlaneResolutionHandler::kTwoRandSub || evPlaneRes==AliEventPlaneResolutionHandler::kTwoChargeSub){ resolFull=AliVertexingHFUtils::GetFullEvResol(hsubev1); error = TMath::Abs(resolFull-AliVertexingHFUtils::GetFullEvResolLowLim(hsubev1)); }else if(evPlaneRes==AliEventPlaneResolutionHandler::kTwoEtaSub){ if(evPlane==AliEventPlaneResolutionHandler::kTPCFullEta){ resolFull=AliVertexingHFUtils::GetFullEvResol(hsubev1); error = TMath::Abs(resolFull-AliVertexingHFUtils::GetFullEvResolLowLim(hsubev1)); }else if(evPlane==AliEventPlaneResolutionHandler::kTPCPosEta){ resolFull=AliVertexingHFUtils::GetSubEvResol(hsubev1); error = TMath::Abs(resolFull-AliVertexingHFUtils::GetSubEvResolLowLim(hsubev1)); } }else{ Double_t resolSub[3]; Double_t errors[3]; TH1F* hevplresos[3]; hevplresos[0]=hsubev1; hevplresos[1]=hsubev2; hevplresos[2]=hsubev3; for(Int_t ires=0;ires<3;ires++){ resolSub[ires]=hevplresos[ires]->GetMean(); errors[ires]=hevplresos[ires]->GetMeanError(); } Double_t lowlim[3];for(Int_t ie=0;ie<3;ie++)lowlim[ie]=TMath::Abs(resolSub[ie]-errors[ie]); if(evPlane==AliEventPlaneResolutionHandler::kVZEROC || evPlane==AliEventPlaneResolutionHandler::kVZERO){ resolFull=TMath::Sqrt(resolSub[1]*resolSub[2]/resolSub[0]); error=resolFull-TMath::Sqrt(lowlim[2]*lowlim[1]/lowlim[0]); } else if(evPlane==AliEventPlaneResolutionHandler::kVZEROA){ resolFull=TMath::Sqrt(resolSub[0]*resolSub[2]/resolSub[1]); error=resolFull-TMath::Sqrt(lowlim[2]*lowlim[0]/lowlim[1]); } else if(evPlane==AliEventPlaneResolutionHandler::kTPCFullEta || evPlane==AliEventPlaneResolutionHandler::kTPCPosEta){ resolFull=TMath::Sqrt(resolSub[0]*resolSub[1]/resolSub[2]); error=resolFull-TMath::Sqrt(lowlim[0]*lowlim[1]/lowlim[2]); } } return resolFull; } //______________________________________________________________________________ void LoadMassHistos(TList* lst, TH2F** hMassDphi){ Int_t minCentTimesTen=minCent*10; Int_t maxCentTimesTen=maxCent*10; for(Int_t iHisC=minCentTimesTen; iHisC<=maxCentTimesTen-25; iHisC+=25){ for(Int_t iFinalPtBin=0; iFinalPtBinFindObject(hisname.Data()); if(hMassDphi[iFinalPtBin]==0x0){ hMassDphi[iFinalPtBin]=(TH2F*)htmp->Clone(Form("hMassCos2DphiBin%d",iFinalPtBin)); }else{ hMassDphi[iFinalPtBin]->Add(htmp); } printf("Adding histogram %s to PtBin %d\n",hisname.Data(),iFinalPtBin); } } } } //______________________________________________________________________________ Bool_t DefinePtBins(TDirectoryFile* df){ AliRDHFCuts *d0cuts; if(partname.Contains("Dzero")) d0cuts=(AliRDHFCutsD0toKpi*)df->Get(df->GetListOfKeys()->At(2)->GetName()); if(partname.Contains("Dplus")) d0cuts=(AliRDHFCutsDplustoKpipi*)df->Get(df->GetListOfKeys()->At(2)->GetName()); if(partname.Contains("Dstar")) d0cuts=((AliRDHFCutsDStartoKpipi*)df->Get(df->GetListOfKeys()->At(2)->GetName())); Int_t nPtBinsCuts=d0cuts->GetNPtBins(); printf("Number of pt bins for cut object = %d\n",nPtBinsCuts); Float_t *ptlimsCuts=d0cuts->GetPtBinLimits(); for(Int_t iPt=0; iPt0) maxPtBin[iFinalPtBin-1]=iPtCuts-1; } } if(TMath::Abs(ptlimsCuts[iPtCuts]-ptlims[nFinalPtBins])<0.0001) maxPtBin[nFinalPtBins-1]=iPtCuts-1; } if(TMath::Abs(ptlims[nFinalPtBins]-ptlimsCuts[nPtBinsCuts])<0.0001) maxPtBin[nFinalPtBins-1]=nPtBinsCuts-1; for(Int_t iFinalPtBin=0; iFinalPtBinExecuteMacro("$ALICE_ROOT/PWG3/vertexingHF/macros/LoadLibraries.C"); TString dirname=Form("PWGHF_D2H_HFv2_%s%s",partname.Data(),suffix.Data()); TString listname=Form("coutputv2%s%s",partname.Data(),suffix.Data()); TFile *f = TFile::Open(filename.Data()); if(!f){ printf("file %s not found, please check file name\n",filename.Data()); return; } TDirectoryFile* dir=(TDirectoryFile*)f->Get(dirname.Data()); if(!dir){ printf("Directory %s not found, please check dir name\n",dirname.Data()); return; } Bool_t binOK=DefinePtBins(dir); if(!binOK){ printf("ERROR: mismatch in pt binning\n"); return; } TList *lst =(TList*)dir->Get(listname.Data()); if(!lst){ printf("list %s not found in file, please check list name\n",listname.Data()); return; } AliEventPlaneResolutionHandler* epres=new AliEventPlaneResolutionHandler(); epres->SetEventPlane(evPlane); epres->SetResolutionOption(evPlaneRes); epres->SetUseNcollWeights(useNcollWeight); Double_t resolFull=epres->GetEventPlaneResolution(minCent,maxCent); delete epres; printf("Event plane resolution %f\n",resolFull); TH2F** hMassDphi=new TH2F*[nFinalPtBins]; for(Int_t iFinalPtBin=0; iFinalPtBinSetTitle(Form("v2 vs. nSigma Signal Region Ptbin %d",iFinalPtBin)); TH1F* hMass=(TH1F*)hMassDphi[iFinalPtBin]->ProjectionY(); Bool_t out=FitMassSpectrum(hMass,0x0); if(!out) continue; min1[iFinalPtBin]=99999.; max1[iFinalPtBin]=-99999.; min123[iFinalPtBin]=99999.; max123[iFinalPtBin]=-99999.; for(Int_t iStep=0; iStepGetMean(); Double_t errv2obsM1=hCos2PhiSig->GetMeanError(); delete hCos2PhiSig; Double_t v2M1=v2obsM1/resolFull; Double_t errv2M1=errv2obsM1/resolFull; gSystSigRange[iFinalPtBin]->SetPoint(iStep,sigmaRangeForSig,v2M1); gSystSigRange[iFinalPtBin]->SetPointError(iStep,0.,errv2M1); if(v2M1>max1[iFinalPtBin]) max1[iFinalPtBin]=v2M1; if(v2M1=2. && sigmaRangeForSig<=3){ if(v2M1>max123[iFinalPtBin]) max123[iFinalPtBin]=v2M1; if(v2M1SetTitle(Form("v2 vs. nSigma Bkg Region Ptbin %d",iFinalPtBin)); for(Int_t iStep=0; iStepGetMean(); Double_t errv2obsM1=hCos2PhiSig->GetMeanError(); delete hCos2PhiSig; Double_t v2M1=v2obsM1/resolFull; Double_t errv2M1=errv2obsM1/resolFull; gSystBkgRange[iFinalPtBin]->SetPoint(iStep,sigmaRangeForBkg,v2M1); gSystBkgRange[iFinalPtBin]->SetPointError(iStep,0.,errv2M1); if(v2M1>max2[iFinalPtBin]) max2[iFinalPtBin]=v2M1; if(v2M1SetTitle(Form("v2 vs. Rebin Ptbin %d",iFinalPtBin)); Int_t nPts=0; for(Int_t iStep=0; iStepGetNbinsY())%rebinHistoSideBands[iFinalPtBin]!=0) continue; TH1F* hCos2PhiSig=DoSideBands(index,hMassDphi[iFinalPtBin],hMass,rebinHistoSideBands[iFinalPtBin],0x0); Double_t v2obsM1=hCos2PhiSig->GetMean(); Double_t errv2obsM1=hCos2PhiSig->GetMeanError(); delete hCos2PhiSig; Double_t v2M1=v2obsM1/resolFull; Double_t errv2M1=errv2obsM1/resolFull; gSystRebin[iFinalPtBin]->SetPoint(nPts,(Double_t)rebinHistoSideBands[iFinalPtBin],v2M1); gSystRebin[iFinalPtBin]->SetPointError(nPts,0.,errv2M1); if(v2M1>max3[iFinalPtBin]) max3[iFinalPtBin]=v2M1; if(v2M1SetTitle(Form("v2 vs. WhichSide Ptbin %d",iFinalPtBin)); nPts=0; for(Int_t iStep=-1; iStep<=1; iStep++){ Int_t index=3*nSteps*nFinalPtBins+2+iStep; sigmaRangeForSig=sigmaRangeForSigOrig; sigmaRangeForBkg=sigmaRangeForBkgOrig; rebinHistoSideBands[iFinalPtBin]=rebinHistoSideBandsOrig; TH1F* hCos2PhiSig=DoSideBands(index,hMassDphi[iFinalPtBin],hMass,rebinHistoSideBands[iFinalPtBin],0x0,iStep); Double_t v2obsM1=hCos2PhiSig->GetMean(); Double_t errv2obsM1=hCos2PhiSig->GetMeanError(); delete hCos2PhiSig; Double_t v2M1=v2obsM1/resolFull; Double_t errv2M1=errv2obsM1/resolFull; gSystWhichSide[iFinalPtBin]->SetPoint(nPts,(Double_t)iStep,v2M1); gSystWhichSide[iFinalPtBin]->SetPointError(nPts,0.,errv2M1); if(v2M1>max4[iFinalPtBin]) max4[iFinalPtBin]=v2M1; if(v2M1 Envelope = %f %f\n",minenv,maxenv); } TCanvas* cs1=new TCanvas("cs1"); cs1->Divide(2,2); for(Int_t iFinalPtBin=0; iFinalPtBincd(iFinalPtBin+1); gSystSigRange[iFinalPtBin]->SetMarkerStyle(20); gSystSigRange[iFinalPtBin]->Draw("AP"); gSystSigRange[iFinalPtBin]->GetXaxis()->SetTitle("nSigmaSignal"); gSystSigRange[iFinalPtBin]->GetYaxis()->SetTitle("v2"); } TCanvas* cs2=new TCanvas("cs2"); cs2->Divide(2,2); for(Int_t iFinalPtBin=0; iFinalPtBincd(iFinalPtBin+1); gSystBkgRange[iFinalPtBin]->SetMarkerStyle(20); gSystBkgRange[iFinalPtBin]->Draw("AP"); gSystBkgRange[iFinalPtBin]->GetXaxis()->SetTitle("nSigmaBackground"); gSystBkgRange[iFinalPtBin]->GetYaxis()->SetTitle("v2"); } TCanvas* cs3=new TCanvas("cs3"); cs3->Divide(2,2); for(Int_t iFinalPtBin=0; iFinalPtBincd(iFinalPtBin+1); gSystRebin[iFinalPtBin]->SetMarkerStyle(20); gSystRebin[iFinalPtBin]->Draw("AP"); gSystRebin[iFinalPtBin]->GetXaxis()->SetTitle("Rebin factor"); gSystRebin[iFinalPtBin]->GetYaxis()->SetTitle("v2"); } TCanvas* cs4=new TCanvas("cs4"); cs4->Divide(2,2); for(Int_t iFinalPtBin=0; iFinalPtBincd(iFinalPtBin+1); gSystWhichSide[iFinalPtBin]->SetMarkerStyle(20); gSystWhichSide[iFinalPtBin]->Draw("AP"); gSystWhichSide[iFinalPtBin]->GetXaxis()->SetTitle("Side band used"); gSystWhichSide[iFinalPtBin]->GetYaxis()->SetTitle("v2"); } } //______________________________________________________________________________ void SystForFitv2Mass(){ // Compute systematic ucnertainty for the v2(M) method gInterpreter->ExecuteMacro("$ALICE_ROOT/PWG3/vertexingHF/macros/LoadLibraries.C"); TString dirname=Form("PWGHF_D2H_HFv2_%s%s",partname.Data(),suffix.Data()); TString listname=Form("coutputv2%s%s",partname.Data(),suffix.Data()); TFile *f = TFile::Open(filename.Data()); if(!f){ printf("file %s not found, please check file name\n",filename.Data()); return; } TDirectoryFile* dir=(TDirectoryFile*)f->Get(dirname.Data()); if(!dir){ printf("Directory %s not found, please check dir name\n",dirname.Data()); return; } Bool_t binOK=DefinePtBins(dir); if(!binOK){ printf("ERROR: mismatch in pt binning\n"); return; } TList *lst =(TList*)dir->Get(listname.Data()); if(!lst){ printf("list %s not found in file, please check list name\n",listname.Data()); return; } AliEventPlaneResolutionHandler* epres=new AliEventPlaneResolutionHandler(); epres->SetEventPlane(evPlane); epres->SetResolutionOption(evPlaneRes); epres->SetUseNcollWeights(useNcollWeight); Double_t resolFull=epres->GetEventPlaneResolution(minCent,maxCent); delete epres; printf("Event plane resolution %f\n",resolFull); TH2F** hMassDphi=new TH2F*[nFinalPtBins]; for(Int_t iFinalPtBin=0; iFinalPtBinProjectionY(); Bool_t out=FitMassSpectrum(hMass,0x0); if(!out) continue; min1[iFinalPtBin]=99999.; max1[iFinalPtBin]=-99999.; gSystRebin[iFinalPtBin]=new TGraphErrors(0); gSystRebin[iFinalPtBin]->SetTitle(Form("v2 vs. Rebin PtBin %d",iFinalPtBin)); Int_t nPts=0; for(Int_t iStep=0; iStepGetNbinsY())%rebinHistov2Mass[iFinalPtBin]!=0) continue; TF1* fv2=DoFitv2vsMass(index,hMassDphi[iFinalPtBin],hMass,rebinHistov2Mass[iFinalPtBin],0x0,0,useConstantvsBkgVsMass); Double_t v2obsM2=fv2->GetParameter(3); Double_t errv2obsM2=fv2->GetParError(3); delete fv2; Double_t v2M2=v2obsM2/resolFull; Double_t errv2M2=errv2obsM2/resolFull; gSystRebin[iFinalPtBin]->SetPoint(nPts,(Double_t)rebinHistov2Mass[iFinalPtBin],v2M2); gSystRebin[iFinalPtBin]->SetPointError(nPts,0.,errv2M2); if(v2M2>max1[iFinalPtBin]) max1[iFinalPtBin]=v2M2; if(v2M2SetTitle(Form("v2 vs. ParamErr PtBin %d",iFinalPtBin)); nPts=0; for(Int_t iStep=-1; iStep<=1; iStep++){ Int_t index=nSteps*2+iStep; TF1* fv2=DoFitv2vsMass(index,hMassDphi[iFinalPtBin],hMass,rebinHistov2Mass[iFinalPtBin],0x0,iStep,useConstantvsBkgVsMass); Double_t v2obsM2=fv2->GetParameter(3); Double_t errv2obsM2=fv2->GetParError(3); delete fv2; Double_t v2M2=v2obsM2/resolFull; Double_t errv2M2=errv2obsM2/resolFull; gSystParamErr[iFinalPtBin]->SetPoint(nPts,(Double_t)iStep,v2M2); gSystParamErr[iFinalPtBin]->SetPointError(nPts,0.,errv2M2); if(v2M2>max2[iFinalPtBin]) max2[iFinalPtBin]=v2M2; if(v2M2SetTitle(Form("v2 LinVsConst Bin%d",iFinalPtBin)); nPts=0; for(Int_t iStep=0; iStep<=1; iStep++){ Int_t index=nSteps*3+iStep; TF1* fv2=DoFitv2vsMass(index,hMassDphi[iFinalPtBin],hMass,rebinHistov2Mass[iFinalPtBin],0x0,0,iStep); Double_t v2obsM2=fv2->GetParameter(3); Double_t errv2obsM2=fv2->GetParError(3); delete fv2; Double_t v2M2=v2obsM2/resolFull; Double_t errv2M2=errv2obsM2/resolFull; gSystLinConst[iFinalPtBin]->SetPoint(nPts,1.-(Double_t)iStep,v2M2); gSystLinConst[iFinalPtBin]->SetPointError(nPts,0.,errv2M2); if(v2M2>max3[iFinalPtBin]) max3[iFinalPtBin]=v2M2; if(v2M2 Envelope = %f %f\n",minenv,maxenv); } TCanvas* cs1=new TCanvas("cs1"); cs1->Divide(2,2); for(Int_t iFinalPtBin=0; iFinalPtBincd(iFinalPtBin+1); gSystRebin[iFinalPtBin]->SetMarkerStyle(20); gSystRebin[iFinalPtBin]->Draw("AP"); gSystRebin[iFinalPtBin]->GetXaxis()->SetTitle("Rebin factor"); gSystRebin[iFinalPtBin]->GetYaxis()->SetTitle("v2"); } TCanvas* cs2=new TCanvas("cs2"); cs2->Divide(2,2); for(Int_t iFinalPtBin=0; iFinalPtBincd(iFinalPtBin+1); gSystParamErr[iFinalPtBin]->SetMarkerStyle(20); gSystParamErr[iFinalPtBin]->Draw("AP"); gSystParamErr[iFinalPtBin]->GetXaxis()->SetTitle("Error on Signal yield"); gSystParamErr[iFinalPtBin]->GetYaxis()->SetTitle("v2"); } TCanvas* cs3=new TCanvas("cs3"); cs3->Divide(2,2); for(Int_t iFinalPtBin=0; iFinalPtBincd(iFinalPtBin+1); gSystLinConst[iFinalPtBin]->SetMarkerStyle(20); gSystLinConst[iFinalPtBin]->Draw("AP"); gSystLinConst[iFinalPtBin]->GetXaxis()->SetLimits(-0.1,1.1); gSystLinConst[iFinalPtBin]->GetXaxis()->SetTitle("Const/Linear v2 of background"); gSystLinConst[iFinalPtBin]->GetYaxis()->SetTitle("v2"); } }