104 {
105
106 m_randomEngine->setSeed(
name(), ctx );
107 CLHEP::HepRandomEngine* randomEngine(m_randomEngine->getEngine(ctx));
108 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle {
m_beamSpotKey, ctx };
109
110
111
112 double vertexX = CLHEP::RandGaussZiggurat::shoot(randomEngine)*beamSpotHandle->beamSigma(0);
113 double vertexY = CLHEP::RandGaussZiggurat::shoot(randomEngine)*beamSpotHandle->beamSigma(1);
116 double vertexZ = 0;
117 double vertexT = 0;
118
122 vertexZ = CLHEP::RandGaussZiggurat::shoot(randomEngine, 0., zWidth);
123 vertexT = CLHEP::RandGaussZiggurat::shoot(randomEngine, 0., timeWidth);
124 }
128 }
129 else {
131 return new CLHEP::HepLorentzVector(0.,0.,0.,0.);
132 }
134 ", Zvertex = " << vertexZ << ", Tvertex = " << vertexT);
135
136
137 CLHEP::HepLorentzVector *vertexSmearing =
138 new CLHEP::HepLorentzVector( vertexX, vertexY, vertexZ, 0. );
139
140
141 const double tx =
tan( beamSpotHandle->beamTilt(1) );
142 const double ty =
tan( beamSpotHandle->beamTilt(0) );
143
144 const double sqrt_abc = std::sqrt(1. + tx*tx + ty*ty);
145 const double sqrt_fgh = std::sqrt(1. + ty*ty);
146
147 const double a = ty/sqrt_abc;
148 const double b =
tx/sqrt_abc;
149 const double c = 1./sqrt_abc;
150
151 HepGeom::Point3D<double> from1(0,0,1);
152 HepGeom::Point3D<double> to1(
a,b,c);
153
154 const double f = 1./sqrt_fgh;
156 const double h = -(ty)/sqrt_fgh;
157
158 HepGeom::Point3D<double> from2(1,0,0);
159 HepGeom::Point3D<double> to2(f,g,h);
160
161
163 HepGeom::Rotate3D(from1, from2, to1, to2).getRotation(),
164 CLHEP::Hep3Vector( beamSpotHandle->beamPos().x(),
165 beamSpotHandle->beamPos().y(),
166 beamSpotHandle->beamPos().z() )
167 );
168
169 ATH_MSG_VERBOSE(
"BeamSpotSvc reported beam position as " << beamSpotHandle->beamPos());
170 ATH_MSG_VERBOSE(
"Width is (" << beamSpotHandle->beamSigma(0) <<
", " <<
171 beamSpotHandle->beamSigma(1) <<
", " <<
m_bunchLength <<
")");
172 ATH_MSG_VERBOSE(
"Tilts are " << beamSpotHandle->beamTilt(0) <<
" and " <<
173 beamSpotHandle->beamTilt(1));
174 ATH_MSG_VERBOSE(
"Vertex Position before transform: " << *vertexSmearing);
175
176
177 *vertexSmearing =
transform * HepGeom::Point3D<double>(*vertexSmearing);
178 vertexSmearing->setT(vertexT);
179
180
181 return vertexSmearing;
182 }
#define ATH_MSG_WARNING(x)
Gaudi::Property< double > m_thetaX
Gaudi::Property< double > m_alphaX
Gaudi::Property< double > m_betaStar
parameters according to S.Fartoukh Phys.Rev.ST Accel.Beams 17 (2014) no.11, 111001 ------------------...
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
double getDisplacement(double bunchSize, double angle1, double angle2, CLHEP::HepRandomEngine *rng) const
Gaudi::Property< double > m_alphaPar
Gaudi::Property< double > m_epsilon
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.