Main Page | Class Hierarchy | Compound List | File List | Compound Members | File Members

TTVertexConstraint.C

Go to the documentation of this file.
00001 #include "jbltools/kinfit/TTVertexConstraint.h"
00002 #include "jbltools/kinfit/TrackFitObject.h"
00003 
00004 #include<iostream>
00005 #include<cassert>
00006 
00007 using std::cout;
00008 using std::endl;
00009 
00010 TTVertexConstraint::TTVertexConstraint (const TrackFitObject& t0, 
00011                                     int i0,
00012                                     const TrackFitObject& t1,
00013                                     int i1,
00014                                     int axis
00015                                    )
00016 : cachevalid(false)
00017 { 
00018   tracks[0]  = &t0;
00019   vnumber[0] = i0;
00020   tracks[1]  = &t1;
00021   vnumber[1] = i1;
00022   sign[0] = +1;
00023   sign[1] = -1;
00024   switch (axis) {
00025     case 1:
00026       factor.setValues (0, 10, 0);
00027       break;
00028     case 2:
00029       factor.setValues (0, 0, 10);
00030       break;
00031     default:
00032       factor.setValues (10, 0, 0);
00033   }
00034 }
00035 
00036 // destructor
00037 TTVertexConstraint::~TTVertexConstraint () {}
00038 
00039 // calculate current value of constraint function
00040 double TTVertexConstraint::getValue() const {
00041   return sign[0]*(factor*tracks[0]->getVertex (vnumber[0])) + 
00042          sign[1]*(factor*tracks[1]->getVertex (vnumber[1]));
00043 }
00044 
00045 // calculate vector/array of derivatives of this contraint 
00046 // w.r.t. to ALL parameters of all fitobjects
00047 void TTVertexConstraint::getDerivatives(int idim, double der[]) const {
00048   for (int i = 0; i < 2; ++i) {
00049     for (int ilocal = 0; ilocal < tracks[i]->getNPar(); ilocal++) {
00050       if (!tracks[i]->isParamFixed(ilocal)) {
00051         int iglobal = tracks[i]->getGlobalParNum (ilocal);
00052         assert (iglobal >= 0 && iglobal < idim);
00053         der[iglobal] = sign[i]*(factor*tracks[i]->getVertexDerivative (vnumber[i], ilocal));
00054       }
00055     }
00056   }
00057 }
00058   
00059 void TTVertexConstraint::add1stDerivativesToMatrix(int idim, double *M) const {
00060 
00061   assert (0);
00062 
00063 //   assert (M);
00064 //   int kglobal = getGlobalNum();
00065 //   assert (kglobal >= 0 && kglobal < idim);
00066 //   
00067 //   for (ConstFitObjectIterator i = fitobjects.begin(); i != fitobjects.end(); ++i) {
00068 //     const ParticleFitObject *fo = *i;
00069 //     assert (fo);
00070 //     for (int ilocal = 0; ilocal < fo->getNPar(); ++ilocal) {
00071 //       int iglobal = fo->getGlobalParNum (ilocal);
00072 //       assert (iglobal >= 0 && iglobal < idim);
00073 //       double d = fo->getDPx(ilocal);
00074 //       M[idim*iglobal+kglobal] += d;
00075 //       M[idim*kglobal+iglobal] += d;
00076 //     }
00077 //     
00078 //   }
00079 }
00080   
00081 void TTVertexConstraint::add2ndDerivativesToMatrix(int idim, double *M, double lambda) const {
00082 
00083   assert (0);
00084 }
00085     
00086 // void TTVertexConstraint::addToGlobalDerMatrix (double lambda, int idim, double *M) const {
00087 // 
00088 //   assert (0);
00089 //   // Add lambda*d^2 g / d x_i dx_j to global matrix
00090 //   
00091 //   if (lambda == 0) return;
00092 //   
00093 //   // d^2 g / (dx_i dx_j) = 
00094 //   //   = sum_k,l d^2 g/(dpx_k dpx_l) * dpx_k/dx_i dpx_l/dx_j
00095 //   //     + sum_k dg/dpx_k * d^2 px_k/(dx_i dx_j)
00096 //   //   = sum_k,l      1              * dpx_k/dx_i dpx_l/dx_j
00097 //   
00098 //   // assume here that different 4-vectors always depend on 
00099 //   // different parameters!
00100 //   
00101 //   if (!cachevalid) updateCache();
00102 //   
00103 //   int *globalParNum = new int[nparams];
00104 //   double *der = new double[nparams];
00105 //   
00106 // //   ipar = 0;
00107 // //   for (int i = 0; i < fitobjects.size(); i++) {
00108 // //     for (int ilocal = 0; ilocal < fitobjects[i]->getNPar(); ilocal++) {
00109 // //       int iglobal = fitobjects[i]->getGlobalParNum (ilocal);
00110 // //       if (iglobal >= 0) {
00111 // //         assert (ipar < nparams);
00112 // //         globalParNum[ipar] = iglobal;
00113 // //         der[ipar] = fitobjects[i]->getDPx (ilocal);
00114 // //         ipar++;
00115 // //       }
00116 // //   }
00117 //   
00118 //   for (int ipar = 0; ipar < nparams; ipar++) {
00119 //     int iglobal = globalParNum[ipar];
00120 //     double der_i = der[ipar];
00121 //     for (int jpar = ipar; jpar < nparams; jpar++) {
00122 //       int jglobal = globalParNum[ipar];
00123 //       double der_j = der[jpar];
00124 //       double l_der_ij = lambda*der_i*der_j;
00125 //       M[idim*iglobal+jglobal] += l_der_ij;
00126 //       if (ipar != jpar) M[idim*jglobal+iglobal] += l_der_ij;
00127 //     }
00128 //   }       
00129 // }
00130 
00131 void TTVertexConstraint::invalidateCache() const {
00132   cachevalid = false;
00133 }
00134 
00135 void TTVertexConstraint::updateCache() const {
00136   cachevalid = true;
00137 }
00138   

Generated on Fri Sep 14 17:38:21 2007 for Kinfit by doxygen 1.3.2