diff --git a/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt b/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt index 3d40cedcd4ee031eca14bd7d4e703cbd454bb751..1da3edb21cd4f20daa1fc2122cc8a201cdf87b36 100644 --- a/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt +++ b/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt @@ -12,13 +12,13 @@ atlas_depends_on_subdirs( PUBLIC GaudiKernel Tracking/TrkEvent/TrkParameters Tracking/TrkEvent/TrkTrack + Tracking/TrkDetDescr/TrkGeometry Tracking/TrkFitter/TrkFitterInterfaces Tracking/TrkFitter/TrkiPatFitterUtils PRIVATE Event/EventPrimitives Tracking/TrkDetDescr/TrkDetDescrInterfaces Tracking/TrkDetDescr/TrkDetElementBase - Tracking/TrkDetDescr/TrkGeometry Tracking/TrkDetDescr/TrkSurfaces DetectorDescription/Identifier Tracking/TrkEvent/TrkMaterialOnTrack diff --git a/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements b/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements index 81d1b94fe7399e47b21a29f1e81d2e7110bd44c4..a98e11d3265e85edc1a2092f00a9ff4f33f980f5 100755 --- a/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements +++ b/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements @@ -26,6 +26,7 @@ use AtlasPolicy AtlasPolicy-* use AthenaBaseComps AthenaBaseComps-* Control use GaudiInterface GaudiInterface-* External use GeoPrimitives GeoPrimitives-* DetectorDescription +use TrkGeometry TrkGeometry-* Tracking/TrkDetDescr use TrkFitterInterfaces TrkFitterInterfaces-* Tracking/TrkFitter use TrkParameters TrkParameters-* Tracking/TrkEvent use TrkTrack TrkTrack-* Tracking/TrkEvent diff --git a/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx b/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx index 00176daa918f16d51f3ca0ef7b81fb4faa9eb6c8..235b3e363c7720e6a2abf84618394d76164fae99 100755 --- a/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx +++ b/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx @@ -205,14 +205,15 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>& measurements, // nothing to do if starting with vertex measurement if (measurements.front()->isVertex()) { - if (msgLvl(MSG::DEBUG)) - { - ATH_MSG_VERBOSE(" addLeadingMaterial: " ); - printMeasurements(measurements); - } return; } + if (msgLvl(MSG::DEBUG)) + { + ATH_MSG_DEBUG(" start of addLeadingMaterial: " ); + printMeasurements(measurements); + } + // fitted momentum at perigee - ignoring leading material effects double charge = 1.; double qOverP = fitParameters.qOverP(); @@ -508,12 +509,12 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>& measurements, intersection, qOverP); if(newIntersectionSTEP&&intersection) { - double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag(); - std::cout << " iMat 1 distance STEP and Intersector " << dist << std::endl; - if(dist>10.) std::cout << " iMat 1 ALARM distance STEP and Intersector " << dist << std::endl; +// double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag(); +// std::cout << " iMat 1 distance STEP and Intersector " << dist << std::endl; +// if(dist>10.) std::cout << " iMat 1 ALARM distance STEP and Intersector " << dist << std::endl; delete newIntersectionSTEP; } else { - if(intersection) std::cout << " iMat 1 ALARM STEP did not intersect! " << std::endl; +// if(intersection) std::cout << " iMat 1 ALARM STEP did not intersect! " << std::endl; } } else { intersection = m_useStepPropagator>=1? @@ -581,6 +582,9 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>& measurements, } } } + + ATH_MSG_DEBUG(" push_front(leadingMeas) "); + measurements.push_front(leadingMeas); // update momentum for energy loss @@ -612,12 +616,12 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>& measurements, intersection, qOverP); if(newIntersectionSTEP&&intersection) { - double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag(); - std::cout << " iMat 2 distance STEP and Intersector " << dist << std::endl; - if(dist>10.) std::cout << " iMat 2 ALARM distance STEP and Intersector " << dist << std::endl; +// double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag(); +// std::cout << " iMat 2 distance STEP and Intersector " << dist << std::endl; +// if(dist>10.) std::cout << " iMat 2 ALARM distance STEP and Intersector " << dist << std::endl; delete newIntersectionSTEP; } else { - if(intersection) std::cout << " iMat 2 ALARM STEP did not intersect! " << std::endl; +// if(intersection) std::cout << " iMat 2 ALARM STEP did not intersect! " << std::endl; } } else { intersection = m_useStepPropagator>=1? @@ -1354,12 +1358,12 @@ MaterialAllocator::indetMaterial (std::list<FitMeasurement*>& measurements, intersection, qOverP); if(newIntersectionSTEP&&intersection) { - double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag(); - std::cout << " iMat 3 distance STEP and Intersector " << dist << std::endl; - if(dist>10.) std::cout << " iMat 3 ALARM distance STEP and Intersector " << dist << std::endl; +// double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag(); +// std::cout << " iMat 3 distance STEP and Intersector " << dist << std::endl; +// if(dist>10.) std::cout << " iMat 3 ALARM distance STEP and Intersector " << dist << std::endl; delete newIntersectionSTEP; } else { - if(intersection) std::cout << " iMat 3 ALARM STEP did not intersect! " << std::endl; +// if(intersection) std::cout << " iMat 3 ALARM STEP did not intersect! " << std::endl; } } else { intersection = m_useStepPropagator>=1? @@ -2458,36 +2462,75 @@ MaterialAllocator::spectrometerMaterial (std::list<FitMeasurement*>& measurement bool reorderMS = false; bool reorderID = false; bool firstMSHit = false; - double previousDistance = -m_orderingTolerance; + double previousDistance = 0.; + double previousDistanceR = 0.; + double previousDistanceZ = 0.; + double minDistanceID = 0.; + double minDistanceMS = 0.; + double minRDistanceMS = 0.; + double minZDistanceMS = 0.; std::list<Trk::FitMeasurement*>::iterator m = measurements.begin(); for ( ; m != measurements.end(); ++m) { Amg::Vector3D position = (**m).intersection(FittedTrajectory).position(); Amg::Vector3D positionSurf = (**m).surface()->center(); + Amg::Vector3D positionMst = startPosition; + if((**m).measurementBase()) positionMst = (**m).measurementBase()->globalPosition(); double distance = startDirection.dot(position - startPosition); + double distanceR = sqrt((positionMst.x() - startPosition.x())*(positionMst.x() - startPosition.x()) + (positionMst.y() - startPosition.y())*(positionMst.y() - startPosition.y())); + double distanceZ = (positionMst.z() - startPosition.z()); + if(startDirection.z()<0) distanceZ = -distanceZ; if (!m_calorimeterVolume->inside(position) || !m_calorimeterVolume->inside(positionSurf)) { - if (distance < previousDistance) reorderMS = true; + if (distance - previousDistance < -m_orderingTolerance) { + reorderMS = true; + if(distance - previousDistance<minDistanceMS) { + minDistanceMS = distance-previousDistance ; + minRDistanceMS = distanceR-previousDistanceR; + minZDistanceMS = distanceZ-previousDistanceZ; + } + } if ((**m).isScatterer()) haveMaterial = true; if ((**m).measurementBase()&&!firstMSHit) { firstMSHit = true; } if ((**m).isScatterer()&&!firstMSHit) haveLeadingMaterial = true; } else { - if (distance < previousDistance) reorderID = true; + if (distance - previousDistance < -m_orderingTolerance) { + reorderID = true; + if(distance - previousDistance<minDistanceID) minDistanceID = distance-previousDistance ; + } } - previousDistance = distance - m_orderingTolerance; + previousDistance = distance; + previousDistanceZ = distanceZ; + previousDistanceR = distanceR; + } + + if(reorderMS&&(minRDistanceMS>-m_orderingTolerance||minZDistanceMS>-m_orderingTolerance)) { + +// 3D distance of the intersection is problematic but the R or Z distance of the measurementBase is fine +// we should not reorder + + reorderMS = false; + } + +// if(!m_allowReordering) { + if (reorderMS&&fabs(minDistanceMS)>-2.) ATH_MSG_WARNING( " reorder MS part of track with minimum distance " << minDistanceMS << " minRDistanceMS " << minRDistanceMS << " minZDistanceMS " << minZDistanceMS); + if (reorderID&&fabs(minDistanceID)>-2.) ATH_MSG_WARNING( " reorder ID part of track with minimum distance " << minDistanceID); +// } + + if(reorderMS||reorderID) { + if (msgLvl(MSG::DEBUG)) printMeasurements(measurements); } - if (reorderMS) ATH_MSG_WARNING( " reorder MS part of track "); - if (reorderID) ATH_MSG_WARNING( " reorder ID part of track "); if (!haveLeadingMaterial&&haveMaterial) { ATH_MSG_WARNING( " MS part of track has no leading material in front of first MS hit "); } if (reorderMS) orderMeasurements(measurements,startDirection,startPosition); + // nothing to do if spectrometer material already exists if (haveMaterial) return; - ATH_MSG_WARNING( " spectrometerMaterial: ALARM no material found on track "); + ATH_MSG_DEBUG( " spectrometerMaterial: ALARM no material found on track can happen for MuGirl"); // material has to be added: need inner and outer TrackParameters FitMeasurement* innerMeasurement = 0; diff --git a/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx b/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx index 4e638028668551eca0da1738f8c72d3eff4d99ef..c91af94c5bba77d87d5238a51578968d5aa8b215 100755 --- a/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx +++ b/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx @@ -644,6 +644,8 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>& measurements, // extrapolation to set FittedTrajectory double qOverP = parameters.qOverP(); double previousDistance = -m_orderingTolerance; + double previousDistanceR = -m_orderingTolerance; + double previousDistanceZ = -m_orderingTolerance; bool reorder = false; Amg::Vector3D startDirection = parameters.direction(); Amg::Vector3D startPosition = parameters.position(); @@ -673,12 +675,12 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>& measurements, m_stepField, Trk::muon); if(newIntersectionSTEP) { - double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag(); - std::cout << " iPat 1 distance STEP and Intersector " << dist << std::endl; - if(dist>10.) std::cout << " iPat 1 ALARM distance STEP and Intersector " << dist << std::endl; +// double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag(); +// std::cout << " iPat 1 distance STEP and Intersector " << dist << std::endl; +// if(dist>10.) std::cout << " iPat 1 ALARM distance STEP and Intersector " << dist << std::endl; delete newIntersectionSTEP; - } else { - std::cout << " iPat 1 ALARM STEP did not intersect! " << std::endl; +// } else { +// std::cout << " iPat 1 ALARM STEP did not intersect! " << std::endl; } } if (newIntersection) @@ -689,8 +691,17 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>& measurements, if (! reorder) { double distance = startDirection.dot(intersection->position() - startPosition); - if (distance < previousDistance) reorder = true; + Amg::Vector3D positionMst = (**m).globalPosition(); + double distanceR = sqrt((positionMst.x() - startPosition.x())*(positionMst.x() - startPosition.x()) + (positionMst.y() - startPosition.y())*(positionMst.y() - startPosition.y())); + double distanceZ = (positionMst.z() - startPosition.z()); + if(startDirection.z()<0) distanceZ = -distanceZ; + if (distance < previousDistance&&distanceR < previousDistanceR&&distanceZ < previousDistanceZ) { + reorder = true; + ATH_MSG_DEBUG( " reorder 3D distance " << distance - previousDistance << " R distance " << distanceR - previousDistanceR << " Z distance " << distanceZ - previousDistanceZ ); + } previousDistance = distance - m_orderingTolerance; + previousDistanceR = distanceR - m_orderingTolerance; + previousDistanceZ = distanceZ - m_orderingTolerance; } } else @@ -754,6 +765,8 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>& measurements, bool haveMeasurement = false; int hit = measurements.size(); double previousDistance = -m_orderingTolerance; + double previousDistanceR = -m_orderingTolerance; + double previousDistanceZ = -m_orderingTolerance; bool reorder = false; bool skipVertexMeasurement = measurements.size(); Amg::Vector3D startDirection = parameters.direction(); @@ -960,12 +973,12 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>& measurements, m_stepField, Trk::muon); if(newIntersectionSTEP) { - double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag(); - std::cout << " iPat 2 distance STEP and Intersector " << dist << std::endl; - if(dist>10.) std::cout << " iPat 2 ALARM distance STEP and Intersector " << dist << std::endl; +// double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag(); +// std::cout << " iPat 2 distance STEP and Intersector " << dist << std::endl; +// if(dist>10.) std::cout << " iPat 2 ALARM distance STEP and Intersector " << dist << std::endl; delete newIntersectionSTEP; - } else { - std::cout << " iPat 2 ALARM STEP did not intersect! " << std::endl; +// } else { +// std::cout << " iPat 2 ALARM STEP did not intersect! " << std::endl; } } @@ -1014,8 +1027,19 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>& measurements, if (! reorder) { double distance = startDirection.dot(intersection->position() - startPosition); - if (distance < previousDistance) reorder = true; - previousDistance = distance - m_orderingTolerance; + Amg::Vector3D positionMst = startPosition; + if((**s).measurementOnTrack()) positionMst = (**s).measurementOnTrack()->globalPosition(); + if((**s).materialEffectsOnTrack()) positionMst = (**s).materialEffectsOnTrack()->associatedSurface().center(); + double distanceR = sqrt((positionMst.x() - startPosition.x())*(positionMst.x() - startPosition.x()) + (positionMst.y() - startPosition.y())*(positionMst.y() - startPosition.y())); + double distanceZ = (positionMst.z() - startPosition.z()); + if(startDirection.z()<0) distanceZ = -distanceZ; + if(distance < previousDistance&&distanceR < previousDistanceR&&distanceZ < previousDistanceZ) { + reorder = true; + ATH_MSG_DEBUG( " reorder 3D distance " << distance - previousDistance << " R distance " << distanceR - previousDistanceR << " Z distance " << distanceZ - previousDistanceZ ); + } + previousDistance = distance - m_orderingTolerance; + previousDistanceR = distanceR - m_orderingTolerance; + previousDistanceZ = distanceZ - m_orderingTolerance; } // insert measurement(s) in list @@ -1115,25 +1139,8 @@ iPatFitter::performFit(std::list<FitMeasurement*>* measurements, // perigeeQuality); // } - bool haveLeadingMaterial = false; - bool firstMSHit = false; - std::list<Trk::FitMeasurement*>::iterator m = measurements->begin(); - for ( ; m != measurements->end(); ++m) { - Amg::Vector3D position = (*m)->hasIntersection(FittedTrajectory) ? (*m)->intersection(FittedTrajectory).position(): (*m)->surface()->center() ; - Amg::Vector3D positionSurf = (*m)->surface()->center(); - if (!m_calorimeterVolume->inside(position) || !m_calorimeterVolume->inside(positionSurf)) { - if ((*m)->measurementBase()&&!firstMSHit) { - firstMSHit = true; - } - if ((*m)->isScatterer()&&!firstMSHit) haveLeadingMaterial = true; - } - } - if(! haveLeadingMaterial && firstMSHit) { // include leading material - unsigned int nmeas = measurements->size(); - m_materialAllocator->addLeadingMaterial(*measurements,particleHypothesis,*parameters); - msg(MSG::DEBUG) << " addLeadingMaterial in Muon Spectrometer nr meas before " << nmeas << " after " << measurements->size() << endmsg; - } + m_materialAllocator->addLeadingMaterial(*measurements,particleHypothesis,*parameters); // construct the fitted track