00001 #include "Stl3Util/gl3/gl3Track.h"
00002
00003 #include "Stl3Util/base/FtfLog.h"
00004
00005 #include <stdlib.h>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 int gl3Track::addTrack ( gl3Track* piece ){
00022
00023 double w1 = 1./ ( dpt * dpt ) ;
00024 double w2 = 1./ ( piece->dpt * piece->dpt ) ;
00025 double wsum = w1 + w2 ;
00026 pt = ( w1 * pt + w2 * piece->pt ) / wsum ;
00027 dpt = 1./::sqrt(wsum);
00028
00029 w1 = 1./ ( dpsi * dpsi ) ;
00030 w2 = 1./ ( piece->dpsi * piece->dpsi ) ;
00031 wsum = w1 + w2 ;
00032 psi = ( w1 * psi + w2 * piece->psi ) / wsum ;
00033 dpsi = 1./::sqrt(wsum) ;
00034
00035 w1 = 1./ ( dtanl * dtanl ) ;
00036 w2 = 1./ ( piece->dtanl * piece->dtanl ) ;
00037 wsum = w1 + w2 ;
00038 tanl = ( w1 * tanl + w2 * piece->tanl ) / wsum ;
00039 dtanl = 1./::sqrt(wsum);
00040
00041 w1 = 1./ ( dz0 * dz0 ) ;
00042 w2 = 1./ ( piece->dz0 * piece->dz0 ) ;
00043 wsum = w1 + w2 ;
00044 z0 = ( w1 * z0 + w2 * piece->z0 ) / wsum ;
00045 dz0 = 1./::sqrt(wsum);
00046
00047 if ( piece->innerMostRow < innerMostRow ) innerMostRow = piece->innerMostRow ;
00048 if ( piece->outerMostRow > outerMostRow ) outerMostRow = piece->outerMostRow ;
00049
00050 nHits += piece->nHits ;
00051
00052
00053
00054 chi2[0] += piece->chi2[0] ;
00055 chi2[1] += piece->chi2[1] ;
00056
00057 return 0 ;
00058 }
00059
00060
00061
00062
00063
00064
00065
00066 void gl3Track::dropHits ( int rest, int rowMin, int rowMax ) {
00067
00068 gl3Hit* previousHit = 0 ;
00069 gl3Hit* cHit = (gl3Hit *)firstHit ;
00070 gl3Hit* deleteHit ;
00071
00072
00073
00074 int counter = 0 ;
00075 int newCounter = 0 ;
00076 while ( counter < nHits && cHit ) {
00077 if ( ( rest > 0 && cHit->getRowSector()%2 == rest ) ||
00078 cHit->getRowSector()%100 < rowMin ||
00079 cHit->getRowSector()%100 > rowMax ) {
00080
00081 deleteHit = cHit ;
00082 cHit = (gl3Hit *)(cHit->nextHit) ;
00083 if ( previousHit ) previousHit->nextHit = cHit ;
00084
00085 deleteHit->trackId = 0 ;
00086 deleteHit->nextHit = 0 ;
00087 }
00088 else {
00089 if ( newCounter == 0 ) firstHit = cHit ;
00090 previousHit = cHit ;
00091 cHit = (gl3Hit *)(cHit->nextHit) ;
00092 newCounter++ ;
00093 }
00094 counter++ ;
00095 lastHit = cHit ;
00096 }
00097
00098 nHits = newCounter ;
00099 if ( nHits == 0 ) {
00100 firstHit = 0 ;
00101 }
00102
00103
00104 }
00105
00106
00107
00108
00109
00110 gl3Track* gl3Track::merge ( FtfContainer *trackArea ){
00111 gl3Track* track_merged ;
00112 register int areaIndex ;
00113 int i_phi, i_eta ;
00114 gl3Track *i_track ;
00115 int ip, ie ;
00116 double delta_psi ;
00117
00118
00119
00120 i_phi = (int)(( psi - getPara()->phiMinTrack ) / getPara()->phiSliceTrack + 1 );
00121 if ( i_phi < 0 ) {
00122
00123 i_phi = 1 ;
00124 }
00125 if ( i_phi >= getPara()->nPhiTrackPlusOne ) {
00126
00127 i_phi = getPara()->nPhiTrack ;
00128 }
00129
00130
00131
00132 i_eta = (int)(( eta - getPara()->etaMinTrack ) / getPara()->etaSliceTrack + 1 );
00133 if ( i_eta <= 0 ) {
00134
00135 i_eta = 1 ;
00136 }
00137 if ( i_eta >= getPara()->nEtaTrackPlusOne ) {
00138
00139 i_eta = getPara()->nEtaTrack ;
00140 }
00141
00142
00143
00144 track_merged = 0 ;
00145
00146 for ( ip = max(i_phi-1,1) ; ip < min(i_phi+2,getPara()->nPhiTrackPlusOne) ; ip++ ) {
00147 for ( ie = max(i_eta-1,1) ; ie < min(i_eta+2,getPara()->nEtaTrackPlusOne) ; ie++ ) {
00148 areaIndex = ip * getPara()->nEtaTrackPlusOne + ie ;
00149
00150
00151
00152 for ( i_track = (gl3Track *)trackArea[areaIndex].first ;
00153 i_track != 0 && !track_merged ;
00154 i_track = i_track->getNextTrack() ) {
00155
00156
00157
00158 if ( i_track->flag < 0 ) continue ;
00159
00160
00161
00162
00163
00164
00165 short p1 = i_track->innerMostRow ;
00166 short p2 = i_track->outerMostRow ;
00167 short t1 = innerMostRow ;
00168 short t2 = outerMostRow ;
00169 if ( p1 < t1 && p2 > t1 ) continue ;
00170 if ( p1 < t2 && p2 > t2 ) continue ;
00171 if ( p1 > t1 && p2 < t2 ) continue ;
00172 if ( t1 < p1 && t2 > p1 ) continue ;
00173 if ( t1 < p2 && t2 > p2 ) continue ;
00174 if ( t1 > p1 && t2 < p2 ) continue ;
00175
00176
00177
00178 double dr0 = fabs(r0-i_track->r0) ;
00179
00180
00181
00182 if ( dr0 < getPara()->distanceMerge ) {
00183 if ( fabs(eta-i_track->eta) > getPara()->detaMerge ) continue ;
00184
00185 delta_psi = fabs(psi - i_track->psi) ;
00186 if ( delta_psi > getPara()->dphiMerge && delta_psi < twoPi - getPara()->dphiMerge ) continue ;
00187
00188
00189
00190 double dx0 = fabs(r0*cos(phi0)-i_track->r0*cos(i_track->phi0));
00191 if ( dx0 > getPara()->distanceMerge ) continue ;
00192 double dy0 = fabs(r0*sin(phi0)-i_track->r0*sin(i_track->phi0));
00193 if ( dy0 > getPara()->distanceMerge ) continue ;
00194 double dz0 = fabs(z0-i_track->z0);
00195 if ( dz0 > getPara()->distanceMerge ) continue ;
00196
00197
00198
00199
00200
00201 i_track->addTrack ( this ) ;
00202 track_merged = i_track ;
00203 break ;
00204 }
00205 else {
00206
00207
00208
00209 gl3Track originalTrack ;
00210 short whichTrack = 0 ;
00211 if ( r0 > i_track->r0 ) {
00212 originalTrack = *this ;
00213 whichTrack = 1 ;
00214 q *= -1 ;
00215 updateToRadius ( i_track->r0 ) ;
00216 q *= -1 ;
00217 }
00218 else {
00219 originalTrack = *i_track ;
00220 i_track->q *= -1 ;
00221 i_track->updateToRadius ( r0 ) ;
00222 i_track->q *= -1 ;
00223 }
00224
00225
00226
00227 if ( fabs(r0*cos(phi0)-i_track->r0*cos(i_track->phi0)) < getPara()->distanceMerge
00228 && fabs(r0*sin(phi0)-i_track->r0*sin(i_track->phi0)) < getPara()->distanceMerge
00229 && fabs(z0-i_track->z0) < getPara()->distanceMerge ) {
00230
00231
00232
00233 if ( fabs(eta-i_track->eta) < 0.9 && fabs(psi - i_track->psi) < 0.9
00234 && fabs(psi - i_track->psi) < 5.9 ) {
00235
00236
00237
00238
00239
00240 i_track->addTrack ( this ) ;
00241 track_merged = i_track ;
00242 break ;
00243 }
00244 }
00245
00246
00247
00248 if ( whichTrack )
00249 *this = originalTrack ;
00250 else
00251 *i_track = originalTrack ;
00252 }
00253 }
00254 #ifdef TRDEBUG
00255 if ( getPara()->debugLevel > 1 )
00256 ftfLog ( " \n Track %d merge into %d ", this->id, i_track->id ) ;
00257 #endif
00258 }
00259 }
00260
00261
00262
00263 if ( !track_merged ) {
00264 areaIndex = i_phi * getPara()->nEtaTrackPlusOne + i_eta ;
00265 if ( trackArea[areaIndex].first == 0 )
00266 trackArea[areaIndex].first =
00267 trackArea[areaIndex].last = (void *)this ;
00268 else {
00269 ((gl3Track *)trackArea[areaIndex].last)->nextTrack = this ;
00270 trackArea[areaIndex].last = (void *)this ;
00271 }
00272 }
00273 return track_merged ;
00274 }
00275
00276
00277
00278 void gl3Track::Print ( int level )
00279 {
00280 double pmom, pz;
00281
00282
00283
00284 if ( level > 9 ) {
00285 pz = pt * tanl ;
00286 pmom = (double)sqrt ( pz * pz + pt * pt ) ;
00287 ftfLog ( " =======> Track %d <======== \n", id ) ;
00288 ftfLog ( " p, pt, q %7.2f %7.2f %2d \n", pmom, pt, q ) ;
00289 }
00290 if ( level > 19 ) {
00291 ftfLog ( " r0, z0, nHits %7.2f %7.2f %d \n ", r0, z0, nHits ) ;
00292 ftfLog ( " phi0, psi, tanl %7.2f %7.2f %7.2f \n", phi0, psi, tanl ) ;
00293 }
00294 else ftfLog ( "\n " ) ;
00295
00296 if ( level > 29 ) {
00297 ftfLog ( " chi2 (s,z) %6.2e %6.2e \n", chi2[0], chi2[1] ) ;
00298 }
00299 else ftfLog ( "\n " ) ;
00300
00301
00302 if ( fmod((double)level,10.) > 0 ) {
00303 ftfLog ( " *** Clusters in this track *** \n" ) ;
00304 for ( startLoop() ; done() ; nextHit() ) {
00305 ((gl3Hit *)currentHit)->print ( ) ;
00306 }
00307 }
00308 ftfLog ( "\n " ) ;
00309 }