Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 11:56:12

0001 #ifndef Alignment_CommonAlignmentParametrization_ParametersToParametersDerivatives_h
0002 #define Alignment_CommonAlignmentParametrization_ParametersToParametersDerivatives_h
0003 
0004 /// \class ParametersToParametersDerivatives
0005 ///
0006 /// Class for getting the jacobian d_mother/d_component for various kinds
0007 /// of alignment parametrisations, i.e. the derivatives expressing the influence
0008 /// of the parameters of the 'component' on the parameters of its 'mother'.
0009 /// This is needed e.g. to formulate constraints to remove the additional
0010 /// degrees of freedom introduced if larger structures and their components
0011 /// are aligned simultaneously.
0012 /// The jacobian matrix is
0013 ///
0014 /// / dp1_l/dp1_i dp1_l/dp2_i  ...  dp1_l/dpn_i |
0015 /// | dp2_l/dp1_i dp2_l/dp2_i  ...  dp2_l/dpn_i |
0016 /// |      .           .                 .      |
0017 /// |      .           .                 .      |
0018 /// |      .           .                 .      |
0019 /// \ dpm_l/dpm_i dpm_l/dpm_i  ...  dpm_l/dpn_i /
0020 ///
0021 /// where
0022 /// p1_l, p2_l, ..., pn_l are the n parameters of the composite 'mother' object
0023 /// and
0024 /// p1_i, p2_i, ..., pm_i are the m parameters of its component.
0025 ///
0026 /// Note that not all combinations of parameters are supported:
0027 /// Please check method isOK() before accessing the derivatives via
0028 /// operator(unsigned int indParMother, unsigned int indParComp).
0029 ///
0030 /// Currently these parameters are supported:
0031 /// - mother: rigid body parameters,
0032 /// - component: rigid body, bowed surface or two bowed surfaces parameters.
0033 ///
0034 ///  $Date: 2010/12/09 19:53:42 $
0035 ///  $Revision: 1.1 $
0036 /// (last update by $Author: flucke $)
0037 
0038 #include "DataFormats/Math/interface/AlgebraicROOTObjects.h"
0039 #include "TMatrixD.h"
0040 
0041 class Alignable;
0042 
0043 class ParametersToParametersDerivatives {
0044 public:
0045   ParametersToParametersDerivatives(const Alignable &component, const Alignable &mother);
0046 
0047   /// Indicate whether able to provide the derivatives.
0048   bool isOK() const { return isOK_; }
0049 
0050   /// Return the derivative DeltaParam(mother)/DeltaParam(component).
0051   /// Indices start with 0 - but check isOK() first!
0052   /// See class description about matrix.
0053   double operator()(unsigned int indParMother, unsigned int indParComp) const;
0054 
0055   // Not this - would make the internals public:
0056   //  const TMatrixD& matrix() const { return derivatives_;}
0057 
0058 private:
0059   /// init by choosing the correct detailed init method depending on parameter
0060   /// types
0061   bool init(const Alignable &component, int typeComponent, const Alignable &mother, int typeMother);
0062   /// init for component and mother both with RigidBody parameters
0063   bool initRigidRigid(const Alignable &component, const Alignable &mother);
0064   /// init for component with BowedSurface and mother with RigidBody parameters
0065   bool initBowedRigid(const Alignable &component, const Alignable &mother);
0066   /// init for component with TwoBowedSurfaces and mother with RigidBody
0067   /// parameters
0068   bool init2BowedRigid(const Alignable &component, const Alignable &mother);
0069 
0070   typedef ROOT::Math::SMatrix<double, 6, 9, ROOT::Math::MatRepStd<double, 6, 9>> AlgebraicMatrix69;
0071   /// from d(rigid_mother)/d(rigid_component) to
0072   /// d(rigid_mother)/d(bowed_component) for bad input (length or width zero),
0073   /// set object to invalid: isOK_ = false
0074   AlgebraicMatrix69 dRigid_dBowed(const AlgebraicMatrix66 &dRigidM2dRigidC, double halfWidth, double halfLength);
0075 
0076   /// data members
0077   bool isOK_;             /// can we provide the desired?
0078   TMatrixD derivatives_;  /// matrix of derivatives
0079 };
0080 
0081 #endif