BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
QtMdcCalib.cxx
Go to the documentation of this file.
2
3#include "GaudiKernel/Bootstrap.h"
4#include "GaudiKernel/IMessageSvc.h"
5#include "GaudiKernel/ISvcLocator.h"
6#include "GaudiKernel/MsgStream.h"
7#include "GaudiKernel/StatusCode.h"
8
9#include <cstring>
10#include <fstream>
11#include <iomanip>
12#include <iostream>
13#include <math.h>
14#include <string>
15
16#include "TF1.h"
17#include "TMinuit.h"
18
19using namespace std;
20
22 m_vdr = 0.03;
23
24 m_nlayer = MdcCalNLayer;
25 m_qtorder = MdcCalQtOrd;
26 m_nbin = MdcCalNQBin;
27 m_innNLay = MdcCalInnNLay;
28}
29
31
33 int bin;
34 for ( int lay = 0; lay < MdcCalNLayer; lay++ )
35 {
36 delete m_hqhit[lay];
37 delete m_grqt[lay];
38 delete m_grqdt[lay];
39 for ( bin = 0; bin < MdcCalQtOrd; bin++ ) { delete m_hqt[lay][bin]; }
40 }
41 delete m_fdQt;
42 delete m_fdQ_T;
43
45}
46
47void QtMdcCalib::initialize( TObjArray* hlist, IMdcGeomSvc* mdcGeomSvc,
48 IMdcCalibFunSvc* mdcFunSvc, IMdcUtilitySvc* mdcUtilitySvc ) {
49 IMessageSvc* msgSvc;
50 Gaudi::svcLocator()->service( "MessageSvc", msgSvc );
51 MsgStream log( msgSvc, "QtMdcCalib" );
52 log << MSG::INFO << "QtMdcCalib::initialize()" << endmsg;
53
54 m_hlist = hlist;
55 m_mdcGeomSvc = mdcGeomSvc;
56 m_mdcFunSvc = mdcFunSvc;
57 m_mdcUtilitySvc = mdcUtilitySvc;
58
59 MdcCalib::initialize( m_hlist, m_mdcGeomSvc, m_mdcFunSvc, m_mdcUtilitySvc );
60
61 int bin;
62 int lay;
63 double qbinw;
64 char hname[200];
65
66 for ( lay = 0; lay < m_nlayer; lay++ )
67 {
68 m_qmin[lay] = m_param.qmin[lay];
69 m_qmax[lay] = m_param.qmax[lay];
70 m_qbinw[lay] = ( m_qmax[lay] - m_qmin[lay] ) / (double)m_nbin;
71 }
72
73 m_fdQt = new TFolder( "fdQt", "fdQt" );
74 m_fdQ_T = new TFolder( "QtPlot", "QtPlot" );
75 m_hlist->Add( m_fdQt );
76 m_hlist->Add( m_fdQ_T );
77
78 for ( lay = 0; lay < m_nlayer; lay++ )
79 {
80 sprintf( hname, "HQ_Layer%02d", lay );
81 m_hqhit[lay] = new TH1F( hname, "", 1500, 0, 3000 );
82 m_fdQt->Add( m_hqhit[lay] );
83
84 sprintf( hname, "HQT_Plot_lay%02d", lay );
85 m_grqt[lay] = new TGraphErrors();
86 m_grqt[lay]->SetName( hname );
87 m_grqt[lay]->SetMarkerStyle( 20 );
88 m_grqt[lay]->SetMarkerColor( 1 );
89 m_fdQ_T->Add( m_grqt[lay] );
90
91 sprintf( hname, "HQdelT_Plot_lay%02d", lay );
92 m_grqdt[lay] = new TGraphErrors();
93 m_grqdt[lay]->SetName( hname );
94 m_grqdt[lay]->SetMarkerStyle( 10 );
95 m_grqdt[lay]->SetMarkerColor( 1 );
96 m_fdQ_T->Add( m_grqdt[lay] );
97
98 for ( bin = 0; bin < m_nbin; bin++ )
99 {
100 sprintf( hname, "HQT_Lay%02d_Bin%02d", lay, bin );
101 m_hqt[lay][bin] = new TH1F( hname, "", 200, -1, 1 );
102 m_fdQt->Add( m_hqt[lay][bin] );
103 }
104 }
105}
106
108 IMessageSvc* msgSvc;
109 Gaudi::svcLocator()->service( "MessageSvc", msgSvc );
110 MsgStream log( msgSvc, "QtMdcCalib" );
111 log << MSG::DEBUG << "QtMdcCalib::fillHist()" << endmsg;
112
113 MdcCalib::fillHist( event );
114
115 // get EsTimeCol
116 bool esCutFg = event->getEsCutFlag();
117 if ( !esCutFg ) return -1;
118
119 int i;
120 int k;
121 int bin;
122 int lay;
123
124 double doca;
125 double dmeas;
126
127 int ntrk;
128 int nhit;
129
130 bool fgHitLay[MdcCalNLayer];
131
132 MdcCalRecTrk* rectrk;
133 MdcCalRecHit* rechit;
134
135 ntrk = event->getNTrk();
136 for ( i = 0; i < ntrk; i++ )
137 {
138 rectrk = event->getRecTrk( i );
139 nhit = rectrk->getNHits();
140
141 // dr cut
142 double dr = rectrk->getDr();
143 if ( fabs( dr ) > m_param.drCut ) continue;
144
145 // dz cut
146 double dz = rectrk->getDz();
147 if ( fabs( dz ) > m_param.dzCut ) continue;
148
149 // momentum cut
150 double p = rectrk->getP();
151 if ( ( fabs( p ) < m_param.pCut[0] ) || ( fabs( p ) > m_param.pCut[1] ) ) continue;
152
153 for ( lay = 0; lay < MdcCalNLayer; lay++ ) fgHitLay[lay] = false;
154 for ( k = 0; k < nhit; k++ )
155 {
156 rechit = rectrk->getRecHit( k );
157 lay = rechit->getLayid();
158 fgHitLay[lay] = true;
159 }
160
161 int nhitlay = 0;
162 for ( lay = 0; lay < MdcCalNLayer; lay++ )
163 if ( fgHitLay[lay] ) nhitlay++;
164 if ( nhitlay < m_param.nHitLayCut ) continue;
165
166 bool fgNoise = rectrk->getFgNoiseRatio();
167 if ( m_param.noiseCut && ( !fgNoise ) ) continue;
168
169 for ( k = 0; k < nhit; k++ )
170 {
171 rechit = rectrk->getRecHit( k );
172 lay = rechit->getLayid();
173 doca = rechit->getDocaInc();
174 dmeas = rechit->getDmeas();
175 m_resi = rechit->getResiInc();
176 m_qhit = rechit->getQhit();
177
178 m_hqhit[lay]->Fill( m_qhit );
179
180 bin = (int)( ( m_qhit - m_qmin[lay] ) / m_qbinw[lay] );
181 if ( ( bin >= 0 ) && ( bin < m_nbin ) ) { m_hqt[lay][bin]->Fill( m_resi ); }
182 }
183 }
184 return 1;
185}
186
188
190 IMessageSvc* msgSvc;
191 Gaudi::svcLocator()->service( "MessageSvc", msgSvc );
192 MsgStream log( msgSvc, "QtMdcCalib" );
193 log << MSG::INFO << "QtMdcCalib::updateConst()" << endmsg;
194
195 MdcCalib::updateConst( calconst );
196
197 int lay;
198 int bin;
199 int ord;
200
201 Stat_t entry;
202 double qtpar;
203 double qbcen;
204 double tw;
205 double deltw;
206 double qterr;
207
208 TF1* funQt = new TF1( "funQt", qtFun, 200, 2000, 2 );
209
210 ofstream fqtlog( "qtlog" );
211 for ( lay = 0; lay < m_nlayer; lay++ )
212 {
213 if ( 0 == m_param.fgCalib[lay] ) continue;
214
215 fqtlog << "Layer" << lay << endl;
216
217 for ( ord = 0; ord < m_qtorder; ord++ )
218 { m_qtpar[lay][ord] = calconst->getQtpar( lay, ord ); }
219
220 for ( bin = 0; bin < m_nbin; bin++ )
221 {
222 entry = m_hqt[lay][bin]->GetEntries();
223
224 if ( entry > 300 )
225 {
226 deltw = m_hqt[lay][bin]->GetMean();
227 qterr = ( m_hqt[lay][bin]->GetRMS() ) / sqrt( (double)entry );
228 deltw /= m_vdr;
229 qterr /= m_vdr;
230 }
231 else { continue; }
232
233 qbcen = ( (double)bin + 0.5 ) * m_qbinw[lay] + m_qmin[lay];
234 // tw = qtFun(qbcen, m_qtpar[lay]) + deltw;
235 tw = ( m_mdcFunSvc->getTimeWalk( lay, qbcen ) ) + deltw;
236
237 m_grqt[lay]->SetPoint( bin, qbcen, tw );
238 m_grqt[lay]->SetPointError( bin, 0, qterr );
239
240 m_grqdt[lay]->SetPoint( bin, qbcen, deltw );
241 m_grqdt[lay]->SetPointError( bin, 0, qterr );
242
243 fqtlog << setw( 3 ) << bin << setw( 12 ) << deltw << setw( 12 ) << tw << setw( 12 )
244 << qbcen << setw( 12 ) << qterr << endl;
245 }
246
247 m_grqt[lay]->Fit( "funQt", "Q+", "", m_qmin[lay], m_qmax[lay] );
248
249 fqtlog << "Qtpar: ";
250 for ( ord = 0; ord < m_qtorder; ord++ )
251 {
252 qtpar = funQt->GetParameter( ord );
253 qterr = funQt->GetParError( ord );
254 calconst->resetQtpar( lay, ord, qtpar );
255
256 fqtlog << setw( 12 ) << qtpar << setw( 12 ) << qterr << endl;
257 }
258
259 // if( (0 == ierflg) && (3 == istat) ){
260 // for(ord=0; ord<m_qtorder; ord++){
261 // gmqt -> GetParameter(ord, qtpar, qterr);
262 // calconst -> resetQtpar(lay, ord, qtpar);
263
264 // fqtlog << setw(12) << qtpar
265 // << setw(12) << qterr
266 // << endl;
267 // }
268 // } else{
269 // fqtlog << setw(12) << m_qtpar[lay][0]
270 // << setw(12) << "0"
271 // << setw(12) << m_qtpar[lay][1]
272 // << setw(12) << "0"
273 // << endl;
274 // }
275
276 } // end of layer loop
277
278 fqtlog.close();
279 delete funQt;
280 return 1;
281}
282
283Double_t QtMdcCalib::qtFun( Double_t* x, Double_t* par ) {
284 double tw = par[1] / sqrt( x[0] ) + par[0];
285 return tw;
286}
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
*******INTEGER m_nBinMax INTEGER m_NdiMax !No of bins in histogram for cell exploration division $ !Last vertex $ !Last active cell $ !Last cell in buffer $ !No of sampling when dividing cell $ !No of function total $ !Flag for random ceel for $ !Flag for type of for WtMax $ !Flag which decides whether vertices are included in the sampling $ entire domain is hyp !Maximum effective eevents per bin
Definition FoamA.h:85
const int MdcCalNLayer
Definition MdcCalParams.h:6
const int MdcCalQtOrd
const int MdcCalNQBin
const int MdcCalInnNLay
Definition MdcCalParams.h:7
IMessageSvc * msgSvc()
double getDmeas() const
double getDocaInc() const
double getQhit() const
int getLayid() const
double getResiInc() const
MdcCalRecHit * getRecHit(int index) const
double getP() const
double getDz() const
int getNHits() const
bool getFgNoiseRatio() const
double getDr() const
double getQtpar(int lay, int order) const
void resetQtpar(int lay, int order, double val)
virtual void printCut() const =0
virtual void clear()=0
Definition MdcCalib.cxx:83
virtual void initialize(TObjArray *hlist, IMdcGeomSvc *mdcGeomSvc, IMdcCalibFunSvc *mdcFunSvc, IMdcUtilitySvc *mdcUtilitySvc)=0
Definition MdcCalib.cxx:225
virtual int updateConst(MdcCalibConst *calconst)=0
virtual int fillHist(MdcCalEvent *event)=0
Definition MdcCalib.cxx:767
static Double_t qtFun(Double_t *x, Double_t *par)
void printCut() const
void clear()
void initialize(TObjArray *hlist, IMdcGeomSvc *mdcGeomSvc, IMdcCalibFunSvc *mdcFunSvc, IMdcUtilitySvc *mdcUtilitySvc)
int fillHist(MdcCalEvent *event)
int updateConst(MdcCalibConst *calconst)