CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoVertex/TertiaryTracksVertexFinder/src/Flight2DSvFilter.cc

Go to the documentation of this file.
00001 
00002 #include "RecoVertex/TertiaryTracksVertexFinder/interface/Flight2DSvFilter.h"
00003 
00004 #include "RecoVertex/TertiaryTracksVertexFinder/interface/DistanceOfVertices2D.h"
00005 
00006 
00007 Flight2DSvFilter::Flight2DSvFilter () {
00008   // init. data members
00009   maxFlightDist2D                = 2.5  ;  // cm             
00010   minFlightDist2D                = 0.01 ;  // cm           
00011   minFlightDistSignificance2D    = 3.0  ;
00012   minTracksInVertex              = 2    ;
00013   usePrimaryVertex = false;
00014 }
00015 
00016 
00017 Flight2DSvFilter::Flight2DSvFilter ( double maxDist2D=2.5 , double minDist2D=0.01 , double  minSign2D=3.0 , int  minTracks=2 ) {
00018   // init. data members
00019   maxFlightDist2D                = maxDist2D ;  // cm             
00020   minFlightDist2D                = minDist2D ;  // cm           
00021   minFlightDistSignificance2D    = minSign2D ;
00022   minTracksInVertex              = minTracks ;
00023   usePrimaryVertex = false; 
00024 }
00025 
00026 Flight2DSvFilter::Flight2DSvFilter ( TransientVertex primaryVertex , double maxDist2D=2.5 , double minDist2D=0.01 , double  minSign2D=3.0 , int  minTracks=2 ) {
00027   // init. data members
00028   maxFlightDist2D                = maxDist2D ;  // cm             
00029   minFlightDist2D                = minDist2D ;  // cm           
00030   minFlightDistSignificance2D    = minSign2D ;
00031   minTracksInVertex              = minTracks ;
00032   if(primaryVertex.isValid()) {
00033     PrimaryVertex = primaryVertex;  
00034     usePrimaryVertex = true;
00035   }
00036   else
00037     usePrimaryVertex = false;
00038 }
00039 
00040 bool Flight2DSvFilter::operator () ( const TransientVertex & VertexToFilter ) const {
00041   bool passed = true ;
00042  
00043   double flightDist=0;       
00044   double SignificanceForFlightDist=0; 
00045   if( usePrimaryVertex ) { 
00046     if (debug) std::cout <<"[Flight2DSvFilter] using PV\n";
00047     DistanceOfVertices2D MyDistanceOfVertices2D;  
00048     Measurement1D DistanceMeasurement = MyDistanceOfVertices2D.distance( PrimaryVertex , VertexToFilter ); 
00049     flightDist = DistanceMeasurement.value();  
00050     SignificanceForFlightDist = DistanceMeasurement.significance();  
00051   }
00052   else {   
00053     if (debug) std::cout <<"[Flight2DSvFilter] NOT using PV\n";
00054     flightDist = DistanceToBeamLine( VertexToFilter ); 
00055     SignificanceForFlightDist = DistanceSignificance2DToBeamLine( VertexToFilter );
00056   }
00057 
00058   int NrTracksInVertex = VertexToFilter.originalTracks().size();        
00059 
00060   if (debug) std::cout <<"[Flight2DSvFilter] ntracks,flightdist,flightdistsign: "<<NrTracksInVertex<<","<<flightDist<<","<<SignificanceForFlightDist<<std::endl;
00061             
00062   // check condidtions 1 by 1 
00063   
00064   if ( flightDist                > maxFlightDist2D )              passed = false ;
00065   if ( flightDist                < minFlightDist2D )              passed = false ;   
00066   if ( SignificanceForFlightDist < minFlightDistSignificance2D )  passed = false ;
00067   if ( NrTracksInVertex < minTracksInVertex )                     passed = false ;
00068 
00069   if (debug && !passed) std::cout <<"[Flight2DSvFilter] failed!\n";
00070 
00071   return passed ;
00072 }
00073 
00074 
00075 double Flight2DSvFilter::DistanceToBeamLine( const TransientVertex & theTransientVertex) const {
00076   double Distance = sqrt (  theTransientVertex.position().x() * theTransientVertex.position().x() 
00077                       + theTransientVertex.position().y() * theTransientVertex.position().y() );
00078   return Distance;
00079 }
00080 
00081 
00082 double Flight2DSvFilter::DistanceSignificance2DToBeamLine( const TransientVertex & theTransientVertex ) const {
00083   
00084   double sigmaX = 0.0015 ;  double covXp2 = sigmaX * sigmaX;   // error on beam 
00085   double sigmaY = 0.0015 ;  double covYp2 = sigmaY * sigmaY;   // error on beam 
00086   
00087   double xS = ( theTransientVertex.position().x() );  double xS2 = xS*xS ;
00088   double yS = ( theTransientVertex.position().y() );  double yS2 = yS*yS ;     
00089   double covXs2 = theTransientVertex.positionError().cxx();
00090   double covYs2 = theTransientVertex.positionError().cyy();
00091   double covXsYs = theTransientVertex.positionError().cyx();
00092 
00093   double DistanceToBeam = DistanceToBeamLine( theTransientVertex ); 
00094 
00095   double sigmaDistance = 0.0; 
00096    if(DistanceToBeam > 0.0) sigmaDistance = ( 1 / (DistanceToBeam * DistanceToBeam) ) *
00097                               ( xS2 * covXs2          + 
00098                                 xS2 * covXp2          + 
00099                                 yS2 * covYs2          + 
00100                                 yS2 * covYp2          + 
00101                                 2 * xS * yS * covXsYs );
00102   
00103    double SignificanceForSv=0.0; 
00104    if( DistanceToBeam - minFlightDist2D >0 && sigmaDistance > 0.0) SignificanceForSv = (DistanceToBeam) / sqrt(sigmaDistance);
00105      
00106    return(SignificanceForSv);
00107 }
00108 
00109 
00110 void Flight2DSvFilter::setPrimaryVertex( const TransientVertex & primaryVertex ) {
00111 
00112   PrimaryVertex = primaryVertex;  
00113   usePrimaryVertex = true;
00114 
00115 }
00116 
00117 
00118 
00119   
00120 
00121 
00122