BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcCalibFunSvc.cxx
Go to the documentation of this file.
1#include "GaudiKernel/Bootstrap.h"
2#include "GaudiKernel/DataSvc.h"
3#include "GaudiKernel/IDataProviderSvc.h"
4#include "GaudiKernel/IIncidentListener.h"
5#include "GaudiKernel/IIncidentSvc.h"
6#include "GaudiKernel/IInterface.h"
7#include "GaudiKernel/ISvcLocator.h"
8#include "GaudiKernel/Incident.h"
9#include "GaudiKernel/Kernel.h"
10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/SmartDataPtr.h"
12#include "GaudiKernel/StatusCode.h"
13#include "TFile.h"
14#include "TList.h"
15#include "TTree.h"
16#include <fstream>
17#include <iomanip>
18#include <iostream>
19#include <math.h>
20
21#include "CalibData/CalibModel.h"
22#include "CalibData/Mdc/MdcCalibData.h"
23#include "CalibData/Mdc/MdcDataConst.h"
24#include "EventModel/EventHeader.h"
25
26#include "MdcCalibFunSvc.h"
27
28using namespace std;
29
30typedef map<int, double>::value_type valType;
31
33
34MdcCalibFunSvc::MdcCalibFunSvc( const string& name, ISvcLocator* svcloc )
35 : base_class( name, svcloc ), m_layInfSig( -1 ) {
36
37 // declare properties
38 declareProperty( "CheckConst", m_checkConst = false );
39 declareProperty( "LayerInfSig", m_layInfSig );
40 declareProperty( "XtMode", m_xtMode = 1 );
41 declareProperty( "NewXtFile", m_xtfile );
42 declareProperty( "ReadWireEffDb", m_readWireEffDb = true );
43 declareProperty( "WireEffFile", m_wireEffFile );
44 declareProperty( "LinearXT", m_linearXT = false );
45 declareProperty( "FixSigma", m_fixSigma = false );
46 declareProperty( "FixSigmaValue", m_fixSigmaValue = 130.0 ); // micron
47 m_outputXtMode = true;
48}
49
51
52/*StatusCode MdcCalibFunSvc::queryInterface(const InterfaceID& riid, void** ppvInterface){
53 if( IID_IMdcCalibFunSvc.versionMatch(riid) ){
54 *ppvInterface = static_cast<IMdcCalibFunSvc*> (this);
55 } else{
56 return Service::queryInterface(riid, ppvInterface);
57 }
58 return StatusCode::SUCCESS;
59}
60*/
62 MsgStream log( msgSvc(), name() );
63 log << MSG::INFO << "MdcCalibFunSvc::initialize()" << endmsg;
64
65 StatusCode sc = Service::initialize();
66 if ( sc.isFailure() ) return sc;
67
68 IIncidentSvc* incsvc;
69 sc = service( "IncidentSvc", incsvc );
70 int priority = 100;
71 if ( sc.isSuccess() ) { incsvc->addListener( this, "NewRun", priority ); }
72
73 sc = service( "CalibDataSvc", m_pCalDataSvc, true );
74 if ( sc == StatusCode::SUCCESS )
75 { log << MSG::INFO << "Retrieve IDataProviderSvc" << endmsg; }
76 else { log << MSG::FATAL << "can not get IDataProviderSvc" << endmsg; }
77
78 sc = service( "MdcGeomSvc", m_pMdcGeomSvc );
79 if ( sc != StatusCode::SUCCESS )
80 {
81 log << MSG::ERROR << "can not use MdcGeomSvc" << endmsg;
82 return StatusCode::FAILURE;
83 }
84
85 if ( m_fixSigma ) cout << "Fix MDC sigma to " << m_fixSigmaValue << " micron." << endl;
86
87 m_updateNum = 0;
88 for ( int wir = 0; wir < 6796; wir++ ) m_wireEff[wir] = 1.0;
89 for ( int lay = 0; lay < NLAYER; lay++ )
90 {
91 for ( int iEntr = 0; iEntr < NXTENTR; iEntr++ )
92 {
93 for ( int lr = 0; lr < 2; lr++ ) m_nR2t[lay][iEntr][lr] = 0;
94 }
95 }
96
97 return StatusCode::SUCCESS;
98}
99
101 MsgStream log( msgSvc(), name() );
102 log << MSG::INFO << "MdcCalibFunSvc::finalize()" << endmsg;
103
104 m_xtmap.clear();
105 m_t0.clear();
106 m_delt0.clear();
107 m_qtpar0.clear();
108 m_qtpar1.clear();
109 m_sdmap.clear();
110
111 return StatusCode::SUCCESS;
112}
113
114void MdcCalibFunSvc::handle( const Incident& inc ) {
115 MsgStream log( msgSvc(), name() );
116 log << MSG::DEBUG << "handle: " << inc.type() << endmsg;
117
118 if ( inc.type() == "NewRun" )
119 {
120 log << MSG::DEBUG << "NewRun" << endmsg;
121
122 if ( !initCalibConst() )
123 {
124 log << MSG::ERROR << "can not initilize Mdc Calib Constants" << endl
125 << " Please insert the following statement "
126 << "in your \"jobOption.txt\" "
127 << "before the include file of Mdc Reconstruction: " << endl
128 << " "
129 << "#include \"$CALIBSVCROOT/share/job-CalibData.txt\"" << endl
130 << " If still error, please contact with Wu Linghui "
131 << "(wulh@mail.ihep.ac.cn)." << endmsg;
132 }
133 }
134}
135
136double MdcCalibFunSvc::getTprop( int lay, double z ) const {
137 double vp = getVprop( lay );
138 double tp = fabs( z - m_zst[lay] ) / vp;
139 return tp;
140}
141
142double MdcCalibFunSvc::driftTimeToDist( double drifttime, int layid, int cellid, int lr,
143 double entrance ) const {
144 double dist;
145 if ( 0 == m_xtMode ) { dist = t2dPoly( drifttime, layid, cellid, lr, entrance ); }
146 else
147 {
148 if ( ( 0 == lr ) || ( 1 == lr ) )
149 dist = t2dInter( drifttime, layid, cellid, lr, entrance );
150 else
151 {
152 double dl = t2dInter( drifttime, layid, cellid, lr, entrance );
153 double dr = t2dInter( drifttime, layid, cellid, lr, entrance );
154 dist = ( dl + dr ) * 0.5;
155 }
156 }
157 // cout << setw(15) << drifttime << setw(15) << dist << endl;
158 if ( m_linearXT ) dist = 0.03 * drifttime;
159 return dist;
160}
161
162double MdcCalibFunSvc::t2dPoly( double drifttime, int layid, int cellid, int lr,
163 double entrance ) const {
164 int ord;
165 double xtpar[8];
166 double dist = 0.0;
167
168 int entr = getXtEntrIndex( entrance );
169 getXtpar( layid, entr, lr, xtpar );
170
171 if ( drifttime < xtpar[6] )
172 {
173 for ( ord = 0; ord < 6; ord++ ) { dist += xtpar[ord] * pow( drifttime, ord ); }
174 }
175 else
176 {
177 for ( ord = 0; ord < 6; ord++ ) { dist += xtpar[ord] * pow( xtpar[6], ord ); }
178 dist += xtpar[7] * ( drifttime - xtpar[6] );
179 }
180
181 return dist;
182}
183
184double MdcCalibFunSvc::t2dInter( double drifttime, int layid, int cellid, int lr,
185 double entrance ) const {
186 double dist=0;
187 int iEntr = getXtEntrIndex( entrance );
188 int nBin = m_nNewXt[layid][iEntr][lr];
189 if ( drifttime < m_vt[layid][iEntr][lr][0] ) { dist = m_vd[layid][iEntr][lr][0]; }
190 else if ( drifttime < m_vt[layid][iEntr][lr][nBin - 1] )
191 {
192 for ( int i = 0; i < ( nBin - 1 ); i++ )
193 {
194 if ( ( drifttime >= m_vt[layid][iEntr][lr][i] ) &&
195 ( drifttime < m_vt[layid][iEntr][lr][i + 1] ) )
196 {
197 double t1 = m_vt[layid][iEntr][lr][i];
198 double t2 = m_vt[layid][iEntr][lr][i + 1];
199 double d1 = m_vd[layid][iEntr][lr][i];
200 double d2 = m_vd[layid][iEntr][lr][i + 1];
201 dist = ( drifttime - t1 ) * ( d2 - d1 ) / ( t2 - t1 ) + d1;
202 break;
203 }
204 }
205 }
206 else { dist = m_vd[layid][iEntr][lr][nBin - 1]; }
207 return dist;
208}
209
210double MdcCalibFunSvc::distToDriftTime( double dist, int layid, int cellid, int lr,
211 double entrance ) const {
212 int i = 0;
213 double time;
214 int ord;
215 double xtpar[8];
216 double dxdtpar[5];
217 double x;
218 double dxdt;
219 double deltax;
220
221 int entr = getXtEntrIndex( entrance );
222 getXtpar( layid, entr, lr, xtpar );
223
224 double tm1 = xtpar[6];
225 double tm2 = 2000.0;
226 double dm1 = driftTimeToDist( tm1, layid, cellid, lr, entrance );
227 double dm2 = driftTimeToDist( tm2, layid, cellid, lr, entrance );
228
229 if ( dist < 0 )
230 {
231 cout << "Warning in MdcCalibFunSvc: driftDist < 0" << endl;
232 time = 0.0;
233 }
234 else if ( dist < xtpar[0] ) { time = 0.0; }
235 else if ( dist < dm1 )
236 {
237 for ( ord = 0; ord < 5; ord++ ) { dxdtpar[ord] = (double)( ord + 1 ) * xtpar[ord + 1]; }
238 time = dist / 0.03;
239 while ( 1 )
240 {
241 if ( i > 50 )
242 {
243 cout << "Warning in MdcCalibFunSvc: "
244 << "can not get the exact value in the dist-to-time conversion." << endl;
245 time = dist / 0.03;
246 break;
247 }
248
249 x = 0.0;
250 for ( ord = 0; ord < 6; ord++ ) x += xtpar[ord] * pow( time, ord );
251
252 deltax = x - dist;
253 if ( fabs( deltax ) < 0.001 ) { break; }
254
255 dxdt = 0.0;
256 for ( ord = 0; ord < 5; ord++ ) dxdt += dxdtpar[ord] * pow( time, ord );
257
258 time = time - ( deltax / dxdt );
259 i++;
260 }
261 }
262 else if ( dist < dm2 ) { time = ( dist - dm1 ) * ( tm2 - tm1 ) / ( dm2 - dm1 ) + tm1; }
263 else { time = tm2; }
264
265 if ( m_linearXT ) time = dist / 0.03;
266 return time;
267}
268
269double MdcCalibFunSvc::getSigma( int layid, int lr, double dist, double entrance,
270 double tanlam, double z, double Q ) const {
271 double sigma;
272 if ( ( 0 == lr ) || ( 1 == lr ) )
273 { sigma = getSigmaLR( layid, lr, dist, entrance, tanlam, z, Q ); }
274 else
275 {
276 double sl = getSigmaLR( layid, 0, dist, entrance, tanlam, z, Q );
277 double sr = getSigmaLR( layid, 1, dist, entrance, tanlam, z, Q );
278 sigma = ( sl + sr ) * 0.5;
279 }
280
281 if ( m_fixSigma ) sigma = 0.001 * m_fixSigmaValue;
282 if ( layid == m_layInfSig ) sigma = 9999.0;
283 return sigma;
284}
285
286double MdcCalibFunSvc::getSigmaLR( int layid, int lr, double dist, double entrance,
287 double tanlam, double z, double Q ) const {
288
289 double sigma = 9999.0;
290 double par[NSDBIN];
291
292 int entr = getSdEntrIndex( entrance );
293 getSdpar( layid, entr, lr, par );
294
295 int nmaxBin;
296 double dw = 0.5; // width of each distance bin
297 double dmin = 0.25; // mm
298 if ( layid < 8 )
299 {
300 nmaxBin = 20; // 11->20 2011-12-10
301 }
302 else
303 {
304 nmaxBin = 20; // 15->20 2011-12-10
305 }
306
307 double dref[2];
308 double distAbs = fabs( dist );
309 if ( distAbs < dmin ) { sigma = par[0]; }
310 else
311 {
312 int bin = (int)( ( distAbs - dmin ) / dw );
313 if ( bin >= nmaxBin ) { sigma = par[nmaxBin]; }
314 else if ( bin < 0 ) { sigma = par[0]; }
315 else
316 {
317 dref[0] = (double)bin * dw + 0.25;
318 dref[1] = (double)( bin + 1 ) * dw + 0.25;
319 if ( ( dref[1] - dref[0] ) <= 0 ) { sigma = 9999.0; }
320 else
321 {
322 sigma = ( par[bin + 1] - par[bin] ) * ( distAbs - dref[0] ) / ( dref[1] - dref[0] ) +
323 par[bin];
324 }
325 }
326 }
327 return sigma;
328}
329
330double MdcCalibFunSvc::getSigma1( int layid, int lr, double dist, double entrance,
331 double tanlam, double z, double Q ) const {
332 double sigma1 = getSigma( layid, lr, dist, entrance, tanlam, z, Q );
333 return sigma1;
334}
335
336double MdcCalibFunSvc::getSigma2( int layid, int lr, double dist, double entrance,
337 double tanlam, double z, double Q ) const {
338
339 return 0.0;
340}
341
342double MdcCalibFunSvc::getF( int layid, int lr, double dist, double entrance, double tanlam,
343 double z, double Q ) const {
344
345 return 1.0;
346}
347
348double MdcCalibFunSvc::getSigmaToT( int layid, int lr, double tdr, double entrance,
349 double tanlam, double z, double Q ) const {
350 if ( !m_fgR2t )
351 {
352 cout << "ERROR: can not get sigma-time functions" << endl;
353 return -999.0;
354 }
355 else if ( ( 0 == lr ) || ( 1 == lr ) )
356 { return getSigmaToTLR( layid, lr, tdr, entrance, tanlam, z, Q ); }
357 else
358 {
359 double sl = getSigmaToTLR( layid, 0, tdr, entrance, tanlam, z, Q );
360 double sr = getSigmaToTLR( layid, 1, tdr, entrance, tanlam, z, Q );
361 double sigma = ( sl + sr ) * 0.5;
362 return sigma;
363 }
364}
365
366double MdcCalibFunSvc::getSigmaToTLR( int layid, int lr, double tdr, double entrance,
367 double tanlam, double z, double Q ) const {
368 double sigma=0;
369 int iEntr = getXtEntrIndex( entrance );
370 int nBin = m_nR2t[layid][iEntr][lr];
371 if ( tdr < m_tR2t[layid][iEntr][lr][0] ) { sigma = m_sR2t[layid][iEntr][lr][0]; }
372 else if ( tdr < m_tR2t[layid][iEntr][lr][nBin - 1] )
373 {
374 for ( int i = 0; i < ( nBin - 1 ); i++ )
375 {
376 if ( ( tdr >= m_tR2t[layid][iEntr][lr][i] ) &&
377 ( tdr < m_tR2t[layid][iEntr][lr][i + 1] ) )
378 {
379 double t1 = m_tR2t[layid][iEntr][lr][i];
380 double t2 = m_tR2t[layid][iEntr][lr][i + 1];
381 double s1 = m_sR2t[layid][iEntr][lr][i];
382 double s2 = m_sR2t[layid][iEntr][lr][i + 1];
383 sigma = ( tdr - t1 ) * ( s2 - s1 ) / ( t2 - t1 ) + s1;
384 break;
385 }
386 }
387
388 }
389 else { sigma = m_sR2t[layid][iEntr][lr][nBin - 1]; }
390 return sigma;
391}
392
393int MdcCalibFunSvc::getNextXtpar( int& key, double& par ) {
394 if ( m_xtiter != m_xtmap.end() )
395 {
396 key = ( *m_xtiter ).first;
397 par = ( *m_xtiter ).second;
398 m_xtiter++;
399 return 1;
400 }
401 else return 0;
402}
403
404void MdcCalibFunSvc::getXtpar( int layid, int entr, int lr, double par[] ) const {
405 int parId;
406 for ( int ord = 0; ord < 8; ord++ )
407 {
408 parId = getXtparId( layid, entr, lr, ord );
409 par[ord] = m_xtpar[parId];
410 }
411}
412
414 MsgStream log( msgSvc(), name() );
415 log << MSG::INFO << "read calib const from TCDS" << endmsg;
416
417 for ( int layid = 0; layid < NLAYER; layid++ )
418 {
419 for ( int entr = 0; entr < NXTENTR; entr++ )
420 {
421 for ( int lr = 0; lr < 2; lr++ )
422 {
423 double br_t, br_d;
424 TTree* newXtTree = getNewXtparTree( layid, entr, lr );
425 if ( !newXtTree ) return false;
426 newXtTree->SetBranchAddress( "t", &br_t );
427 newXtTree->SetBranchAddress( "d", &br_d );
428 int nEntries = newXtTree->GetEntries();
429 if ( ( nEntries < 10 ) || ( nEntries >= 200 ) )
430 {
431 log << MSG::ERROR << "wrong X-T constants: layer " << layid << ", iEntr " << entr
432 << ", lr " << lr << endmsg;
433 return false;
434 }
435 m_nNewXt[layid][entr][lr] = nEntries;
436 for ( int i = 0; i < nEntries; i++ )
437 {
438 newXtTree->GetEntry( i );
439 m_vt[layid][entr][lr][i] = br_t;
440 m_vd[layid][entr][lr][i] = br_d;
441 } // end loop entries
442 } // end lr
443 } // end entr
444 } // end layid
445
446 return true;
447}
448
449TTree* MdcCalibFunSvc::getNewXtparTree( int layid, int entr, int lr ) const {
450 MsgStream log( msgSvc(), name() );
451 string fullPath = "/Calib/MdcCal";
452 SmartDataPtr<CalibData::MdcCalibData> calConst( m_pCalDataSvc, fullPath );
453 if ( !calConst )
454 {
455 log << MSG::ERROR << "can not get MdcCalibConst via SmartPtr" << endmsg;
456 return NULL;
457 }
458
459 TTree* newXtTree = calConst->getNewXtpar( layid, entr, lr );
460 return newXtTree;
461}
462
464 for ( int layid = 0; layid < NLAYER; layid++ )
465 {
466 int br_iEntr, br_lr;
467 double br_s, br_t;
468 TTree* r2tTree = getR2tTree( layid );
469 if ( !r2tTree ) return false;
470 r2tTree->SetBranchAddress( "iEntr", &br_iEntr );
471 r2tTree->SetBranchAddress( "lr", &br_lr );
472 r2tTree->SetBranchAddress( "s", &br_s );
473 r2tTree->SetBranchAddress( "t", &br_t );
474 int nEntries = r2tTree->GetEntries();
475 for ( int i = 0; i < nEntries; i++ )
476 {
477 r2tTree->GetEntry( i );
478 int bin = m_nR2t[layid][br_iEntr][br_lr];
479 if ( bin >= 200 )
480 {
481 cout << "Error: number of sigma-time bins overflow" << endl;
482 return false;
483 }
484 m_tR2t[layid][br_iEntr][br_lr][bin] = br_t;
485 m_sR2t[layid][br_iEntr][br_lr][bin] = br_s;
486 m_nR2t[layid][br_iEntr][br_lr]++;
487 }
488 }
489 for ( int layid = 0; layid < NLAYER; layid++ )
490 {
491 for ( int iEntr = 0; iEntr < NXTENTR; iEntr++ )
492 {
493 for ( int lr = 0; lr < 2; lr++ )
494 {
495 if ( ( m_nR2t[layid][iEntr][lr] < 10 ) || ( m_nR2t[layid][iEntr][lr] >= 200 ) )
496 return false;
497 }
498 }
499 }
500 return true;
501}
502
503TTree* MdcCalibFunSvc::getR2tTree( int layid ) const {
504 MsgStream log( msgSvc(), name() );
505 string fullPath = "/Calib/MdcCal";
506 SmartDataPtr<CalibData::MdcCalibData> calConst( m_pCalDataSvc, fullPath );
507 if ( !calConst )
508 {
509 log << MSG::ERROR << "can not get MdcCalibConst via SmartPtr" << endmsg;
510 return NULL;
511 }
512
513 TTree* r2tTree = calConst->getR2tpar( layid );
514 return r2tTree;
515}
516
517double MdcCalibFunSvc::getT0( int layid, int cellid ) const {
518 int wireid = m_pMdcGeomSvc->Wire( layid, cellid )->Id();
519 double t0 = getT0( wireid );
520
521 return t0;
522}
523
524double MdcCalibFunSvc::getTimeWalk( int layid, double Q ) const {
525 double tw = 0.0;
526 double qtpar[2];
527 int ord;
528
529 if ( Q < 0.0001 ) Q = 0.0001;
530
531 for ( ord = 0; ord < 2; ord++ ) { qtpar[ord] = getQtpar( layid, ord ); }
532
533 tw = qtpar[0] + qtpar[1] / sqrt( Q );
534 if ( m_run < 0 ) tw = 0.0; // for MC
535
536 return tw;
537}
538
539double MdcCalibFunSvc::getWireEff( int layid, int cellid ) const {
540 int wireid = m_pMdcGeomSvc->Wire( layid, cellid )->Id();
541 return m_wireEff[wireid];
542}
543
544double MdcCalibFunSvc::getQtpar( int layid, int ord ) const {
545 if ( 0 == ord ) return m_qtpar0[layid];
546 else if ( 1 == ord ) return m_qtpar1[layid];
547 else
548 {
549 cout << "wrong order number" << endl;
550 return 0.0;
551 }
552}
553
554void MdcCalibFunSvc::getSdpar( int layid, int entr, int lr, double par[] ) const {
555 int parId;
556 if ( ( entr < 0 ) || ( entr >= 18 ) ) { entr = 17; }
557 for ( int bin = 0; bin < NSDBIN; bin++ )
558 {
559 parId = getSdparId( layid, entr, lr, bin );
560 par[bin] = m_sdpar[parId];
561 }
562}
563
564int MdcCalibFunSvc::getNextSdpar( int& key, double& par ) {
565 if ( m_sditer != m_sdmap.end() )
566 {
567 key = ( *m_sditer ).first;
568 par = ( *m_sditer ).second;
569 m_sditer++;
570 return 1;
571 }
572 else return 0;
573}
574
575int MdcCalibFunSvc::getXtEntrIndex( double entrance ) const {
576 int i;
577 int index;
578 int idmax = 17;
579 double aglpi = 3.141592653;
580 double aglmin = -1.570796327; // -90 degree
581 double aglmax = 1.570796327; // 90 degree
582 double delAngle = 0.174532925; // 10 degree
583
584 MsgStream log( msgSvc(), name() );
585 if ( entrance < aglmin )
586 {
587 log << MSG::WARNING << "entrance angle < -pi/2" << endmsg;
588 while ( 1 )
589 {
590 entrance += aglpi;
591 if ( entrance >= aglmin ) break;
592 }
593 }
594 else if ( entrance > aglmax )
595 {
596 log << MSG::WARNING << "entrance angle > pi/2" << endmsg;
597 while ( 1 )
598 {
599 entrance -= aglpi;
600 if ( entrance <= aglmax ) break;
601 }
602 }
603
604 index = (int)( ( entrance - aglmin ) / delAngle );
605 if ( index < 0 ) index = 0;
606 else if ( index > idmax ) index = idmax;
607
608 return index;
609}
610
611int MdcCalibFunSvc::getSdEntrIndex( double entrance ) const {
612 int i;
613 int index;
614 int idmax = 5;
615 double aglpi = 3.141592653;
616 double aglmin = -1.570796327; // -90 degree
617 double aglmax = 1.570796327; // 90 degree
618 double delAngle = 0.523598776; // 30 degree
619
620 MsgStream log( msgSvc(), name() );
621 if ( entrance < aglmin )
622 {
623 log << MSG::WARNING << "entrance angle < -pi/2" << endmsg;
624 while ( 1 )
625 {
626 entrance += aglpi;
627 if ( entrance >= aglmin ) break;
628 }
629 }
630 else if ( entrance > aglmax )
631 {
632 log << MSG::WARNING << "entrance angle > pi/2" << endmsg;
633 while ( 1 )
634 {
635 entrance -= aglpi;
636 if ( entrance <= aglmax ) break;
637 }
638 }
639
640 index = (int)( ( entrance - aglmin ) / delAngle );
641 if ( index < 0 ) index = 0;
642 else if ( index > idmax ) index = idmax;
643
644 return index;
645}
646
647bool MdcCalibFunSvc::initCalibConst() {
648 MsgStream log( msgSvc(), name() );
649 log << MSG::INFO << "read calib const from TCDS" << endmsg;
650
651 IDataProviderSvc* eventSvc = NULL;
652 StatusCode sc = Gaudi::svcLocator()->service( "EventDataSvc", eventSvc );
653 if ( sc.isFailure() )
654 {
655 log << MSG::FATAL << "can not get EventDataSvc" << endmsg;
656 return false;
657 }
658 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc, "/Event/EventHeader" );
659 if ( !eventHeader )
660 {
661 log << MSG::FATAL << "Could not find Event Header" << endmsg;
662 return false;
663 }
664 m_run = eventHeader->runNumber();
665
666 // clear calibration constants vectors
667 m_xtmap.clear();
668 m_xtpar.clear();
669 m_t0.clear();
670 m_delt0.clear();
671 m_qtpar0.clear();
672 m_qtpar1.clear();
673 m_sdmap.clear();
674 m_sdpar.clear();
675
676 string fullPath = "/Calib/MdcCal";
677 SmartDataPtr<CalibData::MdcCalibData> calConst( m_pCalDataSvc, fullPath );
678 if ( !calConst )
679 {
680 log << MSG::ERROR << "can not get MdcCalibConst via SmartPtr" << endmsg;
681 return false;
682 }
683
684 // initialize XT parameter
685 int layid;
686 int entr;
687 int lr;
688 int ord;
689 int key;
690 double par;
691 calConst->setXtBegin();
692 while ( calConst->getNextXtpar( key, par ) ) { m_xtmap.insert( valType( key, par ) ); }
693
694 int parId;
695 unsigned mapsize = m_xtmap.size();
696 m_xtpar.resize( mapsize );
697 log << MSG::INFO << "size of xtmap: " << mapsize << endmsg;
698
699 calConst->setXtBegin();
700 while ( calConst->getNextXtpar( key, par ) )
701 {
702 layid = ( key >> XTLAYER_INDEX ) & XTLAYER_DECO;
703 entr = ( key >> XTENTRA_INDEX ) & XTENTRA_DECO;
704 lr = ( key >> XTLR_INDEX ) & XTLR_DECO;
705 ord = ( key >> XTORDER_INDEX ) & XTORDER_DECO;
706
707 parId = getXtparId( layid, entr, lr, ord );
708 m_xtpar[parId] = par;
709 }
710
711 // initialize T0 parameter
712 int wid;
713 double t0;
714 double delt0;
715 for ( wid = 0; wid < NWIRE; wid++ )
716 {
717 t0 = calConst->getT0( wid );
718 delt0 = calConst->getDelT0( wid );
719
720 m_t0.push_back( t0 );
721 m_delt0.push_back( delt0 );
722 }
723
724 // initialize QT parameter
725 double qtpar0;
726 double qtpar1;
727 for ( layid = 0; layid < NLAYER; layid++ )
728 {
729 qtpar0 = calConst->getQtpar0( layid );
730 qtpar1 = calConst->getQtpar1( layid );
731
732 m_qtpar0.push_back( qtpar0 );
733 m_qtpar1.push_back( qtpar1 );
734 }
735
736 // initialize resolution parameter
737 calConst->setSdBegin();
738 while ( calConst->getNextSdpar( key, par ) )
739 {
740 m_sdmap.insert( valType( key, par ) );
741 // cout << setw(15) << key << setw(15) << par << endl;
742 }
743
744 mapsize = m_sdmap.size();
745 m_sdpar.resize( mapsize );
746 log << MSG::INFO << "size of sdmap: " << mapsize << endmsg;
747
748 calConst->setSdBegin();
749 while ( calConst->getNextSdpar( key, par ) )
750 {
751 layid = ( key >> SDLAYER_INDEX ) & SDLAYER_DECO;
752 entr = ( key >> SDENTRA_INDEX ) & SDENTRA_DECO;
753 lr = ( key >> SDLR_INDEX ) & SDLR_DECO;
754 ord = ( key >> SDBIN_INDEX ) & SDBIN_DECO;
755
756 parId = getSdparId( layid, entr, lr, ord );
757 m_sdpar[parId] = par;
758 }
759
760 double zeast;
761 double zwest;
762 for ( layid = 0; layid < NLAYER; layid++ )
763 {
764 zwest = m_pMdcGeomSvc->Wire( layid, 0 )->Forward().z();
765 zeast = m_pMdcGeomSvc->Wire( layid, 0 )->Backward().z();
766
767 if ( 0 == ( layid % 2 ) ) m_zst[layid] = zwest; // west end
768 else m_zst[layid] = zeast; // east end
769 }
770
771 // read new-XT
772 log << MSG::INFO << "read new xt from TCDS" << endmsg;
773 if ( !getNewXtpar() )
774 {
775 log << MSG::WARNING << "can not get MDC New XT Trees" << endmsg;
776 m_xtMode = 0;
777 }
778 if ( m_run < 0 ) m_xtMode = 0;
779 if ( 0 == m_xtMode ) log << MSG::INFO << "use old X-T functions " << endmsg;
780 else log << MSG::INFO << "use new X-T functions " << endmsg;
781 if ( m_outputXtMode )
782 {
783 if ( 0 == m_xtMode ) cout << "use old X-T functions " << endl;
784 else cout << "use new X-T functions " << endl;
785 m_outputXtMode = false;
786 }
787
788 // read r-t
789 for ( layid = 0; layid < NLAYER; layid++ )
790 {
791 for ( entr = 0; entr < NXTENTR; entr++ )
792 {
793 for ( lr = 0; lr < 2; lr++ ) m_nR2t[layid][entr][lr] = 0;
794 }
795 }
796 m_fgR2t = true;
797 log << MSG::INFO << "read new sigma-time from TCDS" << endmsg;
798 if ( !getR2tpar() )
799 {
800 log << MSG::WARNING << "can not get sigma-time functions" << endmsg;
801 m_fgR2t = false;
802 }
803 else { log << MSG::INFO << "read sigma-time successfully " << endmsg; }
804
805 // read wire efficiency
806 if ( m_readWireEffDb )
807 {
808 fullPath = "/Calib/MdcDataConst";
809 log << MSG::INFO << "Read Wire Eff from TCDS: " << fullPath << endmsg;
810 log << MSG::INFO << "Read wire eff!" << endmsg;
811
812 SmartDataPtr<CalibData::MdcDataConst> dataConst( m_pCalDataSvc, fullPath );
813 if ( !dataConst )
814 {
815 log << MSG::ERROR << "can not get MdcDataConst via SmartPtr" << endmsg;
816 return false;
817 }
818 for ( int wir = 0; wir < NWIRE; wir++ ) { m_wireEff[wir] = dataConst->getWireEff( wir ); }
819 }
820 else
821 {
822 log << MSG::INFO << "Read Wire Eff from file: " << m_wireEffFile << endmsg;
823 ifstream fEff( m_wireEffFile.c_str() );
824 if ( !fEff.is_open() )
825 {
826 log << MSG::ERROR << "can not open wire eff file: " << m_wireEffFile << endmsg;
827 return false;
828 }
829 else
830 {
831 string strtmp;
832 for ( int i = 0; i < 4; i++ ) fEff >> strtmp;
833 for ( int wir = 0; wir < NWIRE; wir++ )
834 fEff >> strtmp >> strtmp >> strtmp >> m_wireEff[wir];
835 fEff.close();
836 }
837 }
838 if ( m_checkConst ) checkConst();
839 m_updateNum++;
840
841 return true;
842}
843
844int MdcCalibFunSvc::getXtKey( int layid, int lr, int ord, int entr ) const {
845
846 int key = ( ( layid << XTLAYER_INDEX ) & XTLAYER_MASK ) |
847 ( ( entr << XTENTRA_INDEX ) & XTENTRA_MASK ) |
848 ( ( lr << XTLR_INDEX ) & XTLR_MASK ) | ( ( ord << XTORDER_INDEX ) & XTORDER_MASK );
849
850 return key;
851}
852
853int MdcCalibFunSvc::getSdKey( int layid, int entr, int lr, int ord ) const {
854 int key = ( ( layid << SDLAYER_INDEX ) & SDLAYER_MASK ) |
855 ( ( entr << SDENTRA_INDEX ) & SDENTRA_MASK ) |
856 ( ( lr << SDLR_INDEX ) & SDLR_MASK ) | ( ( ord << SDBIN_INDEX ) & SDBIN_MASK );
857
858 return key;
859}
860
861void MdcCalibFunSvc::checkConst() {
862 char fname[200];
863 sprintf( fname, "checkXt_%d.txt", m_updateNum );
864 ofstream fxt( fname );
865 unsigned mapsize = m_xtmap.size();
866 unsigned vsize = m_xtpar.size();
867 fxt << setw( 10 ) << mapsize << setw( 10 ) << vsize << endl << endl;
868 int key;
869 double par;
870 std::map<int, double>::iterator xtiter = m_xtmap.begin();
871 while ( xtiter != m_xtmap.end() )
872 {
873 key = ( *xtiter ).first;
874 par = ( *xtiter ).second;
875 fxt << setw( 20 ) << key << setw( 20 ) << par << endl;
876 xtiter++;
877 }
878 fxt << endl;
879 for ( unsigned i = 0; i < vsize; i++ )
880 { fxt << setw( 5 ) << i << setw( 15 ) << m_xtpar[i] << endl; }
881 fxt.close();
882
883 sprintf( fname, "checkT0_%d.txt", m_updateNum );
884 ofstream ft0( fname );
885 ft0 << setw( 10 ) << m_t0.size() << setw( 10 ) << m_delt0.size() << endl;
886 for ( unsigned i = 0; i < m_t0.size(); i++ )
887 { ft0 << setw( 5 ) << i << setw( 15 ) << m_t0[i] << setw( 15 ) << m_delt0[i] << endl; }
888 ft0.close();
889
890 sprintf( fname, "checkQt_%d.txt", m_updateNum );
891 ofstream fqt( fname );
892 fqt << setw( 10 ) << m_qtpar0.size() << setw( 10 ) << m_qtpar1.size() << endl;
893 for ( unsigned i = 0; i < m_qtpar0.size(); i++ )
894 { fqt << setw( 5 ) << i << setw( 15 ) << m_qtpar0[i] << setw( 15 ) << m_qtpar1[i] << endl; }
895 fqt.close();
896
897 sprintf( fname, "checkSd_%d.txt", m_updateNum );
898 ofstream fsd( fname );
899 mapsize = m_sdmap.size();
900 vsize = m_sdpar.size();
901 fsd << setw( 10 ) << mapsize << setw( 10 ) << vsize << endl << endl;
902 std::map<int, double>::iterator sditer = m_sdmap.begin();
903 while ( sditer != m_sdmap.end() )
904 {
905 key = ( *sditer ).first;
906 par = ( *sditer ).second;
907 fsd << setw( 20 ) << key << setw( 20 ) << par << endl;
908 sditer++;
909 }
910 fsd << endl;
911 for ( unsigned i = 0; i < vsize; i++ )
912 { fsd << setw( 5 ) << i << setw( 15 ) << m_sdpar[i] << endl; }
913 fsd.close();
914
915 sprintf( fname, "checkNewXt_%d.txt", m_updateNum );
916 ofstream fnewxt( fname );
917 for ( int lay = 0; lay < 43; lay++ )
918 {
919 for ( int iEntr = 0; iEntr < 18; iEntr++ )
920 {
921 for ( int lr = 0; lr < 2; lr++ )
922 {
923 fnewxt << setw( 5 ) << lay << setw( 5 ) << iEntr << setw( 3 ) << lr << setw( 5 )
924 << m_nNewXt[lay][iEntr][lr] << endl;
925 for ( int bin = 0; bin < m_nNewXt[lay][iEntr][lr]; bin++ )
926 {
927 fnewxt << setw( 15 ) << m_vt[lay][iEntr][lr][bin] << setw( 15 )
928 << m_vd[lay][iEntr][lr][bin] << endl;
929 }
930 }
931 }
932 }
933 fnewxt.close();
934
935 sprintf( fname, "checkR2t_%d.txt", m_updateNum );
936 ofstream fr2t( fname );
937 for ( int lay = 0; lay < 43; lay++ )
938 {
939 for ( int iEntr = 0; iEntr < 18; iEntr++ )
940 {
941 for ( int lr = 0; lr < 2; lr++ )
942 {
943 fr2t << setw( 5 ) << lay << setw( 5 ) << iEntr << setw( 3 ) << lr << setw( 5 )
944 << m_nR2t[lay][iEntr][lr] << endl;
945 for ( int bin = 0; bin < m_nR2t[lay][iEntr][lr]; bin++ )
946 {
947 fr2t << setw( 15 ) << m_tR2t[lay][iEntr][lr][bin] << setw( 15 )
948 << m_sR2t[lay][iEntr][lr][bin] << endl;
949 }
950 }
951 }
952 }
953 fr2t.close();
954}
DECLARE_COMPONENT(BesBdkRc)
std::map< int, double >::value_type valType
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)
Double_t time
#define dmin(a, b)
*******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
IMessageSvc * msgSvc()
*************DOUBLE PRECISION m_pi *DOUBLE PRECISION m_HvecTau2 DOUBLE PRECISION m_HvClone2 DOUBLE PRECISION m_gamma1 DOUBLE PRECISION m_gamma2 DOUBLE PRECISION m_thet1 DOUBLE PRECISION m_thet2 INTEGER m_IFPHOT *COMMON c_Taupair $ !Spin Polarimeter vector first Tau $ !Spin Polarimeter vector second Tau $ !Clone Spin Polarimeter vector first Tau $ !Clone Spin Polarimeter vector second Tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !phi of HvecTau1 $ !theta of HvecTau1 $ !phi of HvecTau2 $ !theta of HvecTau2 $ !super key
Definition Taupair.h:42
int getNextXtpar(int &key, double &par)
virtual StatusCode finalize()
double getSigmaToT(int layid, int lr, double tdr, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const
int getSdEntrIndex(double entrance) const
TTree * getR2tTree(int layid) const
double getSigmaToTLR(int layid, int lr, double tdr, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const
void getSdpar(int layid, int entr, int lr, double par[]) const
double distToDriftTime(double dist, int layid, int cellid, int lr, double entrance=0.0) const
double getSigma2(int layid, int lr, double dist, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const
double getWireEff(int layid, int cellid) const
double getSigma(int layid, int lr, double dist, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const
double getT0(int layid, int cellid) const
double driftTimeToDist(double drifttime, int layid, int cellid, int lr, double entrance=0.0) const
double getSigmaLR(int layid, int lr, double dist, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const
double getQtpar(int layid, int ord) const
TTree * getNewXtparTree(int layid, int entr, int lr) const
void getXtpar(int layid, int entr, int lr, double par[]) const
MdcCalibFunSvc(const std::string &name, ISvcLocator *svcloc)
double getSigma1(int layid, int lr, double dist, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const
int getXtEntrIndex(double entrance) const
double getVprop(int lay) const
virtual StatusCode initialize()
void handle(const Incident &)
int getNextSdpar(int &key, double &par)
double getTprop(int lay, double z) const
double getF(int layid, int lr, double dist, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const
double getTimeWalk(int layid, double Q) const