ATLAS Offline Software
Loading...
Searching...
No Matches
Calibrator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5/********************************************************************
6
7 NAME: Calibrator.cxx
8PACKAGE: TRTCalibTools
9
10AUTHORS: Johan Lundquist
11CREATED: 27-03-2009
12
13PURPOSE: Class for calibrating a TRT sub-level
14
15********************************************************************/
16
17#include "Calibrator.h"
19#include <TH1F.h>
20#include <TH2F.h>
21#include <TH1D.h>
22#include <TDirectory.h>
23#include <TF1.h>
24#include <TStyle.h>
25#include <TNtuple.h>
26#include <TGraphErrors.h>
27#include <iostream>
28#include <iomanip>
29#include <fstream>
30#include <cmath>
31
32
34 res = -999;
35 resMean = -999;
36 reserr = -999;
37 tres = -999;
38 tresMean = -999;
39 t0 = -999;
40 t0err = -999;
41 reft0 = -999;
42 t0off = -999;
43 rtt0 = -999;
44 nhits = -999;
45 x = -999;
46 y = -999;
47 z = -999;
48 oldt02 = -999;
49 sumt0 = -999;
50 sumx = -999;
51 sumy = -999;
52 sumz = -999;
53 calflag = -999;
54 rtflag = -999;
55 t0flag = -999;
56 det = -999;
57 lay = -999;
58 mod = -999;
59 brd = -999;
60 chp = -999;
61 stl = -999;
62 stw = -999;
63 sid = -999;
64 ntres = -999;
65 nrt = -999;
66 nres = -999;
67 t0fittype = -999;
68 rtgraph = nullptr;
69}
70
73
74caldata::caldata(bool makehist, int nbinst, int nbinsr){
75 res = -999;
76 resMean = -999;
77 reserr = -999;
78 tres = -999;
79 tresMean = -999;
80 t0 = -999;
81 t0err = -999;
82 reft0 = -999;
83 t0off = -999;
84 rtt0 = -999;
85 nhits = -999;
86 x = -999;
87 y = -999;
88 z = -999;
89 oldt02 = -999;
90 sumt0 = -999;
91 sumx = -999;
92 sumy = -999;
93 sumz = -999;
94 calflag = -999;
95 rtflag = -999;
96 t0flag = -999;
97 det = -999;
98 lay = -999;
99 mod = -999;
100 brd = -999;
101 chp = -999;
102 stl = -999;
103 stw = -999;
104 sid = -999;
105 ntres = -999;
106 nrt = -999;
107 nres = -999;
108 t0fittype= -999;
109 rtgraph = nullptr;
110
111 if (makehist) {
112 m_treshist.resize (100);
113 reshist.resize (100);
114 rthist.resize (nbinsr*nbinst+200);
115 }
116}
117
118RtGraph::RtGraph(TH2F* rtHist, int binvar, const char* binlabel, bool pflag, TDirectory* dir){
119
120 int fitresult;
121 npoints = binvar==0 ? rtHist->GetNbinsX() : rtHist->GetNbinsY() ;
122
123
124 m_mean = -20.0;
125 m_t = -20.0;
126 m_d = -20.0;
127 m_et = -20.0;
128 m_ed = -20.0;
129 // m_ff = nullptr ;
130
131
132 TH1D** hslizes = new TH1D*[npoints];
133 m_btype = new bintype[npoints];
134 m_tv = new float[npoints];
135 m_dv = new float[npoints];
136 m_etv = new float[npoints];
137 m_edv = new float[npoints];
138 m_rightsig = new float[npoints];
139 m_leftsig = new float[npoints];
140 m_leftval = new float[npoints];
141 m_rightval = new float[npoints];
142 m_maxbin = new int[npoints];
143 m_maxval = new float[npoints];
144
145 m_ipoint=0;
146 mintime=999;
148
149 if (pflag){
150 TDirectory* binhistdir = dir->mkdir("binhist");
151 binhistdir->cd();
152 std::cout << " Calibrator::RtGraph: " << " Directory " << std::string(binhistdir->GetPath()) << " binlabel " << std::string(binlabel) << std::endl;
153 }
154
155 std::cout << " Calibrator::RtGraph: " << " number of points " << npoints << " binvar " << binvar << std::endl;
156 // check and classify the bin-histograms
157 for (int i=0;i<npoints;i++) {
158
159 m_chname = std::string(Form("%s slize_%i",binlabel,i));
160 m_chtit = binvar==0 ? std::string(Form("bin %i : %4.2f < %s < %4.2f [ns]",i,rtHist->GetXaxis()->GetBinLowEdge(i+1),binlabel,rtHist->GetXaxis()->GetBinUpEdge(i+1))) :
161 std::string(Form("bin %i : %4.2f < %s < %4.2f [mm]",i,rtHist->GetYaxis()->GetBinLowEdge(i+1),binlabel,rtHist->GetYaxis()->GetBinUpEdge(i+1))) ;
162 hslizes[i] = binvar==0 ? rtHist->ProjectionY(m_chname.data(),i+1,i+1) :
163 rtHist->ProjectionX(m_chname.data(),i+1,i+1);
164 hslizes[i]->SetTitle(m_chtit.data());
165 if (!pflag){
166 hslizes[i]->SetDirectory(nullptr);
167 }
168
169 m_maxbin[i]=1; m_maxval[i]=0;
170 for (int j=1;j<=hslizes[i]->GetNbinsX();j++) {
171 float val=hslizes[i]->GetBinContent(j);
172 if (val>m_maxval[i]){
173 m_maxval[i]=val;
174 m_maxbin[i]=j;
175 m_leftval[i] = hslizes[i]->GetBinContent(j-1);
176 m_rightval[i] = hslizes[i]->GetBinContent(j+1);
177 }
178 }
179
180 if(m_maxval[i]==0) m_maxval[i]=1.0e-4;
181 m_rightsig[i] = m_rightval[i]==0 ? 100 : std::sqrt(m_maxval[i])/m_maxval[i] + std::sqrt(m_rightval[i])/m_rightval[i];
182 m_leftsig[i] = m_leftval[i]==0 ? 100 : std::sqrt(m_maxval[i])/m_maxval[i] + std::sqrt(m_leftval[i])/m_leftval[i];
183
184 m_btype[i]=EMPTY;
185 if(true){
186 m_btype[i]=GOOD;
187 m_btype[i-1]=GOOD;
188 }
189 else{
190 if (hslizes[i]->GetEntries()>0){
191 if (i<(float)hslizes[i]->GetNbinsX()/2) m_btype[i]=LOW;
192 else m_btype[i]=HIGH;
193 }
194 }
195 int rtEntries = rtHist->GetEntries();
196 if(rtEntries==0) rtEntries=1;
197 printf("%s ... %8f %8i %4i %8f %8f %4i\n", m_chtit.data(), (float)hslizes[i]->GetEntries()/(float)rtEntries, (int)hslizes[i]->GetEntries(), m_maxbin[i], m_leftsig[i], m_rightsig[i], m_btype[i]);
198 }
199
200 float frmin=0,frmax=0;
201 for (int i=0;i<npoints;i++) {
202
203 // prepare initial fit parameters
204 m_mean=hslizes[i]->GetBinCenter(m_maxbin[i]);
205 if (m_btype[i]==LOW) {frmin = hslizes[i]->GetBinCenter(1); frmax = hslizes[i]->GetBinCenter(m_maxbin[i]+4);}
206 if (m_btype[i]==GOOD) {frmin = hslizes[i]->GetBinCenter(m_maxbin[i]-3); frmax = hslizes[i]->GetBinCenter(m_maxbin[i]+3);}
207 if (m_btype[i]==HIGH) {frmin = hslizes[i]->GetBinCenter(m_maxbin[i]-3); frmax = hslizes[i]->GetBinCenter(m_maxbin[i]+4);}
208
209 std::unique_ptr<TF1> ff(new TF1("dtfitfunc","gaus"));
210
211 ff->SetRange(frmin,frmax);
212
213 m_t = binvar==0 ? rtHist->GetXaxis()->GetBinCenter(i+1) : rtHist->GetYaxis()->GetBinCenter(i+1);
214 m_et = binvar==0 ? rtHist->GetXaxis()->GetBinWidth(1)/std::sqrt(12.0) : rtHist->GetYaxis()->GetBinWidth(1)/std::sqrt(12.0);
215 m_d = 0;
216 m_ed = 0;
217
218 if (m_btype[i]==LOW){
219 m_d = 0;
220 m_ed = 0;
221 }
222 if (m_btype[i]==HIGH){
223 m_d = 2;
224 m_ed = 0;
225 }
226 if (m_btype[i]==EMPTY){
227 m_d = 0;
228 m_ed = 0;
229 }
230 if (m_btype[i]==GOOD && hslizes[i]->GetEntries()>3){
231 if (m_btype[i-1]==GOOD){
232 fitresult=hslizes[i]->Fit("dtfitfunc","QR");
233 ff->SetRange(m_mean-1.0*ff->GetParameter(2), m_mean+1.0*ff->GetParameter(2));
234 fitresult=hslizes[i]->Fit("dtfitfunc","QR");
235 m_d = ff->GetParameter(1);
236 m_ed = ff->GetParError(1);
237 std::cout << fitresult << " " << m_ed << std::endl;
238 }
239 else{
240 m_d = 0;
241 m_ed = 0;
242 }
243 }
244
245
246 if (m_btype[i]==GOOD && m_ed!=0){
251 m_ipoint++;
252 if (binvar==0) {
253 rval.push_back(m_d);
254 tval.push_back(m_t);
255 }
256 else {
257 rval.push_back(m_t);
258 tval.push_back(m_d);
259 }
260 }
261
262
264
265 }
266
267 rtgr = binvar==0 ? new TGraphErrors(m_ipoint,m_tv,m_dv,m_etv,m_edv) : new TGraphErrors(m_ipoint,m_dv,m_tv,m_edv,m_etv);
268 rtgr->SetTitle((std::string("binning in ") + binlabel).data());
269 trgr = binvar==0 ? new TGraphErrors(m_ipoint,m_dv,m_tv,m_edv,m_etv) : new TGraphErrors(m_ipoint,m_tv,m_dv,m_etv,m_edv);
270 trgr->SetTitle((std::string("binning in ") + binlabel).data());
271
272 rtgr->SetMarkerStyle(1) ;
273 rtgr->SetMarkerColor(2) ;
274 rtgr->SetLineColor(2) ;
275 rtgr->SetName("rtgraph") ;
276 trgr->SetMarkerStyle(1) ;
277 trgr->SetMarkerColor(2) ;
278 trgr->SetLineColor(2) ;
279 trgr->SetName("trgraph") ;
280
281 dir->cd();
282 delete [] hslizes;
283}
284
285
286
288
289 delete [] m_btype ;
290 delete [] m_tv ;
291 delete [] m_dv ;
292 delete [] m_etv ;
293 delete [] m_edv ;
294 delete [] m_rightsig ;
295 delete [] m_leftsig ;
296 delete [] m_leftval ;
297 delete [] m_rightval ;
298 delete [] m_maxbin ;
299 delete [] m_maxval ;
300}
301
302
303double pol3deg(double *x, double *par) {
304 double r = x[0];
305 double t = par[0]+r*(par[1]+(r*(par[2]+r*par[3])));
306 return t;
307}
308
309double pol3deg2(double *x, double *par) {
310 double t = x[0];
311 double r = par[1]*(t-par[0]) + par[2]*(t-par[0])*(t-par[0]) + par[3]*(t-par[0])*(t-par[0])*(t-par[0]);
312 return r;
313}
314
315
316double trrel_dines(double *x, double *par){
317 double rmin0 = par[0];
318 double rho = par[1];
319 double v = par[2];
320 double t_const = par[3];
321 double r = x[0];
322 double t = t_const + 2*rho/v*std::asin(std::sqrt(rmin0*rmin0*(1-0.25*r*r)+r*r)/(2*rho));
323 return t;
324}
325
326double rtrel_dines(double *x, double*par){
327 double rmin0 = par[0];
328 double rho = par[1];
329 double v = par[2];
330 double t_const = par[3];
331 double t = x[0];
332 double r_squared = (4*rho*rho*std::sin(v*(t-t_const)/(2*rho))-rmin0*rmin0)/(1-0.25*rmin0*rmin0);
333 double r=r_squared>0 ? std::sqrt(r_squared) : 0.0;
334 return r;
335}
336
337
338
340 : dort(false),
341 dot0(false),
342 dores(false),
343 nort(false),
344 not0(false),
345 usebref(false),
346 bequiet(false),
347 printlog(false),
348 printt0(false),
349 printrt(false),
350 usep0(false),
351 floatp3(false),
352 useshortstraws(true),
353
354 m_name ("None"),
355 m_rtbinning ("None"),
356 m_minrtstat (-10),
357 m_mint0stat (-10),
358 m_t0shift (-100.),
359
360 m_nbinsr(100),
361 m_nbinst(55),
362 m_nbinstres(100),
363 m_nbinsres(100),
364 m_minr(0),
365 m_maxr(2),
366 m_mint(-5),
367 m_maxt(50),
368 m_mintres(-10),
369 m_maxtres(10),
370 m_minres(-0.6),
371 m_maxres(0.6),
372
373 m_ntreshits(0),
374 m_nreshits(0),
375 m_nrthits(0),
376 m_nhits(0),
377
378 m_isdines ( false)
379{
380 selection.insert(-3);
381 level =-10;
382}
383
384Calibrator::Calibrator(int lev, const std::string& nme, int mint0, int minrt, const std::string& rtr, const std::string& rtb, float t0sft)
385 : dort(false),
386 dot0(false),
387 dores(false),
388 nort(false),
389 not0(false),
390 usebref(false),
391 bequiet(false),
392 printlog(false),
393 printt0(false),
394 printrt(false),
395 usep0(false),
396 floatp3(false),
397 useshortstraws(true),
398
399 m_name(nme),
400 m_rtbinning(rtb),
401 m_minrtstat(minrt),
402 m_mint0stat(mint0),
403 m_t0shift(t0sft),
404
405 m_nbinsr(100),
406 m_nbinst(55),
407 m_nbinstres(100),
408 m_nbinsres(100),
409 m_minr(0),
410 m_maxr(2),
411 m_mint(-5),
412 m_maxt(50),
413 m_mintres(-10),
414 m_maxtres(10),
415 m_minres(-0.6),
416 m_maxres(0.6),
417
418 m_ntreshits(0),
419 m_nreshits(0),
420 m_nrthits(0),
421 m_nhits(0),
422
423 m_isdines ( rtr.find("dines")!=std::string::npos)
424{
425 level=lev;
426 selection.insert(-3);
427}
428
431
432int Calibrator::Simple1dHist(float min, float max, int nbins, float value){
433 if ( (value<min) || (value>max) ) return -1;
434 if ( max-min == 0 ) return -1;
435 int binno=(int)(nbins*((value-min)/(max-min)));
436 return binno;
437}
438
439int Calibrator::Simple2dHist(float minx, float maxx, int nbinsx, float miny, float maxy, int nbinsy, float valuex, float valuey){
440 if ( (valuex<minx) || (valuex>maxx) || (valuey<miny) || (valuey>maxy) ) return -1;
441 if(maxx-minx == 0 || maxy-miny==0) return -1;
442 int binnox=(int)(nbinsx*((valuex-minx)/(maxx-minx)));
443 int binnoy=(int)(nbinsy*((valuey-miny)/(maxy-miny)));
444 return binnoy*nbinsx+binnox;
445}
446
447float Calibrator::AccumulativeMean(float n, float oldmean, float newvalue){
448 if((int)n==0) return oldmean;
449 return oldmean*((n-1)/n)+newvalue/n;
450}
451
452bool Calibrator::HasKey(const std::string &key) const {
453
454 return data.find(key) != data.end();
455}
456
458 if (selection.find(level)!=selection.end() || selection.find(-3)!=selection.end()) return true;
459 else return false;
460}
461
463 if (selection.find(-4)!=selection.end()) return true;
464 else return false;
465}
466
468 std::string yn[2]={"NO","YES"};
469 std::string info = std::string(Form("CONFIGURATION %-16s: dort=%-3s, dot0=%-3s, dores=%-3s, selection=",m_name.data(),yn[dort].data(),yn[dot0].data(),yn[dores].data()));
470 for (int isel : selection) {
471 if (isel==-3) info += std::string("all");
472 else if (isel==-4) info += std::string("none");
473 else info += std::string(Form("%2i,",isel));
474 }
475 return info;
476}
477
479 int units = (int)data.size();
480 if(units==0) units++;
481 std::string info = std::string(Form("STATISTICS %16s: nunits=%8i, nhits=%9i, hits/unit=%11.1f", m_name.data(), units, m_nhits, (float)m_nhits/(float)units ));
482 return info;
483}
484
485std::string Calibrator::GetOptString() const {
486 std::string optstr="";
487 if (dort) optstr += 'R';
488 if (dot0) optstr += 'T';
489 if (printlog) optstr +='P';
490 if (printt0) optstr += 'F';
491 if (printrt) optstr += 'G';
492 if (bequiet) optstr += 'Q';
493 if (usebref) optstr += 'B';
494 if (useshortstraws) optstr += 'S';
495 if (usep0 && dort) optstr += '0';
496 if (floatp3 && dort) optstr += '3';
497 if (!(dort || dot0 || usebref || bequiet || printlog || printt0 || printrt)) optstr += 'N';
498
499 return optstr;
500}
501
503 return data.size();
504}
505
507 std::string selstr="";
508 if (selection.find(-3)!=selection.end()) selstr="*";
509 else if (selection.find(-4)!=selection.end()) selstr="-";
510 else for (int isel : selection) selstr += std::string(Form("%i",isel));
511 return selstr;
512}
513
514std::string Calibrator::GetBinnedRt(const std::string& key){
515
516 int nbins=data[key].rtgraph->tval.size();
517 double maxt=data[key].rtgraph->tval[nbins-1];
518 double mint=data[key].rtgraph->tval[0];
519
520 std::string brt = "";
521 brt += Form("%f %f %i ",mint,maxt,nbins);
522
523 for (int ip=0; ip<nbins;ip++){
524 brt += Form("%f ",data[key].rtgraph->rval[ip]);
525 }
526 return brt;
527}
528
530
531 std::string line;
532 std::ifstream oldconstfile("calib_constants_in.txt");
533 std::string key;
534 float t0;
535
536 if (oldconstfile.is_open())
537 {
538 while (!oldconstfile.eof() )
539 {
540 oldconstfile >> key >> t0;
541 if (data.find(key) != data.end()){
542 std::cout << "UPDATED OLD T0: " << key << " " << data[key].oldt02 << " -> " << t0 << std::endl;
543 data[key].oldt02=t0;
544 }
545 }
546 oldconstfile.close();
547 return 0;
548 }
549 else {
550 std::cout << "NO OLD T0S FILE FOUND. USING AVERAGE VALUES!" << std::endl;
551 return -1;
552 }
553}
554
555float Calibrator::FitRt ATLAS_NOT_THREAD_SAFE (const std::string& key, const std::string& opt, TH2F* rtHist, TDirectory* dir){ // Global gStyle is used.
556
557 float rtpars[4];
558
559 //create r-m_t and m_t-r graphs
560 RtGraph* rtg = m_rtbinning.find('t')==std::string::npos ? new RtGraph(rtHist,1,std::string("abs(rtrack)").data(),!bequiet,dir) : new RtGraph(rtHist,0,std::string("t-t0").data(),!bequiet,dir);
561
562 TF1 dtfitfunc("dtfitfunc","gaus(0)");
563
564 gStyle->SetOptFit(1111);
565 gStyle->SetPalette(1);
566
567 // select type of R-m_t relation
568 TF1 *trfunc,*rtfunc,*oldrtfunc;
569 if (m_isdines){
570 trfunc = new TF1("trfunc",trrel_dines,0,3,4);
571 rtfunc = new TF1("rtfunc",rtrel_dines,rtg->mintime,200,4);
572 oldrtfunc = new TF1("oldrtfunc",rtrel_dines,rtg->mintime,200,4);
573 trfunc->SetParameters(0.3, 1.0, 0.05, -3.);
574 double rmin0Limits[2]={0.0,2.0};
575 double rhoLimits[2]={0.0,10.};
576 double vLimits[2]={0.0,1.0};
577 trfunc->SetParLimits(0,rmin0Limits[0],rmin0Limits[1]);
578 trfunc->SetParLimits(1,rhoLimits[0],rhoLimits[1]);
579 trfunc->SetParLimits(2,vLimits[0],vLimits[1]);
580 rtg->trgr->SetTitle("Dines' R-t sqrt(..)");
581 }
582 else {
583 trfunc = new TF1("trfunc",pol3deg,0,3,4);
584 rtfunc = new TF1("rtfunc",pol3deg,rtg->mintime,200,4);
585 oldrtfunc = new TF1("oldrtfunc",pol3deg,rtg->mintime,200,4);
586 trfunc->SetParameters(0.0, 0.0, 0.0, 0.0);
587 rtg->trgr->SetTitle("Polynomial R-t");
588 }
589
590 // m_t-r relation
591 trfunc->SetRange(0,2);
592 if (opt.find('3')==std::string::npos) trfunc->FixParameter(3,0);
593 trfunc->SetLineColor(4) ;
594 rtg->trgr->Fit(trfunc,"QR"); // always fit the m_t-r relation
595 if (!bequiet) rtg->trgr->Write();
596
597
598 // r-m_t relation
599 rtfunc->SetRange(0,45);
600 if (opt.find('3')==std::string::npos) rtfunc->FixParameter(3,0);
601 rtfunc->SetLineColor(4) ;
602 if (m_isdines) {
603 rtfunc->SetParameters(trfunc->GetParameter(0),trfunc->GetParameter(1),trfunc->GetParameter(2),trfunc->GetParameter(3));
604
605 }
606 else { // else do a fit
607 rtfunc->SetParameters(0.000000e+00, 6.269950e-02, -3.370054e-04, -1.244642e-07);
608 if(rtg->rtgr != nullptr) {
609 rtg->rtgr->Fit(rtfunc,"QR"); //fit Rt first time
610 for (int ipnt=0; ipnt<rtg->rtgr->GetN(); ipnt++){ //calculate m_t-error
611 float deriv = rtfunc->Derivative(rtg->rtgr->GetX()[ipnt]);
612 if(fabs(deriv)<1.0e-24) deriv=0.05;
613 rtg->rtgr->SetPointError(ipnt , rtg->rtgr->GetEY()[ipnt]/deriv , rtg->rtgr->GetEY()[ipnt]);
614 }
615 rtg->rtgr->Fit(rtfunc,"R"); //fit again
616 }
617
618 }
619 if (!bequiet and (rtg->rtgr != nullptr)) rtg->rtgr->Write();
620
621 // old r-m_t relation
622 oldrtfunc->SetRange(0,45);
623 oldrtfunc->SetLineColor(1) ;
624 oldrtfunc->SetLineStyle(2) ;
625 oldrtfunc->SetLineWidth(1) ;
626 oldrtfunc->SetParameters(data[key].oldrtpar[0],data[key].oldrtpar[1],data[key].oldrtpar[2],data[key].oldrtpar[3]);
627
628 if (!bequiet) oldrtfunc->Write();
629
630 rtpars[0] = rtfunc->GetParameter(0);
631 rtpars[1] = rtfunc->GetParameter(1);
632 rtpars[2] = rtfunc->GetParameter(2);
633 rtpars[3] = rtfunc->GetParameter(3);
634
635 //get the t0 from the tr relation
636 float tdrift = 20;
637
638 if (!m_isdines) {
639 float rdrift = 0.0;
640 int ntries = 0;
641 float precision = 0.0001;
642 int maxtries = 500;
643 float drdt;
644 float driftradius = rtpars[0]+tdrift*(rtpars[1]+tdrift*(rtpars[2]));
645 float residual = std::abs(rdrift) - driftradius;
646 while (std::abs(residual) > precision) {
647
648 drdt = rtpars[1]+tdrift*(2*rtpars[2]);
649 if(fabs(drdt)<1.0e-24) drdt=0.05;
650 tdrift = tdrift + residual/drdt;
651
652 driftradius = rtpars[0]+tdrift*(rtpars[1]+tdrift*(rtpars[2]));
653 residual = rdrift - driftradius;
654
655 ntries = ntries + 1;
656 if (ntries>maxtries){
657 break;
658 }
659 }
660 }
661
662 if (opt.find('0')==std::string::npos) {
663 if (m_isdines){
664 data[key].rtpar[0] = rtpars[0];
665 data[key].rtpar[1] = rtpars[1];
666 data[key].rtpar[2] = rtpars[2];
667 data[key].rtpar[3] = 0;
668 } else {
669 data[key].rtpar[0] = 0;
670 data[key].rtpar[1] = rtpars[1] + 2*tdrift*rtpars[2] + 3*tdrift*tdrift*rtpars[3];
671 data[key].rtpar[2] = rtpars[2] + 3*tdrift*rtpars[3];
672 data[key].rtpar[3] = rtpars[3];
673 }
674 }
675 else {
676 data[key].rtpar[0] = rtpars[0];
677 data[key].rtpar[1] = rtpars[1];
678 data[key].rtpar[2] = rtpars[2];
679 data[key].rtpar[3] = rtpars[3];
680 }
681
682 data[key].rtgraph=rtg;
683
684 delete rtfunc;
685 delete oldrtfunc;
686 delete trfunc;
687
688 return 0.0;
689}
690
691
692float Calibrator::FitTimeResidual ATLAS_NOT_THREAD_SAFE (const std::string& key, TH1F* tresHist){ // Global gStyle is used.
693
694 float mean = tresHist->GetMean();
695 float rms = tresHist->GetRMS();
696 float val,maxval=0;
697 int maxbin=1;
698 for (int j=1; j<=tresHist->GetNbinsX()+1;j++){
699 val=tresHist->GetBinContent(j);
700 if (val>maxval){
701 maxval=val;
702 maxbin=j;
703 }
704 }
705
706
707 data[key].tresMean = 0;
708 float fitmean=tresHist->GetBinCenter(maxbin);
709 if (std::abs(fitmean)>5.0){
710 data[key].tresMean = mean;
711 data[key].t0err = rms;
712 data[key].t0fittype = 1;
713 return mean;
714 }
715
716 float fitrms=rms;
717 if (fitrms>5.0) fitrms=5.0;
718
719 tresHist->Fit("gaus","QR","",mean-rms,mean+rms);
720 if (tresHist->GetFunction("gaus")->GetParameter(1) - tresHist->GetFunction("gaus")->GetParameter(2) < m_mintres ||
721 tresHist->GetFunction("gaus")->GetParameter(1) + tresHist->GetFunction("gaus")->GetParameter(2) > m_maxtres) {
722 data[key].tresMean = mean;
723 data[key].t0err = rms;
724 data[key].t0fittype = 1;
725 return mean;
726 }
727
728 tresHist->Fit("gaus","QR","",tresHist->GetFunction("gaus")->GetParameter(1) - tresHist->GetFunction("gaus")->GetParameter(2),tresHist->GetFunction("gaus")->GetParameter(1) + tresHist->GetFunction("gaus")->GetParameter(2));
729 if (tresHist->GetFunction("gaus")->GetParameter(1) - tresHist->GetFunction("gaus")->GetParameter(2) < m_mintres ||
730 tresHist->GetFunction("gaus")->GetParameter(1) + tresHist->GetFunction("gaus")->GetParameter(2) > m_maxtres) {
731 data[key].tres = tresHist->GetFunction("gaus")->GetParameter(2);
732 data[key].tresMean = tresHist->GetFunction("gaus")->GetParameter(1);
733 data[key].t0err = tresHist->GetFunction("gaus")->GetParError(1);
734 data[key].t0fittype = 2;
735 return tresHist->GetFunction("gaus")->GetParameter(1);
736 }
737
738 tresHist->Fit("gaus","QR","",tresHist->GetFunction("gaus")->GetParameter(1) - tresHist->GetFunction("gaus")->GetParameter(2),tresHist->GetFunction("gaus")->GetParameter(1) + tresHist->GetFunction("gaus")->GetParameter(2));
739 if (tresHist->GetFunction("gaus")->GetParameter(1) - tresHist->GetFunction("gaus")->GetParameter(2) < m_mintres ||
740 tresHist->GetFunction("gaus")->GetParameter(1) + tresHist->GetFunction("gaus")->GetParameter(2) > m_maxtres) {
741 data[key].tres = tresHist->GetFunction("gaus")->GetParameter(2);
742 data[key].tresMean = tresHist->GetFunction("gaus")->GetParameter(1);
743 data[key].t0err = tresHist->GetFunction("gaus")->GetParError(1);
744 data[key].t0fittype = 2;
745 return tresHist->GetFunction("gaus")->GetParameter(1);
746 }
747
748 tresHist->Fit("gaus","QR","",tresHist->GetFunction("gaus")->GetParameter(1) - tresHist->GetFunction("gaus")->GetParameter(2),tresHist->GetFunction("gaus")->GetParameter(1) + tresHist->GetFunction("gaus")->GetParameter(2));
749 if (tresHist->GetFunction("gaus")->GetParameter(1) - tresHist->GetFunction("gaus")->GetParameter(2) < m_mintres ||
750 tresHist->GetFunction("gaus")->GetParameter(1) + tresHist->GetFunction("gaus")->GetParameter(2) > m_maxtres) {
751 data[key].tresMean = mean;
752 data[key].t0err = rms;
753 data[key].t0fittype = 1;
754 return mean;
755 }
756
757 data[key].tres = tresHist->GetFunction("gaus")->GetParameter(2);
758 data[key].tresMean = tresHist->GetFunction("gaus")->GetParameter(1);
759 data[key].t0err = tresHist->GetFunction("gaus")->GetParError(1);
760 data[key].t0fittype = 2;
761
762 // protection against wrong fits:
763 if ( std::abs(tresHist->GetFunction("gaus")->GetParameter(2))>10 || std::abs(tresHist->GetFunction("gaus")->GetParameter(1))>10 ) {
764
765 data[key].tres = tresHist->GetRMS();
766 data[key].tresMean = tresHist->GetMean();
767 data[key].t0err = tresHist->GetRMS();
768 data[key].t0fittype = 6;
769 return tresHist->GetMean();
770 }
771
772
773 gStyle->SetOptFit(1111);
774
775 return tresHist->GetFunction("gaus")->GetParameter(1);
776 }
777
778
779float Calibrator::FitResidual ATLAS_NOT_THREAD_SAFE (const std::string& key, TH1F* resHist){ // Global gStyle is used.
780
781 float mean = resHist->GetMean();
782
783 resHist->Fit("gaus","QRI","",mean-0.3,mean+0.3);
784 resHist->Fit("gaus","QRI","",resHist->GetFunction("gaus")->GetParameter(1) - 1.5*resHist->GetFunction("gaus")->GetParameter(2),resHist->GetFunction("gaus")->GetParameter(1) + 1.5*resHist->GetFunction("gaus")->GetParameter(2));
785 resHist->Fit("gaus","QRI","",resHist->GetFunction("gaus")->GetParameter(1) - 1.5*resHist->GetFunction("gaus")->GetParameter(2),resHist->GetFunction("gaus")->GetParameter(1) + 1.5*resHist->GetFunction("gaus")->GetParameter(2));
786 resHist->Fit("gaus","QRI","",resHist->GetFunction("gaus")->GetParameter(1) - 1.5*resHist->GetFunction("gaus")->GetParameter(2),resHist->GetFunction("gaus")->GetParameter(1) + 1.5*resHist->GetFunction("gaus")->GetParameter(2));
787
788 gStyle->SetOptFit(1111);
789
790 data[key].res=resHist->GetFunction("gaus")->GetParameter(2);
791 data[key].resMean=resHist->GetFunction("gaus")->GetParameter(1);
792 data[key].reserr=resHist->GetFunction("gaus")->GetParError(2);
793
794 return resHist->GetFunction("gaus")->GetParameter(2);
795
796}
797
798TDirectory* Calibrator::Calibrate ATLAS_NOT_THREAD_SAFE (TDirectory* dir, std::string key, const std::string& opt, caldata * caldata_above){ // Thread unsafe FitResidual, FitRt, FitTimeResidual are used.
799
800 //set some bool flags
801 bool calrt=opt.find('R')!=std::string::npos;
802 bool calt0=opt.find('T')!=std::string::npos;
803 bool donothing=opt.find('N')!=std::string::npos;
804 bool prnt=opt.find('P')!=std::string::npos;
805 bool useref=opt.find('B')!=std::string::npos;
806 bool useshortstw=opt.find('S')!=std::string::npos;
807
808 if (donothing) return dir;
809
810 data[key].calflag=true;
811
812 bool enough_t0 = data[key].ntres>=m_mint0stat;
813 bool enough_rt = data[key].nrt>=m_minrtstat;
814
815 if ((enough_rt && calrt) || (enough_t0 && calt0)) {
816 m_hdirs[key] = dir->mkdir(Form("%s%s",m_name.data(),key.data()));
817 m_hdirs[key]->cd();
818 if(level<2) {
819 std::cout << " Calibrator::Calibrate Parent Directory: " << std::string(dir->GetPath()) << std::endl;
820 std::cout << " Calibrator::Calibrate key " << key << " name " << m_name << " entries for rt " << data[key].nrt << " min req " << m_minrtstat << std::endl;
821 std::cout << " Calibrator::Calibrate key " << key << " entries for t0 " << data[key].ntres << " min req " << m_mint0stat << std::endl;
822 std::cout << " Calibrator::Calibrate Directory: " << std::string(m_hdirs[key]->GetPath()) << std::endl;
823 }
824 }
825 else m_hdirs[key]=dir;
826
827 //Fit also the residual if an rt or t0 calibration is made
828 if ((enough_rt && calrt) || (enough_t0 && calt0)) {
829
830 m_resHists[key] = new TH1F("residual","residual",m_nbinsres,m_minres,m_maxres);
831 int ncont=0;
832 for (int i=0;i<100;i++) {
833 m_resHists[key]->SetBinContent(i+1,data[key].reshist[i]);
834 ncont+=data[key].reshist[i];
835 }
836 m_resHists[key]->SetEntries((int)data[key].nres);
837 if (bequiet) m_resHists[key]->SetDirectory(nullptr);
838 if(ncont==0) {
839 std::cout << " No bin content " << std::endl;
840 } else {
841 FitResidual(key,m_resHists[key]);
842 }
843
844 }
845
846
847 if (prnt) printf("Calibrator::calibrate %8s %-14s: \n",m_name.data(),key.data());
848
849 //Calibrate r-m_t
850 if (nort){
851 //use old data
852 //std::cout << " use old data " << std::endl;
853 data[key].rtflag=true;
854 data[key].rtt0=caldata_above->rtt0;
855 data[key].rtgraph=caldata_above->rtgraph;
856 for (int i=0;i<4;i++) data[key].rtpar[i]=data[key].oldrtpar[i];
857 if (prnt) printf("RT << %7i (%8.1e) %8.1e %8.1e %8.1e, %3.2f : ", data[key].nrt,data[key].rtpar[0],data[key].rtpar[1],data[key].rtpar[2],data[key].rtpar[3], data[key].rtt0);
858 }
859 else{
860 //do fit
861 if ((calrt && enough_rt) || level==0) {
862 data[key].rtflag=true;
863 m_rtHists[key] = new TH2F("rt-relation","rt-relation",m_nbinst,m_mint,m_maxt,m_nbinsr,m_minr,m_maxr); //make a root histogram
864 for (int i=0;i<m_nbinst;i++) {
865 for (int j=0;j<m_nbinsr;j++) {
866 m_rtHists[key]->SetBinContent(i+1,j+1,data[key].rthist[i+m_nbinst*j]);
867 }
868 }
869 m_rtHists[key]->SetEntries(data[key].nrt);
870 if(level<2) std::cout << " Calibrator::calibrate do rt fit for key " << key << " with number of entries " << m_rtHists[key]->GetEntries() << std::endl;
871 if (bequiet) {
872 m_rtHists[key]->SetDirectory(nullptr);
873 if(level<2) std::cout << " remove this level from calout.root file " << std::endl;
874 }
875 data[key].rtt0=FitRt(key,opt,m_rtHists[key],m_hdirs[key]); //do the fit
876 if (prnt) printf("RT %7i (%8.1e) %8.1e %8.1e %8.1e, %3.2f : ", data[key].nrt, data[key].rtpar[0], data[key].rtpar[1], data[key].rtpar[2], data[key]. rtpar[3], data[key].rtt0);
877 }
878 else{
879 //use data from level above
880 data[key].rtgraph=caldata_above->rtgraph;
881 data[key].rtt0=caldata_above->rtt0;
882 for (int i=0;i<4;i++) data[key].rtpar[i]=caldata_above->rtpar[i];
883 if (prnt) printf("RT /\\ %7i (%8.1e) %8.1e %8.1e %8.1e, %3.2f : ", data[key].nrt,data[key].rtpar[0],data[key].rtpar[1],data[key].rtpar[2],data[key].rtpar[3], data[key].rtt0);
884 }
885 }
886
887
888 //Calibrate t0
889 if (not0){
890 //use old data
891 //std::cout << " use old data for T0 " std::endl;
892 data[key].t0flag=true;
893 data[key].t0=data[key].oldt02 + data[key].rtt0;
894 data[key].t0err=0;
895 data[key].t0off=0;
896 data[key].t0fittype = 5;
897 if (prnt) printf("T0 << %7i %05.2f%+05.2f%+05.2f=%05.2f \n", data[key].ntres, data[key].oldt02, 0.0, data[key].rtt0, data[key].t0);
898 }
899 else{
900 if (useref && level==5){
901 //use chip reference values
902 //std::cout << " use chip reference for T0 " << std::endl;
903 data[key].t0flag=true;
904 data[key].t0=caldata_above->t0 + data[key].reft0 + data[key].rtt0;
905 data[key].t0err=caldata_above->t0err;
906 data[key].t0off=data[key].t0-caldata_above->t0;
907 data[key].t0fittype = 3;
908 if (prnt) printf("T0 ** %7i %05.2f%+05.2f%+05.2f=%05.2f \n", data[key].ntres, caldata_above->t0, data[key].reft0, data[key].rtt0, data[key].t0);
909 }
910 else {
911 //do fit
912 if ((calt0 && enough_t0) || level==0) {
913 data[key].t0flag=true;
914 m_tresHists[key] = new TH1F("timeresidual","time residual",m_nbinstres,m_mintres,m_maxtres); //make a root histogram
915
916 for (int i=0;i<100;i++) {
917 m_tresHists[key]->SetBinContent(i+1,data[key].m_treshist[i]);
918 }
919 m_tresHists[key]->SetEntries(data[key].ntres);
920 if(level<2) std::cout << " Calibrator::calibrate do t0 fit for key " << key << " Numb. entries " << m_rtHists[key]->GetEntries() << std::endl;
921 if (bequiet) {
922 if(level<2) std::cout << " Calibrator::calibrate: remove this level from calibout.root " << std::endl;
923 m_tresHists[key]->SetDirectory(nullptr);
924 }
925
926 data[key].t0=data[key].oldt02 + FitTimeResidual(key,m_tresHists[key]) + data[key].rtt0 + m_t0shift; //do the fit and modify t0
927 data[key].t0off=data[key].t0-caldata_above->t0; //calculate t0 offset from level above
928 if (data[key].t0<0) data[key].t0=0;
929
930 if (prnt) printf("T0 %7i %05.2f%+05.2f%+05.2f%+05.2f=%05.2f \n", data[key].ntres, data[key].oldt02, data[key].t0-data[key].oldt02-data[key].rtt0, data[key].rtt0, m_t0shift, data[key].t0);
931
932
933 }
934 //use data from level above
935 else {
936 //std::cout << " use data from the level above " << std::endl;
937 //TEMP FIX to not destroy right T0s
938 if (data[key].oldt02 + (caldata_above->t0 - caldata_above->oldt02) >0) data[key].t0=data[key].oldt02 + (caldata_above->t0 - caldata_above->oldt02);
939 else data[key].t0= 0;
940 //TEMP FIX to not destroy right T0s
941
942 //add the short straw correction here. In this way, the shift is only done when contants at STRAW level come from level above.
943 if ((level == 6 && useshortstw) && std::abs(data[key].det)<2 && (data[key].lay==0 && data[key].stl<9) ) data[key].t0=caldata_above->t0-0.75;
944 data[key].t0err=caldata_above->t0err;
945 data[key].t0off=data[key].t0-caldata_above->t0 + data[key].rtt0;
946 data[key].t0fittype = 4;
947 if (prnt) printf("T0 /\\ %7i %05.2f%+05.2f%+05.2f=%05.2f \n", data[key].ntres, caldata_above->t0, caldata_above->oldt02, data[key].oldt02 , data[key].t0);
948 }
949 }
950 }
951
952
953 if (prnt && !bequiet) std::cout << " H";
954
955 if (prnt) std::cout << std::endl;
956
957 return m_hdirs[key];
958
959}
960
961
962int Calibrator::AddHit(const std::string& key, const databundle & d, int* binhist, bool makehist){
963
964 int tresbin=Simple1dHist(m_mintres,m_maxtres,m_nbinstres,d.tres);
965 int resbin=Simple1dHist(m_minres,m_maxres,m_nbinsres,d.res);
967 int npop;
968 int ibin;
969 int value;
970
971 //if the it is the first hit or histogram
972 if (data.find(key) == data.end()){
973
974 //create a new histogram object
975 caldata* hist=new caldata(makehist,m_nbinst,m_nbinsr);
976
977 //out of memory?
978 if (hist == nullptr){
979 std::cout << "OUT OF MEMORY!" << std::endl;
980 return -1;
981 }
982
983 hist->ntres=0;
984 hist->nres=0;
985 hist->nrt=0;
986 hist->sumt0=0;
987
988 //zero histogram bins
989 for (int i=0;i<m_nbinsr*m_nbinst+200;i++) {
990 if (makehist) hist->rthist[i]=0;
991 if (i<100) {
992 if (makehist) hist->m_treshist[i]=0;
993 if (makehist) hist->reshist[i]=0;
994 }
995 }
996
997 if (binhist==nullptr){ //if it is a hit
998
999 if (tresbin>=0){
1000 if (makehist) hist->m_treshist[tresbin]=d.weight; //add value to bin
1001 hist->ntres=1; //set bin content to 1
1002 m_nhits=1;
1003 }
1004 if (resbin>=0){
1005 if (makehist) hist->reshist[resbin]=1;
1006 hist->nres=1;
1007 }
1008 if (rtbin>=0){
1009 if (makehist) hist->rthist[rtbin]=1;
1010 hist->nrt=1;
1011 }
1012
1013 hist->sumt0=d.t0;
1014 }
1015 else { //if it is a histogram
1016
1017 npop=binhist[0]; //the number of populated (non-zero) bins
1018 if(level<2) std::cout << " Calibrator::AddHit called for key " << key << " add histogram with "<< npop << " non-zero bins " << std::endl;
1019
1020 for(int ipop=2;ipop<2*npop+2;ipop=ipop+2) { //loop over the data
1021
1022 ibin=binhist[ipop]; //bin number
1023 value=binhist[ipop+1]; //value
1024
1025 if (ibin<100) { //timeresidual histogram
1026 m_ntreshits+=value;
1027 hist->ntres+=value;
1028 m_nhits+=value;
1029 if (makehist) hist->m_treshist[ibin]=(float)value;
1030 hist->sumt0+=d.t0*value;
1031 }
1032 else if (ibin>=100 && ibin<200) { //residual histogram
1033 m_nreshits+=value;
1034 hist->nres+=value;
1035 if (makehist) hist->reshist[ibin-100]=(float)value;
1036 }
1037 else { //rt histogram
1038 m_nrthits+=value;
1039 hist->nrt+=value;
1040 if (makehist) hist->rthist[ibin-200]=(float)value;
1041 }
1042
1043 }
1044 }
1045
1046 //initialize parameters
1047 if (level>0) hist->det=d.det; else hist->det=-3; //
1048 if (level>1) hist->lay=d.lay; else hist->lay=-3;
1049 if (level>2) hist->mod=d.mod; else hist->mod=-3;
1050 if (level>3) hist->brd=d.brd; else hist->brd=-3;
1051 if (level>4) hist->chp=d.chp; else hist->chp=-3;
1052 if (level>5) hist->stw=d.stw; else hist->stw=-3;
1053 if (level>2) hist->stl=d.stl; else hist->stl=-3;
1054 if (level>5) hist->sid=d.sid; else hist->sid=-3;
1055 hist->res=0;
1056 hist->resMean=0;
1057 hist->reserr=0;
1058 hist->tres=0;
1059 hist->tresMean=0;
1060 hist->t0=0;
1061 if (level==5) hist->reft0=d.rt0; else hist->reft0=0;
1062 hist->t0off=0;
1063 hist->t0err=0;
1064 hist->nhits=1;
1065 hist->t0fittype=0;
1066
1067 hist->x=d.x; //straw x coordinate
1068 hist->y=d.y; //straw y coordinate
1069 hist->z=d.z; //straw z coordinate
1070
1071 hist->oldt02=d.t0; //straw old t0 value
1072 hist->oldrtpar[0]=d.rtpar[0];
1073 hist->oldrtpar[1]=d.rtpar[1];
1074 hist->oldrtpar[2]=d.rtpar[2];
1075 hist->oldrtpar[3]=d.rtpar[3];
1076
1077 hist->sumx=0;
1078 hist->sumy=0;
1079 hist->sumz=0;
1080
1081 hist->rtflag=false;
1082 hist->t0flag=false;
1083 hist->calflag=false;
1084
1085
1086
1087 for (unsigned int i =0; i < 4; i++){
1088 hist->rtpar[i]=-10.0;
1089 }
1090
1091 data[key]=*hist; //save the histogram in the map
1092
1093
1094
1095 data[key].oldt02 = AccumulativeMean(data[key].nhits, data[key].oldt02, d.t0); //update old t0 m_mean value
1096
1097 data[key].nhits++; // increment m_nhits
1098
1099 if(level<2) std::cout << " First hit for det " << data[key].det << " lay " << data[key].lay << " t0 " << data[key].t0 << " upd t0 " << data[key].oldt02 << " nhits: " << data[key].nhits << std::endl;
1100
1101 delete hist;
1102
1103 return 1;
1104}
1105 else { //if not the first hit or histogram
1106
1107 //increment histogram bins
1108 if (binhist==nullptr){
1109
1110 if (tresbin>=0){
1111 if (makehist) data[key].m_treshist[tresbin]=data[key].m_treshist[tresbin]+d.weight;
1112 data[key].ntres++;
1113 m_nhits=1;
1114 }
1115 if (resbin>=0){
1116 if (makehist) data[key].reshist[resbin]++;
1117 data[key].nres++;
1118 }
1119 if (rtbin>=0){
1120 if (makehist) data[key].rthist[rtbin]++;
1121 data[key].nrt++;
1122 }
1123
1124 data[key].sumt0+=d.t0;
1125
1126 }
1127
1128 else {
1129
1130 npop=binhist[0];
1131
1132 for(int ipop=2;ipop<2*npop+2;ipop=ipop+2) {
1133
1134 ibin=binhist[ipop];
1135 value=binhist[ipop+1];
1136
1137 if (ibin<100) {
1138 m_ntreshits+=value;
1139 m_nhits+=value;
1140 data[key].ntres+=value;
1141 if (makehist) data[key].m_treshist[ibin]+=(float)value;
1142 data[key].sumt0+=d.t0*value;
1143 }
1144 else if (ibin>=100 && ibin<200) {
1145 m_nreshits+=value;
1146 data[key].nres+=value;
1147 if (makehist) data[key].reshist[ibin-100]+=(float)value;
1148 }
1149 else {
1150 m_nrthits+=value;
1151 data[key].nrt+=value;
1152 if (makehist) data[key].rthist[ibin-200]+=(float)value;
1153 }
1154
1155 }
1156
1157 }
1158
1159
1160 data[key].sumx+=d.x;
1161 data[key].sumy+=d.y;
1162 data[key].sumz+=d.z;
1163 data[key].oldt02 = AccumulativeMean(data[key].nhits, data[key].oldt02, d.t0);
1164 data[key].oldrtpar[0] = AccumulativeMean(data[key].nhits, data[key].oldrtpar[0], d.rtpar[0]);
1165 data[key].oldrtpar[1] = AccumulativeMean(data[key].nhits, data[key].oldrtpar[1], d.rtpar[1]);
1166 data[key].oldrtpar[2] = AccumulativeMean(data[key].nhits, data[key].oldrtpar[2], d.rtpar[2]);
1167 data[key].oldrtpar[3] = AccumulativeMean(data[key].nhits, data[key].oldrtpar[3], d.rtpar[3]);
1168 data[key].x = AccumulativeMean(data[key].nhits, data[key].x, d.x);
1169 data[key].y = AccumulativeMean(data[key].nhits, data[key].y, d.y);
1170 data[key].z = AccumulativeMean(data[key].nhits, data[key].z, d.z);
1171
1172 data[key].nhits++; //increment hit counts
1173
1174 return 0;
1175 }
1176
1177
1178}
1179
1180void Calibrator::WriteStat(TDirectory* dir){
1181 dir->cd();
1182 TNtuple* stattup = new TNtuple(Form("%stuple",m_name.data()),"statistics","det:lay:mod:brd:chp:sid:stl:stw:rtflag:t0flag:t0:oldt0:rt0:dt0:t0offset:ftype:nhits:nt0:nrt:res:resMean:dres:tres:tresMean:x:y:z");
1183 for(std::map<std::string,caldata>::iterator ihist=data.begin(); ihist!=data.end(); ++ihist){
1184 if ((ihist->second).calflag) {
1185 //std::cout << " Writing TNtuple for name: " << m_name << " det: " << (ihist->second).det << " lay " << (ihist->second).lay << " mod: " << (ihist->second).mod << " brd " << (ihist->second).brd << " res width " << (ihist->second).res << " tres mean " << (ihist->second).tresMean << std::endl;
1186 float const ntvar[27]={
1187 float((ihist->second).det),
1188 float((ihist->second).lay),
1189 float((ihist->second).mod),
1190 float((ihist->second).brd),
1191 float((ihist->second).chp),
1192 float((ihist->second).sid),
1193 float((ihist->second).stl),
1194 float((ihist->second).stw),
1195 float((int)(ihist->second).rtflag),
1196 float((int)(ihist->second).t0flag),
1197 (ihist->second).t0,
1198 float((ihist->second).oldt02),
1199 //oldt0(ihist->first),
1200 (ihist->second).reft0,
1201 (ihist->second).t0err,
1202 (ihist->second).t0off,
1203 float((ihist->second).t0fittype),
1204 (ihist->second).nhits,
1205 (float)(ihist->second).ntres,
1206 (float)(ihist->second).nrt,
1207 (float)(ihist->second).res,
1208 (float)(ihist->second).resMean,
1209 (ihist->second).reserr,
1210 (ihist->second).tres,
1211 (ihist->second).tresMean,
1212 (ihist->second).x,
1213 (ihist->second).y,
1214 (ihist->second).z
1215 };
1216 stattup->Fill(ntvar);
1217 }
1218
1219 }
1220
1221 stattup->Write();
1222
1223}
1224
1226
1227 std::ofstream dumpfile( "calib_constants_out.txt", std::ios::out | std::ios::app);
1228
1229 for (const std::pair<const std::string, caldata>& p : data) {
1230 dumpfile << p.first << " " << p.second.t0 << " " << std::endl;
1231
1232 }
1233
1234 dumpfile.close();
1235
1236}
double trrel_dines(double *x, double *par)
double pol3deg2(double *x, double *par)
double pol3deg(double *x, double *par)
double rtrel_dines(double *x, double *par)
float reshist[100]
the 1D residual histogram (100 bins)
Definition Calibrator.h:157
float rthist[640]
the 2D rt histogram (20x32 bins)
Definition Calibrator.h:158
std::ofstream dumpfile("dumpfile.log")
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
std::pair< std::vector< unsigned int >, bool > res
static Double_t t0
TGraphErrors * GetEntries(TH2F *histo)
#define y
#define x
#define z
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
Define macros for attributes used to control the static checker.
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
bool Skip()
...
bool not0
if true the old t0 valus is copied to the new one
Definition Calibrator.h:345
bool printrt
if true an rt entry in the calibration output file is prined for each sub-module in this sub-level
Definition Calibrator.h:350
std::set< int > selection
a set containing the sub-modules to be calibrated
Definition Calibrator.h:354
int m_nbinsres
number of bins in the 1D residual histogram
Definition Calibrator.h:367
void DumpConstants()
bool nort
if true the old rt parameters are copied to the new ones
Definition Calibrator.h:344
bool dort
if true an rt fit is made, if false the value from the level above is used
Definition Calibrator.h:341
std::string PrintInfo()
int m_nbinstres
number of bins in the 1D time residual histogram
Definition Calibrator.h:366
bool usep0
if true the 0th order coeficcient of the rt fit function is not set to 0 in the calibration output fi...
Definition Calibrator.h:351
float m_mint
lower limit of t in 2D rt histogram
Definition Calibrator.h:370
int Simple1dHist(float, float, int, float)
A 1D histograming function.
int AddHit(const std::string &, const databundle &, int *, bool)
Adds hits to a sub-module either in the form of a single straw hit or a histogram containing all the ...
std::string GetOptString() const
Creates a string summarizing what is being done at this sub-level.
~Calibrator()
Destructor.
float m_maxt
upper limit of t in 2D rt histogram
Definition Calibrator.h:371
bool floatp3
if true the 3rd order coeficcient of the rt fit function is not fixed to 0
Definition Calibrator.h:352
std::map< std::string, caldata > data
A map between the sub-module identifier string and the calibration data structure (caldata)
Definition Calibrator.h:339
int m_nhits
...
Definition Calibrator.h:384
std::string GetBinnedRt(const std::string &)
bool printlog
if true a log entry is prined for each sub-modile in this sub-level
Definition Calibrator.h:348
bool HasKey(const std::string &) const
...
int m_nrthits
...
Definition Calibrator.h:383
int UpdateOldConstants()
...
int level
the sub-level of the Calibrator instance
Definition Calibrator.h:355
float m_maxres
upper limit of 1D residual histogram
Definition Calibrator.h:375
bool useshortstraws
if true a shift of -0.75 ns is applied for straws in layer ==0, strawlayer < 9, and when doing calibr...
Definition Calibrator.h:353
int m_nbinsr
number of r-bins in the 2D rt histogram
Definition Calibrator.h:364
int m_ntreshits
...
Definition Calibrator.h:381
int m_nreshits
...
Definition Calibrator.h:382
float AccumulativeMean(float, float, float)
Increments a single bin in all three histograms in a sub-module.
int m_minrtstat
minimum number of hits in a sub-module required to do an R-t calibration
Definition Calibrator.h:361
float m_maxtres
upper limit of 1D time residual histogram
Definition Calibrator.h:373
bool dot0
if true a time residual fit is made, if false the value from the level above is used
Definition Calibrator.h:342
int Simple2dHist(float, float, int, float, float, int, float, float)
A 2D histograming function.
float m_t0shift
the t0 shift
Definition Calibrator.h:363
float m_maxr
upper limit of r in 2D rt histogram
Definition Calibrator.h:369
std::string GetSelString()
Creates a string summarizing which modules are being calibrated at this sub-level.
float m_mintres
lower limit of 1D time residual histogram
Definition Calibrator.h:372
std::string m_name
The name of the Calibrator instance.
Definition Calibrator.h:359
void WriteStat(TDirectory *)
Creates an ntuple with entries containing data associated with the sub-modules in a sub level.
int m_nbinst
number of t-bins in the 2D rt histogram
Definition Calibrator.h:365
std::string m_rtbinning
The direction to do the R-t binning.
Definition Calibrator.h:360
int GetNDirs()
...
bool printt0
if true a t0 entry in the calibration output file is prined for each sub-module in this sub-level
Definition Calibrator.h:349
bool bequiet
if true no histograms are written to the root file
Definition Calibrator.h:347
float m_minr
lower limit of r in 2D rt histogram
Definition Calibrator.h:368
std::string PrintStat()
Prints some sub-level statistics.
bool dores
if true a residual fit is made
Definition Calibrator.h:343
float m_minres
lower limit of 1D residual histogram
Definition Calibrator.h:374
bool usebref
if true chip reference t0 values (offset from board mean) are used
Definition Calibrator.h:346
bool m_isdines
true if the rt relation is Dines'
Definition Calibrator.h:388
bool CheckSelection(int)
Checks if a given sub-module is selected for calibration.
int m_mint0stat
minimum number of hits in a sub-module required to do a t0 calibration
Definition Calibrator.h:362
A class for generating a r-t and t-r graphs by binning the 2D histograms in Calibrator::rtHists in r ...
Definition Calibrator.h:34
float * m_rightsig
Definition Calibrator.h:53
TGraphErrors * trgr
the t(r) graph
Definition Calibrator.h:44
bintype * m_btype
Definition Calibrator.h:52
float m_mindistance
Definition Calibrator.h:59
float * m_edv
Definition Calibrator.h:69
float * m_tv
Definition Calibrator.h:66
float * m_leftsig
Definition Calibrator.h:54
float m_et
Definition Calibrator.h:64
std::string m_chname
the histogram name
Definition Calibrator.h:49
float * m_etv
Definition Calibrator.h:68
float * m_rightval
Definition Calibrator.h:57
TGraphErrors * rtgr
the r(t) graph
Definition Calibrator.h:45
float m_d
Definition Calibrator.h:63
int m_ipoint
Definition Calibrator.h:61
std::string m_chtit
the histogram title
Definition Calibrator.h:50
float * m_leftval
Definition Calibrator.h:56
float m_t
Definition Calibrator.h:62
std::vector< double > rval
array of the histograms for all bins
Definition Calibrator.h:42
float m_mean
Definition Calibrator.h:58
RtGraph(TH2F *, int, const char *, bool, TDirectory *)
the constructor
~RtGraph()
the destructor
float m_ed
Definition Calibrator.h:65
int npoints
the number of graph points
Definition Calibrator.h:46
float * m_dv
Definition Calibrator.h:67
std::vector< double > tval
the r values
Definition Calibrator.h:43
float * m_maxval
Definition Calibrator.h:55
float mintime
the minimum t-value
Definition Calibrator.h:47
int * m_maxbin
Definition Calibrator.h:60
A structure to contain data associated with the calibration of a certain sub-module.
Definition Calibrator.h:104
int nrt
number of rt histogram entries
Definition Calibrator.h:118
int lay
layer
Definition Calibrator.h:110
int stw
straw number (within the strawlayer)
Definition Calibrator.h:115
int stl
straw-layer
Definition Calibrator.h:114
int brd
board
Definition Calibrator.h:112
std::vector< float > m_treshist
the 1D time residual histogram (100 bins)
Definition Calibrator.h:145
double sumt0
...
Definition Calibrator.h:138
float reft0
the reference t0 (offset from board mean)
Definition Calibrator.h:128
int det
detector (barrel or end-cap)
Definition Calibrator.h:109
int ntres
number of time residual histogram entries
Definition Calibrator.h:117
float t0
the new t0
Definition Calibrator.h:126
float t0err
the new to error
Definition Calibrator.h:127
float reserr
the residual error
Definition Calibrator.h:123
float y
sub-module y position (average of all straws in the module)
Definition Calibrator.h:135
float rtt0
the t0 fron the R-t fit
Definition Calibrator.h:130
float tres
the time residual
Definition Calibrator.h:124
double sumx
...
Definition Calibrator.h:139
float z
sub-module z position (average of all straws in the module)
Definition Calibrator.h:136
std::vector< float > reshist
the 1D residual histogram (100 bins)
Definition Calibrator.h:146
bool rtflag
flag indicating if an R-t calibration has been made
Definition Calibrator.h:143
bool calflag
flag indicating if any calibration has been made
Definition Calibrator.h:142
double sumy
...
Definition Calibrator.h:140
bool t0flag
flag indicating if a t0 calibration has been made
Definition Calibrator.h:144
int sid
straw ID
Definition Calibrator.h:116
float x
sub-module x position (average of all straws in the module)
Definition Calibrator.h:134
int nres
number of residual histogram entries
Definition Calibrator.h:119
float tresMean
the time residual mean
Definition Calibrator.h:125
RtGraph * rtgraph
the rt graph
Definition Calibrator.h:148
float t0off
the t0 offset from the level below
Definition Calibrator.h:129
float resMean
the residual mean
Definition Calibrator.h:122
std::vector< float > rthist
the 2D rt histogram (20x32 bins)
Definition Calibrator.h:147
std::array< float, 4 > rtpar
the new rt-parameters
Definition Calibrator.h:132
int chp
chip
Definition Calibrator.h:113
int t0fittype
the type of time residual fit that was made
Definition Calibrator.h:120
double oldt02
the old sub-module t0 (average of t0 for all straws in the module)
Definition Calibrator.h:137
float nhits
the number of straws in the sub-module
Definition Calibrator.h:133
float res
the residual
Definition Calibrator.h:121
double sumz
...
Definition Calibrator.h:141
int mod
phi module
Definition Calibrator.h:111
A structure to contain hit data.
Definition Calibrator.h:77
STL class.
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="")
int r
Definition globals.cxx:22
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138
STL namespace.