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
00009 maxFlightDist2D = 2.5 ;
00010 minFlightDist2D = 0.01 ;
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
00019 maxFlightDist2D = maxDist2D ;
00020 minFlightDist2D = minDist2D ;
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
00028 maxFlightDist2D = maxDist2D ;
00029 minFlightDist2D = minDist2D ;
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
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;
00085 double sigmaY = 0.0015 ; double covYp2 = sigmaY * sigmaY;
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