Go to the documentation of this file.00001 #include <iostream>
00002 #include <memory>
00003 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionVertexFinder.h"
00004
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00007
00008
00009 #include <RecoVertex/KinematicFitPrimitives/interface/KinematicParticleFactoryFromTransientTrack.h>
00010
00011 #include "CommonTools/Statistics/interface/ChiSquaredProbability.h"
00012
00013
00014 #include "RecoVertex/KinematicFit/interface/KinematicConstrainedVertexFitterT.h"
00015 #include "RecoVertex/KinematicFit/interface/ColinearityKinematicConstraintT.h"
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 ConversionVertexFinder::ConversionVertexFinder(const edm::ParameterSet& config ):
00026 conf_(config)
00027 {
00028 LogDebug("ConversionVertexFinder") << "ConversionVertexFinder CTOR " << "\n";
00029 maxDelta_ = conf_.getParameter<double>("maxDelta");
00030 maxReducedChiSq_ = conf_.getParameter<double>("maxReducedChiSq");
00031 minChiSqImprovement_ = conf_.getParameter<double>("minChiSqImprovement");
00032 maxNbrOfIterations_ = conf_.getParameter<int>("maxNbrOfIterations");
00033 kcvFitter_ = new KinematicConstrainedVertexFitter();
00034 kcvFitter_->setParameters(conf_);
00035
00036 }
00037
00038 ConversionVertexFinder::~ConversionVertexFinder() {
00039
00040 LogDebug("ConversionVertexFinder") << "ConversionVertexFinder DTOR " << "\n";
00041 delete kcvFitter_;
00042
00043 }
00044
00045 bool ConversionVertexFinder::run(std::vector<reco::TransientTrack> pair, reco::Vertex& the_vertex) {
00046 bool found= false;
00047
00048 if ( pair.size() < 2) return found;
00049
00050 float sigma = 0.00000001;
00051 float chi = 0.;
00052 float ndf = 0.;
00053 float mass = 0.000511;
00054
00055
00056 KinematicParticleFactoryFromTransientTrack pFactory;
00057
00058 std::vector<RefCountedKinematicParticle> particles;
00059
00060 particles.push_back(pFactory.particle (pair[0],mass,chi,ndf,sigma,*pair[0].innermostMeasurementState().freeState()));
00061 particles.push_back(pFactory.particle (pair[1],mass,chi,ndf,sigma,*pair[1].innermostMeasurementState().freeState()));
00062
00063
00064 #ifdef OldKineFit
00065 ColinearityKinematicConstraint constr(ColinearityKinematicConstraint::PhiTheta);
00066
00067 RefCountedKinematicTree myTree = kcvFitter_->fit(particles, &constr);
00068 #else
00069
00070
00071 const MagneticField* mf = pair[0].field();
00072
00073 ColinearityKinematicConstraintT<colinearityKinematic::PhiTheta> constr;
00074 KinematicConstrainedVertexFitterT<2,2> kcvFitter(mf);
00075 kcvFitter.setParameters(conf_);
00076 RefCountedKinematicTree myTree = kcvFitter.fit(particles, &constr);
00077
00078 #ifdef KineFitDebug
00079
00080 ColinearityKinematicConstraint oldconstr(ColinearityKinematicConstraint::PhiTheta);
00081
00082 RefCountedKinematicTree oldTree = kcvFitter_->fit(particles, &oldconstr);
00083
00084
00085 if( oldTree->isValid() ) {
00086 std::cout << "old " << kcvFitter_->getNit() << std::endl;
00087 RefCountedKinematicVertex gamma_dec_vertex = oldTree->currentDecayVertex();
00088 if( gamma_dec_vertex->vertexIsValid())
00089 std::cout << gamma_dec_vertex->chiSquared() << " " << gamma_dec_vertex->degreesOfFreedom() << std::endl;
00090 std::cout << oldTree->currentParticle()->currentState().globalMomentum() <<
00091 oldTree->currentParticle()->currentState().globalPosition()<< std::endl;
00092 std::vector<RefCountedKinematicParticle> fStates=oldTree->finalStateParticles();
00093 for (unsigned int kk=0; kk<fStates.size(); kk++) {
00094 std::cout << fStates[kk]->currentState().globalMomentum() <<
00095 fStates[kk]->currentState().globalPosition() << std::endl;
00096 std::cout << fStates[kk]->currentState().kinematicParametersError().matrix()<<std::endl;
00097 }
00098 } else std::cout << "old invalid " << kcvFitter_->getNit() << std::endl;
00099
00100 if( myTree->isValid() ) {
00101 std::cout << "new " << kcvFitter.getNit() << std::endl;
00102 RefCountedKinematicVertex gamma_dec_vertex = myTree->currentDecayVertex();
00103 if( gamma_dec_vertex->vertexIsValid())
00104 std::cout << gamma_dec_vertex->chiSquared() << " " << gamma_dec_vertex->degreesOfFreedom() << std::endl;
00105 std::cout << myTree->currentParticle()->currentState().globalMomentum() <<
00106 myTree->currentParticle()->currentState().globalPosition()<< std::endl;
00107 std::vector<RefCountedKinematicParticle> fStates=myTree->finalStateParticles();
00108 for (unsigned int kk=0; kk<fStates.size(); kk++) {
00109 std::cout << fStates[kk]->currentState().globalMomentum() <<
00110 fStates[kk]->currentState().globalPosition() << std::endl;
00111 std::cout << fStates[kk]->currentState().kinematicParametersError().matrix()<<std::endl;
00112 }
00113 } else std::cout << "new invalid " << kcvFitter.getNit() << std::endl;
00114
00115 #endif // TemplateKineFitDebug
00116
00117 #endif
00118
00119 if( myTree->isValid() ) {
00120 myTree->movePointerToTheTop();
00121 RefCountedKinematicParticle the_photon = myTree->currentParticle();
00122 if (the_photon->currentState().isValid()){
00123
00124 RefCountedKinematicVertex gamma_dec_vertex;
00125 gamma_dec_vertex = myTree->currentDecayVertex();
00126 if( gamma_dec_vertex->vertexIsValid() ){
00127 const float chi2Prob = ChiSquaredProbability(gamma_dec_vertex->chiSquared(), gamma_dec_vertex->degreesOfFreedom());
00128 if (chi2Prob>0.){
00129
00130 the_vertex = *gamma_dec_vertex;
00131 found = true;
00132 }
00133 }
00134 }
00135 }
00136
00137 return found;
00138 }
00139
00140
00141 TransientVertex ConversionVertexFinder::run(std::vector<reco::TransientTrack> pair) {
00142 LogDebug("ConversionVertexFinder") << "ConversionVertexFinder run pair size " << pair.size() << "\n";
00143
00144
00145
00146
00147
00148
00149 reco::Vertex theVertex;
00150 KalmanVertexFitter fitter(true);
00151 TransientVertex transientVtx;
00152
00153 const std::string metname = "ConversionVertexFinder| ConversionVertexFinder";
00154 try{
00155
00156 transientVtx = fitter.vertex(pair);
00157
00158 } catch ( cms::Exception& e ) {
00159
00160
00161 edm::LogWarning(metname) << "cms::Exception caught in ConversionVertexFinder::run\n"
00162 << e.explainSelf();
00163
00164 }
00165
00166
00167 return transientVtx;
00168
00169
00170
00171 }
00172