#include <TFile.h> #include <TH1.h> #include <TProfile.h> #include <TF1.h> #include <TGraphErrors.h> #include <TCanvas.h> #include <TAxis.h> #include <TLegend.h> #include <TStyle.h> #include <TGraphAsymmErrors.h> #include <TList.h> #include <TMath.h> #include <TString.h> #include <TSystem.h> #include <TLatex.h> #include <TF1.h> #include <TF2.h> #include <TFitResultPtr.h> #include <TFitResult.h> #include "AliHighPtDeDxCalib.h" #include "my_tools.C" #include "my_functions.C" #include <iostream> #include <fstream> #include <string> using namespace std; /* Ideas to improve: ================= Use the real mean p -> Might give some effect Effect: Push the <dE/dx> down (let'a see if it is still needed in the fits) Use the real <nCl> Effect: Increase sigma for p<15. For p>15 seems to saturate. To use: ======= root is enough gSystem->AddIncludePath("-I$ALICE_ROOT/TPC") gSystem->AddIncludePath("-I../lib") gSystem->AddIncludePath("-I../grid") gSystem->AddIncludePath("-I../macros") gROOT->SetMacroPath(".:../macros:../grid:../lib/") .L libMyDeDxAnalysis.so .L my_functions.C+ .L my_tools.C+ .L DebugClasses.C+ .L calibrate_de_dx.C+ // Step 2: test calibrations done in step 1 DrawStep2("calib_eta/7tev_b.root", kFALSE); DrawStep2("calib_eta/7tev_b.root", kTRUE); TestResolutionVsDeDx("calib_eta/7tev_b.root"); TestResolutionVsEta("calib_eta/7tev_b.root", kTRUE); // Here we want to see that the data is symmetric in eta and roughly symmetric for high vs low eta CompareYields("calib_eta/7tev_b.root", 0, 3.0, 30.0, "eta-80", "eta08") CompareYields("calib_eta/7tev_b.root", 0, 3.0, 30.0, "etaabs04", "etaabs48") // Step 3: extract FitDeDxVsP("calib_eta/7tev_b.root", 3.0, 30.0, 4, 2, kTRUE) // Step 4: inspect the results in results/calibdedx and results/calibplots // using e.g. gwenview. Event the fit did not converge it is still ok if it // describes the data! // // Test // // Step 2: test calibrations done in step 1 DrawStep2("calib_eta/7tev_b_test.root", kFALSE); DrawStep2("calib_eta/7tev_b_test.root", kTRUE); TestResolutionVsDeDx("calib_eta/7tev_b_test.root"); TestResolutionVsEta("calib_eta/7tev_b_test.root", kTRUE); // Step 3: extract FitDeDxVsP("calib_eta/7tev_b_test.root", 2.0, 10.0, 4, 2, kTRUE) */ //____________________________________________________________________________ void FitDeDxVsP(const Char_t* calibFileName, Double_t pStart, Double_t pStop, Int_t optionDeDx, Int_t optionSigma, Bool_t performFit = kFALSE, Int_t run = 0, Int_t filter = 1, Bool_t usePhiCut = kTRUE, const Char_t* v0FileName=0, Bool_t fixAllPar=kFALSE) { gStyle->SetOptStat(0); TString baseName(gSystem->BaseName(calibFileName)); baseName.ReplaceAll(".root", ""); TFile* calibFile = FindFileFresh(calibFileName); if(!calibFile) return; AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, filter, usePhiCut, run); calib->Print(); fixMIP = calib->GetHistDeDx(kTRUE, 0)->GetMean(); fixPlateau = calib->GetHistDeDx(kFALSE, 0)->GetMean(); hDeDxVsP = calib->GetHistDeDxVsP(0); hMeanP = calib->GetHistMeanP(); AliHighPtDeDxCalib* lambdaCalib = 0; AliHighPtDeDxCalib* kaonCalib = 0; TH2D* hDeDxVsPV0Lambda = 0; TH2D* hDeDxVsPV0Kaon = 0; if(v0FileName) { TFile* v0File = FindFileFresh(v0FileName); if(!v0File) return; lambdaCalib = (AliHighPtDeDxCalib*)GetObject(v0File, 0, usePhiCut, run, "lambda"); lambdaCalib->Print(); hDeDxVsPV0Lambda = lambdaCalib->GetHistDeDxVsP(0); kaonCalib = (AliHighPtDeDxCalib*)GetObject(v0File, 0, usePhiCut, run, "kaon"); kaonCalib->Print(); hDeDxVsPV0Kaon = kaonCalib->GetHistDeDxVsP(0); } CreateDir("old"); gSystem->Exec("mv results/calibdedx/* old/"); if(calib->IsMc()) gSystem->Exec("mv debugmc/* old/"); if(hDeDxVsPV0Lambda) { gSystem->Exec("mv debuglambda/* old/"); gSystem->Exec("mv debugkaon/* old/"); } TH2D* hDeDxVsPPi = 0; TH2D* hDeDxVsPK = 0; TH2D* hDeDxVsPP = 0; TH2D* hDeDxVsPMu = 0; if(calib->IsMc()) { hDeDxVsPPi = calib->GetHistDeDxVsP(1); hDeDxVsPK = calib->GetHistDeDxVsP(2); hDeDxVsPP = calib->GetHistDeDxVsP(3); hDeDxVsPMu = calib->GetHistDeDxVsP(5); } TCanvas* cDeDxVsP = new TCanvas("cDeDxVsP", "dE/dx vs p", 400, 300); cDeDxVsP->Clear(); cDeDxVsP->cd(); cDeDxVsP->SetLogz(); hDeDxVsP->SetTitle(0); hDeDxVsP->Draw("COLZ"); TCanvas* cDeDxVsPLogX = new TCanvas("cDeDxVsPLogX", "dE/dx vs p", 400, 300); cDeDxVsPLogX->Clear(); cDeDxVsPLogX->cd(); cDeDxVsPLogX->SetLogz(); cDeDxVsPLogX->SetLogx(); hDeDxVsP->Draw("COLZ"); // Root is a bit stupid with finidng bins so we have to add and subtract a // little to be sure we get the right bin as we typically put edges as // limits const Int_t binStart = hDeDxVsP->GetXaxis()->FindBin(pStart+0.01); pStart = hDeDxVsP->GetXaxis()->GetBinLowEdge(binStart); const Int_t binStop = hDeDxVsP->GetXaxis()->FindBin(pStop-0.01); pStop = hDeDxVsP->GetXaxis()->GetBinUpEdge(binStop); const Int_t nBins = binStop - binStart + 1; cout << "Doing 2d fit from pTlow = " << pStart << " (bin: " << binStart << ") to pThigh = " << pStop << " (bin: " << binStop << ")" << endl; // Double_t binSize = (histdEdxvsP->GetXaxis()->GetXmax() - histdEdxvsP->GetXaxis()->GetXmin())/ histdEdxvsP->GetXaxis()->GetNbins(); Double_t parDeDx[3] = {0, 0, 0}; Double_t parSigma[3] = {0, 0, 0}; const Int_t nLocalParams = 3; // pi, K, p yields Int_t nDeDxPar = 0; Int_t nSigmaPar = 0; switch(optionDeDx) { case 1: nDeDxPar = 2; parDeDx[0] = 39.7; parDeDx[1] = 6.3; break; case 2: nDeDxPar = 1; parDeDx[0] = 7.3; break; case 3: nDeDxPar = 2; parDeDx[0] = 6.85097; parDeDx[1] = 29.5933; break; // case 4: // nDeDxPar = 3; // parDeDx[0] = 35.5471; // parDeDx[1] = 6.85097; // parDeDx[2] = 29.5933; // break; case 4: nDeDxPar = 3; parDeDx[0] = 35.6694; parDeDx[1] = 6.80835; parDeDx[2] = 7.6542; break; default: cout << "optionDeDx does not support option: " << optionDeDx << endl; return; break; } switch(optionSigma) { case 1: nSigmaPar = 1; parSigma[0] = 3.0; break; case 2: nSigmaPar = 1; parSigma[0] = 0.0655688; break; case 3: nSigmaPar = 2; parSigma[0] = 0.06; parSigma[1] = -0.001; case 4: nSigmaPar = 2; parSigma[0] = 0.06; parSigma[1] = 1.0; break; case 5: nSigmaPar = 2; parSigma[0] = 0.06; parSigma[1] = 1.0; break; default: cout << "optionSigma does not support option: " << optionSigma << endl; return; break; } const Int_t nGlobalParams = 2 // binStart, binStop, + 2 + nDeDxPar // optionDeDx, nDeDxPar, dedxpar0 .... + 2 + nSigmaPar; // nSigmaPar, sigmapar0 ..... const Int_t nParams = nBins*nLocalParams + nGlobalParams; TF2* fitAll = new TF2("fitAll", fitf3G, pStart, pStop, 30, 90, nParams); Double_t parametersIn[nParams]; parametersIn[0] = binStart; fitAll->SetParName(0,"binStart"); fitAll->FixParameter(0, parametersIn[0]); parametersIn[1] = binStop; fitAll->SetParName(1,"binStop"); fitAll->FixParameter(1, parametersIn[1]); // dE/dx parameters parametersIn[2] = nDeDxPar; fitAll->SetParName(2,"nDeDxPar"); fitAll->FixParameter(2, parametersIn[2]); parametersIn[3] = optionDeDx; fitAll->SetParName(3,"optionDeDx"); fitAll->FixParameter(3, parametersIn[3]); for(Int_t i = 0; i < nDeDxPar; i++) { parametersIn[4+i] = parDeDx[i]; fitAll->SetParName(4+i,Form("dEdXpar%d", i)); // if(optionDeDx == 4 && i <2) { // fitAll->FixParameter(4+i, parametersIn[4+i]); // } if(fixAllPar) { fitAll->FixParameter(4+i, parametersIn[4+i]); } } // sigma parameters parametersIn[4+nDeDxPar] = nSigmaPar; fitAll->SetParName(4+nDeDxPar,"nSigmaPar"); fitAll->FixParameter(4+nDeDxPar, parametersIn[4+nDeDxPar]); parametersIn[5+nDeDxPar] = optionSigma; fitAll->SetParName(5+nDeDxPar,"optionSigma"); fitAll->FixParameter(5+nDeDxPar, parametersIn[5+nDeDxPar]); for(Int_t i = 0; i < nSigmaPar; i++) { parametersIn[6+nDeDxPar+i] = parSigma[i]; fitAll->SetParName(6+nDeDxPar+i,Form("sigmapar%d", i)); if(fixAllPar) { fitAll->FixParameter(6+nDeDxPar+i, parametersIn[6+nDeDxPar+i]); } } // Initial yields for(Int_t bin = binStart; bin <= binStop; bin++) { TH1D* hDeDxVsPProj =(TH1D*)hDeDxVsP->ProjectionY("hDeDxVsPProj", bin, bin); const Int_t offset = nGlobalParams + (bin - binStart)*nLocalParams; const Double_t all = hDeDxVsPProj->Integral(); parametersIn[offset + 0] = (all)*0.6; parametersIn[offset + 1] = (all)*0.3; parametersIn[offset + 2] = (all)*0.1; fitAll->SetParName(offset + 0, Form("piYield%d", bin)); fitAll->SetParLimits(offset + 0, 0, 10*all); fitAll->SetParName(offset + 1, Form("kYield%d", bin)); fitAll->SetParLimits(offset + 1, 0, 10*all); fitAll->SetParName(offset + 2, Form("pYield%d", bin)); fitAll->SetParLimits(offset + 2, 0, 10*all); // fitAll->SetParLimits(offset + 0, 0., histdEdxvsPpy->GetEntries()); // fitAll->SetParLimits(offset + 1, 0., histdEdxvsPpy->GetEntries()); // fitAll->SetParLimits(offset + 2, 0., histdEdxvsPpy->GetEntries()); } fitAll->SetParameters(parametersIn); fitAll->Print(); Bool_t converged = kFALSE; if(performFit) { for(Int_t i = 0; i < 4; i++) { TFitResultPtr fitResultPtr = hDeDxVsP->Fit(fitAll, "0S", "", pStart+0.01, pStop-0.01); if(!fitResultPtr->Status()) { // if(!fitResultPtr->Status() && !fitResultPtr->CovMatrixStatus()) { converged = kTRUE; break; } } } // else we just draw how the results looks with the input parameters Double_t parametersOut[nParams]; fitAll->GetParameters(parametersOut); const Double_t* parameterErrorsOut = fitAll->GetParErrors(); // overlay the fitfunction TF1* fDeDxPi = new TF1("fDeDxPi", FitFunc, 0, 50, nDeDxPar+1); // +1 because of option! fDeDxPi->SetParameters(¶metersOut[3]); fDeDxPi->SetLineWidth(2); cDeDxVsP->cd(); fDeDxPi->Draw("SAME"); cDeDxVsPLogX->cd(); fDeDxPi->Draw("SAME"); TF1* fDeDxK = new TF1("fDeDxK", FitFunc, 0, 50, nDeDxPar+1); fDeDxK->SetParameters(¶metersOut[3]); fDeDxK->SetParameter(0, fDeDxK->GetParameter(0)+10); fDeDxK->SetLineWidth(2); cDeDxVsP->cd(); fDeDxK->Draw("SAME"); cDeDxVsPLogX->cd(); fDeDxK->Draw("SAME"); TF1* fDeDxP = new TF1("fDeDxP", FitFunc, 0, 50, nDeDxPar+1); fDeDxP->SetParameters(¶metersOut[3]); fDeDxP->SetParameter(0, fDeDxP->GetParameter(0)+20); fDeDxP->SetLineWidth(2); cDeDxVsP->cd(); fDeDxP->Draw("SAME"); cDeDxVsPLogX->cd(); fDeDxP->Draw("SAME"); TF1* fDeDxE = new TF1("fDeDxE", FitFunc, 0, 50, nDeDxPar+1); fDeDxE->SetParameters(¶metersOut[3]); fDeDxE->SetParameter(0, fDeDxE->GetParameter(0)+30); fDeDxE->SetLineWidth(2); cDeDxVsP->cd(); fDeDxE->Draw("SAME"); cDeDxVsPLogX->cd(); fDeDxE->Draw("SAME"); TF1* fSigma = new TF1("fSigma", SigmaFunc, 0, 50, nSigmaPar+1); fSigma->SetParameters(¶metersOut[5 + nDeDxPar]); // fitAll->Draw("same cont3"); CreateDir("results/calibdedx"); cDeDxVsP->cd(); cDeDxVsP->Modified(); cDeDxVsP->Update(); gROOT->ProcessLine(".x drawText.C"); cDeDxVsP->SaveAs("results/calibdedx/dedx_vs_p.gif"); cDeDxVsP->SaveAs("results/calibdedx/dedx_vs_p.pdf"); cDeDxVsPLogX->cd(); cDeDxVsPLogX->Modified(); cDeDxVsPLogX->Update(); gROOT->ProcessLine(".x drawText.C"); cDeDxVsPLogX->SaveAs("results/calibdedx/dedx_vs_p_logx.gif"); cDeDxVsPLogX->SaveAs("results/calibdedx/dedx_vs_p_logx.pdf"); //cross check TCanvas* cFits = new TCanvas("cFits", "Fit comparison to data", 1200, 800); cFits->Clear(); cFits->Divide(7, 5); TF1* pion = new TF1("pion", "gausn", 30, 90); pion->SetLineWidth(2); pion->SetLineColor(kRed); TF1* kaon = new TF1("kaon", "gausn", 30, 90); kaon->SetLineWidth(2); kaon->SetLineColor(kGreen); TF1* proton = new TF1("proton", "gausn", 30, 90); proton->SetLineWidth(2); proton->SetLineColor(kBlue); TF1* total = new TF1("total", "gausn(0)+gausn(3)+gausn(6)", 30, 90); total->SetLineColor(kBlack); total->SetLineWidth(2); total->SetLineStyle(2); TLegend* legend = new TLegend(0.11, 0.6, 0.35, 0.85); legend->SetBorderSize(0); legend->SetFillColor(0); legend->AddEntry(total, "3-Gauss fit", "L"); legend->AddEntry(pion, "#pi", "L"); legend->AddEntry(kaon, "K", "L"); legend->AddEntry(proton, "p", "L"); TCanvas* cSingleFit = new TCanvas("cSingleFit", "single fit"); TH1D* hPionRatio =(TH1D*)hDeDxVsP->ProjectionX("hPionRatio", 1, 1); hPionRatio->Reset(); hPionRatio->GetXaxis()->SetRangeUser(pStart+0.001, pStop-0.001); hPionRatio->GetYaxis()->SetRangeUser(0.0, 1.0); hPionRatio->SetTitle("particle fractions; p [GeV/c]; particle fraction"); TH1D* hKaonRatio = (TH1D*)hPionRatio->Clone("hKaonRatio"); TH1D* hProtonRatio = (TH1D*)hPionRatio->Clone("hProtonRatio"); TH1D* hPionRatioMc = (TH1D*)hPionRatio->Clone("hPionRatioMc"); TH1D* hKaonRatioMc = (TH1D*)hPionRatio->Clone("hKaonRatioMc"); TH1D* hProtonRatioMc = (TH1D*)hPionRatio->Clone("hProtonRatioMc"); TH1D* hMuonRatioMc = (TH1D*)hPionRatio->Clone("hMuonRatioMc"); for(Int_t bin = binStart; bin <= binStop; bin++){ cout << "Making projection for bin: " << bin << endl; const Int_t j = bin-binStart; cFits->cd(); cFits->cd(j + 1); TH1D* hDeDxVsPProj =(TH1D*)hDeDxVsP->ProjectionY(Form("hDeDxVsPProj%d", bin), bin, bin); hDeDxVsPProj->GetXaxis()->SetRangeUser(40, 90); hDeDxVsPProj->SetTitle(Form("%.1f<p<%.1f GeV/c", hDeDxVsP->GetXaxis()->GetBinLowEdge(bin), hDeDxVsP->GetXaxis()->GetBinUpEdge(bin))); hDeDxVsPProj->Draw(); const Int_t offset = nGlobalParams + j*nLocalParams; const Double_t p = hDeDxVsP->GetXaxis()->GetBinCenter(bin); const Double_t pKeff = p*piMass/kMass; // corresponding p of a pion with same dE/dx const Double_t pPeff = p*piMass/pMass; // corresponding p of a pion with same dE/dx const Double_t meanDeDxPi = fDeDxPi->Eval(p); const Double_t meanDeDxK = fDeDxPi->Eval(pKeff); const Double_t meanDeDxP = fDeDxPi->Eval(pPeff); Double_t gausParams[9] = { parametersOut[offset + 0], meanDeDxPi, fSigma->Eval(meanDeDxPi) , parametersOut[offset + 1], meanDeDxK, fSigma->Eval(meanDeDxK) , parametersOut[offset + 2], meanDeDxP, fSigma->Eval(meanDeDxP) , }; for(Int_t i = 0; i < 9; i++) cout << gausParams[i] << ", "; cout << endl; pion->SetParameters(&gausParams[0]); pion->DrawCopy("same"); Double_t all = hDeDxVsPProj->Integral(); hPionRatio->SetBinContent(bin, parametersOut[offset + 0]/all); hPionRatio->SetBinError(bin, parameterErrorsOut[offset + 0]/all); kaon->SetParameters(&gausParams[3]); kaon->DrawCopy("same"); hKaonRatio->SetBinContent(bin, parametersOut[offset + 1]/all); hKaonRatio->SetBinError(bin, parameterErrorsOut[offset + 1]/all); proton->SetParameters(&gausParams[6]); proton->DrawCopy("same"); hProtonRatio->SetBinContent(bin, parametersOut[offset + 2]/all); hProtonRatio->SetBinError(bin, parameterErrorsOut[offset + 2]/all); total->SetParameters(gausParams); total->DrawCopy("same"); cSingleFit->cd(); cSingleFit->Clear(); // cSingleFit->SetLogy(); hDeDxVsPProj->Draw(); pion->DrawCopy("same"); kaon->DrawCopy("same"); proton->DrawCopy("same"); total->DrawCopy("same"); gROOT->ProcessLine(".x drawText.C(2)"); cSingleFit->SaveAs(Form("results/calibdedx/ptspectrum_bin%d.gif", bin)); cSingleFit->SaveAs(Form("results/calibdedx/ptspectrum_bin%d.pdf", bin)); // legend->Draw(); if(calib->IsMc()) { cSingleFit->cd(); cSingleFit->Clear(); TH1D* hDeDxVsPPiProj =(TH1D*)hDeDxVsPPi->ProjectionY(Form("hDeDxVsPPiProj%d", bin), bin, bin); hDeDxVsPPiProj->SetMarkerStyle(20); hDeDxVsPPiProj->SetMarkerColor(2); hDeDxVsPPiProj->GetXaxis()->SetRangeUser(40, 90); hDeDxVsPPiProj->SetTitle(Form("%.1f<p<%.1f GeV/c", hDeDxVsP->GetXaxis()->GetBinLowEdge(bin), hDeDxVsP->GetXaxis()->GetBinUpEdge(bin))); hDeDxVsPPiProj->Draw("P"); hPionRatioMc->SetBinContent(bin, hDeDxVsPPiProj->Integral()/all); TH1D* hDeDxVsPKProj =(TH1D*)hDeDxVsPK->ProjectionY(Form("hDeDxVsPKProj%d", bin), bin, bin); hDeDxVsPKProj->SetMarkerStyle(21); hDeDxVsPKProj->SetMarkerColor(3); hDeDxVsPKProj->Draw("SAME P"); hKaonRatioMc->SetBinContent(bin, hDeDxVsPKProj->Integral()/all); TH1D* hDeDxVsPPProj =(TH1D*)hDeDxVsPP->ProjectionY(Form("hDeDxVsPPProj%d", bin), bin, bin); hDeDxVsPPProj->SetMarkerStyle(22); hDeDxVsPPProj->SetMarkerColor(4); hDeDxVsPPProj->Draw("SAME P"); hProtonRatioMc->SetBinContent(bin, hDeDxVsPPProj->Integral()/all); TH1D* hDeDxVsPMuProj =(TH1D*)hDeDxVsPMu->ProjectionY(Form("hDeDxVsPMuProj%d", bin), bin, bin); hDeDxVsPMuProj->SetMarkerStyle(22); hDeDxVsPMuProj->SetMarkerColor(6); // hDeDxVsPMuProj->Draw("SAME P"); hMuonRatioMc->SetBinContent(bin, hDeDxVsPMuProj->Integral()/all); // cSingleFit->SetLogy(); pion->DrawCopy("same"); kaon->DrawCopy("same"); proton->DrawCopy("same"); CreateDir("results/calibdedx/debugmc"); cSingleFit->SaveAs(Form("results/calibdedx/debugmc/ptspectrum_bin%d.gif", bin)); } if(hDeDxVsPV0Lambda) { cSingleFit->cd(); cSingleFit->Clear(); TH1D* hDeDxVsPV0LambdaProj =(TH1D*)hDeDxVsPV0Lambda->ProjectionY(Form("hDeDxVsPV0LambdaProj%d", bin), bin, bin); hDeDxVsPV0LambdaProj->SetMarkerStyle(20); hDeDxVsPV0LambdaProj->SetMarkerColor(4); hDeDxVsPV0LambdaProj->GetXaxis()->SetRangeUser(40, 90); hDeDxVsPV0LambdaProj->SetTitle(Form("%.1f<p<%.1f GeV/c", hDeDxVsP->GetXaxis()->GetBinLowEdge(bin), hDeDxVsP->GetXaxis()->GetBinUpEdge(bin))); hDeDxVsPV0LambdaProj->Draw("P"); proton->SetParameter(0, hDeDxVsPV0LambdaProj->Integral()); proton->DrawCopy("same"); CreateDir("results/calibdedx/debuglambda"); cSingleFit->SaveAs(Form("results/calibdedx/debuglambda/ptspectrum_bin%d.gif", bin)); } if(hDeDxVsPV0Kaon) { cSingleFit->cd(); cSingleFit->Clear(); TH1D* hDeDxVsPV0KaonProj =(TH1D*)hDeDxVsPV0Kaon->ProjectionY(Form("hDeDxVsPV0KaonProj%d", bin), bin, bin); hDeDxVsPV0KaonProj->SetMarkerStyle(20); hDeDxVsPV0KaonProj->SetMarkerColor(2); hDeDxVsPV0KaonProj->GetXaxis()->SetRangeUser(40, 90); hDeDxVsPV0KaonProj->SetTitle(Form("%.1f<p<%.1f GeV/c", hDeDxVsP->GetXaxis()->GetBinLowEdge(bin), hDeDxVsP->GetXaxis()->GetBinUpEdge(bin))); hDeDxVsPV0KaonProj->Draw("P"); pion->SetParameter(0, hDeDxVsPV0KaonProj->Integral()); pion->DrawCopy("same"); CreateDir("results/calibdedx/debugkaon"); cSingleFit->SaveAs(Form("results/calibdedx/debugkaon/ptspectrum_bin%d.gif", bin)); } } TCanvas* cRatio = new TCanvas("cRatio", "ratios/all vs p", 600, 400); cRatio->Clear(); hPionRatio->SetMaximum(0.8); hPionRatio->SetMarkerStyle(20); hPionRatio->SetMarkerColor(2); hPionRatio->Draw("P E"); hKaonRatio->SetMarkerStyle(20); hKaonRatio->SetMarkerColor(3); hKaonRatio->Draw("SAME P E"); hProtonRatio->SetMarkerStyle(20); hProtonRatio->SetMarkerColor(4); hProtonRatio->Draw("SAME P E"); gROOT->ProcessLine(".x drawText.C(2)"); cRatio->SaveAs("results/calibdedx/particle_ratios.gif"); cRatio->SaveAs("results/calibdedx/particle_ratios.pdf"); if(calib->IsMc()) { hPionRatioMc->SetMarkerStyle(24); hPionRatioMc->SetMarkerColor(2); hPionRatioMc->Draw("SAME P"); hKaonRatioMc->SetMarkerStyle(24); hKaonRatioMc->SetMarkerColor(3); hKaonRatioMc->Draw("SAME P"); hProtonRatioMc->SetMarkerStyle(24); hProtonRatioMc->SetMarkerColor(4); hProtonRatioMc->Draw("SAME P"); hMuonRatioMc->SetMarkerStyle(24); hMuonRatioMc->SetMarkerColor(6); // hMuonRatioMc->Draw("SAME P"); cRatio->SaveAs("results/calibdedx/debugmc/particle_ratios_mc.gif"); } cout << "MIP was fixed to: " << fixMIP << endl << "Plateau was fixed to: " << fixPlateau << endl; // // Store the <dE/dx> parameters in a file that we can get them back to use for the Delta-pi! // DeDxFitInfo* fitInfo = new DeDxFitInfo(); fitInfo->MIP = fixMIP; fitInfo->plateau = fixPlateau; fitInfo->optionDeDx = optionDeDx; fitInfo->nDeDxPar = nDeDxPar; for(Int_t i = 0; i < nDeDxPar; i++) { fitInfo->parDeDx[i] = fDeDxPi->GetParameter(i+1); // 1st parameter is option } fitInfo->optionSigma = optionSigma; fitInfo->nSigmaPar = nSigmaPar; for(Int_t i = 0; i < nSigmaPar; i++) { fitInfo->parSigma[i] = fSigma->GetParameter(i+1); // 1st parameter is option } if(!strstr(calibFileName, "no_calib_eta")) fitInfo->calibFileName = calibFileName; fitInfo->Print(); CreateDir("fitparameters"); TFile* outFile = new TFile(Form("fitparameters/%s", gSystem->BaseName(calibFileName)), "RECREATE"); fitInfo->Write("fitInfo"); outFile->Close(); if(converged) { cout << "Fit converged and error matrix was ok" << endl; } else { cout << "WARNING!!!!!!!!!!!!!!! Fit did not converge, or error matrix was not ok!" << endl; } } //____________________________________________________________________________ void DrawStep2(const Char_t* calibFileName, Bool_t forMIP = kTRUE, Int_t run = 0, Int_t filter = 1, Bool_t usePhiCut = kTRUE) { // option: // 0 - compare to ALICE INEL // 1 - compare to MC input spectrum // 2 - compare to MC correct spectrum gStyle->SetOptStat(0); CreateDir("results/calibplots"); TString baseName(gSystem->BaseName(calibFileName)); baseName.ReplaceAll(".root", ""); TFile* calibFile = FindFileFresh(calibFileName); if(!calibFile) return; AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, filter, usePhiCut, run); calib->Print(); TCanvas* cPhiCut = calib->DrawPhiCutHistograms(); gROOT->ProcessLine(".x drawText.C(2)"); cPhiCut->SaveAs(Form("results/calibplots/phicut_%s.gif", baseName.Data())); cPhiCut->SaveAs(Form("results/calibplots/phicut_%s.pdf", baseName.Data())); TCanvas* cEta = calib->DrawEta(forMIP); gROOT->ProcessLine(".x drawText.C(2)"); TCanvas* cEtaCal = calib->DrawEtaCalibrated(forMIP); gROOT->ProcessLine(".x drawText.C(2)"); if(forMIP) { cEta->cd(); cEta->SaveAs(Form("results/calibplots/MIP_dedx_vs_eta_nocal_%s.gif", baseName.Data())); cEta->SaveAs(Form("results/calibplots/MIP_dedx_vs_eta_nocal_%s.pdf", baseName.Data())); cEtaCal->cd(); cEtaCal->SaveAs(Form("results/calibplots/MIP_dedx_vs_eta_final_%s.gif", baseName.Data())); cEtaCal->SaveAs(Form("results/calibplots/MIP_dedx_vs_eta_final_%s.pdf", baseName.Data())); } else { cEta->cd(); cEta->SaveAs(Form("results/calibplots/Electrons_dedx_vs_eta_nocal_%s.gif", baseName.Data())); cEta->SaveAs(Form("results/calibplots/Electrons_dedx_vs_eta_nocal_%s.pdf", baseName.Data())); cEtaCal->cd(); cEtaCal->SaveAs(Form("results/calibplots/Electrons_dedx_vs_eta_final_%s.gif", baseName.Data())); cEtaCal->SaveAs(Form("results/calibplots/Electrons_dedx_vs_eta_final_%s.pdf", baseName.Data())); } TCanvas* cEtaSel = calib->DrawSelectionHistograms(); gROOT->ProcessLine(".x drawText.C(2)"); cEtaSel->SaveAs(Form("results/calibplots/selection_%s.gif", baseName.Data())); cEtaSel->SaveAs(Form("results/calibplots/selection_%s.pdf", baseName.Data())); // TCanvas* cNcl = calib->DrawNclCal(); // gROOT->ProcessLine(".x drawText.C"); // cNcl->SaveAs(Form("results/calibplots/dedx_vs_ncl_calib__%s.gif", baseName.Data())); // cNcl->SaveAs(Form("results/calibplots/dedx_vs_ncl_calib__%s.pdf", baseName.Data())); } //____________________________________________________________________________ void TestResolutionVsDeDx(const Char_t* calibFileName, Int_t run = 0, Int_t filter = 1, Bool_t usePhiCut = kTRUE) { gStyle->SetOptStat(0); TFile* calibFile = FindFileFresh(calibFileName); if(!calibFile) return; AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, filter, usePhiCut, run); calib->Print(); TH2D* hDeDxVsNcl = calib->GetHistDeDxVsNcl(kTRUE, 0); TH2D* hDeDxVsNclE = calib->GetHistDeDxVsNcl(kFALSE, 0); TH1D* hDeDx = calib->GetHistDeDx(kTRUE, 0); TH1D* hDeDxE = calib->GetHistDeDx(kFALSE, 0); Double_t mdedx = hDeDx->GetMean(); Double_t mdedxE = hDeDxE->GetMean(); TObjArray* helpArray = new TObjArray(); hDeDxVsNcl->FitSlicesY(0, 0, -1, 0, "QNR", helpArray); TH1D* hMeanVsNcl = (TH1D*)helpArray->At(1); hMeanVsNcl->SetName("hMeanVsNcl"); hMeanVsNcl->SetMarkerStyle(29); TH1D* hSigmaVsNcl = (TH1D*)helpArray->At(2); hSigmaVsNcl->SetName("hSigmaVsNcl"); hSigmaVsNcl->SetTitle("#sigma vs Ncl; Ncl; #sigma"); hSigmaVsNcl->SetMarkerStyle(29); hSigmaVsNcl->SetMarkerColor(2); hSigmaVsNcl->Scale(1.0/mdedx); hDeDxVsNclE->FitSlicesY(0, 0, -1, 0, "QNR", helpArray); TH1D* hMeanVsNclE = (TH1D*)helpArray->At(1); hMeanVsNclE->SetName("hSigmaVsNclE"); hMeanVsNclE->SetMarkerStyle(29); TH1D* hSigmaVsNclE = (TH1D*)helpArray->At(2); hSigmaVsNclE->SetName("hSigmaVsNclE"); hSigmaVsNclE->SetTitle("#sigma vs Ncl; Ncl; #sigma"); hSigmaVsNclE->SetMarkerStyle(29); hSigmaVsNclE->SetMarkerColor(kMagenta); hSigmaVsNclE->Scale(1.0/mdedxE); TLegend* legend = new TLegend(0.54, 0.67, 0.84, 0.87); legend->SetFillColor(0); legend->SetBorderSize(0); legend->SetTextSize(0.05); legend->AddEntry(hSigmaVsNcl, "MIP pions", "P"); legend->AddEntry(hSigmaVsNclE, "electrons", "P"); TCanvas* cTestDeDx = new TCanvas("cTestDeDx", "Comparing resolution for MIPs and electrons", 1200, 400); cTestDeDx->Clear(); cTestDeDx->Divide(3, 1); cTestDeDx->cd(1); hDeDxVsNcl->Draw("COL"); hMeanVsNcl->Draw("SAME"); cTestDeDx->cd(2); hDeDxVsNclE->Draw("COL"); hMeanVsNclE->Draw("SAME"); cTestDeDx->cd(3); TF1* fSDedxVsNclSqrt = new TF1("fSDedxVsNclSqrt", "[0]*sqrt(159.0/x)", 0, 160); fSDedxVsNclSqrt->SetParameter(0, 0.05); hSigmaVsNcl->SetMinimum(0.0); hSigmaVsNcl->SetMaximum(0.15); hSigmaVsNcl->SetTitle("#sigma/<dE/dx> vs Ncl; Ncl; rel. #sigma"); // hSigmaVsNcl->Fit(fSDedxVsNclSqrt); hSigmaVsNcl->Draw(); hSigmaVsNclE->Draw("SAME"); legend->Draw(); gROOT->ProcessLine(".x drawText.C(2)"); TString baseName(gSystem->BaseName(calibFileName)); baseName.ReplaceAll(".root", ""); cTestDeDx->SaveAs(Form("results/calibplots/test_resolution_vs_dedx_%s.gif", baseName.Data())); cTestDeDx->SaveAs(Form("results/calibplots/test_resolution_vs_dedx_%s.pdf", baseName.Data())); } //___________________________________________________________________________________________ void TestResolutionVsEta(const Char_t* calibFileName, Bool_t forMIP, Int_t run = 0, Int_t filter = 1, Bool_t usePhiCut = kTRUE) { gStyle->SetOptStat(0); TFile* calibFile = FindFileFresh(calibFileName); if(!calibFile) return; AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, filter, usePhiCut, run); calib->Print(); const Int_t nEta = 4; Int_t color[nEta] = {kBlack, kBlue, kGreen+2, kRed}; TH1D* hDeDx[nEta] = {0, 0, 0, 0}; TH1D* hMeanVsNcl[nEta] = {0, 0, 0, 0}; TH1D* hSigmaVsNcl[nEta] = {0, 0, 0, 0}; const Double_t mdedx = (calib->GetHistDeDx(forMIP, 0))->GetMean(); TObjArray* helpArray = new TObjArray(); for(Int_t bin = 1; bin <= nEta; bin++) { const Int_t i = bin - 1; hDeDx[i] = calib->GetHistDeDx(forMIP, bin); hDeDx[i]->Scale(1.0/hDeDx[i]->GetEntries()); hDeDx[i]->SetMarkerStyle(24+i); hDeDx[i]->SetMarkerColor(color[i]); TH2D* hDeDxVsNcl = calib->GetHistDeDxVsNcl(forMIP, bin); hDeDxVsNcl->FitSlicesY(0, 0, -1, 0, "QNR", helpArray); hMeanVsNcl[i] = (TH1D*)helpArray->At(1); hMeanVsNcl[i]->SetTitle("<dE/dx> vs Ncl; Ncl; #sigma"); hMeanVsNcl[i]->SetName(Form("hMeanVsNcl%d", bin)); hMeanVsNcl[i]->SetMarkerStyle(24+i); hMeanVsNcl[i]->SetMarkerColor(color[i]); hMeanVsNcl[i]->SetMinimum(mdedx*0.9); hMeanVsNcl[i]->SetMaximum(mdedx*1.1); hSigmaVsNcl[i] = (TH1D*)helpArray->At(2); hSigmaVsNcl[i]->SetName("hSigmaVsNcl"); hSigmaVsNcl[i]->SetTitle("#sigma/<dE/dx> vs Ncl; Ncl; rel. #sigma"); hSigmaVsNcl[i]->SetMarkerStyle(24+i); hSigmaVsNcl[i]->SetMarkerColor(color[i]); hSigmaVsNcl[i]->Scale(1.0/mdedx); hSigmaVsNcl[i]->SetMinimum(0.0); hSigmaVsNcl[i]->SetMaximum(0.15); } TLegend* legend = new TLegend(0.54, 0.67, 0.84, 0.87); legend->SetFillColor(0); legend->SetBorderSize(0); legend->SetTextSize(0.05); legend->AddEntry(hDeDx[0], "|#eta|<0.2", "P"); legend->AddEntry(hDeDx[1], "0.2<|#eta|<0.4", "P"); legend->AddEntry(hDeDx[2], "0.4<|#eta|<0.6", "P"); legend->AddEntry(hDeDx[3], "0.6<|#eta|<0.8", "P"); TCanvas* cTestEta = new TCanvas("cTestEta", "Comparing resolution for MIPs and electrons", 1200, 400); cTestEta->Clear(); cTestEta->Divide(3, 1); for(Int_t i = 0; i < nEta; i++) { cTestEta->cd(1); if(i==0) hDeDx[i]->Draw("P"); else hDeDx[i]->Draw("SAME P"); cTestEta->cd(2); if(i==0) hMeanVsNcl[i]->Draw("P"); else hMeanVsNcl[i]->Draw("SAME P"); cTestEta->cd(3); if(i==0) { hSigmaVsNcl[i]->Draw("P"); legend->Draw(); } else hSigmaVsNcl[i]->Draw("SAME P"); } gROOT->ProcessLine(".x drawText.C(2)"); TString baseName(gSystem->BaseName(calibFileName)); baseName.ReplaceAll(".root", ""); cTestEta->SaveAs(Form("results/calibplots/test_resolution_vs_eta_%s.gif", baseName.Data())); cTestEta->SaveAs(Form("results/calibplots/test_resolution_vs_eta_%s.pdf", baseName.Data())); } // hMeanVsNcl = (TH1D*)helpArray->At(1); // hMeanVsNcl->SetName("hMeanVsNcl"); // hMeanVsNcl->SetTitle("Mean vs Ncl; Ncl; Mean"); // hMeanVsNcl->SetMarkerStyle(29); // hMeanVsNcl->SetMinimum(45); // hMeanVsNcl->SetMaximum(55); // if(isMC) { // hDeDxVsNclElectrons->FitSlicesY(0, 0, -1, 0, "QNR", helpArray); // hSigmaVsNclElectrons = (TH1D*)helpArray->At(2); // hSigmaVsNclElectrons->SetName("hSigmaVsNcl"); // hSigmaVsNclElectrons->SetTitle("#sigma vs Ncl; Ncl; #sigma"); // } // TCanvas* cNcl2 = new TCanvas("cNcl2", "sigma dE/dx vs Ncl", 600, 400); // cNcl2->Clear(); // cNcl2->cd(); // hSigmaVsNcl->DrawCopy(); // hSigmaVsNcl->Fit(fSDeDxVsNcl, "0"); // hSigmaVsNcl->Fit(fSDeDxVsNclSqrt, "0"); // fSDeDxVsNcl->DrawCopy("SAME"); // fSDeDxVsNclSqrt->SetLineStyle(2); // fSDeDxVsNclSqrt->DrawCopy("SAME"); // TLegend* legFit = new TLegend(0.64, 0.67, 0.84, 0.87); // legFit->SetFillColor(0); // legFit->SetBorderSize(0); // legFit->SetTextSize(0.05); // legFit->AddEntry(fSDeDxVsNcl, "Linear fit", "L"); // legFit->AddEntry(fSDeDxVsNclSqrt, "1/Sqrt fit", "L"); // legFit->Draw(); // cNcl2->SaveAs(Form("%s/sigma_vs_ncl.gif", baseName.Data())); // if(isMC) { // TCanvas* cNcl2Electrons = new TCanvas("cNcl2Electrons", "sigma dE/dx vs Ncl (comparison)", 600, 400); // cNcl2Electrons->Clear(); // cNcl2Electrons->cd(); // hSigmaVsNcl->SetMarkerStyle(29); // hSigmaVsNcl->DrawCopy(); // hSigmaVsNclElectrons->Scale(50.0 / hDeDxVsEtaCalibratedElectrons->GetMean(2)); // hSigmaVsNclElectrons->SetMarkerStyle(29); // hSigmaVsNclElectrons->SetMarkerColor(6); // hSigmaVsNclElectrons->DrawCopy("SAME"); // fSDeDxVsNcl->DrawCopy("SAME"); // fSDeDxVsNclSqrt->DrawCopy("SAME"); // TLegend* legSigma = new TLegend(0.64, 0.67, 0.84, 0.87); // legSigma->SetFillColor(0); // legSigma->SetBorderSize(0); // legSigma->SetTextSize(0.05); // legSigma->AddEntry(hSigmaVsNcl, "MIP pions", "P"); // legSigma->AddEntry(fSDeDxVsNcl, "Linear fit", "L"); // legSigma->AddEntry(fSDeDxVsNclSqrt, "1/Sqrt fit", "L"); // legSigma->AddEntry(hSigmaVsNclElectrons, "Scaled electrons", "P"); // legSigma->Draw(); // cNcl2Electrons->SaveAs(Form("%s/electrons_sigma_vs_ncl_comparison.gif", baseName.Data())); // } // TCanvas* cDeDx = new TCanvas("cDeDx", "dE/dx", 600, 400); // cDeDx->Clear(); // hDeDx->Scale(1.0/hDeDx->GetEntries()); // hDeDx->SetMarkerStyle(29); // hDeDx->DrawCopy(); // TCanvas* cNcl3 = new TCanvas("cNcl3", "#sigma vs Ncl", 600, 400); // cNcl3->Clear(); // hSigmaVsNcl->DrawCopy(); // TCanvas* cNcl3Mean = new TCanvas("cNcl3Mean", "Mean vs Ncl", 600, 400); // cNcl3Mean->Clear(); // hMeanVsNcl->DrawCopy(); // TLegend* legDeDx = new TLegend(0.7, 0.67, 0.9, 0.87); // legDeDx->SetFillColor(0); // legDeDx->SetBorderSize(0); // legDeDx->SetTextSize(0.05); // legDeDx->AddEntry(hDeDx, "No #eta cut", "P"); // TLegend* legScan = new TLegend(0.44, 0.67, 0.64, 0.87); // legScan->SetFillColor(0); // legScan->SetBorderSize(0); // legScan->SetTextSize(0.05); // legScan->AddEntry(hSigmaVsNcl, "No #eta cut", "P"); // TH2D* hArray[4] = {hDeDxVsNcl0, hDeDxVsNcl1, hDeDxVsNcl2, hDeDxVsNcl3}; // TH1D* hArrayDeDx[4] = {hDeDx0, hDeDx1, hDeDx3, hDeDx4}; // Int_t color[4] = {2, kGreen+1, 4, 6}; // Double_t x[4]; // Double_t x_err[4]; // Double_t slope[4]; // Double_t slope_err[4]; // Double_t offset[4]; // Double_t offset_err[4]; // for(Int_t i = 0; i < 4; i++) { // hArrayDeDx[i]->SetMarkerStyle(20); // hArrayDeDx[i]->SetMarkerColor(color[i]); // hArrayDeDx[i]->Scale(1.0/hArrayDeDx[i]->GetEntries()); // cDeDx->cd(); // hArrayDeDx[i]->DrawCopy("SAME"); // x[i] = hMeanEta->GetBinContent(i+1); // x_err[i] = hMeanEta->GetBinError(i+1); // hArray[i]->FitSlicesY(0, 0, -1, 0, "QNR", helpArray); // hSigmaVsNclHelp = (TH1D*)helpArray->At(2); // hSigmaVsNclHelp->SetName(Form("hSigmaVsNcl%d", i)); // hSigmaVsNclHelp->SetTitle("#sigma vs Ncl; Ncl; #sigma"); // hSigmaVsNclHelp->SetMarkerStyle(20); // hSigmaVsNclHelp->SetMarkerColor(color[i]); // hSigmaVsNclHelp->Fit(fSDeDxVsNclHelp, "0"); // slope[i] = fSDeDxVsNclHelp->GetParameter(0); // slope_err[i] = fSDeDxVsNclHelp->GetParError(0); // offset[i] = fSDeDxVsNclHelp->GetParameter(1); // offset_err[i] = fSDeDxVsNclHelp->GetParError(1); // cNcl3->cd(); // hSigmaVsNclHelp->DrawCopy("SAME"); // // fSDeDxVsNclHelp->DrawCopy("SAME"); // if(i==0) { // legDeDx->AddEntry(hArrayDeDx[i], "|#eta|<0.2", "P"); // legScan->AddEntry(hSigmaVsNclHelp, "|#eta|<0.2", "P"); // } else if(i==1) { // legDeDx->AddEntry(hArrayDeDx[i], "0.2<|#eta|<0.4", "P"); // legScan->AddEntry(hSigmaVsNclHelp, "0.2<|#eta|<0.4", "P"); // } else if(i==2) { // legDeDx->AddEntry(hArrayDeDx[i], "0.4<|#eta|<0.6", "P"); // legScan->AddEntry(hSigmaVsNclHelp, "0.4<|#eta|<0.6", "P"); // } else if(i==3) { // legDeDx->AddEntry(hArrayDeDx[i], "0.6<|#eta|<0.8", "P"); // legScan->AddEntry(hSigmaVsNclHelp, "0.6<|#eta|<0.8", "P"); // } // cNcl3Mean->cd(); // hMeanVsNclHelp = (TH1D*)helpArray->At(1); // hMeanVsNclHelp->SetName(Form("hMeanVsNcl%d", i)); // hMeanVsNclHelp->SetTitle("Mean vs Ncl; Ncl; Mean"); // hMeanVsNclHelp->SetMarkerStyle(20); // hMeanVsNclHelp->SetMarkerColor(color[i]); // hMeanVsNclHelp->DrawCopy("SAME"); // } // cDeDx->cd(); // hDeDx->DrawCopy("SAME"); // legDeDx->Draw(); // cDeDx->SaveAs(Form("%s/dedx_resolution_vs_eta.gif", baseName.Data())); // cNcl3->cd(); // hSigmaVsNcl->DrawCopy("SAME"); // legScan->Draw(); // cNcl3->SaveAs(Form("%s/sigma_vs_ncl_vs_eta.gif", baseName.Data())); // cNcl3Mean->cd(); // hMeanVsNcl->DrawCopy("SAME"); // legScan->Draw(); // cNcl3Mean->SaveAs(Form("%s/mean_vs_ncl_vs_eta.gif", baseName.Data())); // TGraphErrors* graphSlope = new TGraphErrors(4, x, slope, x_err, slope_err); // graphSlope->SetTitle("slope vs <#eta>; <#eta>; slope"); // graphSlope->SetMarkerStyle(29); // TCanvas* cNcl4 = new TCanvas("cNcl4", "Slope vs <eta>", 600, 400); // cNcl4->Clear(); // graphSlope->Draw("AP"); // cNcl4->SaveAs(Form("%s/fit_slope_vs_eta.gif", baseName.Data())); // TGraphErrors* graphOffset = new TGraphErrors(4, x, offset, x_err, offset_err); // graphOffset->SetMarkerStyle(29); // graphOffset->SetTitle("offset vs <#eta>; <#eta>; offset"); // TCanvas* cNcl5 = new TCanvas("cNcl5", "Offset vs <eta>", 600, 400); // cNcl5->Clear(); // graphOffset->Draw("AP"); // cNcl5->SaveAs(Form("%s/fit_offset_vs_eta.gif", baseName.Data())); // } //____________________________________________________________________________ void CompareYields(const Char_t* dataFileName1, const Char_t* dataFileName2, Double_t ptStart, Double_t ptStop, const Char_t* endName1=0, const Char_t* endName2=0, Int_t run = 0, Int_t filter = 1, Bool_t usePhiCut = kTRUE) { gStyle->SetOptStat(0); TFile* dataFile1 = FindFileFresh(dataFileName1); if(!dataFile1) return; AliHighPtDeDxCalib* data1 = (AliHighPtDeDxCalib*)GetObject(dataFile1, filter, usePhiCut, run, "filter", endName1); data1->Print(); // gSystem->Exec("mv debug/* olddebug/"); TH2D* hDeltaPiVsPt1 = data1->GetHistDeDxVsP(0); AliHighPtDeDxCalib* data2 = data1; if(dataFileName2) { TFile* dataFile2 = FindFileFresh(dataFileName2); if(!dataFile2) return; data2 = (AliHighPtDeDxCalib*)GetObject(dataFile2, filter, usePhiCut, run, "filter", endName2); data2->Print(); } else if (endName2) { data2 = (AliHighPtDeDxCalib*)GetObject(dataFile1, filter, usePhiCut, run, "filter", endName2); } TH2D* hDeltaPiVsPt2 = data2->GetHistDeDxVsP(0); // Root is a bit stupid with finidng bins so we have to add and subtract a // little to be sure we get the right bin as we typically put edges as // limits const Int_t binStart = hDeltaPiVsPt1->GetXaxis()->FindBin(ptStart+0.01); ptStart = hDeltaPiVsPt1->GetXaxis()->GetBinLowEdge(binStart); const Int_t binStop = hDeltaPiVsPt1->GetXaxis()->FindBin(ptStop-0.01); ptStop = hDeltaPiVsPt1->GetXaxis()->GetBinUpEdge(binStop); // const Int_t nBins = binStop - binStart + 1; cout << "Doing fits from pTlow = " << ptStart << " (bin: " << binStart << ") to pThigh = " << ptStop << " (bin: " << binStop << ")" << endl; //cross check TCanvas* cFits = new TCanvas("cFits", "Fit comparison to data", 1200, 800); cFits->Clear(); cFits->Divide(7, 4); TLegend* legend = new TLegend(0.11, 0.6, 0.35, 0.85); legend->SetBorderSize(0); legend->SetFillColor(0); TCanvas* cSingleFit = new TCanvas("cSingleFit", "single fit"); for(Int_t bin = binStart; bin <= binStop; bin++){ cout << "Making projection for bin: " << bin << endl; const Int_t j = bin-binStart; TH1D* hDeltaPiVsPtProj1 =(TH1D*)hDeltaPiVsPt1->ProjectionY(Form("hDeltaPiVsPtProj1%d", bin), bin, bin); // hDeltaPiVsPtProj1->GetXaxis()->SetRangeUser(-20, 20); hDeltaPiVsPtProj1->SetTitle(Form("%.1f<p<%.1f GeV/c", hDeltaPiVsPt1->GetXaxis()->GetBinLowEdge(bin), hDeltaPiVsPt1->GetXaxis()->GetBinUpEdge(bin))); TH1D* hDeltaPiVsPtProj2 =(TH1D*)hDeltaPiVsPt2->ProjectionY(Form("hDeltaPiVsPtProj2%d", bin), bin, bin); hDeltaPiVsPtProj1->SetLineColor(4); hDeltaPiVsPtProj2->SetLineColor(2); hDeltaPiVsPtProj1->SetNormFactor(); hDeltaPiVsPtProj2->SetNormFactor(); cFits->cd(); cFits->cd(j + 1); hDeltaPiVsPtProj1->DrawCopy(); hDeltaPiVsPtProj2->DrawCopy("SAME"); cSingleFit->cd(); cSingleFit->Clear(); hDeltaPiVsPtProj1->DrawCopy(); hDeltaPiVsPtProj2->DrawCopy("SAME"); CreateDir("results/debug"); cSingleFit->SaveAs(Form("results/debug/ptspectrum_bin%d.gif", bin)); } }