/* Copyright 2008-2009, Technische Universitaet Muenchen, Authors: Christian Hoeppner & Sebastian Neubert This file is part of GENFIT. GENFIT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GENFIT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with GENFIT. If not, see . */ #include "TVector3.h" #include #include "GFTrackProximity.h" #include "GFTrack.h" #include "GFAbsTrackRep.h" using namespace std; double trkDist(GFAbsTrackRep* rep1, GFAbsTrackRep* rep2){ TVector3 d=rep1->getPos()-rep2->getPos(); //cout<<"trkDist"<getCardinalRep(); GFAbsTrackRep* rep2=trk2->getCardinalRep(); return trackProximity(rep1,rep2); } TVector3 trackProximity(GFAbsTrackRep* rep1, GFAbsTrackRep* rep2){ // TODO: make accuracy configurable! // a simple newtonian search. double h=0.01; double m1=999999; double s1=0; int steps=0; double oldd=999999; double d=99999; // TVector3 pos,mom,poserr,momerr; //cout<<"GFTrackProximity start ########################################################################################################################"<d && steps<100){ //cout<<"GFTrackProximity::steps:"<stepalong(s1,point1,dir1); plane1.setO(point1); //cout<<"track1 ";point1.Print(); plane1.setNormal(dir1); rep1->GFAbsTrackRep::extrapolate(plane1); rep2->extrapolateToPoint(point1,point2,norm2); plane2.setO(point1); plane2.setNormal(norm2); rep2->GFAbsTrackRep::extrapolate(plane2); oldd=d; ++steps; d=trkDist(rep1,rep2); //cout<<"dist"<stepalong(h,point1,dir1); //cout<<"track1 ";point1.Print(); plane1.setO(point1); plane1.setNormal(dir1); rep1->GFAbsTrackRep::extrapolate(plane1); rep2->extrapolateToPoint(point1,point2,norm2); plane2.setO(point1); plane2.setNormal(norm2); rep2->GFAbsTrackRep::extrapolate(plane2); double d1=trkDist(rep1,rep2); //cout<<"dist"<200)s1= s1>0 ? 180 : -180; //std:://cout<<"d="<GFAbsTrackRep::extrapolate(plane1); rep2->extrapolateToPoint(point1,point2,norm2); plane2.setO(point1); plane2.setNormal(norm2); rep2->GFAbsTrackRep::extrapolate(plane2); // three points -> fit a parabola -> minimum h=1.; double d0=trkDist(rep1,rep2); //cout<<"dist"<stepalong(h,point1,dir1); //cout<<"track1 ";point1.Print(); plane1.setO(point1); plane1.setNormal(dir1); rep1->GFAbsTrackRep::extrapolate(plane1); rep2->extrapolateToPoint(point1,point2,norm2); plane2.setO(point1); plane2.setNormal(norm2); rep2->GFAbsTrackRep::extrapolate(plane2); double d1=trkDist(rep1,rep2); //cout<<"dist"<stepalong(-2.*h,point1,dir1); //cout<<"track1 ";point1.Print(); plane1.setO(point1); plane1.setNormal(dir1); rep1->GFAbsTrackRep::extrapolate(plane1); rep2->extrapolateToPoint(point1,point2,norm2); plane2.setO(point1); plane2.setNormal(norm2); rep2->GFAbsTrackRep::extrapolate(plane2); double d2=trkDist(rep1,rep2); //cout<<"dist"<GFAbsTrackRep::getPos(); TVector3 posB=rep2->GFAbsTrackRep::getPos(); TVector3 poca=(posB+posA)*0.5; return poca; // return trkDist(rep1,rep2); } s/=denom; //std:://cout<<"d0="<GFAbsTrackRep::extrapolate(plane1); rep2->extrapolateToPoint(point1,point2,norm2); plane2.setO(point1); plane2.setNormal(norm2); rep2->GFAbsTrackRep::extrapolate(plane2); //double d3=trkDist(rep1,rep2); //cout<<"dist"<GFAbsTrackRep::getPos(); TVector3 posB=rep2->GFAbsTrackRep::getPos(); TVector3 poca=(posB+posA)*0.5; return poca; //return trkDist(rep1,rep2); }