42 declareProperty(
"Pt", m_requestedPt = 5.0 );
43 declareProperty(
"E", m_requestedE = 5.0 );
44 declareProperty(
"Phi", m_requestedPhi = 0.0 );
45 declareProperty(
"Theta", m_requestedTheta = 3.14 / 4.0 );
47 declareProperty(
"VertexX", m_requestedX = 0.0 );
48 declareProperty(
"VertexY", m_requestedY = 0.0 );
49 declareProperty(
"VertexZ", m_requestedZ = 0.0 );
50 declareProperty(
"Time", m_requestedT = 0.0 );
52 declareProperty(
"MinPt", m_minPt = 1. );
53 declareProperty(
"MinE", m_minE = 1. );
54 declareProperty(
"MinTheta", m_minTheta = 0. );
55 declareProperty(
"MinPhi", m_minPhi = 0. );
57 declareProperty(
"MaxPt", m_maxPt = 100. );
58 declareProperty(
"MaxE", m_maxE = 100. );
59 declareProperty(
"MaxTheta", m_maxTheta = CLHEP::pi );
60 declareProperty(
"MaxPhi", m_maxPhi = CLHEP::twopi );
62 declareProperty(
"SigmaPt", m_sigmaPt = 0.1 );
63 declareProperty(
"SigmaE", m_sigmaE = 0.1 );
65 declareProperty(
"SigmaTheta", m_sigmaTheta = 0.1 );
66 declareProperty(
"SigmaPhi", m_sigmaPhi = 0.1 );
75 declareProperty(
"PdgCode", m_pdgCode = 211 );
92 MsgStream log(
msgSvc(), name() );
94 static const bool CREATEIFNOTTHERE(
true );
95 StatusCode RndmStatus = service(
"BesRndmGenSvc", p_BesRndmGenSvc, CREATEIFNOTTHERE );
96 if ( !RndmStatus.isSuccess() || 0 == p_BesRndmGenSvc )
98 log << MSG::ERROR <<
" Could not initialize Random Number Service" << endmsg;
104 const HepPDT::ParticleData* particle =
107 m_mass = particle ? particle->mass().value() : 0;
115 if ( !m_PtGenMode && ( m_minPt > m_requestedPt || m_maxPt < m_requestedPt ) ||
118 log << MSG::ERROR <<
" Pt min and max out of range. \n"
119 <<
" Will set Pt mode to Fixed!!!" << endmsg;
122 if ( !m_ThetaGenMode &&
123 ( m_minTheta > m_requestedTheta || m_maxTheta < m_requestedTheta ) ||
124 m_maxTheta < m_minTheta )
126 log << MSG::ERROR <<
" Theta min and max out of range. \n"
127 <<
" Will set Theta mode to Fixed!!!" << endmsg;
130 if ( !m_PhiGenMode && ( m_minPhi > m_requestedPhi || m_maxPhi < m_requestedPhi ) ||
131 m_maxPhi < m_minPhi )
133 log << MSG::ERROR <<
" Phi min and max out of range. \n"
134 <<
" Will set Phi mode to Fixed!!!" << endmsg;
139 if ( !m_EGenMode && ( m_minE > m_requestedE || m_maxE < m_requestedE ) || m_maxE < m_minE )
141 log << MSG::ERROR <<
" E min and max out of range. \n"
142 <<
" Will set E mode to Fixed!!!" << endmsg;
145 if ( !m_ThetaGenMode &&
146 ( m_minTheta > m_requestedTheta || m_maxTheta < m_requestedTheta ) ||
147 m_maxTheta < m_minTheta )
149 log << MSG::ERROR <<
" Theta min and max out of range. \n"
150 <<
" Will set Theta mode to Fixed!!!" << endmsg;
153 if ( !m_PhiGenMode && ( m_minPhi > m_requestedPhi || m_maxPhi < m_requestedPhi ) ||
154 m_maxPhi < m_minPhi )
156 log << MSG::ERROR <<
" Phi min and max out of range. \n"
157 <<
" Will set Phi mode to Fixed!!!" << endmsg;
163 return StatusCode::SUCCESS;
172 CLHEP::HepRandomEngine* engine = p_BesRndmGenSvc->GetEngine(
"SINGLE" );
173 const long*
s = engine->getSeeds();
175 m_seeds.push_back(
s[0] );
176 m_seeds.push_back(
s[1] );
180 double pt, phi, theta, E, px, py, pz, p;
185 pt = generateValue( m_PtGenMode, m_requestedPt, m_sigmaPt, m_minPt, m_maxPt );
186 theta = generateValue( m_ThetaGenMode, m_requestedTheta, m_sigmaTheta, m_minTheta,
188 phi = generateValue( m_PhiGenMode, m_requestedPhi, m_sigmaPhi, m_minPhi, m_maxPhi );
192 px = pt *
cos( phi );
193 py = pt *
sin( phi );
194 pz = pt /
tan( theta );
195 m_fourMom.setVectM( CLHEP::Hep3Vector( px, py, pz ), m_mass );
196 m_fourPos.set( m_requestedX, m_requestedY, m_requestedZ, m_requestedT );
197 return StatusCode::SUCCESS;
200 E = generateValue( m_EGenMode, m_requestedE, m_sigmaE, m_minE, m_maxE );
201 theta = generateValue( m_ThetaGenMode, m_requestedTheta, m_sigmaTheta, m_minTheta,
203 phi = generateValue( m_PhiGenMode, m_requestedPhi, m_sigmaPhi, m_minPhi, m_maxPhi );
207 if ( E * E - m_mass * m_mass < 0. )
209 MsgStream log(
msgSvc(), name() );
211 <<
"You have Generated a Tachyon!! Increase energy or change particle ID" << endmsg;
212 return StatusCode::FAILURE;
214 p = sqrt( E * E - m_mass * m_mass );
215 px = p *
sin( theta ) *
cos( phi );
216 py = p *
sin( theta ) *
sin( phi );
217 pz = p *
cos( theta );
219 m_fourMom.setVectM( CLHEP::Hep3Vector( px, py, pz ), m_mass );
220 m_fourPos.set( m_requestedX, m_requestedY, m_requestedZ, m_requestedT );
221 return StatusCode::SUCCESS;
223 return StatusCode::SUCCESS;
237 evt->set_event_number( m_events );
238 GenVertex* v1 =
new GenVertex( m_fourPos );
240 std::cout <<
" SingleParticleGun::fillEvt --> " << std::endl;
241 std::cout <<
" Event number:: " << m_events << std::endl;
242 std::cout <<
" vertex.x = " << m_fourPos.x() <<
" vertex.y = " << m_fourPos.y()
243 <<
" vertex.z = " << m_fourPos.z() <<
" vertex.t = " << m_fourPos.t() << std::endl;
245 std::cout <<
" momentum.x = " << m_fourMom.x() <<
" momentum.y = " << m_fourMom.y()
246 <<
" momentum.z = " << m_fourMom.z() <<
" momentum.t = " << m_fourMom.t()
249 evt->add_vertex( v1 );
251 v1->add_particle_out(
new GenParticle( m_fourMom, m_pdgCode, 1 ) );
253 std::cout <<
" particles_size = " << evt->particles_size()
254 <<
" vertices_size = " << evt->vertices_size() << std::endl;
256 evt->set_signal_process_id(
SINGLE );
257 evt->set_random_states( m_seeds );
259 return StatusCode::SUCCESS;
virtual StatusCode fillEvt(GenEvent *evt)
virtual StatusCode genFinalize()
virtual StatusCode genInitialize()
virtual StatusCode callGenerator()
SingleParticleGun(const std::string &name, ISvcLocator *pSvcLocator)
virtual ~SingleParticleGun()