Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:23:36

0001 // Classname: TFitParticleECart
0002 // Author: Jan E. Sundermann, Verena Klose (TU Dresden)
0003 
0004 //________________________________________________________________
0005 //
0006 // TFitParticleECart::
0007 // --------------------
0008 //
0009 // Particle with cartesian 4vector parametrization and free mass
0010 // [four free parameters (px, py, pz, d) with initial values
0011 //  (px, py, pz, 1)]
0012 //
0013 // p = px*u1 + py*u2 + pz*u3
0014 // E = d
0015 //
0016 
0017 #include <iostream>
0018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0019 #include "PhysicsTools/KinFitter/interface/TFitParticleECart.h"
0020 
0021 //----------------
0022 // Constructor --
0023 //----------------
0024 TFitParticleECart::TFitParticleECart() : TAbsFitParticle() { init(nullptr, nullptr); }
0025 
0026 TFitParticleECart::TFitParticleECart(const TFitParticleECart& fitParticle)
0027     : TAbsFitParticle(fitParticle.GetName(), fitParticle.GetTitle()) {
0028   _nPar = fitParticle._nPar;
0029   _u1 = fitParticle._u1;
0030   _u2 = fitParticle._u2;
0031   _u3 = fitParticle._u3;
0032   _covMatrix.ResizeTo(fitParticle._covMatrix);
0033   _covMatrix = fitParticle._covMatrix;
0034   _iniparameters.ResizeTo(fitParticle._iniparameters);
0035   _iniparameters = fitParticle._iniparameters;
0036   _parameters.ResizeTo(fitParticle._parameters);
0037   _parameters = fitParticle._parameters;
0038   _pini = fitParticle._pini;
0039   _pcurr = fitParticle._pcurr;
0040 }
0041 
0042 TFitParticleECart::TFitParticleECart(TLorentzVector* pini, const TMatrixD* theCovMatrix) : TAbsFitParticle() {
0043   init(pini, theCovMatrix);
0044 }
0045 
0046 TFitParticleECart::TFitParticleECart(const TString& name,
0047                                      const TString& title,
0048                                      TLorentzVector* pini,
0049                                      const TMatrixD* theCovMatrix)
0050     : TAbsFitParticle(name, title) {
0051   init(pini, theCovMatrix);
0052 }
0053 
0054 TAbsFitParticle* TFitParticleECart::clone(const TString& newname) const {
0055   // Returns a copy of itself
0056 
0057   TAbsFitParticle* myclone = new TFitParticleECart(*this);
0058   if (newname.Length() > 0)
0059     myclone->SetName(newname);
0060   return myclone;
0061 }
0062 
0063 //--------------
0064 // Destructor --
0065 //--------------
0066 TFitParticleECart::~TFitParticleECart() {}
0067 
0068 //--------------
0069 // Operations --
0070 //--------------
0071 void TFitParticleECart::init(TLorentzVector* pini, const TMatrixD* theCovMatrix) {
0072   _nPar = 4;
0073   setIni4Vec(pini);
0074   setCovMatrix(theCovMatrix);
0075 }
0076 
0077 TLorentzVector* TFitParticleECart::calc4Vec(const TMatrixD* params) {
0078   // Calculates a 4vector corresponding to the given
0079   // parameter values
0080 
0081   if (params == nullptr) {
0082     return nullptr;
0083   }
0084 
0085   if (params->GetNcols() != 1 || params->GetNrows() != _nPar) {
0086     edm::LogError("WrongMatrixSize") << GetName() << "::calc4Vec - Parameter matrix has wrong size.";
0087     return nullptr;
0088   }
0089 
0090   Double_t X = (*params)(0, 0);
0091   Double_t Y = (*params)(1, 0);
0092   Double_t Z = (*params)(2, 0);
0093   Double_t E = (*params)(3, 0);
0094 
0095   TLorentzVector* vec = new TLorentzVector(X, Y, Z, E);
0096   return vec;
0097 }
0098 
0099 void TFitParticleECart::setIni4Vec(const TLorentzVector* pini) {
0100   // Set the initial 4vector. Will also set the
0101   // inital parameter values
0102 
0103   if (pini == nullptr) {
0104     _u1.SetXYZ(0., 0., 0.);
0105     _u3.SetXYZ(0., 0., 0.);
0106     _u2.SetXYZ(0., 0., 0.);
0107     _pini.SetXYZT(0., 0., 0., 0.);
0108     _pcurr = _pini;
0109 
0110     _iniparameters.ResizeTo(_nPar, 1);
0111     _iniparameters(0, 0) = 0;
0112     _iniparameters(1, 0) = 0;
0113     _iniparameters(2, 0) = 0;
0114     _iniparameters(3, 0) = 0.;
0115 
0116     _parameters.ResizeTo(_nPar, 1);
0117     _parameters = _iniparameters;
0118 
0119   } else {
0120     _pini = (*pini);
0121     _pcurr = _pini;
0122 
0123     _u1.SetXYZ(1., 0., 0.);
0124     _u2.SetXYZ(0., 1., 0.);
0125     _u3.SetXYZ(0., 0., 1.);
0126 
0127     _iniparameters.ResizeTo(_nPar, 1);
0128     _iniparameters(0, 0) = _pini.X();
0129     _iniparameters(1, 0) = _pini.Y();
0130     _iniparameters(2, 0) = _pini.Z();
0131     _iniparameters(3, 0) = _pini.E();
0132     _parameters.ResizeTo(_nPar, 1);
0133     _parameters = _iniparameters;
0134   }
0135 }
0136 
0137 TMatrixD* TFitParticleECart::getDerivative() {
0138   // returns derivative dP/dy with P=(p,E) and y=(px, py, pz, d)
0139   // the free parameters of the fit. The columns of the matrix contain
0140   // (dP/dpx, dP/dpy, ...).
0141 
0142   TMatrixD* DerivativeMatrix = new TMatrixD(4, 4);
0143   (*DerivativeMatrix) *= 0.;
0144 
0145   //1st column: dP/dx
0146   (*DerivativeMatrix)(0, 0) = 1.;
0147   (*DerivativeMatrix)(1, 0) = 0.;
0148   (*DerivativeMatrix)(2, 0) = 0.;
0149   (*DerivativeMatrix)(3, 0) = 0.;
0150 
0151   //2nd column: dP/dy
0152   (*DerivativeMatrix)(0, 1) = 0;
0153   (*DerivativeMatrix)(1, 1) = 1;
0154   (*DerivativeMatrix)(2, 1) = 0;
0155   (*DerivativeMatrix)(3, 1) = 0.;
0156 
0157   //3rd column: dP/dz
0158   (*DerivativeMatrix)(0, 2) = 0.;
0159   (*DerivativeMatrix)(1, 2) = 0.;
0160   (*DerivativeMatrix)(2, 2) = 1.;
0161   (*DerivativeMatrix)(3, 2) = 0.;
0162 
0163   //4th column: dP/dm
0164   (*DerivativeMatrix)(0, 3) = 0.;
0165   (*DerivativeMatrix)(1, 3) = 0.;
0166   (*DerivativeMatrix)(2, 3) = 0.;
0167   (*DerivativeMatrix)(3, 3) = 1.;
0168 
0169   return DerivativeMatrix;
0170 }
0171 
0172 TMatrixD* TFitParticleECart::transform(const TLorentzVector& vec) {
0173   // Returns the parameters corresponding to the given
0174   // 4vector
0175 
0176   TMatrixD* tparams = new TMatrixD(_nPar, 1);
0177   (*tparams)(0, 0) = vec.X();
0178   (*tparams)(1, 0) = vec.Y();
0179   (*tparams)(2, 0) = vec.Z();
0180   (*tparams)(3, 0) = vec.E();
0181 
0182   return tparams;
0183 }