33 Vint iGam,
double Ebeam,
int PID_flag,
int Charge_candidate_D ) {
35 int nGood = iGood.size();
36 int nGam = iGam.size();
41 double mass_bcgg, delE_tag_temp;
42 int m_chargetag, m_chargepi1, m_chargepi2, m_chargepi3, m_chargepi4;
43 int ik1_temp, ipi1_temp, ipi2_temp, ipi3_temp, ipi4_temp, iGam1_temp, iGam2_temp;
44 HepLorentzVector pddd;
45 HepLorentzVector pddd_temp;
47 IDataProviderSvc* eventSvc = NULL;
48 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc );
50 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc,
"/Event/EventHeader" );
52 int runNo = eventHeader->runNumber();
53 int rec = eventHeader->eventNumber();
55 double xecm = 2 * Ebeam;
60 if ( ( evtRecEvent->totalCharged() < 4 || nGam < 2 ) ) {
return; }
65 Gaudi::svcLocator()->service(
"SimplePIDSvc", simple_pid );
67 double deltaE_tem = 0.20;
70 Hep3Vector xorigin( 0, 0, 0 );
71 HepSymMatrix xoriginEx( 3, 0 );
73 Gaudi::svcLocator()->service(
"VertexDbSvc", vtxsvc );
78 xorigin.setX( dbv[0] );
79 xorigin.setY( dbv[1] );
80 xorigin.setZ( dbv[2] );
82 xoriginEx[0][0] = vv[0] * vv[0];
83 xoriginEx[1][1] = vv[1] * vv[1];
84 xoriginEx[2][2] = vv[2] * vv[2];
87 double xv = xorigin.x();
88 double yv = xorigin.y();
89 double zv = xorigin.z();
91 HepPoint3D point0( 0., 0., 0. );
92 HepPoint3D IP( xorigin[0], xorigin[1], xorigin[2] );
95 HepLorentzVector p2gfit;
96 HepLorentzVector p2gg;
98 for (
int i = 0; i < evtRecEvent->totalCharged(); i++ )
102 int ipi1 = ( *itTrk )->trackId();
104 if ( !( *itTrk )->isMdcKalTrackValid() )
continue;
108 m_chargepi1 = mdcKalTrk1->
charge();
109 if ( m_chargepi1 != 1 )
continue;
113 HepSymMatrix Ea1 = mdcKalTrk1->
getZError();
115 VFHelix helixip3_1( point0, a1, Ea1 );
116 helixip3_1.
pivot( IP );
117 HepVector vecipa1 = helixip3_1.
a();
119 double dr1 = fabs( vecipa1[0] );
120 double dz1 = fabs( vecipa1[3] );
121 double costheta1 =
cos( mdcKalTrk1->
theta() );
123 if ( dr1 >= 15.0 )
continue;
124 if ( dz1 >= 25.0 )
continue;
125 if ( fabs( costheta1 ) >= 0.93 )
continue;
133 for (
int j = 0; j < evtRecEvent->totalCharged(); j++ )
137 int ipi2 = ( *itTrk )->trackId();
138 if ( ipi1 == ipi2 )
continue;
140 if ( !( *itTrk )->isMdcKalTrackValid() )
continue;
144 m_chargepi2 = mdcKalTrk2->
charge();
145 if ( ( m_chargepi2 + m_chargepi1 ) != 0 )
continue;
149 HepSymMatrix Ea2 = mdcKalTrk2->
getZError();
150 VFHelix helixip3_2( point0, a2, Ea2 );
151 helixip3_2.
pivot( IP );
152 HepVector vecipa2 = helixip3_2.
a();
154 double dr2 = fabs( vecipa2[0] );
155 double dz2 = fabs( vecipa2[3] );
156 double costheta2 =
cos( mdcKalTrk2->
theta() );
157 if ( dr2 >= 15.0 )
continue;
158 if ( dz2 >= 25.0 )
continue;
159 if ( fabs( costheta2 ) >= 0.93 )
continue;
163 HepVector pip1_val = HepVector( 7, 0 );
164 HepVector pim1_val = HepVector( 7, 0 );
167 HepLorentzVector ptrktagk0( pip1_val[0] + pim1_val[0], pip1_val[1] + pim1_val[1],
168 pip1_val[2] + pim1_val[2], pip1_val[3] + pim1_val[3] );
169 double m_xmtagk0_tem = ptrktagk0.mag();
170 if ( fabs( ptrktagk0.m() - 0.498 ) > 0.1 )
continue;
172 HepPoint3D vx( xorigin.x(), xorigin.y(), xorigin.z() );
173 HepSymMatrix Evx( 3, 0 );
189 if ( !( vtxfit0->
Fit( 0 ) ) )
continue;
200 for (
int k = 0; k < evtRecEvent->totalCharged(); k++ )
204 int ipi3 = ( *itTrk )->trackId();
205 if ( ipi2 == ipi3 || ipi1 == ipi3 )
continue;
207 if ( !( *itTrk )->isMdcKalTrackValid() )
continue;
211 m_chargepi3 = mdcKalTrk3->
charge();
212 if (
abs( m_chargepi3 ) != 1 )
continue;
216 HepSymMatrix Ea3 = mdcKalTrk3->
getZError();
217 VFHelix helixip3_3( point0, a3, Ea3 );
218 helixip3_3.
pivot( IP );
219 HepVector vecipa3 = helixip3_3.
a();
221 double dr3 = fabs( vecipa3[0] );
222 double dz3 = fabs( vecipa3[3] );
223 double costheta3 =
cos( mdcKalTrk3->
theta() );
224 if ( dr3 >= 1.0 )
continue;
225 if ( dz3 >= 10.0 )
continue;
226 if ( fabs( costheta3 ) >= 0.93 )
continue;
231 if ( simple_pid->
probPion() < 0.0 ||
241 for (
int l = 0; l < evtRecEvent->totalCharged(); l++ )
245 int ipi4 = ( *itTrk )->trackId();
246 if ( ipi4 == ipi3 || ipi4 == ipi2 || ipi4 == ipi1 )
continue;
248 if ( !( *itTrk )->isMdcKalTrackValid() )
continue;
252 m_chargepi4 = mdcKalTrk4->
charge();
253 if ( ( m_chargepi4 + m_chargepi3 ) != 0 )
continue;
257 HepSymMatrix Ea4 = mdcKalTrk4->
getZError();
258 VFHelix helixip3_4( point0, a4, Ea4 );
259 helixip3_4.
pivot( IP );
260 HepVector vecipa4 = helixip3_4.
a();
262 double dr4 = fabs( vecipa4[0] );
263 double dz4 = fabs( vecipa4[3] );
264 double costheta4 =
cos( mdcKalTrk4->
theta() );
265 if ( dr4 >= 1.0 )
continue;
266 if ( dz4 >= 10.0 )
continue;
267 if ( fabs( costheta4 ) >= 0.93 )
continue;
272 if ( simple_pid->
probPion() < 0.0 ||
279 for (
int m = 0; m < nGam - 1; m++ )
281 if ( iGam[m] == -1 )
continue;
282 RecEmcShower* g1Trk = ( *( evtRecTrkCol->begin() + iGam[m] ) )->emcShower();
283 double eraw1 = g1Trk->
energy();
285 double the1 = g1Trk->
theta();
286 HepLorentzVector ptrkg1, ptrkg10, ptrkg12;
287 ptrkg1.setPx( eraw1 *
sin( the1 ) *
cos(
phi1 ) );
288 ptrkg1.setPy( eraw1 *
sin( the1 ) *
sin(
phi1 ) );
289 ptrkg1.setPz( eraw1 *
cos( the1 ) );
290 ptrkg1.setE( eraw1 );
292 ptrkg12 = ptrkg1.boost( -0.011, 0, 0 );
294 for (
int n = m + 1;
n < nGam;
n++ )
296 if ( iGam[
n] == -1 )
continue;
297 RecEmcShower* g2Trk = ( *( evtRecTrkCol->begin() + iGam[
n] ) )->emcShower();
298 double eraw2 = g2Trk->
energy();
300 double the2 = g2Trk->
theta();
301 HepLorentzVector ptrkg2, ptrkg20, ptrkg22;
302 ptrkg2.setPx( eraw2 *
sin( the2 ) *
cos(
phi2 ) );
303 ptrkg2.setPy( eraw2 *
sin( the2 ) *
sin(
phi2 ) );
304 ptrkg2.setPz( eraw2 *
cos( the2 ) );
305 ptrkg2.setE( eraw2 );
307 ptrkg22 = ptrkg2.boost( -0.011, 0, 0 );
310 HepLorentzVector ptrkpi0;
311 ptrkpi0 = ptrkg12 + ptrkg22;
312 double m_xmpi0_tem = ptrkpi0.m();
313 if ( m_xmpi0_tem > 0.150 || m_xmpi0_tem < 0.115 )
continue;
315 bool IsEndcap1 =
false;
316 bool IsEndcap2 =
false;
317 if ( fabs(
cos( the1 ) ) > 0.86 && fabs(
cos( the1 ) ) < 0.92 ) IsEndcap1 =
true;
318 if ( fabs(
cos( the2 ) ) > 0.86 && fabs(
cos( the2 ) ) < 0.92 ) IsEndcap2 =
true;
319 if ( IsEndcap1 && IsEndcap2 )
continue;
331 double pi0_chisq = kmfit->
chisq( 0 );
332 if ( pi0_chisq >= 2500 )
continue;
333 HepLorentzVector p2gfit = kmfit->
pfit( 0 ) + kmfit->
pfit( 1 );
334 p2gfit.boost( -0.011, 0, 0 );
342 if ( !vtxfit_2->
Fit( 0 ) )
continue;
350 vxpar.
setEvx( xoriginEx );
354 if ( !vtxfit->
Fit() )
continue;
356 if ( vtxfit->
chisq() > 999. )
continue;
359 double m_massks1_tem = vtxfit->
p4par().m();
360 if ( m_massks1_tem < 0.485 || m_massks1_tem > 0.515 )
continue;
361 HepLorentzVector p4kstag = vtxfit->
p4par();
364 HepVector pip2_val = HepVector( 7, 0 );
365 HepVector pim2_val = HepVector( 7, 0 );
366 HepVector ksp_val = HepVector( 7, 0 );
367 HepVector ksm_val = HepVector( 7, 0 );
369 pip2_val = wpip2.
w();
370 pim2_val = wpim2.
w();
374 HepLorentzVector P_PIP2( pip2_val[0], pip2_val[1], pip2_val[2], pip2_val[3] );
375 HepLorentzVector P_PIM2( pim2_val[0], pim2_val[1], pim2_val[2], pim2_val[3] );
376 HepLorentzVector P_KSP( ksp_val[0], ksp_val[1], ksp_val[2], ksp_val[3] );
377 HepLorentzVector P_KSM( ksm_val[0], ksm_val[1], ksm_val[2], ksm_val[3] );
379 p4kstag.boost( -0.011, 0, 0 );
380 P_PIP2.boost( -0.011, 0, 0 );
381 P_PIM2.boost( -0.011, 0, 0 );
382 P_KSP.boost( -0.011, 0, 0 );
383 P_KSM.boost( -0.011, 0, 0 );
386 pddd = P_PIP2 + P_PIM2 + p4kstag + p2gfit;
388 double pk0pipipi0 = pddd.rho();
390 double temp1 = (
ecms / 2 ) * (
ecms / 2 ) - pk0pipipi0 * pk0pipipi0;
391 if ( temp1 < 0 ) temp1 = 0;
392 double mass_bc_tem = sqrt( temp1 );
393 if ( mass_bc_tem < 1.82 || mass_bc_tem > 1.89 )
continue;
395 double delE_tag_tag =
ecms / 2 - pddd.e();
397 if ( fabs( delE_tag_tag ) < deltaE_tem )
399 deltaE_tem = fabs( delE_tag_tag );
400 delE_tag_temp = delE_tag_tag;
401 mass_bcgg = mass_bc_tem;
409 iGam1_temp = iGam[m];
410 iGam2_temp = iGam[
n];
424 if ( m_chargetag < 0 ) tagmode = -17;
427 delE_tag = delE_tag_temp;
430 iGoodtag.push_back( ipi1_temp );
431 iGoodtag.push_back( ipi2_temp );
432 iGoodtag.push_back( ipi3_temp );
433 iGoodtag.push_back( ipi4_temp );
435 iGamtag.push_back( iGam1_temp );
436 iGamtag.push_back( iGam2_temp );
437 iGamtag.push_back( 9999 );
438 iGamtag.push_back( 9999 );