00001
00002
00003
00004
00005
00006 #include "Stiostream.h"
00007 #include <cmath>
00008 #include <algorithm>
00009 using namespace std;
00010 #include "StiKalmanTrack.h"
00011 #include "StiTrackContainer.h"
00012 #include "StiKalmanTrackNode.h"
00013 #include "StiLocalTrackMerger.h"
00014
00015 StiLocalTrackMerger::StiLocalTrackMerger(StiTrackContainer* store)
00016 : StiTrackMerger(store), mDeltaR(1.)
00017 {
00018 cout <<"StiLocalTrackMerger::StiLocalTrackMerger()"<<endl;
00019 mMaxTrack.reset();
00020 mMaxTrackNode.reset();
00021 }
00022
00023 StiLocalTrackMerger::~StiLocalTrackMerger()
00024 {
00025 cout <<"StiLocalTrackMerger::~StiLocalTrackMerger()"<<endl;
00026 }
00027
00028 void StiLocalTrackMerger::mergeTracks()
00029 {
00030 cout <<"StiLocalTrackMerger::mergeTracks()"<<endl;
00031
00032 if (!mTrackStore)
00033 {
00034 cout <<"StiLocalTrackMerger::mergeTracks(). ERROR:\t"
00035 <<"mTrackStore==0. Abort"<<endl;
00036 return;
00037 }
00038
00039 cout <<"\t N-tracks before merge: "<<mTrackStore->size()<<endl;
00040
00041 for (vector<StiTrack*>::iterator lower=mTrackStore->begin(); lower!=mTrackStore->end(); ++lower)
00042 {
00043 if (configureMaxTrack( static_cast<StiKalmanTrack*>(*lower) ))
00044 {
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 }
00064 }
00065 cout <<"\t N-tracks before merge: "<<mTrackStore->size()<<endl;
00066 }
00067
00068
00069 bool StiLocalTrackMerger::configureMaxTrack(StiKalmanTrack* lowerTrack)
00070 {
00071
00072 if (!lowerTrack) {
00073 cout <<"StiLocalTrackMerger::configureMaxTrack(). ERROR:\t"
00074 <<"lowerTrack==0. Skip this track"<<endl;
00075 return false;
00076 }
00077
00078 StiKalmanTrackNode* lowerNode = lowerTrack->getLastNode();
00079 if (lowerNode->getCurvature()==0.) {
00080 cout <<"StiLocalTrackMerger::configureMaxTrack(). ERROR:\t"
00081 <<"lowerNode->getCurvature()==0. Skip this track"<<endl;
00082 return false;
00083 }
00084
00085
00086 mMaxTrack.reset();
00087 mMaxTrackNode.reset();
00088
00089 double radius = 1./lowerNode->getCurvature();
00090 double maxRadius=0.;
00091 double dR = radius*mDeltaR;
00092 if (radius<0) {
00093 maxRadius = radius-dR;
00094 }
00095 else {
00096 maxRadius = radius+dR;
00097 }
00098 cout <<"radius: "<<radius<<" dR: "<<dR<<" maxRadius: "<<maxRadius<<endl;
00099 mMaxTrackNode.setCurvature(1./maxRadius);
00100 return true;
00101 }
00102
00103 bool StiLocalTrackMerger::sameTrack(StiKalmanTrack* lhs, StiKalmanTrack* rhs)
00104 {
00105 return false;
00106 }