CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
VertexFitterResult.cc
Go to the documentation of this file.
5 
6 using namespace reco;
7 using namespace std;
8 
10  : associatorForParamAtPca(associator)
11 {
12  theMaxTracks = maxTracks;
14  for ( int i=0; i<5; i++ ) {
15  if ( maxTracks>0 ) {
16  simPars[i] = new float[maxTracks];
17  recPars[i] = new float[maxTracks];
18  refPars[i] = new float[maxTracks];
19  recErrs[i] = new float[maxTracks];
20  refErrs[i] = new float[maxTracks];
21  }
22  else {
23  simPars[i] = 0;
24  recPars[i] = 0;
25  refPars[i] = 0;
26  recErrs[i] = 0;
27  refErrs[i] = 0;
28  }
29  }
30  trackWeight = new float[maxTracks];
31  simIndex = new int[maxTracks];
32  recIndex = new int[maxTracks];
35  reset();
36 }
37 
39 {
40  //
41  // delete arrays
42  //
43  for ( int i=0; i<5; i++ ) {
44  delete [] simPars[i];
45  delete [] recPars[i];
46  delete [] refPars[i];
47  delete [] recErrs[i];
48  delete [] refErrs[i];
49  }
50  delete trackWeight;
51  delete simIndex;
52  delete recIndex;
53 }
54 
56  const TrackingVertex * simv, reco::RecoToSimCollection *recSimColl,
57  const float &time)
58 {
59  TTrackCont recTrackV;
60  if (recVertex.isValid()) recTrackV = recVertex.originalTracks();
61  fill(recVertex, recTrackV, simv, recSimColl, time);
62 }
63 
64 void VertexFitterResult::fill(const TransientVertex & recVertex,
65  const TTrackCont & recTrackV, const TrackingVertex * simv,
66  reco::RecoToSimCollection *recSimColl, const float &time)
67 {
68  TrackingParticleRefVector simTrackV;
69 
71  if (recVertex.isValid()) {
72  recPos[0] = recVertex.position().x();
73  recPos[1] = recVertex.position().y();
74  recPos[2] = recVertex.position().z();
75 
76  recErr[0] = sqrt(recVertex.positionError().cxx());
77  recErr[1] = sqrt(recVertex.positionError().cyy());
78  recErr[2] = sqrt(recVertex.positionError().czz());
79  vert = (Basic3DVector<double>) recVertex.position();
80 
81  chi[0] = recVertex.totalChiSquared();
82  chi[1] = recVertex.degreesOfFreedom();
83  chi[2] = ChiSquaredProbability(recVertex.totalChiSquared(),
84  recVertex.degreesOfFreedom());
85  vertex = 2;
86  fitTime = time;
87  tracks[1] = recVertex.originalTracks().size();
88  }
89 
90  if (simv!=0) {
91  simPos[0] = simv->position().x();
92  simPos[1] = simv->position().y();
93  simPos[2] = simv->position().z();
94 
95  simTrackV = simv->daughterTracks();
96  vertex += 1;
98  (simTrack != simv->daughterTracks_end() && (numberOfSimTracks<theMaxTracks));
99  simTrack++) {
100 
101  Basic3DVector<double> momAtVtx((**simTrack).momentum());
102 
103  std::pair<bool, reco::TrackBase::ParameterVector> paramPair =
105  (float) (**simTrack).charge(), recTrackV.front().stateAtBeamLine().beamSpot());
106  if (paramPair.first) {
107  fillParameters(paramPair.second, simPars, numberOfSimTracks);
110  }
111  }
113  }
114 
115 
116  // now store all the recTrack...
117 
118  for(TTrackCont::const_iterator recTrack =recTrackV.begin();
119  (recTrack != recTrackV.end()
121  recTrack++) {
122  // std::cout << "Input; 1/Pt " << 1./(*recTrack).momentumAtVertex().transverse() << std::endl;
123 
124  //looking for sim tracks corresponding to our reconstructed tracks:
126 
127  std::vector<std::pair<TrackingParticleRef, double> > simFound;
128  try {
129  const TrackTransientTrack* ttt = dynamic_cast<const TrackTransientTrack*>(recTrack->basicTransientTrack());
130  if ((ttt!=0) && (recSimColl!=0)) simFound = (*recSimColl)[ttt->trackBaseRef()];
131 // if (recSimColl!=0) simFound = (*recSimColl)[recTrack->persistentTrackRef()];
132 // if (recSimColl!=0) simFound = (*recSimColl)[recTrack];
133 
134  } catch (cms::Exception e) {
135 // LogDebug("TrackValidator") << "reco::Track #" << rT << " with pt=" << track->pt()
136 // << " NOT associated to any TrackingParticle" << "\n";
137 // edm::LogError("TrackValidator") << e.what() << "\n";
138  }
139 
140  if(simFound.size() != 0) {
141  //OK, it was associated, so get the state on the same surface as the 'SimState'
143  find(simTrackV.begin(), simTrackV.end(), simFound[0].first);
144  if (simTrackI!=simTrackV.end()) ++tracks[2];
145  int simTrackIndex = simTrackI-simTrackV.begin();
146  if (simTrackIndex<numberOfSimTracks) {
147  simIndex[numberOfRecTracks] = simTrackIndex;
148  recIndex[simTrackIndex] = numberOfRecTracks;
149  // cout << "Assoc; 1/Pt " << 1./(*recTrack).momentumAtVertex().transverse() << std::endl;
150  }
151  }
152 
153  TrajectoryStateClosestToPoint tscp = recTrack->trajectoryStateClosestToPoint(recVertex.position());
154  fillParameters(recTrack->track().parameters(), recPars, numberOfRecTracks);
156 // trackWeight[numberOfRecTracks] = recVertex.trackWeight(*recTrack);
157 //
158 // if ((recVertex.isValid())&&(recVertex.hasRefittedTracks())) {
159 // //looking for corresponding refitted tracks:
160 // TrajectoryStateOnSurface refip;
161 // RecTrackCont::iterator refTrackI =
162 // find_if(refTracks.begin(), refTracks.end(), RecTrackMatch(*recTrack));
163 // if (refTrackI!=refTracks.end()) {
164 // // If it was not found, it would mean that it was not used in the fit,
165 // // or with a low weight such that the track was then discarded.
166 // if(simFound.size() != 0) {
167 // refip = refTrackI->stateOnSurface(simFound[0]->impactPointStateOnSurface().surface());
168 // } else {
169 // refip = refTrackI->innermostState();
170 // }
171 //
172 // fillParameters(refip, refPars, numberOfRecTracks);
173 // fillErrors(refip, refErrs, numberOfRecTracks);
174 // }
175 // }
176 //
178  }
179 
180 }
181 
183  float* params[5], int trackNumber)
184 {
185  params[0][trackNumber] = perigee[0];
186  params[1][trackNumber] = perigee[1];
187  params[2][trackNumber] = perigee[2];
188  params[3][trackNumber] = perigee[3];
189  params[4][trackNumber] = perigee[4];
190 }
191 
193  float* params[5], int trackNumber)
194 {
195  const AlgebraicVector5 & perigee = ptp.vector();
196  params[0][trackNumber] = perigee[0];
197  params[1][trackNumber] = perigee[1];
198  params[2][trackNumber] = perigee[2];
199  params[3][trackNumber] = perigee[3];
200  params[4][trackNumber] = perigee[4];
201 }
202 
204  float* errors[5], int trackNumber)
205 {
206  errors[0][trackNumber] = pte.transverseCurvatureError();
207  errors[1][trackNumber] = pte.thetaError();
208  errors[2][trackNumber] = pte.phiError();
209  errors[3][trackNumber] = pte.transverseImpactParameterError();
210  errors[4][trackNumber] = pte.longitudinalImpactParameterError();
211 }
212 
214 {
215  for ( int i=0; i<3; ++i ) {
216  simPos[i] = 0.;
217  recPos[i] = 0.;
218  recErr[i] = 0.;
219  chi[i] = 0.;
220  tracks[i] = 0;
221  }
222  vertex =0;
223  fitTime = 0;
224 
225  for ( int j=0; j<numberOfRecTracks; ++j ) {
226  for ( int i=0; i<5; ++i ) {
227  recPars[i][j] = 0;
228  refPars[i][j] = 0;
229  recErrs[i][j] = 0;
230  refErrs[i][j] = 0;
231  }
232  trackWeight[j] = 0;
233  simIndex[j] = -1;
234  }
235  for ( int j=0; j<numberOfSimTracks; ++j ) {
236  for ( int i=0; i<5; ++i ) {
237  simPars[i][j] = 0;
238  }
239  recIndex[j] = -1;
240  }
241 
242  numberOfRecTracks=0;
243  numberOfSimTracks=0;
244 }
GlobalError positionError() const
const AlgebraicVector5 & vector() const
tp_iterator daughterTracks_begin() const
int i
Definition: DBlmapReader.cc:9
std::pair< bool, reco::TrackBase::ParameterVector > parametersAtClosestApproach(const Basic3DVector< double > &, const Basic3DVector< double > &, float, const reco::BeamSpot &) const
propagate the track parameters of TrackinParticle from production vertex to the point of closest appr...
double longitudinalImpactParameterError() const
void fillErrors(const PerigeeTrajectoryError &pte, float *errors[5], int trackNumber)
const PerigeeTrajectoryError & perigeeError() const
std::vector< reco::TransientTrack > TTrackCont
void fill(const TransientVertex &recv, const TrackingVertex *simv=0, reco::RecoToSimCollection *recSimColl=0, const float &time=0)
float totalChiSquared() const
VertexFitterResult(const int maxTracks=100, TrackAssociatorByChi2 *associator=0)
T y() const
Definition: PV3DBase.h:63
void fillParameters(const reco::TrackBase::ParameterVector &perigee, float *params[5], int trackNumber)
math::Vector< dimension >::type ParameterVector
parameter vector
Definition: TrackBase.h:68
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:249
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:244
TrackBaseRef trackBaseRef() const
TrackAssociatorByChi2 * associatorForParamAtPca
std::vector< reco::TransientTrack > const & originalTracks() const
float degreesOfFreedom() const
T sqrt(T t)
Definition: SSEVec.h:48
GlobalPoint position() const
T z() const
Definition: PV3DBase.h:64
int j
Definition: DBlmapReader.cc:9
float ChiSquaredProbability(double chiSquared, double nrDOF)
tp_iterator daughterTracks_end() const
double transverseImpactParameterError() const
ROOT::Math::SVector< double, 5 > AlgebraicVector5
const TrackingParticleRefVector & daughterTracks() const
const float * time() const
double transverseCurvatureError() const
T x() const
Definition: PV3DBase.h:62
bool isValid() const
const LorentzVector & position() const