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