71 if(
m_mode ==
"TTRCavern" ) {
80 return StatusCode::SUCCESS;
86 double earliestMuonTime = -1.;
91 if(abs(
r.GetPDGCode()) == 13 ) {
93 if( (nMuons==1) or (
r.GetTime() < earliestMuonTime) ) {
95 earliestMuonTime =
r.GetTime();
101 CLHEP::Hep3Vector pos = earliestMuon->
GetPosition();
102 CLHEP::Hep3Vector mom = earliestMuon->
GetMomentum();
103 double energy = sqrt(mom.x()*mom.x() + mom.y()*mom.y() + mom.z()*mom.z());
105 CLHEP::Hep3Vector cosThetaDir = CLHEP::Hep3Vector(mom.x()/energy, mom.y()/energy, mom.z()/energy);
107 double time = earliestMuon->
GetTime();
109 ATH_MSG_DEBUG(
" Earliest Muon xyz position " << pos.x()<<
" "
110 << pos.y() <<
" " << pos.z() );
112 << cosThetaDir.y() <<
" " << cosThetaDir.z() );
122 CLHEP::Hep3Vector PointCritical;
125 double dXdY = cosThetaDir.x()/cosThetaDir.y();
126 double dZdY = cosThetaDir.z()/cosThetaDir.y();
128 double XCritical = pos.x()-dXdY*pos.y();
129 double YCritical = 0.0;
130 double ZCritical = pos.z()-dZdY*pos.y();
132 PointCritical = CLHEP::Hep3Vector(XCritical,YCritical,ZCritical);
134 PathCritical = sqrt(
pow(XCritical-pos.x(),2) +
pow(YCritical-pos.y(),2) +
135 pow(ZCritical-pos.z(),2));
136 if( (YCritical-pos.y())*cosThetaDir.y() < 0 ) {
137 ATH_MSG_WARNING(
"Backwards extrapolation?? pos.y(),cosThetaDir.y() = "
138 << pos.y()<<
"," << cosThetaDir.y() );
139 PathCritical = -1.0 * PathCritical;
143 double dXdZ = cosThetaDir.x()/cosThetaDir.z();
144 double dYdZ = cosThetaDir.y()/cosThetaDir.z();
146 double XCritical = pos.x()-dXdZ*pos.z();
147 double YCritical = pos.y()-dYdZ*pos.z();
148 double ZCritical = 0.0;
150 PointCritical = CLHEP::Hep3Vector(XCritical,YCritical,ZCritical);
152 PathCritical = sqrt(
pow(XCritical-pos.x(),2) +
pow(YCritical-pos.y(),2) +
153 pow(ZCritical-pos.z(),2));
154 if( (ZCritical-pos.z())*cosThetaDir.z() < 0 ) {
155 ATH_MSG_WARNING(
"Backwards extrapolation?? pos.z(),cosThetaDir.z() = "
156 << pos.z()<<
"," << cosThetaDir.z() );
157 PathCritical = -1.0 * PathCritical;
162 PathCritical = -1.*(pos.x()*cosThetaDir.x() + pos.y()*cosThetaDir.y() +
163 pos.z()*cosThetaDir.z());
164 PointCritical = CLHEP::Hep3Vector( pos.x() + PathCritical*cosThetaDir.x(),
165 pos.y() + PathCritical*cosThetaDir.y(),
166 pos.z() + PathCritical*cosThetaDir.z());
170 return StatusCode::FAILURE;
173 double TimeCritical = time + PathCritical/
m_velocity;
176 ATH_MSG_DEBUG(
" Extrapolated muon xyz position " << PointCritical.x()<<
" "
177 << PointCritical.y()<<
" " << PointCritical.z());
182 ComTime* theComTime =
new ComTime(TTCTime,TimeCritical,PointCritical,cosThetaDir);
192 }
else if(
m_mode ==
"CollisionMode" ) {
197 return StatusCode::SUCCESS;
200 return StatusCode::SUCCESS;
202 return StatusCode::SUCCESS;