#pragma once // Tb/TbEvent #include "Event/TbTrack.h" // Local #include "TbAlignmentBase.h" /** @class TbMillepede TbMillepede.h * * Implementation of the Millepede algorithm. * * @author Christoph Hombach * @date 2012-06-19 */ class TbMillepede : public TbAlignmentBase { public: /// Constructor TbMillepede(const std::string& type, const std::string& name, const IInterface* parent); /// Destructor virtual ~TbMillepede(); virtual StatusCode initialize(); void align(std::vector<TbAlignmentTrack*>& alignmentTracks); virtual void updateGeometry(); private: struct Equation { double rmeas; double weight; std::vector<int> indG; std::vector<double> derG; std::vector<int> indL; std::vector<double> derL; std::vector<int> indNL; std::vector<double> derNL; std::vector<double> slopes; }; struct Constraint { /// Right-hand side (Lagrange multiplier) double rhs; /// Coefficients std::vector<double> coefficients; }; /// (Re-)initialise matrices and vectors. bool reset(const unsigned int nPlanes, const double startfact); /// Setup the constraint equations. void setConstraints(const unsigned int nPlanes); /// Define a single constraint equation void addConstraint(const std::vector<double>& dercs, const double rhs); /// Add the equations for one track and do the local fit. bool putTrack(LHCb::TbTrack* track, const unsigned int nPlanes); /// Store the parameters for one measurement. void addEquation(std::vector<Equation>& equations, const std::vector<double>& derlc, const std::vector<double>& dergb, const std::vector<double>& dernl, const std::vector<int>& dernli, const std::vector<double>& dernls, const double rmeas, const double sigma); /// Perform local parameters fit using the equations for one track. bool fitTrack(const std::vector<Equation>& equations, std::vector<double>& trackParams, const bool singlefit, const unsigned int iteration); /// Perform global parameters fit. bool fitGlobal(); /// Print the results of the global parameters fit. bool printResults(); /// Matrix inversion and solution for global fit. int invertMatrix(std::vector<std::vector<double> >& v, std::vector<double>& b, const int n); /// Matrix inversion and solution for local fit. int invertMatrixLocal(std::vector<std::vector<double> >& v, std::vector<double>& b, const int n); /// Return the limit in chi2 / ndof for n sigmas. double chi2Limit(const int n, const int nd) const; /// Multiply matrix and vector bool multiplyAX(const std::vector<std::vector<double> >& a, const std::vector<double>& x, std::vector<double>& y, const unsigned int n, const unsigned int m); /// Multiply matrices bool multiplyAVAt(const std::vector<std::vector<double> >& v, const std::vector<std::vector<double> >& a, std::vector<std::vector<double> >& w, const unsigned int n, const unsigned int m); /// Number of global derivatives unsigned int m_nagb; /// Number of local derivatives unsigned int m_nalc; /// Equations for each track std::vector<std::vector<Equation> > m_equations; /// Constraint equations std::vector<Constraint> m_constraints; /// Flag for each global parameter whether it is fixed or not. std::vector<bool> m_fixed; /// Sigmas for each global parameter. std::vector<double> m_psigm; std::vector<std::vector<double> > m_cgmat; std::vector<std::vector<double> > m_corrm; std::vector<std::vector<double> > m_clcmat; std::vector<double> m_bgvec; std::vector<double> m_corrv; std::vector<double> m_diag; /// Difference in misalignment parameters with respect to initial values. std::vector<double> m_dparm; /// Mapping of internal numbering to geometry service planes. std::vector<unsigned int> m_millePlanes; bool m_debug; /// Flag to switch on/off iterations in the global fit. bool m_iterate; /// Residual cut after the first iteration. double m_rescut; /// Residual cut in the first iteration. double m_rescut_init; /// Factor in chisquare / ndof cut. double m_cfactr; /// Reference value for chisquare / ndof cut factor. double m_cfactref; // Number of standard deviations for chisquare / ndof cut. int m_nstdev; /// Number of "full" iterations (with geometry updates). unsigned int m_nIterations; /// Sigmas for each degree of freedom std::vector<double> m_sigmas; /// Planes to be kept fixed std::vector<unsigned int> m_fixedPlanes; /// Flag to fix all degrees of freedom or only the translations. bool m_fix_all; };