/ElectroWeakAnalysis/ZMuMu/bin/zMuMuExpFit.cpp

https://github.com/aivanov-cern/cmssw · C++ · 259 lines · 231 code · 19 blank · 9 comment · 9 complexity · ff15d4357d9f186dab6df360cdb59db8 MD5 · raw file

  1. #include "PhysicsTools/Utilities/interface/Parameter.h"
  2. #include "PhysicsTools/Utilities/interface/ZLineShape.h"
  3. #include "PhysicsTools/Utilities/interface/Gaussian.h"
  4. #include "PhysicsTools/Utilities/interface/Exponential.h"
  5. #include "PhysicsTools/Utilities/interface/Polynomial.h"
  6. #include "PhysicsTools/Utilities/interface/Convolution.h"
  7. #include "PhysicsTools/Utilities/interface/Operations.h"
  8. #include "PhysicsTools/Utilities/interface/MultiHistoChiSquare.h"
  9. #include "PhysicsTools/Utilities/interface/RootMinuit.h"
  10. #include "PhysicsTools/Utilities/interface/RootMinuitCommands.h"
  11. #include "PhysicsTools/Utilities/interface/rootPlot.h"
  12. #include "TROOT.h"
  13. #include "TH1.h"
  14. #include "TFile.h"
  15. #include <boost/program_options.hpp>
  16. using namespace boost;
  17. namespace po = boost::program_options;
  18. #include <iostream>
  19. #include <algorithm>
  20. #include <exception>
  21. #include <iterator>
  22. #include <string>
  23. #include <vector>
  24. using namespace std;
  25. // A helper function to simplify the main part.
  26. template<class T>
  27. ostream& operator<<(ostream& os, const vector<T>& v) {
  28. copy(v.begin(), v.end(), ostream_iterator<T>(cout, " "));
  29. return os;
  30. }
  31. //A function that sets istogram contents to 0
  32. //if they are too small
  33. void fix(TH1* histo) {
  34. for(int i = 1; i <= histo->GetNbinsX(); ++i) {
  35. if(histo->GetBinContent(i) < 0.1) {
  36. histo->SetBinContent(i, 0.0);
  37. histo->SetBinError(i, 0.0);
  38. }
  39. }
  40. }
  41. typedef funct::GaussIntegrator IntegratorConv;
  42. int main(int ac, char *av[]) {
  43. gROOT->SetStyle("Plain");
  44. try {
  45. typedef funct::Product<funct::Exponential,
  46. funct::Convolution<funct::ZLineShape, funct::Gaussian, IntegratorConv>::type >::type ZPeak;
  47. typedef funct::Product<funct::Parameter, ZPeak>::type ZMuMuSig;
  48. typedef ZMuMuSig ZMuMu;
  49. typedef ZMuMuSig ZMuTkSig;
  50. typedef funct::Product<funct::Parameter,
  51. funct::Product<funct::Exponential, funct::Polynomial<2> >::type >::type ZMuTkBkg;
  52. typedef funct::Sum<ZMuTkSig, ZMuTkBkg>::type ZMuTk;
  53. typedef funct::Product<funct::Parameter, funct::Gaussian>::type ZMuSaSig;
  54. typedef funct::Parameter ZMuSaBkg;
  55. typedef funct::Sum<ZMuSaSig, ZMuSaBkg>::type ZMuSa;
  56. typedef fit::MultiHistoChiSquare<ZMuMu, ZMuTk, ZMuSa> ChiSquared;
  57. fit::RootMinuitCommands<ChiSquared> commands("ElectroWeakAnalysis/ZMuMu/test/zMuMuExpFit.txt");
  58. double fMin, fMax;
  59. string ext;
  60. po::options_description desc("Allowed options");
  61. desc.add_options()
  62. ("help", "produce help message")
  63. ("include-path,I", po::value< vector<string> >(),
  64. "include path")
  65. ("input-file", po::value< vector<string> >(), "input file")
  66. ("min,m", po::value<double>(&fMin)->default_value(60), "minimum value for fit range")
  67. ("max,M", po::value<double>(&fMax)->default_value(120), "maximum value for fit range")
  68. ("output-file,O", po::value<string>(&ext)->default_value(".ps"),
  69. "output file format")
  70. ;
  71. po::positional_options_description p;
  72. p.add("input-file", -1);
  73. po::variables_map vm;
  74. po::store(po::command_line_parser(ac, av).
  75. options(desc).positional(p).run(), vm);
  76. po::notify(vm);
  77. if (vm.count("help")) {
  78. cout << "Usage: options_description [options]\n";
  79. cout << desc;
  80. return 0;
  81. }
  82. if (vm.count("include-path")) {
  83. cout << "Include paths are: "
  84. << vm["include-path"].as< vector<string> >() << "\n";
  85. }
  86. if (vm.count("input-file")) {
  87. cout << "Input files are: "
  88. << vm["input-file"].as< vector<string> >() << "\n";
  89. vector<string> v_file = vm["input-file"].as< vector<string> >();
  90. for(vector<string>::const_iterator it = v_file.begin();
  91. it != v_file.end(); ++it) {
  92. TFile * root_file = new TFile(it->c_str(),"read");
  93. TH1D * histoZMuMu = (TH1D*) root_file->Get("zToMM");
  94. fix(histoZMuMu);
  95. TH1D * histoZMuTk = (TH1D*) root_file->Get("zToMTk");
  96. fix(histoZMuTk);
  97. TH1D * histoZMuSa = (TH1D*) root_file->Get("zToMS");
  98. fix(histoZMuSa);
  99. cout << ">>> histogram loaded\n";
  100. string f_string = *it;
  101. replace(f_string.begin(), f_string.end(), '.', '_');
  102. string plot_string = f_string + ext;
  103. cout << ">>> Input files loaded\n";
  104. const char * kYieldZMuMu = "YieldZMuMu";
  105. const char * kYieldZMuTk = "YieldZMuTk";
  106. const char * kYieldZMuSa = "YieldZMuSa";
  107. const char * kYieldBkgZMuTk = "YieldBkgZMuTk";
  108. const char * kYieldBkgZMuSa = "YieldBkgZMuSa";
  109. const char * kLambdaZMuMu = "LambdaZMuMu";
  110. const char * kMass = "Mass";
  111. const char * kGamma = "Gamma";
  112. const char * kPhotonFactorZMuMu = "PhotonFactorZMuMu";
  113. const char * kInterferenceFactorZMuMu = "InterferenceFactorZMuMu";
  114. //const char * kPhotonFactorZMuTk = "PhotonFactorZMuTk";
  115. //const char * kInterferenceFactorZMuTk = "InterferenceFactorZMuTk";
  116. const char * kMeanZMuMu = "MeanZMuMu";
  117. const char * kSigmaZMuMu = "SigmaZMuMu";
  118. const char * kLambda = "Lambda";
  119. const char * kA0 = "A0";
  120. const char * kA1 = "A1";
  121. const char * kA2 = "A2";
  122. const char * kSigmaZMuSa = "SigmaZMuSa";
  123. IntegratorConv integratorConv(1.e-5);
  124. funct::Parameter lambdaZMuMu(kLambdaZMuMu, commands.par(kLambdaZMuMu));
  125. funct::Parameter mass(kMass, commands.par(kMass));
  126. funct::Parameter gamma(kGamma, commands.par(kGamma));
  127. funct::Parameter photonFactorZMuMu(kPhotonFactorZMuMu, commands.par(kPhotonFactorZMuMu));
  128. funct::Parameter interferenceFactorZMuMu(kInterferenceFactorZMuMu, commands.par(kInterferenceFactorZMuMu));
  129. //funct::Parameter photonFactorZMuTk(kPhotonFactorZMuTk, commands.par(kPhotonFactorZMuTk));
  130. //funct::Parameter interferenceFactorZMuTk(kInterferenceFactorZMuTk, commands.par(kInterferenceFactorZMuTk));
  131. funct::Parameter yieldZMuMu(kYieldZMuMu, commands.par(kYieldZMuMu));
  132. funct::Parameter yieldZMuTk(kYieldZMuTk, commands.par(kYieldZMuTk));
  133. funct::Parameter yieldZMuSa(kYieldZMuSa, commands.par(kYieldZMuSa));
  134. funct::Parameter yieldBkgZMuTk(kYieldBkgZMuTk, commands.par(kYieldBkgZMuTk));
  135. funct::Parameter yieldBkgZMuSa(kYieldBkgZMuSa, commands.par(kYieldBkgZMuSa));
  136. funct::Parameter meanZMuMu(kMeanZMuMu, commands.par(kMeanZMuMu));
  137. funct::Parameter sigmaZMuMu(kSigmaZMuMu, commands.par(kSigmaZMuMu));
  138. funct::Parameter sigmaZMuSa(kSigmaZMuSa, commands.par(kSigmaZMuSa));
  139. funct::Parameter lambda(kLambda, commands.par(kLambda));
  140. funct::Parameter a0(kA0, commands.par(kA0));
  141. funct::Parameter a1(kA1, commands.par(kA1));
  142. funct::Parameter a2(kA2, commands.par(kA2));
  143. ZPeak zPeak = funct::Exponential(lambdaZMuMu) *
  144. funct::conv(funct::ZLineShape(mass, gamma, photonFactorZMuMu, interferenceFactorZMuMu),
  145. funct::Gaussian(meanZMuMu, sigmaZMuMu),
  146. -3*sigmaZMuMu.value(), 3*sigmaZMuMu.value(), integratorConv);
  147. ZMuMu zMuMu = yieldZMuMu * zPeak;
  148. ZMuTkBkg zMuTkBkg =
  149. yieldBkgZMuTk * (funct::Exponential(lambda) * funct::Polynomial<2>(a0, a1, a2));
  150. ZMuTk zMuTk = yieldZMuTk * zPeak + zMuTkBkg;
  151. ZMuSa zMuSa = yieldZMuSa * funct::Gaussian(mass, sigmaZMuSa) + yieldBkgZMuSa;
  152. ChiSquared chi2(zMuMu, histoZMuMu,
  153. zMuTk, histoZMuTk,
  154. zMuSa, histoZMuSa,
  155. fMin, fMax);
  156. cout << "N. deg. of freedom: " << chi2.numberOfBins() << endl;
  157. fit::RootMinuit<ChiSquared> minuit(chi2, true);
  158. commands.add(minuit, yieldZMuMu);
  159. commands.add(minuit, yieldZMuTk);
  160. commands.add(minuit, yieldZMuSa);
  161. commands.add(minuit, yieldBkgZMuTk);
  162. commands.add(minuit, yieldBkgZMuSa);
  163. commands.add(minuit, lambdaZMuMu);
  164. commands.add(minuit, mass);
  165. commands.add(minuit, gamma);
  166. commands.add(minuit, photonFactorZMuMu);
  167. commands.add(minuit, interferenceFactorZMuMu);
  168. //commands.add(minuit, photonFactorZMuTk);
  169. //commands.add(minuit, interferenceFactorZMuTk);
  170. commands.add(minuit, meanZMuMu);
  171. commands.add(minuit, sigmaZMuMu);
  172. commands.add(minuit, lambda);
  173. commands.add(minuit, a0);
  174. commands.add(minuit, a1);
  175. commands.add(minuit, a2);
  176. commands.add(minuit, sigmaZMuSa);
  177. commands.run(minuit);
  178. const unsigned int nPar = 17;
  179. ROOT::Math::SMatrix<double, nPar, nPar, ROOT::Math::MatRepSym<double, nPar> > err;
  180. minuit.getErrorMatrix(err);
  181. std::cout << "error matrix:" << std::endl;
  182. for(unsigned int i = 0; i < nPar; ++i) {
  183. for(unsigned int j = 0; j < nPar; ++j) {
  184. std::cout << err(i, j) << "\t";
  185. }
  186. std::cout << std::endl;
  187. }
  188. minuit.printFitResults();
  189. string ZMuMuPlot = "ZMuMuFit" + plot_string;
  190. root::plot<ZMuMu>(ZMuMuPlot.c_str(), *histoZMuMu, zMuMu, fMin, fMax,
  191. yieldZMuMu, lambdaZMuMu, mass, gamma, photonFactorZMuMu, interferenceFactorZMuMu,
  192. meanZMuMu, sigmaZMuMu,
  193. kRed, 2, kDashed, 10000,
  194. "Z -> #mu #mu mass with isolation cut", "#mu #mu invariant mass (GeV/c^{2})",
  195. "Events");
  196. string ZMuTkPlot = "ZMuTkFit" + plot_string;
  197. TF1 funZMuTk = root::tf1<ZMuTk>("ZMuTkFunction", zMuTk, fMin, fMax,
  198. yieldZMuTk, lambdaZMuMu, mass, gamma, photonFactorZMuMu, interferenceFactorZMuMu,
  199. meanZMuMu, sigmaZMuMu,
  200. yieldBkgZMuTk, lambda, a0, a1, a2);
  201. funZMuTk.SetLineColor(kRed);
  202. funZMuTk.SetLineWidth(2);
  203. funZMuTk.SetLineStyle(kDashed);
  204. funZMuTk.SetNpx(10000);
  205. TF1 funZMuTkBkg = root::tf1<ZMuTkBkg>("ZMuTkBack", zMuTkBkg, fMin, fMax,
  206. yieldBkgZMuTk, lambda, a0, a1, a2);
  207. funZMuTkBkg.SetLineColor(kGreen);
  208. funZMuTkBkg.SetLineWidth(2);
  209. funZMuTkBkg.SetLineStyle(kDashed);
  210. funZMuTkBkg.SetNpx(10000);
  211. histoZMuTk->SetTitle("Z -> #mu + (unmatched) track mass with isolation cut");
  212. histoZMuTk->SetXTitle("#mu + (unmatched) track invariant mass (GeV/c^{2})");
  213. histoZMuTk->SetYTitle("Events");
  214. TCanvas *canvas = new TCanvas("canvas");
  215. histoZMuTk->Draw("e");
  216. funZMuTk.Draw("same");
  217. funZMuTkBkg.Draw("same");
  218. canvas->SaveAs(ZMuTkPlot.c_str());
  219. canvas->SetLogy();
  220. string logZMuTkPlot = "log_" + ZMuTkPlot;
  221. canvas->SaveAs(logZMuTkPlot.c_str());
  222. string ZMuSaPlot = "ZMuSaFit" + plot_string;
  223. root::plot<ZMuSa>(ZMuSaPlot.c_str(), *histoZMuSa, zMuSa, fMin, fMax,
  224. yieldZMuSa, mass, sigmaZMuSa, yieldBkgZMuSa,
  225. kRed, 2, kDashed, 10000,
  226. "Z -> #mu + (unmatched) standalone mass with isolation cut",
  227. "#mu + (unmatched) standalone invariant mass (GeV/c^{2})",
  228. "Events");
  229. }
  230. }
  231. }
  232. catch(std::exception& e) {
  233. cerr << "error: " << e.what() << "\n";
  234. return 1;
  235. }
  236. catch(...) {
  237. cerr << "Exception of unknown type!\n";
  238. }
  239. return 0;
  240. }