22 #include "GaudiKernel/ITHistSvc.h"
23 #include "GaudiKernel/SystemOfUnits.h"
30 m_highestVolume(nullptr),
31 m_extrapolator(
"Trk::Extrapolator/AtlasExtrapolator"),
34 m_materialCollectionValidation(true),
36 m_validationTree(nullptr),
37 m_validationTreeName(
"ExtrapolationValidation"),
38 m_validationTreeDescription(
"Output of the ExtrapolationValidation Algorithm"),
39 m_validationTreeFolder(
"/val/ExtrapolationValidation"),
62 m_covarianceDeterminant{},
63 m_destinationSurfaceType(0),
81 m_collectedLayerFront(0),
82 m_collectedLayerBack(0)
86 declareProperty(
"ValidateMaterialCollection", m_materialCollectionValidation);
90 declareProperty(
"ValidationTreeDescription", m_validationTreeDescription);
125 m_validationTree =
new TTree(m_validationTreeName.c_str(), m_validationTreeDescription.c_str());
128 m_validationTree->Branch(
"Parameters", &m_parameters,
"params/I");
129 m_validationTree->Branch(
"ParametersLoc1", m_parameterLoc1,
"paramLoc1[params]/F");
130 m_validationTree->Branch(
"ParametersLoc2", m_parameterLoc2,
"paramLoc2[params]/F");
131 m_validationTree->Branch(
"ParametersPhi", m_parameterPhi,
"paramPhi[params]/F");
132 m_validationTree->Branch(
"ParametersTheta", m_parameterTheta,
"paramTheta[params]/F");
133 m_validationTree->Branch(
"ParametersEta", m_parameterEta,
"paramEta[params]/F");
134 m_validationTree->Branch(
"ParametersQoverP", m_parameterQoverP,
"paramQoverP[params]/F");
136 m_validationTree->Branch(
"CovarianceLoc1", m_covarianceLoc1,
"covLoc1[params]/F");
137 m_validationTree->Branch(
"CovarianceLoc2", m_covarianceLoc2,
"covLoc2[params]/F");
138 m_validationTree->Branch(
"CovariancePhi", m_covariancePhi,
"covPhi[params]/F");
139 m_validationTree->Branch(
"CovarianceTheta", m_covarianceTheta,
"covTheta[params]/F");
140 m_validationTree->Branch(
"CovarianceQoverP", m_covarianceQoverP,
"covQoverP[params]/F");
141 m_validationTree->Branch(
"CovarianceDeterminant", m_covarianceDeterminant,
"covDet[params]/F");
143 m_validationTree->Branch(
"StartMomentum", &m_startP,
"startP/F");
145 m_validationTree->Branch(
"StartSurfaceX", &m_startX,
"startX/F");
146 m_validationTree->Branch(
"StartSurfaceY", &m_startY,
"startY/F");
147 m_validationTree->Branch(
"StartSurfaceR", &m_startR,
"startR/F");
148 m_validationTree->Branch(
"StartSurfaceZ", &m_startZ,
"startZ/F");
150 m_validationTree->Branch(
"EstimationSurfaceX", &m_estimationX,
"estimateX/F");
151 m_validationTree->Branch(
"EstimationSurfaceY", &m_estimationY,
"estimateY/F");
152 m_validationTree->Branch(
"EstimationSurfaceR", &m_estimationR,
"estimateR/F");
153 m_validationTree->Branch(
"EstimationSurfaceZ", &m_estimationZ,
"estimateZ/F");
155 m_validationTree->Branch(
"DestinationSurfaceType", &m_destinationSurfaceType,
"surfaceType/I");
156 m_validationTree->Branch(
"DestinationSurfaceX", &m_destinationX,
"surfaceX/F");
157 m_validationTree->Branch(
"DestinationSurfaceY", &m_destinationY,
"surfaceY/F");
158 m_validationTree->Branch(
"DestinationSurfaceR", &m_destinationR,
"surfaceR/F");
159 m_validationTree->Branch(
"DestinationSurfaceZ", &m_destinationZ,
"surfaceZ/F");
162 ITHistSvc* tHistSvc =
nullptr;
163 if (service(
"THistSvc",tHistSvc).isFailure()){
164 ATH_MSG_ERROR(
"initialize() Could not find Hist Service -> Switching ValidationMode Off !" );
165 delete m_validationTree; m_validationTree =
nullptr;
167 if ((tHistSvc->regTree(m_validationTreeFolder, m_validationTree)).isFailure()) {
168 ATH_MSG_ERROR(
"initialize() Could not register the validation Tree -> Switching ValidationMode Off !" );
169 delete m_validationTree; m_validationTree =
nullptr;
173 m_gaussDist =
new Rndm::Numbers(randSvc(), Rndm::Gauss(0.,1.));
174 m_flatDist =
new Rndm::Numbers(randSvc(), Rndm::Flat(0.,1.));
177 return StatusCode::SUCCESS;
185 ATH_MSG_INFO(
"================== Output Statistics =========================");
187 ATH_MSG_INFO(
"= - breaks fwd : " <<
double(m_breaksFront)/
double(m_triesFront)
188 <<
" (" << m_breaksFront <<
"/" << m_triesFront <<
")");
189 ATH_MSG_INFO(
"= - breaks bwd : " <<
double(m_breaksBack)/
double(m_triesBack)
190 <<
" (" << m_breaksBack <<
"/" << m_triesBack <<
")");
191 if (m_materialCollectionValidation){
193 ATH_MSG_INFO(
"= - layer collected fwd : " << m_collectedLayerFront );
194 ATH_MSG_INFO(
"= - layer collected bwd : " << m_collectedLayerBack );
197 ATH_MSG_INFO(
"==============================================================");
199 return StatusCode::SUCCESS;
206 const EventContext& ctx = Gaudi::Hive::currentContext();
208 if (!m_highestVolume){
216 ATH_MSG_WARNING(
"No highest TrackingVolume / no VolumeBounds ... pretty useless! ");
217 return StatusCode::SUCCESS;
226 m_destinationSurfaceType = 0;
244 m_parameterLoc1[m_parameters] = m_sigmaLoc * m_gaussDist->shoot();
245 m_parameterLoc2[m_parameters] = m_sigmaLoc * m_gaussDist->shoot();
247 m_parameterPhi[m_parameters] =
M_PI * m_flatDist->shoot();
248 m_parameterPhi[m_parameters] *= (m_flatDist->shoot() > 0.5 ) ? -1. : 1.;
249 m_parameterEta[m_parameters] = m_minEta + m_flatDist->shoot()*(m_maxEta-m_minEta);
250 m_parameterTheta[m_parameters] = 2.*
atan(
exp(-m_parameterEta[m_parameters]));
253 m_covarianceLoc1[m_parameters] = fabs( m_parameterLoc1[m_parameters] * 0.1);
254 m_covarianceLoc2[m_parameters] = fabs( m_parameterLoc2[m_parameters] * 0.1);
255 m_covariancePhi[m_parameters] = fabs( m_parameterPhi[m_parameters] * 0.1);
256 m_covarianceTheta[m_parameters] = fabs(m_parameterTheta[m_parameters] * 0.1);
259 double p = m_minP + m_flatDist->shoot()*(m_maxP-m_minP);
260 double charge = (m_flatDist->shoot() > 0.5 ) ? -1. : 1.;
261 m_parameterQoverP[m_parameters] =
charge/
p;
263 m_covarianceQoverP[m_parameters] = fabs(m_parameterQoverP[m_parameters] * 0.1);
269 m_startR = fabs(m_sigmaR * m_gaussDist->shoot());
270 double surfacePhi =
M_PI * m_flatDist->shoot();
271 surfacePhi *= (m_flatDist->shoot() > 0.5 ) ? -1. : 1.;
272 m_startX = m_startR*
cos(surfacePhi);
273 m_startY = m_startR*
sin(surfacePhi);
274 m_startZ = m_sigmaZ * m_gaussDist->shoot();
277 double alphaZ =
M_PI * m_flatDist->shoot();
278 alphaZ *= (m_flatDist->shoot() > 0.5 ) ? -1. : 1.;
284 m_parameterPhi[m_parameters],
285 m_parameterTheta[m_parameters],
292 covariance.setZero();
294 covariance(0,0) = m_covarianceLoc1[m_parameters];
296 covariance(1,1) = m_covarianceLoc2[m_parameters];
298 covariance(2,2) = m_covariancePhi[m_parameters];
300 covariance(3,3) = m_covarianceTheta[m_parameters];
302 covariance(4,4) = m_covarianceQoverP[m_parameters];
306 m_covarianceDeterminant[m_parameters] = covariance.determinant();
310 m_parameterLoc2[m_parameters],
311 m_parameterPhi[m_parameters],
312 m_parameterTheta[m_parameters],
313 m_parameterQoverP[m_parameters],
315 std::move(covariance));
318 if(startParameters.covariance())
ATH_MSG_VERBOSE(
"Start Covariance : \n" << *startParameters.covariance() );
322 m_estimationR = m_maximumR * m_flatDist->shoot();
326 CylTrf.setIdentity();
333 if (!estimationParameters) {
334 ATH_MSG_VERBOSE(
"Estimation of intersection did not work - skip event !" );
335 return StatusCode::SUCCESS;
337 else if (m_highestVolume && estimationParameters && !(m_highestVolume->inside(estimationParameters->
position()))){
338 ATH_MSG_VERBOSE(
"Estimation of intersection is outside the known world - skip event !" );
339 delete estimationParameters;
340 return StatusCode::SUCCESS;
348 m_parameterLoc1[m_parameters] = estimationParameters->parameters()[
Trk::loc1];
349 m_parameterLoc2[m_parameters] = estimationParameters->parameters()[
Trk::loc2];
350 m_parameterPhi[m_parameters] = estimationParameters->parameters()[
Trk::phi];
351 m_parameterEta[m_parameters] = estimationParameters->
eta();
352 m_parameterTheta[m_parameters] = estimationParameters->parameters()[
Trk::theta];
353 m_parameterQoverP[m_parameters] = estimationParameters->parameters()[
Trk::qOverP];
354 if(estimationParameters->covariance()){
355 m_covarianceLoc1[m_parameters] = (*estimationParameters->covariance())(0,0);
356 m_covarianceLoc2[m_parameters] = (*estimationParameters->covariance())(1,1);
357 m_covariancePhi[m_parameters] = (*estimationParameters->covariance())(2,2);
358 m_covarianceTheta[m_parameters] = (*estimationParameters->covariance())(3,3);
359 m_covarianceQoverP[m_parameters] = (*estimationParameters->covariance())(4,4);
360 m_covarianceDeterminant[m_parameters] = (estimationParameters->covariance())->determinant();
363 m_covarianceLoc1[m_parameters] = 0;
364 m_covarianceLoc2[m_parameters] = 0;
365 m_covariancePhi[m_parameters] = 0;
366 m_covarianceTheta[m_parameters] = 0;
367 m_covarianceQoverP[m_parameters] = 0;
368 m_covarianceDeterminant[m_parameters] = 0;
375 m_estimationX = estimatedPosition.x();
376 m_estimationY = estimatedPosition.y();
377 m_estimationZ = estimatedPosition.z();
380 delete estimationParameters; estimationParameters =
nullptr;
386 m_parameterPhi[m_parameters],
387 m_parameterTheta[m_parameters]), 10e5 , 10e5);
390 ATH_MSG_VERBOSE(
"Extrapolation to Destination Surface: " << destinationSurface );
395 if (!m_materialCollectionValidation && !m_direct)
396 destParameters = m_extrapolator->extrapolate(ctx,
404 const std::vector<const Trk::TrackStateOnSurface*>*
405 collectedMaterial = m_extrapolator->extrapolateM(ctx,
413 if (collectedMaterial && !collectedMaterial->empty()){
417 m_collectedLayerFront += collectedMaterial->size();
419 std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIter = collectedMaterial->begin();
420 std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIterEnd = collectedMaterial->end();
421 for ( ; tsosIter != tsosIterEnd;
delete(*tsosIter), ++tsosIter);
426 destParameters = m_extrapolator->extrapolateDirectly(ctx,
440 m_parameterLoc1[m_parameters] = destParameters->parameters()[
Trk::loc1];
441 m_parameterLoc2[m_parameters] = destParameters->parameters()[
Trk::loc2];
442 m_parameterPhi[m_parameters] = destParameters->parameters()[
Trk::phi];
443 m_parameterEta[m_parameters] = destParameters->
eta();
444 m_parameterTheta[m_parameters] = destParameters->parameters()[
Trk::theta];
445 m_parameterQoverP[m_parameters] = destParameters->parameters()[
Trk::qOverP];
446 if(destParameters->covariance()){
447 m_covarianceLoc1[m_parameters] = (*destParameters->covariance())(0,0);
448 m_covarianceLoc2[m_parameters] = (*destParameters->covariance())(1,1);
449 m_covariancePhi[m_parameters] = (*destParameters->covariance())(2,2);
450 m_covarianceTheta[m_parameters] = (*destParameters->covariance())(3,3);
451 m_covarianceQoverP[m_parameters] = (*destParameters->covariance())(4,4);
452 m_covarianceDeterminant[m_parameters] = (destParameters->covariance())->determinant();
455 m_covarianceLoc1[m_parameters] = 0;
456 m_covarianceLoc2[m_parameters] = 0;
457 m_covariancePhi[m_parameters] = 0;
458 m_covarianceTheta[m_parameters] = 0;
459 m_covarianceQoverP[m_parameters] = 0;
460 m_covarianceDeterminant[m_parameters] = 0;
464 m_destinationX = destinationPosition.x();
465 m_destinationY = destinationPosition.y();
466 m_destinationZ = destinationPosition.z();
467 m_destinationR = destinationPosition.perp();
472 if (!m_materialCollectionValidation && !m_direct)
473 backParameters = m_extrapolator->extrapolate(ctx,
481 const std::vector<const Trk::TrackStateOnSurface*>*
482 collectedBackMaterial = m_extrapolator->extrapolateM(ctx,
489 if (collectedBackMaterial && !collectedBackMaterial->empty()){
494 m_collectedLayerBack += collectedBackMaterial->size();
496 std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIter = collectedBackMaterial->begin();
497 std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIterEnd = collectedBackMaterial->end();
498 for ( ; tsosIter != tsosIterEnd;
delete(*tsosIter), ++tsosIter);
503 backParameters = m_extrapolator->extrapolateDirectly(ctx,
518 m_parameterLoc1[m_parameters] = backParameters->parameters()[
Trk::loc1];
519 m_parameterLoc2[m_parameters] = backParameters->parameters()[
Trk::loc2];
520 m_parameterPhi[m_parameters] = backParameters->parameters()[
Trk::phi];
521 m_parameterEta[m_parameters] = backParameters->
eta();
522 m_parameterTheta[m_parameters] = backParameters->parameters()[
Trk::theta];
523 m_parameterQoverP[m_parameters] = backParameters->parameters()[
Trk::qOverP];
524 if(backParameters->covariance()){
525 m_covarianceLoc1[m_parameters] = (*backParameters->covariance())(0,0);
526 m_covarianceLoc2[m_parameters] = (*backParameters->covariance())(1,1);
527 m_covariancePhi[m_parameters] = (*backParameters->covariance())(2,2);
528 m_covarianceTheta[m_parameters] = (*backParameters->covariance())(3,3);
529 m_covarianceQoverP[m_parameters] = (*backParameters->covariance())(4,4);
530 m_covarianceDeterminant[m_parameters] = (backParameters->covariance())->determinant();
533 m_covarianceLoc1[m_parameters] = 0;
534 m_covarianceLoc2[m_parameters] = 0;
535 m_covariancePhi[m_parameters] = 0;
536 m_covarianceTheta[m_parameters] = 0;
537 m_covarianceQoverP[m_parameters] = 0;
538 m_covarianceDeterminant[m_parameters] = 0;
541 delete backParameters;
545 delete destParameters;
552 if (m_validationTree)
553 m_validationTree->Fill();
559 return StatusCode::SUCCESS;
579 Amg::Vector3D surfaceXdirection(surfaceYdirection.cross(surfaceZdirection));
581 double nx = 1./sqrt(surfaceXdirection[0]*surfaceXdirection[0]+surfaceXdirection[1]*surfaceXdirection[1]+surfaceXdirection[2]*surfaceXdirection[2]);
582 double ny = 1./sqrt(surfaceYdirection[0]*surfaceYdirection[0]+surfaceYdirection[1]*surfaceYdirection[1]+surfaceYdirection[2]*surfaceYdirection[2]);
583 surfaceXdirection[0]*=nx;
584 surfaceXdirection[1]*=nx;
585 surfaceXdirection[2]*=nx;
587 surfaceYdirection[0]*=ny;
588 surfaceYdirection[1]*=ny;
589 surfaceYdirection[2]*=ny;
592 surfaceRotation.col(0) = surfaceXdirection;
593 surfaceRotation.col(1) = surfaceYdirection;
594 surfaceRotation.col(2) = surfaceZdirection;