/* Copyright 2008-2009, Technische Universitaet Muenchen,
Authors: Christian Hoeppner & Sebastian Neubert & Johannes Rauch
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 "Track.h"
#include "TrackPoint.h"
#include "Exception.h"
#include "KalmanFitterInfo.h"
#include "TBuffer.h"
#include
namespace genfit {
TrackPoint::TrackPoint() :
sortingParameter_(0), track_(NULL), thinScatterer_(NULL)
{
;
}
TrackPoint::TrackPoint(Track* track) :
sortingParameter_(0), track_(track), thinScatterer_(NULL)
{
;
}
TrackPoint::TrackPoint(const std::vector< genfit::AbsMeasurement* >& rawMeasurements, Track* track) :
sortingParameter_(0), track_(track), thinScatterer_(NULL)
{
rawMeasurements_.reserve(rawMeasurements.size());
for (std::vector::const_iterator m = rawMeasurements.begin(); m != rawMeasurements.end(); ++m) {
addRawMeasurement(*m);
}
}
TrackPoint::TrackPoint(AbsMeasurement* rawMeasurement, Track* track) :
sortingParameter_(0), track_(track), thinScatterer_(NULL)
{
addRawMeasurement(rawMeasurement);
}
TrackPoint::TrackPoint(const TrackPoint& rhs) :
TObject(rhs),
sortingParameter_(rhs.sortingParameter_), track_(rhs.track_), thinScatterer_(NULL)
{
// clone rawMeasurements
for (std::vector::const_iterator it = rhs.rawMeasurements_.begin(); it != rhs.rawMeasurements_.end(); ++it) {
AbsMeasurement* tp = (*it)->clone();
addRawMeasurement(tp);
}
// copy fitterInfos
for (std::map::const_iterator it = rhs.fitterInfos_.begin(); it != rhs.fitterInfos_.end(); ++it ) {
AbsFitterInfo* fi = it->second->clone();
fi->setTrackPoint(this);
setFitterInfo(fi);
}
if (rhs.thinScatterer_ != NULL)
thinScatterer_.reset(new ThinScatterer(*(rhs.thinScatterer_)));
}
TrackPoint::TrackPoint(const TrackPoint& rhs,
const std::map& map,
const std::vector * repsToIgnore) :
sortingParameter_(rhs.sortingParameter_), track_(rhs.track_), thinScatterer_(NULL)
{
// clone rawMeasurements
for (std::vector::const_iterator it = rhs.rawMeasurements_.begin(); it!=rhs.rawMeasurements_.end(); ++it) {
AbsMeasurement* m = (*it)->clone();
addRawMeasurement(m);
}
// copy fitterInfos
for (std::map::const_iterator it = rhs.fitterInfos_.begin(); it != rhs.fitterInfos_.end(); ++it ) {
if (repsToIgnore != NULL) {
if (std::find(repsToIgnore->begin(), repsToIgnore->end(), it->first) != repsToIgnore->end())
continue;
}
AbsFitterInfo* fi = it->second->clone();
fi->setRep(map.at(it->first));
fi->setTrackPoint(this);
setFitterInfo(fi);
}
if (rhs.thinScatterer_ != NULL)
thinScatterer_.reset(new ThinScatterer(*(rhs.thinScatterer_)));
}
TrackPoint& TrackPoint::operator=(TrackPoint rhs) {
swap(rhs);
for (std::vector::const_iterator it = rawMeasurements_.begin(); it!=rawMeasurements_.end(); ++it) {
(*it)->setTrackPoint(this);
}
for (std::map::const_iterator it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it ) {
it->second->setTrackPoint(this);
}
return *this;
}
void TrackPoint::swap(TrackPoint& other) {
std::swap(this->sortingParameter_, other.sortingParameter_);
std::swap(this->track_, other.track_);
std::swap(this->rawMeasurements_, other.rawMeasurements_);
std::swap(this->fitterInfos_, other.fitterInfos_);
this->thinScatterer_.swap(other.thinScatterer_);
}
TrackPoint::~TrackPoint() {
// FIXME: We definitely need some smart containers or smart pointers that
// take care of this, but so far we haven't found a convincing
// option (2013-07-05).
for (size_t i = 0; i < rawMeasurements_.size(); ++i)
delete rawMeasurements_[i];
std::map< const AbsTrackRep*, AbsFitterInfo* >::iterator it;
for (it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it)
delete it->second;
}
AbsMeasurement* TrackPoint::getRawMeasurement(int i) const {
if (i < 0)
i += rawMeasurements_.size();
return rawMeasurements_.at(i);
}
std::vector< AbsFitterInfo* > TrackPoint::getFitterInfos() const {
std::vector< AbsFitterInfo* > retVal;
if (fitterInfos_.empty())
return retVal;
for (std::map::const_iterator it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it ) {
retVal.push_back(it->second);
}
return retVal;
}
AbsFitterInfo* TrackPoint::getFitterInfo(const AbsTrackRep* rep) const {
if (!rep)
rep = track_->getCardinalRep();
std::map::const_iterator it = fitterInfos_.find(rep);
if (it == fitterInfos_.end())
return NULL;
return fitterInfos_.at(rep);
}
KalmanFitterInfo* TrackPoint::getKalmanFitterInfo(const AbsTrackRep* rep) const {
return dynamic_cast(getFitterInfo(rep));
}
void TrackPoint::deleteRawMeasurements() {
for (size_t i = 0; i < rawMeasurements_.size(); ++i)
delete rawMeasurements_[i];
rawMeasurements_.clear();
}
void TrackPoint::setFitterInfo(genfit::AbsFitterInfo* fitterInfo) {
assert (fitterInfo != NULL);
if (hasFitterInfo(fitterInfo->getRep()))
delete fitterInfos_[fitterInfo->getRep()];
fitterInfos_[fitterInfo->getRep()] = fitterInfo;
}
void TrackPoint::Print(const Option_t*) const {
std::cout << "genfit::TrackPoint, belonging to Track " << track_ << "; sorting parameter = " << sortingParameter_ << "\n";
std::cout << "contains " << rawMeasurements_.size() << " rawMeasurements and " << getFitterInfos().size() << " fitterInfos for " << fitterInfos_.size() << " TrackReps.\n";
for (unsigned int i=0; iPrint();
std::cout << "............\n";
}
for (std::map< const AbsTrackRep*, AbsFitterInfo* >::const_iterator it = fitterInfos_.begin(); it != fitterInfos_.end(); ++it ) {
std::cout << "FitterInfo for TrackRep " << it->first << "\n";
it->second->Print();
std::cout << "............\n";
}
if (thinScatterer_)
thinScatterer_->Print();
}
//
// This is modified from the auto-generated Streamer.
//
void TrackPoint::Streamer(TBuffer &R__b)
{
// Stream an object of class genfit::TrackPoint.
//This works around a msvc bug and should be harmless on other platforms
typedef ::genfit::TrackPoint thisClass;
UInt_t R__s, R__c;
if (R__b.IsReading()) {
Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
//TObject::Streamer(R__b);
R__b >> sortingParameter_;
{
std::vector > &R__stl = rawMeasurements_;
R__stl.clear();
TClass *R__tcl1 = TBuffer::GetClass(typeid(genfit::AbsMeasurement));
if (R__tcl1==0) {
Error("rawMeasurements_ streamer","Missing the TClass object for genfit::AbsMeasurement!");
return;
}
int R__i, R__n;
R__b >> R__n;
R__stl.reserve(R__n);
for (R__i = 0; R__i < R__n; R__i++) {
genfit::AbsMeasurement* R__t = 0;
R__b >> R__t;
R__stl.push_back(R__t);
}
}
track_ = NULL;
size_t nTrackReps;
R__b >> nTrackReps;
vFitterInfos_.resize(nTrackReps);
for (size_t i = 0; i < nTrackReps; ++i) {
int id;
R__b >> id;
AbsFitterInfo* p = 0;
R__b >> p;
vFitterInfos_[id] = p;
}
thinScatterer_.reset();
char flag;
R__b >> flag;
if (flag) {
genfit::ThinScatterer *scatterer = 0;
R__b >> scatterer;
thinScatterer_.reset(new ThinScatterer(*scatterer));
}
R__b.CheckByteCount(R__s, R__c, thisClass::IsA());
// Fixup ownerships.
for (size_t i = 0; i < rawMeasurements_.size(); ++i) {
rawMeasurements_[i]->setTrackPoint(this);
}
for (size_t i = 0; i < vFitterInfos_.size(); ++i) {
// May not have FitterInfos for all reps.
if (vFitterInfos_[i])
vFitterInfos_[i]->setTrackPoint(this);
}
} else {
R__c = R__b.WriteVersion(thisClass::IsA(), kTRUE);
//TObject::Streamer(R__b);
R__b << sortingParameter_;
{
std::vector > &R__stl = rawMeasurements_;
int R__n=(&R__stl) ? int(R__stl.size()) : 0;
R__b << R__n;
if(R__n) {
std::vector >::iterator R__k;
for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
R__b << (*R__k);
}
}
}
R__b << fitterInfos_.size();
for (std::map::const_iterator it = fitterInfos_.begin();
it != fitterInfos_.end(); ++it)
{
int id = track_->getIdForRep(it->first);
R__b << id;
R__b << it->second;
}
if (thinScatterer_) {
R__b << (char)1;
R__b << thinScatterer_.get();
} else {
R__b << (char)0;
}
R__b.SetByteCount(R__c, kTRUE);
}
}
void TrackPoint::fixupRepsForReading()
{
for (size_t i = 0; i < vFitterInfos_.size(); ++i) {
// The vector is filled such that i corresponds to the id of the TrackRep.
// May not have FitterInfos for all reps.
if (!vFitterInfos_[i])
continue;
fitterInfos_[track_->getTrackRep(i)] = vFitterInfos_[i];
fitterInfos_[track_->getTrackRep(i)]->setRep(track_->getTrackRep(i));
}
vFitterInfos_.clear();
}
} /* End of namespace genfit */