#if !defined(__CINT__) || defined(__MAKECINT__) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; // ############################################################################# Int_t giNEvents; Int_t giGenCor; TString gtMacroDir; TString gtUnpackDir; TString gtCluDir; TString gtInputFilePath; Int_t giNDigiFiles; TString gtMCLinkFileName; Int_t giNLinkFiles; TString gtTofGeoVersion; TString gtSetupName; Bool_t gbIdealCalibration; Bool_t gbHeavyIonCollisions; Bool_t gbIdealClustering; Bool_t gbSeparateHitFile; Bool_t gbAnalysisMCQA; Int_t giDut; Int_t giMRef; Int_t giBRef; Int_t giSel2; Double_t gdScaleFactor; Bool_t gbSimData; Int_t giCalibrationMode; Bool_t gbFinalRun; Double_t gdTimeInSpill; Int_t giNTISBins; Double_t gdExtChi2Lim; Double_t gdExtChi2Lim2; Int_t giExtSigMode; Int_t giTISBin; Double_t gdUpperFitLimit; // ############################################################################# const Bool_t gbRunSimplex = kFALSE; // FIXME const Bool_t gbUseStartingValues = kTRUE; const Bool_t gbDebugMode = kFALSE; Double_t gdStartingResidualXSigma = 1.0; // [cm] Double_t gdStartingResidualYSigma = 1.0; // [cm] Double_t gdStartingResidualTSigma = 0.1; // [ns] const Double_t gdDebugResidualXSigma = 0.3; // [cm] const Double_t gdDebugResidualYSigma = 0.7; // [cm] const Double_t gdDebugResidualTSigma = 0.08; // [ns] const Double_t gdDebugResidualSigmaScale = 2.; // ############################################################################# TH1* gtOriginalXResidual(NULL); TH1* gtOriginalYResidual(NULL); TH1* gtOriginalTResidual(NULL); TH1* gtOriginalChiSquare(NULL); TF1* gtOriginalChiSquareFit(NULL); TH1* gtFinalXResidual(NULL); TH1* gtFinalYResidual(NULL); TH1* gtFinalTResidual(NULL); TH1* gtFinalChiSquare(NULL); TF1* gtFinalChiSquareFit(NULL); Bool_t gbFirstCall(kTRUE); Bool_t gbLastCall(kFALSE); Bool_t gIsInterrupted(kFALSE); void handler_ctrlc(int) { gIsInterrupted = kTRUE; } Double_t chisqpdf(Double_t* x, Double_t* p); Double_t chisqcdf(Double_t* x, Double_t* p); Double_t chisq(const gsl_vector* v, void* params) { cout<<"Calling chisq function..."<= dResidualXSigma || 0. >= dResidualYSigma || 0. >= dResidualTSigma ) { return 100000000.; } if(!gbDebugMode) { gSystem->Exec(Form("root -b -q '%s/ana_hits.C(%d, %d, \"%s\", \"%s\", \"%s\", %d, \"%s\", %d, \"%s\", \"%s\", %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %f, %d, %d, %d, %f, %d, %f, %f, %d, %f, %f, %f, %d)'", gtMacroDir.Data(), giNEvents, giGenCor, gtUnpackDir.Data(), gtCluDir.Data(), gtInputFilePath.Data(), giNDigiFiles, gtMCLinkFileName.Data(), giNLinkFiles, gtTofGeoVersion.Data(), gtSetupName.Data(), gbIdealCalibration, gbHeavyIonCollisions, gbIdealClustering, gbSeparateHitFile, gbAnalysisMCQA, giDut, giMRef, giBRef, giSel2, gdScaleFactor, gbSimData, giCalibrationMode, gbFinalRun, gdTimeInSpill, giNTISBins, gdExtChi2Lim, gdExtChi2Lim2, giExtSigMode, dResidualXSigma, dResidualYSigma, dResidualTSigma, giTISBin)); TFile::Open("./ana_cluster.hst.root", "READ"); if(!gFile) { cout<<"Could not open histogram file. Abort macro execution."<(gFile->FindObjectAny("hAllChi2Sel24")); tXResidual = dynamic_cast(gFile->FindObjectAny("hAllDXSel24")); tYResidual = dynamic_cast(gFile->FindObjectAny("hAllDYSel24")); tTResidual = dynamic_cast(gFile->FindObjectAny("hAllDTSel24")); } else { if(giTISBin) { TH2* tChiSquareTIS = dynamic_cast(gFile->FindObjectAny("hAllSelHitTupleMatchChiSqTIS")); TH2* tXResidualTIS = dynamic_cast(gFile->FindObjectAny("hAllSelHitTupleMatchResidualXTIS")); TH2* tYResidualTIS = dynamic_cast(gFile->FindObjectAny("hAllSelHitTupleMatchResidualYTIS")); TH2* tTResidualTIS = dynamic_cast(gFile->FindObjectAny("hAllSelHitTupleMatchResidualTTIS")); tChiSquare = tChiSquareTIS->ProjectionY("_py", giTISBin, giTISBin); tXResidual = tXResidualTIS->ProjectionY("_py", giTISBin, giTISBin); tYResidual = tYResidualTIS->ProjectionY("_py", giTISBin, giTISBin); tTResidual = tTResidualTIS->ProjectionY("_py", giTISBin, giTISBin); } else { tChiSquare = dynamic_cast(gFile->FindObjectAny("hAllChi204")); tXResidual = dynamic_cast(gFile->FindObjectAny("hAllDX04")); tYResidual = dynamic_cast(gFile->FindObjectAny("hAllDY04")); tTResidual = dynamic_cast(gFile->FindObjectAny("hAllDT04")); } } } else { tXResidual = new TH1F("hResidualX", "", 401, -2., 2.); tYResidual = new TH1F("hResidualY", "", 601, -3., 3.); tTResidual = new TH1F("hResidualT", "", 101, -0.5, 0.5); tChiSquare = new TH1F("hChiSquare", "", 1000, 0., 100.); if(gRandom) { delete gRandom; } gRandom = new TRandom3(4357); for(Int_t iEvent = 0; iEvent < 1000000; iEvent++) { Double_t dResidualX = gRandom->Gaus(0., gdDebugResidualXSigma); Double_t dResidualY = gRandom->Gaus(0., gdDebugResidualYSigma); Double_t dResidualT = gRandom->Gaus(0., gdDebugResidualTSigma); Double_t dChiSquare = TMath::Power(dResidualX/dResidualXSigma, 2.) + TMath::Power(dResidualY/dResidualYSigma, 2.) + TMath::Power(dResidualT/dResidualTSigma, 2.); tXResidual->Fill(dResidualX); tYResidual->Fill(dResidualY); tTResidual->Fill(dResidualT); tChiSquare->Fill(dChiSquare); } } if(!gbDebugMode) { if(!tXResidual || !tYResidual || !tTResidual || !tChiSquare) { cout<<"Chi2 residual histograms not found in file. Abort macro execution."<FixParameter(0, 3.); tChiSquareFit->FixParameter(1, 1.); tChiSquareFit->SetParameter(2, tChiSquare->Integral("width")); tChiSquare->Smooth(); TFitResultPtr tFitResult = tChiSquare->Fit(tChiSquareFit, "SQN", "", 0., gdUpperFitLimit); if(static_cast(tFitResult)) { cout<<"Fit to chi2 histogram failed."<GetChisquare(); Int_t iFitNDegreesOfFreedom = tChiSquareFit->GetNDF(); Double_t dUpperFitLimitIntegralShare = tChiSquare->Integral(1, tChiSquare->FindBin(gdUpperFitLimit) - 1)/tChiSquare->GetEntries(); if(gbFirstCall) { gtOriginalXResidual = dynamic_cast(tXResidual->Clone("tOriginalXResidual")); gtOriginalYResidual = dynamic_cast(tYResidual->Clone("tOriginalYResidual")); gtOriginalTResidual = dynamic_cast(tTResidual->Clone("tOriginalTResidual")); gtOriginalChiSquare = dynamic_cast(tChiSquare->Clone("gtOriginalChiSquare")); gtOriginalXResidual->SetDirectory(gROOT); gtOriginalYResidual->SetDirectory(gROOT); gtOriginalTResidual->SetDirectory(gROOT); gtOriginalChiSquare->SetDirectory(gROOT); gtOriginalChiSquareFit = dynamic_cast(tChiSquareFit->Clone("gtOriginalChiSquareFit")); gbFirstCall = kFALSE; } if(gbLastCall) { gtFinalXResidual = dynamic_cast(tXResidual->Clone("tFinalXResidual")); gtFinalYResidual = dynamic_cast(tYResidual->Clone("tFinalYResidual")); gtFinalTResidual = dynamic_cast(tTResidual->Clone("tFinalTResidual")); gtFinalChiSquare = dynamic_cast(tChiSquare->Clone("gtFinalChiSquare")); gtFinalXResidual->SetDirectory(gROOT); gtFinalYResidual->SetDirectory(gROOT); gtFinalTResidual->SetDirectory(gROOT); gtFinalChiSquare->SetDirectory(gROOT); gtFinalChiSquareFit = dynamic_cast(tChiSquareFit->Clone("gtFinalChiSquareFit")); gbLastCall = kFALSE; Double_t dOriginalFitChiSquare = gtOriginalChiSquareFit->GetChisquare(); Double_t dOriginalUpperFitLimitIntegralShare = gtOriginalChiSquare->Integral(1, gtOriginalChiSquare->FindBin(gdUpperFitLimit) - 1)/gtOriginalChiSquare->GetEntries(); cout<Close(); delete gFile; } else { delete tXResidual; delete tYResidual; delete tTResidual; delete tChiSquare; } delete tChiSquareFit; if(!gbDebugMode) { return TMath::Abs(1. - dFitChiSquare/iFitNDegreesOfFreedom); } else { return TMath::Power(1.*(1. - dFitChiSquare/iFitNDegreesOfFreedom), 2.) +TMath::Power(100.*(ROOT::Math::chisquared_cdf(gdUpperFitLimit, 3) - dUpperFitLimitIntegralShare), 2.); } } Bool_t get_sigma_scale() { cout<<"Calling get_sigma_scale function..."<Exec(Form("root -b -q '%s/ana_hits.C(%d, %d, \"%s\", \"%s\", \"%s\", %d, \"%s\", %d, \"%s\", \"%s\", %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %f, %d, %d, %d, %f, %d, %f, %f, %d, %f, %f, %f, %d)'", gtMacroDir.Data(), giNEvents, giGenCor, gtUnpackDir.Data(), gtCluDir.Data(), gtInputFilePath.Data(), giNDigiFiles, gtMCLinkFileName.Data(), giNLinkFiles, gtTofGeoVersion.Data(), gtSetupName.Data(), gbIdealCalibration, gbHeavyIonCollisions, gbIdealClustering, gbSeparateHitFile, gbAnalysisMCQA, giDut, giMRef, giBRef, giSel2, gdScaleFactor, gbSimData, giCalibrationMode, gbFinalRun, gdTimeInSpill, giNTISBins, gdExtChi2Lim, gdExtChi2Lim2, 0, 0., 0., 0., giTISBin)); TFile::Open("./ana_cluster.hst.root", "READ"); if(!gFile) { cout<<"Could not open histogram file. Abort macro execution."<(gFile->FindObjectAny("hAllChi2Sel24")); } else { if(giTISBin) { TH2* tChiSquareTIS = dynamic_cast(gFile->FindObjectAny("hAllSelHitTupleMatchChiSqTIS")); if(tChiSquareTIS) { tChiSquare = tChiSquareTIS->ProjectionY("_py", giTISBin, giTISBin); } } else { tChiSquare = dynamic_cast(gFile->FindObjectAny("hAllChi204")); } } if(!tChiSquare) { cout<<"Chi2 histogram not found in input calibration file. Abort macro execution."<FixParameter(0, 3.); tChiSquareFit->SetParameter(1, 1.5); tChiSquareFit->SetParameter(2, tChiSquare->Integral("width")); tChiSquare->Smooth(); TFitResultPtr tFitResult = tChiSquare->Fit(tChiSquareFit, "SQN", "", 0., gdUpperFitLimit); if(static_cast(tFitResult)) { cout<<"Fit to chi2 histogram failed. Abort macro execution."<GetParameter(1); // TODO: modified to make use also of negative (?) sigma scales Double_t dChi2SigmaScale = TMath::Abs(tChiSquareFit->GetParameter(1)); Double_t dFitChiSquare = tChiSquareFit->GetChisquare(); Int_t iFitNDegreesOfFreedom = tChiSquareFit->GetNDF(); gFile->Close(); delete gFile; delete tChiSquareFit; Double_t dResidualXSigma; Double_t dResidualYSigma; Double_t dResidualTSigma; TFile::Open("./calib_ana.cor_out.root", "READ"); if(!gFile) { cout<<"Could not open output calibration file. Abort macro execution."<(gFile->FindObjectAny("hSelHitTupleResidualXYT_Width")); dResidualXSigma = tHisto->GetBinContent(1); dResidualYSigma = tHisto->GetBinContent(2); dResidualTSigma = tHisto->GetBinContent(3); } else { if(giTISBin) { tHisto = dynamic_cast(gFile->FindObjectAny("hSelTypeNNResidualX_WidthTIS")); dResidualXSigma = tHisto->GetBinContent(1, giTISBin); tHisto = dynamic_cast(gFile->FindObjectAny("hSelTypeNNResidualY_WidthTIS")); dResidualYSigma = tHisto->GetBinContent(1, giTISBin); tHisto = dynamic_cast(gFile->FindObjectAny("hSelTypeNNResidualT_WidthTIS")); dResidualTSigma = tHisto->GetBinContent(1, giTISBin); } else { tHisto = dynamic_cast(gFile->FindObjectAny("hSelTypeNNResidualX_Width")); dResidualXSigma = tHisto->GetBinContent(1); tHisto = dynamic_cast(gFile->FindObjectAny("hSelTypeNNResidualY_Width")); dResidualYSigma = tHisto->GetBinContent(1); tHisto = dynamic_cast(gFile->FindObjectAny("hSelTypeNNResidualT_Width")); dResidualTSigma = tHisto->GetBinContent(1); } } gFile->Close(); delete gFile; gdStartingResidualXSigma = dResidualXSigma/dChi2SigmaScale; gdStartingResidualYSigma = dResidualYSigma/dChi2SigmaScale; gdStartingResidualTSigma = dResidualTSigma/dChi2SigmaScale; cout<IgnoreInterrupt(kTRUE); gIsInterrupted = kFALSE; gErrorIgnoreLevel = kWarning; gStyle->SetOptStat("emr"); // run parameter initialization giNEvents = iNEvents; giGenCor = iGenCor; gtMacroDir = tMacroDir; gtUnpackDir = tUnpackDir; gtCluDir = tCluDir; gtInputFilePath = tInputFilePath; giNDigiFiles = iNDigiFiles; gtMCLinkFileName = tMCLinkFileName; giNLinkFiles = iNLinkFiles; gtTofGeoVersion = tTofGeoVersion; gtSetupName = tSetupName; gbIdealCalibration = bIdealCalibration; gbHeavyIonCollisions = bHeavyIonCollisions; gbIdealClustering = bIdealClustering; gbSeparateHitFile = bSeparateHitFile; gbAnalysisMCQA = bAnalysisMCQA; giDut = iDut; giMRef = iMRef; giBRef = iBRef; giSel2 = iSel2; gdScaleFactor = dScaleFactor; gbSimData = bSimData; giCalibrationMode = iCalibrationMode; gbFinalRun = bFinalRun; gdTimeInSpill = dTimeInSpill; giNTISBins = iNTISBins; gdExtChi2Lim = dExtChi2Lim; gdExtChi2Lim2 = dExtChi2Lim2; giExtSigMode = iExtSigMode; giTISBin = iTISBin; if(2 == giExtSigMode) { gdUpperFitLimit = gdExtChi2Lim2; gdExtChi2Lim2 = 1000000.; } else if(1 == giExtSigMode) { gdUpperFitLimit = gdExtChi2Lim; gdExtChi2Lim = 1000000.; } else { cout< 15 requested. Abort macro execution."<Exec("mkdir -p -v ./plots/InitialSigmaPlots"); gSystem->Exec("mv -v ./*.pdf ./plots/InitialSigmaPlots/"); } gsl_vector_set(tVariableValues, 0, gdStartingResidualXSigma); gsl_vector_set(tVariableValues, 1, gdStartingResidualYSigma); gsl_vector_set(tVariableValues, 2, gdStartingResidualTSigma); } Int_t iIteration = 0; Int_t iMinimizationStatus; Double_t iSimplexSize; Double_t dDummyParameters[1] = {1.0}; gsl_multimin_function chisq_func; chisq_func.n = iNbVariables; chisq_func.f = chisq; chisq_func.params = dDummyParameters; TStopwatch timer; timer.Start(); const gsl_multimin_fminimizer_type* tMinimizerType = gsl_multimin_fminimizer_nmsimplex2; gsl_multimin_fminimizer* tMinimizer = gsl_multimin_fminimizer_alloc(tMinimizerType, iNbVariables); if(gbRunSimplex) { gsl_multimin_fminimizer_set(tMinimizer, &chisq_func, tVariableValues, tVariableSteps); do // beginning of minimization iteration loop { signal(SIGINT, handler_ctrlc); if(gIsInterrupted) { cout<fval, iSimplexSize)< iIteration); cout<<" --------------------------------------------------------------------------------"<x, dDummyParameters); } else { cout<<" --------------------------------------------------------------------------------"<Divide(4, 2); TH1* tHisto(NULL); TF1* tFunc(NULL); tCanvas->cd(1); tHisto = gtOriginalXResidual; if(tHisto) { tHisto->SetTitle("original;#Deltax [cm];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(-5., 5.); gPad->Modified(); gPad->Update(); } tCanvas->cd(2); tHisto = gtOriginalYResidual; if(tHisto) { tHisto->SetTitle("original;#Deltay [cm];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(-5., 5.); gPad->Modified(); gPad->Update(); } tCanvas->cd(3); tHisto = gtOriginalTResidual; if(tHisto) { tHisto->SetTitle("original;#Deltat [ns];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(-1., 1.); gPad->Modified(); gPad->Update(); } tCanvas->cd(4); tHisto = gtOriginalChiSquare; if(tHisto) { tHisto->SetTitle("original;#chi^{2} [];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(0., 15.); gPad->Modified(); gPad->Update(); tFunc = gtOriginalChiSquareFit; if(tFunc) { tFunc->SetNpx(1000000); tFunc->SetLineWidth(2); tFunc->SetRange(0., 15.); tFunc->Draw("SAME"); } } tCanvas->cd(5); tHisto = gtFinalXResidual; if(tHisto) { tHisto->SetTitle("final;#Deltax [cm];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(-5., 5.); gPad->Modified(); gPad->Update(); } tCanvas->cd(6); tHisto = gtFinalYResidual; if(tHisto) { tHisto->SetTitle("final;#Deltay [cm];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(-5., 5.); gPad->Modified(); gPad->Update(); } tCanvas->cd(7); tHisto = gtFinalTResidual; if(tHisto) { tHisto->SetTitle("final;#Deltat [ns];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(-1., 1.); gPad->Modified(); gPad->Update(); } tCanvas->cd(8); tHisto = gtFinalChiSquare; if(tHisto) { tHisto->SetTitle("final;#chi^{2} [];;"); tHisto->Draw(); // gPad->SetLogy(); tHisto->GetXaxis()->SetRangeUser(0., 15.); gPad->Modified(); gPad->Update(); tFunc = gtFinalChiSquareFit; if(tFunc) { tFunc->SetNpx(1000000); tFunc->SetLineWidth(2); tFunc->SetRange(0., 15.); tFunc->Draw("SAME"); } } tCanvas->SaveAs("optimal_chi2_sigmas.pdf"); gSystem->Exec("mkdir -p -v ./plots/FinalSigmaPlots"); gSystem->Exec("mv -v ./*.pdf ./plots/FinalSigmaPlots/"); gsl_vector_free(tVariableValues); gsl_vector_free(tVariableSteps); gsl_multimin_fminimizer_free(tMinimizer); gSystem->IgnoreInterrupt(kFALSE); #endif } Double_t chisqpdf(Double_t* x, Double_t* p) { // p[0] : ndof // p[1] : sigma scale // p[2] : normalization return p[2]*TMath::Power(p[1], 2.)*ROOT::Math::chisquared_pdf(TMath::Power(p[1], 2.)*x[0], p[0]); } Double_t chisqcdf(Double_t* x, Double_t* p) { // p[0] : ndof return ROOT::Math::chisquared_cdf(x[0], p[0]); }