226 std::cout <<
"WARNING: set emin to 0.1 GeV" << std::endl;
228 m_emin = m_emin * m_GeV;
229 m_emax = m_emax * m_GeV;
230 m_xlow = m_xlow * m_mm;
231 m_xhig = m_xhig * m_mm;
232 m_zlow = m_zlow * m_mm;
233 m_zhig = m_zhig * m_mm;
234 m_yval = m_yval * m_mm;
235 m_xpos = m_xpos * m_mm;
236 m_ypos = m_ypos * m_mm;
237 m_zpos = m_zpos * m_mm;
238 m_radius = m_radius * m_mm;
239 m_tcor = m_tcor + sqrt( ( m_xpos - m_xlow ) * ( m_xpos - m_xlow ) +
240 ( m_zpos - m_zlow ) * ( m_zpos - m_zlow ) +
241 ( m_ypos - m_yval ) * ( m_ypos - m_yval ) ) /
242 ( m_emin / sqrt( m_emin * m_emin +
mass *
mass * m_GeV * m_GeV ) );
244 m_xposMin_top *= m_mm;
245 m_xposMax_top *= m_mm;
247 m_zposMin_top *= m_mm;
248 m_zposMax_top *= m_mm;
249 m_xposMin_bottom *= m_mm;
250 m_xposMax_bottom *= m_mm;
251 m_ypos_bottom *= m_mm;
252 m_zposMin_bottom *= m_mm;
253 m_zposMax_bottom *= m_mm;
255 ISvcLocator* svcLocator = Gaudi::svcLocator();
257 StatusCode result = svcLocator->service(
"MessageSvc", p_msgSvc );
259 if ( !result.isSuccess() || p_msgSvc == 0 )
261 std::cerr <<
"VGenCommand(): could not initialize MessageSvc!" << std::endl;
262 throw GaudiException(
"Could not initalize MessageSvc",
"CosmicGenerator",
263 StatusCode::FAILURE );
266 MsgStream log( p_msgSvc,
"CosmicGenerator" );
270 NTuplePtr nt(
ntupleSvc(),
"FILE1/comp" );
271 if ( nt ) m_tuple = nt;
274 m_tuple =
ntupleSvc()->book(
"FILE1/comp", CLID_ColumnWiseTuple,
"ks N-Tuple example" );
277 status = m_tuple->addItem(
"cosmic_e", m_cosmicE );
278 status = m_tuple->addItem(
"cosmic_theta", m_cosmicTheta );
279 status = m_tuple->addItem(
"cosmic_phi", m_cosmicPhi );
280 status = m_tuple->addItem(
"cosmic_charge", m_cosmicCharge );
284 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple ) << endmsg;
285 return StatusCode::FAILURE;
288 NTuplePtr nt1(
ntupleSvc(),
"FILE1/compp" );
289 if ( nt1 ) m_tuple1 = nt1;
293 ntupleSvc()->book(
"FILE1/compp", CLID_ColumnWiseTuple,
"ks N-Tuple example" );
296 status = m_tuple1->addItem(
"mc_theta", mc_theta );
297 status = m_tuple1->addItem(
"mc_phi", mc_phi );
298 status = m_tuple1->addItem(
"mc_px", mc_px );
299 status = m_tuple1->addItem(
"mc_py", mc_py );
300 status = m_tuple1->addItem(
"mc_pz", mc_pz );
304 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple1 ) << endmsg;
305 return StatusCode::FAILURE;
309 if ( m_infile ==
"NONE" )
314 static const bool CREATEIFNOTTHERE(
true );
315 StatusCode RndmStatus =
316 svcLocator->service(
"BesRndmGenSvc",
p_BesRndmGenSvc, CREATEIFNOTTHERE );
320 log << MSG::ERROR <<
" Could not initialize Random Number Service" << endmsg;
331 log << MSG::INFO <<
"Initialisation cosmic gun done." << endmsg;
332 log << MSG::INFO <<
"Accepted diff flux after E and cos(theta) cuts = " << flux_withCT
333 <<
" /cm^2/s" << endmsg;
334 log << MSG::INFO <<
"Accepted total flux after E and cos(theta) cuts = "
335 << flux_withCT * ( m_xhig - m_xlow ) / m_mm * ( m_zhig - m_zlow ) / m_mm <<
" /s"
338 std::cout <<
"Accepted diff flux after E and cos(theta) cuts = " << flux_withCT
339 <<
" /cm^2/s" << std::endl;
340 std::cout <<
"Accepted total flux after E and cos(theta) cuts = "
341 << flux_withCT * ( m_xhig - m_xlow ) / m_mm * ( m_zhig - m_zlow ) / m_mm <<
" /s"
346 log << MSG::INFO <<
"Cosmics are read from file " << m_infile << endmsg;
347 m_ffile.open( m_infile.c_str() );
350 log << MSG::FATAL <<
"Could not open input file - stop! " << endmsg;
351 return StatusCode::FAILURE;
356 m_center = Hep3Vector( m_IPx, m_IPy, m_IPz );
357 log << MSG::INFO <<
"Initialisation done" << endmsg;
358 return StatusCode::SUCCESS;
389 MsgStream log(
msgSvc(), name() );
390 log << MSG::INFO <<
"CosmicGenerator executing" << endmsg;
394 log << MSG::DEBUG <<
"Event #" << m_events << endmsg;
399 m_polarization.clear();
404 if ( !m_ffile.eof() )
409 std::cout << evt << std::endl;
414 Polarization thePolarization;
415 thePolarization.set_normal3d(
HepNormal3D( polx, poly, polz ) );
416 m_polarization.push_back( thePolarization );
421 m_fourPos.push_back( evt.
Vertex() );
422 m_fourMom.push_back( evt.
Momentum() );
423 m_pdgCode.push_back( evt.
pdgID() );
427 log << MSG::FATAL <<
"End of file reached - stop " << endmsg;
429 return StatusCode::FAILURE;
436 bool accepted =
false;
437 bool projected =
false;
440 HepLorentzVector vert;
441 HepLorentzVector vert_proj;
446 Hep3Vector vert3( vert.x(), vert.y(), vert.z() );
451 m_cosmicE = pp.e() * m_GeV;
452 m_cosmicTheta = pp.theta();
453 m_cosmicPhi = pp.phi();
457 double theta1 = pp.theta();
458 double phi1 = pp.phi();
459 double mag1 = pp.vect().mag();
463 Hep3Vector direction( pp_corr.x(), pp_corr.y(), pp_corr.z() );
464 Hep3Vector center_dir = m_center - vert3;
473 beta = direction.angle( center_dir );
474 alpha = asin( m_radius / center_dir.mag() );
475 if ( fabs( beta ) >
alpha )
477 log << MSG::DEBUG <<
alpha <<
", " << beta <<
" rejected muon due to sphere cut! "
484 double l_fight0, l_fight1, l_fight2;
485 double coor_x0, coor_y0, coor_z0;
486 double coor_x1, coor_y1, coor_z1;
487 double coor_x2, coor_y2, coor_z2;
497 coor_x0 = direction.x() * ( coor_y0 - vert.y() ) / direction.y() + vert.x();
498 coor_z0 = direction.z() * ( coor_y0 - vert.y() ) / direction.y() + vert.z();
500 if ( fabs( coor_x0 ) <= m_xpos && fabs( coor_z0 ) <= m_zpos )
502 vert_pro0 =
HepPoint3D( coor_x0, coor_y0, coor_z0 );
503 l_fight0 = vert_org.distance( vert_pro0 );
509 coor_z1 = sign( coor_z0 - vert.z() ) * m_zpos;
510 coor_x1 = direction.x() * ( coor_z1 - vert.z() ) / direction.z() + vert.x();
511 coor_y1 = direction.y() * ( coor_z1 - vert.z() ) / direction.z() + vert.y();
513 vert_pro1 =
HepPoint3D( coor_x1, coor_y1, coor_z1 );
514 l_fight1 = vert_org.distance( vert_pro1 );
516 coor_x2 = sign( coor_x0 - vert.x() ) * m_xpos;
517 coor_z2 = direction.z() * ( coor_x2 - vert.x() ) / direction.x() + vert.z();
518 coor_y2 = direction.y() * ( coor_x2 - vert.x() ) / direction.x() + vert.y();
519 vert_pro2 =
HepPoint3D( coor_x2, coor_y2, coor_z2 );
520 l_fight2 = vert_org.distance( vert_pro2 );
521 if ( l_fight1 < l_fight2 ) isIn1 =
true;
528 HepLorentzVector( vert_pro0.x(), vert_pro0.y(), vert_pro0.z(), l_fight0 );
537 HepLorentzVector( vert_pro1.x(), vert_pro1.y(), vert_pro1.z(), l_fight1 );
546 HepLorentzVector( vert_pro2.x(), vert_pro2.y(), vert_pro2.z(), l_fight2 );
554 log << MSG::DEBUG <<
" rejected muon due to cube projection request! " << endmsg;
558 else if ( m_doublePlaneTrigger )
560 double coor_x0, coor_y0, coor_z0;
561 coor_y0 = m_ypos_top;
562 coor_x0 = direction.x() * ( coor_y0 - vert.y() ) / direction.y() + vert.x();
563 coor_z0 = direction.z() * ( coor_y0 - vert.y() ) / direction.y() + vert.z();
565 double coor_x1, coor_y1, coor_z1;
566 coor_y1 = m_ypos_bottom;
567 coor_x1 = direction.x() * ( coor_y1 - vert.y() ) / direction.y() + vert.x();
568 coor_z1 = direction.z() * ( coor_y1 - vert.y() ) / direction.y() + vert.z();
570 if ( coor_x0 > m_xposMin_top && coor_x0 < m_xposMax_top && coor_z0 > m_zposMin_top &&
571 coor_z0 < m_zposMax_top && coor_x1 > m_xposMin_bottom &&
572 coor_x1 < m_xposMax_bottom && coor_z1 > m_zposMin_bottom &&
573 coor_z1 < m_zposMax_bottom )
580 else accepted =
true;
595 m_pdgCode.push_back( charge * -13 );
609 Polarization thePolarization;
620 thePolarization.set_normal3d(
HepNormal3D( polx, poly, polz ) );
622 else thePolarization.set_normal3d(
HepNormal3D( polx, polz, -poly ) );
624 m_polarization.push_back( thePolarization );
629 double theta = pp.theta();
630 double phi = pp.phi();
638 log << MSG::ERROR <<
"Event #" << m_events <<
" E=" << e <<
", mass=" <<
mass
639 <<
" -- you have generated a tachyon! Increase energy or change particle ID."
641 return StatusCode::FAILURE;
644 double p = sqrt(
p2 );
645 double px = p *
sin( theta ) *
cos( phi );
646 double pz = p *
sin( theta ) *
sin( phi );
647 double py = -p *
cos( theta );
659 m_fourMom.push_back( HepLorentzVector( px, py, pz, pp.e() ) );
661 else m_fourMom.push_back( HepLorentzVector( px, pz, -py, pp.e() ) );
672 t = vert.t() - vert_proj.t() / HepLorentzVector( px, py, pz, pp.e() ).beta() + m_tcor;
684 if ( !m_swapYZAxis ) m_fourPos.push_back( HepLorentzVector( x, y, z,
t ) );
685 else m_fourPos.push_back( HepLorentzVector( x, z, y,
t ) );
687 log << MSG::DEBUG <<
" (x,y,z,t) = (" << m_fourPos.back().x() <<
","
688 << m_fourPos.back().y() <<
"," << m_fourPos.back().z() <<
"," << m_fourPos.back().t()
689 <<
"), (Px,Py,Pz,E) = (" << m_fourMom.back().px() <<
"," << m_fourMom.back().py()
690 <<
"," << m_fourMom.back().pz() <<
"," << m_fourMom.back().e() <<
")" << endmsg;
691 log << MSG::DEBUG <<
" (theta,phi) = (" << theta <<
"," << phi <<
"), "
692 <<
"polarization(x,y,z) = (" << m_polarization.back().normal3d().x() <<
","
693 << m_polarization.back().normal3d().y() <<
"," << m_polarization.back().normal3d().z()
701 mc_theta = m_fourMom.back().theta();
702 mc_phi = m_fourMom.back().phi();
703 mc_px = m_fourMom.back().px();
704 mc_py = m_fourMom.back().py();
705 mc_pz = m_fourMom.back().pz();
713 GenEvent*
event =
new GenEvent( 1, 1 );
715 if ( m_fourMom.size() == m_fourPos.size() && m_fourMom.size() == m_polarization.size() )
718 for ( std::size_t
v = 0;
v < m_fourMom.size(); ++
v )
726 GenParticle* particle =
new GenParticle( m_fourMom[
v], m_pdgCode[
v], 1 );
727 particle->set_polarization( m_polarization[
v] );
730 GenVertex* vertex =
new GenVertex( m_fourPos[
v] );
731 vertex->add_particle_out( particle );
734 event->add_vertex( vertex );
737 event->set_event_number( m_events );
742 log << MSG::ERROR <<
"Wrong different number of vertexes/momenta/polaritazions!" << endmsg;
743 return StatusCode::FAILURE;
746 SmartDataPtr<McGenEventCol> anMcCol( eventSvc(),
"/Event/Gen" );
751 log << MSG::INFO <<
"Add McGenEvent to existing collection" << endmsg;
753 anMcCol->push_back( mcEvent );
760 mcColl->push_back( mcEvent );
761 StatusCode sc = eventSvc()->registerObject(
"/Event/Gen", mcColl );
762 if ( sc != StatusCode::SUCCESS )
764 log << MSG::ERROR <<
"Could not register McGenEvent" << endmsg;
768 return StatusCode::FAILURE;
772 return StatusCode::SUCCESS;