101 {
102 MsgStream log(
msgSvc(), name() );
103 log << MSG::INFO << "in execute()" << endmsg;
104
105 StatusCode sc;
106
107
108
109
110 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
111 int event = eventHeader->eventNumber();
112
113
114
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;
121
124
127
128 SmartDataPtr<EvtRecPi0Col> recPi0Col( eventSvc(), "/Event/EvtRec/EvtRecPi0Col" );
129 if ( !recPi0Col )
130 {
131 log << MSG::FATAL << "Could not find EvtRecPi0Col" << endmsg;
132 return StatusCode::FAILURE;
133 }
134
135 SmartDataPtr<EvtRecEtaToGGCol> recEtaToGGCol( eventSvc(), "/Event/EvtRec/EvtRecEtaToGGCol" );
136 if ( !recEtaToGGCol )
137 {
138 log << MSG::FATAL << "Could not find EvtRecEtaToGGCol" << endmsg;
139 return StatusCode::FAILURE;
140 }
141
142 SmartDataPtr<EvtRecVeeVertexCol> recVeeVertexCol( eventSvc(),
143 "/Event/EvtRec/EvtRecVeeVertexCol" );
144 if ( !recVeeVertexCol )
145 {
146 log << MSG::FATAL << "Could not find EvtRecVeeVertexCol" << endmsg;
147 return StatusCode::FAILURE;
148 }
149
151 if ( !recDTagCol )
152 {
153 log << MSG::FATAL << "EvtRecDTagCol is not registered yet" << endmsg;
154 return StatusCode::FAILURE;
155 }
156
157
158 Hep3Vector xorigin( 0, 0, 0 );
159 IVertexDbSvc* vtxsvc;
160 sc = serviceLocator()->service( "VertexDbSvc", vtxsvc );
162 {
163
164
166 xorigin.setX( vertex[0] );
167 xorigin.setY( vertex[1] );
168 xorigin.setZ( vertex[2] );
169 }
170 utility util;
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 m_pionSelector->setpidtype( 0 );
188 m_kaonSelector->setpidtype( 0 );
191 CDPhotonList photonList( neutral_begin, neutral_end, *m_photonSelector );
192
194 dc_fill( ksList, recVeeVertexCol->begin(), recVeeVertexCol->end() );
195
196
197 map<EvtRecVeeVertex*, vector<double>> fitinfo;
198 for (
CDKsList::iterator ksit = ksList.particle_begin(); ksit != ksList.particle_end();
199 ++ksit )
200 {
201 EvtRecVeeVertex* ks = const_cast<EvtRecVeeVertex*>( ( *ksit ).particle().navKshort() );
202
205 }
206
208 dc_fill( pi0List, recPi0Col->begin(), recPi0Col->end() );
209
211 dc_fill( etaList, recEtaToGGCol->begin(), recEtaToGGCol->end() );
212
213
214 m_pionSelector->setpidtype( 1 );
215 m_kaonSelector->setpidtype( 1 );
218
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();
227
228
229
230
231
232 if ( m_ReadBeamEFromDB && m_irun != run )
233 {
234 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();
238
239 }
240 double ebeam = m_beamE;
241
242
243
244
245
246 for ( int list = 0; list < chanlist.size(); list++ )
247 {
248
249 string channel = chanlist[list];
250 vector<int> numchan;
251 m_dsSelector->setebeam(
ebeam );
252 m_dsSelector->setbeta( m_beta );
254
255
256
257
258
259
260
261
262
263
264 if ( channel == "DstoKsK" )
265 {
267 numchan.push_back( 5 );
268 numchan.push_back( 1 );
269 decaylist = ksList * kaonList.plus();
270 }
271 else if ( channel == "DstoKKPi" )
272 {
274 numchan.push_back( 1 );
275 numchan.push_back( 1 );
276 numchan.push_back( 2 );
277 decaylist = kaonList.minus() * kaonList.plus() * pionList.plus();
278 }
279 else if ( channel == "DstoKsKPi0" )
280 {
282 numchan.push_back( 5 );
283 numchan.push_back( 1 );
284 numchan.push_back( 3 );
285 decaylist = ksList * kaonList.plus() * pi0List;
286 }
287 else if ( channel == "DstoKsKsPi" )
288 {
290 numchan.push_back( 5 );
291 numchan.push_back( 5 );
292 numchan.push_back( 2 );
293 decaylist = ksList * ksList * pionList.plus();
294 }
295 else if ( channel == "DstoKKPiPi0" )
296 {
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;
303 }
304 else if ( channel == "DstoKsKplusPiPi" )
305 {
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();
312 }
313 else if ( channel == "DstoKsKminusPiPi" )
314 {
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();
321 }
322 else if ( channel == "DstoKKPiPiPi" )
323 {
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() *
331 pionList.minus();
332 }
333 else if ( channel == "DstoPiPi0" )
334 {
336 numchan.push_back( 2 );
337 numchan.push_back( 3 );
338 decaylist = pionList.plus() * pi0List;
339 }
340 else if ( channel == "DstoPiPiPi" )
341 {
343 numchan.push_back( 2 );
344 numchan.push_back( 2 );
345 numchan.push_back( 2 );
346 decaylist = pionList.plus() * pionList.plus() * pionList.minus();
347 }
348 else if ( channel == "DstoPiPiPiPi0" )
349 {
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;
356 }
357 else if ( channel == "DstoPiPiPiPiPi" )
358 {
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() *
366 pionList.minus();
367 }
368 else if ( channel == "DstoPiPiPiPiPiPi0" )
369 {
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;
379 }
380 else if ( channel == "DstoPiPiPiPi0Pi0" )
381 {
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;
389 }
390 else if ( channel == "DstoPiEta" )
391 {
393 numchan.push_back( 2 );
394 numchan.push_back( 4 );
395 decaylist = pionList.plus() * etaList;
396 }
397 else if ( channel == "DstoPiEtaPiPiPi0" )
398 {
400 numchan.push_back( 2 );
401 numchan.push_back( 9 );
403 EtaList = pionList.plus() * pionList.minus() * pi0List;
404 decaylist = pionList.plus() * EtaList;
405 }
406 else if ( channel == "DstoPiPi0Eta" )
407 {
409 numchan.push_back( 2 );
410 numchan.push_back( 3 );
411 numchan.push_back( 4 );
412 decaylist = pionList.plus() * pi0List * etaList;
413 }
414 else if ( channel == "DstoPiPi0EtaPiPiPi0" )
415 {
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;
423 }
424 else if ( channel == "DstoPiPiPiEta" )
425 {
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;
432 }
433 else if ( channel == "DstoPiPiPiEtaPiPiPi0" )
434 {
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;
443 }
444 else if ( channel == "DstoPiEPPiPiEta" )
445 {
447 numchan.push_back( 2 );
448 numchan.push_back( 6 );
450 epList = pionList.plus() * pionList.minus() * etaList;
451 decaylist = pionList.plus() * epList;
452 }
453 else if ( channel == "DstoPiPi0EPPiPiEta" )
454 {
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;
462 }
463 else if ( channel == "DstoPiEPPiPiEtaPiPiPi0" )
464 {
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;
473 }
474 else if ( channel == "DstoPiPi0EPPiPiEtaPiPiPi0" )
475 {
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;
485 }
486
487 else if ( channel == "DstoPiEPRhoGam" )
488 {
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;
497 }
498 else if ( channel == "DstoPiPi0EPRhoGam" )
499 {
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;
509 }
510 else if ( channel == "DstoKsPi" )
511 {
513 numchan.push_back( 5 );
514 numchan.push_back( 2 );
515 decaylist = ksList * pionList.plus();
516 }
517 else if ( channel == "DstoKsPiPi0" )
518 {
520 numchan.push_back( 5 );
521 numchan.push_back( 2 );
522 numchan.push_back( 3 );
523 decaylist = ksList * pionList.plus() * pi0List;
524 }
525 else if ( channel == "DstoKPiPi" )
526 {
528 numchan.push_back( 1 );
529 numchan.push_back( 2 );
530 numchan.push_back( 2 );
531 decaylist = kaonList.plus() * pionList.plus() * pionList.minus();
532 }
533 else if ( channel == "DstoKPiPiPi0" )
534 {
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;
541 }
542 else if ( channel == "DstoKKK" )
543 {
545 numchan.push_back( 1 );
546 numchan.push_back( 1 );
547 numchan.push_back( 1 );
548 decaylist = kaonList.minus() * kaonList.plus() * kaonList.plus();
549 }
550
553
555 {
556
557 EvtRecDTag* recDTag = new EvtRecDTag;
559
560 vector<int> trackid, showerid;
561 vector<int> kaonid, pionid;
562 int numofchildren = numchan.size() - 1;
563
564 for ( int i = 0; i < numofchildren; i++ )
565 {
566
567 const CDCandidate& daughter = ( *it ).particle().child( i );
568
569 if ( numchan[i + 1] == 1 )
570 {
571 const EvtRecTrack* track = daughter.
track();
572 trackid.push_back( track->
trackId() );
573 kaonid.push_back( track->
trackId() );
574 }
575 else if ( numchan[i + 1] == 2 )
576 {
577 const EvtRecTrack* track = daughter.
track();
578 trackid.push_back( track->
trackId() );
579 pionid.push_back( track->
trackId() );
580 }
581 else if ( numchan[i + 1] == 3 )
582 {
585 showerid.push_back( hiEnGamma->
trackId() );
586 showerid.push_back( loEnGamma->
trackId() );
587 }
588 else if ( numchan[i + 1] == 4 )
589 {
592 showerid.push_back( hiEnGamma->
trackId() );
593 showerid.push_back( loEnGamma->
trackId() );
594 }
595 else if ( numchan[i + 1] == 5 )
596 {
597 EvtRecVeeVertex* aKsCand =
const_cast<EvtRecVeeVertex*
>( daughter.
navKshort() );
598
599
600 recDTag->
addToFitInfo( aKsCand->
mass(), fitinfo[aKsCand][0], fitinfo[aKsCand][1],
601 fitinfo[aKsCand][2] );
602
603 EvtRecTrack* pion1Trk = aKsCand->daughter( 0 );
604 EvtRecTrack* pion2Trk = aKsCand->daughter( 1 );
605 trackid.push_back( pion1Trk->
trackId() );
606 trackid.push_back( pion2Trk->
trackId() );
607 }
608 else if ( numchan[i + 1] == 6 )
609 {
610 const CDCandidate& apion = daughter.
decay().
child( 0 );
611 const CDCandidate& spion = daughter.
decay().
child( 1 );
612 const CDCandidate& eta = daughter.
decay().
child( 2 );
613 const EvtRecTrack* apiontrk = apion.
track();
614 const EvtRecTrack* spiontrk = spion.
track();
617
618 trackid.push_back( apiontrk->
trackId() );
619 trackid.push_back( spiontrk->
trackId() );
620 showerid.push_back( hiEnGamma->
trackId() );
621 showerid.push_back( loEnGamma->
trackId() );
622 }
623 else if ( numchan[i + 1] == 7 )
624 {
625 const CDCandidate& rho = daughter.
decay().
child( 0 );
626 const CDCandidate& apion = rho.
decay().
child( 0 );
627 const CDCandidate& spion = rho.
decay().
child( 1 );
628 const CDCandidate& gamma = daughter.
decay().
child( 1 );
629
630 const EvtRecTrack* apiontrk = apion.
track();
631 const EvtRecTrack* spiontrk = spion.
track();
632 const EvtRecTrack* gammatrk = gamma.
photon();
633
634 trackid.push_back( apiontrk->
trackId() );
635 trackid.push_back( spiontrk->
trackId() );
636 showerid.push_back( gammatrk->
trackId() );
637 }
638 else if ( numchan[i + 1] == 8 )
639 {
640 const CDCandidate& apion = daughter.
decay().
child( 0 );
641 const CDCandidate& spion = daughter.
decay().
child( 1 );
642 const CDCandidate& eta = daughter.
decay().
child( 2 );
643 const CDCandidate& e0pion = eta.
decay().
child( 0 );
644 const CDCandidate& e1pion = eta.
decay().
child( 1 );
645 const CDCandidate& pi0 = eta.
decay().
child( 2 );
646
647 const EvtRecTrack* apiontrk = apion.
track();
648 const EvtRecTrack* spiontrk = spion.
track();
649 const EvtRecTrack* e0piontrk = e0pion.
track();
650 const EvtRecTrack* e1piontrk = e1pion.
track();
651
654
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() );
661 }
662 else if ( numchan[i + 1] == 9 )
663 {
664 const CDCandidate& apion = daughter.
decay().
child( 0 );
665 const CDCandidate& spion = daughter.
decay().
child( 1 );
666 const CDCandidate& pi0 = daughter.
decay().
child( 2 );
667 const EvtRecTrack* apiontrk = apion.
track();
668 const EvtRecTrack* spiontrk = spion.
track();
671
672 trackid.push_back( apiontrk->
trackId() );
673 trackid.push_back( spiontrk->
trackId() );
674 showerid.push_back( hiEnGamma->
trackId() );
675 showerid.push_back( loEnGamma->
trackId() );
676 }
677
678 }
679
681 if ( m_useBFC )
682 {
683
684
685 updateKsInfo( it,
ebeam, numofchildren, recDTag, numchan, vtxsvc, m_useVFrefine );
686 }
687 savetrack( trackid, showerid, charged_begin, charged_end, neutral_begin, neutral_end,
688 recDTag );
689 pidtag( kaonid, pionid, kaonList_tight, pionList_tight, recDTag );
690
691 if ( m_usevertexfit )
692 {
693 if ( m_debug ) cout << "beforevfit:" << endl;
694
695 HepLorentzVector p4change_vfit;
696
697 if ( m_useVFrefine )
698 { p4change_vfit = util.
vfitref( channel, kaonid, pionid, xorigin, charged_begin ); }
699 else { p4change_vfit = util.
vfit( channel, kaonid, pionid, xorigin, charged_begin ); }
700
701 recDTag->
setp4( recDTag->
p4() + p4change_vfit );
702 }
703
704 trackid.clear();
705 showerid.clear();
706 kaonid.clear();
707 pionid.clear();
708
709
710 recDTagCol->push_back( recDTag );
711
712 }
713
714 numchan.clear();
715
716 }
717
718 return StatusCode::SUCCESS;
719}
DCFillableChargedList< CDChargedKaon > CDChargedKaonList
DCFillableChargedList< CDChargedPion > CDChargedPionList
DCDecayList< CDDecay, CDDecay::CandidateClass > CDDecayList
DCFillableNeutralList< CDEta > CDEtaList
DCFillableNeutralList< CDKs > CDKsList
DCFillableNeutralList< CDPhoton > CDPhotonList
DCFillableNeutralList< CDPi0 > CDPi0List
void dc_fill(DCFillableChargedList< Charged > &aFillableList, WitnessIterator first, WitnessIterator last)
EvtRecTrackCol::iterator EvtRecTrackIterator
virtual const DecayEvidence & decay() const
virtual const EvtRecTrack * photon() const
virtual const EvtRecTrack * track() const
virtual const EvtRecVeeVertex * navKshort() const
virtual const EvtRecPi0 * navPi0() const
virtual const EvtRecEtaToGG * navEta() const
const CDCandidate & child(unsigned int aPosition) const
void updateKsInfo(CDDecayList::iterator, double, int, EvtRecDTag *, vector< int >, IVertexDbSvc *, bool)
void savetrack(vector< int >, vector< int >, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecDTag *)
void pidtag(vector< int >, vector< int >, CDChargedKaonList &, CDChargedPionList &, EvtRecDTag *)
void saveDsInfo(CDDecayList::iterator, double, int, EvtRecDTag *)
@ kDstoPiPi0EPPiPiEtaPiPiPi0
@ kDstoPiEPPiPiEtaPiPiPi0
void setdecayMode(DecayMode decayMode)
HepLorentzVector p4() const
void setp4(HepLorentzVector p4)
void addToFitInfo(double ksmass, double chi2, double length, double error)
const EvtRecTrack * hiEnGamma() const
const EvtRecTrack * loEnGamma() const
const EvtRecTrack * loEnGamma() const
const EvtRecTrack * hiEnGamma() const
virtual bool isVertexValid()=0
virtual double * PrimaryVertex()=0
dchain::MuteWholeCandidateItr< CandidateClass > iterator
HepLorentzVector vfitref(string channel, vector< int > kaonid, vector< int > pionid, HepPoint3D vx, EvtRecTrackIterator charged_begin)
vector< double > SecondaryVFitref(EvtRecVeeVertex *ks, IVertexDbSvc *vtxsvc)
HepLorentzVector vfit(string channel, vector< int > kaonid, vector< int > pionid, HepPoint3D vx, EvtRecTrackIterator charged_begin)
vector< double > SecondaryVFit(EvtRecVeeVertex *ks, IVertexDbSvc *vtxsvc)
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecDTagCol
_EXTERN_ std::string EvtRecTrackCol