CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/TrackingTools/GsfTools/src/MultiTrajectoryStateCombiner.cc

Go to the documentation of this file.
00001 #include "TrackingTools/GsfTools/interface/MultiTrajectoryStateCombiner.h"
00002 
00003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00004 
00005 TrajectoryStateOnSurface 
00006 MultiTrajectoryStateCombiner::combine(const std::vector<TrajectoryStateOnSurface>& tsos) const {
00007   
00008   if (tsos.empty()) {
00009     edm::LogError("MultiTrajectoryStateCombiner") 
00010       << "Trying to collapse empty set of trajectory states!";
00011     return TrajectoryStateOnSurface();
00012   }
00013 
00014   double pzSign = tsos.front().localParameters().pzSign();
00015   for (std::vector<TrajectoryStateOnSurface>::const_iterator it = tsos.begin(); 
00016        it != tsos.end(); it++) {
00017     if (it->localParameters().pzSign() != pzSign) {
00018       edm::LogError("MultiTrajectoryStateCombiner") 
00019         << "Trying to collapse trajectory states with different signs on p_z!";
00020       return TrajectoryStateOnSurface();
00021     }
00022   }
00023   
00024   if (tsos.size() == 1) {
00025     return TrajectoryStateOnSurface(tsos.front());
00026   }
00027   
00028   double sumw = 0.;
00029   //int dim = tsos.front().localParameters().vector().num_row();
00030   AlgebraicVector5 mean;
00031   AlgebraicSymMatrix55 covarPart1, covarPart2;
00032   for (std::vector<TrajectoryStateOnSurface>::const_iterator it1 = tsos.begin(); 
00033        it1 != tsos.end(); it1++) {
00034     double weight = it1->weight();
00035     AlgebraicVector5 param = it1->localParameters().vector();
00036     sumw += weight;
00037     mean += weight * param;
00038     covarPart1 += weight * it1->localError().matrix();
00039     for (std::vector<TrajectoryStateOnSurface>::const_iterator it2 = it1 + 1; 
00040          it2 != tsos.end(); it2++) {
00041       AlgebraicVector5 diff = param - it2->localParameters().vector();
00042       AlgebraicSymMatrix11 s = AlgebraicMatrixID(); //stupid trick to make CLHEP work decently
00043       covarPart2 += weight * it2->weight() * 
00044                                 ROOT::Math::Similarity(AlgebraicMatrix51(diff.Array(), 5), s);
00045                         //FIXME: we can surely write this thing in a better way
00046     }   
00047   }
00048   double sumwI = 1.0/sumw;
00049   mean *= sumwI;
00050   covarPart1 *= sumwI; covarPart2 *= (sumwI*sumwI);
00051   AlgebraicSymMatrix55 covar = covarPart1 + covarPart2;
00052 
00053   return TrajectoryStateOnSurface(LocalTrajectoryParameters(mean, pzSign), 
00054                                   LocalTrajectoryError(covar), 
00055                                   tsos.front().surface(), 
00056                                   &(tsos.front().globalParameters().magneticField()),
00057                                   tsos.front().surfaceSide(), 
00058                                   sumw);
00059 }
00060