285 {
286 if ( !m_beginRun )
287 {
289 if ( sc.isFailure() )
290 {
291 error() <<
"beginRun failed" << endmsg;
292 return StatusCode::FAILURE;
293 }
294 m_beginRun = true;
295 }
296
297 MsgStream log(
msgSvc(), name() );
298 log << MSG::INFO << "in execute()" << endmsg;
299
300 vector<double> Curve_Para, Sigma_Para;
301 int vFlag[3];
302
303
304 for ( int i = 0; i < dedxcursvc->getCurveSize(); i++ )
305 {
306 if ( i == 0 )
307 vFlag[0] = (int)dedxcursvc->getCurve( i );
308 else Curve_Para.push_back( dedxcursvc->getCurve( i ) );
309 }
310 for ( int i = 0; i < dedxcursvc->getSigmaSize(); i++ )
311 {
312 if ( i == 0 )
313 vFlag[1] = (int)dedxcursvc->getSigma( i );
314 else Sigma_Para.push_back( dedxcursvc->getSigma( i ) );
315 }
316
317
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 )
321
322 cout << " size of dedx curve paramters for version 2 is not right!" << endl;
323
324 if ( vFlag[1] == 1 && Sigma_Para.size() != 14 )
325
326 cout << " size of dedx sigma paramters for version 1 is not right!" << endl;
327 if ( vFlag[1] == 2 && Sigma_Para.size() != 21 )
328
329 cout << " size of dedx sigma paramters for version 2 is not right!" << endl;
330 if ( vFlag[1] == 3 && Sigma_Para.size() != 18 )
331
332 cout << " size of dedx sigma paramters for version 3 is not right!" << endl;
333 if ( vFlag[1] == 4 && Sigma_Para.size() != 19 )
334
335 cout << " size of dedx sigma paramters for version 4 is not right!" << endl;
336 if ( vFlag[1] == 5 && Sigma_Para.size() != 22 )
337
338 cout << " size of dedx sigma paramters for version 5 is not right!" << endl;
339
340
341 DataObject* aReconEvent;
342 eventSvc()->findObject( "/Event/Recon", aReconEvent );
343 if ( !aReconEvent )
344 {
345 aReconEvent = new ReconEvent();
346 StatusCode sc = eventSvc()->registerObject( "/Event/Recon", aReconEvent );
347 if ( sc != StatusCode::SUCCESS )
348 {
349 log << MSG::FATAL << "Could not register ReconEvent" << endmsg;
350 return ( StatusCode::FAILURE );
351 }
352 else debug() << "ReconEvent registered successfully" << endmsg;
353 }
354
355 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
356
357 DataObject* aDedxcol;
358 eventSvc()->findObject( "/Event/Recon/RecMdcDedxCol", aDedxcol );
359 if ( aDedxcol )
360 {
361 dataManSvc->clearSubTree( "/Event/Recon/RecMdcDedxCol" );
362 eventSvc()->unregisterObject( "/Event/Recon/RecMdcDedxCol" );
363 }
364
366
368 if ( !dedxsc.isSuccess() )
369 {
370 log << MSG::FATAL << " Could not register Mdc dedx collection" << endmsg;
371 return ( StatusCode::FAILURE );
372 }
373
374 DataObject* aDedxhitcol;
375 eventSvc()->findObject( "/Event/Recon/RecMdcDedxHitCol", aDedxhitcol );
376 if ( aDedxhitcol )
377 {
378 dataManSvc->clearSubTree( "/Event/Recon/RecMdcDedxHitCol" );
379 eventSvc()->unregisterObject( "/Event/Recon/RecMdcDedxHitCol" );
380 }
382 StatusCode dedxhitsc;
384 if ( !dedxhitsc.isSuccess() )
385 {
386 log << MSG::FATAL << " Could not register Mdc dedx collection" << endmsg;
387 return ( StatusCode::FAILURE );
388 }
389
390 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
391 if ( !eventHeader )
392 {
393 log << MSG::INFO << "Could not find Event Header" << endmsg;
394 return ( StatusCode::FAILURE );
395 }
396 int eventNO = eventHeader->eventNumber();
397 int runNO = eventHeader->runNumber();
398 log << MSG::INFO << "now begin the event: runNO= " << runNO << " eventNO= " << eventNO
399 << endmsg;
403 { cout <<
"RunNO2 = " <<
RunNO2 <<
" RunNO1 = " <<
RunNO1 << endl; }
405 int runFlag;
410 else runFlag = 4;
411
412
413 if ( runNO < 0 ) vFlag[2] = 1;
414 else vFlag[2] = 0;
415
416 double tes = -999.0;
417 int esTimeflag = -1;
418 SmartDataPtr<RecEsTimeCol> estimeCol( eventSvc(), "/Event/Recon/RecEsTimeCol" );
419 if ( !estimeCol ) { log << MSG::WARNING << "Could not find EvTimeCol" << endmsg; }
420 else
421 {
422 RecEsTimeCol::iterator iter_evt = estimeCol->begin();
423 for ( ; iter_evt != estimeCol->end(); iter_evt++ )
424 {
425 tes = ( *iter_evt )->getTest();
426 esTimeflag = ( *iter_evt )->getStat();
427 }
428 }
429
430
431 Identifier mdcid;
432 int ntrk;
433 ex_trks.clear();
434 m_trkalgs.clear();
435 if ( !doNewGlobal )
436 {
437 log << MSG::DEBUG << "recalg: " << recalg << endmsg;
438
439
440 if ( recalg == 2 )
441 {
442
443 SmartDataPtr<RecMdcKalTrackCol> newtrkCol( eventSvc(),
444 "/Event/Recon/RecMdcKalTrackCol" );
445 if ( !newtrkCol )
446 {
447 log << MSG::WARNING << "Could not find RecMdcKalTrackCol" << endmsg;
448 return StatusCode::SUCCESS;
449 }
451 ntrk = newtrkCol->size();
452 log << MSG::DEBUG << "track collection size: " << newtrkCol->size() << endmsg;
453
454 RecMdcKalTrackCol::iterator trk = newtrkCol->begin();
455
456 for ( ; trk != newtrkCol->end(); trk++ )
457 {
459
460 HelixSegRefVec gothits = ( *trk )->getVecHelixSegs( ParticleFlag );
461
462 if ( gothits.size() == 0 )
463 {
464 m_trkalg = 0;
465 int trkid = ( *trk )->trackId();
467 }
468 else
469 {
470 m_trkalg = 1;
471 if ( gothits.size() < 2 ) continue;
472 kaltrackrec( trk, mdcid, tes, runNO, eventNO, runFlag, log );
473 }
474 }
475 }
476
477
478 else if ( recalg == 0 )
479 {
480 m_trkalg = 0;
481
482
483 SmartDataPtr<RecMdcTrackCol> newtrkCol( eventSvc(), "/Event/Recon/RecMdcTrackCol" );
484 if ( !newtrkCol )
485 {
486 log << MSG::WARNING << "Could not find RecMdcTrackCol" << endmsg;
487 return StatusCode::SUCCESS;
488 }
489
491 ntrk = newtrkCol->size();
492 log << MSG::DEBUG << "track collection size: " << newtrkCol->size() << endmsg;
493
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,
500 eangle = 0;
501 int Nhits = 0;
502 double ph = 0, ph_hit = 0, pathlength = 0, rphi_path = 0;
503
504 RecMdcTrackCol::iterator trk = newtrkCol->begin();
505 for ( ; trk != newtrkCol->end(); trk++ )
506 {
508
509 MdcDedxTrk trk_ex( **trk );
510 log << MSG::DEBUG << " %%%%% trk id = " << trk_ex.trk_id() << endmsg;
511 log << MSG::DEBUG << " %%%%% initial id = " << ( *trk )->trackId() << endmsg;
512
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];
519
521 Dedx_Helix exhel( IP, a );
522 log << MSG::DEBUG << "MDC Helix 5 parameters: " << a[0] << " " << a[1] << " "
523 << a[2] << " " << a[3] << " " << a[4] << endmsg;
524
525
526 phi0 = a[1];
527 costheta =
cos( M_PI_2 - atan( a[4] ) );
528
529
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;
534
536
537 HitRefVec gothits = ( *trk )->getVecHits();
538 Nhits = gothits.size();
539 log << MSG::DEBUG << "hits size = " << gothits.size() << endmsg;
540 if ( gothits.size() < 2 )
541 {
542 delete dedxhitrefvec;
543 continue;
544 }
545
546
547
548 RecMdcKalHelixSeg* mdcKalHelixSeg = 0;
549 HitRefVec::iterator it_gothit = gothits.begin();
550 for ( ; it_gothit != gothits.end(); it_gothit++ )
551 {
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();
566
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();
572
573 eangle = ( *it_gothit )->getEntra();
574 eangle = eangle /
M_PI;
575 pathlength = exsvc->PathL( ntpFlag, exhel, layid, localwid, zhit );
576 rphi_path = pathlength * sintheta;
577
578
579
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,
583 costheta, tes );
584
585
586
587
588
589
590 if ( runNO <= 5911 && runNO >= 5854 && layid == 14 ) continue;
591 if ( runNO < 0 )
592 {
593 if ( layid < 8 )
594 {
595 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
598 continue;
599 }
600 else if ( layid >= 8 )
601 {
602 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
605 continue;
606 }
607 }
608 else if ( runNO >= 0 )
609 {
610 if ( layid < 8 )
611 {
612 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
615 continue;
616 }
617 else if ( layid >= 8 )
618 {
619 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
622 continue;
623 }
624 }
625
626
627
628
629 if ( ph < 0.0 || ph == 0 ) continue;
630 else
631 {
632
633 dedxhit = new RecMdcDedxHit;
634 dedxhit->setMdcHit( *it_gothit );
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 );
641
642
643 if ( m_rootfile != "no rootfile" ) { m_hitNo_wire->Fill( wid ); }
644
645
646 if ( ntpFlag == 2 )
647 {
648 m_charge1 = ( *trk )->charge();
649 m_t01 = tes;
650 m_driftT = driftT;
651 m_tdc_raw = tdc_raw;
652 m_phraw = adc_raw;
653 m_exraw = ph_hit;
654 m_localwid = localwid;
655 m_wire = wid;
656 m_runNO1 = runNO;
657 m_evtNO1 = eventNO;
658 m_nhit_hit = Nhits;
659 m_doca_in = dd;
660 m_doca_ex = dd;
661 m_driftdist = driftD;
662 m_eangle = eangle;
663 m_costheta1 = costheta;
664 m_pathL = pathlength;
665 m_layer = layid;
666 m_ptrk1 = m_P;
667
668
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;
673 }
674 if ( layid > 3 )
675 {
676 phlist.push_back( ph );
677 phlist_hit.push_back( ph_hit );
678 }
679 }
680 dedxhitList->push_back( dedxhit );
681 dedxhitrefvec->push_back( dedxhit );
682 }
683 trk_ex.set_phlist( phlist );
684 trk_ex.set_phlist_hit( phlist_hit );
685 trk_ex.setVecDedxHits( *dedxhitrefvec );
686 ex_trks.push_back( trk_ex );
687 m_trkalgs.push_back( m_trkalg );
688
689 delete dedxhitrefvec;
690 phlist.clear();
691 phlist_hit.clear();
693 }
694 log << MSG::DEBUG << "size in processing: " << ex_trks.size() << endmsg;
695 }
696
697
698 else if ( recalg == 1 )
699 {
700 m_trkalg = 1;
701
702
703 SmartDataPtr<RecMdcKalTrackCol> newtrkCol( eventSvc(),
704 "/Event/Recon/RecMdcKalTrackCol" );
705 if ( !newtrkCol )
706 {
707 log << MSG::WARNING << "Could not find RecMdcKalTrackCol" << endmsg;
708 return StatusCode::SUCCESS;
709 }
711 ntrk = newtrkCol->size();
712 log << MSG::DEBUG << "track collection size: " << newtrkCol->size() << endmsg;
713
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;
721 int Nhits = 0;
722 double ph = 0, ph_hit = 0, pathlength = 0, rphi_path = 0;
723
724 RecMdcKalTrackCol::iterator trk = newtrkCol->begin();
725 for ( ; trk != newtrkCol->end(); trk++ )
726 {
728
729 MdcDedxTrk trk_ex( **trk, ParticleFlag );
730 log << MSG::DEBUG << " %%%%% trk id = " << trk_ex.trk_id() << endmsg;
731 log << MSG::DEBUG << " %%%%% initial id = " << ( *trk )->trackId() << endmsg;
732
733 HepVector a;
734 HepSymMatrix tkErrM;
735 if ( ParticleFlag > -1 && ParticleFlag < 5 )
736 {
737 DstMdcKalTrack* dstTrk = *trk;
739 tkErrM = dstTrk->
getFError( ParticleFlag );
740 }
741 else
742 {
743 a = ( *trk )->getFHelix();
744 tkErrM = ( *trk )->getFError();
745 }
746
747
748
749 log << MSG::DEBUG << "FHelix 5 parameters: " << a[0] << " " << a[1] << " "
750 << a[2] << " " << a[3] << " " << a[4] << endmsg;
751
752 m_d0E = tkErrM[0][0];
753 m_phi0E = tkErrM[1][1];
754 m_cpaE = tkErrM[2][2];
755 m_z0E = tkErrM[3][3];
756
757 phi0 = a[1];
758 costheta =
cos( M_PI_2 - atan( a[4] ) );
759
760
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] );
764
765 charge = ( a[2] > 0 ) ? 1 : -1;
766
768
769 HelixSegRefVec gothits = ( *trk )->getVecHelixSegs( ParticleFlag );
770
771
772 Nhits = gothits.size();
773 log << MSG::DEBUG << "hits size = " << gothits.size() << endmsg;
774 if ( gothits.size() < 2 )
775 {
776 delete dedxhitrefvec;
777 continue;
778 }
779
780
781
782 RecMdcHit* mdcHit = 0;
783 HelixSegRefVec::iterator it_gothit = gothits.begin();
784 for ( ; it_gothit != gothits.end(); it_gothit++ )
785 {
786 HepVector a_hit_in = ( *it_gothit )->getHelixIncl();
787
789 Dedx_Helix exhel_hit_in( IP, a_hit_in );
790
791 p_hit = 1.0 / fabs( a_hit_in( 3 ) ) * sqrt( 1 + a_hit_in( 5 ) * a_hit_in( 5 ) );
792
793
794
795
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();
813
814 if ( lr == -1 || lr == 2 )
815 {
816 dd_in = dd_in;
817 dd_ex = dd_ex;
818 }
819 else if ( lr == 1 )
820 {
821 dd_in = -dd_in;
822 dd_ex = -dd_ex;
823 }
824
825
826
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;
831
832
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,
836 costheta, tes );
837
838
839
840
841
842
843 if ( runNO <= 5911 && runNO >= 5854 && layid == 14 ) continue;
844 if ( runNO < 0 )
845 {
846 if ( layid < 8 )
847 {
848 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
851 continue;
852 }
853 else if ( layid >= 8 )
854 {
855 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
858 continue;
859 }
860 }
861 else if ( runNO >= 0 )
862 {
863 if ( layid < 8 )
864 {
865 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
868 continue;
869 }
870 else if ( layid >= 8 )
871 {
872 if ( adc_raw < MinHistValue || adc_raw >
MaxHistValue ||
875 continue;
876 }
877 }
878
879
880
881
882 if ( ph < 0.0 || ph == 0 ) continue;
883 else
884 {
885
886 dedxhit = new RecMdcDedxHit;
887 dedxhit->setMdcHit( mdcHit );
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 );
894
895
896 if ( m_rootfile != "no rootfile" ) { m_hitNo_wire->Fill( wid ); }
897
898
899 if ( ntpFlag == 2 )
900 {
901 m_charge1 = ( *trk )->charge();
902 m_t01 = tes;
903 m_driftT = driftT;
904 m_tdc_raw = tdc_raw;
905 m_phraw = adc_raw;
906 m_exraw = ph_hit;
907 m_localwid = localwid;
908 m_wire = wid;
909 m_runNO1 = runNO;
910 m_evtNO1 = eventNO;
911 m_nhit_hit = Nhits;
912 m_doca_in = dd_in;
913 m_doca_ex = dd_ex;
914 m_driftdist = driftD;
915 m_eangle = eangle;
916 m_costheta1 = costheta;
917 m_pathL = pathlength;
918 m_layer = layid;
919 m_ptrk1 = m_P;
920 m_ptrk_hit = p_hit;
921
922
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;
927 }
928 if ( layid > 3 )
929 {
930 phlist.push_back( ph );
931 phlist_hit.push_back( ph_hit );
932 }
933 }
934 dedxhitList->push_back( dedxhit );
935 dedxhitrefvec->push_back( dedxhit );
936 }
937 trk_ex.set_phlist( phlist );
938 trk_ex.set_phlist_hit( phlist_hit );
939 trk_ex.setVecDedxHits( *dedxhitrefvec );
940 ex_trks.push_back( trk_ex );
941 m_trkalgs.push_back( m_trkalg );
942
943 delete dedxhitrefvec;
944 phlist.clear();
945 phlist_hit.clear();
947 }
948 log << MSG::DEBUG << "size in processing: " << ex_trks.size() << endmsg;
949 }
950
951
952
953 if ( ntrk != ex_trks.size() )
954 log << MSG::DEBUG << "ntrkCol size: " << ntrk << " dedxtrk size: " << ex_trks.size()
955 << endmsg;
956
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;
960 int usedhit = 0;
961 double phtm = 0, median = 0, geometric = 0, geometric_trunc = 0, harmonic = 0,
962 harmonic_trunc = 0, transform = 0, logtrunc = 0;
963
965 float probpid_temp = -0.01, expect_temp = -0.01, sigma_temp = -0.01, chidedx_temp = -0.01;
966
967 double dEdx_meas_hit = 0;
968 double dEdx_meas = 0, dEdx_meas_esat = 0, dEdx_meas_norun = 0;
969 int trk_recalg = -1;
970
971 int idedxid = 0;
972 for ( std::vector<MdcDedxTrk>::iterator it = ex_trks.begin(); it != ex_trks.end();
973 it++, idedxid++ )
974 {
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;
981
982 if ( it->trk_ptr_kal() != 0 )
983 {
984 poca_x = it->trk_ptr_kal()->x();
985
986 poca_y = it->trk_ptr_kal()->y();
987 poca_z = it->trk_ptr_kal()->z();
988 }
989 else if ( it->trk_ptr() != 0 )
990 {
991 poca_x = it->trk_ptr()->x();
992 poca_y = it->trk_ptr()->y();
993 poca_z = it->trk_ptr()->z();
994 }
995
996
997 sintheta =
sin( it->theta() );
998 costheta =
cos( it->theta() );
999 ptrk = it->P();
1000 charge = it->charge();
1001 Nhit = it->nsample();
1002 Nphlisthit = it->get_phlist_hit().size();
1003
1004
1005
1006 phtm = it->cal_dedx( truncate );
1007
1008
1009
1010
1011
1012
1013
1014
1015
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 )
1021 {
1022 cout << "***************bad extrk with no hits!!!!!******************" << endl;
1023 continue;
1024 }
1025
1026 usedhit = (int)( Nphlisthit * truncate );
1027
1028
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;
1041
1042
1043
1044 trk_recalg = m_trkalgs[idedxid];
1045
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,
1048 ex_calib );
1050 probpid_temp = -0.01;
1051 expect_temp = -0.01;
1052 sigma_temp = -0.01;
1053 chidedx_temp = -0.01;
1054 for ( int i = 0; i < 5; i++ )
1055 {
1056 if ( it->pprob()[i] > probpid_temp )
1057 {
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];
1063 }
1064 }
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;
1068
1069
1070
1071 resdedx = new RecMdcDedx;
1072 resdedx->setDedxHit( dEdx_meas_hit );
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() );
1083
1084
1085
1086 resdedx->setNumTotalHits( it->nsample() );
1087 resdedx->setNumGoodHits( usedhit );
1088
1089
1090 resdedx->setStatus( trk_recalg );
1091
1092 resdedx->setTruncAlg( m_alg );
1093 resdedx->setParticleId( parType_temp );
1094
1095 resdedx->setVecDedxHits( it->getVecDedxHits() );
1096 resdedx->setMdcTrack( it->trk_ptr() );
1097 resdedx->setMdcKalTrack( it->trk_ptr_kal() );
1098
1099
1100 if ( ntpFlag == 2 )
1101 {
1102 m_phtm = phtm;
1103
1104
1105
1106
1107
1108
1109
1110 m_dEdx_meas = dEdx_meas;
1111
1112 m_poca_x = poca_x;
1113 m_poca_y = poca_y;
1114 m_poca_z = poca_z;
1115 m_ptrk = ptrk;
1116 m_sintheta = sintheta;
1117 m_costheta = costheta;
1118 m_charge = charge;
1119 m_runNO = runNO;
1120 m_evtNO = eventNO;
1121
1122 m_t0 = tes;
1123 m_trackId = it->trk_id();
1124 m_recalg = trk_recalg;
1125
1126 m_nhit = Nhit;
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];
1130
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++ )
1142 {
1143 m_probpid[i] = it->pprob()[i];
1144 m_expectid[i] = it->pexpect()[i];
1145 m_sigmaid[i] = it->pexp_sigma()[i];
1146 }
1147
1148 StatusCode status = m_nt1->write();
1149 if ( status.isFailure() ) { log << MSG::ERROR << "Cannot fill Ntuple n103" << endmsg; }
1150 }
1151
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;
1156
1157 dedxList->push_back( resdedx );
1158 }
1159 }
1160
1161
1162 SmartDataPtr<RecMdcDedxCol> newexCol( eventSvc(), "/Event/Recon/RecMdcDedxCol" );
1163 if ( !newexCol )
1164 {
1165 log << MSG::FATAL << "Could not find RecMdcDedxCol" << endmsg;
1166 return ( StatusCode::SUCCESS );
1167 }
1168 log << MSG::DEBUG << "----------------Begin to check RecMdcDedxCol-----------------"
1169 << endmsg;
1170 RecMdcDedxCol::iterator it_dedx = newexCol->begin();
1171 for ( ; it_dedx != newexCol->end(); it_dedx++ )
1172 {
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 )
1195 << endmsg;
1196 }
1197 return StatusCode::SUCCESS;
1198}
HepGeom::Point3D< double > HepPoint3D
#define Out_RPhi_PathMinCut
#define Iner_DriftDistCut
#define Iner_RPhi_PathMinCut
double sin(const BesAngle a)
double cos(const BesAngle a)
ObjectVector< RecMdcDedxHit > RecMdcDedxHitCol
SmartRefVector< RecMdcDedxHit > DedxHitRefVec
ObjectVector< RecMdcDedx > RecMdcDedxCol
SmartRefVector< RecMdcKalHelixSeg > HelixSegRefVec
SmartRefVector< RecMdcHit > HitRefVec
const HepSymMatrix & getFError(const int pid) const
const HepVector & getFHelix(const int pid) const
void switchtomdctrack(int trkid, Identifier mdcid, double tes, int RunNO, int eventNO, int runFlag, MsgStream log)
void kaltrackrec(RecMdcKalTrackCol::iterator trk, Identifier mdcid, double tes, int RunNO, int eventNO, int runFlag, MsgStream log)
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
_EXTERN_ std::string RecMdcDedxCol
_EXTERN_ std::string RecMdcDedxHitCol