SND@LHC Software
Loading...
Searching...
No Matches
TrackPoint.cc
Go to the documentation of this file.
1/* Copyright 2008-2009, Technische Universitaet Muenchen,
2 Authors: Christian Hoeppner & Sebastian Neubert & Johannes Rauch
3
4 This file is part of GENFIT.
5
6 GENFIT is free software: you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 GENFIT is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with GENFIT. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#include "Track.h"
21
22#include "TrackPoint.h"
23#include "Exception.h"
24#include "KalmanFitterInfo.h"
25
26#include <iostream>
27#include <TBuffer.h>
28
29
30namespace genfit {
31
33 sortingParameter_(0), track_(NULL), thinScatterer_(NULL)
34{
35 ;
36}
37
39 sortingParameter_(0), track_(track), thinScatterer_(NULL)
40{
41 ;
42}
43
44TrackPoint::TrackPoint(const std::vector< genfit::AbsMeasurement* >& rawMeasurements, Track* track) :
45 sortingParameter_(0), track_(track), thinScatterer_(NULL)
46{
47 rawMeasurements_.reserve(rawMeasurements.size());
48
49 for (std::vector<AbsMeasurement*>::const_iterator m = rawMeasurements.begin(); m != rawMeasurements.end(); ++m) {
51 }
52}
53
55 sortingParameter_(0), track_(track), thinScatterer_(NULL)
56{
57 addRawMeasurement(rawMeasurement);
58}
59
60
62 TObject(rhs),
63 sortingParameter_(rhs.sortingParameter_), track_(rhs.track_), thinScatterer_(NULL)
64{
65 // clone rawMeasurements
66 for (std::vector<AbsMeasurement*>::const_iterator it = rhs.rawMeasurements_.begin(); it != rhs.rawMeasurements_.end(); ++it) {
67 AbsMeasurement* tp = (*it)->clone();
69 }
70
71 // copy fitterInfos
72 for (std::map<const AbsTrackRep*, AbsFitterInfo* >::const_iterator it = rhs.fitterInfos_.begin(); it != rhs.fitterInfos_.end(); ++it ) {
73 AbsFitterInfo* fi = it->second->clone();
74 fi->setTrackPoint(this);
75 setFitterInfo(fi);
76 }
77
78 if (rhs.thinScatterer_ != NULL)
80}
81
83 const std::map<const AbsTrackRep*, AbsTrackRep*>& map,
84 const std::vector<const genfit::AbsTrackRep*> * repsToIgnore) :
85 sortingParameter_(rhs.sortingParameter_), track_(rhs.track_), thinScatterer_(NULL)
86{
87 // clone rawMeasurements
88 for (std::vector<AbsMeasurement*>::const_iterator it = rhs.rawMeasurements_.begin(); it!=rhs.rawMeasurements_.end(); ++it) {
89 AbsMeasurement* m = (*it)->clone();
91 }
92
93 // copy fitterInfos
94 for (std::map<const AbsTrackRep*, AbsFitterInfo* >::const_iterator it = rhs.fitterInfos_.begin(); it != rhs.fitterInfos_.end(); ++it ) {
95 if (repsToIgnore != NULL) {
96 if (std::find(repsToIgnore->begin(), repsToIgnore->end(), it->first) != repsToIgnore->end())
97 continue;
98 }
99 AbsFitterInfo* fi = it->second->clone();
100 fi->setRep(map.at(it->first));
101 fi->setTrackPoint(this);
102 setFitterInfo(fi);
103 }
104
105 if (rhs.thinScatterer_ != NULL)
106 thinScatterer_.reset(new ThinScatterer(*(rhs.thinScatterer_)));
107}
108
109
111 swap(rhs);
112
113 for (std::vector<AbsMeasurement*>::const_iterator it = rawMeasurements_.begin(); it!=rawMeasurements_.end(); ++it) {
114 (*it)->setTrackPoint(this);
115 }
116
117 for (std::map<const AbsTrackRep*, AbsFitterInfo* >::const_iterator it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it ) {
118 it->second->setTrackPoint(this);
119 }
120
121 return *this;
122}
123
124
126 std::swap(this->sortingParameter_, other.sortingParameter_);
127 std::swap(this->track_, other.track_);
128 std::swap(this->rawMeasurements_, other.rawMeasurements_);
129 std::swap(this->fitterInfos_, other.fitterInfos_);
130 this->thinScatterer_.swap(other.thinScatterer_);
131}
132
133
135 // FIXME: We definitely need some smart containers or smart pointers that
136 // take care of this, but so far we haven't found a convincing
137 // option (2013-07-05).
138
139 for (size_t i = 0; i < rawMeasurements_.size(); ++i)
140 delete rawMeasurements_[i];
141
142 std::map< const AbsTrackRep*, AbsFitterInfo* >::iterator it;
143 for (it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it)
144 delete it->second;
145}
146
147
149 if (i < 0)
150 i += rawMeasurements_.size();
151
152 return rawMeasurements_.at(i);
153}
154
155
156std::vector< AbsFitterInfo* > TrackPoint::getFitterInfos() const {
157 std::vector< AbsFitterInfo* > retVal;
158
159 if (fitterInfos_.empty())
160 return retVal;
161
162 for (std::map<const AbsTrackRep*, AbsFitterInfo* >::const_iterator it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it ) {
163 retVal.push_back(it->second);
164 }
165
166 return retVal;
167}
168
169
171 if (!rep)
172 rep = track_->getCardinalRep();
173 std::map<const AbsTrackRep*, AbsFitterInfo*>::const_iterator it = fitterInfos_.find(rep);
174 if (it == fitterInfos_.end())
175 return NULL;
176 return fitterInfos_.at(rep);
177}
178
179
181 return dynamic_cast<KalmanFitterInfo*>(getFitterInfo(rep));
182}
183
184
185
187 for (size_t i = 0; i < rawMeasurements_.size(); ++i)
188 delete rawMeasurements_[i];
189
190 rawMeasurements_.clear();
191}
192
193
195 assert (fitterInfo != NULL);
196 if (hasFitterInfo(fitterInfo->getRep()))
197 delete fitterInfos_[fitterInfo->getRep()];
198
199 fitterInfos_[fitterInfo->getRep()] = fitterInfo;
200}
201
202
203void TrackPoint::Print(const Option_t*) const {
204 std::cout << "genfit::TrackPoint, belonging to Track " << track_ << "; sorting parameter = " << sortingParameter_ << "\n";
205 std::cout << "contains " << rawMeasurements_.size() << " rawMeasurements and " << getFitterInfos().size() << " fitterInfos for " << fitterInfos_.size() << " TrackReps.\n";
206
207 for (unsigned int i=0; i<rawMeasurements_.size(); ++i) {
208 std::cout << "RawMeasurement Nr. " << i << "\n";
209 rawMeasurements_[i]->Print();
210 std::cout << "............\n";
211 }
212
213 for (std::map< const AbsTrackRep*, AbsFitterInfo* >::const_iterator it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it ) {
214 std::cout << "FitterInfo for TrackRep " << it->first << "\n";
215 it->second->Print();
216 std::cout << "............\n";
217 }
218
219 if (thinScatterer_)
220 thinScatterer_->Print();
221
222}
223
224
225//
226// This is modified from the auto-generated Streamer.
227//
228void TrackPoint::Streamer(TBuffer &R__b)
229{
230 // Stream an object of class genfit::TrackPoint.
231 //This works around a msvc bug and should be harmless on other platforms
232 typedef ::genfit::TrackPoint thisClass;
233 UInt_t R__s, R__c;
234 if (R__b.IsReading()) {
235 Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
236 //TObject::Streamer(R__b);
237 R__b >> sortingParameter_;
238 {
239 std::vector<genfit::AbsMeasurement*,std::allocator<genfit::AbsMeasurement*> > &R__stl = rawMeasurements_;
240 R__stl.clear();
241 TClass *R__tcl1 = TBuffer::GetClass(typeid(genfit::AbsMeasurement));
242 if (R__tcl1==0) {
243 Error("rawMeasurements_ streamer","Missing the TClass object for genfit::AbsMeasurement!");
244 return;
245 }
246 int R__i, R__n;
247 R__b >> R__n;
248 R__stl.reserve(R__n);
249 for (R__i = 0; R__i < R__n; R__i++) {
250 genfit::AbsMeasurement* R__t = 0;
251 R__b >> R__t;
252 R__stl.push_back(R__t);
253 }
254 }
255 track_ = NULL;
256 size_t nTrackReps;
257 R__b >> nTrackReps;
258 vFitterInfos_.resize(nTrackReps);
259 for (size_t i = 0; i < nTrackReps; ++i) {
260 int id;
261 R__b >> id;
262 AbsFitterInfo* p = 0;
263 R__b >> p;
264 vFitterInfos_[id] = p;
265 }
266 thinScatterer_.reset();
267 char flag;
268 R__b >> flag;
269 if (flag) {
270 genfit::ThinScatterer *scatterer = 0;
271 R__b >> scatterer;
272 thinScatterer_.reset(new ThinScatterer(*scatterer));
273 }
274 R__b.CheckByteCount(R__s, R__c, thisClass::IsA());
275
276
277 // Fixup ownerships.
278 for (size_t i = 0; i < rawMeasurements_.size(); ++i) {
279 rawMeasurements_[i]->setTrackPoint(this);
280 }
281 for (size_t i = 0; i < vFitterInfos_.size(); ++i) {
282 // May not have FitterInfos for all reps.
283 if (vFitterInfos_[i])
284 vFitterInfos_[i]->setTrackPoint(this);
285 }
286 } else {
287 R__c = R__b.WriteVersion(thisClass::IsA(), kTRUE);
288 //TObject::Streamer(R__b);
289 R__b << sortingParameter_;
290 {
291 std::vector<genfit::AbsMeasurement*,std::allocator<genfit::AbsMeasurement*> > &R__stl = rawMeasurements_;
292 int R__n=int(R__stl.size());
293 R__b << R__n;
294 if(R__n) {
295 std::vector<genfit::AbsMeasurement*,std::allocator<genfit::AbsMeasurement*> >::iterator R__k;
296 for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
297 R__b << (*R__k);
298 }
299 }
300 }
301 R__b << fitterInfos_.size();
302 for (std::map<const AbsTrackRep*, AbsFitterInfo*>::const_iterator it = fitterInfos_.begin();
303 it != fitterInfos_.end(); ++it)
304 {
305 int id = track_->getIdForRep(it->first);
306 R__b << id;
307 R__b << it->second;
308 }
309 if (thinScatterer_) {
310 R__b << (char)1;
311 R__b << thinScatterer_.get();
312 } else {
313 R__b << (char)0;
314 }
315 R__b.SetByteCount(R__c, kTRUE);
316 }
317}
318
319
321{
322 for (size_t i = 0; i < vFitterInfos_.size(); ++i) {
323 // The vector is filled such that i corresponds to the id of the TrackRep.
324
325 // May not have FitterInfos for all reps.
326 if (!vFitterInfos_[i])
327 continue;
330 }
331 vFitterInfos_.clear();
332}
333
334} /* End of namespace genfit */
Double_t m
This class collects all information needed and produced by a specific AbsFitter and is specific to on...
const AbsTrackRep * getRep() const
virtual AbsFitterInfo * clone() const =0
Deep copy ctor for polymorphic class.
void setTrackPoint(const TrackPoint *tp)
Contains the measurement and covariance in raw detector coordinates.
virtual AbsMeasurement * clone() const =0
Deep copy ctor for polymorphic class.
Abstract base class for a track representation.
Definition AbsTrackRep.h:66
Collects information needed and produced by a AbsKalmanFitter implementations and is specific to one ...
Thin or thick scatterer.
Object containing AbsMeasurement and AbsFitterInfo objects.
Definition TrackPoint.h:50
bool hasFitterInfo(const AbsTrackRep *rep) const
Definition TrackPoint.h:103
KalmanFitterInfo * getKalmanFitterInfo(const AbsTrackRep *rep=NULL) const
Helper to avoid casting.
std::vector< AbsFitterInfo * > vFitterInfos_
Ownership over FitterInfos.
Definition TrackPoint.h:149
virtual ~TrackPoint()
void deleteRawMeasurements()
TrackPoint & operator=(TrackPoint)
AbsFitterInfo * getFitterInfo(const AbsTrackRep *rep=NULL) const
Get fitterInfo for rep. Per default, use cardinal rep.
std::map< const AbsTrackRep *, AbsFitterInfo * > fitterInfos_
Definition TrackPoint.h:141
std::vector< genfit::AbsFitterInfo * > getFitterInfos() const
Get list of all fitterInfos.
void addRawMeasurement(genfit::AbsMeasurement *rawMeasurement)
Takes ownership and sets this as measurement's trackPoint.
Definition TrackPoint.h:113
void swap(TrackPoint &other)
void setFitterInfo(genfit::AbsFitterInfo *fitterInfo)
Takes Ownership.
AbsMeasurement * getRawMeasurement(int i=0) const
Track * track_
Pointer to Track where TrackPoint belongs to.
Definition TrackPoint.h:136
void Print(const Option_t *="") const
std::vector< AbsMeasurement * > rawMeasurements_
No ownership.
Definition TrackPoint.h:139
boost::scoped_ptr< ThinScatterer > thinScatterer_
Definition TrackPoint.h:152
Collection of TrackPoint objects, AbsTrackRep objects and FitStatus objects.
Definition Track.h:71
AbsTrackRep * getTrackRep(int id) const
Definition Track.h:127
int getIdForRep(const AbsTrackRep *rep) const
This is used when streaming TrackPoints.
Definition Track.cc:245
AbsTrackRep * getCardinalRep() const
Get cardinal track representation.
Definition Track.h:140
int i
Definition ShipAna.py:86
Matrix inversion tools.
Definition AbsBField.h:29