289 if ( sc.isFailure() )
291 error() <<
"beginRun failed" << endmsg;
292 return StatusCode::FAILURE;
297 MsgStream log(
msgSvc(), name() );
298 log << MSG::INFO <<
"in execute()" << endmsg;
300 vector<double> Curve_Para, Sigma_Para;
304 for (
int i = 0; i < dedxcursvc->getCurveSize(); i++ )
307 vFlag[0] = (int)dedxcursvc->getCurve( i );
308 else Curve_Para.push_back( dedxcursvc->getCurve( i ) );
310 for (
int i = 0; i < dedxcursvc->getSigmaSize(); i++ )
313 vFlag[1] = (int)dedxcursvc->getSigma( i );
314 else Sigma_Para.push_back( dedxcursvc->getSigma( i ) );
318 if ( vFlag[0] == 1 && Curve_Para.size() != 5 )
319 cout <<
" size of dedx curve paramters for version 1 is not right!" << endl;
320 if ( vFlag[0] == 2 && Curve_Para.size() != 16 )
322 cout <<
" size of dedx curve paramters for version 2 is not right!" << endl;
324 if ( vFlag[1] == 1 && Sigma_Para.size() != 14 )
326 cout <<
" size of dedx sigma paramters for version 1 is not right!" << endl;
327 if ( vFlag[1] == 2 && Sigma_Para.size() != 21 )
329 cout <<
" size of dedx sigma paramters for version 2 is not right!" << endl;
330 if ( vFlag[1] == 3 && Sigma_Para.size() != 18 )
332 cout <<
" size of dedx sigma paramters for version 3 is not right!" << endl;
333 if ( vFlag[1] == 4 && Sigma_Para.size() != 19 )
335 cout <<
" size of dedx sigma paramters for version 4 is not right!" << endl;
336 if ( vFlag[1] == 5 && Sigma_Para.size() != 22 )
338 cout <<
" size of dedx sigma paramters for version 5 is not right!" << endl;
341 DataObject* aReconEvent;
342 eventSvc()->findObject(
"/Event/Recon", aReconEvent );
346 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon", aReconEvent );
347 if ( sc != StatusCode::SUCCESS )
349 log << MSG::FATAL <<
"Could not register ReconEvent" << endmsg;
350 return ( StatusCode::FAILURE );
352 else debug() <<
"ReconEvent registered successfully" << endmsg;
355 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
357 DataObject* aDedxcol;
358 eventSvc()->findObject(
"/Event/Recon/RecMdcDedxCol", aDedxcol );
361 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcDedxCol" );
362 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcDedxCol" );
368 if ( !dedxsc.isSuccess() )
370 log << MSG::FATAL <<
" Could not register Mdc dedx collection" << endmsg;
371 return ( StatusCode::FAILURE );
374 DataObject* aDedxhitcol;
375 eventSvc()->findObject(
"/Event/Recon/RecMdcDedxHitCol", aDedxhitcol );
378 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcDedxHitCol" );
379 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcDedxHitCol" );
382 StatusCode dedxhitsc;
384 if ( !dedxhitsc.isSuccess() )
386 log << MSG::FATAL <<
" Could not register Mdc dedx collection" << endmsg;
387 return ( StatusCode::FAILURE );
390 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
393 log << MSG::INFO <<
"Could not find Event Header" << endmsg;
394 return ( StatusCode::FAILURE );
396 int eventNO = eventHeader->eventNumber();
397 int runNO = eventHeader->runNumber();
398 log << MSG::INFO <<
"now begin the event: runNO= " << runNO <<
" eventNO= " << eventNO
403 { cout <<
"RunNO2 = " <<
RunNO2 <<
" RunNO1 = " <<
RunNO1 << endl; }
413 if ( runNO < 0 ) vFlag[2] = 1;
418 SmartDataPtr<RecEsTimeCol> estimeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
419 if ( !estimeCol ) { log << MSG::WARNING <<
"Could not find EvTimeCol" << endmsg; }
422 RecEsTimeCol::iterator iter_evt = estimeCol->begin();
423 for ( ; iter_evt != estimeCol->end(); iter_evt++ )
425 tes = ( *iter_evt )->getTest();
426 esTimeflag = ( *iter_evt )->getStat();
437 log << MSG::DEBUG <<
"recalg: " << recalg << endmsg;
443 SmartDataPtr<RecMdcKalTrackCol> newtrkCol( eventSvc(),
444 "/Event/Recon/RecMdcKalTrackCol" );
447 log << MSG::WARNING <<
"Could not find RecMdcKalTrackCol" << endmsg;
448 return StatusCode::SUCCESS;
451 ntrk = newtrkCol->size();
452 log << MSG::DEBUG <<
"track collection size: " << newtrkCol->size() << endmsg;
454 RecMdcKalTrackCol::iterator trk = newtrkCol->begin();
456 for ( ; trk != newtrkCol->end(); trk++ )
460 HelixSegRefVec gothits = ( *trk )->getVecHelixSegs( ParticleFlag );
462 if ( gothits.size() == 0 )
465 int trkid = ( *trk )->trackId();
471 if ( gothits.size() < 2 )
continue;
472 kaltrackrec( trk, mdcid, tes, runNO, eventNO, runFlag, log );
478 else if ( recalg == 0 )
483 SmartDataPtr<RecMdcTrackCol> newtrkCol( eventSvc(),
"/Event/Recon/RecMdcTrackCol" );
486 log << MSG::WARNING <<
"Could not find RecMdcTrackCol" << endmsg;
487 return StatusCode::SUCCESS;
491 ntrk = newtrkCol->size();
492 log << MSG::DEBUG <<
"track collection size: " << newtrkCol->size() << endmsg;
494 vector<double> phlist;
495 vector<double> phlist_hit;
496 double m_d0E = 0, m_phi0E = 0, m_cpaE = 0, m_z0E = 0, phi0 = 0, costheta = 0,
497 sintheta = 0, m_Pt = 0, m_P = 0;
498 int charge = 0, layid = 0, localwid = 0, w0id = 0, wid = 0, lr = -2;
499 double adc_raw = 0, tdc_raw = 0, zhit = 0, driftd = 0, driftD = 0, driftT = 0, dd = 0,
502 double ph = 0, ph_hit = 0, pathlength = 0, rphi_path = 0;
504 RecMdcTrackCol::iterator trk = newtrkCol->begin();
505 for ( ; trk != newtrkCol->end(); trk++ )
510 log << MSG::DEBUG <<
" %%%%% trk id = " << trk_ex.
trk_id() << endmsg;
511 log << MSG::DEBUG <<
" %%%%% initial id = " << ( *trk )->trackId() << endmsg;
513 HepVector a = ( *trk )->helix();
514 HepSymMatrix tkErrM = ( *trk )->err();
515 m_d0E = tkErrM[0][0];
516 m_phi0E = tkErrM[1][1];
517 m_cpaE = tkErrM[2][2];
518 m_z0E = tkErrM[3][3];
520 HepPoint3D IP( 0, 0, 0 );
522 log << MSG::DEBUG <<
"MDC Helix 5 parameters: " << a[0] <<
" " << a[1] <<
" "
523 << a[2] <<
" " << a[3] <<
" " << a[4] << endmsg;
527 costheta =
cos( M_PI_2 - atan( a[4] ) );
530 sintheta =
sin( M_PI_2 - atan( a[4] ) );
531 m_Pt = 1.0 / fabs( a[2] );
532 m_P = m_Pt * sqrt( 1 + a[4] * a[4] );
533 charge = ( a[2] > 0 ) ? 1 : -1;
537 HitRefVec gothits = ( *trk )->getVecHits();
538 Nhits = gothits.size();
539 log << MSG::DEBUG <<
"hits size = " << gothits.size() << endmsg;
540 if ( gothits.size() < 2 )
542 delete dedxhitrefvec;
549 HitRefVec::iterator it_gothit = gothits.begin();
550 for ( ; it_gothit != gothits.end(); it_gothit++ )
552 mdcid = ( *it_gothit )->getMdcId();
555 w0id = geosvc->Layer( layid )->Wirst();
556 wid = w0id + localwid;
557 adc_raw = ( *it_gothit )->getAdc();
558 tdc_raw = ( *it_gothit )->getTdc();
559 log << MSG::INFO <<
"hit layer id " << layid <<
" wire id: " << localwid
560 <<
" adc_raw: " << adc_raw <<
" tdc_raw: " << tdc_raw << endmsg;
561 zhit = ( *it_gothit )->getZhit();
562 lr = ( *it_gothit )->getFlagLR();
563 if ( lr == 2 ) cout <<
"lr = " << lr << endl;
564 if ( lr == 0 || lr == 2 ) driftD = ( *it_gothit )->getDriftDistLeft();
565 else driftD = ( *it_gothit )->getDriftDistRight();
567 driftd =
abs( driftD );
568 dd = ( *it_gothit )->getDoca();
569 if ( lr == 0 || lr == 2 ) dd = -
abs( dd );
570 if ( lr == 1 ) dd =
abs( dd );
571 driftT = ( *it_gothit )->getDriftT();
573 eangle = ( *it_gothit )->getEntra();
574 eangle = eangle /
M_PI;
575 pathlength = exsvc->PathL( ntpFlag, exhel, layid, localwid, zhit );
576 rphi_path = pathlength * sintheta;
580 ph = exsvc->StandardHitCorrec( 0, runFlag, ntpFlag, runNO, eventNO, pathlength, wid,
581 layid, adc_raw, dd, eangle, costheta );
582 ph_hit = exsvc->StandardTrackCorrec( 0, runFlag, ntpFlag, runNO, eventNO, ph,
590 if ( runNO <= 5911 && runNO >= 5854 && layid == 14 )
continue;
595 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
600 else if ( layid >= 8 )
602 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
608 else if ( runNO >= 0 )
612 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
617 else if ( layid >= 8 )
619 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
629 if ( ph < 0.0 || ph == 0 )
continue;
635 dedxhit->setMdcKalHelixSeg( mdcKalHelixSeg );
636 dedxhit->setMdcId( mdcid );
637 dedxhit->setFlagLR( lr );
638 dedxhit->setTrkId( trk_ex.
trk_id() );
639 dedxhit->setDedx( ph_hit );
640 dedxhit->setPathLength( pathlength );
643 if ( m_rootfile !=
"no rootfile" ) { m_hitNo_wire->Fill( wid ); }
648 m_charge1 = ( *trk )->charge();
654 m_localwid = localwid;
661 m_driftdist = driftD;
663 m_costheta1 = costheta;
664 m_pathL = pathlength;
669 m_trackId1 = trk_ex.
trk_id();
670 StatusCode status2 = m_nt2->write();
671 if ( status2.isFailure() )
672 log << MSG::ERROR <<
"Cannot fill Ntuple n102" << endmsg;
676 phlist.push_back( ph );
677 phlist_hit.push_back( ph_hit );
680 dedxhitList->push_back( dedxhit );
681 dedxhitrefvec->push_back( dedxhit );
686 ex_trks.push_back( trk_ex );
687 m_trkalgs.push_back( m_trkalg );
689 delete dedxhitrefvec;
694 log << MSG::DEBUG <<
"size in processing: " << ex_trks.size() << endmsg;
698 else if ( recalg == 1 )
703 SmartDataPtr<RecMdcKalTrackCol> newtrkCol( eventSvc(),
704 "/Event/Recon/RecMdcKalTrackCol" );
707 log << MSG::WARNING <<
"Could not find RecMdcKalTrackCol" << endmsg;
708 return StatusCode::SUCCESS;
711 ntrk = newtrkCol->size();
712 log << MSG::DEBUG <<
"track collection size: " << newtrkCol->size() << endmsg;
714 vector<double> phlist;
715 vector<double> phlist_hit;
716 double m_d0E = 0, m_phi0E = 0, m_cpaE = 0, m_z0E = 0, phi0 = 0, costheta = 0,
717 sintheta = 0, m_Pt = 0, m_P = 0;
718 int charge = 0, layid = 0, localwid = 0, w0id = 0, wid = 0, lr = -2;
719 double p_hit = 0, adc_raw = 0, tdc_raw = 0, zhit = 0, driftd = 0, driftD = 0, driftT = 0,
720 dd_in = 0, dd_ex = 0, eangle = 0;
722 double ph = 0, ph_hit = 0, pathlength = 0, rphi_path = 0;
724 RecMdcKalTrackCol::iterator trk = newtrkCol->begin();
725 for ( ; trk != newtrkCol->end(); trk++ )
730 log << MSG::DEBUG <<
" %%%%% trk id = " << trk_ex.
trk_id() << endmsg;
731 log << MSG::DEBUG <<
" %%%%% initial id = " << ( *trk )->trackId() << endmsg;
735 if ( ParticleFlag > -1 && ParticleFlag < 5 )
739 tkErrM = dstTrk->
getFError( ParticleFlag );
743 a = ( *trk )->getFHelix();
744 tkErrM = ( *trk )->getFError();
749 log << MSG::DEBUG <<
"FHelix 5 parameters: " << a[0] <<
" " << a[1] <<
" "
750 << a[2] <<
" " << a[3] <<
" " << a[4] << endmsg;
752 m_d0E = tkErrM[0][0];
753 m_phi0E = tkErrM[1][1];
754 m_cpaE = tkErrM[2][2];
755 m_z0E = tkErrM[3][3];
758 costheta =
cos( M_PI_2 - atan( a[4] ) );
761 sintheta =
sin( M_PI_2 - atan( a[4] ) );
762 m_Pt = 1.0 / fabs( a[2] );
763 m_P = m_Pt * sqrt( 1 + a[4] * a[4] );
765 charge = ( a[2] > 0 ) ? 1 : -1;
769 HelixSegRefVec gothits = ( *trk )->getVecHelixSegs( ParticleFlag );
772 Nhits = gothits.size();
773 log << MSG::DEBUG <<
"hits size = " << gothits.size() << endmsg;
774 if ( gothits.size() < 2 )
776 delete dedxhitrefvec;
783 HelixSegRefVec::iterator it_gothit = gothits.begin();
784 for ( ; it_gothit != gothits.end(); it_gothit++ )
786 HepVector a_hit_in = ( *it_gothit )->getHelixIncl();
788 HepPoint3D IP( 0, 0, 0 );
791 p_hit = 1.0 / fabs( a_hit_in( 3 ) ) * sqrt( 1 + a_hit_in( 5 ) * a_hit_in( 5 ) );
796 mdcid = ( *it_gothit )->getMdcId();
799 w0id = geosvc->Layer( layid )->Wirst();
800 wid = w0id + localwid;
801 adc_raw = ( *it_gothit )->getAdc();
802 tdc_raw = ( *it_gothit )->getTdc();
803 log << MSG::INFO <<
"hit layer id " << layid <<
" wire id: " << localwid
804 <<
" adc_raw: " << adc_raw <<
" tdc_raw: " << tdc_raw << endmsg;
805 zhit = ( *it_gothit )->getZhit();
806 lr = ( *it_gothit )->getFlagLR();
807 if ( lr == 2 ) cout <<
"lr = " << lr << endl;
808 driftD = ( *it_gothit )->getDD();
809 driftd =
abs( driftD );
810 driftT = ( *it_gothit )->getDT();
811 dd_in = ( *it_gothit )->getDocaIncl();
812 dd_ex = ( *it_gothit )->getDocaExcl();
814 if ( lr == -1 || lr == 2 )
827 eangle = ( *it_gothit )->getEntra();
828 eangle = eangle /
M_PI;
829 pathlength = exsvc->PathL( ntpFlag, exhel_hit_in, layid, localwid, zhit );
830 rphi_path = pathlength * sintheta;
833 ph = exsvc->StandardHitCorrec( 0, runFlag, ntpFlag, runNO, eventNO, pathlength, wid,
834 layid, adc_raw, dd_in, eangle, costheta );
835 ph_hit = exsvc->StandardTrackCorrec( 0, runFlag, ntpFlag, runNO, eventNO, ph,
843 if ( runNO <= 5911 && runNO >= 5854 && layid == 14 )
continue;
848 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
853 else if ( layid >= 8 )
855 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
861 else if ( runNO >= 0 )
865 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
870 else if ( layid >= 8 )
872 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
882 if ( ph < 0.0 || ph == 0 )
continue;
888 dedxhit->setMdcKalHelixSeg( *it_gothit );
889 dedxhit->setMdcId( mdcid );
890 dedxhit->setFlagLR( lr );
891 dedxhit->setTrkId( trk_ex.
trk_id() );
892 dedxhit->setDedx( ph_hit );
893 dedxhit->setPathLength( pathlength );
896 if ( m_rootfile !=
"no rootfile" ) { m_hitNo_wire->Fill( wid ); }
901 m_charge1 = ( *trk )->charge();
907 m_localwid = localwid;
914 m_driftdist = driftD;
916 m_costheta1 = costheta;
917 m_pathL = pathlength;
923 m_trackId1 = trk_ex.
trk_id();
924 StatusCode status2 = m_nt2->write();
925 if ( status2.isFailure() )
926 log << MSG::ERROR <<
"Cannot fill Ntuple n102" << endmsg;
930 phlist.push_back( ph );
931 phlist_hit.push_back( ph_hit );
934 dedxhitList->push_back( dedxhit );
935 dedxhitrefvec->push_back( dedxhit );
940 ex_trks.push_back( trk_ex );
941 m_trkalgs.push_back( m_trkalg );
943 delete dedxhitrefvec;
948 log << MSG::DEBUG <<
"size in processing: " << ex_trks.size() << endmsg;
953 if ( ntrk != ex_trks.size() )
954 log << MSG::DEBUG <<
"ntrkCol size: " << ntrk <<
" dedxtrk size: " << ex_trks.size()
957 double poca_x = 0, poca_y = 0, poca_z = 0;
958 float sintheta = 0, costheta = 0, ptrk = 0, charge = 0;
959 int Nhit = 0, Nphlisthit = 0;
961 double phtm = 0, median = 0, geometric = 0, geometric_trunc = 0, harmonic = 0,
962 harmonic_trunc = 0, transform = 0, logtrunc = 0;
965 float probpid_temp = -0.01, expect_temp = -0.01, sigma_temp = -0.01, chidedx_temp = -0.01;
967 double dEdx_meas_hit = 0;
968 double dEdx_meas = 0, dEdx_meas_esat = 0, dEdx_meas_norun = 0;
972 for ( std::vector<MdcDedxTrk>::iterator it = ex_trks.begin(); it != ex_trks.end();
975 log << MSG::DEBUG <<
"-------------------------------------------------------" << endmsg;
976 log << MSG::DEBUG <<
" trk id =" << it->trk_id() <<
" : P =" << it->P()
977 <<
" Pt =" << it->Pt() <<
" : theta =" << it->theta() <<
" : phi =" << it->phi()
978 <<
" : charge = " << it->charge() << endmsg;
979 log << MSG::DEBUG <<
"all hits on track: " << it->nsample()
980 <<
" phlist size: " << it->get_phlist().size() << endmsg;
982 if ( it->trk_ptr_kal() != 0 )
984 poca_x = it->trk_ptr_kal()->x();
986 poca_y = it->trk_ptr_kal()->y();
987 poca_z = it->trk_ptr_kal()->z();
989 else if ( it->trk_ptr() != 0 )
991 poca_x = it->trk_ptr()->x();
992 poca_y = it->trk_ptr()->y();
993 poca_z = it->trk_ptr()->z();
997 sintheta =
sin( it->theta() );
998 costheta =
cos( it->theta() );
1000 charge = it->charge();
1001 Nhit = it->nsample();
1002 Nphlisthit = it->get_phlist_hit().size();
1006 phtm = it->cal_dedx( truncate );
1016 if ( m_alg == 1 ) dEdx_meas_hit = it->cal_dedx_bitrunc( truncate, 0, usedhit );
1017 else if ( m_alg == 2 ) dEdx_meas_hit = it->cal_dedx_transform( 1 );
1018 else if ( m_alg == 3 ) dEdx_meas_hit = it->cal_dedx_log( 1.0, 1 );
1019 else cout <<
"-------------Truncate Algorithm Error!!!------------------------" << endl;
1020 if ( m_alg == 1 && usedhit == 0 )
1022 cout <<
"***************bad extrk with no hits!!!!!******************" << endl;
1026 usedhit = (int)( Nphlisthit * truncate );
1029 dEdx_meas = exsvc->StandardTrackCorrec( 0, runFlag, ntpFlag, runNO, eventNO,
1030 dEdx_meas_hit,
cos( it->theta() ), tes );
1031 dEdx_meas_esat = exsvc->StandardTrackCorrec( 1, runFlag, ntpFlag, runNO, eventNO,
1032 dEdx_meas_hit,
cos( it->theta() ), tes );
1033 dEdx_meas_norun = exsvc->StandardTrackCorrec( 2, runFlag, ntpFlag, runNO, eventNO,
1034 dEdx_meas_hit,
cos( it->theta() ), tes );
1035 log << MSG::INFO <<
"===================== " << endmsg << endmsg;
1036 log << MSG::DEBUG <<
"dEdx_meas_hit: " << dEdx_meas_hit <<
" dEdx_meas: " << dEdx_meas
1037 <<
" dEdx_meas_esat: " << dEdx_meas_esat <<
" dEdx_meas_norun: " << dEdx_meas_norun
1038 <<
" ptrk: " << it->P() << endmsg;
1039 log << MSG::INFO <<
"ptrk " << ptrk <<
" costhe " << costheta <<
" runno " << runNO
1040 <<
" evtno " << eventNO << endmsg;
1044 trk_recalg = m_trkalgs[idedxid];
1046 if ( dEdx_meas < 0 || dEdx_meas == 0 )
continue;
1047 it->set_dEdx( landau, dEdx_meas, trk_recalg, runFlag, vFlag, tes, Curve_Para, Sigma_Para,
1050 probpid_temp = -0.01;
1051 expect_temp = -0.01;
1053 chidedx_temp = -0.01;
1054 for (
int i = 0; i < 5; i++ )
1056 if ( it->pprob()[i] > probpid_temp )
1059 probpid_temp = it->pprob()[i];
1060 expect_temp = it->pexpect()[i];
1061 sigma_temp = it->pexp_sigma()[i];
1062 chidedx_temp = it->pchi_dedx()[i];
1065 log << MSG::INFO <<
"expect dE/dx: type: " << parType_temp
1066 <<
" probpid: " << probpid_temp <<
" expect: " << expect_temp
1067 <<
" sigma: " << sigma_temp <<
" chidedx: " << chidedx_temp << endmsg;
1073 resdedx->setDedxEsat( dEdx_meas_esat );
1074 resdedx->setDedxNoRun( dEdx_meas_norun );
1075 resdedx->setDedxMoment( it->P() );
1076 resdedx->setTrackId( it->trk_id() );
1077 resdedx->setProbPH( dEdx_meas );
1078 resdedx->setNormPH( dEdx_meas / 550.0 );
1079 resdedx->setDedxExpect( it->pexpect() );
1080 resdedx->setSigmaDedx( it->pexp_sigma() );
1081 resdedx->setPidProb( it->pprob() );
1082 resdedx->setChi( it->pchi_dedx() );
1086 resdedx->setNumTotalHits( it->nsample() );
1087 resdedx->setNumGoodHits( usedhit );
1090 resdedx->setStatus( trk_recalg );
1092 resdedx->setTruncAlg( m_alg );
1093 resdedx->setParticleId( parType_temp );
1095 resdedx->setVecDedxHits( it->getVecDedxHits() );
1096 resdedx->setMdcTrack( it->trk_ptr() );
1097 resdedx->setMdcKalTrack( it->trk_ptr_kal() );
1110 m_dEdx_meas = dEdx_meas;
1116 m_sintheta = sintheta;
1117 m_costheta = costheta;
1123 m_trackId = it->trk_id();
1124 m_recalg = trk_recalg;
1127 m_nphlisthit = Nphlisthit;
1128 m_usedhit = usedhit;
1129 for (
int i = 0; i < Nphlisthit; i++ ) m_dEdx_hit[i] = it->get_phlist_hit()[i];
1131 m_parttype = parType_temp;
1132 m_prob = probpid_temp;
1133 m_expect = expect_temp;
1134 m_sigma = sigma_temp;
1135 m_chidedx = chidedx_temp;
1136 m_chidedxe = it->pchi_dedx()[0];
1137 m_chidedxmu = it->pchi_dedx()[1];
1138 m_chidedxpi = it->pchi_dedx()[2];
1139 m_chidedxk = it->pchi_dedx()[3];
1140 m_chidedxp = it->pchi_dedx()[4];
1141 for (
int i = 0; i < 5; i++ )
1143 m_probpid[i] = it->pprob()[i];
1144 m_expectid[i] = it->pexpect()[i];
1145 m_sigmaid[i] = it->pexp_sigma()[i];
1148 StatusCode status = m_nt1->write();
1149 if ( status.isFailure() ) { log << MSG::ERROR <<
"Cannot fill Ntuple n103" << endmsg; }
1152 log << MSG::INFO <<
"-----------------Summary of this ExTrack----------------" << endmsg
1153 <<
"dEdx_mean: " << dEdx_meas <<
" type: " << parType_temp
1154 <<
" probpid: " << probpid_temp <<
" expect: " << expect_temp
1155 <<
" sigma: " << sigma_temp <<
" chidedx: " << chidedx_temp << endmsg << endmsg;
1157 dedxList->push_back( resdedx );
1162 SmartDataPtr<RecMdcDedxCol> newexCol( eventSvc(),
"/Event/Recon/RecMdcDedxCol" );
1165 log << MSG::FATAL <<
"Could not find RecMdcDedxCol" << endmsg;
1166 return ( StatusCode::SUCCESS );
1168 log << MSG::DEBUG <<
"----------------Begin to check RecMdcDedxCol-----------------"
1170 RecMdcDedxCol::iterator it_dedx = newexCol->begin();
1171 for ( ; it_dedx != newexCol->end(); it_dedx++ )
1173 log << MSG::INFO <<
"retrieved MDC dE/dx:" << endmsg
1174 <<
"dEdx Id: " << ( *it_dedx )->trackId()
1175 <<
" part Id: " << ( *it_dedx )->particleType()
1176 <<
" measured dEdx: " << ( *it_dedx )->probPH()
1177 <<
" dEdx std: " << ( *it_dedx )->normPH() << endmsg
1178 <<
"hits on track: " << ( *it_dedx )->numTotalHits()
1179 <<
" usedhits: " << ( *it_dedx )->numGoodHits() << endmsg
1180 <<
"Electron: expect: " << ( *it_dedx )->getDedxExpect( 0 )
1181 <<
" sigma: " << ( *it_dedx )->getSigmaDedx( 0 )
1182 <<
" chi: " << ( *it_dedx )->chi( 0 ) <<
" prob: " << ( *it_dedx )->getPidProb( 0 )
1183 << endmsg <<
"Muon: expect: " << ( *it_dedx )->getDedxExpect( 1 )
1184 <<
" sigma: " << ( *it_dedx )->getSigmaDedx( 1 )
1185 <<
" chi: " << ( *it_dedx )->chi( 1 ) <<
" prob: " << ( *it_dedx )->getPidProb( 1 )
1186 << endmsg <<
"Pion: expect: " << ( *it_dedx )->getDedxExpect( 2 )
1187 <<
" sigma: " << ( *it_dedx )->getSigmaDedx( 2 )
1188 <<
" chi: " << ( *it_dedx )->chi( 2 ) <<
" prob: " << ( *it_dedx )->getPidProb( 2 )
1189 << endmsg <<
"Kaon: expect: " << ( *it_dedx )->getDedxExpect( 3 )
1190 <<
" sigma: " << ( *it_dedx )->getSigmaDedx( 3 )
1191 <<
" chi: " << ( *it_dedx )->chi( 3 ) <<
" prob: " << ( *it_dedx )->getPidProb( 3 )
1192 << endmsg <<
"Proton: expect: " << ( *it_dedx )->getDedxExpect( 4 )
1193 <<
" sigma: " << ( *it_dedx )->getSigmaDedx( 4 )
1194 <<
" chi: " << ( *it_dedx )->chi( 4 ) <<
" prob: " << ( *it_dedx )->getPidProb( 4 )
1197 return StatusCode::SUCCESS;
1205 int runNO,
int eventNO,
int runFlag, MsgStream log ) {
1206 vector<double> phlist;
1207 vector<double> phlist_hit;
1208 double m_d0E = 0, m_phi0E = 0, m_cpaE = 0, m_z0E = 0, phi0 = 0, costheta = 0, sintheta = 0,
1210 int charge = 0, layid = 0, localwid = 0, w0id = 0, wid = 0, lr = -2;
1211 double adc_raw = 0, tdc_raw = 0, zhit = 0, driftd = 0, driftD = 0, driftT = 0, dd = 0,
1214 double ph = 0, ph_hit = 0, pathlength = 0, rphi_path = 0;
1217 log << MSG::DEBUG <<
" %%%%% trk id = " << trk_ex.
trk_id() << endmsg;
1218 log << MSG::DEBUG <<
" %%%%% initial id = " << ( *trk )->trackId() << endmsg;
1220 HepVector a = ( *trk )->helix();
1221 HepSymMatrix tkErrM = ( *trk )->err();
1222 m_d0E = tkErrM[0][0];
1223 m_phi0E = tkErrM[1][1];
1224 m_cpaE = tkErrM[2][2];
1225 m_z0E = tkErrM[3][3];
1227 HepPoint3D IP( 0, 0, 0 );
1229 log << MSG::DEBUG <<
"MDC Helix 5 parameters: " << a[0] <<
" " << a[1] <<
" "
1230 << a[2] <<
" " << a[3] <<
" " << a[4] << endmsg;
1234 costheta =
cos( M_PI_2 - atan( a[4] ) );
1236 sintheta =
sin( M_PI_2 - atan( a[4] ) );
1237 m_Pt = 1.0 / fabs( a[2] );
1238 m_P = m_Pt * sqrt( 1 + a[4] * a[4] );
1239 charge = ( a[2] > 0 ) ? 1 : -1;
1243 HitRefVec gothits = ( *trk )->getVecHits();
1244 Nhits = gothits.size();
1245 log << MSG::DEBUG <<
"hits size = " << gothits.size() << endmsg;
1249 HitRefVec::iterator it_gothit = gothits.begin();
1250 for ( ; it_gothit != gothits.end(); it_gothit++ )
1252 mdcid = ( *it_gothit )->getMdcId();
1255 w0id = geosvc->Layer( layid )->Wirst();
1256 wid = w0id + localwid;
1257 adc_raw = ( *it_gothit )->getAdc();
1258 tdc_raw = ( *it_gothit )->getTdc();
1259 log << MSG::INFO <<
"hit layer id " << layid <<
" wire id: " << localwid
1260 <<
" adc_raw: " << adc_raw <<
" tdc_raw: " << tdc_raw << endmsg;
1261 zhit = ( *it_gothit )->getZhit();
1262 lr = ( *it_gothit )->getFlagLR();
1263 if ( lr == 2 ) cout <<
"lr = " << lr << endl;
1264 if ( lr == 0 || lr == 2 ) driftD = ( *it_gothit )->getDriftDistLeft();
1265 else driftD = ( *it_gothit )->getDriftDistRight();
1267 driftd =
abs( driftD );
1268 dd = ( *it_gothit )->getDoca();
1269 if ( lr == 0 || lr == 2 ) dd = -
abs( dd );
1270 if ( lr == 1 ) dd =
abs( dd );
1271 driftT = ( *it_gothit )->getDriftT();
1273 eangle = ( *it_gothit )->getEntra();
1274 eangle = eangle /
M_PI;
1275 pathlength = exsvc->PathL( ntpFlag, exhel, layid, localwid, zhit );
1276 rphi_path = pathlength * sintheta;
1281 ph = exsvc->StandardHitCorrec( 0, runFlag, ntpFlag, runNO, eventNO, pathlength, wid, layid,
1282 adc_raw, dd, eangle, costheta );
1284 exsvc->StandardTrackCorrec( 0, runFlag, ntpFlag, runNO, eventNO, ph, costheta, tes );
1290 if ( runNO <= 5911 && runNO >= 5854 && layid == 14 )
continue;
1299 else if ( layid >= 8 )
1306 else if ( runNO >= 0 )
1314 else if ( layid >= 8 )
1324 if ( ph < 0.0 || ph == 0 )
continue;
1330 dedxhit->setMdcKalHelixSeg( mdcKalHelixSeg );
1331 dedxhit->setMdcId( mdcid );
1332 dedxhit->setFlagLR( lr );
1333 dedxhit->setTrkId( trk_ex.
trk_id() );
1334 dedxhit->setDedx( ph_hit );
1335 dedxhit->setPathLength( pathlength );
1338 if ( m_rootfile !=
"no rootfile" ) { m_hitNo_wire->Fill( wid ); }
1343 m_charge1 = ( *trk )->charge();
1346 m_tdc_raw = tdc_raw;
1349 m_localwid = localwid;
1356 m_driftdist = driftD;
1358 m_costheta1 = costheta;
1359 m_pathL = pathlength;
1364 m_trackId1 = trk_ex.
trk_id();
1365 StatusCode status2 = m_nt2->write();
1366 if ( status2.isFailure() ) log << MSG::ERROR <<
"Cannot fill Ntuple n102" << endmsg;
1370 phlist.push_back( ph );
1371 phlist_hit.push_back( ph_hit );
1374 dedxhitList->push_back( dedxhit );
1375 dedxhitrefvec->push_back( dedxhit );
1380 ex_trks.push_back( trk_ex );
1381 m_trkalgs.push_back( m_trkalg );
1383 delete dedxhitrefvec;
1390 int runNO,
int eventNO,
int runFlag, MsgStream log ) {
1391 vector<double> phlist;
1392 vector<double> phlist_hit;
1393 double m_d0E = 0, m_phi0E = 0, m_cpaE = 0, m_z0E = 0, phi0 = 0, costheta = 0, sintheta = 0,
1395 int charge = 0, layid = 0, localwid = 0, w0id = 0, wid = 0, lr = -2;
1396 double p_hit = 0, adc_raw = 0, tdc_raw = 0, zhit = 0, driftd = 0, driftD = 0, driftT = 0,
1397 dd_in = 0, dd_ex = 0, eangle = 0;
1399 double ph = 0, ph_hit = 0, pathlength = 0, rphi_path = 0;
1402 log << MSG::DEBUG <<
" %%%%% trk id = " << trk_ex.
trk_id() << endmsg;
1403 log << MSG::DEBUG <<
" %%%%% initial id = " << ( *trk )->trackId() << endmsg;
1406 HepSymMatrix tkErrM;
1407 if ( ParticleFlag > -1 && ParticleFlag < 5 )
1411 tkErrM = dstTrk->
getFError( ParticleFlag );
1415 a = ( *trk )->getFHelix();
1416 tkErrM = ( *trk )->getFError();
1418 log << MSG::DEBUG <<
"FHelix 5 parameters: " << a[0] <<
" " << a[1] <<
" " << a[2]
1419 <<
" " << a[3] <<
" " << a[4] << endmsg;
1424 m_d0E = tkErrM[0][0];
1425 m_phi0E = tkErrM[1][1];
1426 m_cpaE = tkErrM[2][2];
1427 m_z0E = tkErrM[3][3];
1430 costheta =
cos( M_PI_2 - atan( a[4] ) );
1433 sintheta =
sin( M_PI_2 - atan( a[4] ) );
1434 m_Pt = 1.0 / fabs( a[2] );
1435 m_P = m_Pt * sqrt( 1 + a[4] * a[4] );
1437 charge = ( a[2] > 0 ) ? 1 : -1;
1441 HelixSegRefVec gothits = ( *trk )->getVecHelixSegs( ParticleFlag );
1444 Nhits = gothits.size();
1445 log << MSG::DEBUG <<
"hits size = " << gothits.size() << endmsg;
1449 HelixSegRefVec::iterator it_gothit = gothits.begin();
1450 for ( ; it_gothit != gothits.end(); it_gothit++ )
1452 HepVector a_hit_in = ( *it_gothit )->getHelixIncl();
1454 HepPoint3D IP( 0, 0, 0 );
1457 p_hit = 1.0 / fabs( a_hit_in( 3 ) ) * sqrt( 1 + a_hit_in( 5 ) * a_hit_in( 5 ) );
1462 mdcid = ( *it_gothit )->getMdcId();
1465 w0id = geosvc->Layer( layid )->Wirst();
1466 wid = w0id + localwid;
1467 adc_raw = ( *it_gothit )->getAdc();
1468 tdc_raw = ( *it_gothit )->getTdc();
1469 log << MSG::INFO <<
"hit layer id " << layid <<
" wire id: " << localwid
1470 <<
" adc_raw: " << adc_raw <<
" tdc_raw: " << tdc_raw << endmsg;
1471 zhit = ( *it_gothit )->getZhit();
1472 lr = ( *it_gothit )->getFlagLR();
1473 if ( lr == 2 ) cout <<
"lr = " << lr << endl;
1474 driftD = ( *it_gothit )->getDD();
1475 driftd =
abs( driftD );
1476 driftT = ( *it_gothit )->getDT();
1477 dd_in = ( *it_gothit )->getDocaIncl();
1478 dd_ex = ( *it_gothit )->getDocaExcl();
1480 if ( lr == -1 || lr == 2 )
1493 eangle = ( *it_gothit )->getEntra();
1494 eangle = eangle /
M_PI;
1495 pathlength = exsvc->PathL( ntpFlag, exhel_hit_in, layid, localwid, zhit );
1496 rphi_path = pathlength * sintheta;
1502 ph = exsvc->StandardHitCorrec( 0, runFlag, ntpFlag, runNO, eventNO, pathlength, wid, layid,
1503 adc_raw, dd_in, eangle, costheta );
1506 exsvc->StandardTrackCorrec( 0, runFlag, ntpFlag, runNO, eventNO, ph, costheta, tes );
1514 if ( runNO <= 5911 && runNO >= 5854 && layid == 14 )
continue;
1523 else if ( layid >= 8 )
1530 else if ( runNO >= 0 )
1538 else if ( layid >= 8 )
1549 if ( ph < 0.0 || ph == 0 )
continue;
1555 dedxhit->setMdcKalHelixSeg( *it_gothit );
1556 dedxhit->setMdcId( mdcid );
1557 dedxhit->setFlagLR( lr );
1558 dedxhit->setTrkId( trk_ex.
trk_id() );
1559 dedxhit->setDedx( ph_hit );
1560 dedxhit->setPathLength( pathlength );
1563 if ( m_rootfile !=
"no rootfile" ) { m_hitNo_wire->Fill( wid ); }
1568 m_charge1 = ( *trk )->charge();
1571 m_tdc_raw = tdc_raw;
1574 m_localwid = localwid;
1581 m_driftdist = driftD;
1583 m_costheta1 = costheta;
1584 m_pathL = pathlength;
1590 m_trackId1 = trk_ex.
trk_id();
1591 StatusCode status2 = m_nt2->write();
1592 if ( status2.isFailure() ) log << MSG::ERROR <<
"Cannot fill Ntuple n102" << endmsg;
1596 phlist.push_back( ph );
1597 phlist_hit.push_back( ph_hit );
1600 dedxhitList->push_back( dedxhit );
1601 dedxhitrefvec->push_back( dedxhit );
1606 ex_trks.push_back( trk_ex );
1607 m_trkalgs.push_back( m_trkalg );
1609 delete dedxhitrefvec;