00096 {
00097 MsgStream log(msgSvc(), name());
00098 log << MSG::INFO << "in execute()" << endreq;
00099
00100 StatusCode sc;
00101
00103
00105 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00106 int event= eventHeader->eventNumber();
00107
00108
00109
00110 SmartDataPtr<EvtRecEvent> recEvent(eventSvc(), EventModel::EvtRec::EvtRecEvent);
00111 SmartDataPtr<EvtRecTrackCol> recTrackCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
00112 log << MSG::DEBUG << "run and event = " << eventHeader->runNumber()
00113 << " " << eventHeader->eventNumber() << endreq;
00114 log << MSG::DEBUG <<"ncharg, nneu, tottks = "
00115 << recEvent->totalCharged() << " , "
00116 << recEvent->totalNeutral() << " , "
00117 << recEvent->totalTracks() <<endreq;
00118
00119 EvtRecTrackIterator charged_begin = recTrackCol->begin();
00120 EvtRecTrackIterator charged_end = charged_begin + recEvent->totalCharged();
00121
00122 EvtRecTrackIterator neutral_begin = recTrackCol->begin()+recEvent->totalCharged();
00123 EvtRecTrackIterator neutral_end = recTrackCol->begin()+recEvent->totalTracks();
00124
00125
00126 SmartDataPtr<EvtRecPi0Col> recPi0Col(eventSvc(), "/Event/EvtRec/EvtRecPi0Col");
00127 if ( ! recPi0Col ) {
00128 log << MSG::FATAL << "Could not find EvtRecPi0Col" << endreq;
00129 return StatusCode::FAILURE;
00130 }
00131
00132
00133
00134 SmartDataPtr<EvtRecEtaToGGCol> recEtaToGGCol(eventSvc(), "/Event/EvtRec/EvtRecEtaToGGCol");
00135 if ( ! recEtaToGGCol ) {
00136 log << MSG::FATAL << "Could not find EvtRecEtaToGGCol" << endreq;
00137 return StatusCode::FAILURE;
00138 }
00139
00140
00141 SmartDataPtr<EvtRecVeeVertexCol> recVeeVertexCol(eventSvc(), "/Event/EvtRec/EvtRecVeeVertexCol");
00142 if ( ! recVeeVertexCol ) {
00143 log << MSG::FATAL << "Could not find EvtRecVeeVertexCol" << endreq;
00144 return StatusCode::FAILURE;
00145 }
00146
00147
00148 SmartDataPtr<EvtRecDTagCol> recDTagCol(eventSvc(), EventModel::EvtRec::EvtRecDTagCol);
00149 if (!recDTagCol) {
00150 log << MSG::FATAL << "EvtRecDTagCol is not registered in TDS" << endreq;
00151 return StatusCode::FAILURE;
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00166
00168
00169 pionSelector.setpidtype(0);
00170 kaonSelector.setpidtype(0);
00171 CDChargedPionList pionList(charged_begin, charged_end, pionSelector);
00172 CDChargedKaonList kaonList(charged_begin, charged_end, kaonSelector);
00173 CDPhotonList photonList(neutral_begin, neutral_end, photonSelector);
00174 CDKsList ksList(ksSelector);
00175 dc_fill(ksList, recVeeVertexCol->begin(), recVeeVertexCol->end());
00176
00177 CDPi0List pi0List(pi0Selector);
00178 dc_fill(pi0List, recPi0Col->begin(), recPi0Col->end());
00179
00180 CDEtaList etaList(etatoGGSelector);
00181 dc_fill(etaList, recEtaToGGCol->begin(), recEtaToGGCol->end());
00182
00183
00184
00185 pionSelector.setpidtype(1);
00186 kaonSelector.setpidtype(1);
00187 CDChargedPionList pionList_tight(charged_begin, charged_end, pionSelector);
00188 CDChargedKaonList kaonList_tight(charged_begin, charged_end, kaonSelector);
00189
00190 int run = eventHeader->runNumber();
00191 m_ievt = eventHeader->eventNumber();
00192 m_nChrg = recEvent->totalCharged();
00193 m_nNeu = recEvent->totalNeutral();
00194 m_nPion = pionList.size();
00195 m_nKaon = kaonList.size();
00196 m_nPi0 = pi0List.size();
00197 m_nKs = ksList.size();
00198
00200
00202
00203
00204 if(m_ReadBeamEFromDB && run>0 && m_irun!=run){
00205 m_irun=run;
00206 m_beamE=m_readDb.getbeamE(m_irun, m_beamE);
00207 }
00208 double ebeam=m_beamE;
00209
00211
00213
00214 bool isFlavorMode=false;
00215
00216 for(int list=0;list<chanlist.size();list++){
00217
00218 string channel=chanlist[list];
00219 vector<int> numchan;
00220 neutralDSelector.setebeam(ebeam);
00221 CDDecayList decaylist(neutralDSelector);
00222
00223
00224
00225
00226
00227
00228
00229 if(channel=="D0toKPi") {
00230 numchan.push_back( EvtRecDTag::kD0toKPi );
00231 numchan.push_back(1);
00232 numchan.push_back(2);
00233 decaylist=kaonList.minus() * pionList.plus();
00234 isFlavorMode=true;
00235 }
00236 else if(channel=="D0toKPiPi0"){
00237 numchan.push_back( EvtRecDTag::kD0toKPiPi0);
00238 numchan.push_back(1);
00239 numchan.push_back(2);
00240 numchan.push_back(3);
00241 decaylist=kaonList.minus() * pionList.plus() * pi0List;
00242 isFlavorMode=true;
00243 }
00244 else if(channel=="D0toKPiPi0Pi0"){
00245 numchan.push_back( EvtRecDTag::kD0toKPiPi0Pi0);
00246 numchan.push_back(1);
00247 numchan.push_back(2);
00248 numchan.push_back(3);
00249 numchan.push_back(3);
00250 decaylist=kaonList.minus() * pionList.plus() * pi0List * pi0List;
00251 isFlavorMode=true;
00252 }
00253 else if(channel=="D0toKPiPiPi"){
00254 numchan.push_back( EvtRecDTag::kD0toKPiPiPi);
00255 numchan.push_back(1);
00256 numchan.push_back(2);
00257 numchan.push_back(2);
00258 numchan.push_back(2);
00259 decaylist=kaonList.minus()* pionList.plus()* pionList.plus() * pionList.minus();
00260 isFlavorMode=true;
00261 }
00262 else if(channel=="D0toKPiPiPiPi0"){
00263 numchan.push_back( EvtRecDTag::kD0toKPiPiPiPi0);
00264 numchan.push_back(1);
00265 numchan.push_back(2);
00266 numchan.push_back(2);
00267 numchan.push_back(2);
00268 numchan.push_back(3);
00269 decaylist=kaonList.minus()* pionList.plus()* pionList.plus()* pionList.minus()* pi0List;
00270 isFlavorMode=true;
00271 }
00272 else if(channel=="D0toKPiEta"){
00273 numchan.push_back( EvtRecDTag::kD0toKPiEta);
00274 numchan.push_back(1);
00275 numchan.push_back(2);
00276 numchan.push_back(4);
00277 decaylist=kaonList.minus() * pionList.plus() * etaList;
00278 isFlavorMode=true;
00279 }
00280 else if(channel=="D0toKsKPi"){
00281 numchan.push_back( EvtRecDTag::kD0toKsKPi);
00282 numchan.push_back(5);
00283 numchan.push_back(1);
00284 numchan.push_back(2);
00285 decaylist=ksList* kaonList.minus()* pionList.plus();
00286 }
00287 else if(channel=="D0toKsKPiPi0"){
00288 numchan.push_back( EvtRecDTag::kD0toKsKPiPi0);
00289 numchan.push_back(5);
00290 numchan.push_back(1);
00291 numchan.push_back(2);
00292 numchan.push_back(3);
00293 decaylist=ksList* kaonList.minus() * pionList.plus()* pi0List;
00294 }
00295 else if(channel=="D0toKsPiPi"){
00296 numchan.push_back( EvtRecDTag::kD0toKsPiPi);
00297 numchan.push_back(5);
00298 numchan.push_back(2);
00299 numchan.push_back(2);
00300 decaylist=ksList* pionList.plus()* pionList.minus();
00301 }
00302 else if(channel=="D0toKsPiPiPi0"){
00303 numchan.push_back( EvtRecDTag::kD0toKsPiPiPi0);
00304 numchan.push_back(5);
00305 numchan.push_back(2);
00306 numchan.push_back(2);
00307 numchan.push_back(3);
00308 decaylist=ksList* pionList.plus()* pionList.minus()* pi0List;
00309 }
00310 else if(channel=="D0toKsPi0"){
00311 numchan.push_back( EvtRecDTag::kD0toKsPi0);
00312 numchan.push_back(5);
00313 numchan.push_back(3);
00314 decaylist=ksList* pi0List;
00315 }
00316 else if(channel=="D0toPiPiPi0"){
00317 numchan.push_back( EvtRecDTag::kD0toPiPiPi0);
00318 numchan.push_back(2);
00319 numchan.push_back(2);
00320 numchan.push_back(3);
00321 decaylist=pionList.plus()* pionList.minus()* pi0List;
00322 }
00323 else if(channel=="D0toPiPi"){
00324 numchan.push_back( EvtRecDTag::kD0toPiPi);
00325 numchan.push_back(2);
00326 numchan.push_back(2);
00327 decaylist=pionList.plus()* pionList.minus();
00328 }
00329 else if(channel=="D0toKK"){
00330 numchan.push_back( EvtRecDTag::kD0toKK);
00331 numchan.push_back(1);
00332 numchan.push_back(1);
00333 decaylist=kaonList.minus()* kaonList.plus();
00334 }
00335 else if(channel=="D0toKKPi0"){
00336 numchan.push_back( EvtRecDTag::kD0toKKPi0);
00337 numchan.push_back(1);
00338 numchan.push_back(1);
00339 numchan.push_back(3);
00340 decaylist=kaonList.minus()* kaonList.plus()* pi0List;
00341 }
00342 else if(channel=="D0toPi0Pi0"){
00343 numchan.push_back( EvtRecDTag::kD0toPi0Pi0);
00344 numchan.push_back(3);
00345 numchan.push_back(3);
00346 decaylist=pi0List* pi0List;
00347 }
00348 else if(channel=="D0toKsKs"){
00349 numchan.push_back( EvtRecDTag::kD0toKsKs);
00350 numchan.push_back(5);
00351 numchan.push_back(5);
00352 decaylist=ksList* ksList;
00353 }
00354 else if(channel=="D0toKsKsPi0"){
00355 numchan.push_back( EvtRecDTag::kD0toKsKsPi0);
00356 numchan.push_back(5);
00357 numchan.push_back(5);
00358 numchan.push_back(3);
00359 decaylist=ksList* ksList* pi0List;
00360 }
00361 else if(channel=="D0toKsPi0Pi0"){
00362 numchan.push_back( EvtRecDTag::kD0toKsPi0Pi0);
00363 numchan.push_back(5);
00364 numchan.push_back(3);
00365 numchan.push_back(3);
00366 decaylist=ksList* pi0List* pi0List;
00367 }
00368 else if(channel=="D0toKsKK"){
00369 numchan.push_back( EvtRecDTag::kD0toKsKK);
00370 numchan.push_back(5);
00371 numchan.push_back(1);
00372 numchan.push_back(1);
00373 decaylist=ksList* kaonList.minus()* kaonList.plus();
00374 }
00375 else if(channel=="D0toKsEta"){
00376 numchan.push_back( EvtRecDTag::kD0toKsEta);
00377 numchan.push_back(5);
00378 numchan.push_back(4);
00379 decaylist=ksList* etaList;
00380 }
00381 else if(channel=="D0toPi0Pi0Pi0"){
00382 numchan.push_back( EvtRecDTag::kD0toPi0Pi0Pi0);
00383 numchan.push_back(3);
00384 numchan.push_back(3);
00385 numchan.push_back(3);
00386 decaylist=pi0List* pi0List* pi0List;
00387 }
00388 else if(channel=="D0toKsKsKs"){
00389 numchan.push_back( EvtRecDTag::kD0toKsKsKs);
00390 numchan.push_back(5);
00391 numchan.push_back(5);
00392 numchan.push_back(5);
00393 decaylist=ksList* ksList* ksList;
00394 }
00395 else if(channel=="D0toPiPiPiPi"){
00396 numchan.push_back( EvtRecDTag::kD0toPiPiPiPi);
00397 numchan.push_back(2);
00398 numchan.push_back(2);
00399 numchan.push_back(2);
00400 numchan.push_back(2);
00401 decaylist=pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus();
00402 }
00403 else if(channel=="D0toPiPiPi0Pi0"){
00404 numchan.push_back( EvtRecDTag::kD0toPiPiPi0Pi0);
00405 numchan.push_back(2);
00406 numchan.push_back(2);
00407 numchan.push_back(3);
00408 numchan.push_back(3);
00409 decaylist=pionList.plus()* pionList.minus()* pi0List* pi0List;
00410 }
00411 else if(channel=="D0toKKPiPi"){
00412 numchan.push_back( EvtRecDTag::kD0toKKPiPi);
00413 numchan.push_back(1);
00414 numchan.push_back(1);
00415 numchan.push_back(2);
00416 numchan.push_back(2);
00417 decaylist=kaonList.minus()* kaonList.plus()* pionList.plus()* pionList.minus();
00418 }
00419 else if(channel=="D0toKKPi0Pi0"){
00420 numchan.push_back( EvtRecDTag::kD0toKKPi0Pi0);
00421 numchan.push_back(1);
00422 numchan.push_back(1);
00423 numchan.push_back(3);
00424 numchan.push_back(3);
00425 decaylist=kaonList.minus()* kaonList.plus()* pi0List* pi0List;
00426 }
00427 else if(channel=="D0toKsKsPiPi"){
00428 numchan.push_back( EvtRecDTag::kD0toKsKsPiPi);
00429 numchan.push_back(5);
00430 numchan.push_back(5);
00431 numchan.push_back(2);
00432 numchan.push_back(2);
00433 decaylist=ksList* ksList* pionList.plus()* pionList.minus();
00434 }
00435 else if(channel=="D0toPiPiPiPiPi0"){
00436 numchan.push_back( EvtRecDTag::kD0toPiPiPiPiPi0);
00437 numchan.push_back(2);
00438 numchan.push_back(2);
00439 numchan.push_back(2);
00440 numchan.push_back(2);
00441 numchan.push_back(3);
00442 decaylist=pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus()* pi0List;
00443 }
00444 else if(channel=="D0toKsPiPiPiPi"){
00445 numchan.push_back( EvtRecDTag::kD0toKsPiPiPiPi);
00446 numchan.push_back(5);
00447 numchan.push_back(2);
00448 numchan.push_back(2);
00449 numchan.push_back(2);
00450 numchan.push_back(2);
00451 decaylist=ksList* pionList.plus()* pionList.plus()* pionList.minus()* pionList.minus();
00452 }
00453 else if(channel=="D0toKKPiPiPi0"){
00454 numchan.push_back( EvtRecDTag::kD0toKKPiPiPi0);
00455 numchan.push_back(1);
00456 numchan.push_back(1);
00457 numchan.push_back(2);
00458 numchan.push_back(2);
00459 numchan.push_back(3);
00460 decaylist=kaonList.minus()* kaonList.plus()* pionList.plus()* pionList.minus()* pi0List;
00461 }
00462 else if(channel=="D0toKsPi0Eta"){
00463 numchan.push_back( EvtRecDTag::kD0toKsPi0Eta);
00464 numchan.push_back(5);
00465 numchan.push_back(3);
00466 numchan.push_back(4);
00467 decaylist=ksList* pi0List* etaList;
00468 }
00469 else if(channel=="D0toKsEPPiPiEta"){
00470 numchan.push_back( EvtRecDTag::kD0toKsEPPiPiEta);
00471 numchan.push_back(5);
00472 numchan.push_back(6);
00473 CDDecayList epList(eptoPiPiEtaSelector);
00474 epList=pionList.plus()* pionList.minus()* etaList;
00475 decaylist= ksList* epList;
00476 }
00477 else if(channel=="D0toKsEPRhoGam"){
00478 numchan.push_back( EvtRecDTag::kD0toKsEPRhoGam);
00479 numchan.push_back(5);
00480 numchan.push_back(7);
00481 CDDecayList rhoList(rhotoPiPiSelector);
00482 rhoList=pionList.plus()* pionList.minus();
00483 CDDecayList epList(eptoRhoGamSelector);
00484 epList=rhoList* photonList;
00485 decaylist= ksList* epList;
00486 }
00487
00488
00489 CDDecayList::iterator D_begin =decaylist.particle_begin();
00490 CDDecayList::iterator D_end =decaylist.particle_end();
00491
00492 for ( CDDecayList::iterator it = D_begin; it != D_end; it++ ) {
00493
00494 EvtRecDTag* recDTag = new EvtRecDTag;
00495 recDTag->setdecayMode( (EvtRecDTag::DecayMode)numchan[0] );
00496
00497
00498 vector<int> trackid, showerid;
00499 vector<int> kaonid, pionid;
00500 int charm=0;
00501 int numofchildren=numchan.size()-1;
00502
00503 for(int i=0; i< numofchildren;i++){
00504
00505 const CDCandidate& daughter=(*it).particle().child(i);
00506 if(isFlavorMode && i==0)
00507 charm=-daughter.charge();
00508
00509 if(numchan[i+1]==1){
00510 const EvtRecTrack* track=daughter.track();
00511 trackid.push_back(track->trackId());
00512 kaonid.push_back(track->trackId());
00513 }
00514 else if(numchan[i+1]==2){
00515 const EvtRecTrack* track=daughter.track();
00516 trackid.push_back(track->trackId());
00517 pionid.push_back(track->trackId());
00518 }
00519 else if ( numchan[i+1]==3){
00520 const EvtRecTrack* hiEnGamma=daughter.navPi0()->hiEnGamma();
00521 const EvtRecTrack* loEnGamma=daughter.navPi0()->loEnGamma();
00522 showerid.push_back(hiEnGamma->trackId());
00523 showerid.push_back(loEnGamma->trackId());
00524 }
00525 else if ( numchan[i+1]==4){
00526 const EvtRecTrack* hiEnGamma=daughter.navEta()->hiEnGamma();
00527 const EvtRecTrack* loEnGamma=daughter.navEta()->loEnGamma();
00528 showerid.push_back(hiEnGamma->trackId());
00529 showerid.push_back(loEnGamma->trackId());
00530 }
00531 else if ( numchan[i+1]==5){
00532 EvtRecVeeVertex* aKsCand = const_cast<EvtRecVeeVertex*>( daughter.navKshort() );
00533 EvtRecTrack* pion1Trk = aKsCand->daughter(0);
00534 EvtRecTrack* pion2Trk = aKsCand->daughter(1);
00535 trackid.push_back(pion1Trk->trackId());
00536 trackid.push_back(pion2Trk->trackId());
00537 }
00538 else if (numchan[i+1]==6){
00539 const CDCandidate& apion = daughter.decay().child(0);
00540 const CDCandidate& spion = daughter.decay().child(1);
00541 const CDCandidate& eta = daughter.decay().child(2);
00542 const EvtRecTrack* apiontrk = apion.track();
00543 const EvtRecTrack* spiontrk = spion.track();
00544 const EvtRecTrack* hiEnGamma=eta.navEta()->hiEnGamma();
00545 const EvtRecTrack* loEnGamma=eta.navEta()->loEnGamma();
00546
00547 trackid.push_back(apiontrk->trackId());
00548 trackid.push_back(spiontrk->trackId());
00549 showerid.push_back(hiEnGamma->trackId());
00550 showerid.push_back(loEnGamma->trackId());
00551
00552 }
00553 else if (numchan[i+1]==7){
00554 const CDCandidate& rho = daughter.decay().child(0);
00555 const CDCandidate& gamma = daughter.decay().child(1);
00556 const CDCandidate& apion = rho.decay().child(0);
00557 const CDCandidate& spion = rho.decay().child(1);
00558
00559
00560 const EvtRecTrack* apiontrk = apion.track();
00561 const EvtRecTrack* spiontrk = spion.track();
00562 const EvtRecTrack* gammatrk = gamma.photon();
00563
00564
00565 trackid.push_back(apiontrk->trackId());
00566 trackid.push_back(spiontrk->trackId());
00567 showerid.push_back(gammatrk->trackId());
00568
00569 }
00570
00571
00572 }
00573
00574
00575 saveD0Info(it, ebeam, charm, numofchildren, recDTag);
00576 savetrack(trackid,showerid,charged_begin,charged_end,neutral_begin,neutral_end,recDTag);
00577 pidtag(kaonid,pionid,kaonList_tight, pionList_tight,recDTag);
00578
00579
00580 trackid.clear();
00581 showerid.clear();
00582 kaonid.clear();
00583 pionid.clear();
00584
00585
00586
00587 recDTagCol->push_back(recDTag);
00588
00589 }
00590
00591 numchan.clear();
00592
00593 }
00594
00595
00596 return StatusCode::SUCCESS;
00597 }