104 MsgStream log(
msgSvc(), name() );
105 log << MSG::INFO <<
"in execute()" << endmsg;
112 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
113 int event = eventHeader->eventNumber();
119 log << MSG::DEBUG <<
"run and event = " << eventHeader->runNumber() <<
" "
120 << eventHeader->eventNumber() << endmsg;
121 log << MSG::DEBUG <<
"ncharg, nneu, tottks = " << recEvent->totalCharged() <<
" , "
122 << recEvent->totalNeutral() <<
" , " << recEvent->totalTracks() << endmsg;
130 SmartDataPtr<EvtRecPi0Col> recPi0Col( eventSvc(),
"/Event/EvtRec/EvtRecPi0Col" );
133 log << MSG::FATAL <<
"Could not find EvtRecPi0Col" << endmsg;
134 return StatusCode::FAILURE;
137 SmartDataPtr<EvtRecEtaToGGCol> recEtaToGGCol( eventSvc(),
"/Event/EvtRec/EvtRecEtaToGGCol" );
138 if ( !recEtaToGGCol )
140 log << MSG::FATAL <<
"Could not find EvtRecEtaToGGCol" << endmsg;
141 return StatusCode::FAILURE;
144 SmartDataPtr<EvtRecVeeVertexCol> recVeeVertexCol( eventSvc(),
145 "/Event/EvtRec/EvtRecVeeVertexCol" );
146 if ( !recVeeVertexCol )
148 log << MSG::FATAL <<
"Could not find EvtRecVeeVertexCol" << endmsg;
149 return StatusCode::FAILURE;
155 log << MSG::FATAL <<
"EvtRecDTagCol is not registered in TDS" << endmsg;
156 return StatusCode::FAILURE;
160 Hep3Vector xorigin( 0, 0, 0 );
162 sc = serviceLocator()->service(
"VertexDbSvc", vtxsvc );
168 xorigin.setX( vertex[0] );
169 xorigin.setY( vertex[1] );
170 xorigin.setZ( vertex[2] );
189 m_pionSelector->setpidtype( 0 );
190 m_kaonSelector->setpidtype( 0 );
193 CDPhotonList photonList( neutral_begin, neutral_end, *m_photonSelector );
196 dc_fill( ksList, recVeeVertexCol->begin(), recVeeVertexCol->end() );
200 for (
CDKsList::iterator ksit = ksList.particle_begin(); ksit != ksList.particle_end();
210 dc_fill( pi0List, recPi0Col->begin(), recPi0Col->end() );
213 dc_fill( etaList, recEtaToGGCol->begin(), recEtaToGGCol->end() );
216 m_pionSelector->setpidtype( 1 );
217 m_kaonSelector->setpidtype( 1 );
221 int run = eventHeader->runNumber();
222 m_ievt = eventHeader->eventNumber();
223 m_nChrg = recEvent->totalCharged();
224 m_nNeu = recEvent->totalNeutral();
225 m_nPion = pionList.
size();
226 m_nKaon = kaonList.
size();
227 m_nPi0 = pi0List.size();
228 m_nKs = ksList.size();
234 if ( m_ReadBeamEFromDB && m_irun != run )
237 if ( m_usecalibBeamE ) m_readDb.setcalib(
true );
238 m_beamE = m_readDb.getbeamE( m_irun, m_beamE );
239 if ( run > 0 ) m_beta = m_readDb.getbeta();
243 double ebeam = m_beamE;
249 for (
int list = 0; list < chanlist.size(); list++ )
252 string channel = chanlist[list];
254 m_neutralDSelector->setebeam(
ebeam );
255 m_neutralDSelector->setbeta( m_beta );
258 bool isFlavorMode =
false;
265 if ( channel ==
"D0toKPi" )
268 numchan.push_back( 1 );
269 numchan.push_back( 2 );
270 decaylist = kaonList.
minus() * pionList.
plus();
273 else if ( channel ==
"D0toKPiPi0" )
276 numchan.push_back( 1 );
277 numchan.push_back( 2 );
278 numchan.push_back( 3 );
279 decaylist = kaonList.
minus() * pionList.
plus() * pi0List;
282 else if ( channel ==
"D0toKPiPi0Pi0" )
285 numchan.push_back( 1 );
286 numchan.push_back( 2 );
287 numchan.push_back( 3 );
288 numchan.push_back( 3 );
289 decaylist = kaonList.
minus() * pionList.
plus() * pi0List * pi0List;
292 else if ( channel ==
"D0toKPiPiPi" )
295 numchan.push_back( 1 );
296 numchan.push_back( 2 );
297 numchan.push_back( 2 );
298 numchan.push_back( 2 );
302 else if ( channel ==
"D0toKPiPiPiPi0" )
305 numchan.push_back( 1 );
306 numchan.push_back( 2 );
307 numchan.push_back( 2 );
308 numchan.push_back( 2 );
309 numchan.push_back( 3 );
314 else if ( channel ==
"D0toKPiEta" )
317 numchan.push_back( 1 );
318 numchan.push_back( 2 );
319 numchan.push_back( 4 );
320 decaylist = kaonList.
minus() * pionList.
plus() * etaList;
323 else if ( channel ==
"D0toKPiPi0Pi0Pi0" )
326 numchan.push_back( 1 );
327 numchan.push_back( 2 );
328 numchan.push_back( 3 );
329 numchan.push_back( 3 );
330 numchan.push_back( 3 );
331 decaylist = kaonList.
minus() * pionList.
plus() * pi0List * pi0List * pi0List;
334 else if ( channel ==
"D0toKPiPi0Eta" )
337 numchan.push_back( 1 );
338 numchan.push_back( 2 );
339 numchan.push_back( 3 );
340 numchan.push_back( 4 );
341 decaylist = kaonList.
minus() * pionList.
plus() * pi0List * etaList;
344 else if ( channel ==
"D0toKPiEPPiPiEta" )
347 numchan.push_back( 1 );
348 numchan.push_back( 2 );
349 numchan.push_back( 6 );
351 epList = pionList.
plus() * pionList.
minus() * etaList;
352 decaylist = kaonList.
minus() * pionList.
plus() * epList;
355 else if ( channel ==
"D0toKPiEPRhoGam" )
358 numchan.push_back( 1 );
359 numchan.push_back( 2 );
360 numchan.push_back( 7 );
362 rhoList = pionList.
plus() * pionList.
minus();
364 epList = rhoList * photonList;
365 decaylist = kaonList.
minus() * pionList.
plus() * epList;
368 else if ( channel ==
"D0toKKKPi" )
371 numchan.push_back( 1 );
372 numchan.push_back( 1 );
373 numchan.push_back( 1 );
374 numchan.push_back( 2 );
378 else if ( channel ==
"D0toKsKPi" )
381 numchan.push_back( 5 );
382 numchan.push_back( 1 );
383 numchan.push_back( 2 );
384 decaylist = ksList * kaonList.
minus() * pionList.
plus();
386 else if ( channel ==
"D0toKsKPiPi0" )
389 numchan.push_back( 5 );
390 numchan.push_back( 1 );
391 numchan.push_back( 2 );
392 numchan.push_back( 3 );
393 decaylist = ksList * kaonList.
minus() * pionList.
plus() * pi0List;
395 else if ( channel ==
"D0toKsPiPi" )
398 numchan.push_back( 5 );
399 numchan.push_back( 2 );
400 numchan.push_back( 2 );
401 decaylist = ksList * pionList.
plus() * pionList.
minus();
403 else if ( channel ==
"D0toKsPiPiPi0" )
406 numchan.push_back( 5 );
407 numchan.push_back( 2 );
408 numchan.push_back( 2 );
409 numchan.push_back( 3 );
410 decaylist = ksList * pionList.
plus() * pionList.
minus() * pi0List;
412 else if ( channel ==
"D0toKsPi0" )
415 numchan.push_back( 5 );
416 numchan.push_back( 3 );
417 decaylist = ksList * pi0List;
419 else if ( channel ==
"D0toPiPiPi0" )
422 numchan.push_back( 2 );
423 numchan.push_back( 2 );
424 numchan.push_back( 3 );
425 decaylist = pionList.
plus() * pionList.
minus() * pi0List;
427 else if ( channel ==
"D0toPiPi" )
430 numchan.push_back( 2 );
431 numchan.push_back( 2 );
432 decaylist = pionList.
plus() * pionList.
minus();
434 else if ( channel ==
"D0toKK" )
437 numchan.push_back( 1 );
438 numchan.push_back( 1 );
439 decaylist = kaonList.
minus() * kaonList.
plus();
441 else if ( channel ==
"D0toKKPi0" )
444 numchan.push_back( 1 );
445 numchan.push_back( 1 );
446 numchan.push_back( 3 );
447 decaylist = kaonList.
minus() * kaonList.
plus() * pi0List;
449 else if ( channel ==
"D0toPi0Pi0" )
452 numchan.push_back( 3 );
453 numchan.push_back( 3 );
454 decaylist = pi0List * pi0List;
456 else if ( channel ==
"D0toKsKs" )
459 numchan.push_back( 5 );
460 numchan.push_back( 5 );
461 decaylist = ksList * ksList;
463 else if ( channel ==
"D0toKsKsPi0" )
466 numchan.push_back( 5 );
467 numchan.push_back( 5 );
468 numchan.push_back( 3 );
469 decaylist = ksList * ksList * pi0List;
471 else if ( channel ==
"D0toKsPi0Pi0" )
474 numchan.push_back( 5 );
475 numchan.push_back( 3 );
476 numchan.push_back( 3 );
477 decaylist = ksList * pi0List * pi0List;
479 else if ( channel ==
"D0toKsKK" )
482 numchan.push_back( 5 );
483 numchan.push_back( 1 );
484 numchan.push_back( 1 );
485 decaylist = ksList * kaonList.
minus() * kaonList.
plus();
487 else if ( channel ==
"D0toKsEta" )
490 numchan.push_back( 5 );
491 numchan.push_back( 4 );
492 decaylist = ksList * etaList;
494 else if ( channel ==
"D0toPi0Pi0Pi0" )
497 numchan.push_back( 3 );
498 numchan.push_back( 3 );
499 numchan.push_back( 3 );
500 decaylist = pi0List * pi0List * pi0List;
502 else if ( channel ==
"D0toKsKsKs" )
505 numchan.push_back( 5 );
506 numchan.push_back( 5 );
507 numchan.push_back( 5 );
508 decaylist = ksList * ksList * ksList;
510 else if ( channel ==
"D0toPiPiPiPi" )
513 numchan.push_back( 2 );
514 numchan.push_back( 2 );
515 numchan.push_back( 2 );
516 numchan.push_back( 2 );
519 else if ( channel ==
"D0toPiPiPi0Pi0" )
522 numchan.push_back( 2 );
523 numchan.push_back( 2 );
524 numchan.push_back( 3 );
525 numchan.push_back( 3 );
526 decaylist = pionList.
plus() * pionList.
minus() * pi0List * pi0List;
528 else if ( channel ==
"D0toKKPiPi" )
531 numchan.push_back( 1 );
532 numchan.push_back( 1 );
533 numchan.push_back( 2 );
534 numchan.push_back( 2 );
537 else if ( channel ==
"D0toKKPi0Pi0" )
540 numchan.push_back( 1 );
541 numchan.push_back( 1 );
542 numchan.push_back( 3 );
543 numchan.push_back( 3 );
544 decaylist = kaonList.
minus() * kaonList.
plus() * pi0List * pi0List;
546 else if ( channel ==
"D0toKsKsPiPi" )
549 numchan.push_back( 5 );
550 numchan.push_back( 5 );
551 numchan.push_back( 2 );
552 numchan.push_back( 2 );
553 decaylist = ksList * ksList * pionList.
plus() * pionList.
minus();
555 else if ( channel ==
"D0toPiPiPiPiPi0" )
558 numchan.push_back( 2 );
559 numchan.push_back( 2 );
560 numchan.push_back( 2 );
561 numchan.push_back( 2 );
562 numchan.push_back( 3 );
566 else if ( channel ==
"D0toKsPiPiPiPi" )
569 numchan.push_back( 5 );
570 numchan.push_back( 2 );
571 numchan.push_back( 2 );
572 numchan.push_back( 2 );
573 numchan.push_back( 2 );
577 else if ( channel ==
"D0toKKPiPiPi0" )
580 numchan.push_back( 1 );
581 numchan.push_back( 1 );
582 numchan.push_back( 2 );
583 numchan.push_back( 2 );
584 numchan.push_back( 3 );
588 else if ( channel ==
"D0toKsPi0Eta" )
591 numchan.push_back( 5 );
592 numchan.push_back( 3 );
593 numchan.push_back( 4 );
594 decaylist = ksList * pi0List * etaList;
596 else if ( channel ==
"D0toKsEPPiPiEta" )
599 numchan.push_back( 5 );
600 numchan.push_back( 6 );
602 epList = pionList.
plus() * pionList.
minus() * etaList;
603 decaylist = ksList * epList;
605 else if ( channel ==
"D0toKsEPRhoGam" )
608 numchan.push_back( 5 );
609 numchan.push_back( 7 );
611 rhoList = pionList.
plus() * pionList.
minus();
613 epList = rhoList * photonList;
614 decaylist = ksList * epList;
616 else if ( channel ==
"D0toKsPi0Pi0Pi0" )
619 numchan.push_back( 5 );
620 numchan.push_back( 3 );
621 numchan.push_back( 3 );
622 numchan.push_back( 3 );
623 decaylist = ksList * pi0List * pi0List * pi0List;
625 else if ( channel ==
"D0toKsPiPiPi0Pi0" )
628 numchan.push_back( 5 );
629 numchan.push_back( 2 );
630 numchan.push_back( 2 );
631 numchan.push_back( 3 );
632 numchan.push_back( 3 );
633 decaylist = ksList * pionList.
plus() * pionList.
minus() * pi0List * pi0List;
635 else if ( channel ==
"D0toKsPiPiEta" )
638 numchan.push_back( 5 );
639 numchan.push_back( 2 );
640 numchan.push_back( 2 );
641 numchan.push_back( 4 );
642 decaylist = ksList * pionList.
plus() * pionList.
minus() * etaList;
644 else if ( channel ==
"D0toKsPi0EPPiPiEta" )
647 numchan.push_back( 5 );
648 numchan.push_back( 3 );
649 numchan.push_back( 6 );
651 epList = pionList.
plus() * pionList.
minus() * etaList;
652 decaylist = ksList * pi0List * epList;
654 else if ( channel ==
"D0toKsPi0EPRhoGam" )
657 numchan.push_back( 5 );
658 numchan.push_back( 3 );
659 numchan.push_back( 7 );
661 rhoList = pionList.
plus() * pionList.
minus();
663 epList = rhoList * photonList;
664 decaylist = ksList * pi0List * epList;
666 else if ( channel ==
"D0toPiPiEta" )
669 numchan.push_back( 2 );
670 numchan.push_back( 2 );
671 numchan.push_back( 4 );
672 decaylist = pionList.
plus() * pionList.
minus() * etaList;
674 else if ( channel ==
"D0toPiPiPi0Eta" )
677 numchan.push_back( 2 );
678 numchan.push_back( 2 );
679 numchan.push_back( 3 );
680 numchan.push_back( 4 );
681 decaylist = pionList.
plus() * pionList.
minus() * pi0List * etaList;
683 else if ( channel ==
"D0toPiPiEPPiPiEta" )
686 numchan.push_back( 2 );
687 numchan.push_back( 2 );
688 numchan.push_back( 6 );
690 epList = pionList.
plus() * pionList.
minus() * etaList;
691 decaylist = pionList.
plus() * pionList.
minus() * epList;
693 else if ( channel ==
"D0toPiPiEPRhoGam" )
696 numchan.push_back( 2 );
697 numchan.push_back( 2 );
698 numchan.push_back( 7 );
700 rhoList = pionList.
plus() * pionList.
minus();
702 epList = rhoList * photonList;
703 decaylist = pionList.
plus() * pionList.
minus() * epList;
705 else if ( channel ==
"D0toKKEta" )
708 numchan.push_back( 1 );
709 numchan.push_back( 1 );
710 numchan.push_back( 4 );
711 decaylist = kaonList.
minus() * kaonList.
plus() * etaList;
723 vector<int> trackid, showerid;
724 vector<int> kaonid, pionid;
726 int numofchildren = numchan.size() - 1;
728 for (
int i = 0; i < numofchildren; i++ )
731 const CDCandidate& daughter = ( *it ).particle().child( i );
732 if ( isFlavorMode && i == 0 ) charm = -daughter.
charge();
734 if ( numchan[i + 1] == 1 )
737 trackid.push_back( track->
trackId() );
738 kaonid.push_back( track->
trackId() );
740 else if ( numchan[i + 1] == 2 )
743 trackid.push_back( track->
trackId() );
744 pionid.push_back( track->
trackId() );
746 else if ( numchan[i + 1] == 3 )
750 showerid.push_back( hiEnGamma->
trackId() );
751 showerid.push_back( loEnGamma->
trackId() );
753 else if ( numchan[i + 1] == 4 )
757 showerid.push_back( hiEnGamma->
trackId() );
758 showerid.push_back( loEnGamma->
trackId() );
760 else if ( numchan[i + 1] == 5 )
764 recDTag->
addToFitInfo( aKsCand->
mass(), fitinfo[aKsCand][0], fitinfo[aKsCand][1],
765 fitinfo[aKsCand][2] );
769 trackid.push_back( pion1Trk->
trackId() );
770 trackid.push_back( pion2Trk->
trackId() );
772 else if ( numchan[i + 1] == 6 )
782 trackid.push_back( apiontrk->
trackId() );
783 trackid.push_back( spiontrk->
trackId() );
784 showerid.push_back( hiEnGamma->
trackId() );
785 showerid.push_back( loEnGamma->
trackId() );
787 else if ( numchan[i + 1] == 7 )
798 trackid.push_back( apiontrk->
trackId() );
799 trackid.push_back( spiontrk->
trackId() );
800 showerid.push_back( gammatrk->
trackId() );
813 savetrack( trackid, showerid, charged_begin, charged_end, neutral_begin, neutral_end,
815 pidtag( kaonid, pionid, kaonList_tight, pionList_tight, recDTag );
817 if ( m_usevertexfit )
819 if ( m_debug ) cout <<
"beforevfit:" << endl;
821 HepLorentzVector p4change_vfit;
824 { p4change_vfit = util.
vfitref( channel, kaonid, pionid, xorigin, charged_begin ); }
825 else { p4change_vfit = util.
vfit( channel, kaonid, pionid, xorigin, charged_begin ); }
827 recDTag->
setp4( recDTag->
p4() + p4change_vfit );
836 recDTagCol->push_back( recDTag );
844 return StatusCode::SUCCESS;