StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StFgtLHHTracking.cxx
1 /***************************************************************************
2  *
3  * $Id: StFgtLHHTracking.cxx,v 1.2 2012/03/14 22:22:40 sgliske Exp $
4  * Author: S. Gliske, March 2012
5  *
6  ***************************************************************************
7  *
8  * Description: see header.
9  *
10  ***************************************************************************
11  *
12  * $Log: StFgtLHHTracking.cxx,v $
13  * Revision 1.2 2012/03/14 22:22:40 sgliske
14  * update
15  *
16  * Revision 1.1 2012/03/14 21:04:17 sgliske
17  * creation
18  *
19  *
20  *
21  **************************************************************************/
22 
23 #include "StFgtLHHTracking.h"
24 #include "StRoot/StFgtUtil/geometry/StFgtGeom.h"
25 
26 #define DEBUG
27 
28 // constructor
29 StFgtLHHTracking::StFgtLHHTracking( const Char_t* name ) : StFgtTracking( name ){ /* */ };
30 
31 // deconstructor
32 StFgtLHHTracking::~StFgtLHHTracking(){ /* */ };
33 
34 void StFgtLHHTracking::Clear( const Option_t *opt ){
35  for( Int_t discIdx = 0; discIdx < kFgtNumDiscPairs; ++discIdx )
36  mLineVec[discIdx].clear();
37 };
38 
39 // find the tracks
40 Int_t StFgtLHHTracking::findTracks(){
41 
42  // Make lines out of pairs of points. Points must come from different discs.
43 
44  StFgtTrPointVec::const_iterator iter1, iter2;
45 
46  Int_t nLines = 0;
47  for( Int_t disc1 = 0, discIdx = 0; disc1 < kFgtNumDiscs-1; ++disc1 ){
48  StFgtTrPointVec &pointVec1 = mPointVecPerDisc[ disc1 ];
49 
50  for( Int_t disc2 = disc1+1; disc2 < kFgtNumDiscs; ++disc2, ++discIdx ){
51  StFgtTrPointVec &pointVec2 = mPointVecPerDisc[ disc2 ];
52 
53  Int_t idxIter1 = 0;
54  for( iter1 = pointVec1.begin(); iter1 != pointVec1.end(); ++iter1, ++idxIter1 ){
55  Int_t idxIter2 = 0;
56  for( iter2 = pointVec2.begin(); iter2 != pointVec2.end(); ++iter2, ++idxIter2 ){
57 
58  Float_t deltaZ = (iter1->pos.Z() - iter2->pos.Z());
59  assert( deltaZ ); // already required different discs, so this must be true
60 
61  Float_t mx = (iter1->pos.X() - iter2->pos.X()) / deltaZ;
62  Float_t my = (iter1->pos.Y() - iter2->pos.Y()) / deltaZ;
63  Float_t bx = mx*iter1->pos.Z() - iter1->pos.X();
64  Float_t by = my*iter1->pos.Z() - iter1->pos.Y();
65 
66  mLineVec[discIdx].push_back( StFgtLHHLine( idxIter1, idxIter2, disc1, disc2, mx, my, bx, by ) );
67  ++nLines;
68  };
69  };
70  };
71  };
72 
73 #ifdef DEBUG
74  if( nLines ){
75  LOG_INFO << GetEventNumber() << " mPointsTot = " << mPointsTot << endm;
76  LOG_INFO << GetEventNumber() << " have " << nLines << " points in the Hough space" << endm;
77 
78  StFgtLHHLineVec::iterator lineIter;
79 
80  for( Int_t disc1 = 0, discIdx = 0; disc1 < kFgtNumDiscs-1; ++disc1 ){
81  for( Int_t disc2 = disc1+1; disc2 < kFgtNumDiscs; ++disc2, ++discIdx ){
82  for( lineIter = mLineVec[discIdx].begin(); lineIter != mLineVec[discIdx].end(); ++lineIter ){
83  LOG_INFO << lineIter->pointIdx1 << ' ' << lineIter->pointIdx2 << ' '
84  << lineIter->discIdx1 << ' ' << lineIter->discIdx2 << ' '
85  << lineIter->mx << ' ' << lineIter->bx << ' '
86  << lineIter->my << ' ' << lineIter->by << ' '
87  << lineIter->vertZ << endm;
88  };
89  };
90  };
91  };
92 #endif
93 
94  // make pairs of lines, and see if any are "close" to each other
95  if( nLines ){
96  StFgtLHHLineVec::iterator lineIter1;
97  StFgtLHHLineVec::iterator lineIter2;
98 
99  Float_t minDist = 1e10;
100  for( Int_t discIdx1 = 0; discIdx1 < kFgtNumDiscPairs; ++discIdx1 ){
101  for( Int_t discIdx2 = discIdx1+1; discIdx2 < kFgtNumDiscPairs; ++discIdx2 ){
102  for( lineIter1 = mLineVec[discIdx1].begin(); lineIter1 != mLineVec[discIdx1].end(); ++lineIter1 ){
103  for( lineIter2 = mLineVec[discIdx2].begin(); lineIter2 != mLineVec[discIdx2].end(); ++lineIter2 ){
104  Float_t dist = distanceSqBetween( *lineIter1, *lineIter2 );
105  if( dist < minDist )
106  minDist = dist;
107 
108  LOG_INFO << "dist between ( " << lineIter1->pointIdx1 << ' ' << lineIter1->pointIdx2 << ' '
109  << lineIter1->discIdx1 << ' ' << lineIter1->discIdx2 << " ) "
110  << "( " << lineIter2->pointIdx1 << ' ' << lineIter2->pointIdx2 << ' '
111  << lineIter2->discIdx1 << ' ' << lineIter2->discIdx2 << " ) "
112  << dist << ' ' << minDist << endm;
113  };
114  };
115  };
116  };
117 
118  LOG_INFO << GetEventNumber() << " min dist is " << minDist << endm;
119  };
120 
121  return kStOk;
122 };
123 
124 // the sum of the distances squared in the xy planes at the z positions of the center of STAR (z=0) and the last disc
125 Float_t StFgtLHHTracking::distanceSqBetween( const StFgtLHHLine& line1, const StFgtLHHLine& line2 ) const {
126 // Float_t d2 = 0;
127 // d2 += distanceSqLineToPoint( line1, mPointVecPerDisc[ line2.discIdx1 ][ line2.pointIdx1 ].pos );
128 // d2 += distanceSqLineToPoint( line1, mPointVecPerDisc[ line2.discIdx2 ][ line2.pointIdx2 ].pos );
129 // d2 += distanceSqLineToPoint( line2, mPointVecPerDisc[ line1.discIdx1 ][ line1.pointIdx1 ].pos );
130 // d2 += distanceSqLineToPoint( line2, mPointVecPerDisc[ line1.discIdx2 ][ line1.pointIdx2 ].pos );
131  Float_t dx = line1.bx - line1.bx;
132  Float_t dy = line1.by - line1.by;
133  Float_t d2 = dx*dx + dy*dy;
134 
135  static Float_t z = StFgtGeom::getDiscZ( kFgtNumDiscs-1 );
136  dx = line1.mx*z + line1.bx - line2.mx*z - line1.bx;
137  dy = line1.my*z + line1.by - line2.my*z - line1.by;
138  d2 += dx*dx + dy*dy;
139 
140  return d2;
141 };
142 
143 Float_t StFgtLHHTracking::distanceSqLineToPoint( const StFgtLHHLine& line, const TVector3& pointPos ) const {
144  Float_t numerator = line.mx*(pointPos.X()-line.bx) + line.my*(pointPos.Y()-line.by) + pointPos.Z();
145  Float_t denominator = line.mx*line.mx + line.my*line.my + 1;
146  Float_t z = numerator / denominator;
147  TVector3 linePos( line.mx*z + line.bx, line.my*z + line.by, z );
148  return (linePos - pointPos).Mag2();
149 };
150 
151 ClassImp( StFgtLHHTracking );
Definition: Stypes.h:41