73#include "CosmicGenerator/CosmicGenerator.h"
74#include "CosmicGenerator/CosmicGun.h"
75#include "CosmicGenerator/CosmicEventParser.h"
78#include "GaudiKernel/MsgStream.h"
82#include "CLHEP/Vector/TwoVector.h"
83#include "CLHEP/Vector/ThreeVector.h"
84#include "CLHEP/Geometry/Normal3D.h"
85#include "CLHEP/Geometry/Point3D.h"
89#include "CLHEP/Units/PhysicalConstants.h"
91#include "HepMC/GenEvent.h"
92#include "HepMC/GenVertex.h"
93#include "HepMC/GenParticle.h"
94#include "HepMC/Polarization.h"
96#include "GaudiKernel/Bootstrap.h"
97#include "GaudiKernel/ISvcLocator.h"
98#include "GaudiKernel/IMessageSvc.h"
99#include "GaudiKernel/GaudiException.h"
100#include "GaudiKernel/AlgFactory.h"
101#include "GaudiKernel/DataSvc.h"
102#include "GaudiKernel/SmartDataPtr.h"
103#include "GaudiKernel/MsgStream.h"
106#include "GaudiKernel/IDataProviderSvc.h"
107#include "GaudiKernel/PropertyMgr.h"
109#include "GaudiKernel/INTupleSvc.h"
110#include "GaudiKernel/NTuple.h"
111#include "GaudiKernel/Bootstrap.h"
112#include "GaudiKernel/IHistogramSvc.h"
114#include "GeneratorObject/McGenEvent.h"
121#include "BesKernel/IBesRndmGenSvc.h"
123#include "CLHEP/Random/Ranlux64Engine.h"
124#include "CLHEP/Random/RandFlat.h"
132using namespace CLHEP;
134static inline int sign(
double x) {
return (x>0 ? 1: -1);}
149 return RandFlat::shoot(engine);
154 ISvcLocator* pSvcLocator): Algorithm(name,pSvcLocator)
169 declareProperty(
"eventfile", m_infile =
"NONE" );
170 declareProperty(
"emin", m_emin =0.1 );
171 declareProperty(
"emax", m_emax =10. );
172 declareProperty(
"xvert_low", m_xlow =-110.7);
173 declareProperty(
"xvert_hig", m_xhig =110.7 );
174 declareProperty(
"zvert_low", m_zlow =-171.2);
175 declareProperty(
"zvert_hig", m_zhig = 171.2 );
176 declareProperty(
"yvert_val", m_yval = 0 );
177 declareProperty(
"tmin", m_tmin =0. );
178 declareProperty(
"tmax", m_tmax =24. );
179 declareProperty(
"tcor", m_tcor =0. );
180 declareProperty(
"IPx", m_IPx =0. );
181 declareProperty(
"IPy", m_IPy =0. );
182 declareProperty(
"IPz", m_IPz =0. );
183 declareProperty(
"Radius", m_radius =0. );
184 declareProperty(
"ExzCut", m_exzCut );
185 declareProperty(
"CubeProjection", m_cubeProj =
true );
186 declareProperty(
"OptimizeSphere", m_sphereOpt =
false );
189 declareProperty(
"SwapYZAxis", m_swapYZAxis =
false);
190 declareProperty(
"ctcut", m_ctcut =0.0 );
193 declareProperty(
"PrintEvent", m_printEvent=10);
194 declareProperty(
"PrintMod", m_printMod=100);
195 declareProperty(
"RMax", m_rmax = 10000000. );
196 declareProperty(
"ThetaMin", m_thetamin = 0.);
197 declareProperty(
"ThetaMax", m_thetamax = 1.);
198 declareProperty(
"PhiMin", m_phimin = -1*
PI);
199 declareProperty(
"PhiMax", m_phimax =
PI);
200 declareProperty(
"Xposition", m_xpos = 263.5-0.0001);
201 declareProperty(
"Yposition", m_ypos = 263.5-0.0001);
202 declareProperty(
"Zposition", m_zpos = 287.5-0.0001);
204 declareProperty(
"DumpMC", m_dumpMC = 0);
222 if(m_emin<0.1) {m_emin=0.1;std::cout<<
"WARNING: set emin to 0.1 GeV"<<std::endl;}
223 m_emin =m_emin *m_GeV;
224 m_emax =m_emax *m_GeV;
225 m_xlow =m_xlow *m_mm;
226 m_xhig =m_xhig *m_mm;
227 m_zlow =m_zlow *m_mm;
228 m_zhig =m_zhig *m_mm;
229 m_yval =m_yval *m_mm;
230 m_xpos =m_xpos *m_mm;
231 m_ypos =m_ypos *m_mm;
232 m_zpos =m_zpos *m_mm;
233 m_radius=m_radius*m_mm;
235 +sqrt((m_xpos-m_xlow)*(m_xpos-m_xlow)+(m_zpos-m_zlow)*(m_zpos-m_zlow)+(m_ypos-m_yval)*(m_ypos-m_yval))
236 /(m_emin/sqrt(m_emin*m_emin+
mass*
mass*m_GeV*m_GeV));
238 ISvcLocator* svcLocator = Gaudi::svcLocator();
240 StatusCode result = svcLocator->service(
"MessageSvc", p_msgSvc);
242 if ( !result.isSuccess() || p_msgSvc == 0 )
244 std::cerr <<
"VGenCommand(): could not initialize MessageSvc!" << std::endl;
245 throw GaudiException(
"Could not initalize MessageSvc",
"CosmicGenerator",StatusCode::FAILURE);
248 MsgStream log (p_msgSvc,
"CosmicGenerator");
254 m_tuple =
ntupleSvc()->book (
"FILE1/comp", CLID_ColumnWiseTuple,
"ks N-Tuple example");
256 status = m_tuple->addItem (
"cosmic_e", m_cosmicE);
257 status = m_tuple->addItem (
"cosmic_theta", m_cosmicTheta);
258 status = m_tuple->addItem (
"cosmic_phi", m_cosmicPhi);
259 status = m_tuple->addItem (
"cosmic_charge", m_cosmicCharge);
262 log << MSG::ERROR <<
" Cannot book N-tuple:" << long(m_tuple) << endmsg;
263 return StatusCode::FAILURE;
266 NTuplePtr nt1(
ntupleSvc(),
"FILE1/compp");
267 if(nt1) m_tuple1 = nt1;
269 m_tuple1 =
ntupleSvc()->book (
"FILE1/compp", CLID_ColumnWiseTuple,
"ks N-Tuple example");
271 status = m_tuple1->addItem (
"mc_theta", mc_theta);
272 status = m_tuple1->addItem (
"mc_phi", mc_phi);
273 status = m_tuple1->addItem (
"mc_px", mc_px);
274 status = m_tuple1->addItem (
"mc_py", mc_py);
275 status = m_tuple1->addItem (
"mc_pz", mc_pz);
278 log << MSG::ERROR <<
" Cannot book N-tuple:" << long(m_tuple1) << endmsg;
279 return StatusCode::FAILURE;
288 static const bool CREATEIFNOTTHERE(
true);
289 StatusCode RndmStatus = svcLocator->service(
"BesRndmGenSvc",
p_BesRndmGenSvc, CREATEIFNOTTHERE);
293 log << MSG::ERROR <<
" Could not initialize Random Number Service" << endreq;
304 log << MSG::INFO <<
"Initialisation cosmic gun done." << endreq;
305 log << MSG::INFO <<
"Accepted diff flux after E and cos(theta) cuts = " <<
306 flux_withCT <<
" /cm^2/s" << endreq;
307 log << MSG::INFO <<
"Accepted total flux after E and cos(theta) cuts = " <<
308 flux_withCT*(m_xhig-m_xlow)/m_mm*(m_zhig-m_zlow)/m_mm <<
" /s" << endreq;
310 std::cout<<
"Accepted diff flux after E and cos(theta) cuts = " <<
311 flux_withCT <<
" /cm^2/s" << std::endl;
312 std::cout <<
"Accepted total flux after E and cos(theta) cuts = " <<
313 flux_withCT*(m_xhig-m_xlow)/m_mm*(m_zhig-m_zlow)/m_mm <<
" /s" << std::endl;
318 log << MSG::INFO <<
"Cosmics are read from file " << m_infile << endreq;
319 m_ffile.open(m_infile.c_str());
322 log << MSG::FATAL <<
"Could not open input file - stop! " << endreq;
323 return StatusCode::FAILURE;
328 m_center=Hep3Vector(m_IPx, m_IPy, m_IPz);
329 log << MSG::INFO <<
"Initialisation done" << endreq;
330 return StatusCode::SUCCESS;
336 MsgStream log(messageService(), name());
344 float x_val = RandFlat::shoot(engine, m_xlow, m_xhig);
345 float z_val = RandFlat::shoot(engine, m_zlow, m_zhig);
350 t_val = RandFlat::shoot(engine, m_tmin, m_tmax);
352 else if(m_tmin == m_tmax){
355 else log << MSG::FATAL <<
" You specified m_tmin = " << m_tmin <<
" and m_tmax " << m_tmax << endreq;
356 HepLorentzVector p(x_val,m_yval,z_val, t_val*c_light);
365 MsgStream log(messageService(), name());
366 log << MSG::INFO <<
"CosmicGenerator executing" << endreq;
371 log << MSG::DEBUG <<
"Event #" << m_events << endreq;
377 m_polarization.clear();
388 std::cout << evt << std::endl;
393 Polarization thePolarization;
394 thePolarization.set_normal3d(
HepNormal3D(polx,poly,polz));
395 m_polarization.push_back(thePolarization);
400 m_fourPos.push_back(evt.
Vertex());
401 m_fourMom.push_back(evt.
Momentum());
402 m_pdgCode.push_back(evt.
pdgID());
407 log << MSG::FATAL <<
"End of file reached - stop " << endreq;
409 return StatusCode::FAILURE;
417 bool projected=
false;
420 HepLorentzVector vert;
421 HepLorentzVector vert_proj;
425 Hep3Vector vert3(vert.x(),vert.y(),vert.z());
429 m_cosmicE=pp.e()*m_GeV;
430 m_cosmicTheta=pp.theta();
431 m_cosmicPhi=pp.phi();
436 double phi1=pp.phi();
437 double mag1=pp.vect().mag();
442 Hep3Vector direction(pp_corr.x(),pp_corr.y(), pp_corr.z());
443 Hep3Vector center_dir=m_center-vert3;
451 beta=direction.angle(center_dir);
452 alpha=asin(m_radius/center_dir.mag());
453 if(fabs(beta)>
alpha){
454 log<<MSG::DEBUG<<
alpha<<
", "<<beta<<
" rejected muon due to sphere cut! "<<endreq;
460 double l_fight0,l_fight1, l_fight2;
461 double coor_x0, coor_y0, coor_z0;
462 double coor_x1, coor_y1, coor_z1;
463 double coor_x2, coor_y2, coor_z2;
473 coor_x0 = direction.x()*(coor_y0 - vert.y())/direction.y() +vert.x();
474 coor_z0 = direction.z()*(coor_y0 - vert.y())/direction.y() +vert.z();
478 if( fabs(coor_x0) <= m_xpos && fabs(coor_z0) <= m_zpos){
479 vert_pro0=
HepPoint3D (coor_x0, coor_y0, coor_z0);
480 l_fight0=vert_org.distance(vert_pro0);
485 coor_z1 = sign(coor_z0-vert.z())*m_zpos;
486 coor_x1 = direction.x()*(coor_z1 - vert.z())/direction.z() +vert.x();
487 coor_y1 = direction.y()*(coor_z1 - vert.z())/direction.z() +vert.y();
489 vert_pro1=
HepPoint3D (coor_x1, coor_y1, coor_z1);
490 l_fight1=vert_org.distance(vert_pro1);
493 coor_x2 = sign(coor_x0-vert.x())*m_xpos;
494 coor_z2 = direction.z()*(coor_x2 - vert.x())/direction.x() +vert.z();
495 coor_y2 = direction.y()*(coor_x2 - vert.x())/direction.x() +vert.y();
496 vert_pro2=
HepPoint3D (coor_x2, coor_y2, coor_z2);
497 l_fight2=vert_org.distance(vert_pro2);
498 if(l_fight1<l_fight2)
505 vert_proj=HepLorentzVector (vert_pro0.x(),vert_pro0.y(),vert_pro0.z() , l_fight0);
512 vert_proj=HepLorentzVector (vert_pro1.x(),vert_pro1.y(),vert_pro1.z() , l_fight1);
519 vert_proj=HepLorentzVector (vert_pro2.x(),vert_pro2.y(),vert_pro2.z() , l_fight2);
525 log<<MSG::DEBUG<<
" rejected muon due to cube projection request! "<<endreq;
548 m_pdgCode.push_back(
charge*-13);
563 Polarization thePolarization;
573 thePolarization.set_normal3d(
HepNormal3D(polx,poly,polz));
576 thePolarization.set_normal3d(
HepNormal3D(polx,polz,-poly));
578 m_polarization.push_back(thePolarization);
584 double theta = pp.theta();
585 double phi = pp.phi();
594 <<
"Event #" << m_events
595 <<
" E=" << e <<
", mass=" <<
mass
596 <<
" -- you have generated a tachyon! Increase energy or change particle ID."
598 return StatusCode::FAILURE;
602 double px = p*
sin(theta)*
cos(phi);
603 double pz = p*
sin(theta)*
sin(phi);
604 double py = -p*
cos(theta);
617 m_fourMom.push_back(HepLorentzVector(px,py,pz,pp.e()));
620 m_fourMom.push_back(HepLorentzVector(px,pz,-py,pp.e()));
630 t = vert.t()-vert_proj.t()/HepLorentzVector(px,py,pz,pp.e()).beta()
648 m_fourPos.push_back(HepLorentzVector(
x,
y,z,
t));
650 m_fourPos.push_back(HepLorentzVector(
x,z,
y,
t));
654 << m_fourPos.back().x() <<
","
655 << m_fourPos.back().y() <<
","
656 << m_fourPos.back().z() <<
","
657 << m_fourPos.back().t() <<
"), (Px,Py,Pz,E) = ("
658 << m_fourMom.back().px() <<
","
659 << m_fourMom.back().py() <<
","
660 << m_fourMom.back().pz() <<
","
661 << m_fourMom.back().e() <<
")"
664 <<
" (theta,phi) = (" << theta <<
"," << phi <<
"), "
665 <<
"polarization(x,y,z) = ("
666 << m_polarization.back().normal3d().x() <<
","
667 << m_polarization.back().normal3d().y() <<
","
668 << m_polarization.back().normal3d().z() <<
")"
675 mc_theta=m_fourMom.back().theta();
676 mc_phi=m_fourMom.back().phi();
677 mc_px=m_fourMom.back().px();
678 mc_py=m_fourMom.back().py();
679 mc_pz=m_fourMom.back().pz();
687 GenEvent*
event =
new GenEvent(1,1);
689 if(m_fourMom.size()==m_fourPos.size()&&m_fourMom.size()==m_polarization.size()){
691 for(std::size_t
v=0;
v<m_fourMom.size();++
v){
698 GenParticle* particle =
new GenParticle( m_fourMom[
v], m_pdgCode[
v], 1);
699 particle->set_polarization( m_polarization[
v] );
702 GenVertex* vertex =
new GenVertex(m_fourPos[
v]);
703 vertex->add_particle_out( particle );
706 event->add_vertex( vertex );
710 event->set_event_number(m_events);
716 log<<MSG::ERROR<<
"Wrong different number of vertexes/momenta/polaritazions!"<<endreq;
717 return StatusCode::FAILURE;
720 SmartDataPtr<McGenEventCol> anMcCol(eventSvc(),
"/Event/Gen");
725 log << MSG::INFO <<
"Add McGenEvent to existing collection" << endreq;
727 anMcCol->push_back(mcEvent);
734 mcColl->push_back(mcEvent);
735 StatusCode sc = eventSvc()->registerObject(
"/Event/Gen",mcColl);
736 if (sc != StatusCode::SUCCESS)
738 log << MSG::ERROR <<
"Could not register McGenEvent" << endreq;
742 return StatusCode::FAILURE;
751 return StatusCode::SUCCESS;
763 MsgStream log(messageService(), name());
765 log << MSG::INFO<<
"***************************************************"<<endreq;
766 log << MSG::INFO <<
"** you have run CosmicGenerator with some " <<endreq;
767 log << MSG::INFO <<
"** filters for cosmic muon simulation" <<endreq;
768 log << MSG::INFO <<
"** "<<m_tried<<
" muons were tried" <<endreq;
769 log << MSG::INFO <<
"** "<<m_accepted<<
" muons were accepted" <<endreq;
770 log << MSG::INFO <<
"** "<<m_rejected<<
" muons were rejected" <<endreq;
771 log << MSG::INFO<<
"***************************************************"<<endreq;
772 std::cout<<
"***************************************************"<<std::endl;
773 std::cout <<
"** you have run CosmicGenerator with some " <<std::endl;
774 std::cout <<
"** filters for cosmic muon simulation" <<std::endl;
775 std::cout <<
"** "<<m_tried<<
" muons were tried" <<std::endl;
776 std::cout <<
"** "<<m_accepted<<
" muons were accepted" <<std::endl;
777 std::cout <<
"** "<<m_rejected<<
" muons were rejected" <<std::endl;
778 std::cout<<
"***************************************************"<<std::endl;
782 return StatusCode::SUCCESS;
789bool CosmicGenerator::exzCut(
const Hep3Vector& pos,
const HepLorentzVector& p)
796 r = sqrt((pow(pos.x(),2)+pow(pos.z()+28000,2))) ;
797 double e = 0.45238*r+5000 ;
802 r = sqrt((pow(pos.x(),2)+pow(pos.z()-20000,2))) ;
807 double e = 0.461538*(r-15000)+10000 ;
ObjectVector< McGenEvent > McGenEventCol
HepGeom::Point3D< double > HepPoint3D
HepGeom::Normal3D< float > HepNormal3D
double sin(const BesAngle a)
double cos(const BesAngle a)
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
const HepLorentzVector & Vertex(void)
const HepLorentzVector & Momentum(void)
HepLorentzVector generateVertex(void)
static IBesRndmGenSvc * p_BesRndmGenSvc
CosmicGenerator(const std::string &name, ISvcLocator *pSvcLocator)
void PrintLevel(int printevt, int printmod)
void SetEnergyRange(float emin, float emax)
HepLorentzVector GenerateEvent(void)
float InitializeGenerator()
void SetCosCut(float ctcut)
static CosmicGun * GetCosmicGun(void)
manage multiple CLHEP random engines as named streams
virtual CLHEP::HepRandomEngine * GetEngine(const std::string &StreamName)=0
Interface to the CLHEP engine.