void fit_mass(TString fileN="") {//suffix added before file extension, e.g., '.pdf' TString placeholder;//to add strings before using them, e.g., for saving text files gROOT->SetBatch(kTRUE); gROOT->ProcessLine(".x /afs/cern.ch/user/m/mwilkins/cmtuser/src/lhcbStyle.C"); // gStyle->SetPadTickX(1); // gStyle->SetPadTickY(1); // gStyle->SetPadLeftMargin(0.15); // gStyle->SetTextSize(0.3); // //open file and get histogram // TFile *inHistos = new TFile("/afs/cern.ch/work/m/mwilkins/Lb2JpsiLtr/data/histos_data.root", "READ"); // TH1F * h100 = (TH1F*)inHistos->Get("h70"); // cout<<"data histogram gotten"<<endl; //unbinned TFile *hastree = new TFile("/afs/cern.ch/work/m/mwilkins/Lb2JpsiLtr/data/cutfile_Optimized.root", "READ"); TTree * h100 = (TTree*)hastree->Get("mytree"); cout<<"tree gotten"<<endl; TFile *SMChistos= new TFile("/afs/cern.ch/work/m/mwilkins/Lb2JpsiLtr/MC/withKScut/histos_SMCfile_fullMC.root", "READ"); cout<<"SMC file opened"<<endl; TH1F *SMCh = (TH1F*)SMChistos->Get("h00"); cout<<"SMC hist gotten"<<endl; RooRealVar *mass = new RooRealVar("Bs_LOKI_MASS_JpsiConstr","m(J/#psi #Lambda)",4100,6100,"MeV"); mass->setRange("bkg1",4300,4800); mass->setRange("bkg2",5700,5950); mass->setRange("bkg3",4300,5500); mass->setRange("bkg4",5100,5500); mass->setRange("L",5350,5950); mass->setRange("tot",4300,5950); cout<<"mass declared"<<endl; // RooDataHist *data = new RooDataHist("data","1D",RooArgList(*mass),h100); //unbinned RooDataSet *data = new RooDataSet("data","1D",h100,*mass); cout<<"data declared"<<endl; RooDataHist *SMC = new RooDataHist("SMC","1D",RooArgList(*mass),SMCh); cout<<"SMC hist assigned to RooDataHist"<<endl; // Construct Pdf Model // /\0 //gaussian RooRealVar mean1L("mean1L","/\\ gaus 1: mean",5621.103095,5525,5700); RooRealVar sig1L("sig1L","/\\ gaus 1: sigma",6.898126,0,100); RooGaussian gau1L("gau1L","#Lambda signal: gaussian 1",*mass,mean1L,sig1L); RooFormulaVar mean2L("mean2L","@0",mean1L); RooRealVar sig2L("sig2L","/\\ gaus 2: sigma",14.693117,0,100); RooGaussian gau2L("gau2L","#Lambda signal: gaussian 2",*mass,mean2L,sig2L); RooRealVar f1L("f1L","/\\ signal: fraction gaussian 1",0.748776,0,1); RooAddPdf sigL("sigL","#Lambda signal",RooArgList(gau1L,gau2L),RooArgList(f1L)); // //CB // RooRealVar mean3L("mean3L","/\\ CB: mean",5621.001,5525,5700); // RooRealVar sig3L("sig3L","/\\ CB: sigma",5.161,0,100); // RooRealVar alphaL3("alphaL3","/\\ CB: alpha",2.077,0,1000); // RooRealVar nL3("nL1","/\\ CB: n",0.286,0,1000); // RooCBShape CBL("CBL","#Lambda signal: CB",*mass,mean3L,sig3L,alphaL3,nL3); // RooRealVar mean4L("mean4L","/\\ gaus: mean",5621.804,5525,5700); // RooRealVar sig4L("sig4L","/\\ gaus: sigma",10.819,0,100); // RooGaussian gauL("gauL","#Lambda signal: gaussian",*mass,mean4L,sig4L); // RooRealVar f1L("f1L","/\\ signal: fraction CB",0.578,0,1); // RooAddPdf sigL("sigL","#Lambda signal",RooArgList(CBL,gauL),RooArgList(f1L)); // sigma0 //using RooHistPdf from MC--no need to build pdf here RooHistPdf sigS = makeroohistpdf(SMC,mass,"sigS","#Sigma^{0} signal (RooHistPdf)"); // /\* cout<<"Lst stuff"<<endl; RooRealVar meanLst1("meanLst1","/\\*(misc.): mean1",5011.031237,4900,5100); RooRealVar sigLst1("sigLst1","/\\*(misc.): sigma1",70.522092,0,100); RooRealVar meanLst2("mean5Lst2","/\\*(1405): mean2",5245.261703,5100,5350); RooRealVar sigLst2("sigLst2","/\\*(1405): sigma2",64.564763,0,100); RooRealVar alphaLst2("alphaLst2","/\\*(1405): alpha2",29.150301); RooRealVar nLst2("nLst2","/\\*(1405): n2",4.615817,0,50); RooGaussian gauLst1("gauLst1","#Lambda*(misc.), gaus",*mass,meanLst1,sigLst1); RooCBShape gauLst2("gauLst2","#Lambda*(1405), CB",*mass,meanLst2,sigLst2,alphaLst2,nLst2); // RooRealVar fLst1("fLst1","/\\* bkg: fraction gaus 1",0.743,0,1); // RooAddPdf bkgLst("bkgLst","#Lambda* signal",RooArgList(gauLst1,gauLst2),RooArgList(fLst1)); //Poly func BKG mass // RooRealVar b0("b0","Background: Chebychev b0",-1.071,-10000,10000); RooRealVar b1("b1","Background: Chebychev b1",-1.323004,-10,-0.00000000000000000000001); RooRealVar b2("b2","Background: Chebychev b2",0.145494,0,10); RooRealVar b3("b3","Background: Chebychev b3",-0.316,-10000,10000); RooRealVar b4("b4","Background: Chebychev b4",0.102,-10000,10000); RooRealVar b5("b5","Background: Chebychev b5",0.014,-10000,10000); RooRealVar b6("b6","Background: Chebychev b6",-0.015,-10000,10000); RooRealVar b7("b7","Background: Chebychev b7",0.012,-10000,10000); RooArgList bList(b1,b2); RooChebychev bkg("bkg","Background", *mass, bList); // TF1 *ep = new TF1("ep","[2]*exp([0]*x+[1]*x*x)",4300,5950); // ep->SetParameter(0,1); // ep->SetParameter(1,-1); // ep->SetParameter(2,2000); // ep->SetParName(0,"a"); // ep->SetParName(1,"b"); // ep->SetParName(2,"c"); // RooRealVar a("a","Background: Coefficent of x",1,-10000,10000); // RooRealVar b("b","Background: Coefficent of x*x",-1,-10000,10000); // RooRealVar c("c","Background: Coefficent of exp()",2000,-10000,10000); // RooTFnPdfBinding bkg("ep","ep",ep,RooArgList(*mass,a,b)); //number of each shape RooRealVar nbkg("nbkg","N bkg",2165.490249,0,100000000); RooRealVar nsigL("nsigL","N /\\",1689.637290,0,1000000000); RooRealVar nsigS("nsigS","N sigma",0.000002,0,10000000000); RooRealVar ngauLst1("ngauLst1","N /\\*(misc.)",439.812103,0,10000000000); RooRealVar ngauLst2("ngauLst2","N /\\*(1405)",152.061617,0,10000000000); RooRealVar nbkgLst("nbkgLst","N /\\*",591.828,0,1000000000); //add shapes and their number to a totalPdf RooArgList shapes; RooArgList yields; shapes.add(sigL); yields.add(nsigL); shapes.add(sigS); yields.add(nsigS); // shapes.add(bkgLst); yields.add(nbkgLst); shapes.add(gauLst1); yields.add(ngauLst1); shapes.add(gauLst2); yields.add(ngauLst2); shapes.add(bkg); yields.add(nbkg); RooAddPdf totalPdf("totalPdf","totalPdf",shapes,yields); //fit the totalPdf RooAbsReal * nll = totalPdf.createNLL(*data,Extended(kTRUE),Range("tot")); RooMinuit m(*nll); m.setVerbose(kFALSE); m.migrad(); m.minos(); m.minos(); //display and save information ofstream textfile;//create text file to hold data placeholder = "plots/fit"+fileN+".txt"; textfile.open(placeholder); TString outputtext;//for useful text //plot things RooPlot *framex = mass->frame(); framex->GetYaxis()->SetTitle("Events/(5 MeV)"); data->plotOn(framex,Name("Hist"),MarkerColor(kBlack),LineColor(kBlack),DataError(RooAbsData::SumW2)); totalPdf.plotOn(framex,Name("curvetot"),LineColor(kBlue)); RooArgSet* totalPdfComponents = totalPdf.getComponents(); TIterator* itertPC = totalPdfComponents->createIterator(); RooAddPdf* vartPC = (RooAddPdf*) itertPC->Next(); vartPC = (RooAddPdf*) itertPC->Next();//skip totalPdf int i=0;//color index TLegend *leg = new TLegend(0.2, 0.02, .4, .42); leg->SetTextSize(0.06); leg->AddEntry(framex->findObject("curvetot"),"Total PDF","l"); while(vartPC){//loop over compotents of totalPdf TString vartPCtitle = vartPC->GetTitle(); TIterator* itercompPars;//forward declare so it persists outside the if statement RooRealVar* varcompPars; if(!(vartPCtitle.Contains(":")||vartPCtitle.Contains("@"))){//only for non-sub-shapes while(i==0||i==10||i==4||i==1||i==5||(i>=10&&i<=27))i++;//avoid white and blue and black and yellow and horribleness RooArgSet* compPars = vartPC->getParameters(data);//set of the parameters of the component the loop is on itercompPars = compPars->createIterator(); varcompPars = (RooRealVar*) itercompPars->Next(); while(varcompPars){//write and print mean, sig, etc. of sub-shapes TString vartitle = varcompPars->GetTitle(); double varval = varcompPars->getVal(); TString varvalstring = Form("%f",varval); double hi = varcompPars->getErrorHi(); TString varerrorstring = "[exact]"; if(hi!=-1){ double lo = varcompPars->getErrorLo(); double varerror = TMath::Max(fabs(lo),hi); varerrorstring = Form("%E",varerror); } outputtext = vartitle+" = "+varvalstring+" +/- "+varerrorstring; textfile<<outputtext<<endl; cout<<outputtext<<endl; varcompPars = (RooRealVar*) itercompPars->Next(); } totalPdf.plotOn(framex,Name(vartPC->GetName()),LineStyle(kDashed),LineColor(i),Components(vartPC->GetName())); leg->AddEntry(framex->findObject(vartPC->GetName()),vartPCtitle,"l"); i++; } vartPC = (RooAddPdf*) itertPC->Next(); itercompPars->Reset();//make sure it's ready for the next vartPC } // Calculate chi2/ndf RooArgSet *floatpar = totalPdf.getParameters(data); int floatpars = (floatpar->selectByAttrib("Constant",kFALSE))->getSize(); Double_t chi2 = framex->chiSquare("curvetot","Hist",floatpars); TString chi2string = Form("%f",chi2); //create text box to list important parameters on the plot // TPaveText* txt = new TPaveText(0.1,0.5,0.7,0.9,"NBNDC"); // txt->SetTextSize(0.06); // txt->SetTextColor(kBlack); // txt->SetBorderSize(0); // txt->SetFillColor(0); // txt->SetFillStyle(0); outputtext = "#chi^{2}/N_{DoF} = "+chi2string; cout<<outputtext<<endl; textfile<<outputtext<<endl; // txt->AddText(outputtext); // Print stuff TIterator* iteryields = yields.createIterator(); RooRealVar* varyields = (RooRealVar*) iteryields->Next();//only inherits things from TObject unless class specified vector<double> Y, E;//holds yields and associated errors vector<TString> YS, ES;//holds strings of the corresponding yields int j=0;//count vector position int jS=0, jL=0;//these hold the position of the S and L results;initialized in case there is no nsigS or nsigL while(varyields){//loop over yields TString varname = varyields->GetName(); TString vartitle = varyields->GetTitle(); double varval = varyields->getVal(); Y.push_back(varval); double lo = varyields->getErrorLo(); double hi = varyields->getErrorHi(); E.push_back(TMath::Max(fabs(lo),hi)); YS.push_back(Form("%f",Y[j])); ES.push_back(Form("%f",E[j])); if(varname=="nsigS") jS=j; if(varname=="nsigL") jL=j; outputtext = vartitle+" = "+YS[j]+" +/- "+ES[j]; cout<<outputtext<<endl; textfile<<outputtext<<endl; //txt->AddText(outputtext); varyields = (RooRealVar*) iteryields->Next(); j++; } //S/L double result = Y[jS]/Y[jL]; cout<<"result declared"<<endl; double E_result = TMath::Abs(result)*sqrt(pow(E[jS]/Y[jS],2)+pow(E[jL]/Y[jL],2)); cout<<"E_result declared"<<endl; TString resultstring = Form("%E",result); TString E_resultstring = Form("%E",E_result); outputtext = "Y_{#Sigma^{0}}/Y_{#Lambda} = "+resultstring+" +/- "+E_resultstring; cout<<outputtext<<endl; textfile<<outputtext<<endl; //txt->AddText(outputtext); double resultlimit = (Y[jS]+E[jS])/(Y[jL]-E[jL]); outputtext = Form("%E",resultlimit); outputtext = "limit = "+outputtext; cout<<outputtext<<endl; textfile<<outputtext<<endl; //txt->AddText(outputtext); // Create canvas and pads, set style TCanvas *c1 = new TCanvas("c1","data fits",1200,800); TPad *pad1 = new TPad("pad1","pad1",0.0,0.3,1.0,1.0); TPad *pad2 = new TPad("pad2","pad2",0.0,0.0,1.0,0.3); pad1->SetBottomMargin(0); pad2->SetTopMargin(0); pad2->SetBottomMargin(0.5); pad2->SetBorderMode(0); pad1->SetBorderMode(0); c1->SetBorderMode(0); pad2->Draw(); pad1->Draw(); pad1->cd(); framex->SetMinimum(1); framex->SetMaximum(3000); framex->addObject(leg);//add legend to frame //framex->addObject(txt);//add text to frame gPad->SetTopMargin(0.06); pad1->SetLogy(); // pad1->Range(4100,0,6100,0.0005); pad1->Update(); framex->Draw(); // Pull distribution RooPlot *framex2 = mass->frame(); RooHist* hpull = framex->pullHist("Hist","curvetot"); framex2->addPlotable(hpull,"P"); hpull->SetLineColor(kBlack); hpull->SetMarkerColor(kBlack); framex2->SetTitle(0); framex2->GetYaxis()->SetTitle("Pull"); framex2->GetYaxis()->SetTitleSize(0.15); framex2->GetYaxis()->SetLabelSize(0.15); framex2->GetXaxis()->SetTitleSize(0.2); framex2->GetXaxis()->SetLabelSize(0.15); framex2->GetYaxis()->CenterTitle(); framex2->GetYaxis()->SetTitleOffset(0.45); framex2->GetXaxis()->SetTitleOffset(1.1); framex2->GetYaxis()->SetNdivisions(505); framex2->GetYaxis()->SetRangeUser(-8.8,8.8); pad2->cd(); framex2->Draw(); c1->cd(); placeholder = "plots/fit"+fileN+".eps"; c1->Print(placeholder); placeholder = "plots/fit"+fileN+".C"; c1->SaveAs(placeholder); textfile.close(); }
void rf505_asciicfg() { // C r e a t e p d f // ------------------ // Construct gauss(x,m,s) RooRealVar x("x","x",-10,10) ; RooRealVar m("m","m",0,-10,10) ; RooRealVar s("s","s",1,-10,10) ; RooGaussian gauss("g","g",x,m,s) ; // Construct poly(x,p0) RooRealVar p0("p0","p0",0.01,0.,1.) ; RooPolynomial poly("p","p",x,p0) ; // Construct model = f*gauss(x) + (1-f)*poly(x) RooRealVar f("f","f",0.5,0.,1.) ; RooAddPdf model("model","model",RooArgSet(gauss,poly),f) ; // F i t m o d e l t o t o y d a t a // ----------------------------------------- RooDataSet* d = model.generate(x,1000) ; model.fitTo(*d) ; // W r i t e p a r a m e t e r s t o a s c i i f i l e // ----------------------------------------------------------- // Obtain set of parameters RooArgSet* params = model.getParameters(x) ; // Write parameters to file params->writeToFile("rf505_asciicfg_example.txt") ; TString dir1 = gROOT->GetTutorialsDir() ; dir1.Append("/roofit/rf505_asciicfg.txt") ; TString dir2 = gROOT->GetTutorialsDir() ; dir2.Append("/roofit/rf505_asciicfg_example.txt") ; // R e a d p a r a m e t e r s f r o m a s c i i f i l e // ---------------------------------------------------------------- // Read parameters from file params->readFromFile(dir2) ; params->Print("v") ; // Read parameters from section 'Section2' of file params->readFromFile(dir1,0,"Section2") ; params->Print("v") ; // Read parameters from section 'Section3' of file. Mark all // variables that were processed with the "READ" attribute params->readFromFile(dir1,"READ","Section3") ; // Print the list of parameters that were not read from Section3 cout << "The following parameters of the were _not_ read from Section3: " << (*params->selectByAttrib("READ",kFALSE)) << endl ; // Read parameters from section 'Section4' of file, which contains // 'include file' statement of rf505_asciicfg_example.txt // so that we effective read the same params->readFromFile(dir1,0,"Section4") ; params->Print("v") ; }
void fitpeaks(int bin){ switch (bin) { case 0: cut_="abs(upsRapidity)<2.4"; //cut_="( (muPlusPt>3.5 && abs(muPlusEta)<1.6) || (muPlusPt>2.5 && abs(muPlusEta)>=1.6 && abs(muPlusEta)<2.4) ) && ( (muMinusPt>3.5 && abs(muMinusEta)<1.6) || (muMinusPt>2.5 && abs(muMinusEta)>=1.6 && abs(muMinusEta)<2.4) ) && abs(upsRapidity)<2.0"; //pp acceptance for Upsilon suffix_=""; f2Svs1S_pp->setVal(0.5569); //f2Svs1S_pp->setVal(0); f3Svs1S_pp->setVal(0.4140); //f3Svs1S_pp->setVal(0); break; case 1: cut_="abs(upsRapidity)>=0.0 && abs(upsRapidity)<1.2"; suffix_="_eta0-12"; binw_=0.14; break; case 2: cut_="abs(upsRapidity)>=1.2 && abs(upsRapidity)<2.4"; suffix_="_eta12-24"; binw_=0.14; break; case 3: cut_="Centrality>=0 && Centrality<2"; suffix_="_cntr0-5"; binw_=0.14; break; case 4: cut_="Centrality>=2 && Centrality<4"; suffix_="_cntr5-10"; binw_=0.14; break; case 5: cut_="Centrality>=4 && Centrality<8"; suffix_="_cntr10-20"; binw_=0.14; break; case 6: cut_="Centrality>=8 && Centrality<12"; suffix_="_cntr20-30"; binw_=0.14; break; case 7: cut_="Centrality>=12 && Centrality<16"; suffix_="_cntr30-40"; binw_=0.14; break; case 8: cut_="Centrality>=16 && Centrality<20"; suffix_="_cntr40-50"; binw_=0.14; break; case 9: cut_="Centrality>=20 && Centrality<50"; suffix_="_cntr50-100"; binw_=0.14; break; case 10: cut_="Centrality>=20 && Centrality<24"; suffix_="_cntr50-60"; binw_=0.14; break; case 11: cut_="Centrality>=0 && Centrality<8"; suffix_="_cntr0-20"; binw_=0.1; break; case 12: cut_="Centrality>=16 && Centrality<50"; suffix_="_cntr40-100"; binw_=0.14; break; case 13: cut_="Centrality>=8 && Centrality<50"; suffix_="_cntr20-100"; binw_=0.1; break; default: cout<<"error in binning"<<endl; break; } cout << "oniafitter processing" << "\n\tInput: \t" << finput << "\n\tresults:\t" << figs_ << endl; ofstream outfile("fitresults.out", ios_base::app); outfile<<endl<<"**********"<<suffix_<<"**********"<<endl<<endl; //read the data TFile f(finput,"read"); gDirectory->Cd(finput+":/"+dirname_); TTree* theTree = (TTree*)gROOT->FindObject("UpsilonTree"); TTree* allsignTree = (TTree*)gROOT->FindObject("UpsilonTree_allsign"); if (PR_plot) {TRKROT = 1; PbPb=1;} if (TRKROT) TTree* trkRotTree = (TTree*)gROOT->FindObject("UpsilonTree_trkRot"); RooRealVar* mass = new RooRealVar("invariantMass","#mu#mu mass",mmin_,mmax_,"GeV/c^{2}"); RooRealVar* upsPt = new RooRealVar("upsPt","p_{T}(#Upsilon)",0,60,"GeV"); RooRealVar* upsEta = new RooRealVar("upsEta", "upsEta" ,-7,7); RooRealVar* upsRapidity = new RooRealVar("upsRapidity", "upsRapidity" ,-2.4,2.4); RooRealVar* vProb = new RooRealVar("vProb", "vProb" ,0.05,1.00); RooRealVar* QQsign = new RooRealVar("QQsign", "QQsign" ,-1,5); RooRealVar* weight = new RooRealVar("weight", "weight" ,-2,2); if (PbPb) RooRealVar* Centrality = new RooRealVar("Centrality", "Centrality" ,0,40); RooRealVar* muPlusPt = new RooRealVar("muPlusPt","muPlusPt",muonpTcut,50); RooRealVar* muPlusEta = new RooRealVar("muPlusEta","muPlusEta",-2.5,2.5); RooRealVar* muMinusPt = new RooRealVar("muMinusPt","muMinusPt",muonpTcut,50); RooRealVar* muMinusEta = new RooRealVar("muMinusEta","muMinusEta",-2.5,2.5); //import unlike-sign data set RooDataSet* data0, *data, *likesignData0, *likesignData, *TrkRotData0, *TrkRotData; if (PbPb) data0 = new RooDataSet("data","data",theTree,RooArgSet(*mass,*upsRapidity,*vProb,*upsPt,*Centrality,*muPlusPt,*muMinusPt)); //data0 = new RooDataSet("data","data",theTree,RooArgSet(*mass,*upsRapidity,*upsPt,*muPlusPt,*muMinusPt,*QQsign,*weight)); else data0 = new RooDataSet("data","data",theTree,RooArgSet(*mass,*upsRapidity,*vProb,*upsPt,*muPlusPt,*muMinusPt,*muPlusEta,*muMinusEta)); data0->Print(); data = ( RooDataSet*) data0->reduce(Cut(cut_)); data->Print(); //import like-sign data set if (PbPb) likesignData0 = new RooDataSet("likesignData","likesignData",allsignTree,RooArgSet(*mass,*upsRapidity,*vProb,*upsPt,*Centrality,*muPlusPt,*muMinusPt,*QQsign)); else likesignData0 = new RooDataSet("likesignData","likesignData",allsignTree,RooArgSet(*mass,*upsRapidity,*vProb,*upsPt,*muPlusPt,*muMinusPt,*QQsign)); likesignData0->Print(); likesignData = ( RooDataSet*) likesignData0->reduce(Cut(cut_+" && QQsign != 0")); likesignData->Print(); //import track-rotation data set if (TRKROT) { if (PbPb) TrkRotData0 = new RooDataSet("TrkRotData","TrkRotData",trkRotTree,RooArgSet(*mass,*upsRapidity,*vProb,*upsPt,*Centrality,*muPlusPt,*muMinusPt,*QQsign)); else TrkRotData0 = new RooDataSet("TrkRotData","TrkRotData",trkRotTree,RooArgSet(*mass,*upsRapidity,*upsPt,*vProb,*muPlusPt,*muMinusPt,*QQsign)); TrkRotData0->Print(); if (PR_plot && RAA) TrkRotData = ( RooDataSet*) TrkRotData0->reduce(Cut(cut_+" && upsPt < 8.1")); else if (PR_plot && !RAA) TrkRotData = ( RooDataSet*) TrkRotData0->reduce(Cut(cut_+" && upsPt < 7.07")); else TrkRotData = ( RooDataSet*) TrkRotData0->reduce(Cut(cut_+" && QQsign != 0")); TrkRotData->Print(); } mass->setRange("R1",7.0,10.2); mass->setRange("R2",7,14); mass->setRange("R3",10.8,14); const double M1S = 9.46; //upsilon 1S pgd mass value const double M2S = 10.02; //upsilon 2S pgd mass value const double M3S = 10.35; //upsilon 3S pgd mass value RooRealVar *mean = new RooRealVar("#mu_{#Upsilon(1S)}","#Upsilon mean",M1S,M1S-0.1,M1S+0.1); RooRealVar *shift21 = new RooRealVar("shift2","mass diff #Upsilon(1,2S)",M2S-M1S); RooRealVar *shift31 = new RooRealVar("shift3","mass diff #Upsilon(1,3S)",M3S-M1S); RooRealVar *mscale = new RooRealVar("mscale","mass scale factor",1.,0.7,1.3); mscale->setConstant(kTRUE); /* the def. parameter value is fixed in the fit */ RooFormulaVar *mean1S = new RooFormulaVar("mean1S","@0", RooArgList(*mean)); RooFormulaVar *mean2S = new RooFormulaVar("mean2S","@[email protected]*@2", RooArgList(*mean,*mscale,*shift21)); RooFormulaVar *mean3S = new RooFormulaVar("mean3S","@[email protected]*@2", RooArgList(*mean,*mscale,*shift31)); RooRealVar *sigma1 = new RooRealVar("sigma","Sigma_1",0.10,0.01,0.30); //detector resolution RooRealVar *sigma2 = new RooRealVar("#sigma_{#Upsilon(1S)}","Sigma_1S",0.08,0.01,0.30); //Y(1S) resolution RooFormulaVar *reso1S = new RooFormulaVar("reso1S","@0" ,RooArgList(*sigma2)); RooFormulaVar *reso2S = new RooFormulaVar("reso2S","@0*10.023/9.460",RooArgList(*sigma2)); RooFormulaVar *reso3S = new RooFormulaVar("reso3S","@0*10.355/9.460",RooArgList(*sigma2)); /// to describe final state radiation tail on the left of the peaks RooRealVar *alpha = new RooRealVar("alpha","tail shift",0.982,0,2.4); // minbias fit value //RooRealVar *alpha = new RooRealVar("alpha","tail shift",1.6,0.2,4); // MC value RooRealVar *npow = new RooRealVar("npow","power order",2.3,1,3); // MC value npow ->setConstant(kTRUE); if (!fitMB) alpha->setConstant(kTRUE); // relative fraction of the two peak components RooRealVar *sigmaFraction = new RooRealVar("sigmaFraction","Sigma Fraction",0.3,0.,1.); sigmaFraction->setVal(0); sigmaFraction->setConstant(kTRUE); /// Upsilon 1S //RooCBShape *gauss1S1 = new RooCBShape ("gauss1S1", "FSR cb 1s", // *mass,*mean1S,*sigma1,*alpha,*npow); RooCBShape *gauss1S2 = new RooCBShape ("gauss1S2", "FSR cb 1s", *mass,*mean1S,*reso1S,*alpha,*npow); //RooAddPdf *sig1S = new RooAddPdf ("sig1S","1S mass pdf", // RooArgList(*gauss1S1,*gauss1S2),*sigmaFraction); //mean->setVal(9.46); //mean->setConstant(kTRUE); sigma1->setVal(0); sigma1->setConstant(kTRUE); if (!fitMB) { sigma2->setVal(width_); //fix the resolution sigma2->setConstant(kTRUE); } /// Upsilon 2S RooCBShape *gauss2S1 = new RooCBShape ("gauss2S1", "FSR cb 2s", *mass,*mean2S,*sigma1,*alpha,*npow); RooCBShape *gauss2S2 = new RooCBShape ("gauss2S2", "FSR cb 2s", *mass,*mean2S,*reso2S,*alpha,*npow); RooAddPdf *sig2S = new RooAddPdf ("sig2S","2S mass pdf", RooArgList(*gauss2S1,*gauss2S2),*sigmaFraction); /// Upsilon 3S RooCBShape *gauss3S1 = new RooCBShape ("gauss3S1", "FSR cb 3s", *mass,*mean3S,*sigma1,*alpha,*npow); RooCBShape *gauss3S2 = new RooCBShape ("gauss3S2", "FSR cb 3s", *mass,*mean3S,*reso3S,*alpha,*npow); RooAddPdf *sig3S = new RooAddPdf ("sig3S","3S mass pdf", RooArgList(*gauss3S1,*gauss3S2),*sigmaFraction); /// Background RooRealVar *bkg_a1 = new RooRealVar("bkg_{a1}", "background a1", 0, -2, 2); RooRealVar *bkg_a2 = new RooRealVar("bkg_{a2}", "background a2", 0, -1, 1); //RooRealVar *bkg_a3 = new RooRealVar("bkg_{a3}", "background a3", 0, -1, 1); RooAbsPdf *bkgPdf = new RooChebychev("bkg","background", *mass, RooArgList(*bkg_a1,*bkg_a2)); //bkg_a1->setVal(0); //bkg_a1->setConstant(kTRUE); //bkg_a2->setVal(0); //bkg_a2->setConstant(kTRUE); //set constant for liner background // only sideband region pdf, using RooPolynomial instead of RooChebychev for multiple ranges fit RooRealVar *SB_bkg_a1 = new RooRealVar("SB bkg_{a1}", "background a1", 0, -1, 1); RooRealVar *SB_bkg_a2 = new RooRealVar("SB bkg_{a2}", "background a2", 0, -1, 1); RooAbsPdf *SB_bkgPdf = new RooPolynomial("SB_bkg","side-band background", *mass, RooArgList(*SB_bkg_a1,*SB_bkg_a2)); //SB_bkg_a1->setVal(0); //SB_bkg_a1->setConstant(kTRUE); //SB_bkg_a2->setVal(0); //SB_bkg_a2->setConstant(kTRUE); /// Combined pdf int nt = 100000; //bool fitfraction = true; RooRealVar *nbkgd = new RooRealVar("N_{bkg}","nbkgd",nt*0.75,0,10*nt); RooRealVar *SB_nbkgd = new RooRealVar("SB N_{bkg}","SB_nbkgd",nt*0.75,0,10*nt); RooRealVar *nsig1f = new RooRealVar("N_{#Upsilon(1S)}","nsig1S",nt*0.25,0,10*nt); /* //use the YIELDs of 2S and 3S as free parameters RooRealVar *nsig2f = new RooRealVar("N_{#Upsilon(2S)}","nsig2S", nt*0.25,-1*nt,10*nt); RooRealVar *nsig3f = new RooRealVar("N_{#Upsilon(3S)}","nsig3S", nt*0.25,-1*nt,10*nt); */ //use the RATIOs of 2S and 3S as free parameters RooRealVar *f2Svs1S = new RooRealVar("N_{2S}/N_{1S}","f2Svs1S",0.21,-0.1,1); //RooRealVar *f3Svs1S = new RooRealVar("N_{3S}/N_{1S}","f3Svs1S",0.0,-0.1,0.5); RooRealVar *f23vs1S = new RooRealVar("N_{2S+3S}/N_{1S}","f23vs1S",0.45,-0.1,1); RooFormulaVar *nsig2f = new RooFormulaVar("nsig2S","@0*@1", RooArgList(*nsig1f,*f2Svs1S)); //RooFormulaVar *nsig3f = new RooFormulaVar("nsig3S","@0*@1", RooArgList(*nsig1f,*f3Svs1S)); RooFormulaVar *nsig3f = new RooFormulaVar("nsig3S","@0*@[email protected]*@1", RooArgList(*nsig1f,*f2Svs1S,*f23vs1S)); //f3Svs1S->setConstant(kTRUE); //force the ratio to the pp value f2Svs1S_pp->setConstant(kTRUE); f3Svs1S_pp->setConstant(kTRUE); RooFormulaVar *nsig2f_ = new RooFormulaVar("nsig2S_pp","@0*@1", RooArgList(*nsig1f,*f2Svs1S_pp)); RooFormulaVar *nsig3f_ = new RooFormulaVar("nsig3S_pp","@0*@1", RooArgList(*nsig1f,*f3Svs1S_pp)); //only sideband region pdf, using RooPolynomial instead of RooChebychev for multiple ranges fit RooAbsPdf *SB_pdf = new RooAddPdf ("SB_pdf","sideband background pdf", RooArgList(*SB_bkgPdf), RooArgList(*SB_nbkgd)); //only signal region pdf, using RooPolynomial instead of RooChebychev for multiple ranges fit RooAbsPdf *S_pdf = new RooAddPdf ("S_pdf","total signal+background pdf", RooArgList(*gauss1S2,*sig2S,*sig3S,*SB_bkgPdf), RooArgList(*nsig1f,*nsig2f,*nsig3f,*SB_nbkgd)); //parameters for likesign RooRealVar m0shift("turnOn","turnOn",8.6,0,20.) ; RooRealVar width("width","width",2.36,0,20.) ; RooRealVar par3("decay","decay",6.8, 0, 20.) ; RooGaussian* m0shift_constr; RooGaussian* width_constr; RooGaussian* par3_constr; RooRealVar *nLikesignbkgd = new RooRealVar("NLikesign_{bkg}","nlikesignbkgd",nt*0.75,0,10*nt); if (TRKROT) { nLikesignbkgd->setVal(TrkRotData->sumEntries()); nLikesignbkgd->setError(sqrt(TrkRotData->sumEntries())); } else { nLikesignbkgd->setVal(likesignData->sumEntries()); nLikesignbkgd->setError(sqrt(likesignData->sumEntries())); } if (LS_constrain) { RooGaussian* nLikesignbkgd_constr = new RooGaussian("nLikesignbkgd_constr","nLikesignbkgd_constr",*nLikesignbkgd,RooConst(nLikesignbkgd->getVal()),RooConst(nLikesignbkgd->getError())); } else nLikesignbkgd->setConstant(kTRUE); RooFormulaVar *nResidualbkgd = new RooFormulaVar("NResidual_{bkg}","@[email protected]",RooArgList(*nbkgd,*nLikesignbkgd)); switch (bkgdModel) { case 1 : //use error function to fit the like-sign, then fix the shape and normailization, RooGenericPdf *LikeSignPdf = new RooGenericPdf("Like-sign","likesign","exp([email protected]/decay)*(TMath::Erf((@0-turnOn)/width)+1)",RooArgList(*mass,m0shift,width,par3)); if (TRKROT) RooFitResult* fit_1st = LikeSignPdf->fitTo(*TrkRotData,Save()) ; else RooFitResult* fit_1st = LikeSignPdf->fitTo(*likesignData,Save()) ; // likesign data //LikeSignPdf.fitTo(*data) ; // unlikesign data //fit_1st->Print(); if (LS_constrain) { m0shift_constr = new RooGaussian("m0shift_constr","m0shift_constr",m0shift,RooConst(m0shift.getVal()),RooConst(m0shift.getError())); width_constr = new RooGaussian("width_constr","width_constr",width,RooConst(width.getVal()),RooConst(width.getError())); par3_constr = new RooGaussian("par3_constr","par3_constr",par3,RooConst(par3.getVal()),RooConst(par3.getError())); //m0shift_constr = new RooGaussian("m0shift_constr","m0shift_constr",m0shift,RooConst(7.9),RooConst(0.34*2)); //width_constr = new RooGaussian("width_constr","width_constr",width,RooConst(2.77),RooConst(0.38*2)); //par3_constr = new RooGaussian("par3_constr","par3_constr",par3,RooConst(6.3),RooConst(1.0*2)); } else { m0shift.setConstant(kTRUE); width.setConstant(kTRUE); par3.setConstant(kTRUE); } RooAbsPdf *pdf_combinedbkgd = new RooAddPdf ("pdf_combinedbkgd","total combined background pdf", RooArgList(*bkgPdf,*LikeSignPdf), RooArgList(*nResidualbkgd,*nLikesignbkgd)); //RooArgList(*LikeSignPdf), //RooArgList(*nbkgd)); break; case 2 : //use RooKeysPdf to smooth the like-sign, then fix the shape and normailization if (TRKROT) RooKeysPdf *LikeSignPdf = new RooKeysPdf("Like-sign","likesign",*mass,*TrkRotData,3,1.5); else RooKeysPdf *LikeSignPdf = new RooKeysPdf("Like-sign","likesign",*mass,*likesignData,3,1.7); RooAbsPdf *pdf_combinedbkgd = new RooAddPdf ("pdf_combinedbkgd","total combined background pdf", RooArgList(*bkgPdf,*LikeSignPdf), RooArgList(*nResidualbkgd,*nLikesignbkgd)); break; case 3 : //use error function to fit the unlike-sign directly RooGenericPdf *LikeSignPdf = new RooGenericPdf("Like-sign","likesign","exp([email protected]/decay)*(TMath::Erf((@0-turnOn)/width)+1)",RooArgList(*mass,m0shift,width,par3)); RooAbsPdf *pdf_combinedbkgd = new RooAddPdf ("pdf_combinedbkgd","total combined background pdf", RooArgList(*LikeSignPdf), RooArgList(*nbkgd)); break; case 4 : //use polynomial to fit the unlike-sign directly RooAbsPdf *pdf_combinedbkgd = new RooAddPdf ("pdf_combinedbkgd","total combined background pdf", RooArgList(*bkgPdf), RooArgList(*nbkgd)); break; case 5 : //use ( error function + polynomial ) to fit the unlike-sign directly RooGenericPdf *LikeSignPdf = new RooGenericPdf("Like-sign","likesign","exp([email protected]/decay)*(TMath::Erf((@0-turnOn)/width)+1)",RooArgList(*mass,m0shift,width,par3)); RooAbsPdf *pdf_combinedbkgd = new RooAddPdf ("pdf_combinedbkgd","total combined background pdf", RooArgList(*bkgPdf,*LikeSignPdf), RooArgList(*nResidualbkgd,*nLikesignbkgd)); break; default : break; } //pdf with fixed ratio of the pp ratio RooAbsPdf *pdf_pp = new RooAddPdf ("pdf_pp","total signal+background pdf", RooArgList(*gauss1S2,*sig2S,*sig3S,*pdf_combinedbkgd), RooArgList(*nsig1f,*nsig2f_,*nsig3f_,*nbkgd)); //the nominal fit with default pdf if (LS_constrain) { RooAbsPdf *pdf_unconstr = new RooAddPdf ("pdf_unconstr","total signal+background pdf", RooArgList(*gauss1S2,*sig2S,*sig3S,*pdf_combinedbkgd), RooArgList(*nsig1f,*nsig2f,*nsig3f,*nbkgd)); RooProdPdf *pdf = new RooProdPdf ("pdf","total constr pdf", RooArgSet(*pdf_unconstr,*m0shift_constr,*width_constr,*par3_constr,*nLikesignbkgd_constr)); RooFitResult* fit_2nd = pdf->fitTo(*data,Constrained(),Save(kTRUE),Extended(kTRUE),Minos(doMinos)); } else { RooAbsPdf *pdf = new RooAddPdf ("pdf","total signal+background pdf", RooArgList(*gauss1S2,*sig2S,*sig3S,*pdf_combinedbkgd), RooArgList(*nsig1f,*nsig2f,*nsig3f,*nbkgd)); RooFitResult* fit_2nd = pdf->fitTo(*data,Save(kTRUE),Extended(kTRUE),Minos(doMinos)); } //plot TCanvas c; c.cd(); int nbins = ceil((mmax_-mmin_)/binw_); RooPlot* frame = mass->frame(Bins(nbins),Range(mmin_,mmax_)); data->plotOn(frame,Name("theData"),MarkerSize(0.8)); pdf->plotOn(frame,Name("thePdf")); if (plotLikeSign) { if (TRKROT) TrkRotData->plotOn(frame,Name("theLikeSignData"),MarkerSize(0.8),MarkerColor(kMagenta),MarkerStyle(22)); else likesignData->plotOn(frame,Name("theLikeSignData"),MarkerSize(0.8),MarkerColor(kRed),MarkerStyle(24)); //LikeSignPdf->plotOn(frame,Name("theLikeSign"),VisualizeError(*fit_1st,1),FillColor(kOrange)); //LikeSignPdf->plotOn(frame,Name("theLikeSign"),LineColor(kRed)); } RooArgSet * pars = pdf->getParameters(data); //RooArgSet * pars = LikeSignPdf->getParameters(likesignData); //calculate chi2 in a mass range float bin_Min = (8.2-mmin_)/binw_; float bin_Max = (10.8-mmin_)/binw_; int binMin = ceil(bin_Min); int binMax = ceil(bin_Max); int nfloatpars = pars->selectByAttrib("Constant",kFALSE)->getSize(); float myndof = ceil((10.8-8.2)/binw_) - nfloatpars; cout<<binMin<<" "<<binMax<<" "<<nfloatpars<<" "<<myndof<<endl; double mychsq = frame->mychiSquare("thePdf","theData",nfloatpars,true,binMin,binMax)*myndof; //double mychsq = frame->mychiSquare("theLikeSign","theLikeSignData",nfloatpars,true,binMin,binMax)*myndof; /* int nfloatpars = pars->selectByAttrib("Constant",kFALSE)->getSize(); float myndof = frame->GetNbinsX() - nfloatpars; double mychsq = frame->chiSquare("theLikeSign","theLikeSignData",nfloatpars)*myndof; */ //plot parameters if(plotpars) { paramOn_ = "_paramOn"; pdf->paramOn(frame,Layout(0.15,0.6,0.4),Layout(0.5,0.935,0.97),Label(Form("#chi^{2}/ndf = %2.1f/%2.0f", mychsq,myndof))); } /* mass->setRange("R1S",8.8,9.7); mass->setRange("R2S",9.8,10.2); //pdf_combinedbkgd->fitTo(*data,Range("R1,R3"),Constrained(),Save(kTRUE),Extended(kTRUE),Minos(doMinos)); RooAbsReal* integral_1S = pdf_combinedbkgd->createIntegral(*mass,NormSet(*mass),Range("R1S")) ; cout << "1S bkgd integral = " << integral_1S->getVal() * (nbkgd->getVal()) << endl ; RooAbsReal* integral_2S = pdf_combinedbkgd->createIntegral(*mass,NormSet(*mass),Range("R2S")) ; cout << "2S bkgd integral = " << integral_2S->getVal() * (nbkgd->getVal()) << endl ; cout << "1S range count: " << data->sumEntries("invariantMass","R1S") <<endl; cout << "2S range count: " << data->sumEntries("invariantMass","R2S") <<endl; cout << "1S signal yield: " << data->sumEntries("invariantMass","R1S") - integral_1S->getVal() * (nbkgd->getVal()) << endl; cout << "2S signal yield: " << data->sumEntries("invariantMass","R2S") - integral_2S->getVal() * (nbkgd->getVal()) << endl; */ outfile<<"Y(1S) yield : = "<<nsig1f->getVal()<<" +/- "<<nsig1f->getError()<<endl<<endl; outfile<<"free parameter = "<< nfloatpars << ", mychi2 = " << mychsq << ", ndof = " << myndof << endl << endl; //draw the fit lines and save plots data->plotOn(frame,Name("theData"),MarkerSize(0.8)); pdf->plotOn(frame,Components("bkg"),Name("theBkg"),LineStyle(5),LineColor(kGreen)); pdf->plotOn(frame,Components("pdf_combinedbkgd"),LineStyle(kDashed)); if (plotLikeSign) { if (TRKROT) pdf->plotOn(frame,Components("Like-sign"),Name("theLikeSign"),LineStyle(9),LineColor(kMagenta)); else pdf->plotOn(frame,Components("Like-sign"),Name("theLikeSign"),LineStyle(9),LineColor(kRed)); } pdf->plotOn(frame,Name("thePdf")); data->plotOn(frame,MarkerSize(0.8)); if (plotLikeSign) { if (TRKROT) TrkRotData->plotOn(frame,Name("theTrkRotData"),MarkerSize(0.8),MarkerColor(kMagenta),MarkerStyle(22)); else likesignData->plotOn(frame,Name("theLikeSignData"),MarkerSize(0.8),MarkerColor(kRed),MarkerStyle(24)); } frame->SetTitle( "" ); frame->GetXaxis()->SetTitle("m_{#mu^{+}#mu^{-}} (GeV/c^{2})"); frame->GetXaxis()->CenterTitle(kTRUE); frame->GetYaxis()->SetTitleOffset(1.3); if (PR_plot && RAA) frame->GetYaxis()->SetRangeUser(0,1200); //frame->GetYaxis()->SetLabelSize(0.05); frame->Draw(); //plot parameters if(!plotpars) { paramOn_ = ""; TLatex latex1; latex1.SetNDC(); if (PbPb) { latex1.DrawLatex(0.46,1.-0.05*3,"CMS PbPb #sqrt{s_{NN}} = 2.76 TeV"); latex1.DrawLatex(0.5,1.-0.05*4.9,"L_{int} = 150 #mub^{-1}"); switch (bin) { case 0: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 0-100%, |y| < 2.4"); break; case 3: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 0-5%, |y| < 2.4"); break; case 4: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 5-10%, |y| < 2.4"); break; case 5: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 10-20%, |y| < 2.4"); break; case 6: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 20-30%, |y| < 2.4"); break; case 7: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 30-40%, |y| < 2.4"); break; case 8: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 40-50%, |y| < 2.4"); break; case 9: latex1.DrawLatex(0.5,1.-0.05*6.2,"Cent. 50-100%, |y| < 2.4"); break; default; break; } } else {