CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
DTMeanTimerFitter Class Reference

#include <DTMeanTimerFitter.h>

Public Member Functions

 DTMeanTimerFitter (TFile *file)
 Constructor. More...
 
std::vector< float > evaluateVDriftAndReso (const TString &N)
 Fit the TMax histos and evaluate VDrift and resolution. More...
 
TF1 * fitTMax (TH1F *histo)
 Really do the fit. More...
 
void setVerbosity (unsigned int lvl)
 Set the verbosity of the output: 0 = silent, 1 = info, 2 = debug. More...
 
virtual ~DTMeanTimerFitter ()
 Destructor. More...
 

Private Attributes

TFile * hDebugFile
 
TFile * hInputFile
 
unsigned int theVerbosityLevel
 

Detailed Description

Fit the Tmax histograms with a gaussian returning the mean values and the sigmas.

Date:
2013/05/23 15:28:44
Revision:
1.3
Author
S. Bolognesi - INFN Torino

Definition at line 21 of file DTMeanTimerFitter.h.

Constructor & Destructor Documentation

DTMeanTimerFitter::DTMeanTimerFitter ( TFile *  file)

Constructor.

Definition at line 23 of file DTMeanTimerFitter.cc.

References hDebugFile.

24  //hInputFile = new TFile("DTTMaxHistos.root", "READ");
25  hDebugFile = new TFile("DTMeanTimerFitter.root", "RECREATE");
26 }
unsigned int theVerbosityLevel
DTMeanTimerFitter::~DTMeanTimerFitter ( )
virtual

Destructor.

Definition at line 28 of file DTMeanTimerFitter.cc.

References hDebugFile.

28  {
29  hDebugFile->Close();
30 }

Member Function Documentation

vector< float > DTMeanTimerFitter::evaluateVDriftAndReso ( const TString &  N)

Fit the TMax histos and evaluate VDrift and resolution.

Definition at line 32 of file DTMeanTimerFitter.cc.

References prof2calltree::count, cppFunctionSkipper::exception, python.connectstrParser::f1, fitTMax(), hTMaxCell::GetT0Factor(), hDebugFile, hInputFile, mergeVDriftHistosByStation::histos, hTMaxCell::hTmax123, hTMaxCell::hTmax124s72, hTMaxCell::hTmax124s78, hTMaxCell::hTmax134s72, hTMaxCell::hTmax134s78, hTMaxCell::hTmax234, hTMaxCell::hTmax_0, hTMaxCell::hTmax_2t0, hTMaxCell::hTmax_3t0, hTMaxCell::hTmax_t0, i, timingPdfMaker::mean, and mathSSE::sqrt().

Referenced by DTVDriftCalibration::endJob().

32  {
33 
34  // Retrieve histogram sets
36  vector<float> vDriftAndReso;
37 
38  // Check that the histo for this cell exists
39  if(histos->hTmax123 != 0) {
40  vector<TH1F*> hTMax; // histograms for <T_max> calculation
41  vector <TH1F*> hT0; // histograms for T0 evaluation
42  hTMax.push_back(histos->hTmax123);
43  hTMax.push_back(histos->hTmax124s72);
44  hTMax.push_back(histos->hTmax124s78);
45  hTMax.push_back(histos->hTmax134s72);
46  hTMax.push_back(histos->hTmax134s78);
47  hTMax.push_back(histos->hTmax234);
48 
49  hT0.push_back(histos->hTmax_3t0);
50  hT0.push_back(histos->hTmax_2t0);
51  hT0.push_back(histos->hTmax_t0);
52  hT0.push_back(histos->hTmax_0);
53 
54  vector<Double_t> factor; // factor relating the width of the Tmax distribution
55  // and the cell resolution
56  factor.push_back(sqrt(2./3.)); // hTmax123
57  factor.push_back(sqrt(2./7.)); // hTmax124s72
58  factor.push_back(sqrt(8./7.)); // hTmax124s78
59  factor.push_back(sqrt(2./7.)); // hTmax134s72
60  factor.push_back(sqrt(8./7.)); // hTmax134s78
61  factor.push_back(sqrt(2./3.)); // hTmax234
62 
63 
64  // Retrieve the gaussian mean and sigma for each TMax histogram
65  vector<Double_t> mean;
66  vector<Double_t> sigma;
67  vector<Double_t> count; //number of entries
68 
69  for(vector<TH1F*>::const_iterator ith = hTMax.begin();
70  ith != hTMax.end(); ith++) {
71  TF1 *funct = fitTMax(*ith);
72  if(!funct){
73  edm::LogError("DTMeanTimerFitter") << "Error when fitting TMax..histogram name" << (*ith)->GetName();
74  // return empty or -1 filled vector?
75  vector<float> defvec(6,-1);
76  return defvec;
77  }
78  hDebugFile->cd();
79  (*ith)->Write();
80 
81  // Get mean, sigma and number of entries of each histogram
82  mean.push_back(funct->GetParameter(1));
83  sigma.push_back(funct->GetParameter(2));
84  count.push_back((*ith)->GetEntries());
85  }
86 
87  Double_t tMaxMean=0.;
88  Double_t wTMaxSum=0.;
89  Double_t sigmaT=0.;
90  Double_t wSigmaSum = 0.;
91 
92  //calculate total mean and sigma
93  for(int i=0; i<=5; i++) {
94  if(count[i]<200) continue;
95  tMaxMean += mean[i]*(count[i]/(sigma[i]*sigma[i]));
96  wTMaxSum += count[i]/(sigma[i]*sigma[i]);
97  sigmaT += count[i]*factor[i]*sigma[i];
98  wSigmaSum += count[i];
99  // cout << "TMaxMean "<<i<<": "<< mean[i] << " entries: " << count[i]
100  // << " sigma: " << sigma[i]
101  // << " weight: " << (count[i]/(sigma[i]*sigma[i])) << endl;
102  }
103  if((!wTMaxSum)||(!wSigmaSum)){
104  edm::LogError("DTMeanTimerFitter") << "Error zero sum of weights..returning default";
105  vector<float> defvec(6,-1);
106  return defvec;
107  }
108 
109  tMaxMean /= wTMaxSum;
110  sigmaT /= wSigmaSum;
111 
112  //calculate v_drift and resolution
113  Double_t vDrift = 2.1 / tMaxMean; //2.1 is the half cell length in cm
114  Double_t reso = vDrift * sigmaT;
115  vDriftAndReso.push_back(vDrift);
116  vDriftAndReso.push_back(reso);
117  //if(theVerbosityLevel >= 1)
118  edm::LogVerbatim("DTMeanTimerFitter") << " final TMaxMean=" << tMaxMean << " sigma= " << sigmaT
119  << " v_d and reso: " << vDrift << " " << reso << endl;
120 
121  // Order t0 histogram by number of entries (choose histograms with higher nr. of entries)
122  map<Double_t,TH1F*> hEntries;
123  for(vector<TH1F*>::const_iterator ith = hT0.begin();
124  ith != hT0.end(); ith++) {
125  hEntries[(*ith)->GetEntries()] = (*ith);
126  }
127 
128  // add at the end of hT0 the two hists with the higher number of entries
129  int counter = 0;
130  for(map<Double_t,TH1F*>::reverse_iterator iter = hEntries.rbegin();
131  iter != hEntries.rend(); iter++) {
132  counter++;
133  if (counter==1) hT0.push_back(iter->second);
134  else if (counter==2) {hT0.push_back(iter->second); break;}
135  }
136 
137  // Retrieve the gaussian mean and sigma of histograms for Delta(t0) evaluation
138  vector<Double_t> meanT0;
139  vector<Double_t> sigmaT0;
140  vector<Double_t> countT0;
141 
142  for(vector<TH1F*>::const_iterator ith = hT0.begin();
143  ith != hT0.end(); ith++) {
144  try{
145  (*ith)->Fit("gaus");
146  } catch(std::exception){
147  edm::LogError("DTMeanTimerFitter") << "Exception when fitting T0..histogram " << (*ith)->GetName();
148  // return empty or -1 filled vector?
149  vector<float> defvec(6,-1);
150  return defvec;
151  }
152  TF1 *f1 = (*ith)->GetFunction("gaus");
153  // Get mean, sigma and number of entries of the histograms
154  meanT0.push_back(f1->GetParameter(1));
155  sigmaT0.push_back(f1->GetParameter(2));
156  countT0.push_back((*ith)->GetEntries());
157  }
158  //calculate Delta(t0)
159  if(hT0.size() != 6) { // check if you have all the t0 hists
160  edm::LogVerbatim("DTMeanTimerFitter") << "t0 histograms = " << hT0.size();
161  for(int i=1; i<=4;i++) {
162  vDriftAndReso.push_back(-1);
163  }
164  return vDriftAndReso;
165  }
166 
167  for(int it0=0; it0<=2; it0++) {
168  if((countT0[it0] > 200) && (countT0[it0+1] > 200)) {
169  Double_t deltaT0 = meanT0[it0] - meanT0[it0+1];
170  vDriftAndReso.push_back(deltaT0);
171  }
172  else
173  vDriftAndReso.push_back(999.);
174  }
175  //deltat0 using hists with max nr. of entries
176  if((countT0[4] > 200) && (countT0[5] > 200)) {
177  Double_t t0Diff = histos->GetT0Factor(hT0[4]) - histos->GetT0Factor(hT0[5]);
178  Double_t deltaT0MaxEntries = (meanT0[4] - meanT0[5])/ t0Diff;
179  vDriftAndReso.push_back(deltaT0MaxEntries);
180  }
181  else
182  vDriftAndReso.push_back(999.);
183  }
184  else {
185  for(int i=1; i<=6; i++) {
186  // 0=vdrift, 1=reso, 2=(3deltat0-2deltat0), 3=(2deltat0-1deltat0),
187  // 4=(1deltat0-0deltat0), 5=deltat0 from hists with max entries,
188  vDriftAndReso.push_back(-1);
189  }
190  }
191  return vDriftAndReso;
192 }
int i
Definition: DBlmapReader.cc:9
TH1F * hTmax134s78
Definition: vDriftHistos.h:410
TH1F * hTmax_2t0
Definition: vDriftHistos.h:419
TH1F * hTmax_3t0
Definition: vDriftHistos.h:412
int GetT0Factor(TH1F *hist)
Definition: vDriftHistos.h:391
TH1F * hTmax234
Definition: vDriftHistos.h:411
TH1F * hTmax_t0
Definition: vDriftHistos.h:426
TH1F * hTmax134s72
Definition: vDriftHistos.h:409
TH1F * hTmax124s72
Definition: vDriftHistos.h:407
TF1 * fitTMax(TH1F *histo)
Really do the fit.
TH1F * hTmax_0
Definition: vDriftHistos.h:433
T sqrt(T t)
Definition: SSEVec.h:48
TH1F * hTmax124s78
Definition: vDriftHistos.h:408
#define N
Definition: blowfish.cc:9
TH1F * hTmax123
Definition: vDriftHistos.h:406
TF1 * DTMeanTimerFitter::fitTMax ( TH1F *  histo)

Really do the fit.

Definition at line 196 of file DTMeanTimerFitter.cc.

References cppFunctionSkipper::exception, python.connectstrParser::f1, and LogDebug.

Referenced by evaluateVDriftAndReso().

196  {
197  // Find distribution peak and fit range
198  Double_t peak = (((((histo->GetXaxis())->GetXmax())-((histo->GetXaxis())->GetXmin()))/histo->GetNbinsX())*
199  (histo->GetMaximumBin()))+((histo->GetXaxis())->GetXmin());
200  //if(theVerbosityLevel >= 1)
201  LogDebug("DTMeanTimerFitter") <<"Peak "<<peak<<" : "<<"xmax "<<((histo->GetXaxis())->GetXmax())
202  <<" xmin "<<((histo->GetXaxis())->GetXmin())
203  <<" nbin "<<histo->GetNbinsX()
204  <<" bin with max "<<(histo->GetMaximumBin());
205  Double_t range = 2.*histo->GetRMS();
206 
207  // Fit each Tmax histogram with a Gaussian in a restricted interval
208  TF1 *rGaus = new TF1("rGaus","gaus",peak-range,peak+range);
209  rGaus->SetMarkerSize();// just silence gcc complainining about unused var
210  try{
211  histo->Fit("rGaus","R");
212  } catch(std::exception){
213  edm::LogError("DTMeanTimerFitter") << "Exception when fitting TMax..histogram " << histo->GetName()
214  << " setting return function pointer to zero";
215  return 0;
216  }
217  TF1 *f1 = histo->GetFunction("rGaus");
218  return f1;
219  }
#define LogDebug(id)
void DTMeanTimerFitter::setVerbosity ( unsigned int  lvl)
inline

Set the verbosity of the output: 0 = silent, 1 = info, 2 = debug.

Definition at line 33 of file DTMeanTimerFitter.h.

References theVerbosityLevel.

33  {
34  theVerbosityLevel = lvl;
35  }
unsigned int theVerbosityLevel

Member Data Documentation

TFile* DTMeanTimerFitter::hDebugFile
private
TFile* DTMeanTimerFitter::hInputFile
private

Definition at line 44 of file DTMeanTimerFitter.h.

Referenced by evaluateVDriftAndReso().

unsigned int DTMeanTimerFitter::theVerbosityLevel
private

Definition at line 46 of file DTMeanTimerFitter.h.

Referenced by setVerbosity().