432 {
433
434
435 setFilterPassed( false );
436
437 MsgStream log(
msgSvc(), name() );
438 log << MSG::INFO << "in execute()" << endmsg;
439
440 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
441 int run = eventHeader->runNumber();
442 int event = eventHeader->eventNumber();
443 log << MSG::DEBUG << "run, evtnum = " << run << " , " << event << endmsg;
444
445
446 if ( m_rootput )
447 {
448 m_run = run;
449 m_rec = event;
450 }
451 Ncut[0]++;
453 log << MSG::DEBUG << "ncharg, nneu, tottks = " << evtRecEvent->totalCharged() << " , "
454 << evtRecEvent->totalNeutral() << " , " << evtRecEvent->totalTracks() << endmsg;
455
457
458 if ( m_rootput ) { Gam4pikp::InitVar(); }
459
460
461 if ( m_rootput )
462 {
463 if ( eventHeader->runNumber() < 0 )
464 {
465 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(),
466 "/Event/MC/McParticleCol" );
467 int m_numParticle = 0;
468 if ( !mcParticleCol )
469 {
470
471 return StatusCode::FAILURE;
472 }
473 else
474 {
475 bool psipDecay = false;
476 int rootIndex = -1;
477 Event::McParticleCol::iterator iter_mc = mcParticleCol->begin();
478 for ( ; iter_mc != mcParticleCol->end(); iter_mc++ )
479 {
480 if ( ( *iter_mc )->primaryParticle() ) continue;
481 if ( !( *iter_mc )->decayFromGenerator() ) continue;
482 if ( ( *iter_mc )->particleProperty() == 100443 )
483 {
484 psipDecay = true;
485 rootIndex = ( *iter_mc )->trackIndex();
486 }
487 if ( !psipDecay ) continue;
488 int mcidx = ( ( *iter_mc )->mother() ).trackIndex() - rootIndex;
489 int pdgid = ( *iter_mc )->particleProperty();
490 m_pdgid[m_numParticle] = pdgid;
491 m_motheridx[m_numParticle] = mcidx;
492 m_numParticle += 1;
493 }
494 }
495 m_idxmc = m_numParticle;
496 }
497 }
498
499 Vint iGood, ipip, ipim;
500 iGood.clear();
501 ipip.clear();
502 ipim.clear();
504 ppip.clear();
505 ppim.clear();
506 int nCharge = 0;
507 int ngdcgx = 0;
508 int ncgx = 0;
510 pTrkCh.clear();
511 Hep3Vector
v( 0, 0, 0 );
512 Hep3Vector vv( 0, 0, 0 );
513
514 IVertexDbSvc* vtxsvc;
515 service( "VertexDbSvc", vtxsvc ).ignore();
517 {
523 vv.setX( vertexsigma[0] );
524 vv.setY( vertexsigma[1] );
525 vv.setZ( vertexsigma[2] );
526 }
527
528 if ( run < 0 )
529 {
533 vv[0] = 0.;
534 vv[1] = 0.;
535 vv[2] = 0.;
536 }
537
538 for ( int i = 0; i < evtRecEvent->totalCharged(); i++ )
539 {
540 if ( i >= evtRecTrkCol->size() ) break;
541 ncgx++;
543 if ( !( *itTrk )->isMdcTrackValid() ) continue;
544 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
545 ngdcgx++;
546 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
547
548 HepVector a = mdcTrk->
helix();
549 HepSymMatrix Ea = mdcTrk->
err();
552 VFHelix helixp( pivot, a, Ea );
553 helixp.pivot( IP );
554 HepVector
vec = helixp.a();
555 pTrkCh.push_back( mdcTrk->
p() * mdcTrk->
charge() );
556 iGood.push_back( ( *itTrk )->trackId() );
557 nCharge += mdcTrk->
charge();
558 }
559
560 int nGood = iGood.size();
561 log << MSG::DEBUG << "ngood, totcharge = " << nGood << " , " << nCharge << endmsg;
562 if ( ( nGood < 4 ) ) { return StatusCode::SUCCESS; }
563
564 Ncut[1]++;
566 int ngamx = 0;
567 int ngdgamx = 0;
568 iGam.clear();
570 iGamnofit.clear();
571 for ( int i = evtRecEvent->totalCharged(); i < evtRecEvent->totalTracks(); i++ )
572 {
573 ngamx++;
574 if ( i >= evtRecTrkCol->size() ) break;
576 if ( !( *itTrk )->isEmcShowerValid() ) continue;
577 RecEmcShower* emcTrk = ( *itTrk )->emcShower();
578 Hep3Vector emcpos( emcTrk->
x(), emcTrk->
y(), emcTrk->
z() );
579
580
581
582
583 double dthe = 200.;
584 double dphi = 200.;
585 double dang = 200.;
586
587 ngdgamx++;
588 for ( int j = 0; j < evtRecEvent->totalCharged(); j++ )
589 {
590 if ( j >= evtRecTrkCol->size() ) break;
592 if ( !( *jtTrk )->isExtTrackValid() ) continue;
593 RecExtTrack* extTrk = ( *jtTrk )->extTrack();
596
597 double angd = extpos.angle( emcpos );
598 double thed = extpos.theta() - emcpos.theta();
599 double phid = extpos.deltaPhi( emcpos );
600 thed = fmod( thed + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
601 phid = fmod( phid + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
602
603
604
605
606
607 if ( angd < dang )
608 {
609 dang = angd;
610 dthe = thed;
611 dphi = phid;
612 }
613 }
614
615 double eraw = emcTrk->
energy();
616 dthe = dthe * 180 / ( CLHEP::pi );
617 dphi = dphi * 180 / ( CLHEP::pi );
618 dang = dang * 180 / ( CLHEP::pi );
619
620
621
622
623 iGam.push_back( ( *itTrk )->trackId() );
624 if ( eraw < m_energyThreshold ) continue;
625 if ( dang < 20.0 ) continue;
626 iGamnofit.push_back( ( *itTrk )->trackId() );
627 }
628
629
630 int nGam = iGam.size();
631 int nGamnofit = iGamnofit.size();
632
633 log << MSG::DEBUG << "num Good Photon " << nGam << " , " << evtRecEvent->totalNeutral()
634 << endmsg;
635 if ( nGam < 1 ) { return StatusCode::SUCCESS; }
636 Ncut[2]++;
637
638 if ( nGood > 20 || nGam > 30 ) return StatusCode::SUCCESS;
639
640 if ( m_rootput )
641 {
642 m_idxmdc = nGood;
643 m_idxemc = nGam;
644 }
645
647 pGam.clear();
648 for ( int i = 0; i < nGam; i++ )
649 {
651 RecEmcShower* emcTrk = ( *itTrk )->emcShower();
652 double eraw = emcTrk->
energy();
653 double phi = emcTrk->
phi();
654 double the = emcTrk->
theta();
655 HepLorentzVector ptrk;
656 ptrk.setPx( eraw *
sin( the ) *
cos( phi ) );
657 ptrk.setPy( eraw *
sin( the ) *
sin( phi ) );
658 ptrk.setPz( eraw *
cos( the ) );
659 ptrk.setE( eraw );
660
661
662
663 pGam.push_back( ptrk );
664 }
665
666
667
669
670 for ( int i = 0; i < nGood; i++ )
671 {
673 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
674
675 RecMdcKalTrack* mdcKalTrk =
676 ( *itTrk )->mdcKalTrack();
677
679
680
681
682 if ( mdcKalTrk->
charge() > 0 )
683 {
684 ipip.push_back( iGood[i] );
685 HepLorentzVector ptrk;
686 ptrk.setPx( mdcKalTrk->
px() );
687 ptrk.setPy( mdcKalTrk->
py() );
688 ptrk.setPz( mdcKalTrk->
pz() );
689 double p3 = ptrk.mag();
690 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
691
692 ppip.push_back( ptrk );
693 }
694 else
695 {
696 ipim.push_back( iGood[i] );
697 HepLorentzVector ptrk;
698 ptrk.setPx( mdcKalTrk->
px() );
699 ptrk.setPy( mdcKalTrk->
py() );
700 ptrk.setPz( mdcKalTrk->
pz() );
701 double p3 = ptrk.mag();
702 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
703
704
705
706 ppim.push_back( ptrk );
707 }
708 }
709 int npip = ipip.size();
710 int npim = ipim.size();
711
712 if ( ( npip < 2 ) || ( npim < 2 ) ) return StatusCode::SUCCESS;
713
714 Ncut[3]++;
715
716
717
718
719
720 int icgp1 = -1;
721 int icgp2 = -1;
722 int icgm1 = -1;
723 int icgm2 = -1;
724 int igam = -1;
725 double chisqtrk = 9999.;
726 WTrackParameter wcgp1;
727 WTrackParameter wcgp2;
728 WTrackParameter wcgm1;
729 WTrackParameter wcgm2;
730 int ipip1js = -1;
731 int ipip2js = -1;
732 int ipim1js = -1;
733 int ipim2js = -1;
734 double mcompall = 9999;
735 double mppreclst = 9999;
736 double meelst = 9999;
737 ;
738 double mchic2kpilst = 9999;
739 double chis4c2kpilst = 9999;
740 int type2kpilst = 0;
741 double dtpr2kpilst[4] = { 9999, 9999, 9999, 9999 };
742
744 double mchic01 = 0.0;
745
746 HepLorentzVector pgam( 0, 0, 0, 0 );
748 xorigin[0] = 9999.;
749 xorigin[1] = 9999.;
750 xorigin[2] = 9999.;
751 HepSymMatrix xem( 3, 0 );
752
753 int cl4pi = 0;
754 int clajs = 0;
755 HepLorentzVector p4psipjs( 0.011 * m_ecms, 0.0, 0.0, m_ecms );
756 double psipBetajs = ( p4psipjs.vect() ).mag() / ( p4psipjs.e() );
757 HepLorentzVector p4psip( 0.011 * m_ecms, 0.0, 0.0, m_ecms );
758 double psipBeta = ( p4psip.vect() ).mag() / ( p4psip.e() );
759
760 for ( int ii = 0; ii < npip - 1; ii++ )
761 {
762 RecMdcKalTrack* pip1Trk = ( *( evtRecTrkCol->begin() + ipip[ii] ) )->mdcKalTrack();
763 for ( int ij = ii + 1; ij < npip; ij++ )
764 {
765 RecMdcKalTrack* pip2Trk = ( *( evtRecTrkCol->begin() + ipip[ij] ) )->mdcKalTrack();
766 for ( int ik = 0; ik < npim - 1; ik++ )
767 {
768 RecMdcKalTrack* pim1Trk = ( *( evtRecTrkCol->begin() + ipim[ik] ) )->mdcKalTrack();
769 for ( int il = ik + 1; il < npim; il++ )
770 {
771 RecMdcKalTrack* pim2Trk = ( *( evtRecTrkCol->begin() + ipim[il] ) )->mdcKalTrack();
772 double squar[3] = { 9999., 9999., 9999. };
773 double squarkpi[6] = { 9999., 9999., 9999., 9999., 9999., 9999. };
774 WTrackParameter wvpip1Trk, wvpim1Trk, wvpip2Trk, wvpim2Trk;
775
777 iGoodjs.clear();
779 pTrkjs.clear();
780
781 pTrkjs.push_back( pip1Trk->
p() * pip1Trk->
charge() );
782 pTrkjs.push_back( pip2Trk->
p() * pip2Trk->
charge() );
783 pTrkjs.push_back( pim1Trk->
p() * pim1Trk->
charge() );
784 pTrkjs.push_back( pim2Trk->
p() * pim2Trk->
charge() );
785 iGoodjs.push_back( ipip[ii] );
786 iGoodjs.push_back( ipip[ij] );
787 iGoodjs.push_back( ipim[ik] );
788 iGoodjs.push_back( ipim[il] );
789
790 Gam4pikp::BubbleSort( pTrkjs, iGoodjs );
792 jGoodjs.clear();
794 p4chTrkjs.clear();
795 Vint i4cpip1js, i4cpip2js, i4cpim1js, i4cpim2js;
796 i4cpip1js.clear();
797 i4cpip2js.clear();
798 i4cpim1js.clear();
799 i4cpim2js.clear();
800 i4cpip1js.push_back( iGoodjs[2] );
801 i4cpip2js.push_back( iGoodjs[3] );
802 i4cpim1js.push_back( iGoodjs[1] );
803 i4cpim2js.push_back( iGoodjs[0] );
804 jGoodjs.push_back( i4cpip1js[0] );
805 jGoodjs.push_back( i4cpim1js[0] );
806 jGoodjs.push_back( i4cpip2js[0] );
807 jGoodjs.push_back( i4cpim2js[0] );
808
809 for ( int i = 0; i < 4; i++ )
810 {
812 if ( !( *itTrk )->isMdcTrackValid() ) continue;
813 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
814 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
815 RecMdcKalTrack* mdcKalTrk = ( *itTrk )->mdcKalTrack();
816 double ptrk;
817 HepLorentzVector p4trk;
818 if ( i < 2 )
819 {
821 ptrk = mdcKalTrk->
p();
822 p4trk.setPx( mdcKalTrk->
px() );
823 p4trk.setPy( mdcKalTrk->
py() );
824 p4trk.setPz( mdcKalTrk->
pz() );
825 p4trk.setE( sqrt( ptrk * ptrk +
mpi *
mpi ) );
826 }
827 else
828 {
830 ptrk = mdcKalTrk->
p();
831 p4trk.setPx( mdcKalTrk->
px() );
832 p4trk.setPy( mdcKalTrk->
py() );
833 p4trk.setPz( mdcKalTrk->
pz() );
834 p4trk.setE( sqrt( ptrk * ptrk +
xmass[0] *
xmass[0] ) );
835 }
836 p4trk.boost( -1.0 * psipBetajs, 0.0, 0.0 );
837 p4chTrkjs.push_back( p4trk );
838 }
839 p4psipjs.boost( -1.0 * psipBetajs, 0.0, 0.0 );
840
841 HepLorentzVector p4pipijs = p4chTrkjs[0] + p4chTrkjs[1];
842 HepLorentzVector p4eejs = p4chTrkjs[2] + p4chTrkjs[3];
843 HepLorentzVector p4pipirecjs = p4psipjs - p4pipijs;
844 double mpprecjs = p4pipirecjs.m();
845 double mpipijs = p4pipijs.m();
846 double meejs = p4eejs.m();
847 double mcomp = sqrt( ( mpprecjs - 3.097 ) * ( mpprecjs - 3.097 ) +
848 ( meejs - 3.097 ) * ( meejs - 3.097 ) );
849 if ( mcomp < mcompall )
850 {
851 mcompall = mcomp;
852 ipip1js = i4cpip1js[0];
853 ipim1js = i4cpim1js[0];
854 ipip2js = i4cpip2js[0];
855 ipim2js = i4cpim2js[0];
856 mppreclst = mpprecjs;
857 meelst = meejs;
858 }
859
860 if ( m_rootput )
861 {
862 m_mpprecall = mppreclst;
863 m_meeall = meelst;
864 }
865 }
866 }
867 }
868 }
869
870
871
872
874 iGood4c.clear();
876 pTrk4c.clear();
878 jGood.clear();
880 jsGood.clear();
881
882 if ( mcompall > 9997 ) return StatusCode::SUCCESS;
883
884 jsGood.push_back( ipip1js );
885 jsGood.push_back( ipim1js );
886 jsGood.push_back( ipip2js );
887 jsGood.push_back( ipim2js );
888
889 for ( int i = 0; i < evtRecEvent->totalCharged(); i++ )
890 {
891 if ( i >= evtRecTrkCol->size() ) break;
893 if ( !( *itTrk )->isMdcTrackValid() ) continue;
894 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
895 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
896 if ( ( i != ipip1js ) && ( i != ipim1js ) && ( i != ipip2js ) && ( i != ipim2js ) )
897 { jsGood.push_back( i ); }
898 }
899
900 int njsGood = jsGood.size();
901
902 if ( m_rootput )
903 {
904 for ( int i = 0; i < njsGood; i++ )
905 {
907 if ( !( *itTrk )->isMdcTrackValid() ) continue;
908 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
909 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
910 RecMdcKalTrack* mdcKalTrk = ( *itTrk )->mdcKalTrack();
911 double ptrk;
912 ptrk = mdcKalTrk->
p();
913 m_x0js[i] = mdcTrk->
x();
914 m_y0js[i] = mdcTrk->
y();
915 m_z0js[i] = mdcTrk->
z();
916 m_r0js[i] = mdcTrk->
r();
917 m_ppmdcjs[i] = mdcTrk->
p();
918 m_pxmdcjs[i] = mdcTrk->
px();
919 m_pymdcjs[i] = mdcTrk->
py();
920 m_pzmdcjs[i] = mdcTrk->
pz();
921 m_ppkaljs[i] = mdcKalTrk->
p();
922 Hep3Vector p3jsi( mdcTrk->
px(), mdcTrk->
py(), mdcTrk->
pz() );
923 if ( njsGood > 4 )
924 {
926 RecMdcTrack* mdcTrk5 = ( *itTrk5 )->mdcTrack();
927 Hep3Vector p3js5( mdcTrk5->
px(), mdcTrk5->
py(), mdcTrk5->
pz() );
928 m_angjs5[i] = p3jsi.angle( p3js5 );
929 m_nearjs5[i] = p3jsi.howNear( p3js5 );
930 }
931 if ( njsGood > 5 )
932 {
934 RecMdcTrack* mdcTrk6 = ( *itTrk6 )->mdcTrack();
935 Hep3Vector p3js6( mdcTrk6->
px(), mdcTrk6->
py(), mdcTrk6->
pz() );
936 m_angjs6[i] = p3jsi.angle( p3js6 );
937 m_nearjs6[i] = p3jsi.howNear( p3js6 );
938 }
939
940 m_ptmdcjs[i] = mdcTrk->
pxy();
941 m_ptkaljs[i] = mdcKalTrk->
pxy();
942 double x0 = mdcTrk->
x();
943 double y0 = mdcTrk->
y();
944 double z0 = mdcTrk->
z();
945 double phi0 = mdcTrk->
helix( 1 );
949 double Rxy = ( x0 - xv ) *
cos( phi0 ) + ( y0 - yv ) *
sin( phi0 );
950 double Rz = z0 - zv;
951 m_Rxyjs[i] = Rxy;
952 m_Rzjs[i] = Rz;
953 HepVector a = mdcTrk->
helix();
954 HepSymMatrix Ea = mdcTrk->
err();
957 VFHelix helixp( pivot, a, Ea );
958 helixp.pivot( IP );
959 HepVector
vec = helixp.a();
960 m_Rnxyjs[i] =
vec[0];
962 m_phinjs[i] =
vec[1];
963
964 if ( ( *itTrk )->isTofTrackValid() )
965 {
966 m_bjtofvaljs[i] = 1;
967 m_cotof1js[i] = 1;
968 SmartRefVector<RecTofTrack> tofTrkCol = ( *itTrk )->tofTrack();
969 SmartRefVector<RecTofTrack>::iterator iter_tof = tofTrkCol.begin();
970 for ( ; iter_tof != tofTrkCol.end(); iter_tof++ )
971 {
972 TofHitStatus* status = new TofHitStatus;
973 status->
setStatus( ( *iter_tof )->status() );
975 {
976 m_bjtofjs[i] = 1;
979 m_layertofjs[i] = status->
layer();
982 m_cotof2js[i] = 2;
983 m_betajs[i] = ( *iter_tof )->beta();
984 m_tofjs[i] = ( *iter_tof )->tof();
985 m_tofpathjs[i] = ( *iter_tof )->path();
986 m_zhitjs[i] = ( *iter_tof )->zrhit();
987 m_texejs[i] = ( *iter_tof )->texpElectron();
988 m_texmujs[i] = ( *iter_tof )->texpMuon();
989 m_texpijs[i] = ( *iter_tof )->texpPion();
990 m_texkjs[i] = ( *iter_tof )->texpKaon();
991 m_texprjs[i] = ( *iter_tof )->texpProton();
992 m_dtejs[i] = m_tofjs[i] - m_texejs[i];
993 m_dtmujs[i] = m_tofjs[i] - m_texmujs[i];
994 m_dtpijs[i] = m_tofjs[i] - m_texpijs[i];
995 m_dtkjs[i] = m_tofjs[i] - m_texkjs[i];
996 m_dtprjs[i] = m_tofjs[i] - m_texprjs[i];
997
998 m_sigmaetofjs[i] = ( *iter_tof )->sigma( 0 );
999 m_sigmamutofjs[i] = ( *iter_tof )->sigma( 1 );
1000 m_sigmapitofjs[i] = ( *iter_tof )->sigma( 2 );
1001 m_sigmaktofjs[i] = ( *iter_tof )->sigma( 3 );
1002 m_sigmaprtofjs[i] = ( *iter_tof )->sigma( 4 );
1003 m_t0tofjs[i] = ( *iter_tof )->t0();
1004 m_errt0tofjs[i] = ( *iter_tof )->errt0();
1005
1006 m_tofIDjs[i] = ( *iter_tof )->tofID();
1007 m_clusterIDjs[i] = ( *iter_tof )->tofTrackID();
1008 }
1009 delete status;
1010 }
1011 }
1012
1013 if ( ( *itTrk )->isMdcDedxValid() )
1014 {
1015
1016 RecMdcDedx* dedxTrk = ( *itTrk )->mdcDedx();
1017 m_chiejs[i] = dedxTrk->
chiE();
1018 m_chimujs[i] = dedxTrk->
chiMu();
1019 m_chipijs[i] = dedxTrk->
chiPi();
1020 m_chikjs[i] = dedxTrk->
chiK();
1021 m_chipjs[i] = dedxTrk->
chiP();
1024 m_probphjs[i] = dedxTrk->
probPH();
1025 m_normphjs[i] = dedxTrk->
normPH();
1026 }
1027
1028
1029 if ( ( *itTrk )->isEmcShowerValid() )
1030 {
1031 RecEmcShower* emcTrk = ( *itTrk )->emcShower();
1032 m_bjemcjs[i] = 1;
1033 m_emcjs[i] = emcTrk->
energy();
1034 m_evpjs[i] = emcTrk->
energy() / ptrk;
1035 m_timecgjs[i] = emcTrk->
time();
1036
1037 }
1038
1039
1040 if ( ( *itTrk )->isMucTrackValid() )
1041 {
1042 RecMucTrack* mucTrk = ( *itTrk )->mucTrack();
1043 double dpthp = mucTrk->
depth() / 25.0;
1044
1045 m_bjmucjs[i] = 1;
1046 m_depthmucjs[i] = mucTrk->
depth();
1048 }
1049
1050 m_cosmdcjs[i] =
cos( mdcTrk->
theta() );
1051 m_phimdcjs[i] = mdcTrk->
phi();
1052
1062
1063 m_dedxpidjs[i] = pid->
chiDedx( 2 );
1064 m_tof1pidjs[i] = pid->
chiTof1( 2 );
1065 m_tof2pidjs[i] = pid->
chiTof2( 2 );
1071 }
1072 }
1073
1075 jGam2kpi.clear();
1076
1077 Vint iGood2kpi, ipip2kpi, ipim2kpi;
1078 iGood2kpi.clear();
1079 ipip2kpi.clear();
1080 ipim2kpi.clear();
1081 Vp4 ppip2kpi, ppim2kpi;
1082 ppip2kpi.clear();
1083 ppim2kpi.clear();
1084
1085 Vint ipipnofit, ipimnofit, ikpnofit, ikmnofit, ipropnofit, ipromnofit;
1086 ipipnofit.clear();
1087 ipimnofit.clear();
1088 ikpnofit.clear();
1089 ikmnofit.clear();
1090 ipropnofit.clear();
1091 ipromnofit.clear();
1092 Vp4 ppipnofit, ppimnofit, pkpnofit, pkmnofit, ppropnofit, ppromnofit;
1093 ppipnofit.clear();
1094 ppimnofit.clear();
1095 pkpnofit.clear();
1096 pkmnofit.clear();
1097 ppropnofit.clear();
1098 ppromnofit.clear();
1099
1101 p3pip2kpi.clear();
1103 p3pim2kpi.clear();
1104
1106 itrak2kpi.clear();
1107 int cls2kpi = 0;
1108 double chis2kpi = 9999.;
1109 double m4piall = 9999.;
1110 double m4kall = 9999.;
1111 double mgam4piall = 9999.;
1112 double mgam4kall = 9999.;
1113 for ( int i = 0; i < evtRecEvent->totalCharged(); i++ )
1114 {
1115 if ( i >= evtRecTrkCol->size() ) break;
1117 if ( !( *itTrk )->isMdcTrackValid() ) continue;
1118 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
1119 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
1120 double z02kpi = mdcTrk->
z();
1121 double r02kpi = mdcTrk->
r();
1122 HepVector a = mdcTrk->
helix();
1123 HepSymMatrix Ea = mdcTrk->
err();
1126 VFHelix helixp( pivot, a, Ea );
1127 helixp.pivot( IP );
1128 HepVector
vec = helixp.a();
1129 double Rnxy02kpi =
vec[0];
1130 double Rnz02kpi =
vec[3];
1131
1132
1133 iGood2kpi.push_back( ( *itTrk )->trackId() );
1134 }
1135 int nGood2kpi = iGood2kpi.size();
1136 if ( nGood2kpi == 4 )
1137 {
1138 for ( int i = 0; i < nGood2kpi; i++ )
1139 {
1141 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
1142 RecMdcKalTrack* mdcKalTrk = ( *itTrk )->mdcKalTrack();
1143 if ( mdcKalTrk->
charge() > 0 )
1144 {
1145 ipip2kpi.push_back( iGood2kpi[i] );
1146 p3pip2kpi.push_back( mdcKalTrk->
p() );
1147 HepLorentzVector ptrk;
1148 ptrk.setPx( mdcKalTrk->
px() );
1149 ptrk.setPy( mdcKalTrk->
py() );
1150 ptrk.setPz( mdcKalTrk->
pz() );
1151 double p3 = ptrk.mag();
1152 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
1153 ppip2kpi.push_back( ptrk );
1154 }
1155 else
1156 {
1157 ipim2kpi.push_back( iGood2kpi[i] );
1158 p3pim2kpi.push_back( mdcKalTrk->
p() );
1159 HepLorentzVector ptrk;
1160 ptrk.setPx( mdcKalTrk->
px() );
1161 ptrk.setPy( mdcKalTrk->
py() );
1162 ptrk.setPz( mdcKalTrk->
pz() );
1163 double p3 = ptrk.mag();
1164 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
1165 ppim2kpi.push_back( ptrk );
1166 }
1167 }
1168 int npip2kpi = ipip2kpi.size();
1169 int npim2kpi = ipim2kpi.size();
1170
1172
1173 if ( m_rootput ) { m_cy2kpi = 6; }
1174
1175 if ( ( npip2kpi == 2 ) && ( npim2kpi == 2 ) )
1176 {
1177
1178
1179 Ncut[4]++;
1180
1182 xorigin2kpi[0] = 9999.;
1183 xorigin2kpi[1] = 9999.;
1184 xorigin2kpi[2] = 9999.;
1185 HepSymMatrix xem2kpi( 3, 0 );
1186
1187 Gam4pikp::BubbleSort( p3pip2kpi, ipip2kpi );
1188 Gam4pikp::BubbleSort( p3pim2kpi, ipim2kpi );
1189
1190 Mcut[1]++;
1191 RecMdcKalTrack* pip12kpiTrk =
1192 ( *( evtRecTrkCol->begin() + ipip2kpi[0] ) )->mdcKalTrack();
1193 RecMdcKalTrack* pip22kpiTrk =
1194 ( *( evtRecTrkCol->begin() + ipip2kpi[1] ) )->mdcKalTrack();
1195 RecMdcKalTrack* pim12kpiTrk =
1196 ( *( evtRecTrkCol->begin() + ipim2kpi[0] ) )->mdcKalTrack();
1197 RecMdcKalTrack* pim22kpiTrk =
1198 ( *( evtRecTrkCol->begin() + ipim2kpi[1] ) )->mdcKalTrack();
1199 double squar2kpi[10] = { 9999., 9999., 9999., 9999., 9999.,
1200 9999., 9999., 9999., 9999., 9999. };
1201 double mc12kpi = 0.0, mc22kpi = 0.0, mc32kpi = 0.0, mc42kpi = 0.0;
1202
1203 WTrackParameter wcgp12kpi;
1204 WTrackParameter wcgp22kpi;
1205 WTrackParameter wcgm12kpi;
1206 WTrackParameter wcgm22kpi;
1207 int icgp12kpi = -1;
1208 int icgp22kpi = -1;
1209 int icgm12kpi = -1;
1210 int icgm22kpi = -1;
1211 int igam2kpi = -1;
1212 double m2kpi = 9999;
1213
1214 int n20 = 0;
1215 int n30 = 0;
1216 WTrackParameter wvpip12kpiTrk, wvpim12kpiTrk, wvpip22kpiTrk, wvpim22kpiTrk;
1217 for ( int k = 0; k < 6; k++ )
1218 {
1219 if ( k == 0 )
1220 {
1225 }
1226 if ( k == 1 )
1227 {
1232 }
1233 if ( k == 2 )
1234 {
1239 }
1240 if ( k == 3 )
1241 {
1246 }
1247 if ( k == 4 )
1248 {
1253 }
1254 if ( k == 5 )
1255 {
1260 }
1261
1262 wvpip12kpiTrk =
1264 wvpip22kpiTrk =
1266 wvpim12kpiTrk =
1268 wvpim22kpiTrk =
1271 HepSymMatrix Evx( 3, 0 );
1272 double bx = 1E+6;
1273 double by = 1E+6;
1274 double bz = 1E+6;
1275 Evx[0][0] = bx * bx;
1276 Evx[1][1] = by * by;
1277 Evx[2][2] = bz * bz;
1278 VertexParameter vxpar;
1283 vtxfit->
AddTrack( 0, wvpip12kpiTrk );
1284 vtxfit->
AddTrack( 1, wvpim12kpiTrk );
1285 vtxfit->
AddTrack( 2, wvpip22kpiTrk );
1286 vtxfit->
AddTrack( 3, wvpim22kpiTrk );
1287 vtxfit->
AddVertex( 0, vxpar, 0, 1, 2, 3 );
1288 if ( !vtxfit->
Fit( 0 ) )
continue;
1290 WTrackParameter wpip12kpi = vtxfit->
wtrk( 0 );
1291 WTrackParameter wpim12kpi = vtxfit->
wtrk( 1 );
1292 WTrackParameter wpip22kpi = vtxfit->
wtrk( 2 );
1293 WTrackParameter wpim22kpi = vtxfit->
wtrk( 3 );
1294 WTrackParameter wpip12kpiys = vtxfit->
wtrk( 0 );
1295 WTrackParameter wpim12kpiys = vtxfit->
wtrk( 1 );
1296 WTrackParameter wpip22kpiys = vtxfit->
wtrk( 2 );
1297 WTrackParameter wpim22kpiys = vtxfit->
wtrk( 3 );
1298 xorigin2kpi = vtxfit->
vx( 0 );
1299 xem2kpi = vtxfit->
Evx( 0 );
1301
1302 HepLorentzVector
ecms( 0.040547, 0, 0, 3.68632 );
1303
1304 double chisq = 9999.;
1305 int ig1 = -1;
1306 for ( int i = 0; i < nGam; i++ )
1307 {
1308 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + iGam[i] ) )->emcShower();
1318
1319 bool oksq = kmfit->
Fit();
1320 if ( oksq )
1321 {
1322 double chi2 = kmfit->
chisq();
1323 if ( chi2 < chisq )
1324 {
1325 chisq = chi2;
1326 squar2kpi[k] = chi2;
1327 ig1 = iGam[i];
1328 }
1329 }
1330 }
1331 if ( squar2kpi[k] < 200 && squar2kpi[k] < chis2kpi )
1332 {
1333
1334 chis2kpi = squar2kpi[k];
1335 if ( squar2kpi[k] < 20 ) n20 = n20 + 1;
1336 if ( squar2kpi[k] < 30 ) n30 = n30 + 1;
1337
1338 icgp12kpi = ipip2kpi[0];
1339 icgp22kpi = ipip2kpi[1];
1340 icgm12kpi = ipim2kpi[0];
1341 icgm22kpi = ipim2kpi[1];
1342 igam2kpi = ig1;
1343 wcgp12kpi = wpip12kpiys;
1344 wcgp22kpi = wpip22kpiys;
1345 wcgm12kpi = wpim12kpiys;
1346 wcgm22kpi = wpim22kpiys;
1347 cls2kpi = k;
1348
1349 if ( k == 0 )
1350 {
1351 itrak2kpi.push_back( ipip2kpi[0] );
1352 itrak2kpi.push_back( ipim2kpi[0] );
1353 itrak2kpi.push_back( ipip2kpi[1] );
1354 itrak2kpi.push_back( ipim2kpi[1] );
1355 }
1356
1357 if ( k == 1 )
1358 {
1359 itrak2kpi.push_back( ipip2kpi[0] );
1360 itrak2kpi.push_back( ipim2kpi[0] );
1361 itrak2kpi.push_back( ipip2kpi[1] );
1362 itrak2kpi.push_back( ipim2kpi[1] );
1363 }
1364
1365 if ( k == 2 )
1366 {
1367 itrak2kpi.push_back( ipip2kpi[0] );
1368 itrak2kpi.push_back( ipim2kpi[0] );
1369 itrak2kpi.push_back( ipip2kpi[1] );
1370 itrak2kpi.push_back( ipim2kpi[1] );
1371 }
1372
1373 if ( k == 3 )
1374 {
1375 itrak2kpi.push_back( ipip2kpi[1] );
1376 itrak2kpi.push_back( ipim2kpi[1] );
1377 itrak2kpi.push_back( ipip2kpi[0] );
1378 itrak2kpi.push_back( ipim2kpi[0] );
1379 }
1380
1381 if ( k == 4 )
1382 {
1383 itrak2kpi.push_back( ipip2kpi[0] );
1384 itrak2kpi.push_back( ipim2kpi[1] );
1385 itrak2kpi.push_back( ipip2kpi[1] );
1386 itrak2kpi.push_back( ipim2kpi[0] );
1387 }
1388
1389 if ( k == 5 )
1390 {
1391 itrak2kpi.push_back( ipip2kpi[1] );
1392 itrak2kpi.push_back( ipim2kpi[0] );
1393 itrak2kpi.push_back( ipip2kpi[0] );
1394 itrak2kpi.push_back( ipim2kpi[1] );
1395 }
1396
1397 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + igam2kpi ) )->emcShower();
1407 bool oksq = kmfit->
Fit();
1408 if ( oksq )
1409 {
1410 HepLorentzVector pchic2kpi =
1412 HepLorentzVector ppsip2kpi = kmfit->
pfit( 0 ) + kmfit->
pfit( 1 ) +
1413 kmfit->
pfit( 2 ) + kmfit->
pfit( 3 ) +
1415 mchic2kpilst = pchic2kpi.m();
1416 chis4c2kpilst = kmfit->
chisq();
1417 if ( m_rootput )
1418 {
1419 m_mchic2kpi = pchic2kpi.m();
1420 m_chis2kpi = kmfit->
chisq();
1421 m_mpsip2kpi = ppsip2kpi.m();
1422 }
1423 }
1424 }
1425 }
1426
1427 if ( chis2kpi < 200 )
1428 {
1429 Ncut[5]++;
1430 if ( m_rootput )
1431 {
1432 m_ncy20 = n20;
1433 m_ncy30 = n30;
1434 m_cla2kpi = cls2kpi;
1435 }
1436 type2kpilst = cls2kpi;
1437
1439 p2kpi.clear();
1440
1441 for ( int i = 0; i < 4; i++ )
1442 {
1444 if ( !( *itTrk )->isMdcTrackValid() ) continue;
1445 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
1446 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
1447 RecMdcKalTrack* mdcKalTrk = ( *itTrk )->mdcKalTrack();
1448 double ptrk2kpi;
1449 HepLorentzVector p4trk2kpi;
1450 if ( cls2kpi == 1 )
1451 {
1453 ptrk2kpi = mdcKalTrk->
p();
1454 p4trk2kpi.setPx( mdcKalTrk->
px() );
1455 p4trk2kpi.setPy( mdcKalTrk->
py() );
1456 p4trk2kpi.setPz( mdcKalTrk->
pz() );
1457 p4trk2kpi.setE( sqrt( ptrk2kpi * ptrk2kpi +
mk *
mk ) );
1458 p2kpi.push_back( p4trk2kpi );
1459 }
1460
1461 if ( cls2kpi == 2 )
1462 {
1463 if ( i < 2 )
1464 {
1466 ptrk2kpi = mdcKalTrk->
p();
1467 p4trk2kpi.setPx( mdcKalTrk->
px() );
1468 p4trk2kpi.setPy( mdcKalTrk->
py() );
1469 p4trk2kpi.setPz( mdcKalTrk->
pz() );
1470 p4trk2kpi.setE( sqrt( ptrk2kpi * ptrk2kpi +
mpi *
mpi ) );
1471 p2kpi.push_back( p4trk2kpi );
1472 }
1473 else
1474 {
1476 ptrk2kpi = mdcKalTrk->
p();
1477 p4trk2kpi.setPx( mdcKalTrk->
px() );
1478 p4trk2kpi.setPy( mdcKalTrk->
py() );
1479 p4trk2kpi.setPz( mdcKalTrk->
pz() );
1480 p4trk2kpi.setE( sqrt( ptrk2kpi * ptrk2kpi +
mpro *
mpro ) );
1481 p2kpi.push_back( p4trk2kpi );
1482 }
1483 }
1484 if ( cls2kpi != 1 && cls2kpi != 2 )
1485 {
1487 ptrk2kpi = mdcKalTrk->
p();
1488 p4trk2kpi.setPx( mdcKalTrk->
px() );
1489 p4trk2kpi.setPy( mdcKalTrk->
py() );
1490 p4trk2kpi.setPz( mdcKalTrk->
pz() );
1491 p4trk2kpi.setE( sqrt( ptrk2kpi * ptrk2kpi +
mpi *
mpi ) );
1492 p2kpi.push_back( p4trk2kpi );
1493 }
1494 }
1495
1496 for ( int i = 0; i < 4; i++ )
1497 {
1499 if ( !( *itTrk )->isMdcTrackValid() ) continue;
1500 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
1501 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
1502 RecMdcKalTrack* mdcKalTrk = ( *itTrk )->mdcKalTrack();
1503 if ( ( *itTrk )->isTofTrackValid() )
1504 {
1505 SmartRefVector<RecTofTrack> tofTrkCol = ( *itTrk )->tofTrack();
1506 SmartRefVector<RecTofTrack>::iterator iter_tof = tofTrkCol.begin();
1507 for ( ; iter_tof != tofTrkCol.end(); iter_tof++ )
1508 {
1509 TofHitStatus* status = new TofHitStatus;
1510 status->
setStatus( ( *iter_tof )->status() );
1512 { dtpr2kpilst[i] = ( ( *iter_tof )->tof() - ( *iter_tof )->texpProton() ); }
1513 delete status;
1514 }
1515 }
1516 }
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550 Mcut[2]++;
1551 if ( m_rootput )
1552 {
1553 for ( int i = 0; i < 4; i++ )
1554 {
1556 if ( !( *itTrk )->isMdcTrackValid() ) continue;
1557 RecMdcTrack* mdcTrk = ( *itTrk )->mdcTrack();
1558 if ( !( *itTrk )->isMdcKalTrackValid() ) continue;
1559 RecMdcKalTrack* mdcKalTrk = ( *itTrk )->mdcKalTrack();
1560 m_ppmdc2kpi[i] = mdcTrk->
p();
1561 m_pxmdc2kpi[i] = mdcTrk->
px();
1562 m_pymdc2kpi[i] = mdcTrk->
py();
1563 m_pzmdc2kpi[i] = mdcTrk->
pz();
1564 m_ppkal2kpi[i] = mdcKalTrk->
p();
1565 m_charge2kpi[i] = mdcKalTrk->
charge();
1566 double ptrk;
1567 ptrk = mdcKalTrk->
p();
1568
1569 if ( eventHeader->runNumber() < 0 )
1570 {
1571 double mcall = 9999;
1572 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(),
1573 "/Event/MC/McParticleCol" );
1574 int m_numParticle = 0;
1575 if ( !mcParticleCol )
1576 {
1577
1578
1579 return StatusCode::FAILURE;
1580 }
1581 else
1582 {
1583 Event::McParticleCol::iterator iter_mc = mcParticleCol->begin();
1584 for ( ; iter_mc != mcParticleCol->end(); iter_mc++ )
1585 {
1586 double commc;
1587 int pdgcode = ( *iter_mc )->particleProperty();
1588 float px, py, pz;
1589 px = ( *iter_mc )->initialFourMomentum().x();
1590 py = ( *iter_mc )->initialFourMomentum().y();
1591 pz = ( *iter_mc )->initialFourMomentum().z();
1592
1593 commc = ptrk * ptrk - px * px - py * py - pz * pz;
1594 if ( fabs( commc ) < fabs( mcall ) )
1595 {
1596 mcall = commc;
1597 m_pdg[i] = pdgcode;
1598 m_cbmc[i] = commc;
1599 }
1600 }
1601 }
1602 }
1603
1604 if ( ( *itTrk )->isTofTrackValid() )
1605 {
1606 m_bjtofval2kpi[i] = 1;
1607 m_cotof12kpi[i] = 1;
1608 SmartRefVector<RecTofTrack> tofTrkCol = ( *itTrk )->tofTrack();
1609 SmartRefVector<RecTofTrack>::iterator iter_tof = tofTrkCol.begin();
1610 for ( ; iter_tof != tofTrkCol.end(); iter_tof++ )
1611 {
1612 TofHitStatus* status = new TofHitStatus;
1613 status->
setStatus( ( *iter_tof )->status() );
1614
1616 {
1617
1618 m_bjtof2kpi[i] = 1;
1621 m_layertof2kpi[i] = status->
layer();
1624 m_cotof22kpi[i] = 2;
1625 m_beta2kpi[i] = ( *iter_tof )->beta();
1626 m_tof2kpi[i] = ( *iter_tof )->tof();
1627 m_tofpath2kpi[i] = ( *iter_tof )->path();
1628 m_zhit2kpi[i] = ( *iter_tof )->zrhit();
1629 m_texe2kpi[i] = ( *iter_tof )->texpElectron();
1630 m_texmu2kpi[i] = ( *iter_tof )->texpMuon();
1631 m_texpi2kpi[i] = ( *iter_tof )->texpPion();
1632 m_texk2kpi[i] = ( *iter_tof )->texpKaon();
1633 m_texpr2kpi[i] = ( *iter_tof )->texpProton();
1634 m_dte2kpi[i] = m_tof2kpi[i] - m_texe2kpi[i];
1635 m_dtmu2kpi[i] = m_tof2kpi[i] - m_texmu2kpi[i];
1636 m_dtpi2kpi[i] = m_tof2kpi[i] - m_texpi2kpi[i];
1637 m_dtk2kpi[i] = m_tof2kpi[i] - m_texk2kpi[i];
1638 m_dtpr2kpi[i] = m_tof2kpi[i] - m_texpr2kpi[i];
1639 m_tofID2kpi[i] = ( *iter_tof )->tofID();
1640 m_clusterID2kpi[i] = ( *iter_tof )->tofTrackID();
1641 m_sigmaetof2kpi[i] = ( *iter_tof )->sigma( 0 );
1642 m_sigmamutof2kpi[i] = ( *iter_tof )->sigma( 1 );
1643 m_sigmapitof2kpi[i] = ( *iter_tof )->sigma( 2 );
1644 m_sigmaktof2kpi[i] = ( *iter_tof )->sigma( 3 );
1645 m_sigmaprtof2kpi[i] = ( *iter_tof )->sigma( 4 );
1646 m_t0tof2kpi[i] = ( *iter_tof )->t0();
1647 m_errt0tof2kpi[i] = ( *iter_tof )->errt0();
1648 }
1649 delete status;
1650 }
1651 }
1652
1653 if ( ( *itTrk )->isMdcDedxValid() )
1654 {
1655 RecMdcDedx* dedxTrk = ( *itTrk )->mdcDedx();
1656 m_chie2kpi[i] = dedxTrk->
chiE();
1657 m_chimu2kpi[i] = dedxTrk->
chiMu();
1658 m_chipi2kpi[i] = dedxTrk->
chiPi();
1659 m_chik2kpi[i] = dedxTrk->
chiK();
1660 m_chip2kpi[i] = dedxTrk->
chiP();
1663 m_probph2kpi[i] = dedxTrk->
probPH();
1664 m_normph2kpi[i] = dedxTrk->
normPH();
1665 }
1666
1667
1668 if ( ( *itTrk )->isEmcShowerValid() )
1669 {
1670 RecEmcShower* emcTrk = ( *itTrk )->emcShower();
1671 m_bjemc2kpi[i] = 1;
1672 m_emc2kpi[i] = emcTrk->
energy();
1673 m_evp2kpi[i] = emcTrk->
energy() / ptrk;
1674 m_timecg2kpi[i] = emcTrk->
time();
1675 }
1676
1677
1678 if ( ( *itTrk )->isMucTrackValid() )
1679 {
1680 RecMucTrack* mucTrk = ( *itTrk )->mucTrack();
1681 double dpthp = mucTrk->
depth() / 25.0;
1682 m_bjmuc2kpi[i] = 1;
1683 m_depthmuc2kpi[i] = mucTrk->
depth();
1684 m_layermuc2kpi[i] = mucTrk->
numLayers();
1685 }
1686
1687 m_cosmdc2kpi[i] =
cos( mdcTrk->
theta() );
1688 m_phimdc2kpi[i] = mdcTrk->
phi();
1689
1690 m_pidnum2kpi[i] = ( *itTrk )->partId();
1691
1692 if ( m_skim4pi )
1693 {
1694 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
1695 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
1696 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
1697 type2kpilst == 0 )
1698 {
1699 if ( i < 4 ) ( *itTrk )->setPartId( 3 );
1700 }
1701
1702 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
1703 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
1704 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
1705 type2kpilst == 1 )
1706 {
1707 if ( i < 4 ) ( *itTrk )->setPartId( 4 );
1708 }
1709
1710 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
1711 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
1712 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
1713 type2kpilst == 2 )
1714 {
1715 if ( i == 0 || i == 1 ) ( *itTrk )->setPartId( 3 );
1716 if ( i == 2 || i == 3 ) ( *itTrk )->setPartId( 5 );
1717 }
1718 }
1719
1730 m_costpid2kpi[i] =
cos( mdcTrk->
theta() );
1731
1737
1738 m_chipidxpid2kpi[i] = pid->
chiDedx( 2 );
1739 m_chipitof1pid2kpi[i] = pid->
chiTof1( 2 );
1740 m_chipitof2pid2kpi[i] = pid->
chiTof2( 2 );
1741 m_chipitofpid2kpi[i] = pid->
chiTof( 2 );
1742 m_chipitofepid2kpi[i] = pid->
chiTofE( 2 );
1743 m_chipitofqpid2kpi[i] = pid->
chiTofQ( 2 );
1744 m_probpidxpid2kpi[i] = pid->
probDedx( 2 );
1745 m_probpitofpid2kpi[i] = pid->
probTof( 2 );
1746
1747 m_chikdxpid2kpi[i] = pid->
chiDedx( 3 );
1748 m_chiktof1pid2kpi[i] = pid->
chiTof1( 3 );
1749 m_chiktof2pid2kpi[i] = pid->
chiTof2( 3 );
1750 m_chiktofpid2kpi[i] = pid->
chiTof( 3 );
1751 m_chiktofepid2kpi[i] = pid->
chiTofE( 3 );
1752 m_chiktofqpid2kpi[i] = pid->
chiTofQ( 3 );
1753 m_probkdxpid2kpi[i] = pid->
probDedx( 3 );
1754 m_probktofpid2kpi[i] = pid->
probTof( 3 );
1755
1756 m_chiprdxpid2kpi[i] = pid->
chiDedx( 4 );
1757 m_chiprtof1pid2kpi[i] = pid->
chiTof1( 4 );
1758 m_chiprtof2pid2kpi[i] = pid->
chiTof2( 4 );
1759 m_chiprtofpid2kpi[i] = pid->
chiTof( 4 );
1760 m_chiprtofepid2kpi[i] = pid->
chiTofE( 4 );
1761 m_chiprtofqpid2kpi[i] = pid->
chiTofQ( 4 );
1762 m_probprdxpid2kpi[i] = pid->
probDedx( 4 );
1763 m_probprtofpid2kpi[i] = pid->
probTof( 4 );
1764
1765 if ( ( *itTrk )->isTofTrackValid() )
1766 {
1767 SmartRefVector<RecTofTrack> dstTofTrackCol = ( *itTrk )->tofTrack();
1768 SmartRefVector<RecTofTrack>::iterator iter_tof = dstTofTrackCol.begin();
1769 for ( ; iter_tof != dstTofTrackCol.end(); iter_tof++ )
1770 {
1771
1772 m_trk_pidtype = 0;
1773 m_trk_type = 0;
1774 if ( ( ( ( m_mchic2kpi > 3.39 && m_mchic2kpi < 3.44 ) ||
1775 ( m_mchic2kpi > 3.5 && m_mchic2kpi < 3.57 ) ) &&
1776 m_chis2kpi < 20 && m_mpprecall < 3.06 && m_energy[0] < 0.3 &&
1777 m_energy[0] > 0.1 && m_cla2kpi == 0 &&
1778 m_probpi2kpi[i] > m_probk2kpi[i] &&
1779 m_probpi2kpi[i] > m_probpr2kpi[i] ) )
1780 m_trk_pidtype = 1;
1781
1782 if ( ( ( ( m_mchic2kpi > 3.39 && m_mchic2kpi < 3.44 ) ||
1783 ( m_mchic2kpi > 3.5 && m_mchic2kpi < 3.57 ) ) &&
1784 m_chis2kpi < 20 && m_mpprecall < 3.06 && m_energy[0] < 0.3 &&
1785 m_energy[0] > 0.1 && m_cla2kpi == 1 &&
1786 m_probk2kpi[i] > m_probpi2kpi[i] && m_probk2kpi[i] > m_probpr2kpi[i] ) )
1787 m_trk_pidtype = 2;
1788
1789 if ( ( ( ( m_mchic2kpi > 3.39 && m_mchic2kpi < 3.44 ) ||
1790 ( m_mchic2kpi > 3.5 && m_mchic2kpi < 3.57 ) ) &&
1791 m_chis2kpi < 20 && m_mpprecall < 3.06 && m_energy[0] < 0.3 &&
1792 m_energy[0] > 0.1 && m_cla2kpi == 2 &&
1793 m_probpr2kpi[i] > m_probpi2kpi[i] && m_probpr2kpi[i] > m_probk2kpi[i] &&
1794 ( i == 2 || i == 3 ) ) )
1795 m_trk_pidtype = 3;
1796
1797 if ( ( ( ( m_mchic2kpi > 3.39 && m_mchic2kpi < 3.44 ) ||
1798 ( m_mchic2kpi > 3.5 && m_mchic2kpi < 3.57 ) ) &&
1799 m_chis2kpi < 20 && m_mpprecall < 3.06 && m_energy[0] < 0.3 &&
1800 m_energy[0] > 0.1 && m_cla2kpi == 0 ) )
1801 {
1803 m_trk_type = 1;
1804 }
1805 if ( ( ( ( m_mchic2kpi > 3.39 && m_mchic2kpi < 3.44 ) ||
1806 ( m_mchic2kpi > 3.5 && m_mchic2kpi < 3.57 ) ) &&
1807 m_chis2kpi < 20 && m_mpprecall < 3.06 && m_energy[0] < 0.3 &&
1808 m_energy[0] > 0.1 && m_cla2kpi == 1 ) )
1809 {
1811 m_trk_type = 2;
1812 }
1813 if ( ( ( ( m_mchic2kpi > 3.39 && m_mchic2kpi < 3.44 ) ||
1814 ( m_mchic2kpi > 3.5 && m_mchic2kpi < 3.57 ) ) &&
1815 m_chis2kpi < 20 && m_mpprecall < 3.06 && m_energy[0] < 0.3 &&
1816 m_energy[0] > 0.1 && m_cla2kpi == 2 && ( i == 2 || i == 3 ) ) )
1817 {
1819 m_trk_type = 3;
1820 }
1821 m_trk_trackid = ( *iter_tof )->trackID();
1822 m_trk_tofid = ( *iter_tof )->tofID();
1823 TofHitStatus* hitStatus = new TofHitStatus;
1824 hitStatus->
setStatus( ( *iter_tof )->status() );
1825
1826 m_trk_raw = hitStatus->
is_raw();
1831 m_trk_east = hitStatus->
is_east();
1832 m_trk_layer = hitStatus->
layer();
1833 delete hitStatus;
1834 m_trk_path = ( *iter_tof )->path();
1835 m_trk_zrhit = ( *iter_tof )->zrhit();
1836 m_trk_ph = ( *iter_tof )->ph();
1837 m_trk_tof = ( *iter_tof )->tof();
1838 m_trk_beta = ( *iter_tof )->beta();
1839 m_trk_texpe = ( *iter_tof )->texpElectron();
1840 m_trk_texpmu = ( *iter_tof )->texpMuon();
1841 m_trk_texppi = ( *iter_tof )->texpPion();
1842 m_trk_texpk = ( *iter_tof )->texpKaon();
1843 m_trk_texpp = ( *iter_tof )->texpProton();
1844
1845 m_trk_offe = ( *iter_tof )->toffsetElectron();
1846 m_trk_offmu = ( *iter_tof )->toffsetMuon();
1847 m_trk_offpi = ( *iter_tof )->toffsetPion();
1848 m_trk_offk = ( *iter_tof )->toffsetKaon();
1849 m_trk_offp = ( *iter_tof )->toffsetProton();
1850 m_trk_quality = ( *iter_tof )->quality();
1851 m_trk_ppmdc = mdcTrk->
p();
1852 m_trk_ppkal = mdcKalTrk->
p();
1853 m_trk_cosmdc =
cos( mdcTrk->
theta() );
1854 m_trk_phimdc = mdcTrk->
phi();
1855 m_trk_coskal =
cos( mdcKalTrk->
theta() );
1856 m_trk_phikal = mdcKalTrk->
phi();
1857
1858 if ( i == 0 || i == 2 ) m_trk_charge = 1;
1859 if ( i == 2 || i == 3 ) m_trk_charge = 2;
1860 trk_tuple->write().ignore();
1861 }
1862 }
1863 }
1864 }
1865 }
1866
1867
1868 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
1869 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
1870 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
1871 type2kpilst == 0 )
1872 { jGam2kpi.push_back( igam2kpi ); }
1873
1874 for ( int i = evtRecEvent->totalCharged(); i < evtRecEvent->totalTracks(); i++ )
1875 {
1876 if ( i >= evtRecTrkCol->size() ) break;
1878 if ( !( *itTrk )->isEmcShowerValid() ) continue;
1879 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
1880 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
1881 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
1882 type2kpilst == 0 )
1883 {
1884 if ( i != igam2kpi ) jGam2kpi.push_back( ( *itTrk )->trackId() );
1885 }
1886 else { jGam2kpi.push_back( ( *itTrk )->trackId() ); }
1887 }
1888
1889 int ngam2kpi = jGam2kpi.size();
1890
1891 if ( m_rootput )
1892 {
1893 for ( int i = 0; i < ngam2kpi; i++ )
1894 {
1895 if ( i >= evtRecTrkCol->size() ) break;
1897 if ( !( *itTrk )->isEmcShowerValid() ) continue;
1898 RecEmcShower* emcTrk = ( *( evtRecTrkCol->begin() + jGam2kpi[i] ) )->emcShower();
1899 Hep3Vector emcpos( emcTrk->
x(), emcTrk->
y(), emcTrk->
z() );
1900 double dthe = 200.;
1901 double dphi = 200.;
1902 double dang = 200.;
1903
1904
1905
1906 for ( int j = 0; j < evtRecEvent->totalCharged(); j++ )
1907 {
1908 if ( j >= evtRecTrkCol->size() ) break;
1910 if ( !( *jtTrk )->isExtTrackValid() ) continue;
1911 RecExtTrack* extTrk = ( *jtTrk )->extTrack();
1914 double angd = extpos.angle( emcpos );
1915 double thed = extpos.theta() - emcpos.theta();
1916 double phid = extpos.deltaPhi( emcpos );
1917 thed = fmod( thed + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
1918 phid = fmod( phid + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
1919
1920
1921
1922 if ( angd < dang )
1923 {
1924 dang = angd;
1925 dthe = thed;
1926 dphi = phid;
1927 }
1928 }
1929 if ( dang >= 200 ) continue;
1930 double eraw = emcTrk->
energy();
1931 dthe = dthe * 180 / ( CLHEP::pi );
1932 dphi = dphi * 180 / ( CLHEP::pi );
1933 dang = dang * 180 / ( CLHEP::pi );
1934
1935
1936
1937 m_numHits[i] = emcTrk->
numHits();
1940 m_timegm[i] = emcTrk->
time();
1941 m_cellId[i] = emcTrk->
cellId();
1942 m_module[i] = emcTrk->
module();
1947 m_getEAll[i] = emcTrk->
getEAll();
1948 m_x[i] = emcTrk->
x();
1949 m_y[i] = emcTrk->
y();
1950 m_z[i] = emcTrk->
z();
1951 m_cosemc[i] =
cos( emcTrk->
theta() );
1952 m_phiemc[i] = emcTrk->
phi();
1953 m_energy[i] = emcTrk->
energy();
1954 m_eSeed[i] = emcTrk->
eSeed();
1955 m_e3x3[i] = emcTrk->
e3x3();
1956 m_e5x5[i] = emcTrk->
e5x5();
1957 m_dang4c[i] = dang;
1958 m_dthe4c[i] = dthe;
1959 m_dphi4c[i] = dphi;
1960
1961
1962
1963 }
1964 }
1965 }
1966 }
1967
1968
1969 if ( m_skim4pi )
1970 {
1971
1972 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
1973 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
1974 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
1975 type2kpilst == 0 )
1976 {
1977 m_tool1->write().ignore();
1978 Ncut[6]++;
1979 }
1980 }
1981
1982
1983 if ( m_skim4k )
1984 {
1985
1986 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
1987 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
1988 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
1989 type2kpilst == 1 && dtpr2kpilst[0] < -0.4 && dtpr2kpilst[1] < -0.4 &&
1990 dtpr2kpilst[2] < -0.4 && dtpr2kpilst[3] < -0.4 )
1991 {
1992 m_tool2->write().ignore();
1993 Ncut[7]++;
1994 }
1995 }
1996
1997 if ( m_skim2pi2pr )
1998 {
1999 if ( mppreclst < 3.06 && chis4c2kpilst < 20 &&
2000 ( ( mchic2kpilst > 3.39 && mchic2kpilst < 3.44 ) ||
2001 ( mchic2kpilst > 3.5 && mchic2kpilst < 3.57 ) ) &&
2002 type2kpilst == 2 )
2003 {
2004 m_tool3->write().ignore();
2005
2006 Ncut[8]++;
2007 }
2008 }
2009
2010
2011 if ( m_rootput )
2012 {
2013
2014 if ( ( mppreclst < 3.06 && chis4c2kpilst < 40 ) ||
2015 ( ( meelst > 3.06 && meelst < 3.12 ) && ( fabs( mppreclst - 3.097 ) < 0.01 ) ) )
2016 {
2017 Ncut[9]++;
2018 m_tuple1->write().ignore();
2019 }
2020 }
2021
2022 return StatusCode::SUCCESS;
2023}
HepGeom::Point3D< double > HepPoint3D
EvtRecTrackCol::iterator EvtRecTrackIterator
std::vector< HepLorentzVector > Vp4
std::vector< double > Vdouble
double sin(const BesAngle a)
double cos(const BesAngle a)
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
double secondMoment() const
const Hep3Vector emcPosition() const
const int emcVolumeNumber() const
const double theta() const
static void setPidType(PidType pidType)
const double theta() const
const HepSymMatrix err() const
const HepVector helix() const
......
virtual bool isVertexValid()=0
virtual double * SigmaPrimaryVertex()=0
virtual double * PrimaryVertex()=0
void AddFourMomentum(int number, HepLorentzVector p4)
HepLorentzVector pfit(int n) const
static KalmanKinematicFit * instance()
int methodProbability() const
void setChiMinCut(const double chi=4)
void setRecTrack(EvtRecTrack *trk)
void setMethod(const int method)
double probTof(int n) const
double chiTof2(int n) const
double chiTofE(int n) const
void identify(const int pidcase)
double probElectron() const
void usePidSys(const int pidsys)
double chiTofQ(int n) const
static ParticleID * instance()
bool IsPidInfoValid() const
double probDedx(int n) const
double chiTof1(int n) const
double probProton() const
double chiTof(int n) const
double chiDedx(int n) const
RecEmcID getClusterId() const
RecEmcID getShowerId() const
RecEmcEnergy getEAll() const
const HepVector & getZHelix() const
const HepSymMatrix & getZError() const
unsigned int layer() const
void setStatus(unsigned int status)
void setVBeamPosition(const HepSymMatrix VBeamPosition)
void AddTrack(const int number, const double mass, const RecMdcTrack *trk)
void setBeamPosition(const HepPoint3D BeamPosition)
WTrackParameter wtrk(int n) const
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
HepSymMatrix Evx(int n) const
HepPoint3D vx(int n) const
static VertexFit * instance()
void setEvx(const HepSymMatrix &eVx)
void setVx(const HepPoint3D &vx)
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecTrackCol