00001 #include <assert.h>
00002 #include "StG2TrackVertexMap.h"
00003 #include "TVector3.h"
00004 StG2TrackVertexMap *StG2TrackVertexMap::fgInstance = 0;
00005
00006 StG2TrackVertexMap *StG2TrackVertexMap::instance(St_g2t_track *track, St_g2t_vertex *vertex) {
00007 if (! fgInstance) {fgInstance = new StG2TrackVertexMap(track,vertex); }
00008 else if (track && vertex) {
00009 fgInstance->Reset(track,vertex);
00010 }
00011 return fgInstance;
00012 }
00013
00014 void StG2TrackVertexMap::Reset(St_g2t_track *track, St_g2t_vertex *vertex) {
00015 fTrack2Vertex.clear();
00016 fVertex2ParentTrack.clear();
00017 if (! track || ! vertex) return;
00018 Int_t Nt = track->GetNRows();
00019 Int_t NV = vertex->GetNRows();
00020 g2t_track_st *t = track->GetTable();
00021 g2t_vertex_st *v = vertex->GetTable();
00022 for (Int_t i = 0; i < Nt; i++) {
00023 Int_t IdT = t[i].id - 1; assert(IdT >= 0 && IdT < Nt);
00024 Int_t IdV = t[i].start_vertex_p - 1; assert(IdV >= 0 && IdV < NV);
00025 TVector3 Vx1(v[IdV].ge_x);
00026 Float_t tof1 = v[IdV].ge_tof;
00027 Int_t IdP = v[IdV].parent_p - 1;
00028 if (IdP >= 0 && IdP < Nt) {
00029 Int_t IdVxP = t[IdP].start_vertex_p - 1; assert(IdVxP >= 0 && IdVxP < NV);
00030 TVector3 Vx2(v[IdVxP].ge_x);
00031 Vx2 -= Vx1;
00032 while ((Vx2.Mag() < 10e-4 && TMath::Abs(tof1-v[IdVxP].ge_tof) < 1e-9)) {
00033 IdV = IdVxP;
00034 IdP = v[IdV].parent_p - 1; if (IdP < 0) break;
00035 IdVxP = t[IdP].start_vertex_p - 1; if (IdVxP < 0) break;
00036 Vx2 = TVector3(v[IdVxP].ge_x);
00037 Vx2 -= Vx1;
00038 }
00039 }
00040 fTrack2Vertex[IdT+1] = IdV+1;
00041 }
00042 for (Int_t i = 0; i < NV; i++) {
00043 fVertex2ParentTrack[v[i].id] = v[i].parent_p;
00044 }
00045 }