22 ClassImp(TEveTrackProjected);
27 TEveTrackProjected::TEveTrackProjected() :
36 void TEveTrackProjected::SetProjection(TEveProjectionManager* mng, TEveProjectable* model)
38 TEveProjected::SetProjection(mng, model);
39 CopyVizParams(dynamic_cast<TEveElement*>(model));
41 TEveTrack* otrack =
dynamic_cast<TEveTrack*
>(fProjectable);
42 SetTrackParams(*otrack);
43 SetLockPoints(otrack->GetLockPoints());
49 void TEveTrackProjected::SetDepthLocal(Float_t d)
51 SetDepthCommon(d,
this, fBBox);
54 Float_t *p = GetP() + 2;
55 for (Int_t i = 0; i < n; ++i, p+=3)
60 for (vPathMark_i pm = fPathMarks.begin(); pm != fPathMarks.end(); ++pm)
69 void TEveTrackProjected::UpdateProjection()
80 Int_t TEveTrackProjected::GetBreakPointIdx(Int_t start)
82 TEveProjection *projection = fManager->GetProjection();
84 Int_t val = fLastPoint;
86 if (projection->HasSeveralSubSpaces())
94 GetPoint(i, v1.fX, v1.fY, v1.fZ);
95 GetPoint(i+1, v2.fX, v2.fY, v2.fZ);
96 if(projection->AcceptSegment(v1, v2, fPropagator->GetDelta()) == kFALSE)
113 void TEveTrackProjected::MakeTrack(Bool_t recurse)
115 TEveTrack *otrack =
dynamic_cast<TEveTrack*
>(fProjectable);
116 TEveTrans *trans = otrack->PtrMainTrans(kFALSE);
117 TEveProjection *projection = fManager->GetProjection();
119 fBreakPoints.clear();
122 SetPathMarks(*otrack);
123 if (GetLockPoints() || otrack->Size() > 0)
125 ClonePoints(*otrack);
126 fLastPMIdx = otrack->GetLastPMIdx();
130 TEveTrack::MakeTrack(recurse);
132 if (Size() == 0)
return;
135 ReduceSegmentLengths(projection->GetMaxTrackStep());
139 fOrigPnts =
new TEveVector[Size()];
140 for (Int_t i = 0; i < Size(); ++i, p+=3)
142 if (trans) trans->MultiplyIP(p);
144 projection->ProjectPointfv(p, fDepth);
148 Int_t bL = 0, bR = GetBreakPointIdx(0);
149 std::vector<TEveVector> vvec;
152 for (Int_t i=bL; i<=bR; i++)
154 GetPoint(i, x, y, z);
155 vvec.push_back(TEveVector(x, y, z));
157 if (bR == fLastPoint)
160 TEveVector vL = fOrigPnts[bR];
161 TEveVector vR = fOrigPnts[bR + 1];
162 projection->BisectBreakPoint(vL, vR, kTRUE, fDepth);
164 fBreakPoints.push_back((Int_t)vvec.size());
168 bR = GetBreakPointIdx(bL);
170 fBreakPoints.push_back((Int_t)vvec.size());
175 Bool_t fix_y = kFALSE;
177 if (projection->HasSeveralSubSpaces())
179 switch (fPropagator->GetProjTrackBreaking())
181 case TEveTrackPropagator::kPTB_UseFirstPointPos:
184 sign_y = vvec.front().fY;
187 case TEveTrackPropagator::kPTB_UseLastPointPos:
190 sign_y = vvec.back().fY;
196 Reset((Int_t)vvec.size());
197 for (std::vector<TEveVector>::iterator i=vvec.begin(); i!=vvec.end(); ++i)
200 SetNextPoint((*i).fX, TMath::Sign((*i).fY, sign_y), (*i).fZ);
202 SetNextPoint((*i).fX, (*i).fY, (*i).fZ);
204 delete [] fOrigPnts; fOrigPnts = 0;
207 for (vPathMark_i pm = fPathMarks.begin(); pm != fPathMarks.end(); ++pm)
209 projection->ProjectPointdv(trans, pm->fV.Arr(), pm->fV.Arr(), fDepth);
216 void TEveTrackProjected::PrintLineSegments()
218 printf(
"%s LineSegments:\n", GetName());
223 for (std::vector<Int_t>::iterator bpi = fBreakPoints.begin();
224 bpi != fBreakPoints.end(); ++bpi)
226 Int_t size = *bpi - start;
228 GetPoint(start, sVec.fX, sVec.fY, sVec.fZ);
229 GetPoint((*bpi)-1, bPnt.fX, bPnt.fY, bPnt.fZ);
230 printf(
"seg %d size %d start %d ::(%f, %f, %f) (%f, %f, %f)\n",
231 segment, size, start, sVec.fX, sVec.fY, sVec.fZ,
232 bPnt.fX, bPnt.fY, bPnt.fZ);
241 void TEveTrackProjected::SecSelected(TEveTrack* )
243 TEveTrack* t =
dynamic_cast<TEveTrack*
>(fProjectable);
254 ClassImp(TEveTrackListProjected);
259 TEveTrackListProjected::TEveTrackListProjected() :
268 void TEveTrackListProjected::SetProjection(TEveProjectionManager* proj, TEveProjectable* model)
270 TEveProjected::SetProjection(proj, model);
271 CopyVizParams(dynamic_cast<TEveElement*>(model));
273 TEveTrackList& tl = *
dynamic_cast<TEveTrackList*
>(model);
274 SetPropagator(tl.GetPropagator());
282 void TEveTrackListProjected::SetDepthLocal(Float_t )
284 Warning(
"SetDepthLocal",
"This function only exists to fulfill an abstract interface.");
290 void TEveTrackListProjected::SetDepth(Float_t d)
298 void TEveTrackListProjected::SetDepth(Float_t d, TEveElement* el)
300 TEveTrackProjected* ptrack;
301 for (List_i i = el->BeginChildren(); i != el->EndChildren(); ++i)
303 ptrack =
dynamic_cast<TEveTrackProjected*
>(*i);