BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
GrXtMdcCalib.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 <cmath>
10#include <cstring>
11#include <fstream>
12#include <iomanip>
13#include <iostream>
14
15#include "TF1.h"
16
17using namespace std;
18
19double GrXtMdcCalib::DMAX;
20double GrXtMdcCalib::TMAX;
21
23 m_maxNhit = 5000;
24 m_fgIni = false;
25}
26
28
30 cout << "~GrXtMdcCalib" << endl;
31 for ( int lay = 0; lay < MdcCalNLayer; lay++ )
32 {
33 for ( int iEntr = 0; iEntr < MdcCalNENTRXT; iEntr++ )
34 {
35 for ( int iLR = 0; iLR < MdcCalLR; iLR++ ) { delete m_grxt[lay][iEntr][iLR]; }
36 }
37 }
38 delete m_haxis;
39 delete m_fdXt;
40
42}
43
44void GrXtMdcCalib::initialize( TObjArray* hlist, IMdcGeomSvc* mdcGeomSvc,
45 IMdcCalibFunSvc* mdcFunSvc, IMdcUtilitySvc* mdcUtilitySvc ) {
46 IMessageSvc* msgSvc;
47 Gaudi::svcLocator()->service( "MessageSvc", msgSvc );
48 MsgStream log( msgSvc, "GrXtMdcCalib" );
49 log << MSG::INFO << "GrXtMdcCalib::initialize()" << endmsg;
50
51 m_hlist = hlist;
52 m_mdcGeomSvc = mdcGeomSvc;
53 m_mdcFunSvc = mdcFunSvc;
54 m_mdcUtilitySvc = mdcUtilitySvc;
55
56 MdcCalib::initialize( m_hlist, m_mdcGeomSvc, m_mdcFunSvc, m_mdcUtilitySvc );
57
58 int lay;
59 int iLR;
60 int iEntr;
61 char hname[200];
62
63 m_fdXt = new TFolder( "fdXtGr", "fdXtGr" );
64 m_hlist->Add( m_fdXt );
65
66 m_haxis = new TH2F( "axis", "", 50, 0, 300, 50, 0, 9 );
67 m_haxis->SetStats( 0 );
68 m_fdXt->Add( m_haxis );
69
70 for ( lay = 0; lay < MdcCalNLayer; lay++ )
71 {
72 for ( iEntr = 0; iEntr < MdcCalNENTRXT; iEntr++ )
73 {
74 for ( iLR = 0; iLR < MdcCalLR; iLR++ )
75 {
76 m_nhit[lay][iEntr][iLR] = 0;
77
78 sprintf( hname, "grXt%02d_%02d_lr%01d", lay, iEntr, iLR );
79 m_grxt[lay][iEntr][iLR] = new TGraph();
80 m_grxt[lay][iEntr][iLR]->SetName( hname );
81 m_grxt[lay][iEntr][iLR]->SetMarkerStyle( 10 );
82 m_grxt[lay][iEntr][iLR]->SetLineColor( 10 );
83 m_fdXt->Add( m_grxt[lay][iEntr][iLR] );
84 }
85 }
86 }
87}
88
90 IMessageSvc* msgSvc;
91 Gaudi::svcLocator()->service( "MessageSvc", msgSvc );
92 MsgStream log( msgSvc, "GrXtMdcCalib" );
93 log << MSG::DEBUG << "GrXtMdcCalib::fillHist()" << endmsg;
94
95 MdcCalib::fillHist( event );
96
97 // get EsTimeCol
98 bool esCutFg = event->getEsCutFlag();
99 if ( !esCutFg ) return -1;
100
101 int i;
102 int k;
103 int lay;
104 int iLR;
105 int iEntr;
106
107 double dr;
108 double dz;
109 double doca;
110 double tdr;
111 double resi;
112 double entrance;
113
114 int nhitlay;
115 bool fgHitLay[MdcCalNLayer];
116 bool fgTrk;
117
118 if ( !m_fgIni )
119 {
120 for ( lay = 0; lay < MdcCalNLayer; lay++ )
121 {
122 if ( lay < 8 ) m_docaMax[lay] = m_param.maxDocaInner;
123 else m_docaMax[lay] = m_param.maxDocaOuter;
124 }
125 m_fgIni = true;
126 }
127
128 MdcCalRecTrk* rectrk;
129 MdcCalRecHit* rechit;
130
131 int nhit;
132 int ntrk = event->getNTrk();
133 for ( i = 0; i < ntrk; i++ )
134 {
135 fgTrk = true;
136 rectrk = event->getRecTrk( i );
137 nhit = rectrk->getNHits();
138
139 // dr cut
140 dr = rectrk->getDr();
141 if ( fabs( dr ) > m_param.drCut ) continue;
142
143 // dz cut
144 dz = rectrk->getDz();
145 if ( fabs( dz ) > m_param.dzCut ) continue;
146
147 for ( lay = 0; lay < MdcCalNLayer; lay++ ) { fgHitLay[lay] = false; }
148
149 for ( k = 0; k < nhit; k++ )
150 {
151 rechit = rectrk->getRecHit( k );
152 lay = rechit->getLayid();
153 doca = rechit->getDocaInc();
154 resi = rechit->getResiInc();
155 fgHitLay[lay] = true;
156
157 // if( (fabs(doca) > m_docaMax[lay]) ||
158 // (fabs(resi) > m_param.resiCut[lay]) ){
159 // fgTrk = false;
160 // }
161 }
162 if ( !fgTrk ) continue;
163
164 nhitlay = 0;
165 for ( lay = 0; lay < MdcCalNLayer; lay++ )
166 {
167 if ( fgHitLay[lay] ) nhitlay++;
168 }
169 if ( nhitlay < m_param.nHitLayCut ) continue;
170
171 for ( k = 0; k < nhit; k++ )
172 {
173 rechit = rectrk->getRecHit( k );
174 lay = rechit->getLayid();
175 doca = rechit->getDocaInc();
176 resi = rechit->getResiInc();
177 iLR = rechit->getLR();
178 entrance = rechit->getEntra();
179 tdr = rechit->getTdrift();
180
181 if ( ( fabs( doca ) > m_docaMax[lay] ) || ( fabs( resi ) > m_param.resiCut[lay] ) )
182 { continue; }
183
184 if ( 0 == lay )
185 {
186 if ( !fgHitLay[1] ) continue;
187 }
188 else if ( 42 == lay )
189 {
190 if ( !fgHitLay[41] ) continue;
191 }
192 else
193 {
194 if ( ( !fgHitLay[lay - 1] ) && ( !fgHitLay[lay + 1] ) ) continue;
195 }
196
197 iEntr = m_mdcFunSvc->getXtEntrIndex( entrance );
198
199 if ( iLR < 2 )
200 {
201 if ( m_nhit[lay][iEntr][iLR] < m_maxNhit )
202 {
203 m_grxt[lay][iEntr][iLR]->SetPoint( m_nhit[lay][iEntr][iLR], tdr, fabs( doca ) );
204 m_nhit[lay][iEntr][iLR]++;
205 }
206 }
207
208 if ( m_nhit[lay][iEntr][2] < m_maxNhit )
209 {
210 m_grxt[lay][iEntr][2]->SetPoint( m_nhit[lay][iEntr][2], tdr, fabs( doca ) );
211 m_nhit[lay][iEntr][2]++;
212 }
213 } // hit loop
214 } // track loop
215 return 1;
216}
217
219
221 IMessageSvc* msgSvc;
222 Gaudi::svcLocator()->service( "MessageSvc", msgSvc );
223 MsgStream log( msgSvc, "GrXtMdcCalib" );
224 log << MSG::INFO << "GrXtMdcCalib::updateConst()" << endmsg;
225
226 MdcCalib::updateConst( calconst );
227
228 int ord;
229 double xtpar[MdcCalNLayer][MdcCalNENTRXT][MdcCalLR][8];
230 TF1* fxtDr = new TF1( "fxtDr", xtfun, 0, 300, 6 );
231 TF1* fxtEd = new TF1( "fxtEd", xtedge, 150, 500, 1 );
232 if ( 1 == m_param.fixXtC0 ) fxtDr->FixParameter( 0, 0 );
233
234 for ( int lay = 0; lay < MdcCalNLayer; lay++ )
235 {
236 for ( int iEntr = 0; iEntr < MdcCalNENTRXT; iEntr++ )
237 {
238 for ( int lr = 0; lr < MdcCalLR; lr++ )
239 {
240 m_fgFit[lay][iEntr][lr] = false;
241 if ( 0 == m_param.fgCalib[lay] ) continue;
242
243 if ( m_nhit[lay][iEntr][lr] > 1000 )
244 {
245 TMAX = calconst->getXtpar( lay, iEntr, lr, 6 );
246
247 m_grxt[lay][iEntr][lr]->Fit( "fxtDr", "Q+", "", 0, TMAX );
248
249 for ( ord = 0; ord < 6; ord++ )
250 { xtpar[lay][iEntr][lr][ord] = fxtDr->GetParameter( ord ); }
251 xtpar[lay][iEntr][lr][6] = TMAX;
252
253 DMAX = 0.0;
254 for ( ord = 0; ord < 6; ord++ )
255 DMAX += xtpar[lay][iEntr][lr][ord] * pow( TMAX, ord );
256
257 m_grxt[lay][iEntr][lr]->Fit( "fxtEd", "Q+", "", TMAX, TMAX + 300 );
258 xtpar[lay][iEntr][lr][7] = fxtEd->GetParameter( 0 );
259 if ( xtpar[lay][iEntr][lr][7] < 0.0 ) xtpar[lay][iEntr][lr][7] = 0.0;
260 m_fgFit[lay][iEntr][lr] = true;
261
262 // for(ord=0; ord<8; ord++){
263 // calconst -> resetXtpar(lay, iEntr, lr, ord, xtpar[ord]);
264 // }
265 }
266
267 } // end of lr loop
268 } // end of entrance angle loop
269 } // end of layer loop
270
271 ofstream fxtlog( "xtlog" );
272 for ( int lay = 0; lay < MdcCalNLayer; lay++ )
273 {
274 for ( int iEntr = 0; iEntr < MdcCalNENTRXT; iEntr++ )
275 {
276 for ( int lr = 0; lr < MdcCalLR; lr++ )
277 {
278 fxtlog << setw( 3 ) << lay << setw( 3 ) << iEntr << setw( 3 ) << lr;
279
280 int fgUpdate = -1;
281 if ( m_fgFit[lay][iEntr][lr] )
282 {
283 fgUpdate = 1;
284 for ( ord = 0; ord < 8; ord++ )
285 calconst->resetXtpar( lay, iEntr, lr, ord, xtpar[lay][iEntr][lr][ord] );
286 }
287 else
288 {
289 int iEntrNew = findXtEntr( lay, iEntr, lr );
290 if ( -1 != iEntrNew )
291 {
292 fgUpdate = 2;
293 for ( ord = 0; ord < 8; ord++ )
294 { calconst->resetXtpar( lay, iEntr, lr, ord, xtpar[lay][iEntrNew][lr][ord] ); }
295 }
296 }
297 fxtlog << setw( 3 ) << fgUpdate;
298 for ( ord = 0; ord < 8; ord++ )
299 {
300 double par = calconst->getXtpar( lay, iEntr, lr, ord );
301 fxtlog << setw( 14 ) << par;
302 }
303 fxtlog << endl;
304 }
305 }
306 }
307 fxtlog.close();
308
309 cout << "Xt update finished. File xtlog was written." << endl;
310 delete fxtDr;
311 delete fxtEd;
312}
313
314Double_t GrXtMdcCalib::xtfun( Double_t* x, Double_t* par ) {
315 Double_t val = 0.0;
316 for ( Int_t ord = 0; ord < 6; ord++ ) { val += par[ord] * pow( x[0], ord ); }
317 return val;
318}
319
320Double_t GrXtMdcCalib::xtedge( Double_t* x, Double_t* par ) {
321 double val = DMAX + ( x[0] - TMAX ) * par[0];
322 return val;
323}
324
325int GrXtMdcCalib::findXtEntr( int lay, int iEntr, int lr ) const {
326 int id0 = 8;
327 int id1 = 9;
328 int idmax = 17;
329 int entrId = -1;
330 if ( iEntr <= id0 )
331 {
332 int id = -1;
333 for ( int i = iEntr; i <= id0; i++ )
334 {
335 if ( m_fgFit[lay][i][lr] )
336 {
337 id = i;
338 break;
339 }
340 }
341 if ( -1 != id ) entrId = id;
342 else
343 {
344 for ( int i = iEntr; i >= 0; i-- )
345 {
346 if ( m_fgFit[lay][i][lr] )
347 {
348 id = i;
349 break;
350 }
351 }
352 entrId = id;
353 }
354 }
355 else
356 {
357 int id = -1;
358 for ( int i = iEntr; i >= id1; i-- )
359 {
360 if ( m_fgFit[lay][i][lr] )
361 {
362 id = i;
363 break;
364 }
365 }
366 if ( -1 != id ) entrId = id;
367 else
368 {
369 for ( int i = iEntr; i < idmax; i++ )
370 {
371 if ( m_fgFit[lay][i][lr] )
372 {
373 id = i;
374 break;
375 }
376 }
377 entrId = id;
378 }
379 }
380 if ( -1 == entrId )
381 {
382 cout << "find EntrId error "
383 << "layer " << lay << " iEntr " << iEntr << " lr " << lr << endl;
384 }
385
386 return entrId;
387}
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)
const int MdcCalNLayer
Definition MdcCalParams.h:6
const int MdcCalNENTRXT
const int MdcCalLR
IMessageSvc * msgSvc()
void initialize(TObjArray *hlist, IMdcGeomSvc *mdcGeomSvc, IMdcCalibFunSvc *mdcFunSvc, IMdcUtilitySvc *mdcUtilitySvc)
int findXtEntr(int lay, int iEntr, int lr) const
static Double_t xtedge(Double_t *x, Double_t *par)
static Double_t xtfun(Double_t *x, Double_t *par)
void printCut() const
int fillHist(MdcCalEvent *event)
int updateConst(MdcCalibConst *calconst)
double getDocaInc() const
double getTdrift() const
double getEntra() const
int getLayid() const
double getResiInc() const
int getLR() const
MdcCalRecHit * getRecHit(int index) const
double getDz() const
int getNHits() const
double getDr() const
void resetXtpar(int lay, int entr, int lr, int order, double val)
double getXtpar(int lay, int entr, int lr, int order)
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