58 const EventContext& ctx = Gaudi::Hive::currentContext();
59 CLHEP::HepRandomEngine* rndmEngine = this->
getRandomEngine(name(), ctx);
66 for (
const auto & iterTTR : *coll) {
68 const auto pmass =
m_gendata->particleMass(std::abs(iterTTR.GetPDGCode()));
70 double en = std::sqrt(mass*mass+iterTTR.GetMomentum().mag2());
73 <<
"\n mom is "<<iterTTR.GetMomentum()
74 <<
"\n pdg is "<<iterTTR.GetPDGCode() );
76 CLHEP::HepLorentzVector particle4Position( iterTTR.GetPosition(), iterTTR.GetTime());
80 ATH_MSG_DEBUG(
"Track record started at " << particle4Position );
83 if ( particle4Position.z() == 22031 || particle4Position.z() == -22031 ){
84 particle4Position.setX( particle4Position.x() + CLHEP::RandFlat::shoot(rndmEngine, -
m_smearTR,
m_smearTR) );
85 particle4Position.setY( particle4Position.y() + CLHEP::RandFlat::shoot(rndmEngine, -
m_smearTR,
m_smearTR) );
87 particle4Position.setZ( particle4Position.z() + CLHEP::RandFlat::shoot(rndmEngine, -
m_smearTR,
m_smearTR) );
88 double R = std::sqrt( std::pow( particle4Position.x(),2 ) + std::pow(particle4Position.y(),2 ) );
90 dPhi = CLHEP::RandFlat::shoot( rndmEngine, -dPhi, dPhi );
91 double theta = std::atan2( particle4Position.x() , particle4Position.y() );
92 particle4Position.setX( R*std::sin(
theta + dPhi ) );
93 particle4Position.setY( R*std::cos(
theta + dPhi ) );
95 ATH_MSG_DEBUG(
"Shifted track record to " << particle4Position );
97 CLHEP::HepLorentzVector particle4Momentum( iterTTR.GetMomentum(), en );
99 ATH_MSG_DEBUG(
"Track record momentum was " << particle4Momentum );
102 double dTheta = CLHEP::RandFlat::shoot(rndmEngine, 0,
m_smearTRp);
103 double dPhi = CLHEP::RandFlat::shoot(rndmEngine, 0, 2*
M_PI);
106 CLHEP::HepLorentzVector perpendicularMomentum( 1 , 0 , 0 , 0);
107 if ( particle4Momentum.x() != 0 ){
108 if (particle4Momentum.y() == 0){
109 perpendicularMomentum.setX( 0 );
110 perpendicularMomentum.setY( 1 );
112 perpendicularMomentum.setX( particle4Momentum.y() );
113 perpendicularMomentum.setY( particle4Momentum.x() );
118 double tempP = std::pow(particle4Momentum.x(),2)+std::pow(particle4Momentum.y(),2)+std::pow(particle4Momentum.z(),2);
121 perpendicularMomentum.setX(0);
122 perpendicularMomentum.setY(0);
123 }
else if ( std::tan(dTheta) == 0 ){
124 ATH_MSG_DEBUG(
"Randomly deciding to keep the vector's direction...");
125 perpendicularMomentum.setX(0);
126 perpendicularMomentum.setY(0);
128 double scale = ( tempP ) * std::sin(dTheta) / ( std::pow(perpendicularMomentum.x(),2)+std::pow(perpendicularMomentum.y(),2) );
129 perpendicularMomentum.setX( perpendicularMomentum.x() * scale );
130 perpendicularMomentum.setY( perpendicularMomentum.y() * scale );
133 perpendicularMomentum.rotate( dPhi , particle4Momentum.vect() );
135 particle4Momentum.setX( particle4Momentum.x() + perpendicularMomentum.x() );
136 particle4Momentum.setY( particle4Momentum.y() + perpendicularMomentum.y() );
137 particle4Momentum.setZ( particle4Momentum.z() + perpendicularMomentum.z() );
140 double scale2 = tempP==0? 1 : (pow(particle4Momentum.x(),2)+pow(particle4Momentum.y(),2)+pow(particle4Momentum.z(),2)) / tempP;
141 particle4Momentum.setX( particle4Momentum.x() *
scale2 );
142 particle4Momentum.setY( particle4Momentum.y() *
scale2 );
143 particle4Momentum.setZ( particle4Momentum.z() *
scale2 );
144 ATH_MSG_DEBUG(
"Rotated the vector by " << perpendicularMomentum );
145 ATH_MSG_DEBUG(
"And resulting momentum is " << particle4Momentum );
148 ATH_MSG_DEBUG(
"Will stop the track record where it is and give it mass " << mass );
149 particle4Momentum.setX(0);
150 particle4Momentum.setY(0);
151 particle4Momentum.setZ(0);
152 particle4Momentum.setT(mass);
157 settime += particle4Position.rho()/CLHEP::c_light;
159 particle4Position.setT(settime*CLHEP::c_light);
162 m_fourPos.push_back( particle4Position );
163 m_fourMom.push_back( particle4Momentum );
165 m_pdgCode.push_back(iterTTR.GetPDGCode());
175 return StatusCode::SUCCESS;