|
@@ -0,0 +1,238 @@
|
|
|
+#include <iostream>
|
|
|
+#include <fstream>
|
|
|
+#include <sstream>
|
|
|
+#include <string>
|
|
|
+#include <TROOT.h>
|
|
|
+#include <TMath.h>
|
|
|
+#include <TF1.h>
|
|
|
+#include <TH1F.h>
|
|
|
+#include <TGraphErrors.h>
|
|
|
+#include <TFile.h>
|
|
|
+#include <TString.h>
|
|
|
+#include <TStopwatch.h>
|
|
|
+#include <Math/PdfFuncMathCore.h>
|
|
|
+#include <Math/IntegratorOptions.h>
|
|
|
+
|
|
|
+Double_t ftKcb(Double_t *x, Double_t *par)
|
|
|
+{
|
|
|
+ // Parameters
|
|
|
+ Double_t theta = par[0];
|
|
|
+ Double_t k_max = par[1];
|
|
|
+ Double_t a1 = par[2];
|
|
|
+ Double_t a2 = par[3];
|
|
|
+ Double_t a3 = par[4];
|
|
|
+ Double_t a4 = par[5];
|
|
|
+ // Vartiables
|
|
|
+ Double_t xx = x[0];
|
|
|
+ // Function
|
|
|
+ Double_t func = k_max/theta * TMath::Exp(a1 * xx + a2 * xx * xx + a3 * xx * xx * xx + a4 * xx * xx * xx * xx);
|
|
|
+
|
|
|
+ return func;
|
|
|
+}
|
|
|
+
|
|
|
+Double_t ftPnIntegrand(Double_t *x, Double_t *par)
|
|
|
+{
|
|
|
+ // Parameters
|
|
|
+ Double_t n = par[0];
|
|
|
+ Double_t theta = par[1];
|
|
|
+ Double_t k_max = par[2];
|
|
|
+ Double_t a1 = par[3];
|
|
|
+ Double_t a2 = par[4];
|
|
|
+ Double_t a3 = par[5];
|
|
|
+ Double_t a4 = par[6];
|
|
|
+ // Vartiables
|
|
|
+ Double_t xx = x[0];
|
|
|
+ // Function
|
|
|
+ Double_t k = ftKcb(&x[0], &par[1]);
|
|
|
+ Double_t func = ROOT::Math::gamma_pdf(n,k,theta);
|
|
|
+
|
|
|
+ return func;
|
|
|
+}
|
|
|
+
|
|
|
+Double_t ftPn(Double_t *x, Double_t *par)
|
|
|
+{
|
|
|
+ // Parameters
|
|
|
+ Double_t theta = par[0];
|
|
|
+ Double_t k_max = par[1];
|
|
|
+ Double_t a1 = par[2];
|
|
|
+ Double_t a2 = par[3];
|
|
|
+ Double_t a3 = par[4];
|
|
|
+ Double_t a4 = par[5];
|
|
|
+ // Variables
|
|
|
+ Double_t n = x[0];
|
|
|
+ // Function
|
|
|
+ TF1 *f = new TF1("f",ftPnIntegrand,0,1,7);
|
|
|
+ f->SetParameters(n,theta,k_max,a1,a2,a3,a4);
|
|
|
+ Double_t func = f->Integral(0,1);
|
|
|
+
|
|
|
+ return func;
|
|
|
+}
|
|
|
+
|
|
|
+Double_t ftCent(Double_t *x, Double_t *par)
|
|
|
+{
|
|
|
+ // Parameters
|
|
|
+ Double_t theta = par[0];
|
|
|
+ Double_t k_max = par[1];
|
|
|
+ Double_t a1 = par[2];
|
|
|
+ Double_t a2 = par[3];
|
|
|
+ Double_t a3 = par[4];
|
|
|
+ Double_t a4 = par[5];
|
|
|
+ // Variables
|
|
|
+ Double_t n = x[0];
|
|
|
+ // Function
|
|
|
+ TF1 *f = new TF1("f",ftPn,0,500);
|
|
|
+ f->SetParameters(theta,k_max,a1,a2,a3,a4);
|
|
|
+ Double_t func = f->Integral(n,TMath::Infinity());
|
|
|
+
|
|
|
+ return func;
|
|
|
+}
|
|
|
+
|
|
|
+int main(int argc, char **argv)
|
|
|
+{
|
|
|
+ if (argc != 5)
|
|
|
+ {
|
|
|
+ std::cerr << "Error: wrong number of arguments:" << std::endl;
|
|
|
+ std::cerr << "./FitCentGamma -dat/-root inputfile -o output" << std::endl;
|
|
|
+ return 10;
|
|
|
+ }
|
|
|
+
|
|
|
+ TStopwatch timer;
|
|
|
+ timer.Start();
|
|
|
+
|
|
|
+ ROOT::Math::IntegratorOneDimOptions::SetDefaultRelTolerance(1.E-3);
|
|
|
+
|
|
|
+ // Number of iterations during fitting procedure
|
|
|
+ int NumOfIterations = 5;
|
|
|
+
|
|
|
+ // Parsing arguments
|
|
|
+ TString inputfile, outputfile;
|
|
|
+ Bool_t isRoot = false;
|
|
|
+ for (int i = 1; i < argc; i++)
|
|
|
+ {
|
|
|
+ if (std::string(argv[i]) != "-dat" &&
|
|
|
+ std::string(argv[i]) != "-root" &&
|
|
|
+ std::string(argv[i]) != "-o")
|
|
|
+ {
|
|
|
+ std::cerr << "Error: Unknown option: " << argv[i] << std::endl;
|
|
|
+ return 11;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if ((std::string(argv[i]) == "-dat" || std::string(argv[i]) == "-dat") && i == argc - 1)
|
|
|
+ {
|
|
|
+ std::cerr << "Error: input file was not specified!" << std::endl;
|
|
|
+ return 12;
|
|
|
+ }
|
|
|
+ if (std::string(argv[i]) == "-root" && i != argc - 1)
|
|
|
+ {
|
|
|
+ inputfile = argv[++i];
|
|
|
+ isRoot = true;
|
|
|
+ }
|
|
|
+ if (std::string(argv[i]) == "-dat" && i != argc - 1)
|
|
|
+ {
|
|
|
+ inputfile = argv[++i];
|
|
|
+ isRoot = false;
|
|
|
+ }
|
|
|
+ if (std::string(argv[i]) == "-o" && i == argc - 1)
|
|
|
+ {
|
|
|
+ std::cerr << "Error: output file was not specified!" << std::endl;
|
|
|
+ return 13;
|
|
|
+ }
|
|
|
+ if (std::string(argv[i]) == "-o" && i != argc - 1)
|
|
|
+ {
|
|
|
+ outputfile = argv[++i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ std::cout << "Input file: " << inputfile << std::endl;
|
|
|
+ std::cout << "Output file: " << outputfile << std::endl;
|
|
|
+ std::vector<Double_t> vMult, vProb, vError, vErrorX;
|
|
|
+ Double_t mult, prob, error;
|
|
|
+ int counter = 0;
|
|
|
+ if (!isRoot)
|
|
|
+ {
|
|
|
+ std::ifstream infile(inputfile.Data());
|
|
|
+ if (!infile.is_open())
|
|
|
+ {
|
|
|
+ std::cerr << "Error: can not open the file!" << std::endl;
|
|
|
+ return 20;
|
|
|
+ }
|
|
|
+ std::string str;
|
|
|
+ const Double_t bin_width = 0.44;
|
|
|
+ while (std::getline(infile, str))
|
|
|
+ {
|
|
|
+ std::istringstream iss(str);
|
|
|
+ if (!(iss >> mult >> prob))
|
|
|
+ {
|
|
|
+ std::cerr << "Error: can not read line " << counter << ": " << str << std::endl;
|
|
|
+ return 30;
|
|
|
+ }
|
|
|
+
|
|
|
+ error = prob / (1e7 * 0.44);
|
|
|
+
|
|
|
+ vMult.push_back(mult);
|
|
|
+ vProb.push_back(prob);
|
|
|
+ vError.push_back(error);
|
|
|
+ vErrorX.push_back(0.);
|
|
|
+
|
|
|
+ counter++;
|
|
|
+ }
|
|
|
+ std::cout << counter << " lines were processed." << std::endl;
|
|
|
+ }
|
|
|
+ if (isRoot)
|
|
|
+ {
|
|
|
+ TFile *fi = new TFile(inputfile.Data(), "read");
|
|
|
+ TH1F *hist = (TH1F *)fi->Get("hRefMultSTAR");
|
|
|
+ if (!hist)
|
|
|
+ {
|
|
|
+ std::cerr << "Could not read histogram from root-file!" << std::endl;
|
|
|
+ return 31;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < hist->GetNbinsX(); i++)
|
|
|
+ {
|
|
|
+ if (hist->GetBinContent(i + 1) == 0)
|
|
|
+ continue;
|
|
|
+ vMult.push_back(hist->GetBinCenter(i + 1));
|
|
|
+ vProb.push_back(hist->GetBinContent(i + 1) / hist->Integral());
|
|
|
+ vError.push_back(hist->GetBinError(i + 1) / hist->Integral());
|
|
|
+ vErrorX.push_back(0.);
|
|
|
+ counter++;
|
|
|
+ }
|
|
|
+ std::cout << counter << " bins were processed." << std::endl;
|
|
|
+ delete hist;
|
|
|
+ fi->Close();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Getting input data into TGraphErrors
|
|
|
+ TGraphErrors *grMult = new TGraphErrors(vMult.size(), &vMult[0], &vProb[0], &vErrorX[0], &vError[0]);
|
|
|
+ // TGraph *grMult = new TGraph(vMult.size(), &vMult[0], &vProb[0]);
|
|
|
+ grMult->SetName("grMult");
|
|
|
+ grMult->GetYaxis()->SetTitle("1/N dN/dN_{ch}");
|
|
|
+ grMult->GetXaxis()->SetTitle("N_{ch}");
|
|
|
+
|
|
|
+ // Fitting procedure
|
|
|
+ TF1 *fitFunc = new TF1("fitFunc", ftPn, vMult.at(0), vMult.at(vMult.size() - 1), 6);
|
|
|
+ fitFunc->SetParameters(0.3,183.,-4.,3.,-7.,2.);
|
|
|
+
|
|
|
+ for (int iter = 0; iter < NumOfIterations; iter++)
|
|
|
+ {
|
|
|
+ grMult->Fit(fitFunc,"RM");
|
|
|
+ }
|
|
|
+
|
|
|
+ std::cout << std::endl;
|
|
|
+ std::cout << "Writing output." << std::endl;
|
|
|
+
|
|
|
+ TFile *fo = new TFile(outputfile.Data(), "recreate");
|
|
|
+ fo->cd();
|
|
|
+
|
|
|
+ grMult->Write();
|
|
|
+ fitFunc->Write();
|
|
|
+
|
|
|
+ fo->Close();
|
|
|
+
|
|
|
+ timer.Stop();
|
|
|
+ timer.Print();
|
|
|
+ return 0;
|
|
|
+}
|