00001
00002 #include <Utilities/Configuration/interface/Architecture.h>
00003
00004 #include <XANADOO/XANAVertex/interface/XANAVertex.h>
00005 #include <XANADOO/XANATracks/interface/XANATrack.h>
00006 #include <XANADOO/XANAUtilities/interface/XANAToolkit.h>
00007
00008 #include <CommonReco/PersistentTrack/interface/TTrack.h>
00009 #include <CommonReco/PersistentTrack/interface/TrackReconstructor.h>
00010 #include <CommonReco/PatternTools/interface/TrackFinder.h>
00011 #include <TrackerReco/GtfPattern/interface/ModularKfReconstructor.h>
00012 #include <TrackerReco/TkSeedGenerator/interface/CombinatorialSeedGeneratorFromPixel.h>
00013 #include <TrackerReco/GtfPattern/interface/CombinatorialTrajectoryBuilder.h>
00014 #include <CommonReco/TrackFitters/interface/KFFittingSmoother.h>
00015 #include <CommonReco/PatternTools/interface/TrajectoryCleanerBySharedHits.h>
00016 #include "CommonReco/PatternTools/interface/RefittedRecTrack.h"
00017
00018 #include "Vertex/CARFVertex/interface/RecoVertex.h"
00019
00020 #include "CARF/Reco/interface/AutoRecCollection.h"
00021 #include "CARF/G3Event/interface/EventObservers.h"
00022 #include <CARF/Reco/interface/RecItr.h>
00023
00024 #include "Utilities/Notification/interface/Observer.h"
00025 #include <Utilities/Notification/interface/PackageInitializer.h>
00026 #include <Utilities/UI/interface/SimpleConfigurable.h>
00027
00028 #include <CLHEP/Geometry/Point3D.h>
00029 #include <vector>
00030
00031 struct VertexObserver : public Observer<G3EventProxy *>, public Observer<G3SetUp *> {
00032
00033 int nbVertices_ ;
00034 SimpleConfigurable<string> vertexReconstructorName_;
00035 SimpleConfigurable<string> trackReconstructorName_;
00036 TrackReconstructor *trackReconstructor_;
00037
00038 VertexObserver()
00039 : nbVertices_(0), trackReconstructor_(0)
00040 {
00041
00042 Observer<G3EventProxy *>::init() ;
00043 Observer<G3SetUp *>::init() ;
00044
00045
00046 vertexReconstructorName_=
00047 SimpleConfigurable<string>("PVRVertex","XANAVertex:VertexReconstructor");
00048 trackReconstructorName_=
00049
00050 SimpleConfigurable<string>("FKfTracks","XANAVertex:TrackReconstructor");
00051
00052 }
00053
00054 ~VertexObserver()
00055 {
00056 delete trackReconstructor_;
00057 xana::out(1)<<"[OVAL] number of vertices : "<<nbVertices_<<endl ;
00058 }
00059
00060 void upDate( G3SetUp *su )
00061 {
00062
00063
00064
00065 TrackFinder *myTrackFinder = new ModularKfReconstructor(
00066 new CombinatorialSeedGeneratorFromPixel(0.8,0.1,15.),
00067 new CombinatorialTrajectoryBuilder,
00068 new KFFittingSmoother,
00069 new TrajectoryCleanerBySharedHits);
00070 trackReconstructor_ =
00071 new TrackReconstructor(myTrackFinder,trackReconstructorName_.value().c_str()) ;
00072 }
00073
00074 void upDate( G3EventProxy * ev )
00075 {
00076
00077 if (!ev) return ;
00078
00079 RecItr<TTrack> track(ev->recEvent(),trackReconstructorName_.value().c_str());
00080 while (track.next()) {
00081 xana::out(1) << "new reconstructed track " << std::endl;
00082 TrajectoryStateOnSurface ts = (*track).impactPointState() ;
00083 xana::out(1) << "(*track).impactPointState() " <<(*track).impactPointState() << std::endl;
00084 TrajectoryStateOnSurface tsi = (*track).innermostState() ;
00085 xana::out(1) << "(*track).innermostState() " <<(*track).innermostState() << std::endl;
00086 TrajectoryStateOnSurface tso = (*track).outermostState() ;
00087 xana::out(1) << "(*track).outermostState() " <<(*track).outermostState() << std::endl;
00088 HepVector3D momentumAtVertex(track->momentumAtVertex().x(),
00089 track->momentumAtVertex().y(),track->momentumAtVertex().z());
00090 xana::out(1) << "(*track).momentumAtVertex() " <<(*track).momentumAtVertex() << std::endl;
00091 HepVector3D momentumAtFirst(tsi.globalMomentum().x(),tsi.globalMomentum().y(),
00092 tsi.globalMomentum().z());
00093 HepVector3D momentumAtLast(tso.globalMomentum().x(),tso.globalMomentum().y(),
00094 tso.globalMomentum().z());
00095 }
00096 AutoRecCollection<RecoVertex, G3EventProxy *> vertices(vertexReconstructorName_.value().c_str());
00097
00098
00099 vector<XANAVertex> xVertices;
00100 XANAVertex *xVertex=0;
00101 XANATrack *xTrack=0;
00102 for(AutoRecCollection<RecoVertex, G3EventProxy *>::const_iterator iv=vertices.begin();
00103 iv!=vertices.end(); iv++) {
00104 HepPoint3D position((*iv)->position().x(),(*iv)->position().y(),
00105 (*iv)->position().z());
00106 xVertex = new XANAVertex(position, (*iv)->totalChiSquared(),
00107 (*iv)->degreesOfFreedom(), vertexReconstructorName_.value().c_str());
00108
00109 xana::out(1) << "vertex found, loop on constituent tracks " << std::endl;
00110 vector <RefittedRecTrack> refTracks = (*iv)->refittedTracks();
00111 for (vector<RefittedRecTrack>::const_iterator it=refTracks.begin();
00112 it!=refTracks.end(); it++) {
00113 xana::out(1) << "new refitted track " << std::endl;
00114 TrajectoryStateOnSurface tsi = it->innermostState() ;
00115 xana::out(1) << "(*track).innermostState() " <<(*track).innermostState() << std::endl;
00116 TrajectoryStateOnSurface tso = it->outermostState() ;
00117 xana::out(1) << "(*track).outermostState() " <<(*track).outermostState() << std::endl;
00118
00119 GlobalVector momentum = it->momentumAtVertex();
00120 xana::out(1) << "tsi.momentum " << tsi.globalMomentum() << std::endl;
00121 HepVector3D momentumAtVertex;
00122 momentumAtVertex=HepVector3D(momentum.x(),
00123 momentum.y(), momentum.z());
00124 xana::out(1) << "momentum at vertex " << momentumAtVertex << std::endl;
00125 }
00126
00127 vector<RecTrack> recTracks = (*iv)->originalTracks();
00128 for (vector<RecTrack>::const_iterator it=recTracks.begin();
00129 it!=recTracks.end(); it++) {
00130 xana::out(1) << "new original track " << std::endl;
00131 TrajectoryStateOnSurface tsi = it->innermostState() ;
00132 xana::out(1) << "(*track).innermostState() " <<(*track).innermostState() << std::endl;
00133 TrajectoryStateOnSurface tso = it->outermostState() ;
00134 xana::out(1) << "(*track).outermostState() " <<(*track).outermostState() << std::endl;
00135 GlobalVector momentum = it->momentumAtVertex();
00136 HepVector3D momentumAtVertex;
00137 momentumAtVertex=HepVector3D(momentum.x(),
00138 momentum.y(), momentum.z());
00139 xana::out(1) << "momentum at vertex " << momentum << std::endl;
00140 HepPoint3D firstHit(tsi.globalPosition().x(),tsi.globalPosition().y(),
00141 tsi.globalPosition().z());
00142 HepVector3D momentumAtFirst(tsi.globalMomentum().x(),tsi.globalMomentum().y(),
00143 tsi.globalMomentum().z());
00144 HepPoint3D lastHit(tso.globalPosition().x(),tso.globalPosition().y(),
00145 tso.globalPosition().z());
00146 HepVector3D momentumAtLast(tso.globalMomentum().x(),tso.globalMomentum().y(),
00147 tso.globalMomentum().z());
00148 xTrack = new XANATrack;
00149 xana::out(1) << "track created " << std::endl;
00150 xTrack->setCharge(it->charge());
00151 xTrack->setChi2OverDof(it->normalisedChiSquared());
00152 xTrack->setNumberOfHits(it->foundHits());
00153 xTrack->setNumberOfLostHits(it->lostHits());
00154 xTrack->setImpactParameter(it->impactParameter3D().value());
00155 xTrack->setLongImpactParameter(it->zImpactParameter().value());
00156 xTrack->setTransImpactParameter(it->transverseImpactParameter().value());
00157 xTrack->setMomentumAtVertex(momentumAtVertex);
00158 xTrack->setPositionAtFirstPoint(firstHit);
00159 xTrack->setMomentumAtFirstPoint(momentumAtFirst);
00160 xTrack->setPositionAtLastPoint(lastHit);
00161 xTrack->setMomentumAtLastPoint(momentumAtLast);
00162 xTrack->setAlgoName(trackReconstructorName_.value());
00163 xana::out(1) << "adding track " << std::endl;
00164 xVertex->addTrack(xTrack);
00165 }
00166 }
00167
00168
00169 vector<XANAVertex>::iterator iv;
00170 for (iv=xVertices.begin(); iv!=xVertices.end(); iv++)
00171 {
00172 xana::out(1)<<"[OVAL] new vertex with position "<<iv->getPosition()<<endl ;
00173 }
00174 }
00175
00176 } ;
00177
00178 static PKBuilder<VertexObserver> VertexObserver("VertexObserver") ;
00179
00180