#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "AliHFMassFitter.h" #include #include //decCh: //- 0 = kDplustoKpipi //- 1 = kD0toKpi //- 2 = kDstartoKpipi //- 3 = kDstoKKpi //- 4 = kD0toKpipipi //- 5 = kLambdactopKpi //Note: writefit=kTRUE writes the root files with the fit performed but it also draw all the canvas, so if your computer is not powerfull enough I suggest to run it in batch mode (root -b) Bool_t charmCutsOptimization(Double_t nsigma=2,Int_t decCh=1,Int_t fitbtype=0,Int_t rebin=2,Bool_t writefit=kFALSE,Double_t sigma=0.012,Int_t minentries=50,Double_t *rangefit=0x0,TString hname="hMass_"){ TString filename="AnalysisResults.root",dirname="PWG3_D2H_Significance",listname="coutputSig",mdvlistname="coutputmv"; Int_t pdg; Double_t mass; switch (decCh) { case 0: listname+="Dplus"; mdvlistname+="Dplus"; pdg=411; break; case 1: listname+="D0"; mdvlistname+="D0"; pdg=421; break; case 2: listname+="Dstar"; mdvlistname+="Dstar"; pdg=413; break; case 3: listname+="Ds"; mdvlistname+="Ds"; pdg=431; break; case 4: listname+="D04"; mdvlistname+="D04"; pdg=421; break; case 5: listname+="Lc"; mdvlistname+="Lc"; pdg=4122; break; default: cout<GetParticle(pdg)->Mass(); cout<<"Mass = "<SetCanvasColor(0); gStyle->SetFrameFillColor(0); gStyle->SetTitleFillColor(0); gStyle->SetStatColor(0); Int_t countFitFail=0,countSgnfFail=0,countNoHist=0,countBkgOnly=0; ofstream outcheck("output.dat"); ofstream outdetail("discarddetails.dat"); outcheck<<"ptbin\tmdvGlobAddr\thistIndex\tSignif\tS\tB"<IsOpen()){ cout<<"File "<GetDirectory(dirname); if(!dir){ cout<<"Directory "<Get(listname); if(!histlist) { cout<Get(mdvlistname); if(!listamdv) { cout<FindObject("fHistNEvents"); TCanvas *cst=new TCanvas("hstat","Summary of statistics"); if(hstat) { cst->cd(); cst->SetGrid(); hstat->Draw("htext0"); hstat->SaveAs("hstat.png"); }else{ cout<<"Warning! fHistNEvents not found in "<FindObject("hSgn_0"); if(htestIsMC) isMC=kTRUE; Int_t nptbins=listamdv->GetEntries(); Int_t nhist=(histlist->GetEntries()-1);//-1 because of fHistNevents if(isMC) nhist/=4; ///4 because hMass_, hSgn_,hBkg_,hRfl_ Int_t count=0; Int_t *indexes= new Int_t[nhist]; //initialize indexes[i] to -1 for(Int_t i=0;iFindObject(name.Data()); if(!h){ cout<GetEntries()>minentries){ //cout<<"Entries = "<GetEntries()<Integral() > minentries){ cout<FindObject(Form("multiDimVectorPtBin%d",i)); TString name=mdvS->GetName(),nameErr="err",setname=""; setname=Form("S%s",name.Data()); mdvS->SetName(setname.Data()); outcheck<<"\n"<GetPtLimit(0)<<" < Pt <"<GetPtLimit(1)<Clone(setname.Data()); setname=Form("%sS%s",nameErr.Data(),name.Data()); mdvSerr->SetName(setname.Data()); //multidimvectors for background setname=Form("B%s",name.Data()); AliMultiDimVector *mdvB=(AliMultiDimVector*)mdvS->Clone(setname.Data()); AliMultiDimVector *mdvBerr=(AliMultiDimVector*)mdvS->Clone(setname.Data()); setname=Form("%sB%s",nameErr.Data(),name.Data()); mdvBerr->SetName(setname.Data()); //multidimvectors for significance setname=Form("Sgf%s",name.Data()); AliMultiDimVector *mdvSgnf=(AliMultiDimVector*)mdvS->Clone(setname.Data()); AliMultiDimVector *mdvSgnferr=(AliMultiDimVector*)mdvS->Clone(setname.Data()); setname=Form("%sSgf%s",nameErr.Data(),name.Data()); mdvSgnferr->SetName(setname.Data()); Int_t nhistforptbin=mdvS->GetNTotCells(); //Int_t nvarsopt=mdvS->GetNVariables(); cout<<"nhistforptbin = "<FindObject(name.Data()); Int_t nbin=((TH1F*)histlist->FindObject(name))->GetNbinsX(); Double_t min=((TH1F*)histlist->FindObject(name))->GetBinLowEdge(7); Double_t max=((TH1F*)histlist->FindObject(name))->GetBinLowEdge(nbin-5)+((TH1F*)histlist->FindObject(name))->GetBinWidth(nbin-5); if(rangefit) { min=rangefit[0]; max=rangefit[1]; } AliHFMassFitter fitter(h,min, max,rebin,fitbtype); fitter.SetInitialGaussianMean(mass); fitter.SetInitialGaussianSigma(sigma); if(ih==0) fitter.InitNtuParam(Form("ntuPtbin%d",i)); // fitter.SetHisto(h); // fitter.SetRangeFit(min,max); //fitter.SetRangeFit(1.68,2.05); //fitter.SetType(fitbtype,0); Bool_t ok=fitter.MassFitter(kFALSE); if(!ok){ cout<<"FIT NOT OK!"<SetElement(ih,0); // mdvSgnferr->SetElement(ih,0); // mdvS->SetElement(ih,0); // mdvSerr->SetElement(ih,0); // mdvB->SetElement(ih,bkg); // mdvBerr->SetElement(ih,errbkg); // }else{ //bkg fit failed // cout<<"Setting to 0"<SetElement(ih,0); // mdvSgnferr->SetElement(ih,0); // mdvS->SetElement(ih,0); // mdvSerr->SetElement(ih,0); // mdvB->SetElement(ih,0); // mdvBerr->SetElement(ih,0); // } }else{ //fit ok! if(writefit) fitter.WriteCanvas(Form("h%d",ih+i*nhistforptbin),"./",nsigma); Double_t signif=0, signal=0, background=0, errSignif=0, errSignal=0, errBackground=0; fitter.Signal(nsigma,signal,errSignal); fitter.Background(nsigma,background,errBackground); Double_t meanfit=fitter.GetMean(); Double_t sigmafit=fitter.GetSigma(); if(sigmafit > 0.03){ //refit fitter.Reset(); fitter.SetHisto(h); fitter.SetRangeFit(1.8,1.93); //WARNING!! this is candidate dependant!! (change) fitter.SetInitialGaussianMean(mass); fitter.SetInitialGaussianSigma(sigma); ok=fitter.MassFitter(kFALSE); if(ok){ meanfit=fitter.GetMean(); sigmafit=fitter.GetSigma(); fitter.Signal(nsigma,signal,errSignal); fitter.Background(nsigma,background,errBackground); } } //sigma check done and fit recalc if(ok==kTRUE && sigmafit < 0.03 && signal > 0 && background > 0){ fitter.Significance(nsigma,signif,errSignif); if(signif >0){ if(errSignal/signal < 0.35 && TMath::Abs(meanfit-mass)<0.01){ outcheck<SetElement(ih,signif); mdvSgnferr->SetElement(ih,errSignif); mdvS->SetElement(ih,signal); mdvSerr->SetElement(ih,errSignal); mdvB->SetElement(ih,background); mdvBerr->SetElement(ih,errBackground); }else{ ok=fitter.RefitWithBkgOnly(kFALSE); if (ok){ countBkgOnly++; Double_t bkg=0,errbkg=0.; Double_t nsigmarange[2]={mass-nsigma*sigma,mass+nsigma*sigma}; fitter.Background(nsigmarange[0],nsigmarange[1],bkg,errbkg); outcheck<SetElement(ih,0); mdvSgnferr->SetElement(ih,0); mdvS->SetElement(ih,0); mdvSerr->SetElement(ih,0); mdvB->SetElement(ih,bkg); mdvBerr->SetElement(ih,errbkg); } }//only bkg }//check signif>0 else{ countSgnfFail++; cout<<"Setting to 0 (fitter results meaningless)"<SetElement(ih,0); mdvSgnferr->SetElement(ih,0); mdvS->SetElement(ih,0); mdvSerr->SetElement(ih,0); mdvB->SetElement(ih,0); mdvBerr->SetElement(ih,0); } } //end fit ok! } }else{ //check on histo countNoHist++; cout<<"Setting to 0 (indexes = -1)"<SetElement(ih,0); mdvSgnferr->SetElement(ih,0); mdvS->SetElement(ih,0); mdvSerr->SetElement(ih,0); mdvB->SetElement(ih,0); mdvBerr->SetElement(ih,0); } cout<GetElement(ih)<<"\t"<GetElement(ih)<cd(); mdvS->Write(); mdvB->Write(); mdvSgnf->Write(); mdvSerr->Write(); mdvBerr->Write(); mdvSgnferr->Write(); } fout->Close(); outcheck<<"\nSummary:\n - Total number of histograms: "<SetCanvasColor(0); gStyle->SetFrameFillColor(0); gStyle->SetTitleFillColor(0); gStyle->SetOptStat(0); //gStyle->SetOptTitle(0); if((maximize && readfromfile) || (!maximize && !readfromfile)){ cout<<"Error! maximize & readfromfile cannot be both kTRUE or kFALSE"<IsOpen()){ cout<<"outputSignifMaxim.root not found"<2){ cout<<"Error! cannot show "<Get(mdvname); if(!mdv){ nptbins=ip; cout<<"Number of pt bins "<Get(mdvname); AliMultiDimVector* mdverr=0x0; if(!mdv){ cout<GetNVariables(); //Int_t nfixed=nvarsopt-n; Int_t fixedvars[nvarsopt]; Int_t allfixedvars[nvarsopt*nptbins]; fstream writefixedvars; if(readfromfile) { //open file in read mode writefixedvars.open("fixedvars.dat",ios::in); Int_t longi=0; while(writefixedvars){ writefixedvars>>allfixedvars[longi]; longi++; } } else { //open file in write mode writefixedvars.open("fixedvars.dat",ios::out); } //ask variables for projection for(Int_t k=0;kGetAxisTitle(k)<>variable[j]; } if(n==1) variable[1]=999; TCanvas* cvpj=new TCanvas(Form("proj%d",variable[0]),Form("%s wrt %s",title.Data(),(mdv->GetAxisTitle(variable[0])).Data())); TMultiGraph* mg=new TMultiGraph(Form("proj%d",variable[0]),Form("%s wrt %s;%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).Data(),(mdv->GetAxisTitle(variable[0])).Data(),title.Data())); TLegend *leg=new TLegend(0.7,0.2,0.9,0.6,"Pt Bin"); leg->SetBorderSize(0); leg->SetFillStyle(0); for (Int_t i=0;iGet(nameS.Data()); AliMultiDimVector* mdvB=(AliMultiDimVector*)fin->Get(nameB.Data()); AliMultiDimVector* mdvBerr=(AliMultiDimVector*)fin->Get(nameerrS.Data()); AliMultiDimVector* mdvSerr=(AliMultiDimVector*)fin->Get(nameerrB.Data()); if(!(mdvS && mdvB && mdvSerr && mdvBerr)){ cout<<"one of the multidimvector is not present"<GetSignificanceError(); AliMultiDimVector* mvpur=cal->CalculatePurity(); AliMultiDimVector* mvepur=cal->CalculatePurityError(); Int_t ncuts=mdvS->GetNVariables(); Int_t *maxInd=new Int_t[ncuts]; Float_t *cutvalues=new Float_t[ncuts]; //init for(Int_t ind=0;indGetMaxSignificance(maxInd,0); for(Int_t ic=0;icGet(nameS.Data()))->GetCutValue(ic,maxInd[ic]); //setting step of fixed variables if(readfromfile){ //from file fixedvars[ic]=allfixedvars[i+ic]; } if(maximize) { //using the values which maximize the significance fixedvars[ic]=maxInd[ic]; //write to output fixedvars.dat writefixedvars<GetElement(maxInd,0)); printf("Purity = %f +- %f\n",mvpur->GetElement(maxInd,0),mvepur->GetElement(maxInd,i)); if(which==3){ //mdv=0x0; mdv=cal->CalculateSOverB(); if(!mdv)cout<GetName()<<" null"<CalculateSOverBError(); if(!mdverr)cout<GetName()<<" null"<Get(mdvname); if(!mdv)cout<Get(mdverrname); if(!mdverr)cout<GetPtLimit(0),mdv->GetPtLimit(1)); if(n==2) { gStyle->SetPalette(1); TH2F* hproj=mdv->Project(variable[0],variable[1],fixedvars,0); hproj->SetTitle(Form("%s wrt %s vs %s (Ptbin%d);%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data(),i,(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data())); TCanvas* cvpj=new TCanvas(Form("proj%d%dpt%d",variable[0],variable[1],i),Form("%s wrt %s vs %s (Ptbin%d)",title.Data(),(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data(),i)); cvpj->cd(); hproj->DrawClone("COLZtext"); cvpj->SaveAs(Form("%s%s.png",shorttitle.Data(),cvpj->GetName())); delete hproj; } if(n==1){ Int_t nbins=mdv->GetNCutSteps(variable[0]); Double_t *x=new Double_t[nbins]; Double_t *y=new Double_t[nbins]; Double_t *errx=new Double_t[nbins]; Double_t *erry=new Double_t[nbins]; for(Int_t k=0;kGetCutValue(variable[0],k); errx[k]=mdv->GetCutStep(variable[0])/2.; y[k]=mdv->GetElement(fixedvars,0); erry[k]=mdverr->GetElement(fixedvars,0); if(which==3){ } cout<GetAxisTitle(variable[0])<<" step "<SetMarkerStyle(20+i); gr->SetMarkerColor(i+1); gr->SetMinimum(0); gr->SetName(Form("g1%d",i)); mg->Add(gr,"P"); leg->AddEntry(gr,ptbinrange.Data(),"p"); } } if(n==1){ cvpj->cd(); mg->Draw("A"); leg->Draw(); cvpj->SaveAs(Form("%s%s.png",shorttitle.Data(),cvpj->GetName())); } else delete cvpj; }