106 {
107 MsgStream log(
msgSvc(), name() );
108 log << MSG::INFO << "in execute()" << endmsg;
109
110 StatusCode sc;
111
112
113
114
115 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
116 int event = eventHeader->eventNumber();
117
118
119
122 log << MSG::DEBUG << "run and event = " << eventHeader->runNumber() << " "
123 << eventHeader->eventNumber() << endmsg;
124 log << MSG::DEBUG << "ncharg, nneu, tottks = " << recEvent->totalCharged() << " , "
125 << recEvent->totalNeutral() << " , " << recEvent->totalTracks() << endmsg;
126
129
132
133 SmartDataPtr<EvtRecPi0Col> recPi0Col( eventSvc(), "/Event/EvtRec/EvtRecPi0Col" );
134 if ( !recPi0Col )
135 {
136 log << MSG::FATAL << "Could not find EvtRecPi0Col" << endmsg;
137 return StatusCode::FAILURE;
138 }
139
140 SmartDataPtr<EvtRecEtaToGGCol> recEtaToGGCol( eventSvc(), "/Event/EvtRec/EvtRecEtaToGGCol" );
141 if ( !recEtaToGGCol )
142 {
143 log << MSG::FATAL << "Could not find EvtRecEtaToGGCol" << endmsg;
144 return StatusCode::FAILURE;
145 }
146
147 SmartDataPtr<EvtRecVeeVertexCol> recVeeVertexCol( eventSvc(),
148 "/Event/EvtRec/EvtRecVeeVertexCol" );
149 if ( !recVeeVertexCol )
150 {
151 log << MSG::FATAL << "Could not find EvtRecVeeVertexCol" << endmsg;
152 return StatusCode::FAILURE;
153 }
154
156 if ( !recDTagCol )
157 {
158 log << MSG::FATAL << "EvtRecDTagCol is not registered yet" << endmsg;
159 return StatusCode::FAILURE;
160 }
161
162
163 Hep3Vector xorigin( 0, 0, 0 );
164
165 IVertexDbSvc* vtxsvc;
166 sc = serviceLocator()->service( "VertexDbSvc", vtxsvc );
168 {
169
170
172 xorigin.setX( vertex[0] );
173 xorigin.setY( vertex[1] );
174 xorigin.setZ( vertex[2] );
175 }
176
177 utility util;
178
179
180
181
182 m_pionSelector->setpidtype( 0 );
183 m_kaonSelector->setpidtype( 0 );
184 m_protonSelector->setpidtype( 0 );
185
188 CDProtonList protonList( charged_begin, charged_end, *m_protonSelector );
189 CDPhotonList photonList( neutral_begin, neutral_end, *m_photonSelector );
191
192 dc_fill( ksList, recVeeVertexCol->begin(), recVeeVertexCol->end() );
193
194
195 map<EvtRecVeeVertex*, vector<double>> fitinfo_Ks;
196 for (
CDKsList::iterator ksit = ksList.particle_begin(); ksit != ksList.particle_end();
197 ++ksit )
198 {
199 EvtRecVeeVertex* ks = const_cast<EvtRecVeeVertex*>( ( *ksit ).particle().navKshort() );
200 if ( m_useVFrefine ) { fitinfo_Ks[ks] = util.
SecondaryVFitref( ks, vtxsvc ); }
202 }
203
204
205
206 CDLambdaList lambdaList( recVeeVertexCol->begin(), recVeeVertexCol->end(),
207 *m_lambdaSelector );
208 map<EvtRecVeeVertex*, vector<double>> fitinfo_Lambda;
210 lambdait != lambdaList.particle_end(); ++lambdait )
211 {
212 EvtRecVeeVertex* lambda =
213 const_cast<EvtRecVeeVertex*>( ( *lambdait ).particle().navLambda() );
214 if ( m_useVFrefine )
215 {
216 fitinfo_Lambda[lambda] =
218 }
219 else
221 }
222
224 dc_fill( pi0List, recPi0Col->begin(), recPi0Col->end() );
225
227 dc_fill( etaList, recEtaToGGCol->begin(), recEtaToGGCol->end() );
228
229
230 m_pionSelector->setpidtype( 1 );
231 m_kaonSelector->setpidtype( 1 );
232 m_protonSelector->setpidtype( 1 );
235 CDProtonList protonList_tight( charged_begin, charged_end, *m_protonSelector );
236 int run = eventHeader->runNumber();
237 m_ievt = eventHeader->eventNumber();
238 m_nChrg = recEvent->totalCharged();
239 m_nNeu = recEvent->totalNeutral();
240 m_nPion = pionList.size();
241 m_nKaon = kaonList.size();
242 m_nProton = protonList.size();
243 m_nPi0 = pi0List.size();
244 m_nKs = ksList.size();
245 m_nLambda = lambdaList.size();
246
247
248
249
250
251 if ( m_ReadBeamEFromDB && m_irun != run )
252 {
253 m_irun = run;
254 if ( m_usecalibBeamE ) m_readDb.setcalib( true );
255 m_beamE = m_readDb.getbeamE( m_irun, m_beamE );
256 if ( run > 0 ) m_beta = m_readDb.getbeta();
257
258 }
259 double ebeam = m_beamE;
260
261
262
263
264
265 for ( int list = 0; list < chanlist.size(); list++ )
266 {
267
268 string channel = chanlist[list];
269 vector<int> numchan;
270 m_lambdaCSelector->setebeam(
ebeam );
271 m_lambdaCSelector->setbeta( m_beta );
273
274
275
276
277
278 if ( channel == "LambdacPtoKsP" )
279 {
281 numchan.push_back( 8 );
282 numchan.push_back( 5 );
283 decaylist = protonList.plus() * ksList;
284 }
285 else if ( channel == "LambdacPtoKPiP" )
286 {
288 numchan.push_back( 8 );
289 numchan.push_back( 1 );
290 numchan.push_back( 2 );
291 decaylist = protonList.plus() * kaonList.minus() * pionList.plus();
292 }
293 else if ( channel == "LambdacPtoKsPi0P" )
294 {
296 numchan.push_back( 8 );
297 numchan.push_back( 5 );
298 numchan.push_back( 3 );
299 decaylist = protonList.plus() * ksList * pi0List;
300 }
301 else if ( channel == "LambdacPtoKsPiPiP" )
302 {
304 numchan.push_back( 8 );
305 numchan.push_back( 5 );
306 numchan.push_back( 2 );
307 numchan.push_back( 2 );
308 decaylist = protonList.plus() * ksList * pionList.plus() * pionList.minus();
309 }
310 else if ( channel == "LambdacPtoKPiPi0P" )
311 {
313 numchan.push_back( 8 );
314 numchan.push_back( 1 );
315 numchan.push_back( 2 );
316 numchan.push_back( 3 );
317 decaylist = protonList.plus() * kaonList.minus() * pionList.plus() * pi0List;
318 }
319 else if ( channel == "LambdacPtoPiPiP" )
320 {
322 numchan.push_back( 8 );
323 numchan.push_back( 2 );
324 numchan.push_back( 2 );
325 decaylist = protonList.plus() * pionList.plus() * pionList.minus();
326 }
327 else if ( channel == "LambdacPtoLambdaPi" )
328 {
330 numchan.push_back( 9 );
331 numchan.push_back( 2 );
332 decaylist = lambdaList() * pionList.plus();
333 }
334 else if ( channel == "LambdacPtoLambdaPiPi0" )
335 {
337 numchan.push_back( 9 );
338 numchan.push_back( 2 );
339 numchan.push_back( 3 );
340 decaylist = lambdaList() * pionList.plus() * pi0List;
341 }
342 else if ( channel == "LambdacPtoLambdaPiEta" )
343 {
345 numchan.push_back( 9 );
346 numchan.push_back( 2 );
347 numchan.push_back( 4 );
348 decaylist = lambdaList() * pionList.plus() * etaList;
349 ;
350 }
351 else if ( channel == "LambdacPtoLambdaPiPiPi" )
352 {
354 numchan.push_back( 9 );
355 numchan.push_back( 2 );
356 numchan.push_back( 2 );
357 numchan.push_back( 2 );
358 decaylist = lambdaList() * pionList.plus() * pionList.minus() * pionList.plus();
359 }
360 else if ( channel == "LambdacPtoLambdaPiOmega" )
361 {
363 numchan.push_back( 9 );
364 numchan.push_back( 2 );
365 numchan.push_back( 12 );
367 omgList = pionList.plus() * pionList.minus() * pi0List;
368 decaylist = lambdaList() * pionList.plus() * omgList;
369 }
370 else if ( channel == "LambdacPtoPiSIGMA0LambdaGam" )
371 {
373 numchan.push_back( 2 );
374 numchan.push_back( 10 );
376 sgmList = lambdaList() * photonList;
377 decaylist = pionList.plus() * sgmList;
378 }
379 else if ( channel == "LambdacPtoPiPi0SIGMA0LambdaGam" )
380 {
382 numchan.push_back( 2 );
383 numchan.push_back( 3 );
384 numchan.push_back( 10 );
386 sgmList = lambdaList() * photonList;
387 decaylist = pionList.plus() * pi0List * sgmList;
388 }
389 else if ( channel == "LambdacPtoPi0SIGMAPi0P" )
390 {
392 numchan.push_back( 3 );
393 numchan.push_back( 11 );
395 sgmList = pi0List * protonList.plus();
396 decaylist = pi0List * sgmList;
397 }
398 else if ( channel == "LambdacPtoPiPiSIGMAPi0P" )
399 {
401 numchan.push_back( 2 );
402 numchan.push_back( 2 );
403 numchan.push_back( 11 );
405 sgmList = pi0List * protonList.plus();
406 decaylist = pionList.plus() * pionList.minus() * sgmList;
407 }
408 else if ( channel == "LambdacPtoOmegaSIGMAPi0P" )
409 {
411 numchan.push_back( 12 );
412 numchan.push_back( 11 );
414 omgList = pionList.plus() * pionList.minus() * pi0List;
416 sgmList = pi0List * protonList.plus();
417 decaylist = omgList * sgmList;
418 }
419 else if ( channel == "LambdacPtoPiPiPi0SIGMAPi0P" )
420 {
422 numchan.push_back( 2 );
423 numchan.push_back( 2 );
424 numchan.push_back( 3 );
425 numchan.push_back( 11 );
427 sgmList = pi0List * protonList.plus();
428 decaylist = pionList.plus() * pionList.minus() * pi0List * sgmList;
429 }
430
433
435 {
436
437 EvtRecDTag* recDTag = new EvtRecDTag;
439
440 vector<int> trackid, showerid;
441 vector<int> kaonid, pionid, protonid;
442 int numofchildren = numchan.size() - 1;
443
444 for ( int i = 0; i < numofchildren; i++ )
445 {
446
447 const CDCandidate& daughter = ( *it ).particle().child( i );
448
449 if ( numchan[i + 1] == 1 )
450 {
451 const EvtRecTrack* track = daughter.
track();
452 trackid.push_back( track->
trackId() );
453 kaonid.push_back( track->
trackId() );
454 }
455 else if ( numchan[i + 1] == 2 )
456 {
457 const EvtRecTrack* track = daughter.
track();
458 trackid.push_back( track->
trackId() );
459 pionid.push_back( track->
trackId() );
460 }
461 else if ( numchan[i + 1] == 8 )
462 {
463 const EvtRecTrack* track = daughter.
track();
464 trackid.push_back( track->
trackId() );
465 protonid.push_back( track->
trackId() );
466 }
467 else if ( numchan[i + 1] == 3 )
468 {
471 showerid.push_back( hiEnGamma->
trackId() );
472 showerid.push_back( loEnGamma->
trackId() );
473 }
474 else if ( numchan[i + 1] == 4 )
475 {
478 showerid.push_back( hiEnGamma->
trackId() );
479 showerid.push_back( loEnGamma->
trackId() );
480 }
481 else if ( numchan[i + 1] == 5 )
482 {
483 EvtRecVeeVertex* aKsCand =
const_cast<EvtRecVeeVertex*
>( daughter.
navKshort() );
485 fitinfo_Ks[aKsCand][1], fitinfo_Ks[aKsCand][2] );
486 EvtRecTrack* pion1Trk = aKsCand->daughter( 0 );
487 EvtRecTrack* pion2Trk = aKsCand->daughter( 1 );
488 trackid.push_back( pion1Trk->
trackId() );
489 trackid.push_back( pion2Trk->
trackId() );
490 }
491 else if ( numchan[i + 1] == 9 )
492 {
493 EvtRecVeeVertex* aLambdaCand =
const_cast<EvtRecVeeVertex*
>( daughter.
navLambda() );
495 fitinfo_Lambda[aLambdaCand][1],
496 fitinfo_Lambda[aLambdaCand][2] );
497
498 int index[2] = { 0, 1 };
499 if ( aLambdaCand->vertexId() < 0 )
500 {
501 index[0] = 1;
502 index[1] = 0;
503 }
504
505 EvtRecTrack* protonTrk = aLambdaCand->daughter( index[0] );
506 EvtRecTrack* pionTrk = aLambdaCand->daughter( index[1] );
507 trackid.push_back( protonTrk->
trackId() );
508 trackid.push_back( pionTrk->
trackId() );
509 }
510 else if ( numchan[i + 1] == 6 )
511 {
512 const CDCandidate& apion = daughter.
decay().
child( 0 );
513 const CDCandidate& spion = daughter.
decay().
child( 1 );
514 const CDCandidate& eta = daughter.
decay().
child( 2 );
515 const EvtRecTrack* apiontrk = apion.
track();
516 const EvtRecTrack* spiontrk = spion.
track();
519
520 trackid.push_back( apiontrk->
trackId() );
521 trackid.push_back( spiontrk->
trackId() );
522 showerid.push_back( hiEnGamma->
trackId() );
523 showerid.push_back( loEnGamma->
trackId() );
524 }
525 else if ( numchan[i + 1] == 7 )
526 {
527 const CDCandidate& rho = daughter.
decay().
child( 0 );
528 const CDCandidate& apion = rho.
decay().
child( 0 );
529 const CDCandidate& spion = rho.
decay().
child( 1 );
530 const CDCandidate& gamma = daughter.
decay().
child( 1 );
531
532 const EvtRecTrack* apiontrk = apion.
track();
533 const EvtRecTrack* spiontrk = spion.
track();
534 const EvtRecTrack* gammatrk = gamma.
photon();
535
536 trackid.push_back( apiontrk->
trackId() );
537 trackid.push_back( spiontrk->
trackId() );
538 showerid.push_back( gammatrk->
trackId() );
539 }
540 else if ( numchan[i + 1] == 10 )
541 {
542 const CDCandidate& gamma = daughter.
decay().
child( 1 );
543 const EvtRecTrack* gammatrk = gamma.
photon();
544 showerid.push_back( gammatrk->
trackId() );
545
546 EvtRecVeeVertex* aLambdaCand =
547 const_cast<EvtRecVeeVertex*
>( daughter.
decay().child( 0 ).navLambda() );
549 fitinfo_Lambda[aLambdaCand][1],
550 fitinfo_Lambda[aLambdaCand][2] );
551
552 int index[2] = { 0, 1 };
553 if ( aLambdaCand->vertexId() < 0 )
554 {
555 index[0] = 1;
556 index[1] = 0;
557 }
558
559 EvtRecTrack* protonTrk = aLambdaCand->daughter( index[0] );
560 EvtRecTrack* pionTrk = aLambdaCand->daughter( index[1] );
561 trackid.push_back( protonTrk->
trackId() );
562 trackid.push_back( pionTrk->
trackId() );
563 }
564 else if ( numchan[i + 1] == 11 )
565 {
566 const CDCandidate& pi0 = daughter.
decay().
child( 0 );
567 const CDCandidate& agam = pi0.
decay().
child( 0 );
568 const CDCandidate& sgam = pi0.
decay().
child( 1 );
569 const CDCandidate&
P = daughter.
decay().
child( 1 );
570
571 const EvtRecTrack* agamtrk = agam.
photon();
572 const EvtRecTrack* sgamtrk = sgam.
photon();
573 const EvtRecTrack* Ptrk =
P.track();
574
575 showerid.push_back( agamtrk->
trackId() );
576 showerid.push_back( sgamtrk->
trackId() );
577 trackid.push_back( Ptrk->
trackId() );
578 }
579 else if ( numchan[i + 1] == 12 )
580 {
581 const CDCandidate& apion = daughter.
decay().
child( 0 );
582 const CDCandidate& spion = daughter.
decay().
child( 1 );
583 const CDCandidate& pi0 = daughter.
decay().
child( 2 );
584 const EvtRecTrack* apiontrk = apion.
track();
585 const EvtRecTrack* spiontrk = spion.
track();
588
589 trackid.push_back( apiontrk->
trackId() );
590 trackid.push_back( spiontrk->
trackId() );
591 showerid.push_back( hiEnGamma->
trackId() );
592 showerid.push_back( loEnGamma->
trackId() );
593 }
594
595 }
596
598 if ( m_useBFC )
599 {
600
601
603 m_useVFrefine );
604 }
605 savetrack( trackid, showerid, charged_begin, charged_end, neutral_begin, neutral_end,
606 recDTag );
607 pidtag( kaonid, pionid, protonid, kaonList_tight, pionList_tight, protonList_tight,
608 recDTag );
609
610 if ( m_usevertexfit )
611 {
612 if ( m_debug ) cout << "beforevfit:" << endl;
613
614 HepLorentzVector p4change_vfit;
615
616 if ( m_useVFrefine )
617 { p4change_vfit = util.
vfitref( channel, kaonid, pionid, xorigin, charged_begin ); }
618 else { p4change_vfit = util.
vfit( channel, kaonid, pionid, xorigin, charged_begin ); }
619
620 recDTag->
setp4( recDTag->
p4() + p4change_vfit );
621 }
622
623 trackid.clear();
624 showerid.clear();
625 kaonid.clear();
626 pionid.clear();
627 protonid.clear();
628
629
630 recDTagCol->push_back( recDTag );
631
632 }
633
634 numchan.clear();
635
636 }
637
638 return StatusCode::SUCCESS;
639}
double P(RecMdcKalTrack *trk)
DCFillableChargedList< CDChargedKaon > CDChargedKaonList
DCFillableChargedList< CDChargedPion > CDChargedPionList
DCDecayList< CDDecay, CDDecay::CandidateClass > CDDecayList
DCFillableNeutralList< CDEta > CDEtaList
DCFillableNeutralList< CDKs > CDKsList
DCFillableNeutralNCList< CDLambda > CDLambdaList
DCFillableNeutralList< CDPhoton > CDPhotonList
DCFillableNeutralList< CDPi0 > CDPi0List
DCFillableChargedList< CDProton > CDProtonList
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 EvtRecVeeVertex * navLambda() 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
@ kLambdacPtoPiSIGMA0LambdaGam
@ kLambdacPtoPiPiSIGMAPi0P
@ kLambdacPtoLambdaPiOmega
@ kLambdacPtoLambdaPiPiPi
@ kLambdacPtoPiPi0SIGMA0LambdaGam
@ kLambdacPtoOmegaSIGMAPi0P
@ kLambdacPtoPiPiPi0SIGMAPi0P
@ kLambdacPtoPi0SIGMAPi0P
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
void savetrack(vector< int >, vector< int >, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecTrackIterator, EvtRecDTag *)
void updateKsLambdaInfo(CDDecayList::iterator, double, int, EvtRecDTag *, vector< int >, IVertexDbSvc *, bool)
void pidtag(vector< int >, vector< int >, vector< int >, CDChargedKaonList &, CDChargedPionList &, CDProtonList &, EvtRecDTag *)
void saveLcInfo(CDDecayList::iterator, double, int, EvtRecDTag *)
dchain::MuteWholeCandidateItr< CandidateClass > iterator
vector< double > SecondaryVFit_Lambda(EvtRecVeeVertex *lambda, IVertexDbSvc *vtxsvc, ILambdaSelector *lambdaSelector)
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_Lambdaref(EvtRecVeeVertex *lambda, IVertexDbSvc *vtxsvc, ILambdaSelector *lambdaSelector)
vector< double > SecondaryVFit(EvtRecVeeVertex *ks, IVertexDbSvc *vtxsvc)
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecDTagCol
_EXTERN_ std::string EvtRecTrackCol