diff --git a/InnerDetector/InDetExample/InDetAlignExample/share/ElectronEoverPTracking.py b/InnerDetector/InDetExample/InDetAlignExample/share/ElectronEoverPTracking.py index 83083ddcf3278618a6326c2a9cd1d030a71e2996..e8fcde204bfe9782014ef50627904f53493c8157 100755 --- a/InnerDetector/InDetExample/InDetAlignExample/share/ElectronEoverPTracking.py +++ b/InnerDetector/InDetExample/InDetAlignExample/share/ElectronEoverPTracking.py @@ -168,14 +168,6 @@ GsfExtrapolator = Trk__GsfExtrapolator(name = 'GsfExtra ToolSvc += GsfExtrapolator -from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__BremFind -BremFind = Trk__BremFind(name = 'BremFind', - UseCalibration = True, - ValidationMode = True ) - - -ToolSvc += BremFind - from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GaussianSumFitter GSFTrackFitter = Trk__GaussianSumFitter(name = 'GSFTrackFitter', ToolForExtrapolation = GsfExtrapolator, @@ -186,8 +178,6 @@ GSFTrackFitter = Trk__GaussianSumFitter(name = 'GSFTrackFitte RefitOnMeasurementBase = True, DoHitSorting = True, ValidationMode = False, - BremFind = BremFind, - runBremFinder = False, OutputLevel = 3) # --- end of fitter loading ToolSvc += GSFTrackFitter diff --git a/InnerDetector/InDetMonitoring/InDetPerformanceMonitoring/share/ElectronEoverPTracking.py b/InnerDetector/InDetMonitoring/InDetPerformanceMonitoring/share/ElectronEoverPTracking.py index 9de3dd15492b83c611bf3e21069c5764f60dab59..50868637b9b5649fc379fbf7683f801fd721cbea 100755 --- a/InnerDetector/InDetMonitoring/InDetPerformanceMonitoring/share/ElectronEoverPTracking.py +++ b/InnerDetector/InDetMonitoring/InDetPerformanceMonitoring/share/ElectronEoverPTracking.py @@ -170,14 +170,6 @@ GsfExtrapolator = Trk__GsfExtrapolator(name = 'GsfExtra ToolSvc += GsfExtrapolator -from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__BremFind -BremFind = Trk__BremFind(name = 'BremFind', - UseCalibration = True, - ValidationMode = True ) - - -ToolSvc += BremFind - from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GaussianSumFitter GSFTrackFitter = Trk__GaussianSumFitter(name = 'GSFTrackFitter', ToolForExtrapolation = GsfExtrapolator, @@ -188,8 +180,6 @@ GSFTrackFitter = Trk__GaussianSumFitter(name = 'GSFTrackFitte RefitOnMeasurementBase = True, DoHitSorting = True, ValidationMode = False, - BremFind = BremFind, - runBremFinder = False, OutputLevel = 3) # --- end of fitter loading ToolSvc += GSFTrackFitter diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/BremFind.h b/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/BremFind.h deleted file mode 100644 index 5d549bab03fb4a9454c573798dded0ca9bdefe04..0000000000000000000000000000000000000000 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/BremFind.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -/******************************************************************************** - BremFind.h * description - -completed : Tuesday 18th November 2008 -author : Tony Shao -email : Qi.Tao.Shao@cern.ch -description : Class for finding brem points in the inner detector using the GSF -**********************************************************************************/ - -#ifndef Trk_BremFind_H -#define Trk_BremFind_H - -#include "TrkGaussianSumFilter/IBremsstrahlungFinder.h" - -#include "AthenaBaseComps/AthAlgTool.h" -#include "GaudiKernel/ToolHandle.h" -#include "GaudiKernel/ServiceHandle.h" - -#include "AthContainers/DataVector.h" -#include "TrkFitterUtils/FitterTypes.h" -#include "TrkParameters/TrackParameters.h" - -#include "TrkExInterfaces/IPropagator.h" -#include "TrkDetDescrInterfaces/ITrackingGeometrySvc.h" -#include "TrkGeometry/MagneticFieldProperties.h" - -#include "GeoPrimitives/GeoPrimitives.h" - -#include "StoreGate/ReadHandleKey.h" -#include "xAODEventInfo/EventInfo.h" - -#include <vector> - -//class ITrackingGeometrySvc; -class TTree; - -namespace Trk { - -class IMultiComponentStateCombiner; -class MultiComponentStateOnSurface; -class TrackStateOnSurface; -class EstimatedBremOnTrack; -class Layer; -class TrackingVolume; -class TrackingGeometry; -class EntryLayerProvider; -class AbstractVolume; -class Surface; -class QoverPBremFit; - -struct GraphParameter { - double constant; - std::vector<double> coefficient{}; - std::vector<double> value{}; - std::vector<double> width{}; -}; - -struct Element { - double value{}; - double width{}; - bool sign{}; -}; - - -#define TRKFGSF_VALSURFACES 100 -#define TRKGSF_VALSTATES 24 -#define POTENTIAL_BREM_THRESHOLD 0.0001 -#define MIN_KINK_THRESHOLD 0.005 -#define BREM_AMPLITUDE 1.0 //in GeV -#define BREM_SEPARATION 0.005 -#define COEFFICIENT_THRESHOLD 0.005 -#define BOUND_THRESHOLD 20.0 //in percentage - -class BremFind : public AthAlgTool, virtual public IBremsstrahlungFinder{ - public: - - BremFind(const std::string&, const std::string&, const IInterface*); - - virtual ~BremFind () {}; - - StatusCode initialize(); - - /** AlgTool finalise method */ - StatusCode finalize(); - - //Find the brem points from a forward and smooth track fit - virtual void BremFinder(const Trk::ForwardTrajectory&, const Trk::SmoothedTrajectory&); - - virtual void BremFinder(const Trk::ForwardTrajectory&, const Trk::SmoothedTrajectory&, bool); - - virtual void CombineParameters(); - - virtual void GetBremLocations(); - - virtual double GetBound(double, int); - - virtual double BremSignificance(double, QoverPBremFit*, QoverPBremFit*); - - virtual double GetPhiFromValue(double, QoverPBremFit*); - - virtual int ClosestMeasurement(double, QoverPBremFit*); - - virtual void CalibrateValue(); - - virtual const Surface* ClosestSurface(double, double, double, const TrackParameters&); - - virtual Amg::Vector3D SurfacePosition(const TrackParameters&, const Surface&, double, double, double); - - virtual StatusCode retrieveTrackingGeometry(); - - virtual int GetNBrems(); - - virtual void MakeTrackStateOnSurfaces (); - - virtual const TrackStateOnSurface* GetEstimatedBremOnTrack(int); - - - private: - - double Graph_value(GraphParameter, double); - - double GetMaximumX(GraphParameter, double, double); - - double GetMaximumY(GraphParameter, double, double); - - double UniqueAngle(double); - - void SeparationQuality(std::vector<double>*, std::vector<double>*); - - std::pair<double,double> ProbabilityScore(double, double, double, double); - - //defining the tools used in this package - ToolHandle<IMultiComponentStateCombiner> m_stateCombiner; - - ToolHandle<IPropagator> m_propagator; - MagneticFieldProperties m_fieldProperties; - - ServiceHandle<ITrackingGeometrySvc> m_trackingGeometrySvc; //!< Name of the TrackingGeometrySvc - std::string m_trackingGeometryName; //!< TrackingGeometry to be retrieved from DetectorStore - mutable const TrackingGeometry* m_trackingGeometry; //!< The underlying TrackingGeometry - - //Validation variables - - bool m_validationMode; - std::string m_validationTreeName; - std::string m_validationTreeName2; - std::string m_validationTreeDescription; - std::string m_validationTreeFolder; - std::string m_validationTreeFolder2; - - TTree* m_validationTree; - TTree* m_validationTree2; - - //Calibration option - bool m_useCalibration; - - //Propagation option - bool m_usePropagate; - - //Class variables - GraphParameter m_forwardparameters; - GraphParameter m_smoothedparameters; - GraphParameter m_combinedparameters; - - double m_perigee_1overP; - double m_perigee_Phi; - double m_perigee_Theta; - double m_perigee_d0; - double m_perigee_z0; - - std::vector<double> *m_brem_value; //could be R or Z; - std::vector<double> *m_brem_phi; - std::vector<double> *m_brem_theta; - std::vector<double> *m_brem_energy; - std::vector<double> *m_brem_UpperBound; - std::vector<double> *m_brem_LowerBound; - std::vector<double> *m_forward_kink; - std::vector<double> *m_smoothed_kink; - std::vector<double> *m_brem_significance; - std::vector<double> *m_brem_valueCalibrated; - std::vector<double> *m_surfaceX; - std::vector<double> *m_surfaceY; - std::vector<double> *m_surfaceZ; - - - int m_nBrems; - bool m_Z_mode; - - std::vector<const Trk::TrackStateOnSurface*> m_brem_trackStateOnSurface; - std::vector<const Trk::TrackParameters*> m_brem_TrackParameters; - std::vector<const Trk::EstimatedBremOnTrack*> m_EstimatedBremOnTrack; - std::vector<const Trk::Surface*> m_brem_surfaces; - std::vector<const Trk::Layer*> m_brem_layers; - std::vector<Amg::Vector3D> m_surface_positions; - - int m_event_ID; - double m_forwardparameter_constant; - std::vector<double> *m_forwardparameter_coefficient; - std::vector<double> *m_forwardparameter_value; - std::vector<double> *m_forwardparameter_width; - double m_smoothparameter_constant; - std::vector<double> *m_smoothparameter_coefficient; - std::vector<double> *m_smoothparameter_value; - std::vector<double> *m_smoothparameter_width; - - std::vector<double> *m_forward_1overP; - std::vector<double> *m_forward_1overPerr; - std::vector<double> *m_forward_value; - std::vector<double> *m_smooth_1overP; - std::vector<double> *m_smooth_1overPerr; - std::vector<double> *m_smooth_value; - - std::vector<double> *m_KinkSeparationScores; - std::vector<double> *m_KinkSeparationScoresErr; - - QoverPBremFit *m_forwardBremFit; - QoverPBremFit *m_smoothedBremFit; - - SG::ReadHandleKey<xAOD::EventInfo> m_readKey; - - }; - -} - -#endif diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/GaussianSumFitter.h b/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/GaussianSumFitter.h index 4665c9212f6533f603d480b5bcfbb89c742f222c..9c80d601ac973a40df7b2e04264c919dd0c364d6 100755 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/GaussianSumFitter.h +++ b/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/GaussianSumFitter.h @@ -40,7 +40,6 @@ class TrackFitInputPreparator; class IForwardGsfFitter; class IGsfSmoother; class Track; -class IBremsstrahlungFinder; #define TRKFGSF_VALSURFACES 100 #define TRKGSF_VALSTATES 24 @@ -139,19 +138,12 @@ class GaussianSumFitter : virtual public ITrackFitter, public AthAlgTool { bool m_makePerigee; PropDirection m_directionToPerigee; - - bool m_runBremFinder; - bool m_refitOnMeasurementBase; - bool m_doHitSorting; TrkParametersComparisonFunction* m_trkParametersComparisonFunction; std::vector<double> m_sortingReferencePoint; ToolHandle<IMultiComponentStateCombiner> m_stateCombiner; - ToolHandle<IBremsstrahlungFinder> m_BremFind; - ToolHandle<IBremsstrahlungFinder> m_BremFind2; - ServiceHandle<IChronoStatSvc> m_chronoSvc; TrackFitInputPreparator* m_inputPreparator; diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/IBremsstrahlungFinder.h b/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/IBremsstrahlungFinder.h deleted file mode 100644 index c54728fcfd8412c849cd66b5bafe70752ff535d9..0000000000000000000000000000000000000000 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/TrkGaussianSumFilter/IBremsstrahlungFinder.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -/********************************************************************************* - IBremsstrahlungFinder.h - description - --------------------------------------------- -created : Thursday 8th January 2009 -author : amorley -email : Anthony.Morley@cern.ch -description : Interface for bremsstrahlung finding using the GSF -*********************************************************************************/ - - -#ifndef Trk_IBremsstrahlungFinder_H -#define Trk_IBremsstrahlungFinder_H - -#include "GaudiKernel/IAlgTool.h" - -#include "TrkParameters/TrackParameters.h" -#include "TrkFitterUtils/FitterTypes.h" - -#include "GeoPrimitives/GeoPrimitives.h" - -namespace Trk{ - -class MultiComponentState; -class TrackStateOnSurface; -class Surface; -class QoverPBremFit; - - -//!< Interface ID for IBremsstrahlungFinder -static const InterfaceID IID_IBremsstrahlungFinder( "IBremsstrahlungFinder", 1, 0 ); - -class IBremsstrahlungFinder : virtual public IAlgTool{ - - public: - - //!< Virtual destructor - virtual ~IBremsstrahlungFinder(){}; - - //!< IAlgTool-AlgTool interface - static const InterfaceID& interfaceID() { return IID_IBremsstrahlungFinder; }; - - //Find the brem points from a forward and smooth track fit - virtual void BremFinder(const Trk::ForwardTrajectory&, const Trk::SmoothedTrajectory&) = 0; - - virtual void BremFinder(const Trk::ForwardTrajectory&, const Trk::SmoothedTrajectory&, bool) = 0; - - virtual void CombineParameters() = 0; - - virtual void GetBremLocations() = 0; - - virtual double GetBound(double, int) = 0; - - virtual double BremSignificance(double, QoverPBremFit*, QoverPBremFit*) = 0; - - virtual double GetPhiFromValue(double, QoverPBremFit*) = 0; - - virtual int ClosestMeasurement(double, QoverPBremFit*) = 0; - - virtual void CalibrateValue() = 0; - - virtual const Surface* ClosestSurface(double, double, double, const TrackParameters&) = 0; - - virtual Amg::Vector3D SurfacePosition(const TrackParameters&, const Surface&, double, double, double) = 0; - - virtual StatusCode retrieveTrackingGeometry() = 0; - - virtual int GetNBrems() = 0; - - virtual void MakeTrackStateOnSurfaces () = 0; - - virtual const TrackStateOnSurface* GetEstimatedBremOnTrack(int) = 0; - -}; - -} // end Trk namespace - -#endif diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/src/BremFind.cxx b/Tracking/TrkFitter/TrkGaussianSumFilter/src/BremFind.cxx deleted file mode 100644 index 88733889ac8814888cee8ebf807088822d53bcb0..0000000000000000000000000000000000000000 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/src/BremFind.cxx +++ /dev/null @@ -1,1001 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -/******************************************************************************** - BremFind.cxx * description - -completed : Tuesday 18th November 2008 -author : Tony Shao -email : Qi.Tao.Shao@cern.ch -description : Class for finding brem points in the inner detector using the GSF -**********************************************************************************/ - - - -#include "TrkGaussianSumFilter/BremFind.h" -#include "QoverPBremFit.h" - -#include <math.h> -#include "TMath.h" - -#include "TrkGaussianSumFilter/IMultiComponentStateCombiner.h" - -#include "TrkMultiComponentStateOnSurface/MultiComponentStateOnSurface.h" -#include "TrkParameters/TrackParameters.h" - -#include "TrkTrack/Track.h" -#include "TrkMaterialOnTrack/EstimatedBremOnTrack.h" - -#include "TrkGeometry/Layer.h" -#include "TrkGeometry/TrackingVolume.h" -#include "TrkGeometry/TrackingGeometry.h" -#include "TrkGeometry/MagneticFieldProperties.h" - -#include "TrkVolumes/AbstractVolume.h" -#include "TrkSurfaces/Surface.h" -#include "TrkSurfaces/CylinderSurface.h" - -#include "GaudiKernel/ITHistSvc.h" - -#include "TTree.h" - - - -Trk::BremFind::BremFind(const std::string& type, const std::string& name, const IInterface* parent): - AthAlgTool(type, name, parent), - m_stateCombiner("Trk::MultiComponentStateCombiner"), - m_propagator("Trk::IntersectorWrapper/IntersectorWrapper"), - //m_fieldProperties - m_trackingGeometrySvc("TrackingGeometrySvc","AtlasTrackingGeometrySvc"), - m_trackingGeometryName("AtlasTrackingGeometry"), - m_trackingGeometry(nullptr), - //m_validationMode - m_validationTreeName("BremInfo"), - m_validationTreeName2("BremInfoZ"), - m_validationTreeDescription("Brem Information"), - m_validationTreeFolder("/valGSF2/BremInfo"), - m_validationTreeFolder2("/valGSF2/BremInfoZ"), - m_validationTree(nullptr), - m_validationTree2(nullptr), - //m_useCalibration{}, - //m_usePropagate{}, - m_forwardparameters{}, - m_smoothedparameters{}, - m_combinedparameters{}, - m_perigee_1overP{}, - m_perigee_Phi{}, - m_perigee_Theta{}, - m_perigee_d0{}, - m_perigee_z0{}, - m_brem_value{}, - m_brem_phi{}, - m_brem_theta{}, - m_brem_energy{}, - m_brem_UpperBound{}, - m_brem_LowerBound{}, - m_forward_kink{}, - m_smoothed_kink{}, - m_brem_significance{}, - m_brem_valueCalibrated{}, - m_surfaceX{}, - m_surfaceY{}, - m_surfaceZ{}, - m_nBrems{}, - m_Z_mode{}, - //vectors could be initialised here - m_event_ID{}, - m_forwardparameter_constant{}, - m_forwardparameter_coefficient{}, - m_forwardparameter_value{}, - m_forwardparameter_width{}, - m_smoothparameter_constant{}, - m_smoothparameter_coefficient{}, - m_smoothparameter_value{}, - m_smoothparameter_width{}, - m_forward_1overP{}, - m_forward_1overPerr{}, - m_forward_value{}, - m_smooth_1overP{}, - m_smooth_1overPerr{}, - m_smooth_value{}, - m_KinkSeparationScores{}, - m_KinkSeparationScoresErr{}, - m_forwardBremFit{}, - m_smoothedBremFit{} -{ - declareInterface<IBremsstrahlungFinder>(this); - //jobOptions Variables - declareProperty("StateCombiner", m_stateCombiner ); - declareProperty("TrackingGeometrySvc", m_trackingGeometrySvc); - declareProperty("Propagator", m_propagator); - declareProperty("UseCalibration", m_useCalibration=true); - declareProperty("ValidationMode", m_validationMode=false); - declareProperty("UseSurfacePropagation", m_usePropagate=false); - declareProperty("TreeFolderName", m_validationTreeFolder); - declareProperty("TreeFolderName2", m_validationTreeFolder2); - declareProperty("EventInfoKey", m_readKey = "EventInfo"); -} - - -StatusCode Trk::BremFind::initialize() -{ - // The TrackingGeometrySvc ------------------------------------------------------ - ATH_CHECK (m_trackingGeometrySvc.retrieve()); - - msg(MSG::DEBUG) << "Retrieved service " << m_trackingGeometrySvc << endmsg; - m_trackingGeometryName = m_trackingGeometrySvc->trackingGeometryName(); - - - // Request the state combiner - ATH_CHECK ( m_stateCombiner.retrieve() ); - - //Retrieve the propagator - ATH_CHECK (m_propagator.retrieve()); - - m_fieldProperties= Trk::MagneticFieldProperties(Trk::FullField); - - - - //The Validation step ---------------------------------------------------------- - - if (m_validationMode) { - - if (not m_validationTree) { - //Crate a new tree if there doesn't exist one already - m_validationTree = new TTree( m_validationTreeName.c_str(), m_validationTreeDescription.c_str() ); - - - m_validationTree->Branch("nBrems" , &m_nBrems, "nBrems/I"); - m_validationTree->Branch("Brem_Radii", &m_brem_value); - m_validationTree->Branch("Brem_Phi", &m_brem_phi); - m_validationTree->Branch("Brem_Theta", &m_brem_theta); - m_validationTree->Branch("Brem_Energy", &m_brem_energy); - m_validationTree->Branch("Brem_UpperBound", &m_brem_UpperBound); - m_validationTree->Branch("Brem_LowerBound", &m_brem_LowerBound); - m_validationTree->Branch("Forward_Kink", &m_forward_kink); - m_validationTree->Branch("Backward_Kink", &m_smoothed_kink); - m_validationTree->Branch("Brem_Significance", &m_brem_significance); - m_validationTree->Branch("Brem_RadiiCalibrated", &m_brem_valueCalibrated); - m_validationTree->Branch("SurfaceX", &m_surfaceX); - m_validationTree->Branch("SurfaceY", &m_surfaceY); - m_validationTree->Branch("SurfaceZ", &m_surfaceZ); - m_validationTree->Branch("EventID" , &m_event_ID, "EventID/I"); - m_validationTree->Branch("ForwardParameterConstant", &m_forwardparameter_constant,"ForwardParameterConstant/D"); - m_validationTree->Branch("SmoothParameterConstant", &m_smoothparameter_constant,"SmoothParameterConstant/D"); - m_validationTree->Branch("ForwardParameterCoefficient", &m_forwardparameter_coefficient); - m_validationTree->Branch("ForwardParameterRadii", &m_forwardparameter_value); - m_validationTree->Branch("ForwardParameterWidth", &m_forwardparameter_width); - m_validationTree->Branch("SmoothParameterCoefficient", &m_smoothparameter_coefficient); - m_validationTree->Branch("SmoothParameterRadii", &m_smoothparameter_value); - m_validationTree->Branch("SmoothParameterWidth", &m_smoothparameter_width); - m_validationTree->Branch("Forward1overP", &m_forward_1overP); - m_validationTree->Branch("Forward1overPerr", &m_forward_1overPerr); - m_validationTree->Branch("ForwardRadii", &m_forward_value); - m_validationTree->Branch("Smooth1overP", &m_smooth_1overP); - m_validationTree->Branch("Smooth1overPerr", &m_smooth_1overPerr); - m_validationTree->Branch("SmoothRadii", &m_smooth_value); - m_validationTree->Branch("SeparationQuality", &m_KinkSeparationScores); - m_validationTree->Branch("SeparationQualityErr", &m_KinkSeparationScoresErr); - - } - - - - - if (not m_validationTree2) { - //Crate a new tree if there doesn't exist one already - m_validationTree2 = new TTree( m_validationTreeName2.c_str(), m_validationTreeDescription.c_str() ); - - - m_validationTree2->Branch("nBrems" , &m_nBrems, "nBrems/I"); - m_validationTree2->Branch("Brem_Z", &m_brem_value); - m_validationTree2->Branch("Brem_Phi", &m_brem_phi); - m_validationTree2->Branch("Brem_Theta", &m_brem_theta); - m_validationTree2->Branch("Brem_Energy", &m_brem_energy); - m_validationTree2->Branch("Brem_UpperBound", &m_brem_UpperBound); - m_validationTree2->Branch("Brem_LowerBound", &m_brem_LowerBound); - m_validationTree2->Branch("Forward_Kink", &m_forward_kink); - m_validationTree2->Branch("Backward_Kink", &m_smoothed_kink); - m_validationTree2->Branch("Brem_Significance", &m_brem_significance); - m_validationTree2->Branch("Brem_ZCalibrated", &m_brem_valueCalibrated); - m_validationTree2->Branch("SurfaceX", &m_surfaceX); - m_validationTree2->Branch("SurfaceY", &m_surfaceY); - m_validationTree2->Branch("SurfaceZ", &m_surfaceZ); - m_validationTree2->Branch("EventID" , &m_event_ID, "EventID/I"); - m_validationTree2->Branch("ForwardParameterConstant", &m_forwardparameter_constant,"ForwardParameterConstant/D"); - m_validationTree2->Branch("SmoothParameterConstant", &m_smoothparameter_constant,"SmoothParameterConstant/D"); - m_validationTree2->Branch("ForwardParameterCoefficient", &m_forwardparameter_coefficient); - m_validationTree2->Branch("ForwardParameterZ", &m_forwardparameter_value); - m_validationTree2->Branch("ForwardParameterWidth", &m_forwardparameter_width); - m_validationTree2->Branch("SmoothParameterCoefficient", &m_smoothparameter_coefficient); - m_validationTree2->Branch("SmoothParameterZ", &m_smoothparameter_value); - m_validationTree2->Branch("SmoothParameterWidth", &m_smoothparameter_width); - m_validationTree2->Branch("Forward1overP", &m_forward_1overP); - m_validationTree2->Branch("Forward1overPerr", &m_forward_1overPerr); - m_validationTree2->Branch("ForwardZ", &m_forward_value); - m_validationTree2->Branch("Smooth1overP", &m_smooth_1overP); - m_validationTree2->Branch("Smooth1overPerr", &m_smooth_1overPerr); - m_validationTree2->Branch("SmoothZ", &m_smooth_value); - m_validationTree2->Branch("SeparationQuality", &m_KinkSeparationScores); - m_validationTree2->Branch("SeparationQualityErr", &m_KinkSeparationScoresErr); - - } - - - //register the Tree - ITHistSvc* tHistSvc = 0; - if (service("THistSvc",tHistSvc).isFailure()) { - msg(MSG::ERROR) << "initialize() Could not find Hist Service -> Switching ValidationMode Off !" << endmsg; - delete m_validationTree; - delete m_validationTree2; - m_validationTree=0; - m_validationTree2=0; - } - if ((tHistSvc->regTree(m_validationTreeFolder, m_validationTree)).isFailure()) { - msg(MSG::ERROR)<<"initialize() Could not register the validation Tree -> Switching ValidationMode off !" << endmsg; - delete m_validationTree; - m_validationTree = 0; - } - if ((tHistSvc->regTree(m_validationTreeFolder2, m_validationTree2)).isFailure()) { - msg(MSG::ERROR)<<"initialize() Could not register the validation Tree 2 -> Switching ValidationMode off !" << endmsg; - delete m_validationTree2; - m_validationTree2 = 0; - } - - } - - //---------------------------- end of validation mode ------------------------------------ - - - ATH_CHECK( m_readKey.initialize() ); - - ATH_MSG_DEBUG( "Initialisation of " << name() << " was successful" ); - - return StatusCode::SUCCESS; - -} - - -StatusCode Trk::BremFind::finalize(){ - - ATH_MSG_DEBUG( "Finalisation of " << name() << " was successful" ); - - return StatusCode::SUCCESS; - -} - -void Trk::BremFind::BremFinder(const Trk::ForwardTrajectory& forwardTrajectory, const Trk::SmoothedTrajectory& smoothedTrajectory) { - BremFinder(forwardTrajectory, smoothedTrajectory, false); -} - -void Trk::BremFind::BremFinder(const Trk::ForwardTrajectory& forwardTrajectory, const Trk::SmoothedTrajectory& smoothedTrajectory, bool Z_mode) -{ - m_Z_mode = Z_mode; - - if (!m_trackingGeometry) - retrieveTrackingGeometry(); - - - msg(MSG::DEBUG) << "Entering BremFinder Function " << endmsg; - - m_brem_value = new std::vector<double>; - m_brem_phi = new std::vector<double>; - m_brem_theta = new std::vector<double>; - m_brem_energy = new std::vector<double>; - m_brem_UpperBound = new std::vector<double>; - m_brem_LowerBound = new std::vector<double>; - m_forward_kink = new std::vector<double>; - m_smoothed_kink = new std::vector<double>; - m_brem_significance = new std::vector<double>; - m_brem_valueCalibrated = new std::vector<double>; - m_surfaceX = new std::vector<double>; - m_surfaceY = new std::vector<double>; - m_surfaceZ = new std::vector<double>; - m_brem_trackStateOnSurface.clear(); - m_EstimatedBremOnTrack.clear(); - m_brem_TrackParameters.clear(); - m_brem_surfaces.clear(); - m_brem_layers.clear(); - m_surface_positions.clear(); - - m_forwardparameter_coefficient = new std::vector<double>; - m_forwardparameter_value = new std::vector<double>; - m_forwardparameter_width = new std::vector<double>; - m_smoothparameter_coefficient = new std::vector<double>; - m_smoothparameter_value = new std::vector<double>; - m_smoothparameter_width = new std::vector<double>; - m_forward_1overP = new std::vector<double>; - m_forward_1overPerr = new std::vector<double>; - m_forward_value = new std::vector<double>; - m_smooth_1overP = new std::vector<double>; - m_smooth_1overPerr = new std::vector<double>; - m_smooth_value = new std::vector<double>; - m_KinkSeparationScores = new std::vector<double>; - m_KinkSeparationScoresErr = new std::vector<double>; - - - //Obtain the parameters of the Tanh fit for both forward and smooth trajectories - m_forwardBremFit = new QoverPBremFit(1,m_Z_mode); - m_forwardparameters = m_forwardBremFit->GetParameters(forwardTrajectory); - m_smoothedBremFit = new QoverPBremFit(-1,m_Z_mode); - m_smoothedparameters = m_smoothedBremFit->GetParameters(smoothedTrajectory); - //GetPerigee functions will only make sense when using the smoothed trajectory - m_perigee_1overP = m_smoothedBremFit->GetPerigee_1overP(); - m_perigee_Phi = m_smoothedBremFit->GetPerigee_Phi(); - m_perigee_Theta = m_smoothedBremFit->GetPerigee_Theta(); - m_perigee_d0 = m_smoothedBremFit->GetPerigee_d0(); - m_perigee_z0 = m_smoothedBremFit->GetPerigee_z0(); - - - CombineParameters(); - - GetBremLocations(); - - m_nBrems = m_brem_value->size(); - - for (int bound_counter(0); bound_counter < (int) m_brem_value->size(); bound_counter++) { - m_brem_UpperBound->push_back(GetBound((*m_brem_value)[bound_counter],1)); - m_brem_LowerBound->push_back(GetBound((*m_brem_value)[bound_counter],-1)); - m_brem_significance->push_back(BremSignificance((*m_brem_value)[bound_counter],m_forwardBremFit,m_smoothedBremFit)); - } - - //Calibration of the brem value - if (m_useCalibration) { - CalibrateValue(); - } - else { - for (int copy_counter(0); copy_counter < (int) m_brem_value->size(); copy_counter++) { - m_brem_valueCalibrated->push_back((*m_brem_value)[copy_counter]); - } - } - - for (int fill_counter(0); fill_counter < (int) m_brem_value->size(); fill_counter++) { - m_brem_theta->push_back(m_perigee_Theta); - m_brem_phi->push_back(GetPhiFromValue((*m_brem_valueCalibrated)[fill_counter],m_smoothedBremFit)); - } - - //double closest_floorF,closest_floorS; - //int closestSurfaceNoF(0); - int closestSurfaceNoS(0); - - for (int brem_counter2(0); brem_counter2 < (int) m_brem_value->size(); brem_counter2++) { - - //The closest measurement numbers to the brem location - //closestSurfaceNoF=ClosestMeasurement((*m_brem_valueCalibrated)[brem_counter2],m_forwardBremFit); - closestSurfaceNoS=ClosestMeasurement((*m_brem_valueCalibrated)[brem_counter2],m_smoothedBremFit); - - //closest_floorF = m_forwardBremFit->GetValue(closestSurfaceNoF); - //closest_floorS = m_smoothedBremFit->GetValue(closestSurfaceNoS); - - //Filling the associated surfaces for each brem - const Trk::TrackParameters* closestTrackParameters = m_smoothedBremFit->GetTrackParameters(closestSurfaceNoS); - m_brem_surfaces.push_back(ClosestSurface((*m_brem_value)[brem_counter2],(*m_brem_phi)[brem_counter2],(*m_brem_theta)[brem_counter2],*closestTrackParameters)); - - m_surface_positions.push_back(SurfacePosition(*closestTrackParameters,*m_brem_surfaces[brem_counter2],(*m_brem_value)[brem_counter2],(*m_brem_phi)[brem_counter2],(*m_brem_theta)[brem_counter2])); - - - m_surfaceX->push_back(m_surface_positions[brem_counter2].x()); - m_surfaceY->push_back(m_surface_positions[brem_counter2].y()); - m_surfaceZ->push_back(m_surface_positions[brem_counter2].z()); - - - } - - double remaining_energy(1/m_perigee_1overP); - - - //This loop fills the EstimatedBremOnTrack vector - - for (int brem_counter(0); brem_counter < (int) m_brem_value->size(); brem_counter++) { - - - Trk::EstimatedBremOnTrack *estimatedBremOnTrack(0); - remaining_energy -= (*m_brem_energy)[brem_counter]; - double retainedEnFraction(remaining_energy*m_perigee_1overP); - - double sigma1overPsquared(m_smoothedBremFit->Get1overPerror(0)); - - - if (m_brem_layers[brem_counter] && m_brem_surfaces[brem_counter] && m_brem_TrackParameters[brem_counter]) { - estimatedBremOnTrack = new EstimatedBremOnTrack(m_brem_layers[brem_counter]->thickness(), - retainedEnFraction,0.0, - sigma1overPsquared, - //*m_brem_surfaces[brem_counter], - *m_brem_TrackParameters[brem_counter]->associatedSurface().clone(), - bothway); - - } - - m_EstimatedBremOnTrack.push_back(estimatedBremOnTrack); - - } - - //Creates a vector of TrackStateOnSurface - MakeTrackStateOnSurfaces(); - - - //* Retrieve the event info for later syncrinization - SG::ReadHandle< xAOD::EventInfo> eventInfo (m_readKey); - if (!eventInfo.isValid()) { - msg(MSG::ERROR) << "Could not retrieve event info" << endmsg; - } - - m_event_ID = eventInfo->eventNumber(); - - //Fill the TanH coefficients and graph values - for (int forward_fill(0); forward_fill < (int) m_forwardparameters.coefficient.size(); forward_fill++) { - m_forwardparameter_coefficient->push_back(m_forwardparameters.coefficient[forward_fill]); - m_forwardparameter_value->push_back(m_forwardparameters.value[forward_fill]); - m_forwardparameter_width->push_back(m_forwardparameters.width[forward_fill]); - } - - for (int smooth_fill(0); smooth_fill < (int) m_smoothedparameters.coefficient.size(); smooth_fill++) { - m_smoothparameter_coefficient->push_back(m_smoothedparameters.coefficient[smooth_fill]); - m_smoothparameter_value->push_back(m_smoothedparameters.value[smooth_fill]); - m_smoothparameter_width->push_back(m_smoothedparameters.width[smooth_fill]); - } - - for (int forwardgraph_fill(0); forwardgraph_fill < m_forwardBremFit->GetnSurfaces(); forwardgraph_fill++) { - m_forward_1overP->push_back(m_forwardBremFit->Get1overP(forwardgraph_fill)); - m_forward_1overPerr->push_back(m_forwardBremFit->Get1overPerror(forwardgraph_fill)); - m_forward_value->push_back(m_forwardBremFit->GetValue(forwardgraph_fill)); - } - - for (int smoothgraph_fill(0); smoothgraph_fill < m_smoothedBremFit->GetnSurfaces(); smoothgraph_fill++) { - m_smooth_1overP->push_back(m_smoothedBremFit->Get1overP(smoothgraph_fill)); - m_smooth_1overPerr->push_back(m_smoothedBremFit->Get1overPerror(smoothgraph_fill)); - m_smooth_value->push_back(m_smoothedBremFit->GetValue(smoothgraph_fill)); - } - - m_forwardparameter_constant = m_forwardparameters.constant; - m_smoothparameter_constant = m_smoothedparameters.constant; - - //Calculate the SeparationQuality - - SeparationQuality(m_smoothed_kink,m_forward_kink); - - if (m_validationTree && !m_Z_mode) - m_validationTree->Fill(); - else if (m_validationTree2 && m_Z_mode) - m_validationTree2->Fill(); - - delete m_brem_value; - delete m_brem_phi; - delete m_brem_theta; - delete m_brem_energy; - delete m_brem_UpperBound; - delete m_brem_LowerBound; - delete m_forward_kink; - delete m_smoothed_kink; - delete m_brem_significance; - delete m_brem_valueCalibrated; - delete m_surfaceX; - delete m_surfaceY; - delete m_surfaceZ; - - delete m_forwardBremFit; - delete m_smoothedBremFit; - - - delete m_forwardparameter_coefficient; - delete m_forwardparameter_value; - delete m_forwardparameter_width; - delete m_smoothparameter_coefficient; - delete m_smoothparameter_value; - delete m_smoothparameter_width; - delete m_forward_1overP; - delete m_forward_1overPerr; - delete m_forward_value; - delete m_smooth_1overP; - delete m_smooth_1overPerr; - delete m_smooth_value; - delete m_KinkSeparationScores; - delete m_KinkSeparationScoresErr; - - -} - -void Trk::BremFind::CombineParameters() -{ - //Firstly clear all previous entries - m_combinedparameters.coefficient.clear(); - m_combinedparameters.width.clear(); - m_combinedparameters.value.clear(); - - //The combined graph is the backward fit - forward fit - m_combinedparameters.constant = m_smoothedparameters.constant - m_forwardparameters.constant; - - for (int forward_counter(0); forward_counter < (int) m_forwardparameters.value.size(); forward_counter++) { - m_combinedparameters.coefficient.push_back(-m_forwardparameters.coefficient[forward_counter]); - m_combinedparameters.value.push_back(m_forwardparameters.value[forward_counter]); - m_combinedparameters.width.push_back(m_forwardparameters.width[forward_counter]); - } - - for (int smooth_counter(0); smooth_counter < (int) m_smoothedparameters.value.size(); smooth_counter++) { - m_combinedparameters.coefficient.push_back(m_smoothedparameters.coefficient[smooth_counter]); - m_combinedparameters.value.push_back(m_smoothedparameters.value[smooth_counter]); - m_combinedparameters.width.push_back(m_smoothedparameters.width[smooth_counter]); - } - -} - - -//This function returns the value of the tanh series at position x -double Trk::BremFind::Graph_value(GraphParameter graphparameter, double x) -{ - double arg = graphparameter.constant; - - for (int arg_counter(0); arg_counter < (int) graphparameter.value.size(); arg_counter++) { - arg+=graphparameter.coefficient[arg_counter]*TMath::TanH(x/graphparameter.width[arg_counter] - graphparameter.value[arg_counter]/graphparameter.width[arg_counter]); - } - return arg; - -} - -//Returns the x value of the local maximum between the min and max terms -double Trk::BremFind::GetMaximumX(GraphParameter graphparameter, double min, double max) -{ - double value(0); - double maximum(0); - double eval(0); - for (double value_counter(min); value_counter < max; value_counter++) { - eval=Graph_value(graphparameter, value_counter); - - if (eval > maximum) { - maximum=eval; - value=value_counter; - } - - } - return value; -} - -//Returns the y value of the local maximum between the min and max terms -double Trk::BremFind::GetMaximumY(GraphParameter graphparameter, double min, double max) -{ - double maximum(0); - double eval(0); - for (double value_counter(min); value_counter < max; value_counter++) { - eval=Graph_value(graphparameter, value_counter); - if (eval > maximum) { - maximum = eval; - } - } - return maximum; -} - - -void Trk::BremFind::GetBremLocations() -{ - bool double_back_boolean=false; - //Normalisation factor introduced because initial parameters were chosen and optimised - //for 10GeV Pt electrons. So the normalization factor for 10GeV events will be 1.0 - - double P_T(sin(m_perigee_Theta)*(1/(m_perigee_1overP))); - - double normalisation(P_T/10.0); - - for (int smooth_counter(0); smooth_counter < (int) m_smoothedparameters.value.size(); smooth_counter++) { - double_back_boolean=false; - - for (int forward_counter(0); forward_counter < (int) m_forwardparameters.value.size(); forward_counter++) { - - //backward kink must have a value lower than the forward kink - if (m_forwardparameters.value[forward_counter] < m_smoothedparameters.value[smooth_counter]) { - continue; - } - - //If there are multiple back kinks before the forward kink, then the back kinks must - //iterate forward until it's just before the forward kink - //Therefore the forward loop is broken to iterate the smooth_counter - if ((smooth_counter+1 < (int) m_smoothedparameters.value.size()) ) { - if (m_forwardparameters.value[forward_counter] > m_smoothedparameters.value[smooth_counter+1] && m_smoothedparameters.coefficient[smooth_counter+1]/sin(m_perigee_Theta) > (MIN_KINK_THRESHOLD/normalisation)) { - double_back_boolean=true; - } - } - - if (double_back_boolean) { - break; - } - - //If forward kink is just in front of the backward kink then proceed to find the brem value - else if (m_forwardparameters.value[forward_counter] > m_smoothedparameters.value[smooth_counter]) { - - double brem_separation( GetMaximumY(m_combinedparameters, m_smoothedparameters.value[smooth_counter], m_forwardparameters.value[forward_counter])/sin(m_perigee_Theta) ); - - - //Calculates the energy of the brem based on the change in momentum in the - //1overP parameter - double coefficient_average( (m_forwardparameters.coefficient[forward_counter]+m_smoothedparameters.coefficient[smooth_counter])/(2*m_perigee_Theta) ); - double p_before_bremF( Graph_value(m_forwardparameters, m_forwardparameters.value[forward_counter] - 2*m_forwardparameters.width[forward_counter])/m_perigee_Theta ); - double p_before_bremS( Graph_value(m_smoothedparameters, m_smoothedparameters.value[smooth_counter] - 2*m_smoothedparameters.width[smooth_counter])/m_perigee_Theta ); - double p_before_bremAverage( (p_before_bremF + p_before_bremS)/2 ); - double p_after_brem( p_before_bremAverage + 2*coefficient_average ); - double brem_amplitude( 1/p_before_bremAverage - 1/p_after_brem ); - - - //Check the strength of the brem and its coefficients - if (brem_amplitude > (BREM_AMPLITUDE*normalisation) && brem_separation > (BREM_SEPARATION/normalisation) && m_forwardparameters.coefficient[forward_counter]/sin(m_perigee_Theta) > (COEFFICIENT_THRESHOLD/normalisation) && m_smoothedparameters.coefficient[smooth_counter]/sin(m_perigee_Theta) > (COEFFICIENT_THRESHOLD/normalisation)) { - - m_brem_energy->push_back(brem_amplitude); - m_brem_value->push_back( GetMaximumX(m_combinedparameters,m_smoothedparameters.value[smooth_counter],m_forwardparameters.value[forward_counter]) ); - m_forward_kink->push_back(m_forwardparameters.value[forward_counter]); - m_smoothed_kink->push_back(m_smoothedparameters.value[smooth_counter]); - - break; - } - - } - - } - - } - -} - -//This function obtains the upper and lower bounds of the brem value by scanning the peak -//till there's a drop in magnitude equal to the desired threshold. If type=1 then, this -//function will return an upperbound. If type=-1, then this function will return the lower -//bound. Threshold must be used as a percentage in drop from the maximum Y value. -double Trk::BremFind::GetBound(double start, int type) -{ - double maximum(Graph_value(m_combinedparameters,start)); - double eval(maximum); - double value(start); - - while (eval > ((100.0-BOUND_THRESHOLD)/100.0)*maximum) { - eval = Graph_value(m_combinedparameters,value); - value+=type; - - //if the value is above the end of the inner detector - if (value > m_smoothedBremFit->LastFitMeasurement()) { - return m_smoothedBremFit->LastFitMeasurement(); - } - //if the value is below zero, then return 0 as the lower bound - if (value < 0.0) { - return 0.0; - } - } - - return value; -} - -int Trk::BremFind::ClosestMeasurement(double x, QoverPBremFit *BremFit) -{ - double min_distance(1000); - double distance(1000); - //double value(x); - int measurement_no(0); - - for (int counter(0); counter < BremFit->GetNMeasurements(); counter++) { - distance = fabs(x - BremFit->GetValue(counter)); - if (distance < min_distance) { - min_distance = distance; - //value = BremFit->GetValue(counter); - measurement_no = counter; - } - } - return measurement_no; -} - -double Trk::BremFind::BremSignificance(double x,QoverPBremFit *forwardBremFit, QoverPBremFit *smoothedBremFit) -{ - int measurement_noF( ClosestMeasurement(x, forwardBremFit) ); - double PiF( 1/forwardBremFit->Get1overP(measurement_noF) ); - - //Making sure the next measurement is not on the same surface - int additional_forward(1); - double value1F( forwardBremFit->GetValue(measurement_noF+1) ); - while (fabs(x-value1F) < 20.0) { - additional_forward++; - value1F = forwardBremFit->GetValue(measurement_noF + additional_forward); - } - double Pi1F( 1/forwardBremFit->Get1overP(measurement_noF+1) ); - - - int measurement_noS( ClosestMeasurement(x, smoothedBremFit) ); - double PiS( 1/smoothedBremFit->Get1overP(measurement_noS) ); - - int additional_smoothed(1); - double value1S( smoothedBremFit->GetValue(measurement_noS-1) ); - while (fabs(x-value1S) < 20.0){ - additional_smoothed++; - value1S = smoothedBremFit->GetValue(measurement_noS - additional_smoothed); - } - double Pi1S( 1/smoothedBremFit->Get1overP(measurement_noS-1) ); - - double sigf( (1-(Pi1F/PiF))/forwardBremFit->Get1overPerror(measurement_noF) ); - double sigb( (1-(PiS/Pi1S))/smoothedBremFit->Get1overPerror(measurement_noS) ); - - double sigsum( sigf + sigb); - - return std::max(sigsum, std::max(sigf,sigb)); -} - -//This function provides an estimate of the phi position using the value -//The smoothed trajectory is used because it is more accurate in the pixels -//where the majority of brems occur -double Trk::BremFind::GetPhiFromValue(double value, QoverPBremFit* smoothedBremFit) -{ - int closest_measurement_no( ClosestMeasurement(value, smoothedBremFit) ); - - double value_difference; - double phi_difference; - - if (closest_measurement_no == 0) { - value_difference = smoothedBremFit->GetValue(closest_measurement_no) - smoothedBremFit->GetValue(closest_measurement_no + 1); - phi_difference = smoothedBremFit->GetPhi(closest_measurement_no) - smoothedBremFit->GetPhi(closest_measurement_no + 1); - } - - else { - value_difference = smoothedBremFit->GetValue(closest_measurement_no) - smoothedBremFit->GetValue(closest_measurement_no - 1); - phi_difference = smoothedBremFit->GetPhi(closest_measurement_no) - smoothedBremFit->GetPhi(closest_measurement_no - 1); - } - - double gradient( phi_difference/value_difference ); - double estimated_phi; - if (closest_measurement_no == 0) - estimated_phi = smoothedBremFit->GetPhi(closest_measurement_no+1) + gradient*(value - smoothedBremFit->GetValue(closest_measurement_no + 1)); - else - estimated_phi = smoothedBremFit->GetPhi(closest_measurement_no-1) + gradient*(value - smoothedBremFit->GetValue(closest_measurement_no - 1)); - - return estimated_phi; - -} - -void Trk::BremFind::CalibrateValue() -{ - double new_value(0); - double max_value_measurement(m_smoothedBremFit->LastFitMeasurement()); - double min_value_measurement(m_smoothedBremFit->FirstFitMeasurement()); - - - for (int counter(0); counter < (int) m_brem_value->size(); counter++) { - - double smoothed_kink((*m_smoothed_kink)[counter]); - double forward_kink((*m_forward_kink)[counter]); - new_value = ((max_value_measurement - min_value_measurement)-((*m_brem_value)[counter]-min_value_measurement))*smoothed_kink/(max_value_measurement-min_value_measurement); - new_value += ((*m_brem_value)[counter]-min_value_measurement)*forward_kink/(max_value_measurement-min_value_measurement); - m_brem_valueCalibrated->push_back( new_value ); - } -} - - -//This function uses the closest measurement trackparameter and propagates to the brem surface -//and returns the global position at the intersection. It also fills a vector of trackparameters -//at the brem surface. -Amg::Vector3D Trk::BremFind::SurfacePosition(const Trk::TrackParameters& trackparameter, const Trk::Surface& surface, double bremvalue, double bremphi, double bremtheta) -{ - const Trk::TrackParameters* surfaceParameters1; - const Trk::TrackParameters* surfaceParameters2; - - Amg::Vector3D Pos1 (0, 0, 0); - Amg::Vector3D Pos2 (0, 0, 0); - double phidifference1(0.), phidifference2(0.); - - //Pushing back just the global position of the brem not the extrapolated - double x,y,z,r; - if (m_Z_mode) { - x = bremvalue * tan(bremtheta) * cos(bremphi); - y = bremvalue * tan(bremtheta) * sin(bremphi); - z = bremvalue; - r = sqrt(x*x+y*y); - } - else { - x = bremvalue * cos(bremphi); - y = bremvalue * sin(bremphi); - z = bremvalue * cos(bremtheta); - r = bremvalue; - } - - const Amg::Vector3D position(x,y,z); - const Amg::Vector3D momentum((&trackparameter)->momentum()); - - ATH_MSG_DEBUG("x,y,z,r = " << x << "," << y << "," << z << "," << r); - ATH_MSG_DEBUG("momentum = " << momentum.mag()); - ATH_MSG_DEBUG("charge = " << (&trackparameter)->charge()); - - if (!m_usePropagate && momentum.mag() > 0) { - - Amg::Transform3D *trans = new Amg::Transform3D(trackparameter.associatedSurface().transform()); - Trk::CylinderSurface cylinderSurface(trans, r, 5000.0); - const Trk::TrackParameters *bremParameters = new AtaCylinder(position, momentum, (&trackparameter)->charge(), cylinderSurface); - - //Broken code - causes FPEs. - //Trk::CylinderSurface cylinderSurface(new Amg::Transform3D, r, 5000.0); - - m_brem_TrackParameters.push_back(bremParameters); - return position; - } - - //function will propagate both ways and return the trackparameter that has the closest phi - //to the measured brem phi angle - surfaceParameters1 = m_propagator->propagate(trackparameter,surface,Trk::oppositeMomentum,true,m_fieldProperties,electron); - if (surfaceParameters1) { - Pos1 = surfaceParameters1->position(); - double phi1(atan(Pos1.y()/Pos1.x())); - phidifference1 = UniqueAngle(phi1 - bremphi); - } - surfaceParameters2 = m_propagator->propagate(trackparameter,surface,Trk::alongMomentum,true,m_fieldProperties,electron); - if (surfaceParameters2) { - Pos2 = surfaceParameters2->position(); - double phi2((Pos2.y()/Pos2.x())); - phidifference2 = UniqueAngle(phi2 - bremphi); - } - if (surfaceParameters1 && !surfaceParameters2) { - m_brem_TrackParameters.push_back(surfaceParameters1); - return Pos1; - } - else if (!surfaceParameters1 && surfaceParameters2) { - m_brem_TrackParameters.push_back(surfaceParameters2); - return Pos2; - } - else if (surfaceParameters1 && surfaceParameters2) { - if (phidifference1 > phidifference2) { - m_brem_TrackParameters.push_back(surfaceParameters2); - return Pos2; - } - else { - m_brem_TrackParameters.push_back(surfaceParameters1); - return Pos1; - } - - } - - //backup method. This really shouldn't be called - const Trk::TrackParameters* surfaceParameters3 = m_propagator->propagate(trackparameter,surface,Trk::anyDirection,true,m_fieldProperties,electron); - if (surfaceParameters3) { - m_brem_TrackParameters.push_back(surfaceParameters3); - return surfaceParameters3->position(); - } - m_brem_TrackParameters.push_back(0); - Amg::Vector3D nullPos(0.0,0.0,0.0); - return nullPos; -} - -const Trk::Surface* Trk::BremFind::ClosestSurface(double, double, double, const Trk::TrackParameters& trackparameter) -{ - const Trk::Layer* associatedLayer = m_trackingGeometry->closestMaterialLayer<const Trk::TrackParameters>(trackparameter).object; - if (associatedLayer) { - m_brem_layers.push_back(associatedLayer); - const Trk::Surface* associatedSurface = &(associatedLayer->surfaceRepresentation()); - return associatedSurface; - } - else { - m_brem_layers.push_back(0); - } - - return 0; -} - - -StatusCode Trk::BremFind::retrieveTrackingGeometry() -{ - // Retrieve the TrackingGeometry from the DetectorStore - StatusCode sc = detStore()->retrieve(m_trackingGeometry, m_trackingGeometryName); - if (sc.isFailure()){ - msg(MSG::FATAL) << "Could not retrieve TrackingGeometry from DetectorStore!" << endmsg; - } - return sc; - -} - -double Trk::BremFind::UniqueAngle(double phi) -{ - if (phi > TMath::Pi()) { - return UniqueAngle(phi - TMath::Pi()); - } - else if (phi < 0.0) { - return UniqueAngle(phi + TMath::Pi()); - } - return phi; -} - -int Trk::BremFind::GetNBrems() -{ - return m_nBrems; -} - -void Trk::BremFind::MakeTrackStateOnSurfaces () -{ - - for (int make_counter(0); make_counter < m_nBrems; make_counter++) { - - std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern; - typePattern.set(TrackStateOnSurface::BremPoint); - const Trk::TrackStateOnSurface* BremTrackStateOnSurface = new Trk::TrackStateOnSurface(0,m_brem_TrackParameters[make_counter],0,m_EstimatedBremOnTrack[make_counter],typePattern); - - if (!m_Z_mode) - m_brem_trackStateOnSurface.push_back(BremTrackStateOnSurface); - else - delete BremTrackStateOnSurface; - - } - -} - -const Trk::TrackStateOnSurface* Trk::BremFind::GetEstimatedBremOnTrack(int n) -{ - return m_brem_trackStateOnSurface[n]; -} - - -//A function that rates the quality of a bremsstrahlung signal based on the separation quality -//of the forward and smoothed fit. A lower score indicates that the measurements are unlikely to -//be the same value. Therefore a lower score means a better fit. - -void Trk::BremFind::SeparationQuality(std::vector<double> *backwardkink, std::vector<double> *forwardkink) -{ - int ForwardHit_Counter(0); - int SmoothHit_Counter(1); - std::vector<double> OverlapScore(0); - std::vector<double> OverlapErr(0); - - - for (int kink_counter(0); kink_counter < (int) backwardkink->size(); kink_counter++) { - - OverlapScore.clear(); - OverlapErr.clear(); - - ForwardHit_Counter = 0; - SmoothHit_Counter = 1; - - for (; ForwardHit_Counter < (int) m_forward_1overP->size(); ForwardHit_Counter++,SmoothHit_Counter++) { - - - if ( (*m_forward_value)[ForwardHit_Counter] > (*backwardkink)[kink_counter] && (*m_forward_value)[ForwardHit_Counter] < (*forwardkink)[kink_counter] && (*m_smooth_value)[SmoothHit_Counter] > (*backwardkink)[kink_counter] && (*m_smooth_value)[SmoothHit_Counter] < (*forwardkink)[kink_counter]) { - - std::pair<double,double> probabilitypair(ProbabilityScore((*m_forward_1overP)[ForwardHit_Counter],3*(*m_forward_1overPerr)[ForwardHit_Counter],(*m_smooth_1overP)[SmoothHit_Counter],3*(*m_smooth_1overPerr)[SmoothHit_Counter])); - OverlapScore.push_back(probabilitypair.first); - OverlapErr.push_back(probabilitypair.second); - - } - - } - - //Now combing the multiple measurements into one score - - double sum1(0); - double sum2(0); - double LowestScore(1.0); - double LowestScoreErr(0.0); - - for(int score_counter(0); score_counter < (int) OverlapScore.size(); score_counter++) { - - sum1 += OverlapScore[score_counter]/(pow(OverlapErr[score_counter],2)); - sum2 += 1/(pow(OverlapErr[score_counter],2)); - - if (OverlapScore[score_counter] < LowestScore || score_counter==0) { - LowestScore = OverlapScore[score_counter]; - LowestScoreErr = OverlapErr[score_counter]; - } - } - - if (sum2==0) { - m_KinkSeparationScores->push_back(1.0); - m_KinkSeparationScoresErr->push_back(0.0); - } - else { - m_KinkSeparationScores->push_back(sum1/sum2); - m_KinkSeparationScoresErr->push_back(LowestScoreErr); - //m_KinkSeparationScoresErr->push_back(1/sqrt(sum2)); - } - - } - -} - - -std::pair<double,double> Trk::BremFind::ProbabilityScore(double Gauss1_mean, double Gauss1_var, double Gauss2_mean, double Gauss2_var) -{ - double value(exp(-(Gauss1_mean - Gauss2_mean)*(Gauss1_mean - Gauss2_mean)/(2*(Gauss1_var*Gauss1_var + Gauss2_var*Gauss2_var)))*(1/Gauss1_var*Gauss2_var*2*sqrt(TMath::Pi()))*sqrt(2*Gauss1_var*Gauss1_var*Gauss2_var*Gauss2_var/(Gauss1_var*Gauss1_var + Gauss2_var*Gauss2_var))); - double error(value*(Gauss1_mean - Gauss2_mean)*(Gauss1_var + Gauss2_var)/(Gauss1_var*Gauss1_var + Gauss2_var*Gauss2_var)); - - std::pair<double,double> probabilityscore; - probabilityscore.first = value; - probabilityscore.second = fabs(error); - - return probabilityscore; - -} diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/src/GaussianSumFitter.cxx b/Tracking/TrkFitter/TrkGaussianSumFilter/src/GaussianSumFitter.cxx index 0bebf8563fe0a42c2410eb4218b629239a54be40..b7c020558af810a90fa10d0a96760e36e67955d5 100644 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/src/GaussianSumFitter.cxx +++ b/Tracking/TrkFitter/TrkGaussianSumFilter/src/GaussianSumFitter.cxx @@ -18,7 +18,6 @@ decription : Implementation code for Gaussian Sum Fitter class #include "TrkGaussianSumFilter/IMultiStateExtrapolator.h" #include "TrkGaussianSumFilter/IForwardGsfFitter.h" #include "TrkGaussianSumFilter/IGsfSmoother.h" -#include "TrkGaussianSumFilter/IBremsstrahlungFinder.h" #include "TrkEventUtils/MeasurementBaseComparisonFunction.h" #include "TrkEventUtils/PrepRawDataComparisonFunction.h" @@ -61,13 +60,10 @@ Trk::GaussianSumFitter::GaussianSumFitter(const std::string& type, const std::st m_reintegrateOutliers(false), m_makePerigee(true), m_directionToPerigee(Trk::oppositeMomentum), - m_runBremFinder(false), m_refitOnMeasurementBase(true), m_doHitSorting(true), m_trkParametersComparisonFunction(0), m_stateCombiner("Trk::MultiComponentStateCombiner"), - m_BremFind("Trk::BremFind"), - m_BremFind2("Trk::BremFind"), m_chronoSvc("ChronoStatSvc", name), m_inputPreparator(0), m_FitPRD(0), @@ -130,9 +126,6 @@ Trk::GaussianSumFitter::GaussianSumFitter(const std::string& type, const std::st declareProperty("SortingReferencePoint", m_sortingReferencePoint ); declareProperty("StateCombiner", m_stateCombiner ); declareProperty("ValidationMode", m_validationMode ); - declareProperty("BremFind", m_BremFind ); - declareProperty("BremFind2", m_BremFind2 ); - declareProperty("runBremFinder", m_runBremFinder ); declareProperty("GsfSmoother",m_gsfSmoother); declareProperty("ForwardGsfFitter",m_forwardGsfFitter); declareProperty("EventInfoKey", m_readKey="EventInfo"); @@ -169,17 +162,6 @@ StatusCode Trk::GaussianSumFitter::initialize() // Request the state combiner ATH_CHECK ( m_stateCombiner.retrieve() ); - //Request the brem finder - if (m_runBremFinder){ - if ( m_BremFind.retrieve().isFailure() || m_BremFind2.retrieve().isFailure() ) { - msg(MSG::WARNING) << "Request is to retrieve the bremsstrahlung finder failed... turning off brem finding!" << endmsg; - m_runBremFinder = false; - } - } - else { - m_BremFind.disable(); - m_BremFind2.disable(); - } // Request the RIO_OnTrack creator // No need to return if RioOnTrack creator tool, only if PrepRawData is used in fit @@ -573,16 +555,7 @@ Trk::Track* Trk::GaussianSumFitter::fit ( const Trk::PrepRawDataSet& prepRawD } } - //Find bremsstrahlung points and save them - if (m_runBremFinder) { - if (msgLvl(MSG::DEBUG)) msg() << "Entering the BremFind tool" << endmsg; - - //The z mode must be ahead of the r mode to make sure the right TSOS is being pushed into the smoothedTrajectory - m_BremFind2->BremFinder(*forwardTrajectory, *smoothedTrajectory,true); - m_BremFind->BremFinder(*forwardTrajectory, *smoothedTrajectory,false); - - } - + // Delete forward trajectory. New memory was assigned in ForwardGsfFitter. delete forwardTrajectory; @@ -594,15 +567,7 @@ Trk::Track* Trk::GaussianSumFitter::fit ( const Trk::PrepRawDataSet& prepRawD //Reverse the order of the TSOS's to make be order flow from inside to out std::reverse(smoothedTrajectory->begin(), smoothedTrajectory->end()); - //Add brem information to Track - if (m_runBremFinder) { - //Filling in the brem information in the smoothedTrajectory - for (int brem_counter(0); brem_counter < m_BremFind->GetNBrems(); brem_counter++) { - smoothedTrajectory->push_back(m_BremFind->GetEstimatedBremOnTrack(brem_counter)); - } - } - - + // Create new track Trk::TrackInfo info(Trk::TrackInfo::GaussianSumFilter, particleHypothesis); info.setTrackProperties(TrackInfo::BremFit); @@ -753,15 +718,6 @@ Trk::Track* Trk::GaussianSumFitter::fit ( const Trk::MeasurementSet& measurem } } - //Find bremsstrahlung points and save them - if (m_runBremFinder) { - if (msgLvl(MSG::DEBUG)) msg() << "Entering the BremFind tool" << endmsg; - - //The z mode must be ahead of the r mode to make sure the right TSOS is being pushed into the smoothedTrajectory - m_BremFind2->BremFinder(*forwardTrajectory, *smoothedTrajectory,true); - m_BremFind->BremFinder(*forwardTrajectory, *smoothedTrajectory,false); - } - //Delete forward trajectory. New memory was assigned in ForwardGsfFitter. delete forwardTrajectory; @@ -774,14 +730,7 @@ Trk::Track* Trk::GaussianSumFitter::fit ( const Trk::MeasurementSet& measurem //Reverse the order of the TSOS's to make be order flow from inside to out std::reverse(smoothedTrajectory->begin(), smoothedTrajectory->end()); - //Add brem information to the track - if (m_runBremFinder) { - //Filling in the brem information in the smoothedTrajectory - for (int brem_counter(0); brem_counter < m_BremFind->GetNBrems(); brem_counter++) { - smoothedTrajectory->push_back(m_BremFind->GetEstimatedBremOnTrack(brem_counter)); - } - } - + // Create new track Trk::TrackInfo info(Trk::TrackInfo::GaussianSumFilter, particleHypothesis); info.setTrackProperties(TrackInfo::BremFit); diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/src/QoverPBremFit.cxx b/Tracking/TrkFitter/TrkGaussianSumFilter/src/QoverPBremFit.cxx deleted file mode 100644 index af6df4cb5a43b0db0cde733317a51dd37f47b7dd..0000000000000000000000000000000000000000 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/src/QoverPBremFit.cxx +++ /dev/null @@ -1,711 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -/******************************************************************************** - QoverPBremFit.cxx * description - -completed : Tuesday 18th November 2008 -author : Tony Shao -email : Qi.Tao.Shao@cern.ch -description : Class called by BremFind to fit 1overp vs R plots using a sum of Tanh graphs -**********************************************************************************/ -#include "QoverPBremFit.h" - -#include "TrkGaussianSumFilter/IMultiComponentStateCombiner.h" -#include "TrkMultiComponentStateOnSurface/MultiComponentStateOnSurface.h" -#include "TrkParameters/TrackParameters.h" -#include "TrkTrack/Track.h" -#include "TrkFitterUtils/FitterTypes.h" - -#include <math.h> -#include <algorithm> -#include "TMath.h" - - - -Trk::QoverPBremFit::QoverPBremFit(int type, bool Z_mode): - m_stateCombiner("Trk::MultiComponentStateCombiner") -{ - m_potentialvalue = new std::vector<double>; - m_potentialwidth = new std::vector<double>; - m_1overPvalue = new std::vector<double>; - m_1overPvalueerror = new std::vector<double>; - m_PhiValue = new std::vector<double>; - m_PhiValueerror = new std::vector<double>; - m_ThetaValue = new std::vector<double>; - m_ThetaValueerror = new std::vector<double>; - m_RadiusValue = new std::vector<double>; - m_Zvalue = new std::vector<double>; - m_FitValue = new std::vector<double>; - m_trackParameters = new std::vector<const Trk::TrackParameters*>; - m_type = type; - m_Z_mode = Z_mode; - m_surfaceCounter = 0; - m_charge =0; -} - -StatusCode Trk::QoverPBremFit::initialize() -{ - // Request the state combiner - if ( m_stateCombiner.retrieve().isFailure() ){ - printf("Failed to retrieve m_stateCombiner"); - return StatusCode::FAILURE; - } - return StatusCode::SUCCESS; -} - - -Trk::QoverPBremFit::~QoverPBremFit() -{ - for (unsigned int d(0);d < m_trackParameters->size(); d++) { - delete (*m_trackParameters)[d]; - } - - delete m_potentialvalue; - delete m_potentialwidth; - delete m_1overPvalue; - delete m_1overPvalueerror; - delete m_PhiValue; - delete m_PhiValueerror; - delete m_ThetaValue; - delete m_ThetaValueerror; - delete m_RadiusValue; - delete m_Zvalue; - delete m_FitValue; - delete m_trackParameters; -} - - - -Trk::GraphParameter Trk::QoverPBremFit::GetParameters(const DataVector <const Trk::TrackStateOnSurface>& Trajectory) -{ - FillVariables(Trajectory); - - for (int copy_counter(0); (int) copy_counter < GetNMeasurements(); copy_counter++) { - if (m_Z_mode) - m_FitValue->push_back(fabs((*m_Zvalue)[copy_counter])); - else - m_FitValue->push_back((*m_RadiusValue)[copy_counter]); - } - - - FindPotentials(); - - m_graphparameter=FindParameters(); - - m_mergedparameter = MergeParameters(m_graphparameter); - - - return m_mergedparameter; -} - - -void -Trk::QoverPBremFit::FillVariables(const DataVector <const Trk::TrackStateOnSurface>& Trajectory) { - //iterators will be constructed as NULL - DataVector<const Trk::TrackStateOnSurface>::const_iterator trackStateOnSurface; - DataVector<const Trk::TrackStateOnSurface>::const_iterator Trajectory_end; - - - if (m_type==1) { - trackStateOnSurface = Trajectory.begin(); - Trajectory_end = Trajectory.end(); - } else if (m_type==-1) { - trackStateOnSurface = Trajectory.end(); - trackStateOnSurface--; - Trajectory_end = Trajectory.begin(); - Trajectory_end--; - } else { - //trackStateOnSurface and Trajectory_end will be NULL in this case, as constructed - return; - } - - - m_surfaceCounter=0; - - - for ( ; trackStateOnSurface != Trajectory_end; ) { - const Trk::MultiComponentState *TrajectoryMultiState=0; - const Trk::MultiComponentStateOnSurface *TrajectoryMultiStateOnSurface = dynamic_cast<const Trk::MultiComponentStateOnSurface*>(*trackStateOnSurface); - if (m_surfaceCounter < TRKFGSF_VALSURFACES) { - if (!TrajectoryMultiStateOnSurface) { - // Create new multiComponentState from a single state - Trk::ComponentParameters componentParameters( (*trackStateOnSurface)->trackParameters(), 1.0); - TrajectoryMultiState = new Trk::MultiComponentState(componentParameters); - } else { - TrajectoryMultiState = TrajectoryMultiStateOnSurface->components(); - } - - const Amg::Vector3D posOnSurf = TrajectoryMultiStateOnSurface->trackParameters()->position(); - - - //Fill the radius values - m_RadiusValue->push_back( posOnSurf.perp() ); - m_Zvalue->push_back( posOnSurf.z() ); - - //Specify in joboptions whether to use mode or mean - const Trk::TrackParameters* CombinedMultiState = m_stateCombiner->combine(*TrajectoryMultiState,true); - - if (CombinedMultiState->parameters()[Trk::qOverP] > 0.0) m_charge = 1.0; - else m_charge = -1.0; - - //Fill the 1overPvalues in GeV - m_trackParameters->push_back( CombinedMultiState ); - m_1overPvalue->push_back( 1000.0*fabs(CombinedMultiState->parameters()[Trk::qOverP]) ); - m_PhiValue->push_back( CombinedMultiState->parameters()[Trk::phi] ); - m_ThetaValue->push_back( CombinedMultiState->parameters()[Trk::theta] ); - - const AmgSymMatrix(5)* measuredCov = CombinedMultiState->covariance(); - - if (measuredCov) { - m_1overPvalueerror->push_back( 1000.0*sqrt((*measuredCov)(Trk::qOverP,Trk::qOverP))); - m_PhiValueerror->push_back( sqrt((*measuredCov)(Trk::phi,Trk::phi))); - m_ThetaValueerror->push_back( sqrt((*measuredCov)(Trk::theta,Trk::theta))); - } - else { - m_1overPvalueerror->push_back( 1000.0*fabs(CombinedMultiState->parameters()[Trk::qOverP]) ); - m_PhiValueerror->push_back( fabs(CombinedMultiState->parameters()[Trk::phi]) ); - m_ThetaValueerror->push_back( fabs(CombinedMultiState->parameters()[Trk::theta]) ); - } - } - - if (!TrajectoryMultiStateOnSurface) { - delete TrajectoryMultiState; - } - m_surfaceCounter++; - if (m_type==1) { - trackStateOnSurface++; - } - else if (m_type==-1) { - trackStateOnSurface--; - } - }//end of for loop -} - - -void Trk::QoverPBremFit::FindPotentials() -{ - double width; - double oneoverPgradient; - - //Search for potential brem locations - for (int datapoint=0; datapoint < m_surfaceCounter-1; datapoint++) { - //Calculates gradient between adajacent points - oneoverPgradient=(1 - (*m_1overPvalue)[datapoint]/(*m_1overPvalue)[datapoint+1])/((*m_FitValue)[datapoint+1]-(*m_FitValue)[datapoint]); - - if (oneoverPgradient > POTENTIAL_BREM_THRESHOLD) { - - m_potentialvalue->push_back(((*m_FitValue)[datapoint+1]+(*m_FitValue)[datapoint])/2); - width=((*m_FitValue)[datapoint+1]-(*m_FitValue)[datapoint])/2; - - if (width < 20) { - width=20; - } - - m_potentialwidth->push_back(width); - - } - } -} - - -Trk::GraphParameter Trk::QoverPBremFit::FindParameters() -{ - - GraphParameter graphparameter; - int nparameters = (int) m_potentialvalue->size() + 1; - int totalparameters = nparameters; - int nsurfaces = m_1overPvalue->size(); - - - std::vector<Element> elements; - elements.clear(); - Element thePoint; - - //Fill in the elements - for (int elementfill=0; elementfill < totalparameters-1; elementfill++) { - - thePoint.value=(*m_potentialvalue)[elementfill]; - thePoint.width=(*m_potentialwidth)[elementfill]; - thePoint.sign=true; - elements.push_back(thePoint); - } - - while (true) { - //printf("Starting the matrix iterations\n"); - Amg::VectorX theta(nparameters); theta.setZero(); - Amg::VectorX ymatrix(nsurfaces); ymatrix.setZero(); - Amg::MatrixX Amatrix (nsurfaces,nparameters); Amatrix.setZero(); - Amg::MatrixX Gy (nsurfaces,nsurfaces); Gy.setZero(); - - //temporary matrices to store the operations - Amg::MatrixX ATranspose(nparameters,nsurfaces); ATranspose.setZero(); - Amg::MatrixX AGA(nparameters,nparameters); AGA.setZero(); - Amg::MatrixX AGAinverse(nparameters,nparameters); AGAinverse.setZero(); - - //printf("nparameters=%i\n",nparameters); - - - //Filling each of the matrices --- y matrix first - for (int yfill=0; yfill < nsurfaces; yfill++) { - ymatrix[yfill]=(*m_1overPvalue)[yfill]; - } - - - //Filling the A matrix. - for (int afill=0; afill < nsurfaces; afill++) { - - int afill3(0); - - //afill2 starts at -1 because we want the elements vector to start at zero. - //The first iteration is taken away by the constant parameters. - for (int afill2=-1; afill2 < totalparameters-1; afill2++) { - - //First column of the A matrix is a constant - if (afill3==0){ - Amatrix(afill,afill3)=1; - afill3++; - } - - //Only the terms with positive coefficients are kept - else if (elements[afill2].sign) { - - Amatrix(afill,afill3)=TMath::TanH((*m_FitValue)[afill]/elements[afill2].width-elements[afill2].value/elements[afill2].width); - afill3++; - } - - } - } - - - //Fill the Gy matrix (the error matrix) - for (int gfill(0); gfill < nsurfaces; gfill++) { - - for (int gfill2(0); gfill2 < nsurfaces; gfill2++) { - - if (gfill==gfill2) { - Gy(gfill,gfill2)=1/(*m_1overPvalueerror)[gfill]; - } - else { - Gy(gfill,gfill2)=0; - } - } - } - - - - //int inv; - ATranspose=Amatrix.transpose(); - AGA=ATranspose*(Gy*(Amatrix)); - AGAinverse=AGA.inverse(); - //printf("Inv=%i\n",inv); - - theta=AGAinverse*(ATranspose*(Gy*ymatrix)); - - - //Check the signs of the calculated coefficients. Negative coefficients will be taken away - //on the next iteration until all coefficients are >= 0 - - int nNegative(0); - - int signcheck2(1); //Iterations start at 1 because the constant parameter doesn't matter - for (int signcheck(0); signcheck < totalparameters-1; signcheck++) { - - if (!elements[signcheck].sign) { //if the term is already taken away, then ignore it - continue; - } - else if (theta[signcheck2] < 0) { //checks to the sign of the calculated coefficient - elements[signcheck].sign=false; - nNegative++; //counts the number of negative coefficients - signcheck2++; - } - else { - signcheck2++; - } - } - - if (nNegative==0) {//Ends the iterations because all terms are positive - - int graphfill2(0); - for(int graphfill(-1); graphfill < totalparameters-1; graphfill++) { - if (graphfill2==0) { //Fills the constant with the corresponding theta element - graphparameter.constant=theta[graphfill2]; - if (isnan(graphparameter.constant)) - graphparameter.constant=0.0; - graphfill2++; - } - - else if (!elements[graphfill].sign) { - //if the parameter is negative then its coefficient is assigned zero - graphparameter.value.push_back(elements[graphfill].value); - graphparameter.coefficient.push_back(0.0); - graphparameter.width.push_back(20.0); - } - - else { - //fills the graphparameter with the coefficients, radii and width - if (isnan(theta[graphfill2])) { - graphparameter.coefficient.push_back(0.0); - graphparameter.value.push_back(elements[graphfill].value); - graphparameter.width.push_back(elements[graphfill].width); - } - else { - graphparameter.value.push_back(elements[graphfill].value); - graphparameter.coefficient.push_back(theta[graphfill2]); - graphparameter.width.push_back(elements[graphfill].width); - } - graphfill2++; - } - } - - break; - - } - else { - nparameters-=nNegative; //resets the matrices with less degrees of freedom - } - } - - return graphparameter; -} - - -Trk::GraphParameter Trk::QoverPBremFit::MergeParameters(GraphParameter graphparameter) -{ - GraphParameter MergedParameters; - MergedParameters.constant=graphparameter.constant; - - double joinscore(0); - std::vector<int> nonzero_coefficients; //contains the coefficient numbers that are non-zero - - - for (int coeff_test(0); coeff_test < (int) graphparameter.coefficient.size(); coeff_test++) { - if ( graphparameter.coefficient[coeff_test] != 0) { - nonzero_coefficients.push_back(coeff_test); - } - } - - //Returns the singular case - if ( (int) nonzero_coefficients.size() == 1 ) { - MergedParameters.coefficient.push_back(graphparameter.coefficient[nonzero_coefficients[0]]); - MergedParameters.value.push_back(graphparameter.value[nonzero_coefficients[0]]); - MergedParameters.width.push_back(graphparameter.width[nonzero_coefficients[0]]); - return MergedParameters; - } - - std::vector<bool> joinboolean ((int) nonzero_coefficients.size()-1,false); - double kinkdistance; //distance between adjacent kinks - double maxmeasure; //the maximum distance between measurements between the adjacent kinks - //int npotential; //number of potential brem points between kinks - int nmeasurement; //number of measurements between kinks - double regionbias; //takes into account the joining bias of the region based on value - - //The first element of the joinboolean array will represent whether - //kink #1 and kink#2 should be joined - - for (int join_counter(0); join_counter < (int) nonzero_coefficients.size()-1; join_counter++) { - - joinscore=0; - - kinkdistance = graphparameter.value[nonzero_coefficients[join_counter+1]] - graphparameter.value[nonzero_coefficients[join_counter]]; - maxmeasure = maxvalue(graphparameter.value[nonzero_coefficients[join_counter]],graphparameter.value[nonzero_coefficients[join_counter+1]]); - //npotential = npotentials(graphparameter.value[nonzero_coefficients[join_counter]],graphparameter.value[nonzero_coefficients[join_counter+1]]); - nmeasurement = nmeasurements(graphparameter.value[nonzero_coefficients[join_counter]],graphparameter.value[nonzero_coefficients[join_counter+1]]); - regionbias = (LastFitMeasurement()/2-graphparameter.value[nonzero_coefficients[join_counter+1]]+LastFitMeasurement()/2-graphparameter.value[nonzero_coefficients[join_counter]])/5; - - joinscore+= -10*nmeasurement; - joinscore+= 2*maxmeasure; - joinscore+= 50-kinkdistance; - joinscore+= m_type*regionbias; - //joinscore+= 20*npotential; - - //printf("Join Score%i=%f\n",join_counter,joinscore); - - //Scoring system thresholds - if (kinkdistance > 350) { - joinboolean[join_counter] = false; - continue; - } - - if (joinscore > 0) { - joinboolean[join_counter] = true; - } - - else { - joinboolean[join_counter] = false; - } - - } - - //Use the joinboolean array to join multiple smaller kinks into one larger one - - int nkinks_merged(0); - - std::vector<double> coefficient_vector; - std::vector<double> width_vector; - std::vector<double> value_vector; - - for (int merge_counter(0); merge_counter < (int) nonzero_coefficients.size(); merge_counter++) { - - if (merge_counter < (int) nonzero_coefficients.size()-1) { - - if (joinboolean[merge_counter]) { - coefficient_vector.push_back(graphparameter.coefficient[nonzero_coefficients[merge_counter]]); - width_vector.push_back(graphparameter.width[nonzero_coefficients[merge_counter]]); - value_vector.push_back(graphparameter.value[nonzero_coefficients[merge_counter]]); - nkinks_merged++; - } - - else if (!joinboolean[merge_counter]) { - coefficient_vector.push_back(graphparameter.coefficient[nonzero_coefficients[merge_counter]]); - value_vector.push_back(graphparameter.value[nonzero_coefficients[merge_counter]]); - width_vector.push_back(graphparameter.width[nonzero_coefficients[merge_counter]]); - MergedParameters.coefficient.push_back(coefficient_sum(coefficient_vector)); - MergedParameters.value.push_back(value_sum(value_vector,coefficient_vector)); - MergedParameters.width.push_back(width_sum(width_vector,coefficient_vector,value_vector)); - coefficient_vector.clear(); - value_vector.clear(); - width_vector.clear(); - nkinks_merged=0; - } - } - - else { - coefficient_vector.push_back(graphparameter.coefficient[nonzero_coefficients[merge_counter]]); - value_vector.push_back(graphparameter.value[nonzero_coefficients[merge_counter]]); - width_vector.push_back(graphparameter.width[nonzero_coefficients[merge_counter]]); - MergedParameters.coefficient.push_back(coefficient_sum(coefficient_vector)); - MergedParameters.value.push_back(value_sum(value_vector,coefficient_vector)); - MergedParameters.width.push_back(width_sum(width_vector,coefficient_vector,value_vector)); - } - - } - - return MergedParameters; -} - - -//This function calculates the number of measurements between kinks -int Trk::QoverPBremFit::nmeasurements (double start, double end) -{ - int npoints(0); - for (int i=0; i < (int) m_FitValue->size(); i++) { - if ((*m_FitValue)[i] > start && (*m_FitValue)[i] < end) { - npoints++; - } - } - - return npoints; -} - -//This function calculates the number of potential brem points between kinks -int Trk::QoverPBremFit::npotentials(double start, double end) -{ - int potentialcount(0); - for (int i=0; i < (int) m_potentialvalue->size(); i++) { - if ( (*m_potentialvalue)[i] > start && (*m_potentialvalue)[i] < end) { - potentialcount++; - } - - } - return potentialcount; -} - - -//This function calculates the maximum distance between measurements within adjacent kinks -//Note: the measured points considered can be outside the radii of the kinks, hence the use -//of "if" conditions #2 and #4 below. -double Trk::QoverPBremFit::maxvalue(double start, double end) -{ - double max(-1); - double max2(-1); - int endcounter(0); - for (int value_counter(0); value_counter < (int) m_FitValue->size(); value_counter++) { - - if ((*m_FitValue)[value_counter] < start) { - continue; - } - - if ((*m_FitValue)[value_counter] > end && endcounter > 0) { - continue; - } - - //A measurement outside the value of the kink will counter if it is the first and only one - else if ((*m_FitValue)[value_counter] > end && endcounter==0) { - max2 = (*m_FitValue)[value_counter] - (*m_FitValue)[value_counter - 1]; - endcounter++; - } - - else { - max2 = (*m_FitValue)[value_counter] - (*m_FitValue)[value_counter - 1]; - } - - if (max2 > max) { - max = max2; - } - - } - return max; - -} - - -double Trk::QoverPBremFit::coefficient_sum (std::vector<double> coefficients) -{ - double sum(0); - for (int sum_counter(0); sum_counter < (int) coefficients.size(); sum_counter++) { - sum+=coefficients[sum_counter]; - } - - return sum; - -} - -double Trk::QoverPBremFit::value_sum (std::vector<double> radii, std::vector<double> coefficients) -{ - double value(0); - double mod_squared(0); - for (int value_counter(0); value_counter < (int) radii.size(); value_counter++) { - value+=coefficients[value_counter]*coefficients[value_counter]*radii[value_counter]; - mod_squared+=coefficients[value_counter]*coefficients[value_counter]; - } - value/=mod_squared; - return value; -} - -double Trk::QoverPBremFit::width_sum (std::vector<double> widths, std::vector<double> coefficients, std::vector<double> radii) -{ - double width(0); - double coefficient_average(0); - double mod_squared(0); - - //singular case - if ( (int)coefficients.size() == 1) - { - return widths[0]; - } - - - for (int coefficient_counter(0); coefficient_counter < (int)coefficients.size(); coefficient_counter++) { - coefficient_average+=coefficients[coefficient_counter]/coefficients.size(); - mod_squared+=coefficients[coefficient_counter]*coefficients[coefficient_counter]; - } - - for (int width_counter(0); width_counter < (int) widths.size()-1 ; width_counter++) { - width+=std::min(coefficients[width_counter]*coefficients[width_counter]*(radii[width_counter+1]-radii[width_counter]),coefficients[width_counter+1]*coefficients[width_counter+1]*(radii[width_counter+1]-radii[width_counter])); - } - width/=mod_squared; - - for (int width_counter2(0); width_counter2 < (int) widths.size(); width_counter2++) { - width+=coefficients[width_counter2]*coefficients[width_counter2]*widths[width_counter2]/(coefficients[width_counter2]*coefficients[width_counter2]+coefficient_average*coefficient_average); - } - - return width; -} - -double Trk::QoverPBremFit::GetPerigee_1overP() -{ - return (*m_1overPvalue)[0]; -} - -double Trk::QoverPBremFit::GetPerigee_Phi() -{ - return (*m_PhiValue)[0]; -} - -double Trk::QoverPBremFit::GetPerigee_Theta() -{ - return (*m_ThetaValue)[0]; -} - -double Trk::QoverPBremFit::GetPerigee_d0() -{ - return (*m_RadiusValue)[0]; -} - -double Trk::QoverPBremFit::GetPerigee_z0() -{ - return (*m_Zvalue)[0]; -} - -double Trk::QoverPBremFit::Get1overP(int n) -{ - return (*m_1overPvalue)[n]; -} - -double Trk::QoverPBremFit::GetPhi(int n) -{ - return (*m_PhiValue)[n]; -} - -double Trk::QoverPBremFit::GetTheta(int n) -{ - return (*m_ThetaValue)[n]; -} - -double Trk::QoverPBremFit::GetRadius(int n) -{ - return (*m_RadiusValue)[n]; -} - -double Trk::QoverPBremFit::GetZ(int n) -{ - return (*m_Zvalue)[n]; -} - -double Trk::QoverPBremFit::Get1overPerror(int n) -{ - return (*m_1overPvalueerror)[n]; -} - -double Trk::QoverPBremFit::GetPhierror(int n) -{ - return (*m_PhiValueerror)[n]; -} - -double Trk::QoverPBremFit::GetThetaerror(int n) -{ - return (*m_ThetaValueerror)[n]; -} - -int Trk::QoverPBremFit::GetNMeasurements() -{ - return (int) (*m_1overPvalue).size(); -} - -double Trk::QoverPBremFit::GetCharge() -{ - return m_charge; -} - -const Trk::TrackParameters* Trk::QoverPBremFit::GetTrackParameters(int n) -{ - return (*m_trackParameters)[n]; -} - -int Trk::QoverPBremFit::GetnSurfaces() -{ - return m_surfaceCounter; -} - -double Trk::QoverPBremFit::GetValue(int n) -{ - return (*m_FitValue)[n]; -} - - -double Trk::QoverPBremFit::LastFitMeasurement() -{ - int lastmeasurement(GetNMeasurements() - 1); - return (*m_FitValue)[lastmeasurement]; -} - -double Trk::QoverPBremFit::FirstFitMeasurement() -{ - if (m_type == 1) - return (*m_FitValue)[0]; - else if (m_type == -1) - return (*m_FitValue)[1]; - return (*m_FitValue)[0]; -} diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/src/QoverPBremFit.h b/Tracking/TrkFitter/TrkGaussianSumFilter/src/QoverPBremFit.h deleted file mode 100644 index 91d187aaf16b3a86b4d0cc4b53213f05123063a9..0000000000000000000000000000000000000000 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/src/QoverPBremFit.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -/******************************************************************************** - QoverPBremFit.h * description - - completed : Tuesday 18th November 2008 - author : Tony Shao - email : Qi.Tao.Shao@cern.ch - description : Class called by BremFind to fit QoverP vs R plots using a sum of Tanh graphs - **********************************************************************************/ - -#ifndef Trk_QoverPBremFit_H -#define Trk_QoverPBremFit_H - -#include <vector> - -#include "GaudiKernel/ToolHandle.h" -#include "AthContainers/DataVector.h" -#include "TrkParameters/TrackParameters.h" -#include "TrkGaussianSumFilter/BremFind.h" - -namespace Trk { - - class IMultiComponentStateCombiner; - class MultiComponentStateOnSurface; - class TrackStateOnSurface; - - -#define TRKFGSF_VALSURFACES 100 -#define TRKGSF_VALSTATES 24 -#define POTENTIAL_BREM_THRESHOLD 0.0001 - - - class QoverPBremFit { - - // forbid copying - QoverPBremFit(const QoverPBremFit &) = delete ; - QoverPBremFit &operator=(const QoverPBremFit &) = delete; - - public: - - QoverPBremFit(int, bool); //type=1 for forward fit || type=-1 for backward fit - //bool for Z mode or not. True for Z mode. - - StatusCode initialize(); - - ~QoverPBremFit(); - - GraphParameter GetParameters(const DataVector <const Trk::TrackStateOnSurface>&); - - double GetPerigee_1overP(); - double GetPerigee_Phi(); - double GetPerigee_Theta(); - double GetPerigee_d0(); - double GetPerigee_z0(); - - int GetnSurfaces(); - double Get1overP(int); - double GetPhi(int); - double GetTheta(int); - double GetRadius(int); - double GetZ(int); - double Get1overPerror(int); - double GetPhierror(int); - double GetThetaerror(int); - double GetRadiuserror(int); - double GetZerror(int); - double GetValue(int); - double GetCharge(); - double LastFitMeasurement(); - double FirstFitMeasurement(); - - const Trk::TrackParameters* GetTrackParameters(int); - - int GetNMeasurements(); - - void FillVariables(const DataVector <const Trk::TrackStateOnSurface>&); - - void FindPotentials(); - - GraphParameter FindParameters(); - - GraphParameter MergeParameters(GraphParameter); - - private: - - int nmeasurements (double, double); - - int npotentials (double, double); - - double maxvalue (double, double); - - double coefficient_sum (std::vector<double>); - - double value_sum (std::vector<double>,std::vector<double>); - - double width_sum (std::vector<double>,std::vector<double>,std::vector<double>); - - //defining the tools used in this class - ToolHandle<IMultiComponentStateCombiner> m_stateCombiner; - - int m_surfaceCounter; - int m_type; - bool m_Z_mode; - - mutable std::vector<double> *m_potentialvalue; - mutable std::vector<double> *m_potentialwidth; - - double m_charge; - std::vector<double> *m_1overPvalue; - std::vector<double> *m_1overPvalueerror; - std::vector<double> *m_PhiValue; - std::vector<double> *m_PhiValueerror; - std::vector<double> *m_ThetaValue; - std::vector<double> *m_ThetaValueerror; - std::vector<double> *m_RadiusValue; - std::vector<double> *m_Zvalue; - std::vector<double> *m_FitValue; - std::vector<const Trk::TrackParameters*> *m_trackParameters; - - GraphParameter m_graphparameter; - GraphParameter m_mergedparameter; - - }; - -} -#endif diff --git a/Tracking/TrkFitter/TrkGaussianSumFilter/src/components/TrkGaussianSumFilter_entries.cxx b/Tracking/TrkFitter/TrkGaussianSumFilter/src/components/TrkGaussianSumFilter_entries.cxx index faae31bfe1fa7ace7af3455acd4ba8309f373bfc..4b91eb5328b6f7e3808198fb996358344c1e995e 100644 --- a/Tracking/TrkFitter/TrkGaussianSumFilter/src/components/TrkGaussianSumFilter_entries.cxx +++ b/Tracking/TrkFitter/TrkGaussianSumFilter/src/components/TrkGaussianSumFilter_entries.cxx @@ -20,8 +20,6 @@ #include "TrkGaussianSumFilter/GsfOutlierLogic.h" #include "TrkGaussianSumFilter/GsfExtrapolator.h" #include "TrkGaussianSumFilter/GsfSmoother.h" -#include "TrkGaussianSumFilter/BremFind.h" -//#include "TrkDetDescrInterfaces/ITrackingGeometrySvc.h" DECLARE_COMPONENT( Trk::QuickCloseComponentsMultiStateMerger ) DECLARE_COMPONENT( Trk::MultiComponentStateModeCalculator ) @@ -45,5 +43,4 @@ DECLARE_COMPONENT( Trk::ForwardGsfFitter ) DECLARE_COMPONENT( Trk::GsfOutlierLogic ) DECLARE_COMPONENT( Trk::GsfExtrapolator ) DECLARE_COMPONENT( Trk::GsfSmoother ) -DECLARE_COMPONENT( Trk::BremFind )