209 {
210 info() << "In execute" << endmsg;
211
212 bool isBarrelBhabha = false;
213 bool isEndcapBhabha = false;
214 bool isBarrelDimu = false;
215 bool isEndcapDimu = false;
216 bool isHadron = false;
217 bool isBarrelDiphoton = false;
218 bool isEndcapDiphoton = false;
219
220 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
221 if ( !eventHeader )
222 {
223 error() <<
"Could not retrieve event header" << endmsg;
224 return StatusCode::FAILURE;
225 }
226
227 int run = eventHeader->runNumber();
228 int event = eventHeader->eventNumber();
229 m_events++;
230
232 if ( !evtRecEvent )
233 {
234 error() <<
"Could not retrieve EvtRecEvent" << endmsg;
235 return StatusCode::FAILURE;
236 }
237
238 debug() << "ncharg, nneu, tottks = " << evtRecEvent->totalCharged() << " , "
239 << evtRecEvent->totalNeutral() << " , " << evtRecEvent->totalTracks() << endmsg;
240
242 if ( !evtRecTrkCol )
243 {
244 error() <<
"Could not retrieve EvtRecTrackCol" << endmsg;
245 return StatusCode::FAILURE;
246 }
247
248 if ( evtRecEvent->totalTracks() != evtRecTrkCol->size() ) return StatusCode::SUCCESS;
249
250
251 std::vector<EvtRecTrack*> goodTracks;
252
253 int nCharge = 0;
254 for ( int i = 0; i < evtRecEvent->totalCharged(); i++ )
255 {
256 EvtRecTrack* recTrk = ( *evtRecTrkCol )[i];
258
259 RecMdcTrack* mdcTrk = recTrk->
mdcTrack();
260 double vx0 = mdcTrk->
x();
261 double vy0 = mdcTrk->
y();
262 double vz0 = mdcTrk->
z();
263 double vr0 = mdcTrk->
r();
264 double theta0 = mdcTrk->
theta();
265 double p0 = mdcTrk->
p();
266 double pt0 = mdcTrk->
pxy();
267
268 if ( m_output )
269 {
270 m_vx0 = vx0;
271 m_vy0 = vy0;
272 m_vz0 = vz0;
273 m_vr0 = vr0;
274 m_theta0 = theta0;
275 m_p0 = p0;
276 m_pt0 = pt0;
277 m_tuple1->write().ignore();
278 }
279
280 if ( fabs( vz0 ) >= m_vz0cut ) continue;
281 if ( vr0 >= m_vr0cut ) continue;
282 if ( pt0 >= m_pt0HighCut ) continue;
283 if ( pt0 <= m_pt0LowCut ) continue;
284
285 goodTracks.push_back( recTrk );
286 nCharge += mdcTrk->
charge();
287 }
288 int nGood = goodTracks.size();
289
290
291 std::vector<EvtRecTrack*> goodGammas;
292 for ( int i = evtRecEvent->totalCharged(); i < evtRecEvent->totalTracks(); i++ )
293 {
294 EvtRecTrack* recTrk = ( *evtRecTrkCol )[i];
296
297 RecEmcShower* emcTrk = recTrk->
emcShower();
298 double eraw = emcTrk->
energy();
299 if ( m_output )
300 {
301 m_eraw = eraw;
302 m_tuple2->write().ignore();
303 }
304
305 if ( eraw < m_energyThreshold ) continue;
306 goodGammas.push_back( recTrk );
307 }
308 int nGam = goodGammas.size();
309
310
311 Vp4 ppip{ 0 }, ppim{ 0 };
312
313 double echarge = 0.;
314 double ptot = 0.;
316 double eemc = 0.;
317 double pp = 0.;
318 double pm = 0.;
319
320 for ( const auto& goodTrk : goodTracks )
321 {
322 if ( goodTrk->isMdcTrackValid() )
323 {
324
325
326
327
328
329
330
331 RecMdcTrack* mdcTrk = goodTrk->mdcTrack();
332
334
335 HepLorentzVector ptrk;
336 ptrk.setPx( mdcTrk->
px() );
337 ptrk.setPy( mdcTrk->
py() );
338 ptrk.setPz( mdcTrk->
pz() );
339 double p3 = ptrk.mag();
340 ptrk.setE( sqrt( p3 * p3 +
mpi *
mpi ) );
341 ptrk = ptrk.boost( -0.011, 0, 0 );
342
343 echarge += ptrk.e();
345
346 if ( mdcTrk->
charge() > 0 )
347 {
348 ppip.push_back( ptrk );
349 pp = ptrk.rho();
350 }
351 else
352 {
353 ppim.push_back( ptrk );
354 pm = ptrk.rho();
355 }
356 }
357
358 if ( goodTrk->isEmcShowerValid() )
359 {
360 RecEmcShower* emcTrk = goodTrk->emcShower();
361 double eraw = emcTrk->
energy();
362 double phi = emcTrk->
phi();
363 double the = emcTrk->
theta();
364
365 HepLorentzVector ptrk;
366 ptrk.setPx( eraw *
sin( the ) *
cos( phi ) );
367 ptrk.setPy( eraw *
sin( the ) *
sin( phi ) );
368 ptrk.setPz( eraw *
cos( the ) );
369 ptrk.setE( eraw );
370 ptrk = ptrk.boost( -0.011, 0, 0 );
371
372 eemc += ptrk.e();
374 }
375 }
376
377
379
380 double eneu = 0;
381 for ( const auto& goodGamTrk : goodGammas )
382 {
383 RecEmcShower* emcTrk = goodGamTrk->emcShower();
384 double eraw = emcTrk->
energy();
385 double phi = emcTrk->
phi();
386 double the = emcTrk->
theta();
387 HepLorentzVector ptrk;
388 ptrk.setPx( eraw *
sin( the ) *
cos( phi ) );
389 ptrk.setPy( eraw *
sin( the ) *
sin( phi ) );
390 ptrk.setPz( eraw *
cos( the ) );
391 ptrk.setE( eraw );
392 ptrk = ptrk.boost( -0.011, 0, 0 );
393 pGam.push_back( ptrk );
394 eneu += ptrk.e();
396 eemc += ptrk.e();
397 }
398
399 double esum = echarge + eneu;
400
401
402 double maxE = 0.;
403 double secE = 0.;
404 double maxThe = 999.;
405 double maxPhi = 999.;
406 double secThe = 999.;
407 double secPhi = 999.;
408 int npart = 999.;
409 double dphi = 999.;
410 double dthe = 999.;
411 int mdcHit1 = 0.;
412 int mdcHit2 = 0.;
413
414 SmartDataPtr<RecEmcShowerCol> aShowerCol( eventSvc(), "/Event/Recon/RecEmcShowerCol" );
415 if ( !aShowerCol )
416 {
417 warning() <<
"Could not find RecEmcShowerCol" << endmsg;
418 return StatusCode::SUCCESS;
419 }
420
421 int ishower = 0;
422 RecEmcShowerCol::iterator iShowerCol;
423 for ( iShowerCol = aShowerCol->begin(); iShowerCol != aShowerCol->end(); iShowerCol++ )
424 {
425
426 if ( ishower == 0 )
427 {
428 maxE = ( *iShowerCol )->e5x5();
429 maxThe = ( *iShowerCol )->theta();
430 maxPhi = ( *iShowerCol )->phi();
431 npart = ( *iShowerCol )->module();
432 }
433 else if ( ishower == 1 )
434 {
435 secE = ( *iShowerCol )->e5x5();
436 secThe = ( *iShowerCol )->theta();
437 secPhi = ( *iShowerCol )->phi();
438 }
439 else if ( ishower == 2 ) { break; }
440
441 ishower++;
442 }
443
444 if ( aShowerCol->size() >= 2 )
445 {
446 dphi = ( fabs( maxPhi - secPhi ) - CLHEP::pi ) * 180. / CLHEP::pi;
447 dthe = ( fabs( maxThe + secThe ) - CLHEP::pi ) * 180. / CLHEP::pi;
448
449 double phi1 = maxPhi < 0 ? maxPhi + CLHEP::twopi : maxPhi;
450 double phi2 = secPhi < 0 ? secPhi + CLHEP::twopi : secPhi;
451
452
455 double phi12 = ( phi11 + phi22 - CLHEP::pi ) * 0.5;
456 double phi21 = ( phi11 + phi22 + CLHEP::pi ) * 0.5;
457 if ( phi12 < 0. ) phi12 += CLHEP::twopi;
458 if ( phi21 > CLHEP::twopi ) phi21 -= CLHEP::twopi;
459
460 SmartDataPtr<MdcDigiCol> mdcDigiCol( evtSvc(), "/Event/Digi/MdcDigiCol" );
461 if ( !mdcDigiCol )
462 {
463 error() <<
"Could not find MdcDigiCol!" << endmsg;
464 return StatusCode::FAILURE;
465 }
466 int hitnum = mdcDigiCol->size();
467 for ( int i = 0; i < hitnum; i++ )
468 {
469 MdcDigi* digi = dynamic_cast<MdcDigi*>( mdcDigiCol->containedObject( i ) );
472
473 if (
time == 0x7FFFFFFF || charge == 0x7FFFFFFF )
continue;
474
478
479 if ( ilayer >= 43 )
error() <<
"MDC(" << ilayer <<
"," << iphi <<
")" << endmsg;
480
481 double phi = CLHEP::twopi * iphi / idmax[ilayer];
482
483 if ( WhetherSector( phi, phi11, phi12 ) ) mdcHit1++;
484 else if ( WhetherSector( phi, phi21, phi22 ) ) mdcHit2++;
485 }
486 }
487
488
489
490
491
492
493 if ( eemc > m_bhabhaEmcECut && maxE > m_bhabhaMaxECut && secE > m_bhabhaSecECut &&
494 abs( dthe ) < m_bhabhaDTheCut &&
495 ( ( dphi > m_bhabhaDPhiCut1 && dphi < m_bhabhaDPhiCut2 ) ||
496 ( dphi > m_bhabhaDPhiCut3 && dphi < m_bhabhaDPhiCut4 ) ) )
497 {
498 if ( npart == 1 && mdcHit1 > m_bhabhaMdcHitCutB && mdcHit2 > m_bhabhaMdcHitCutB )
499 {
500 isBarrelBhabha = true;
501 m_barrelBhabhaNumber++;
502 }
503 else if ( ( npart == 0 || npart == 2 ) && mdcHit1 > m_bhabhaMdcHitCutE &&
504 mdcHit2 > m_bhabhaMdcHitCutE )
505 {
506 isEndcapBhabha = true;
507 m_endcapBhabhaNumber++;
508 }
509 }
510
511
512 if ( m_selectDimu )
513 {
514 if ( m_dimuTool->IsDimu() == 1 )
515 {
516 isBarrelDimu = true;
517 m_barrelDimuNumber++;
518 }
519 else if ( m_dimuTool->IsDimu() == 2 )
520 {
521 isEndcapDimu = true;
522 m_endcapDimuNumber++;
523 }
524 }
525
526
527 if ( ( nGood >= 1 && esum > m_hadronChaECut ) || ( nGood == 0 && esum > m_hadronNeuECut ) )
528 {
529 isHadron = true;
530 m_hadronNumber++;
531 }
532
533
534 if ( nGood == 0 && eemc > m_diphotonEmcECut && secE > m_diphotonSecECut &&
535 fabs( dthe ) < m_diphotonDTheCut && dphi > m_diphotonDPhiCut1 &&
536 dphi < m_diphotonDPhiCut2 )
537 {
538 if ( npart == 1 )
539 {
540 isBarrelDiphoton = true;
541 m_barrelDiphotonNumber++;
542 }
543 else if ( npart == 0 || npart == 2 )
544 {
545 isEndcapDiphoton = true;
546 m_endcapDiphotonNumber++;
547 }
548 }
549
550
551 if ( m_selectBhabha && isBarrelBhabha )
552 m_preSelTools["SelectBarrelBhabha"]->write().ignore();
553 if ( m_selectBhabha && isEndcapBhabha )
554 m_preSelTools["SelectEndcapBhabha"]->write().ignore();
555
556 if ( m_selectDimu && isBarrelDimu ) m_preSelTools["SelectBarrelDimu"]->write().ignore();
557 if ( m_selectDimu && isEndcapDimu ) m_preSelTools["SelectEndcapDimu"]->write().ignore();
558
559 if ( m_selectHadron && isHadron ) m_preSelTools["SelectHadron"]->write().ignore();
560
561 if ( m_selectDiphoton && isBarrelDiphoton )
562 m_preSelTools["SelectBarrelDiphoton"]->write().ignore();
563 if ( m_selectDiphoton && isEndcapDiphoton )
564 m_preSelTools["SelectEndcapDiphoton"]->write().ignore();
565
566 if ( m_output )
567 {
568 m_runnb = run;
569 m_evtnb = event;
570 m_esum = esum;
571 m_eemc = eemc;
573 m_nCharge = nCharge;
574 m_nGood = nGood;
575 m_nGam = nGam;
576 m_ptot = ptot;
577 m_pp = pp;
578 m_pm = pm;
579 m_maxE = maxE;
580 m_secE = secE;
581 m_dThe = dthe;
582 m_dPhi = dphi;
583 m_mdcHit1 = mdcHit1;
584 m_mdcHit2 = mdcHit2;
585 m_tuple0->write().ignore();
586 }
587
588 return StatusCode::SUCCESS;
589}
std::vector< HepLorentzVector > Vp4
double sin(const BesAngle a)
double cos(const BesAngle a)
const double theta() const
RecEmcShower * emcShower()
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
virtual Identifier identify() const
unsigned int getChargeChannel() const
unsigned int getTimeChannel() const
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecTrackCol