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.
6 
7 using namespace reco;
8 using namespace std;
9 
10 VertexFitterResult::VertexFitterResult(const int maxTracks, const MagneticField* magField)
11  : theMagField(magField)
12 {
13  theMaxTracks = maxTracks;
14  if (theMagField==nullptr) theMaxTracks=0;
15  for ( int i=0; i<5; i++ ) {
16  if ( maxTracks>0 ) {
17  simPars[i] = new float[maxTracks];
18  recPars[i] = new float[maxTracks];
19  refPars[i] = new float[maxTracks];
20  recErrs[i] = new float[maxTracks];
21  refErrs[i] = new float[maxTracks];
22  }
23  else {
24  simPars[i] = 0;
25  recPars[i] = 0;
26  refPars[i] = 0;
27  recErrs[i] = 0;
28  refErrs[i] = 0;
29  }
30  }
31  trackWeight = new float[maxTracks];
32  simIndex = new int[maxTracks];
33  recIndex = new int[maxTracks];
36  reset();
37 }
38 
40 {
41  //
42  // delete arrays
43  //
44  for ( int i=0; i<5; i++ ) {
45  delete [] simPars[i];
46  delete [] recPars[i];
47  delete [] refPars[i];
48  delete [] recErrs[i];
49  delete [] refErrs[i];
50  }
51  delete trackWeight;
52  delete simIndex;
53  delete recIndex;
54 }
55 
57  const TrackingVertex * simv, reco::RecoToSimCollection *recSimColl,
58  const float &time)
59 {
60  TTrackCont recTrackV;
61  if (recVertex.isValid()) recTrackV = recVertex.originalTracks();
62  fill(recVertex, recTrackV, simv, recSimColl, time);
63 }
64 
65 void VertexFitterResult::fill(const TransientVertex & recVertex,
66  const TTrackCont & recTrackV, const TrackingVertex * simv,
67  reco::RecoToSimCollection *recSimColl, const float &time)
68 {
69  TrackingParticleRefVector simTrackV;
70 
72  if (recVertex.isValid()) {
73  recPos[0] = recVertex.position().x();
74  recPos[1] = recVertex.position().y();
75  recPos[2] = recVertex.position().z();
76 
77  recErr[0] = sqrt(recVertex.positionError().cxx());
78  recErr[1] = sqrt(recVertex.positionError().cyy());
79  recErr[2] = sqrt(recVertex.positionError().czz());
80  vert = (Basic3DVector<double>) recVertex.position();
81 
82  chi[0] = recVertex.totalChiSquared();
83  chi[1] = recVertex.degreesOfFreedom();
84  chi[2] = ChiSquaredProbability(recVertex.totalChiSquared(),
85  recVertex.degreesOfFreedom());
86  vertex = 2;
87  fitTime = time;
88  tracks[1] = recVertex.originalTracks().size();
89  }
90 
91  if (simv!=0) {
92  simPos[0] = simv->position().x();
93  simPos[1] = simv->position().y();
94  simPos[2] = simv->position().z();
95 
96  simTrackV = simv->daughterTracks();
97  vertex += 1;
99  (simTrack != simv->daughterTracks_end() && (numberOfSimTracks<theMaxTracks));
100  simTrack++) {
101 
102  Basic3DVector<double> momAtVtx((**simTrack).momentum());
103 
104  std::pair<bool, reco::TrackBase::ParameterVector> paramPair =
106  (float) (**simTrack).charge(),
107  *theMagField,
108  recTrackV.front().stateAtBeamLine().beamSpot());
109  if (paramPair.first) {
110  fillParameters(paramPair.second, simPars, numberOfSimTracks);
113  }
114  }
116  }
117 
118 
119  // now store all the recTrack...
120 
121  for(TTrackCont::const_iterator recTrack =recTrackV.begin();
122  (recTrack != recTrackV.end()
124  recTrack++) {
125  // std::cout << "Input; 1/Pt " << 1./(*recTrack).momentumAtVertex().transverse() << std::endl;
126 
127  //looking for sim tracks corresponding to our reconstructed tracks:
129 
130  std::vector<std::pair<TrackingParticleRef, double> > simFound;
131  try {
132  const TrackTransientTrack* ttt = dynamic_cast<const TrackTransientTrack*>(recTrack->basicTransientTrack());
133  if ((ttt!=0) && (recSimColl!=0)) simFound = (*recSimColl)[ttt->trackBaseRef()];
134 // if (recSimColl!=0) simFound = (*recSimColl)[recTrack->persistentTrackRef()];
135 // if (recSimColl!=0) simFound = (*recSimColl)[recTrack];
136 
137  } catch (cms::Exception e) {
138 // LogDebug("TrackValidator") << "reco::Track #" << rT << " with pt=" << track->pt()
139 // << " NOT associated to any TrackingParticle" << "\n";
140 // edm::LogError("TrackValidator") << e.what() << "\n";
141  }
142 
143  if(simFound.size() != 0) {
144  //OK, it was associated, so get the state on the same surface as the 'SimState'
146  find(simTrackV.begin(), simTrackV.end(), simFound[0].first);
147  if (simTrackI!=simTrackV.end()) ++tracks[2];
148  int simTrackIndex = simTrackI-simTrackV.begin();
149  if (simTrackIndex<numberOfSimTracks) {
150  simIndex[numberOfRecTracks] = simTrackIndex;
151  recIndex[simTrackIndex] = numberOfRecTracks;
152  // cout << "Assoc; 1/Pt " << 1./(*recTrack).momentumAtVertex().transverse() << std::endl;
153  }
154  }
155 
156  TrajectoryStateClosestToPoint tscp = recTrack->trajectoryStateClosestToPoint(recVertex.position());
157  fillParameters(recTrack->track().parameters(), recPars, numberOfRecTracks);
159 // trackWeight[numberOfRecTracks] = recVertex.trackWeight(*recTrack);
160 //
161 // if ((recVertex.isValid())&&(recVertex.hasRefittedTracks())) {
162 // //looking for corresponding refitted tracks:
163 // TrajectoryStateOnSurface refip;
164 // RecTrackCont::iterator refTrackI =
165 // find_if(refTracks.begin(), refTracks.end(), RecTrackMatch(*recTrack));
166 // if (refTrackI!=refTracks.end()) {
167 // // If it was not found, it would mean that it was not used in the fit,
168 // // or with a low weight such that the track was then discarded.
169 // if(simFound.size() != 0) {
170 // refip = refTrackI->stateOnSurface(simFound[0]->impactPointStateOnSurface().surface());
171 // } else {
172 // refip = refTrackI->innermostState();
173 // }
174 //
175 // fillParameters(refip, refPars, numberOfRecTracks);
176 // fillErrors(refip, refErrs, numberOfRecTracks);
177 // }
178 // }
179 //
181  }
182 
183 }
184 
186  float* params[5], int trackNumber)
187 {
188  params[0][trackNumber] = perigee[0];
189  params[1][trackNumber] = perigee[1];
190  params[2][trackNumber] = perigee[2];
191  params[3][trackNumber] = perigee[3];
192  params[4][trackNumber] = perigee[4];
193 }
194 
196  float* params[5], int trackNumber)
197 {
198  const AlgebraicVector5 & perigee = ptp.vector();
199  params[0][trackNumber] = perigee[0];
200  params[1][trackNumber] = perigee[1];
201  params[2][trackNumber] = perigee[2];
202  params[3][trackNumber] = perigee[3];
203  params[4][trackNumber] = perigee[4];
204 }
205 
207  float* errors[5], int trackNumber)
208 {
209  errors[0][trackNumber] = pte.transverseCurvatureError();
210  errors[1][trackNumber] = pte.thetaError();
211  errors[2][trackNumber] = pte.phiError();
212  errors[3][trackNumber] = pte.transverseImpactParameterError();
213  errors[4][trackNumber] = pte.longitudinalImpactParameterError();
214 }
215 
217 {
218  for ( int i=0; i<3; ++i ) {
219  simPos[i] = 0.;
220  recPos[i] = 0.;
221  recErr[i] = 0.;
222  chi[i] = 0.;
223  tracks[i] = 0;
224  }
225  vertex =0;
226  fitTime = 0;
227 
228  for ( int j=0; j<numberOfRecTracks; ++j ) {
229  for ( int i=0; i<5; ++i ) {
230  recPars[i][j] = 0;
231  refPars[i][j] = 0;
232  recErrs[i][j] = 0;
233  refErrs[i][j] = 0;
234  }
235  trackWeight[j] = 0;
236  simIndex[j] = -1;
237  }
238  for ( int j=0; j<numberOfSimTracks; ++j ) {
239  for ( int i=0; i<5; ++i ) {
240  simPars[i][j] = 0;
241  }
242  recIndex[j] = -1;
243  }
244 
245  numberOfRecTracks=0;
246  numberOfSimTracks=0;
247 }
GlobalError positionError() const
const AlgebraicVector5 & vector() const
tp_iterator daughterTracks_begin() const
int i
Definition: DBlmapReader.cc:9
double longitudinalImpactParameterError() const
const MagneticField * theMagField
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
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:74
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
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
std::pair< bool, reco::TrackBase::ParameterVector > trackingParametersAtClosestApproachToBeamSpot(const Basic3DVector< double > &vertex, const Basic3DVector< double > &momAtVtx, float charge, const MagneticField &magField, const BeamSpot &bs)
const TrackingParticleRefVector & daughterTracks() const
const float * time() const
double transverseCurvatureError() const
T x() const
Definition: PV3DBase.h:62
bool isValid() const
VertexFitterResult(const int maxTracks=100, const MagneticField *=0)
const LorentzVector & position() const