75 MsgStream log(
msgSvc(), name() );
77 log << MSG::INFO <<
"in initialize()" << endmsg;
81 status = service(
"THistSvc", m_thistsvc );
82 if ( status.isFailure() )
84 log << MSG::INFO <<
"Unable to retrieve pointer to THistSvc" << endmsg;
87 m_pi_vx =
new TH1F(
"pi_vx",
"pi_vx", 100, -1.0, 1.0 );
88 status = m_thistsvc->regHist(
"/VAL/PHY/pi_vx", m_pi_vx );
89 m_pi_vy =
new TH1F(
"pi_vy",
"pi_vy", 100, -1.0, 1.0 );
90 status = m_thistsvc->regHist(
"/VAL/PHY/pi_vy", m_pi_vy );
91 m_pi_vz =
new TH1F(
"pi_vz",
"pi_vz", 100, -6.0, 6.0 );
92 status = m_thistsvc->regHist(
"/VAL/PHY/pi_vz", m_pi_vz );
93 m_pip_mom =
new TH1F(
"pip_mom",
"pip_moment", 100, 0.0, 1.6 );
94 status = m_thistsvc->regHist(
"/VAL/PHY/pip_mom", m_pip_mom );
95 m_pim_mom =
new TH1F(
"pim_mom",
"pim_moment", 100, 0.0, 1.6 );
96 status = m_thistsvc->regHist(
"/VAL/PHY/pim_mom", m_pim_mom );
97 m_rhop_mass =
new TH1F(
"rhop_mass",
"rhop_mass", 100, 0.0, 1.5 );
98 status = m_thistsvc->regHist(
"/VAL/PHY/rhop_mass", m_rhop_mass );
99 m_rhom_mass =
new TH1F(
"rhom_mass",
"rhom_mass", 100, 0.0, 1.5 );
100 status = m_thistsvc->regHist(
"/VAL/PHY/rhom_mass", m_rhom_mass );
101 m_rho0_mass =
new TH1F(
"rho0_mass",
"rho0_mass", 100, 0.0, 1.5 );
102 status = m_thistsvc->regHist(
"/VAL/PHY/rho0_mass", m_rho0_mass );
103 m_pi0_mass =
new TH1F(
"pi0_mass",
"pi0_mass", 100, 0.0, 0.5 );
104 status = m_thistsvc->regHist(
"/VAL/PHY/pi0_mass", m_pi0_mass );
105 m_chisq_4c =
new TH1F(
"chisq_4c",
"chisq_4c", 100, 0.0, 150. );
106 status = m_thistsvc->regHist(
"/VAL/PHY/chisq_4c", m_chisq_4c );
107 m_chisq_5c =
new TH1F(
"chisq_5c",
"chisq_5c", 100, 0.0, 150. );
108 status = m_thistsvc->regHist(
"/VAL/PHY/chisq_5c", m_chisq_5c );
110 m_cos_pip =
new TH1F(
"cos_pip",
"cos_pip", 100, -1.0, 1.0 );
111 status = m_thistsvc->regHist(
"/VAL/PHY/cos_pip", m_cos_pip );
112 m_cos_pim =
new TH1F(
"cos_pim",
"cos_pim", 100, -1.0, 1.0 );
113 status = m_thistsvc->regHist(
"/VAL/PHY/cos_pim", m_cos_pim );
115 m_chipi_dedx =
new TH1F(
"chipi_dedx",
"chipi_dedx", 60, -5.0, 10. );
116 status = m_thistsvc->regHist(
"/VAL/PHY/chipi_dedx", m_chipi_dedx );
117 m_chie_dedx =
new TH1F(
"chie_dedx",
"chie_dedx", 60, -15.0, 5. );
118 status = m_thistsvc->regHist(
"/VAL/PHY/chie_dedx", m_chie_dedx );
119 m_chimu_dedx =
new TH1F(
"chimu_dedx",
"chimu_dedx", 60, -5.0, 10. );
120 status = m_thistsvc->regHist(
"/VAL/PHY/chimu_dedx", m_chimu_dedx );
121 m_chik_dedx =
new TH1F(
"chik_dedx",
"chik_dedx", 100, -20.0, 10. );
122 status = m_thistsvc->regHist(
"/VAL/PHY/chik_dedx", m_chik_dedx );
123 m_chip_dedx =
new TH1F(
"chip_dedx",
"chip_dedx", 100, -20.0, 5. );
124 status = m_thistsvc->regHist(
"/VAL/PHY/chip_dedx", m_chip_dedx );
126 NTuplePtr nt4(
ntupleSvc(),
"FILE1/h4" );
127 if ( nt4 ) m_tuple4 = nt4;
130 m_tuple4 =
ntupleSvc()->book(
"FILE1/h4", CLID_ColumnWiseTuple,
"4gam6pi Ntuple" );
133 status = m_tuple4->addItem(
"ngam", m_ngoodneu );
134 status = m_tuple4->addItem(
"npip", m_npip );
135 status = m_tuple4->addItem(
"npim", m_npim );
136 status = m_tuple4->addItem(
"ngoodch", m_ngoodch );
137 status = m_tuple4->addItem(
"chisq4c", m_chisq4c );
138 status = m_tuple4->addItem(
"ppi04c", m_ppi0 );
139 status = m_tuple4->addItem(
"mpi04c", m_mpi0 );
140 status = m_tuple4->addItem(
"chisq5c", m_chisq5c );
141 status = m_tuple4->addItem(
"ppi05c", m_ppi0fit );
142 status = m_tuple4->addItem(
"mpi05c", m_mpi0fit );
143 status = m_tuple4->addItem(
"g1inpi0the", m_g1inpi0the );
144 status = m_tuple4->addItem(
"g2inpi0the", m_g2inpi0the );
145 status = m_tuple4->addItem(
"theta2pi", m_theta2pi );
146 status = m_tuple4->addItem(
"ppip", m_ppip );
147 status = m_tuple4->addItem(
"ppim", m_ppim );
148 status = m_tuple4->addItem(
"p2pi", m_p2pi );
149 status = m_tuple4->addItem(
"m2pi", m_m2pi );
150 status = m_tuple4->addItem(
"ppip0", m_ppip0 );
151 status = m_tuple4->addItem(
"mpip0", m_mpip0 );
152 status = m_tuple4->addItem(
"ppim0", m_ppim0 );
153 status = m_tuple4->addItem(
"mpim0", m_mpim0 );
154 status = m_tuple4->addItem(
"eneumiss", m_eneumiss );
155 status = m_tuple4->addItem(
"pneumiss", m_pneumiss );
156 status = m_tuple4->addItem(
"mneumiss", m_mneumiss );
161 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple4 ) << endmsg;
162 return StatusCode::FAILURE;
166 NTuplePtr nt5(
ntupleSvc(),
"FILE1/h5" );
167 if ( nt5 ) m_tuple5 = nt5;
170 m_tuple5 =
ntupleSvc()->book(
"FILE1/h5", CLID_ColumnWiseTuple,
"4gam6pi Ntuple" );
173 status = m_tuple5->addItem(
"m2graw", m_m2graw );
174 status = m_tuple5->addItem(
"emiss", m_emiss );
175 status = m_tuple5->addItem(
"pmiss", m_pmiss );
176 status = m_tuple5->addItem(
"mmiss", m_mmiss );
177 status = m_tuple5->addItem(
"prho0", m_prho0 );
178 status = m_tuple5->addItem(
"mrho0", m_mrho0 );
179 status = m_tuple5->addItem(
"pmrho0", m_pmrho0 );
180 status = m_tuple5->addItem(
"mmrho0", m_mmrho0 );
181 status = m_tuple5->addItem(
"prhop", m_prhop );
182 status = m_tuple5->addItem(
"mrhop", m_mrhop );
183 status = m_tuple5->addItem(
"pmrhom", m_pmrhom );
184 status = m_tuple5->addItem(
"mmrhom", m_mmrhom );
185 status = m_tuple5->addItem(
"prhom", m_prhom );
186 status = m_tuple5->addItem(
"ppipraw", m_ppipraw );
187 status = m_tuple5->addItem(
"mrhom", m_mrhom );
191 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple4 ) << endmsg;
192 return StatusCode::FAILURE;
200 log << MSG::INFO <<
"successfully return from initialize()" << endmsg;
201 return StatusCode::SUCCESS;
207 StatusCode sc = StatusCode::SUCCESS;
209 MsgStream log(
msgSvc(), name() );
214 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
225 Vint ipip, ipim, iGood;
235 for (
int i = 0; i < evtRecEvent->totalCharged(); i++ )
238 if ( !( *itTrk )->isMdcTrackValid() )
continue;
241 m_pi_vx->Fill( mdcTrk->
x() );
242 m_pi_vy->Fill( mdcTrk->
y() );
243 m_pi_vz->Fill( mdcTrk->
z() );
245 if ( fabs( mdcTrk->
z() ) >= m_vz0cut )
continue;
246 if ( mdcTrk->
r() >= m_vr0cut )
continue;
247 iGood.push_back( ( *itTrk )->trackId() );
248 TotCharge += mdcTrk->
charge();
253 int nGood = iGood.size();
258 for (
int i = evtRecEvent->totalCharged(); i < evtRecEvent->totalTracks(); i++ )
261 if ( !( *itTrk )->isEmcShowerValid() )
continue;
263 Hep3Vector emcpos( emcTrk->
x(), emcTrk->
y(), emcTrk->
z() );
268 for (
int j = 0; j < evtRecEvent->totalCharged(); j++ )
271 if ( !( *jtTrk )->isExtTrackValid() )
continue;
276 double angd = extpos.angle( emcpos );
277 double thed = extpos.theta() - emcpos.theta();
278 double phid = extpos.deltaPhi( emcpos );
279 thed = fmod( thed + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
280 phid = fmod( phid + CLHEP::twopi + CLHEP::twopi +
pi, CLHEP::twopi ) - CLHEP::pi;
281 angd = fmod( angd, CLHEP::twopi );
291 if ( dang >= 200. )
continue;
293 double eraw = emcTrk->
energy();
294 dthe = dthe * 180 / ( CLHEP::pi );
295 dphi = dphi * 180 / ( CLHEP::pi );
296 dang = dang * 180 / ( CLHEP::pi );
297 if ( eraw < m_energyThreshold )
continue;
302 iGam.push_back( ( *itTrk )->trackId() );
307 int nGam = iGam.size();
313 HepLorentzVector ptcharg, ptneu, ptchargp, ptchargm;
316 for (
int i = 0; i < nGam; i++ )
320 double eraw = emcTrk->
energy();
321 double phi = emcTrk->
phi();
322 double the = emcTrk->
theta();
323 HepLorentzVector ptrk;
324 ptrk.setPx( eraw *
sin( the ) *
cos( phi ) );
325 ptrk.setPy( eraw *
sin( the ) *
sin( phi ) );
326 ptrk.setPz( eraw *
cos( the ) );
328 pGam.push_back( ptrk );
334 for (
int i = 0; i < nGood; i++ )
337 if ( !( *itTrk )->isMdcTrackValid() )
continue;
338 if ( !( *itTrk )->isMdcDedxValid() )
continue;
341 m_chie_dedx->Fill( dedxTrk->
chiE() );
342 m_chimu_dedx->Fill( dedxTrk->
chiMu() );
343 m_chipi_dedx->Fill( dedxTrk->
chiPi() );
344 m_chik_dedx->Fill( dedxTrk->
chiK() );
345 m_chip_dedx->Fill( dedxTrk->
chiP() );
355 for (
int i = 0; i < nGood; i++ )
368 if ( !( *itTrk )->isMdcKalTrackValid() )
continue;
372 TotQ += mdcKalTrk->
charge();
379 HepLorentzVector ptrk;
380 ptrk.setPx( mdcKalTrk->
px() );
381 ptrk.setPy( mdcKalTrk->
py() );
382 ptrk.setPz( mdcKalTrk->
pz() );
383 double p3 = ptrk.mag();
384 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
385 if ( mdcTrk->
charge() > 0 )
387 ipip.push_back( iGood[i] );
388 ppip.push_back( ptrk );
392 ipim.push_back( iGood[i] );
393 ppim.push_back( ptrk );
397 int npip = ipip.size();
398 int npim = ipim.size();
402 if ( nGood != 2 || TotCharge != 0 )
return sc;
404 if ( nGam < 2 )
return sc;
410 HepLorentzVector BoostP( 0.0, 0.0, 0.0,
ecms );
411 BoostP[0] = 2 *
sin( 0.011 ) * (
ecms / 2 );
412 Hep3Vector u_Boost = -BoostP.boostVector();
419 HepLorentzVector p2g, ppi0;
420 double delmpi = 999.;
421 int ig11 = -1, ig21 = -1;
423 for (
int i = 0; i < nGam - 1; i++ )
425 for (
int j = i + 1; j < nGam; j++ )
427 HepLorentzVector ppi0 = pGam[i] + pGam[j];
428 if ( fabs( ppi0.m() -
mpi0c ) > delmpi )
continue;
429 if ( ppi0.m() > 0.2 )
continue;
430 delmpi = fabs( ppi0.m() -
mpi0c );
435 if ( ig11 == -1 || ig21 == -1 )
return sc;
436 p2g = pGam[ig11] + pGam[ig21];
439 HepLorentzVector Ppip1 = ppip[0];
440 Ppip1.boost( u_Boost );
441 p2g.boost( u_Boost );
448 HepLorentzVector Pmiss = -Ppip1 - p2g;
449 m_pmiss = Pmiss.rho();
450 double emiss =
ecms - Ppip1.e() - p2g.e();
452 m_mmiss = sqrt( fabs( emiss * emiss - Pmiss.rho() * Pmiss.rho() ) );
454 HepLorentzVector Prho0, Prhop, Prhom, pmisspi, ptot;
455 pmisspi.setPx( Pmiss.px() );
456 pmisspi.setPy( Pmiss.py() );
457 pmisspi.setPz( Pmiss.pz() );
458 pmisspi.setE( emiss );
460 Prho0 = Ppip1 + pmisspi;
462 Prhom = pmisspi + p2g;
463 ptot = Ppip1 + pmisspi + p2g;
465 m_pmrho0 = Prho0.rho();
466 m_mmrho0 = Prho0.m();
469 m_prhop = Prhop.rho();
473 m_pmrhom = Prhom.rho();
474 m_mmrhom = Prhom.m();
475 m_ppipraw = Ppip1.rho();
480 if ( npip * npim != 1 )
return sc;
483 HepLorentzVector Ppim1 = ppim[0];
484 Ppim1.boost( u_Boost );
485 HepLorentzVector Ppip1 = ppip[0];
486 Ppip1.boost( u_Boost );
488 HepLorentzVector Pneumiss = -( Ppim1 + Ppip1 );
489 m_pneumiss = Pneumiss.rho();
490 double eneumiss =
ecms - Ppim1.e() - Ppip1.e();
491 m_eneumiss = eneumiss;
492 m_mneumiss = sqrt( fabs( eneumiss * eneumiss - Pneumiss.rho() * Pneumiss.rho() ) );
498 HepSymMatrix Evx( 3, 0 );
513 RecMdcKalTrack* pipTrk = ( *( evtRecTrkCol->begin() + ipip[0] ) )->mdcKalTrack();
520 RecMdcKalTrack* pimTrk = ( *( evtRecTrkCol->begin() + ipim[0] ) )->mdcKalTrack();
531 if ( !vtxfit->
Fit( 0 ) )
return sc;
542 double chisq4c = 9999.;
547 for (
int i = 0; i < nGam - 1; i++ )
549 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + iGam[i] ) )->emcShower();
550 for (
int j = i + 1; j < nGam; j++ )
552 RecEmcShower* g2Trk = ( *( evtRecTrkCol->begin() + iGam[j] ) )->emcShower();
561 if ( !kmfit->
Fit() )
continue;
562 double chi2 = kmfit->
chisq();
563 if ( chi2 > chisq4c )
continue;
570 if ( chisq4c > 500 || ig1 < 0 )
return sc;
571 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + iGam[ig1] ) )->emcShower();
572 RecEmcShower* g2Trk = ( *( evtRecTrkCol->begin() + iGam[ig2] ) )->emcShower();
580 if ( !kmfit->
Fit() )
return sc;
581 double chi = kmfit->
chisq();
583 m_chisq_4c->Fill( chi );
585 HepLorentzVector p2gam = kmfit->
pfit( 2 ) + kmfit->
pfit( 3 );
586 m_ppi0 = p2gam.rho();
589 m_pi0_mass->Fill( p2gam.m() );
606 if ( !kmfit->
Fit() )
return sc;
607 double chis = kmfit->
chisq();
613 double chisk5c = 9999.;
620 if ( vtxfit->
Fit( 0 ) )
633 if ( kmfit->
Fit() ) chisk5c = kmfit->
chisq();
635 if ( chisk5c < chis )
return sc;
648 if ( !kmfit->
Fit( 0 ) )
return sc;
649 if ( !kmfit->
Fit() )
return sc;
652 m_chisq5c = kmfit->
chisq();
654 m_chisq_5c->Fill( kmfit->
chisq() );
656 HepLorentzVector ppi1 = kmfit->
pfit( 0 );
657 HepLorentzVector ppi2 = kmfit->
pfit( 1 );
658 HepLorentzVector pgam1 = kmfit->
pfit( 2 );
659 HepLorentzVector pgam2 = kmfit->
pfit( 3 );
660 HepLorentzVector p2gam1 = kmfit->
pfit( 2 ) + kmfit->
pfit( 3 );
661 HepLorentzVector p2pi = kmfit->
pfit( 0 ) + kmfit->
pfit( 1 );
662 m_ppi0fit = p2gam1.rho();
663 m_mpi0fit = p2gam1.m();
668 m_ppip0 = ( ppi1 + p2gam1 ).rho();
669 m_mpip0 = ( ppi1 + p2gam1 ).m();
670 m_ppim0 = ( ppi2 + p2gam1 ).rho();
671 m_mpim0 = ( ppi2 + p2gam1 ).m();
673 m_pip_mom->Fill( ppi1.rho() );
674 m_pim_mom->Fill( ppi2.rho() );
675 m_rho0_mass->Fill( p2pi.m() );
676 m_rhop_mass->Fill( ( ppi1 + p2gam1 ).m() );
677 m_rhom_mass->Fill( ( ppi2 + p2gam1 ).m() );
680 double theta2pi = ppi1.px() * ppi2.px() + ppi1.py() * ppi2.py() + ppi1.pz() * ppi2.pz();
681 double time2pi = ppi1.rho() * ppi2.rho();
682 if ( time2pi == 0. )
return sc;
686 theta2pi = theta2pi / time2pi;
690 if ( theta2pi <= -1. ) theta2pi = 180.;
691 else if ( theta2pi >= 1. ) theta2pi = 0.;
692 else if ( fabs( theta2pi ) < 1. ) theta2pi = acos( theta2pi ) * 180. / 3.14159;
693 m_theta2pi = theta2pi;
696 HepLorentzVector pg1inpi0, pg2inpi0;
699 double betapi0 = p2gam1.beta();
701 Hep3Vector twogam( p2gam.px(), p2gam.py(), p2gam.pz() );
704 ( ( boostOf( pgam1, twogam / p2gam.rho(), betapi0 ) ).theta() ) * 180. / 3.14159;
706 ( ( boostOf( pgam2, twogam / p2gam.rho(), betapi0 ) ).theta() ) * 180. / 3.14159;
747 return StatusCode::SUCCESS;