1 #include <inc/vertex.h>
2 #include <inc/decaychain.h>
4 #include <util/inc/matrix.h>
5 #include <util/inc/helixrep.h>
6 #include <util/inc/string.h>
7 #include <algo/inc/trackattach.h>
11 #include <inc/trackstate.h>
12 #include <inc/track.h>
13 #include <util/inc/memorymanager.h>
24 TrackAttach::TrackAttach()
29 _CloseapproachCut = 1.0;
30 _AddAllTracksFromSecondary =
false;
31 _ParameterNames.push_back(
"LoDCutmin");
32 _ParameterNames.push_back(
"LoDCutmax");
33 _ParameterNames.push_back(
"CloseapproachCut");
34 _ParameterNames.push_back(
"AddAllTracksFromSecondary");
44 return _ParameterNames;
49 _ParameterValues.clear();
50 _ParameterValues.push_back(makeString(_LoDCutmin));
51 _ParameterValues.push_back(makeString(_LoDCutmax));
52 _ParameterValues.push_back(makeString(_CloseapproachCut));
53 _ParameterValues.push_back(makeString(_AddAllTracksFromSecondary));
54 return _ParameterValues;
59 this->badParameter(Parameter);
64 if (Parameter ==
"LoDCutmin")
69 if (Parameter ==
"LoDCutmax")
74 if (Parameter ==
"CloseapproachCut")
76 _CloseapproachCut = Value;
79 if (Parameter ==
"AddAllTracksFromSecondary")
81 _AddAllTracksFromSecondary = Value;
84 this->badParameter(Parameter);
89 this->badParameter(Parameter);
101 double closeapproach;
103 int numberoftracks = 0;
104 int vertexcounter = 0;
108 std::vector<vertex_lcfi::Track > AttachedTracks;
109 std::vector<Track*> Innertracks;
111 for (std::vector<Vertex*>::const_iterator iVertex = (MyDecayChain->
vertices().begin()); iVertex != MyDecayChain->
vertices().end() ;++iVertex)
114 numberoftracks = (*iVertex)->tracks( ).size();
116 if ( numberoftracks > 1 || vertexcounter > 0 )
118 tempvertex = vertexcounter;
123 tempvertex = (MyDecayChain->
vertices().size()-1);
125 if (MyDecayChain->
vertices().empty())
126 std::cerr <<
"Empty Decay Chain - trackattach.cpp:119" << std::endl;
129 VertexPos = (MyDecayChain->
vertices()[tempvertex]->position()).subtract( (MyDecayChain->
vertices()[0])->position() );
131 distance = VertexPos.mag();
134 if (distance > 0.00001)
140 Theta = acos( VertexPos.unit().z() );
141 Phi = acos( VertexPos.unit().x()/sin(Theta));
142 if (VertexPos.unit().y()<0.0) Phi = (2*3.141592654) - Phi;
146 LinearHelix.d0() = 0;
148 LinearHelix.z0() = 0.0;
149 LinearHelix.invR() = 0.0;
150 LinearHelix.phi() = Phi;
151 LinearHelix.tanLambda() = tan((3.141592654/2.0)-Theta);
153 Vector3 mom(cos(Phi)*sin(Theta),sin(Phi)*sin(Theta),cos(Theta));
155 Track LinearTrack(0,LinearHelix,mom,0.0,dummy,std::vector<int>());
161 for (std::vector<Track*>::const_iterator iTrack = (MyDecayChain->
jet()->
tracks().begin()); iTrack != MyDecayChain->
jet()->
tracks().end() ;++iTrack)
167 if (_AddAllTracksFromSecondary ==
true )
169 for (std::vector<Vertex*>::const_iterator iVertex = (++MyDecayChain->
vertices().begin()); iVertex != MyDecayChain->
vertices().end() ;++iVertex)
172 if((*iVertex)->hasTrack(*iTrack))
175 Innertracks.push_back(*iTrack);
180 TSHel = (**iTrack).makeState();
191 closeapproach = ((*TSHel).position().subtract((*TSLin).position())).mag();
193 LoD = (TSLin->
position().subtract((MyDecayChain->
vertices()[0])->position())).mag();
195 if( 0 > TSLin->
position().subtract(MyDecayChain->
vertices()[0]->position()).dot( VertexPos ) )
200 if ( (LoD/distance)> _LoDCutmin && (LoD/distance)< _LoDCutmax && (closeapproach < _CloseapproachCut) )
203 if( DecaywithAtTracks->
hasTrack(*iTrack) == 0 )
206 DecaywithAtTracks->
addTrack(*iTrack);
211 if (_AddAllTracksFromSecondary ==
true )
213 std::vector<Track*>::const_iterator Inner = find(Innertracks.begin(),Innertracks.end(),*iTrack );
214 if(Inner == Innertracks.end())
216 if(DecaywithAtTracks->
hasTrack(*iTrack) == 1)
224 if(DecaywithAtTracks->
hasTrack(*iTrack) == 1)
235 for (std::vector<Track*>::const_iterator iTrack = (MyDecayChain->
jet()->
tracks().begin()); iTrack != MyDecayChain->
jet()->
tracks().end() ;++iTrack)
237 if(DecaywithAtTracks->
hasTrack(*iTrack) == 1)
245 return DecaywithAtTracks;
DecayChain * calculateFor(DecayChain *MyDecayChain) const
Run the algorithm on a jet.
bool removeTrack(Track *Track)
Remove Track.
std::vector< string > parameterValues() const
Parameter Values.
const std::vector< Track * > & tracks() const
Tracks.
TrackState * makeState() const
Create a TrackState of this track.
void addTrack(Track *Track)
Add Track.
bool hasTrack(Track *Track) const
Does the DecayChain have this Track?
const std::vector< Vertex * > & vertices() const
Vertices contained in DecayChain.
static MemoryManager< T > * Event()
Returns the Event duration singleton instance of the MemoryManager for type T.
Spatial point on a Track.
void setPointerParameter(const string &Parameter, void *Value)
Set Pointer Parameter.
Jet * jet() const
Owner Jet.
void setDoubleParameter(const string &Parameter, const double Value)
Set Double Parameter.
Unique Track representation.
std::vector< string > parameterNames() const
Parameter Names.
string name() const
Name.
const Vector3 & position() const
Current position of the trackstate.
void setStringParameter(const string &Parameter, const string &Value)
Set String Parameter.
void swimToStateNearest(const Vector3 &Point)
Swim to the point of closest approach to Point.