ATLAS Offline Software
MuonPTResolution.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "TF1.h"
6 #include "TH1F.h"
7 #include <string>
8 #include <iostream>
9 #include <vector>
10 #include <map>
11 #include <math.h>
13 
14 double getContentInRange(TH1F *hist, double centralX, double halfWidth)
15 {
16  double ContentInRange=0;
17  for (int i=0; i<=hist->GetNbinsX(); i++)
18  {
19  if ( ( (hist->GetBinCenter(i) + hist->GetBinWidth(i)/2.) < centralX+halfWidth) &&
20  ( (hist->GetBinCenter(i) - hist->GetBinWidth(i)/2.) > centralX-halfWidth ))
21  {
22  ContentInRange=ContentInRange+ hist->GetBinContent(i); // If Bin is completly in range, add the full bin
23  }
24  }
25  int borderbin=hist->FindBin(centralX-halfWidth);
26 
27  double ContentInLeftBorderBin = hist->GetBinContent(borderbin)*
28  ((hist->GetBinCenter(borderbin) + hist->GetBinWidth(borderbin)/2.) -(centralX-halfWidth))/hist->GetBinWidth(borderbin);
29 
30  borderbin=hist->FindBin(centralX+halfWidth);
31  double ContentInRightBorderBin = hist->GetBinContent(borderbin)*((centralX+halfWidth) - (hist->GetBinCenter(borderbin) -
32  hist->GetBinWidth(borderbin)/2.))/hist->GetBinWidth(borderbin);
33 
34  return ContentInRange+ContentInRightBorderBin+ContentInLeftBorderBin;
35 }
36 
37 
38 
40  double &PTResMean,
41  double &ErrMean,
42  double &PTSigma,
43  double &ErrSigma,
44  double &TailContent)
45 {
46  double empty = 0.;
47  getMuonPTResolution(hist, 3, PTResMean, ErrMean, PTSigma, ErrSigma, TailContent,empty,empty);
48 }
49 
50 
51 
53  int n_max_runs,
54  double &PTResMean,
55  double &ErrMean,
56  double &PTSigma,
57  double &ErrSigma,
58  double &TailFraction,
59  double PercentageOfEntriesInWidth,
60  double &HalfWidth)
61 {
62  PTResMean = -1.0;
63  ErrMean = -1.0;
64  PTSigma = -1.0;
65  ErrSigma = -1.0;
66  TailFraction = -1.0;
67  HalfWidth = -1.0;
68 
69  if (n_max_runs<=0) return;
70  Double_t par[8];
71  Double_t mean=0.0, sigma=0.0;
72  Double_t old_sigma=0.0;
73  PTResMean = 0.0;
74 
75  TF1 gaussian("g1","gaus");
76  gaussian.SetRange(-300,300);
77 
78 
79  for (int i=1; i<=n_max_runs ;i++)
80  {
81  hist->Fit(&gaussian,"R");
82  gaussian.GetParameters(&par[0]);
83  mean = par[1];
84  sigma = std::abs(par[2]);
85  gaussian.SetRange(mean-sigma*2.,mean+sigma*2.);
86 
87  // Check if converged, if yes then quit
88  if (std::abs(1.0-old_sigma/sigma)<0.0001) break;
89  old_sigma=sigma;
90  }
91 
92 
93  PTResMean = mean;
94  PTSigma = std::abs(sigma);
95  ErrMean = (gaussian.GetParError(1));
96  ErrSigma = std::abs((gaussian.GetParError(2)));
97  int i=0;
98  double TailContent=0;
99 
100  while ( (hist->GetBinCenter(i)-hist->GetBinWidth(i)/2.) < mean-sigma*2. )
101  {
102  TailContent=TailContent+hist->GetBinContent(i);
103  i++;
104  }
105  i=hist->GetNbinsX();
106 
107  while ( (hist->GetBinCenter(i)+hist->GetBinWidth(i)/2.) > mean+sigma*2. )
108  {
109  TailContent=TailContent+hist->GetBinContent(i);
110  i--;
111  }
112 
113  TailFraction = ((double)(TailContent))/((double)hist->GetEntries());
114 
115  if (PercentageOfEntriesInWidth>1) PercentageOfEntriesInWidth=PercentageOfEntriesInWidth/100;
116 
117  double NumberOfEntriesInWidth = PercentageOfEntriesInWidth * 1.0 * hist->GetEntries();
118  HalfWidth=0.;
119  double StepLength=0.1;
120 
121  while (StepLength>sigma/1000.)
122  {
123  while ( getContentInRange(hist,mean,HalfWidth) < NumberOfEntriesInWidth )
124  {
125  HalfWidth=HalfWidth+StepLength;
126  }
127  HalfWidth=HalfWidth-StepLength;
128 
130  }
131 }
132 
133 
pdg_comparison.sigma
sigma
Definition: pdg_comparison.py:324
mean
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
Definition: dependence.cxx:254
MuonPTResolution.h
plotmaker.hist
hist
Definition: plotmaker.py:148
empty
bool empty(TH1 *h)
Definition: computils.cxx:294
lumiFormat.i
int i
Definition: lumiFormat.py:92
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
createCoolChannelIdFile.par
par
Definition: createCoolChannelIdFile.py:29
getContentInRange
double getContentInRange(TH1F *hist, double centralX, double halfWidth)
Definition: MuonPTResolution.cxx:14
TH1F
Definition: rootspy.cxx:320
Trk::StepLength
@ StepLength
Definition: MaterialAssociationType.h:17
getMuonPTResolution
void getMuonPTResolution(TH1F *hist, double &PTResMean, double &ErrMean, double &PTSigma, double &ErrSigma, double &TailContent)
Definition: MuonPTResolution.cxx:39