2#include "CLHEP/Geometry/Point3D.h"
3#include "EventModel/Event.h"
4#include "EventModel/EventHeader.h"
5#include "EventModel/EventModel.h"
6#include "EventNavigator/EventNavigator.h"
7#include "GaudiKernel/IPartPropSvc.h"
8#include "GaudiKernel/MsgStream.h"
9#include "GaudiKernel/SmartDataPtr.h"
10#include "HepPDT/ParticleData.hh"
11#include "HepPDT/ParticleDataTable.hh"
12#include "MdcGeom/Constants.h"
13#include "RawEvent/RawDataUtil.h"
16#include "CLHEP/Matrix/SymMatrix.h"
17#include "MdcData/MdcHit.h"
18#include "MdcGeom/BesAngle.h"
19#include "MdcGeom/MdcDetector.h"
20#include "MdcGeom/MdcLayer.h"
21#include "TrkBase/HelixTraj.h"
22#include "TrkBase/TrkPoca.h"
23#include "TrkBase/TrkPocaBase.h"
25#include "EvTimeEvent/RecEsTime.h"
26#include "Identifier/MdcID.h"
27#include "MdcRawEvent/MdcDigi.h"
29#include "GaudiKernel/INTupleSvc.h"
30#include "GaudiKernel/NTuple.h"
32#ifndef ENABLE_BACKWARDS_COMPATIBILITY
42 : Algorithm( name, pSvcLocator ) {
43 declareProperty(
"hist", m_hist = 0 );
44 declareProperty(
"nMcHit", m_nMcHit = 5 );
45 declareProperty(
"mc", m_mc = 1 );
47 declareProperty(
"maxMdcDigi", m_maxMdcDigi = 0 );
48 declareProperty(
"keepBadTdc", m_keepBadTdc = 0 );
49 declareProperty(
"dropHot", m_dropHot = 0 );
50 declareProperty(
"keepUnmatch", m_keepUnmatch = 0 );
52 declareProperty(
"poca", m_poca =
false );
53 declareProperty(
"doSag", m_doSag =
false );
55 declareProperty(
"d0Cut", m_d0Cut = 1. );
56 declareProperty(
"z0Cut", m_z0Cut = 10. );
57 declareProperty(
"debug", m_debug = 0 );
63 MsgStream log(
msgSvc(), name() );
64 StatusCode sc = StatusCode::SUCCESS;
68 sc = service(
"MagneticFieldSvc", m_pIMF );
69 if ( sc != StatusCode::SUCCESS )
71 log << MSG::ERROR <<
"Unable to open Magnetic field service" << endmsg;
72 return StatusCode::FAILURE;
76 IPartPropSvc* p_PartPropSvc;
77 static const bool CREATEIFNOTTHERE(
true );
78 sc = service(
"PartPropSvc", p_PartPropSvc, CREATEIFNOTTHERE );
79 if ( !sc.isSuccess() || 0 == p_PartPropSvc )
81 log << MSG::ERROR <<
" Could not initialize PartPropSvc" << endmsg;
85 m_particleTable = p_PartPropSvc->PDT();
88 sc = service(
"RawDataProviderSvc", irawDataProviderSvc );
92 log << MSG::FATAL <<
"Could not load RawDataProviderSvc!" << endmsg;
93 return StatusCode::FAILURE;
99 if ( !sc.isSuccess() )
101 log << MSG::WARNING <<
" Could not book NTuple" << endmsg;
106 keepedParticles =
new int( 211 );
108 return StatusCode::SUCCESS;
112 MsgStream log(
msgSvc(), name() );
113 log << MSG::INFO <<
"in beginRun()" << endmsg;
116 if ( NULL == m_gm )
return StatusCode::FAILURE;
118 return StatusCode::SUCCESS;
123 setFilterPassed(
false );
124 MsgStream log(
msgSvc(), name() );
125 StatusCode sc = StatusCode::SUCCESS;
128 SmartDataPtr<EventNavigator> navigator( eventSvc(),
"/Event/Navigator" );
131 log << MSG::WARNING <<
" Unable to retrieve EventNavigator" << endmsg;
134 SmartDataPtr<RecMdcTrackCol> recMdcTrackCol( eventSvc(),
"/Event/Recon/RecMdcTrackCol" );
135 SmartDataPtr<RecMdcHitCol> recMdcHitCol( eventSvc(),
"/Event/Recon/RecMdcHitCol" );
141 if ( sc != StatusCode::SUCCESS ) {
return StatusCode::FAILURE; }
146 SmartDataPtr<Event::McParticleCol> mcParticles( eventSvc(),
"/Event/MC/McParticleCol" );
147 SmartDataPtr<Event::MdcMcHitCol> mcHit( eventSvc(),
"/Event/MC/MdcMcHitCol" );
149 { log << MSG::WARNING <<
" Unable to retrieve McParticleCol" << endmsg; }
154 McParticleCol::iterator it = mcParticles->begin();
155 log << MSG::INFO <<
"mcParticles size = " << mcParticles->size()
157 for ( ; it != mcParticles->end(); it++ )
168 if ( !recMdcTrackCol )
170 log << MSG::WARNING <<
" Unable to retrieve recMdcTrackCol" << endmsg;
171 return StatusCode::SUCCESS;
173 t_recTkNum = recMdcTrackCol->size();
176 RecMdcTrackCol::iterator it = recMdcTrackCol->begin();
177 for ( ; it != recMdcTrackCol->end(); it++ )
179 if ( m_mc && navigator )
182 t_mcTkNum = particles.size();
185 if ( sc != StatusCode::SUCCESS )
return StatusCode::FAILURE;
187 sc = fillRecTrack( *it, t_mcTkNum, t_recTkNum );
189 if ( sc != StatusCode::SUCCESS )
return StatusCode::FAILURE;
193 fillRecHits( *recMdcHitCol );
195 if ( m_hist ) { fillEvent(); }
197 return StatusCode::SUCCESS;
203 MsgStream log(
msgSvc(), name() );
204 log << MSG::INFO <<
"in finalize()" << endmsg;
205 std::cout <<
"nTk == " << t_nTk << std::endl;
206 delete keepedParticles;
207 return StatusCode::SUCCESS;
211Hep3Vector MdcNavigation::momentum(
const RecMdcTrack* trk ) {
213 double fi0 = trk->
helix( 1 );
214 double cpa = trk->
helix( 2 );
215 double tanl = trk->
helix( 4 );
218 if ( cpa != 0 ) pxy = 1 / fabs( cpa );
220 double px = pxy * ( -
sin( fi0 ) );
221 double py = pxy *
cos( fi0 );
222 double pz = pxy * tanl;
229StatusCode MdcNavigation::fillRecTrack(
const RecMdcTrack* tk,
int mcTkNum,
int recTkNum ) {
233 m_na_nEvtNoise = nNoise;
235 m_na_recTkNum = recTkNum;
236 CLHEP::Hep3Vector rec_mom =
momentum( tk );
238 m_na_p = rec_mom.mag();
239 m_na_pt = rec_mom.perp();
240 m_na_pz = rec_mom.z();
244 m_na_d0 = tk->
helix( 0 );
245 m_na_phi0 = tk->
helix( 1 );
246 m_na_cpa = tk->
helix( 2 );
247 m_na_z0 = tk->
helix( 3 );
248 m_na_tanl = tk->
helix( 4 );
250 if ( m_na_d0 > m_d0Cut )
252 std::cout << __FILE__ <<
" " << __LINE__ <<
" evtNo: " << t_eventNo
253 <<
" d0:" << std::setw( 5 ) << m_na_d0 <<
">" << m_d0Cut << std::endl;
254 setFilterPassed(
true );
256 if ( m_na_z0 > m_z0Cut )
258 std::cout << __FILE__ <<
" " << __LINE__ <<
" evtNo: " << t_eventNo
259 <<
" z0:" << std::setw( 5 ) << m_na_z0 <<
">" << m_z0Cut << std::endl;
260 setFilterPassed(
true );
263 m_na_d0E = tk->
err( 0 );
264 m_na_phi0E = tk->
err( 2 );
265 m_na_cpaE = tk->
err( 5 );
266 m_na_z0E = tk->
err( 9 );
267 m_na_tanlE = tk->
err( 14 );
270 m_na_chi2 = tk->
chi2();
272 m_na_nDof = tk->
ndof();
273 if ( m_na_nDof > 0 ) { m_na_chi2Dof = m_na_chi2 / (float)m_na_nDof; }
274 else { m_na_chi2Dof = 200.; }
275 m_na_chi2Prob = probab( m_na_nDof, m_na_chi2 );
276 m_na_nSt = tk->
nster();
279 if ( tk->
stat() == 0 ) { t_trkRecoTk++; }
280 else if ( tk->
stat() == 1 ) { t_curlTk++; }
281 else if ( tk->
stat() == 2 ) { t_patRecTk++; }
282 else if ( tk->
stat() == 3 ) { t_xRecTk++; }
283 m_na_tkStat = tk->
stat();
295 HitRefVec::iterator hitIt = hl.begin();
296 for ( ; hitIt != hl.end(); ++hitIt )
298 RecMdcHit* h = *hitIt;
300 if ( h->
getStat() != 0 ) nAct++;
331 if ( havedigi[tlayer][twire] < 0 ) { ++noiseHit; }
339 m_na_nNoise = noiseHit;
340 m_na_nMatch = matchHit;
348 uint32_t getDigiFlag = 0;
349 getDigiFlag += m_maxMdcDigi;
353 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
354 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
358 return StatusCode::SUCCESS;
361StatusCode MdcNavigation::bookNTuple() {
362 MsgStream log(
msgSvc(), name() );
363 StatusCode sc = StatusCode::SUCCESS;
364 g_layerEff =
histoSvc()->book(
"layerEff",
"layerEff", 43, -0.5, 42.5 );
366 NTuplePtr nt1(
ntupleSvc(),
"MdcNavigation/rec" );
367 if ( nt1 ) { g_tupleMc = nt1; }
370 g_tupleMc =
ntupleSvc()->book(
"MdcNavigation/rec", CLID_ColumnWiseTuple,
371 "rec and delta with mc truth" );
374 sc = g_tupleMc->addItem(
"tkStat", m_na_tkStat );
375 sc = g_tupleMc->addItem(
"p", m_na_p );
376 sc = g_tupleMc->addItem(
"pt", m_na_pt );
377 sc = g_tupleMc->addItem(
"pz", m_na_pz );
378 sc = g_tupleMc->addItem(
"d0", m_na_d0 );
379 sc = g_tupleMc->addItem(
"phi0", m_na_phi0 );
380 sc = g_tupleMc->addItem(
"cpa", m_na_cpa );
381 sc = g_tupleMc->addItem(
"z0", m_na_z0 );
382 sc = g_tupleMc->addItem(
"tanl", m_na_tanl );
383 sc = g_tupleMc->addItem(
"d0E", m_na_d0E );
384 sc = g_tupleMc->addItem(
"phi0E", m_na_phi0E );
385 sc = g_tupleMc->addItem(
"cpaE", m_na_cpaE );
386 sc = g_tupleMc->addItem(
"z0E", m_na_z0E );
387 sc = g_tupleMc->addItem(
"tanlE", m_na_tanlE );
388 sc = g_tupleMc->addItem(
"q", m_na_q );
390 sc = g_tupleMc->addItem(
"dP", m_na_dP );
391 sc = g_tupleMc->addItem(
"dPt", m_na_dPt );
392 sc = g_tupleMc->addItem(
"dPz", m_na_dPz );
393 sc = g_tupleMc->addItem(
"dD0", m_na_dD0 );
394 sc = g_tupleMc->addItem(
"dPhi0", m_na_dPhi0 );
395 sc = g_tupleMc->addItem(
"dCpa", m_na_dCpa );
396 sc = g_tupleMc->addItem(
"dZ0", m_na_dZ0 );
397 sc = g_tupleMc->addItem(
"dTanl", m_na_dTanl );
399 sc = g_tupleMc->addItem(
"d0Res", m_na_d0Res );
400 sc = g_tupleMc->addItem(
"phiRes", m_na_phi0Res );
401 sc = g_tupleMc->addItem(
"z0Res", m_na_z0Res );
402 sc = g_tupleMc->addItem(
"tanlRes", m_na_tanlRes );
403 sc = g_tupleMc->addItem(
"cpaRes", m_na_cpaRes );
405 sc = g_tupleMc->addItem(
"recTkNum", m_na_recTkNum );
406 sc = g_tupleMc->addItem(
"mcTkId", m_na_mcTkId );
407 sc = g_tupleMc->addItem(
"mcTkNum", m_na_mcTkNum );
408 sc = g_tupleMc->addItem(
"evtNo", m_na_evtNo );
409 sc = g_tupleMc->addItem(
"nSt", m_na_nSt );
410 sc = g_tupleMc->addItem(
"nDof", m_na_nDof );
411 sc = g_tupleMc->addItem(
"chi2", m_na_chi2 );
412 sc = g_tupleMc->addItem(
"chi2Dof", m_na_chi2Dof );
413 sc = g_tupleMc->addItem(
"chi2Porb", m_na_chi2Prob );
414 sc = g_tupleMc->addItem(
"fiTerm", m_na_fiTerm );
415 sc = g_tupleMc->addItem(
"nMatch", m_na_nMatch );
416 sc = g_tupleMc->addItem(
"nAct", m_na_nAct );
417 sc = g_tupleMc->addItem(
"nTkNoise", m_na_nNoise );
418 sc = g_tupleMc->addItem(
"nEvtNoise", m_na_nEvtNoise );
419 sc = g_tupleMc->addItem(
"nHit", m_na_nHit, 0, 10000 );
420 sc = g_tupleMc->addItem(
"nDigi", m_na_nDigi, 0, 10000 );
421 sc = g_tupleMc->addIndexedItem(
"resid", m_na_nHit, m_na_resid );
422 sc = g_tupleMc->addIndexedItem(
"driftD", m_na_nHit, m_na_driftD );
423 sc = g_tupleMc->addIndexedItem(
"driftT", m_na_nHit, m_na_driftT );
424 sc = g_tupleMc->addIndexedItem(
"doca", m_na_nHit, m_na_doca );
425 sc = g_tupleMc->addIndexedItem(
"entra", m_na_nHit, m_na_entra );
426 sc = g_tupleMc->addIndexedItem(
"zhit", m_na_nHit, m_na_zhit );
427 sc = g_tupleMc->addIndexedItem(
"chi2add", m_na_nHit, m_na_chi2add );
428 sc = g_tupleMc->addIndexedItem(
"flaglr", m_na_nHit, m_na_flaglr );
429 sc = g_tupleMc->addIndexedItem(
"hitStat", m_na_nHit, m_na_hitStat );
430 sc = g_tupleMc->addIndexedItem(
"tdc", m_na_nHit, m_na_Tdc );
431 sc = g_tupleMc->addIndexedItem(
"adc", m_na_nHit, m_na_Adc );
432 sc = g_tupleMc->addIndexedItem(
"act", m_na_nHit, m_na_act );
433 sc = g_tupleMc->addIndexedItem(
"layer", m_na_nHit, m_na_layer );
434 sc = g_tupleMc->addIndexedItem(
"wire", m_na_nHit, m_na_wire );
435 sc = g_tupleMc->addIndexedItem(
"gwire", m_na_nHit, m_na_gwire );
436 sc = g_tupleMc->addIndexedItem(
"hitTkId", m_na_nHit, m_na_hitTkId );
437 sc = g_tupleMc->addIndexedItem(
"digiTkId", m_na_nDigi, m_na_digiTkId );
438 sc = g_tupleMc->addIndexedItem(
"mclayer", m_na_nDigi, m_na_digiLayer );
442 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( g_tupleMc ) << endmsg;
443 return StatusCode::FAILURE;
446 NTuplePtr nt3(
ntupleSvc(),
"MdcNavigation/evt" );
447 if ( nt3 ) { g_tupleEvt = nt3; }
450 g_tupleEvt =
ntupleSvc()->book(
"MdcNavigation/evt", CLID_ColumnWiseTuple,
"event" );
453 sc = g_tupleEvt->addItem(
"nTdsTk", m_na_t3recTk );
454 sc = g_tupleEvt->addItem(
"trkReco", m_na_t3TrkReco );
455 sc = g_tupleEvt->addItem(
"curlFinder", m_na_t3Curl );
456 sc = g_tupleEvt->addItem(
"patRec", m_na_t3PatRec );
457 sc = g_tupleEvt->addItem(
"xRec", m_na_t3XRec );
458 sc = g_tupleEvt->addItem(
"mcTkNum", m_na_t3mcTk );
459 sc = g_tupleEvt->addItem(
"evtNo", m_na_t3evtNo );
460 sc = g_tupleEvt->addItem(
"t0", m_na_t3t0 );
461 sc = g_tupleEvt->addItem(
"t0Truth", m_na_t3t0Truth );
462 sc = g_tupleEvt->addItem(
"t0Stat", m_na_t3t0Stat );
463 sc = g_tupleEvt->addItem(
"runNo", m_na_t3runNo );
464 sc = g_tupleEvt->addItem(
"nDigi", m_na_t3nDigi, 0, 10000 );
465 sc = g_tupleEvt->addIndexedItem(
"layer", m_na_t3nDigi, m_na_t3layer );
466 sc = g_tupleEvt->addIndexedItem(
"wire", m_na_t3nDigi, m_na_t3wire );
467 sc = g_tupleEvt->addIndexedItem(
"gwire", m_na_t3nDigi, m_na_t3gwire );
468 sc = g_tupleEvt->addIndexedItem(
"rt", m_na_t3nDigi, m_na_t3rt );
469 sc = g_tupleEvt->addIndexedItem(
"rtNot0", m_na_t3nDigi, m_na_t3rtNot0 );
470 sc = g_tupleEvt->addIndexedItem(
"rc", m_na_t3nDigi, m_na_t3rc );
471 sc = g_tupleEvt->addIndexedItem(
"phi", m_na_t3nDigi, m_na_t3phi );
472 sc = g_tupleEvt->addIndexedItem(
"ovfl", m_na_t3nDigi, m_na_t3ovfl );
473 sc = g_tupleEvt->addIndexedItem(
"tNum", m_na_t3nDigi, m_na_t3tNum );
478StatusCode MdcNavigation::fillInit() {
479 MsgStream log(
msgSvc(), name() );
480 StatusCode sc = StatusCode::SUCCESS;
489 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(),
"/Event/EventHeader" );
492 t_runNo = evtHead->runNumber();
493 t_eventNo = evtHead->eventNumber();
497 log << MSG::WARNING <<
"Could not retrieve event header" << endmsg;
498 return StatusCode::FAILURE;
500 if ( m_debug ) std::cout <<
"evtNo:" << t_eventNo << std::endl;
505 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
507 if ( !aevtimeCol || aevtimeCol->size() == 0 )
508 { log << MSG::WARNING <<
"Could not find RecEsTimeCol" << endmsg; }
511 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
512 t_t0 = ( *iter_evt )->getTest();
513 t_t0Stat = ( *iter_evt )->getStat();
517 uint32_t getDigiFlag = 0;
518 getDigiFlag += m_maxMdcDigi;
522 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
523 if ( ( mdcDigiVec.size() == 0 ) )
525 log << MSG::WARNING << t_eventNo <<
"No digi or could not find event in MdcDigiVec"
529 for (
int ii = 0; ii < 43; ii++ )
531 for (
int jj = 0; jj < 288; jj++ )
533 havedigi[ii][jj] = -99;
537 for (
int imc = 0; imc < 100; imc++ )
543 for (
int ii = 0; ii < 43; ii++ )
544 for (
int jj = 0; jj < 288; jj++ ) multiTdcCount[ii][jj] = 0;
545 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
546 for ( ;
iter != mdcDigiVec.end();
iter++ )
549 double c = ( *iter )->getChargeChannel();
552 multiTdcCount[l][
w]++;
556 iter = mdcDigiVec.begin();
557 for ( ;
iter != mdcDigiVec.end();
iter++, ++t_i )
560 double c = ( *iter )->getChargeChannel();
565 int tkid = ( *iter )->getTrackIndex();
566 havedigi[l][
w] = tkid;
571 if ( tkid > -1 ) { ++nDigiTk[tkid]; }
579StatusCode MdcNavigation::skipMcParticle(
const McParticle* it,
int nKindKeeped,
int* pid ) {
581 MsgStream log(
msgSvc(), name() );
583 int pdg_code = ( *it ).particleProperty();
584 if ( fabs( pdg_code ) >= 8 )
586 const HepPDT::ParticleData* particles = m_particleTable->particle(
abs( pdg_code ) );
588 { log << MSG::WARNING <<
"Exotic particle found with PDG code " << pdg_code << endmsg; }
592 if ( particles->charge() == 0 )
594 log << MSG::INFO <<
"Skip charge == 0 mc particle " << pdg_code << endmsg;
595 return StatusCode::FAILURE;
600 int mcTkId = ( *it ).trackIndex();
602 SmartDataPtr<Event::MdcMcHitCol> mcMdcMcHitCol( eventSvc(),
"/Event/MC/MdcMcHitCol" );
603 if ( !mcMdcMcHitCol ) { log << MSG::INFO <<
"Could not find MdcMcHit" << endmsg; }
606 Event::MdcMcHitCol::iterator iter_mchit = mcMdcMcHitCol->begin();
607 for ( ; iter_mchit != mcMdcMcHitCol->end(); iter_mchit++ )
609 int iMcTk = ( *iter_mchit )->getTrackIndex();
610 if ( mcTkId == iMcTk ) nMcHit++;
613 if ( nMcHit < m_nMcHit )
return StatusCode::FAILURE;
616 for (
int i = 0; i < nKindKeeped; i++ )
618 if (
abs( pdg_code ) == pid[i] ) keeped =
true;
621 if ( !keeped )
return StatusCode::FAILURE;
623 return StatusCode::SUCCESS;
626StatusCode MdcNavigation::fillEvent() {
627 if ( !g_tupleEvt )
return StatusCode::FAILURE;
628 uint32_t getDigiFlag = 0;
629 getDigiFlag += m_maxMdcDigi;
633 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
635 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
637 for ( ;
iter != mdcDigiVec.end();
iter++, ++t_i )
640 double c = ( *iter )->getChargeChannel();
645 m_na_t3layer[t_i] = l;
646 m_na_t3wire[t_i] =
w;
649 m_na_t3rtNot0[t_i] =
t - t_t0;
651 const MdcDigi* digi =
const_cast<const MdcDigi*
>( *iter );
652 m_na_t3ovfl[t_i] = ( *iter )->getOverflow();
653 m_na_t3tNum[t_i] = ( ( *iter )->getOverflow() & 0xF0 ) >> 4;
656 if ( g_tupleEvt ) m_na_t3nDigi = t_i;
658 m_na_t3TrkReco = t_trkRecoTk;
659 m_na_t3Curl = t_curlTk;
660 m_na_t3PatRec = t_patRecTk;
661 m_na_t3XRec = t_xRecTk;
664 m_na_t3t0Stat = t_t0Stat;
666 m_na_t3recTk = t_recTkNum;
667 m_na_t3mcTk = t_mcTkNum;
669 m_na_t3evtNo = t_eventNo;
670 m_na_t3runNo = t_runNo;
673 return StatusCode::SUCCESS;
676double MdcNavigation::poca(
const MdcDigi* aDigi,
const HepVector helixPar,
677 const HepSymMatrix errMat ) {
681 double ALPHA_loc, rho, pt, kappa, phiIn;
683 double Bz = m_pIMF->getReferField() * 1000.;
684 ALPHA_loc = 333.567 * Bz;
685 charge = ( kappa >= 0 ) ? 1 : -1;
686 rho = ALPHA_loc / kappa;
687 pt = fabs( 1.0 / kappa );
688 HepVector helix( helix );
689 helix[0] = -helixPar[0];
690 helix[1] = helixPar[1] +
pi / 2;
691 helix[2] = -1. / helixPar[2];
692 helix[3] = helixPar[3];
693 helix[4] = helixPar[4];
694 HelixTraj* m_helixTraj;
695 MdcSagTraj* m_wireTraj_I;
696 MdcSWire* m_mdcSWire_I;
698 TrkPoca* m_trkPoca_I;
699 TrkPoca* m_trkPoca_O;
700 MdcSagTraj* m_wireTraj_O;
701 MdcSWire* m_mdcSWire_O;
702 m_helixTraj =
new HelixTraj( helix, errMat );
704 const MdcLayer* layPtr = m_gm->Layer( lay );
705 double fltLenIn = layPtr->
rMid();
706 phiIn = helix[1] + helix[2] * fltLenIn;
708 int wlow = (int)floor( layPtr->
nWires() * tmp.rad() / twopi );
709 int wbig = (int)ceil( layPtr->
nWires() * tmp.rad() / twopi );
718 std::cout <<
" in MdcNavigation lay/4 " << lay / 4 <<
" phi " << tmp <<
" wire " << wireIn
719 <<
" " << wireOut << std::endl;
722StatusCode MdcNavigation::fillRecHits(
RecMdcHitCol& hitCol ) {
724 RecMdcHitCol::iterator itHit = hitCol.begin();
725 for ( ; itHit != hitCol.end(); itHit++ )
727 RecMdcHit* h = *itHit;
730 double ddrift = -999;
735 m_na_resid[ihit] = fabs( ddrift ) - fabs( ddoca );
736 if ( 0 == m_na_lr ) { m_na_resid[ihit] *= -1.0; }
737 m_na_driftD[ihit] = ddrift;
739 m_na_doca[ihit] = ddoca;
741 m_na_zhit[ihit] = h->
getZhit();
744 m_na_hitStat[ihit] = h->
getStat();
745 m_na_Tdc[ihit] = h->
getTdc();
746 m_na_Adc[ihit] = h->
getAdc();
750 m_na_layer[ihit] = tlayer;
751 m_na_wire[ihit] = twire;
756 return StatusCode::SUCCESS;
759double MdcNavigation::probab(
const int& ndof,
const double& chisq ) {
762 static double srtopi = 2.0 / sqrt( 2.0 *
M_PI );
763 static double upl = 100.0;
766 if ( ndof <= 0 ) {
return prob; }
767 if ( chisq < 0.0 ) {
return prob; }
771 if ( chisq > upl ) {
return prob; }
772 double sum =
exp( -0.5 * chisq );
778 if ( m == 1 ) {
return sum; }
779 for (
int i = 2; i <= m; i++ )
781 term = 0.5 * term * chisq / ( i - 1 );
790 double srty = sqrt( chisq );
791 double temp = srty / M_SQRT2;
793 if ( ndof == 1 ) {
return prob; }
794 if ( ndof == 3 ) {
return ( srtopi * srty * sum + prob ); }
796 for (
int i = 1; i <= m; i++ )
798 term = term * chisq / ( 2 * i + 1 );
801 return ( srtopi * srty * sum + prob );
808 double srty = sqrt( chisq ) - sqrt( ndof - 0.5 );
809 if ( srty < 12.0 ) { prob = 0.5 * erfc( srty ); };
**********INTEGER nmxhep !maximum number of particles DOUBLE PRECISION vhep INTEGER jdahep COMMON hepevt $ !serial number $ !number of particles $ !status code $ !particle ident KF $ !parent particles $ !childreen particles $ !four momentum
DECLARE_COMPONENT(BesBdkRc)
HepGeom::Point3D< double > HepPoint3D
std::vector< const RecMdcTrack * > RecMdcTrackVector
std::vector< const Event::McParticle * > McParticleVector
std::vector< MdcDigi * > MdcDigiVec
EvtComplex exp(const EvtComplex &c)
double sin(const BesAngle a)
double cos(const BesAngle a)
ObjectVector< RecMdcHit > RecMdcHitCol
SmartRefVector< RecMdcHit > HitRefVec
IHistogramSvc * histoSvc()
static const int nWireBeforeLayer[43]
const HepSymMatrix err() const
const double chi2() const
const HepVector helix() const
......
static MdcDetector * instance()
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
double phiEPOffset(void) const
MdcNavigation(const std::string &name, ISvcLocator *pSvcLocator)
static double MdcTime(int timeChannel)
virtual Identifier identify() const
const int getFlagLR(void) const
const double getZhit(void) const
const int getStat(void) const
const double getChisqAdd(void) const
const double getAdc(void) const
const Identifier getMdcId(void) const
const double getTdc(void) const
const double getDriftDistRight(void) const
const double getDriftT(void) const
const double getEntra(void) const
const double getDriftDistLeft(void) const
const double getDoca(void) const
const HitRefVec getVecHits(void) const
const double getFiTerm() const