283 MsgStream log(
msgSvc(), name() );
284 log << MSG::INFO <<
"in execute()" << endmsg;
286 setFilterPassed(
false );
288 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
289 int runNo = eventHeader->runNumber();
290 int event = eventHeader->eventNumber();
291 log << MSG::DEBUG <<
"runNo, evtnum = " <<
runNo <<
" , " <<
event << endmsg;
297 log << MSG::INFO <<
"get event tag OK" << endmsg;
298 log << MSG::DEBUG <<
"ncharg, nneu, tottks = " << evtRecEvent->totalCharged() <<
" , "
299 << evtRecEvent->totalNeutral() <<
" , " << evtRecEvent->totalTracks() << endmsg;
306 if ( evtRecEvent->totalNeutral() > 100 ) {
return StatusCode::SUCCESS; }
308 Vint iGood, ipip, ipim;
316 Hep3Vector xorigin( 0, 0, 0 );
320 Gaudi::svcLocator()->service(
"VertexDbSvc", vtxsvc ).ignore();
327 xorigin.setX( dbv[0] );
328 xorigin.setY( dbv[1] );
329 xorigin.setZ( dbv[2] );
333 for (
int i = 0; i < evtRecEvent->totalCharged(); i++ )
336 if ( !( *itTrk )->isMdcTrackValid() )
continue;
337 if ( !( *itTrk )->isMdcKalTrackValid() )
continue;
340 double pch = mdcTrk->
p();
341 double x0 = mdcTrk->
x();
342 double y0 = mdcTrk->
y();
343 double z0 = mdcTrk->
z();
344 double phi0 = mdcTrk->
helix( 1 );
345 double xv = xorigin.x();
346 double yv = xorigin.y();
347 double Rxy = fabs( ( x0 - xv ) *
cos( phi0 ) + ( y0 - yv ) *
sin( phi0 ) );
351 double m_vz0 = z0 - xorigin.z();
353 double m_Vctc = z0 / sqrt( Rxy * Rxy + z0 * z0 );
354 double m_Vct =
cos( mdcTrk->
theta() );
358 if ( fabs( m_vz0 ) >= m_vz0cut )
continue;
359 if ( m_vr0 >= m_vr0cut )
continue;
361 iGood.push_back( ( *itTrk )->trackId() );
362 nCharge += mdcTrk->
charge();
368 int nGood = iGood.size();
370 log << MSG::DEBUG <<
"ngood, totcharge = " << nGood <<
" , " << nCharge << endmsg;
371 if ( ( nGood != 4 ) || ( nCharge != 0 ) ) {
return StatusCode::SUCCESS; }
377 for (
int i = evtRecEvent->totalCharged(); i < evtRecEvent->totalTracks(); i++ )
380 if ( !( *itTrk )->isEmcShowerValid() )
continue;
382 Hep3Vector emcpos( emcTrk->
x(), emcTrk->
y(), emcTrk->
z() );
387 log << MSG::DEBUG <<
"liuf neu= " << i << endmsg;
388 for (
int j = 0; j < evtRecEvent->totalCharged(); j++ )
391 if ( !( *jtTrk )->isExtTrackValid() )
continue;
395 log << MSG::DEBUG <<
"liuf charge= " << j << endmsg;
397 double angd = extpos.angle( emcpos );
398 double thed = extpos.theta() - emcpos.theta();
399 double phid = extpos.deltaPhi( emcpos );
400 thed = fmod( thed + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
401 phid = fmod( phid + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
412 if ( dang >= 200 )
continue;
413 double eraw = emcTrk->
energy();
414 dthe = dthe * 180 / ( CLHEP::pi );
415 dphi = dphi * 180 / ( CLHEP::pi );
416 dang = dang * 180 / ( CLHEP::pi );
418 double m_dthe = dthe;
419 double m_dphi = dphi;
420 double m_dang = dang;
421 double m_eraw = eraw;
424 log << MSG::DEBUG <<
"eraw dang= " << eraw <<
" , " << dang <<
"," << i << endmsg;
425 if ( eraw < m_energyThreshold )
continue;
426 if ( dang < m_gammaAngCut )
continue;
431 iGam.push_back( ( *itTrk )->trackId() );
437 int nGam = iGam.size();
439 log << MSG::DEBUG <<
"num Good Photon " << nGam <<
" , " << evtRecEvent->totalNeutral()
441 if ( nGam < 2 ) {
return StatusCode::SUCCESS; }
451 for (
int i = 0; i < nGam; i++ )
455 double eraw = emcTrk->
energy();
456 double phi = emcTrk->
phi();
457 double the = emcTrk->
theta();
458 HepLorentzVector ptrk;
459 ptrk.setPx( eraw *
sin( the ) *
cos( phi ) );
460 ptrk.setPy( eraw *
sin( the ) *
sin( phi ) );
461 ptrk.setPz( eraw *
cos( the ) );
466 pGam.push_back( ptrk );
469 for (
int i = 0; i < nGood; i++ )
472 if ( !( *itTrk )->isMdcTrackValid() )
continue;
474 if ( !( *itTrk )->isMdcKalTrackValid() )
continue;
477 if ( mdcKalTrk->
charge() > 0 )
479 ipip.push_back( iGood[i] );
480 HepLorentzVector ptrk;
481 ptrk.setPx( mdcKalTrk->
px() );
482 ptrk.setPy( mdcKalTrk->
py() );
483 ptrk.setPz( mdcKalTrk->
pz() );
484 double p3 = ptrk.mag();
485 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
486 ppip.push_back( ptrk );
490 ipim.push_back( iGood[i] );
491 HepLorentzVector ptrk;
492 ptrk.setPx( mdcKalTrk->
px() );
493 ptrk.setPy( mdcKalTrk->
py() );
494 ptrk.setPz( mdcKalTrk->
pz() );
495 double p3 = ptrk.mag();
496 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
497 ppim.push_back( ptrk );
501 int npip = ipip.size();
502 int npim = ipim.size();
503 if ( npip != 2 || npim != 2 )
return StatusCode::SUCCESS;
516 HepLorentzVector pTot0( 0.011 * 3.6862, 0, 0, 3.6862 );
517 HepLorentzVector pTrec1, pTrec2, pTrec3, pTrec4;
518 HepLorentzVector pTrecf;
519 double m_recjpsi1, m_recjpsi2, m_recjpsi3, m_recjpsi4, m_recppf;
520 double deljp1, deljp2, deljp3, deljp4;
521 pTrec1 = pTot0 - ppip[0] - ppim[0];
522 pTrec2 = pTot0 - ppip[0] - ppim[1];
523 pTrec3 = pTot0 - ppip[1] - ppim[0];
524 pTrec4 = pTot0 - ppip[1] - ppim[1];
525 m_recjpsi1 = pTrec1.m();
526 m_recjpsi2 = pTrec2.m();
527 m_recjpsi3 = pTrec3.m();
528 m_recjpsi4 = pTrec4.m();
529 deljp1 = fabs( m_recjpsi1 - 3.097 );
530 deljp2 = fabs( m_recjpsi2 - 3.097 );
531 deljp3 = fabs( m_recjpsi3 - 3.097 );
532 deljp4 = fabs( m_recjpsi4 - 3.097 );
534 int itmp, itmp1, itmp2;
535 HepLorentzVector ptmp, ptmp1, ptmp2;
538 m_recppf = pTrec1.m();
540 if ( deljp2 < deljp1 && deljp2 < deljp3 && deljp2 < deljp4 )
551 m_recppf = pTrec2.m();
554 if ( deljp3 < deljp1 && deljp3 < deljp2 && deljp3 < deljp4 )
565 m_recppf = pTrec3.m();
568 if ( deljp4 < deljp1 && deljp4 < deljp2 && deljp4 < deljp3 )
585 m_recppf = pTrec4.m();
588 if ( fabs( m_recppf - 3.097 ) > 0.2 )
return StatusCode::SUCCESS;
590 log << MSG::DEBUG <<
"ngood track ID after jpsi = " << ipip[0] <<
" , " << ipim[0] <<
" , "
591 << ipip[1] <<
" , " << ipim[1] << endmsg;
594 HepLorentzVector ppi2_no1 = ppip[0] + ppim[0];
595 HepLorentzVector ppi2_no2 = ppip[1] + ppim[1];
596 HepLorentzVector ppi2_no3 = ppip[0] + ppim[1];
597 HepLorentzVector ppi2_no4 = ppip[1] + ppim[0];
598 HepLorentzVector p4pi_no = ppi2_no1 + ppi2_no2;
604 double laypi1 = -1.0;
605 double laypi2 = -1.0;
606 double laypi3 = -1.0;
607 double laypi4 = -1.0;
615 double phi01 = mdcTrkp1->
helix( 1 );
616 double m_p1vx = mdcTrkp1->
x();
617 double m_p1vy = mdcTrkp1->
y();
618 double m_p1vz = mdcTrkp1->
z() - xorigin.z();
619 double m_p1vr = fabs( ( mdcTrkp1->
x() - xorigin.x() ) *
cos( phi01 ) +
620 ( mdcTrkp1->
y() - xorigin.y() ) *
sin( phi01 ) );
621 double m_p1vct =
cos( mdcTrkp1->
theta() );
622 double m_p1ptot = mdcKalTrkp1->
p();
624 sqrt( mdcKalTrkp1->
px() * mdcKalTrkp1->
px() + mdcKalTrkp1->
py() * mdcKalTrkp1->
py() );
626 if ( ( *itTrkp1 )->isEmcShowerValid() ) { emcTg1 = emcTrkp1->
energy(); }
627 if ( ( *itTrkp1 )->isMucTrackValid() ) { laypi1 = mucTrkp1->
numLayers(); }
628 double m_laypip1 = laypi1;
636 double phi02 = mdcTrkm1->
helix( 1 );
637 double m_m1vx = mdcTrkm1->
x();
638 double m_m1vy = mdcTrkm1->
y();
639 double m_m1vz = mdcTrkm1->
z() - xorigin.z();
640 double m_m1vr = fabs( ( mdcTrkm1->
x() - xorigin.x() ) *
cos( phi02 ) +
641 ( mdcTrkm1->
y() - xorigin.y() ) *
sin( phi02 ) );
642 double m_m1vct =
cos( mdcTrkm1->
theta() );
643 double m_m1ptot = mdcKalTrkm1->
p();
645 sqrt( mdcKalTrkm1->
px() * mdcKalTrkm1->
px() + mdcKalTrkm1->
py() * mdcKalTrkm1->
py() );
647 if ( ( *itTrkm1 )->isEmcShowerValid() ) { emcTg2 = emcTrkm1->
energy(); }
648 if ( ( *itTrkm1 )->isMucTrackValid() ) { laypi2 = mucTrkm1->
numLayers(); }
649 double m_laypim1 = laypi2;
657 double phi03 = mdcTrkp2->
helix( 1 );
658 double m_p2vx = mdcTrkp2->
x();
659 double m_p2vy = mdcTrkp2->
y();
660 double m_p2vz = mdcTrkp2->
z() - xorigin.z();
661 double m_p2vr = fabs( ( mdcTrkp2->
x() - xorigin.x() ) *
cos( phi03 ) +
662 ( mdcTrkp2->
y() - xorigin.y() ) *
sin( phi03 ) );
663 double m_p2vct =
cos( mdcTrkp2->
theta() );
664 double m_p2ptot = mdcKalTrkp2->
p();
666 sqrt( mdcKalTrkp2->
px() * mdcKalTrkp2->
px() + mdcKalTrkp2->
py() * mdcKalTrkp2->
py() );
668 if ( ( *itTrkp2 )->isEmcShowerValid() ) { emcTg3 = emcTrkp2->
energy(); }
669 if ( ( *itTrkp2 )->isMucTrackValid() ) { laypi3 = mucTrkp2->
numLayers(); }
670 double m_laypip2 = laypi3;
678 double phi04 = mdcTrkm2->
helix( 1 );
679 double m_m2vx = mdcTrkm2->
x();
680 double m_m2vy = mdcTrkm2->
y();
681 double m_m2vz = mdcTrkm2->
z() - xorigin.z();
682 double m_m2vr = fabs( ( mdcTrkm2->
x() - xorigin.x() ) *
cos( phi04 ) +
683 ( mdcTrkm2->
y() - xorigin.y() ) *
sin( phi04 ) );
684 double m_m2vct =
cos( mdcTrkm2->
theta() );
685 double m_m2ptot = mdcKalTrkm2->
p();
687 sqrt( mdcKalTrkm2->
px() * mdcKalTrkm2->
px() + mdcKalTrkm2->
py() * mdcKalTrkm2->
py() );
689 if ( ( *itTrkm2 )->isEmcShowerValid() ) { emcTg4 = emcTrkm2->
energy(); }
690 if ( ( *itTrkm2 )->isMucTrackValid() ) { laypi4 = mucTrkm2->
numLayers(); }
691 double m_laypim2 = laypi4;
693 double m_emcTp1 = emcTg1;
694 double m_emcTm1 = emcTg2;
695 double m_emcTp2 = emcTg3;
696 double m_emcTm2 = emcTg4;
698 if ( fabs( m_p1vz ) >= m_vz1cut )
return StatusCode::SUCCESS;
699 if ( m_p1vr >= m_vr1cut )
return StatusCode::SUCCESS;
700 if ( fabs( m_p1vct ) >= m_cthcut )
return StatusCode::SUCCESS;
702 if ( fabs( m_m1vz ) >= m_vz1cut )
return StatusCode::SUCCESS;
703 if ( m_m1vr >= m_vr1cut )
return StatusCode::SUCCESS;
704 if ( fabs( m_m1vct ) >= m_cthcut )
return StatusCode::SUCCESS;
707 HepLorentzVector p4muonp = ppip[1];
708 HepLorentzVector p4muonm = ppim[1];
709 HepLorentzVector p4uu = pTrecf;
712 Hep3Vector p3jpsiUnit = ( p4uu.vect() ).unit();
713 double jBeta = p4uu.beta();
722 HepLorentzVector pTot;
723 double minpi0 = 999.0;
724 for (
int i = 0; i < nGam - 1; i++ )
726 for (
int j = i + 1; j < nGam; j++ )
728 HepLorentzVector p2g = pGam[i] + pGam[j];
729 pTot = ppip[0] + ppim[0] + ppip[1] + ppim[1];
731 if ( fabs( p2g.m() - 0.135 ) < minpi0 )
733 minpi0 = fabs( p2g.m() - 0.135 );
735 double m_m2gg = p2g.m();
737 HepLorentzVector prho0_no = ppi2_no2;
738 HepLorentzVector prhop_no = ppip[1] + p2g;
739 HepLorentzVector prhom_no = ppim[1] + p2g;
740 HepLorentzVector prho0pi0 = ppi2_no2 + p2g;
741 HepLorentzVector frho1pi0 = ppi2_no1 + p2g;
742 HepLorentzVector frho2pi0 = ppi2_no3 + p2g;
743 HepLorentzVector frho3pi0 = ppi2_no4 + p2g;
744 HepLorentzVector prho0g1 = ppi2_no2 + pGam[i];
745 HepLorentzVector prho0g2 = ppi2_no2 + pGam[j];
746 HepLorentzVector frho1g1 = ppi2_no1 + pGam[i];
747 HepLorentzVector frho1g2 = ppi2_no1 + pGam[j];
748 HepLorentzVector frho2g1 = ppi2_no3 + pGam[i];
749 HepLorentzVector frho2g2 = ppi2_no3 + pGam[j];
750 HepLorentzVector frho3g1 = ppi2_no4 + pGam[i];
751 HepLorentzVector frho3g2 = ppi2_no4 + pGam[j];
752 HepLorentzVector p5pi_no = p4pi_no + p2g;
755 double m_prho0_no = prho0_no.m();
756 double m_prhop_no = prhop_no.m();
757 double m_prhom_no = prhom_no.m();
758 double m_prho0pi0 = prho0pi0.m();
759 double m_frho1pi0 = frho1pi0.m();
760 double m_frho2pi0 = frho2pi0.m();
761 double m_frho3pi0 = frho3pi0.m();
762 double m_prho0g1 = prho0g1.m();
763 double m_prho0g2 = prho0g2.m();
764 double m_frho1g1 = frho1g1.m();
765 double m_frho1g2 = frho1g2.m();
766 double m_frho2g1 = frho2g1.m();
767 double m_frho2g2 = frho2g2.m();
768 double m_frho3g1 = frho3g1.m();
769 double m_frho3g2 = frho3g2.m();
770 double m_p4pi_no = p4pi_no.m();
771 double m_p5pi_no = p5pi_no.m();
772 double m_mdcpx1 = ppip[0].px();
773 double m_mdcpy1 = ppip[0].py();
774 double m_mdcpz1 = ppip[0].pz();
775 double m_mdcpe1 = ppip[0].e();
776 double m_mdcpx2 = ppim[0].px();
777 double m_mdcpy2 = ppim[0].py();
778 double m_mdcpz2 = ppim[0].pz();
779 double m_mdcpe2 = ppim[0].e();
780 double m_mdcpx3 = ppip[1].px();
781 double m_mdcpy3 = ppip[1].py();
782 double m_mdcpz3 = ppip[1].pz();
783 double m_mdcpe3 = ppip[1].e();
784 double m_mdcpx4 = ppim[1].px();
785 double m_mdcpy4 = ppim[1].py();
786 double m_mdcpz4 = ppim[1].pz();
787 double m_mdcpe4 = ppim[1].e();
788 double m_mdcpxg1 = pGam[i].px();
789 double m_mdcpyg1 = pGam[i].py();
790 double m_mdcpzg1 = pGam[i].pz();
791 double m_mdcpeg1 = pGam[i].e();
792 double m_mdcpxg2 = pGam[j].px();
793 double m_mdcpyg2 = pGam[j].py();
794 double m_mdcpzg2 = pGam[j].pz();
795 double m_mdcpeg2 = pGam[j].e();
796 double m_etot = pTot.e();
797 double m_mrecjp1 = m_recjpsi1;
798 double m_mrecjp2 = m_recjpsi2;
799 double m_mrecjp3 = m_recjpsi3;
800 double m_mrecjp4 = m_recjpsi4;
813 HepSymMatrix Evx( 3, 0 );
830 RecMdcKalTrack* pipTrk1 = ( *( evtRecTrkCol->begin() + ipip[0] ) )->mdcKalTrack();
831 RecMdcKalTrack* pimTrk1 = ( *( evtRecTrkCol->begin() + ipim[0] ) )->mdcKalTrack();
832 RecMdcKalTrack* pipTrk2 = ( *( evtRecTrkCol->begin() + ipip[1] ) )->mdcKalTrack();
833 RecMdcKalTrack* pimTrk2 = ( *( evtRecTrkCol->begin() + ipim[1] ) )->mdcKalTrack();
844 if ( !vtxfit->
Fit( 0 ) )
return StatusCode::SUCCESS;
859 HepLorentzVector pTgam1( 0, 0, 0, 0 );
860 HepLorentzVector pTgam2( 0, 0, 0, 0 );
865 HepLorentzVector
ecms( 0.011 * 3.6862, 0, 0, 3.6862 );
873 double chisq = 9999.;
876 double chikk = 9999.;
877 for (
int i = 0; i < nGam - 1; i++ )
879 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + iGam[i] ) )->emcShower();
880 for (
int j = i + 1; j < nGam; j++ )
882 RecEmcShower* g2Trk = ( *( evtRecTrkCol->begin() + iGam[j] ) )->emcShower();
892 bool oksq = kmfit->
Fit();
893 if ( oksq && kmfit->
chisq() < chikk ) { chikk = kmfit->
chisq(); }
905 for (
int i = 0; i < nGam - 1; i++ )
907 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + iGam[i] ) )->emcShower();
908 for (
int j = i + 1; j < nGam; j++ )
910 RecEmcShower* g2Trk = ( *( evtRecTrkCol->begin() + iGam[j] ) )->emcShower();
920 bool oksq = kmfit->
Fit();
923 double chi2 = kmfit->
chisq();
939 if ( chisq > 200 )
return StatusCode::SUCCESS;
945 jGood.push_back( ipip[0] );
946 jGood.push_back( ipim[0] );
947 jGood.push_back( ipip[1] );
948 jGood.push_back( ipim[1] );
952 jGgam.push_back( igbf1 );
953 jGgam.push_back( igbf2 );
955 double chi1_pp = 9999.0;
957 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + ig1 ) )->emcShower();
958 RecEmcShower* g2Trk = ( *( evtRecTrkCol->begin() + ig2 ) )->emcShower();
967 bool oksq = kmfit->
Fit();
970 chi1_pp = kmfit->
chisq();
971 HepLorentzVector ppi0 = kmfit->
pfit( 4 ) + kmfit->
pfit( 5 );
972 HepLorentzVector prho0 = kmfit->
pfit( 2 ) + kmfit->
pfit( 3 );
973 HepLorentzVector prhop = kmfit->
pfit( 2 ) + ppi0;
974 HepLorentzVector prhom = kmfit->
pfit( 3 ) + ppi0;
975 HepLorentzVector pjjj = prho0 + ppi0;
977 HepLorentzVector p2pi1 = kmfit->
pfit( 0 ) + kmfit->
pfit( 1 );
978 HepLorentzVector f2pi1g1 = p2pi1 + kmfit->
pfit( 4 );
979 HepLorentzVector f2pi1g2 = p2pi1 + kmfit->
pfit( 5 );
980 HepLorentzVector f2pi1pi0 = p2pi1 + ppi0;
982 HepLorentzVector t2pi2g1 = prho0 + kmfit->
pfit( 4 );
983 HepLorentzVector t2pi2g2 = prho0 + kmfit->
pfit( 5 );
985 HepLorentzVector p2pi3 = kmfit->
pfit( 0 ) + kmfit->
pfit( 3 );
986 HepLorentzVector f2pi3g1 = p2pi3 + kmfit->
pfit( 4 );
987 HepLorentzVector f2pi3g2 = p2pi3 + kmfit->
pfit( 5 );
988 HepLorentzVector f2pi3pi0 = p2pi3 + ppi0;
990 HepLorentzVector p2pi4 = kmfit->
pfit( 1 ) + kmfit->
pfit( 2 );
991 HepLorentzVector f2pi4g1 = p2pi4 + kmfit->
pfit( 4 );
992 HepLorentzVector f2pi4g2 = p2pi4 + kmfit->
pfit( 5 );
993 HepLorentzVector f2pi4pi0 = p2pi4 + ppi0;
995 HepLorentzVector p4pi = p2pi1 + prho0;
996 HepLorentzVector p4pig1 = p4pi + kmfit->
pfit( 4 );
997 HepLorentzVector p4pig2 = p4pi + kmfit->
pfit( 5 );
998 HepLorentzVector ppptot = p4pi + ppi0;
1001 HepLorentzVector be4cpi0 = pTgam1 + pTgam2;
1002 HepLorentzVector be4c_ppi1 = ppip[0] + ppim[0];
1003 HepLorentzVector be4c_ppi2 = ppip[1] + ppim[1];
1004 HepLorentzVector be4cjp = be4cpi0 + be4c_ppi2;
1413 setFilterPassed(
true );
1415 ( *( evtRecTrkCol->begin() + ipip[0] ) )->setPartId( 2 );
1416 ( *( evtRecTrkCol->begin() + ipim[0] ) )->setPartId( 2 );
1417 ( *( evtRecTrkCol->begin() + ipip[1] ) )->setPartId( 2 );
1418 ( *( evtRecTrkCol->begin() + ipim[1] ) )->setPartId( 2 );
1420 return StatusCode::SUCCESS;