102 MsgStream log(
msgSvc(), name() );
103 log << MSG::INFO <<
"in execute()" << endmsg;
110 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
111 int event = eventHeader->eventNumber();
117 log << MSG::DEBUG <<
"run and event = " << eventHeader->runNumber() <<
" "
118 << eventHeader->eventNumber() << endmsg;
119 log << MSG::DEBUG <<
"ncharg, nneu, tottks = " << recEvent->totalCharged() <<
" , "
120 << recEvent->totalNeutral() <<
" , " << recEvent->totalTracks() << endmsg;
128 SmartDataPtr<EvtRecPi0Col> recPi0Col( eventSvc(),
"/Event/EvtRec/EvtRecPi0Col" );
131 log << MSG::FATAL <<
"Could not find EvtRecPi0Col" << endmsg;
132 return StatusCode::FAILURE;
135 SmartDataPtr<EvtRecEtaToGGCol> recEtaToGGCol( eventSvc(),
"/Event/EvtRec/EvtRecEtaToGGCol" );
136 if ( !recEtaToGGCol )
138 log << MSG::FATAL <<
"Could not find EvtRecEtaToGGCol" << endmsg;
139 return StatusCode::FAILURE;
142 SmartDataPtr<EvtRecVeeVertexCol> recVeeVertexCol( eventSvc(),
143 "/Event/EvtRec/EvtRecVeeVertexCol" );
144 if ( !recVeeVertexCol )
146 log << MSG::FATAL <<
"Could not find EvtRecVeeVertexCol" << endmsg;
147 return StatusCode::FAILURE;
153 log << MSG::FATAL <<
"EvtRecDTagCol is not registered yet" << endmsg;
154 return StatusCode::FAILURE;
158 Hep3Vector xorigin( 0, 0, 0 );
160 sc = serviceLocator()->service(
"VertexDbSvc", vtxsvc );
166 xorigin.setX( vertex[0] );
167 xorigin.setY( vertex[1] );
168 xorigin.setZ( vertex[2] );
187 m_pionSelector->setpidtype( 0 );
188 m_kaonSelector->setpidtype( 0 );
191 CDPhotonList photonList( neutral_begin, neutral_end, *m_photonSelector );
194 dc_fill( ksList, recVeeVertexCol->begin(), recVeeVertexCol->end() );
198 for (
CDKsList::iterator ksit = ksList.particle_begin(); ksit != ksList.particle_end();
208 dc_fill( pi0List, recPi0Col->begin(), recPi0Col->end() );
211 dc_fill( etaList, recEtaToGGCol->begin(), recEtaToGGCol->end() );
214 m_pionSelector->setpidtype( 1 );
215 m_kaonSelector->setpidtype( 1 );
219 int run = eventHeader->runNumber();
220 m_ievt = eventHeader->eventNumber();
221 m_nChrg = recEvent->totalCharged();
222 m_nNeu = recEvent->totalNeutral();
223 m_nPion = pionList.
size();
224 m_nKaon = kaonList.
size();
225 m_nPi0 = pi0List.size();
226 m_nKs = ksList.size();
232 if ( m_ReadBeamEFromDB && m_irun != run )
235 if ( m_usecalibBeamE ) m_readDb.setcalib(
true );
236 m_beamE = m_readDb.getbeamE( m_irun, m_beamE );
237 if ( run > 0 ) m_beta = m_readDb.getbeta();
240 double ebeam = m_beamE;
246 for (
int list = 0; list < chanlist.size(); list++ )
249 string channel = chanlist[list];
251 m_dsSelector->setebeam(
ebeam );
252 m_dsSelector->setbeta( m_beta );
264 if ( channel ==
"DstoKsK" )
267 numchan.push_back( 5 );
268 numchan.push_back( 1 );
269 decaylist = ksList * kaonList.
plus();
271 else if ( channel ==
"DstoKKPi" )
274 numchan.push_back( 1 );
275 numchan.push_back( 1 );
276 numchan.push_back( 2 );
277 decaylist = kaonList.
minus() * kaonList.
plus() * pionList.
plus();
279 else if ( channel ==
"DstoKsKPi0" )
282 numchan.push_back( 5 );
283 numchan.push_back( 1 );
284 numchan.push_back( 3 );
285 decaylist = ksList * kaonList.
plus() * pi0List;
287 else if ( channel ==
"DstoKsKsPi" )
290 numchan.push_back( 5 );
291 numchan.push_back( 5 );
292 numchan.push_back( 2 );
293 decaylist = ksList * ksList * pionList.
plus();
295 else if ( channel ==
"DstoKKPiPi0" )
298 numchan.push_back( 1 );
299 numchan.push_back( 1 );
300 numchan.push_back( 2 );
301 numchan.push_back( 3 );
302 decaylist = kaonList.
minus() * kaonList.
plus() * pionList.
plus() * pi0List;
304 else if ( channel ==
"DstoKsKplusPiPi" )
307 numchan.push_back( 5 );
308 numchan.push_back( 1 );
309 numchan.push_back( 2 );
310 numchan.push_back( 2 );
311 decaylist = ksList * kaonList.
plus() * pionList.
plus() * pionList.
minus();
313 else if ( channel ==
"DstoKsKminusPiPi" )
316 numchan.push_back( 5 );
317 numchan.push_back( 1 );
318 numchan.push_back( 2 );
319 numchan.push_back( 2 );
320 decaylist = ksList * kaonList.
minus() * pionList.
plus() * pionList.
plus();
322 else if ( channel ==
"DstoKKPiPiPi" )
325 numchan.push_back( 1 );
326 numchan.push_back( 1 );
327 numchan.push_back( 2 );
328 numchan.push_back( 2 );
329 numchan.push_back( 2 );
330 decaylist = kaonList.
minus() * kaonList.
plus() * pionList.
plus() * pionList.
plus() *
333 else if ( channel ==
"DstoPiPi0" )
336 numchan.push_back( 2 );
337 numchan.push_back( 3 );
338 decaylist = pionList.
plus() * pi0List;
340 else if ( channel ==
"DstoPiPiPi" )
343 numchan.push_back( 2 );
344 numchan.push_back( 2 );
345 numchan.push_back( 2 );
346 decaylist = pionList.
plus() * pionList.
plus() * pionList.
minus();
348 else if ( channel ==
"DstoPiPiPiPi0" )
351 numchan.push_back( 2 );
352 numchan.push_back( 2 );
353 numchan.push_back( 2 );
354 numchan.push_back( 3 );
355 decaylist = pionList.
plus() * pionList.
plus() * pionList.
minus() * pi0List;
357 else if ( channel ==
"DstoPiPiPiPiPi" )
360 numchan.push_back( 2 );
361 numchan.push_back( 2 );
362 numchan.push_back( 2 );
363 numchan.push_back( 2 );
364 numchan.push_back( 2 );
365 decaylist = pionList.
plus() * pionList.
plus() * pionList.
plus() * pionList.
minus() *
368 else if ( channel ==
"DstoPiPiPiPiPiPi0" )
371 numchan.push_back( 2 );
372 numchan.push_back( 2 );
373 numchan.push_back( 2 );
374 numchan.push_back( 2 );
375 numchan.push_back( 2 );
376 numchan.push_back( 3 );
377 decaylist = pionList.
plus() * pionList.
plus() * pionList.
plus() * pionList.
minus() *
378 pionList.
minus() * pi0List;
380 else if ( channel ==
"DstoPiPiPiPi0Pi0" )
383 numchan.push_back( 2 );
384 numchan.push_back( 2 );
385 numchan.push_back( 2 );
386 numchan.push_back( 3 );
387 numchan.push_back( 3 );
388 decaylist = pionList.
plus() * pionList.
plus() * pionList.
minus() * pi0List * pi0List;
390 else if ( channel ==
"DstoPiEta" )
393 numchan.push_back( 2 );
394 numchan.push_back( 4 );
395 decaylist = pionList.
plus() * etaList;
397 else if ( channel ==
"DstoPiEtaPiPiPi0" )
400 numchan.push_back( 2 );
401 numchan.push_back( 9 );
403 EtaList = pionList.
plus() * pionList.
minus() * pi0List;
404 decaylist = pionList.
plus() * EtaList;
406 else if ( channel ==
"DstoPiPi0Eta" )
409 numchan.push_back( 2 );
410 numchan.push_back( 3 );
411 numchan.push_back( 4 );
412 decaylist = pionList.
plus() * pi0List * etaList;
414 else if ( channel ==
"DstoPiPi0EtaPiPiPi0" )
417 numchan.push_back( 2 );
418 numchan.push_back( 3 );
419 numchan.push_back( 9 );
421 EtaList = pionList.
plus() * pionList.
minus() * pi0List;
422 decaylist = pionList.
plus() * pi0List * EtaList;
424 else if ( channel ==
"DstoPiPiPiEta" )
427 numchan.push_back( 2 );
428 numchan.push_back( 2 );
429 numchan.push_back( 2 );
430 numchan.push_back( 4 );
431 decaylist = pionList.
plus() * pionList.
plus() * pionList.
minus() * etaList;
433 else if ( channel ==
"DstoPiPiPiEtaPiPiPi0" )
436 numchan.push_back( 2 );
437 numchan.push_back( 2 );
438 numchan.push_back( 2 );
439 numchan.push_back( 9 );
441 EtaList = pionList.
plus() * pionList.
minus() * pi0List;
442 decaylist = pionList.
plus() * pionList.
plus() * pionList.
minus() * EtaList;
444 else if ( channel ==
"DstoPiEPPiPiEta" )
447 numchan.push_back( 2 );
448 numchan.push_back( 6 );
450 epList = pionList.
plus() * pionList.
minus() * etaList;
451 decaylist = pionList.
plus() * epList;
453 else if ( channel ==
"DstoPiPi0EPPiPiEta" )
456 numchan.push_back( 2 );
457 numchan.push_back( 3 );
458 numchan.push_back( 6 );
460 epList = pionList.
plus() * pionList.
minus() * etaList;
461 decaylist = pionList.
plus() * pi0List * epList;
463 else if ( channel ==
"DstoPiEPPiPiEtaPiPiPi0" )
466 numchan.push_back( 2 );
467 numchan.push_back( 8 );
469 EtaList = pionList.
plus() * pionList.
minus() * pi0List;
471 EtapList = pionList.
plus() * pionList.
minus() * EtaList;
472 decaylist = pionList.
plus() * EtapList;
474 else if ( channel ==
"DstoPiPi0EPPiPiEtaPiPiPi0" )
477 numchan.push_back( 2 );
478 numchan.push_back( 3 );
479 numchan.push_back( 8 );
481 EtaList = pionList.
plus() * pionList.
minus() * pi0List;
483 EtapList = pionList.
plus() * pionList.
minus() * EtaList;
484 decaylist = pionList.
plus() * pi0List * EtapList;
487 else if ( channel ==
"DstoPiEPRhoGam" )
490 numchan.push_back( 2 );
491 numchan.push_back( 7 );
493 rhoList = pionList.
plus() * pionList.
minus();
495 epList = rhoList * photonList;
496 decaylist = pionList.
plus() * epList;
498 else if ( channel ==
"DstoPiPi0EPRhoGam" )
501 numchan.push_back( 2 );
502 numchan.push_back( 3 );
503 numchan.push_back( 7 );
505 rhoList = pionList.
plus() * pionList.
minus();
507 epList = rhoList * photonList;
508 decaylist = pionList.
plus() * pi0List * epList;
510 else if ( channel ==
"DstoKsPi" )
513 numchan.push_back( 5 );
514 numchan.push_back( 2 );
515 decaylist = ksList * pionList.
plus();
517 else if ( channel ==
"DstoKsPiPi0" )
520 numchan.push_back( 5 );
521 numchan.push_back( 2 );
522 numchan.push_back( 3 );
523 decaylist = ksList * pionList.
plus() * pi0List;
525 else if ( channel ==
"DstoKPiPi" )
528 numchan.push_back( 1 );
529 numchan.push_back( 2 );
530 numchan.push_back( 2 );
531 decaylist = kaonList.
plus() * pionList.
plus() * pionList.
minus();
533 else if ( channel ==
"DstoKPiPiPi0" )
536 numchan.push_back( 1 );
537 numchan.push_back( 2 );
538 numchan.push_back( 2 );
539 numchan.push_back( 3 );
540 decaylist = kaonList.
plus() * pionList.
plus() * pionList.
minus() * pi0List;
542 else if ( channel ==
"DstoKKK" )
545 numchan.push_back( 1 );
546 numchan.push_back( 1 );
547 numchan.push_back( 1 );
548 decaylist = kaonList.
minus() * kaonList.
plus() * kaonList.
plus();
560 vector<int> trackid, showerid;
561 vector<int> kaonid, pionid;
562 int numofchildren = numchan.size() - 1;
564 for (
int i = 0; i < numofchildren; i++ )
567 const CDCandidate& daughter = ( *it ).particle().child( i );
569 if ( numchan[i + 1] == 1 )
572 trackid.push_back( track->
trackId() );
573 kaonid.push_back( track->
trackId() );
575 else if ( numchan[i + 1] == 2 )
578 trackid.push_back( track->
trackId() );
579 pionid.push_back( track->
trackId() );
581 else if ( numchan[i + 1] == 3 )
585 showerid.push_back( hiEnGamma->
trackId() );
586 showerid.push_back( loEnGamma->
trackId() );
588 else if ( numchan[i + 1] == 4 )
592 showerid.push_back( hiEnGamma->
trackId() );
593 showerid.push_back( loEnGamma->
trackId() );
595 else if ( numchan[i + 1] == 5 )
600 recDTag->
addToFitInfo( aKsCand->
mass(), fitinfo[aKsCand][0], fitinfo[aKsCand][1],
601 fitinfo[aKsCand][2] );
605 trackid.push_back( pion1Trk->
trackId() );
606 trackid.push_back( pion2Trk->
trackId() );
608 else if ( numchan[i + 1] == 6 )
618 trackid.push_back( apiontrk->
trackId() );
619 trackid.push_back( spiontrk->
trackId() );
620 showerid.push_back( hiEnGamma->
trackId() );
621 showerid.push_back( loEnGamma->
trackId() );
623 else if ( numchan[i + 1] == 7 )
634 trackid.push_back( apiontrk->
trackId() );
635 trackid.push_back( spiontrk->
trackId() );
636 showerid.push_back( gammatrk->
trackId() );
638 else if ( numchan[i + 1] == 8 )
655 trackid.push_back( apiontrk->
trackId() );
656 trackid.push_back( spiontrk->
trackId() );
657 trackid.push_back( e0piontrk->
trackId() );
658 trackid.push_back( e1piontrk->
trackId() );
659 showerid.push_back( hiEnGamma->
trackId() );
660 showerid.push_back( loEnGamma->
trackId() );
662 else if ( numchan[i + 1] == 9 )
672 trackid.push_back( apiontrk->
trackId() );
673 trackid.push_back( spiontrk->
trackId() );
674 showerid.push_back( hiEnGamma->
trackId() );
675 showerid.push_back( loEnGamma->
trackId() );
685 updateKsInfo( it,
ebeam, numofchildren, recDTag, numchan, vtxsvc, m_useVFrefine );
687 savetrack( trackid, showerid, charged_begin, charged_end, neutral_begin, neutral_end,
689 pidtag( kaonid, pionid, kaonList_tight, pionList_tight, recDTag );
691 if ( m_usevertexfit )
693 if ( m_debug ) cout <<
"beforevfit:" << endl;
695 HepLorentzVector p4change_vfit;
698 { p4change_vfit = util.
vfitref( channel, kaonid, pionid, xorigin, charged_begin ); }
699 else { p4change_vfit = util.
vfit( channel, kaonid, pionid, xorigin, charged_begin ); }
701 recDTag->
setp4( recDTag->
p4() + p4change_vfit );
710 recDTagCol->push_back( recDTag );
718 return StatusCode::SUCCESS;
890 HepLorentzVector p4Ds( ( *it ).particle().momentum(), ( *it ).particle().energy() );
891 HepLorentzVector p4Ds_New;
893 for (
int i = 0; i < numofchildren; i++ )
895 const CDCandidate& daughter = ( *it ).particle().child( i );
897 if ( numchan[i + 1] == 5 )
900 HepVector veewks = aKsCand->
w();
901 HepLorentzVector p4KsCand;
902 p4KsCand.setX( veewks[0] );
903 p4KsCand.setY( veewks[1] );
904 p4KsCand.setZ( veewks[2] );
905 p4KsCand.setE( veewks[3] );
906 HepLorentzVector p4wks = p4KsCand;
911 vector<double> vp4ks_new = util.
UpdatedKsIfo( aKsCand, vtxsvc, m_useVFrefine );
912 HepLorentzVector p4wks_new;
913 p4wks_new.setX( vp4ks_new[0] );
914 p4wks_new.setY( vp4ks_new[1] );
915 p4wks_new.setZ( vp4ks_new[2] );
916 p4wks_new.setE( vp4ks_new[3] );
918 p4Ds = p4Ds - p4wks + p4wks_new;
924 double mass = p4Ds_New.m();
925 int charge = ( *it ).particle().charge();
926 recDTag->
setp4( p4Ds_New );
927 p4Ds_New.boost( -m_beta );
928 double mbc2_CMS =
ebeam *
ebeam - p4Ds_New.v().mag2();
929 double mbc_CMS = mbc2_CMS > 0 ? sqrt( mbc2_CMS ) : -10;
930 double deltaE_CMS = p4Ds_New.t() -
ebeam;
932 int tag = ( *it ).particle().userTag();
939 recDTag->
setmBC( mbc_CMS );