| 1 | /** | 
| 2 | * \file TrkLevel2.cpp | 
| 3 | * \author Elena Vannuccini | 
| 4 | */ | 
| 5 | #include <TrkLevel2.h> | 
| 6 | #include <iostream> | 
| 7 | using namespace std; | 
| 8 | //...................................... | 
| 9 | // F77 routines | 
| 10 | //...................................... | 
| 11 | extern "C" { | 
| 12 | void dotrack_(int*, double*, double*, double*, double*, int*); | 
| 13 | void dotrack2_(int*, double*, double*, double*, double*,double*, double*, double*,int*); | 
| 14 | int  readb_(const char*); | 
| 15 | } | 
| 16 | //-------------------------------------- | 
| 17 | // | 
| 18 | // | 
| 19 | //-------------------------------------- | 
| 20 | TrkTrack::TrkTrack(){ | 
| 21 | seqno = -1; | 
| 22 | image = -1; | 
| 23 | chi2  = 0; | 
| 24 | for(int it1=0;it1<5;it1++){ | 
| 25 | al[it1] = 0; | 
| 26 | for(int it2=0;it2<5;it2++) | 
| 27 | coval[it1][it2] = 0; | 
| 28 | }; | 
| 29 | for(int ip=0;ip<6;ip++){ | 
| 30 | xgood[ip]  = 0; | 
| 31 | ygood[ip]  = 0; | 
| 32 | xm[ip]     = 0; | 
| 33 | ym[ip]     = 0; | 
| 34 | zm[ip]     = 0; | 
| 35 | resx[ip]   = 0; | 
| 36 | resy[ip]   = 0; | 
| 37 | xv[ip]     = 0; | 
| 38 | yv[ip]     = 0; | 
| 39 | zv[ip]     = 0; | 
| 40 | axv[ip]    = 0; | 
| 41 | ayv[ip]    = 0; | 
| 42 | dedx_x[ip] = 0; | 
| 43 | dedx_y[ip] = 0; | 
| 44 | }; | 
| 45 | }; | 
| 46 | //-------------------------------------- | 
| 47 | // | 
| 48 | // | 
| 49 | //-------------------------------------- | 
| 50 | TrkTrack::TrkTrack(const TrkTrack& t){ | 
| 51 | seqno = t.seqno; | 
| 52 | image = t.image; | 
| 53 | chi2  = t.chi2; | 
| 54 | for(int it1=0;it1<5;it1++){ | 
| 55 | al[it1] = t.al[it1]; | 
| 56 | for(int it2=0;it2<5;it2++) | 
| 57 | coval[it1][it2] = t.coval[it1][it2]; | 
| 58 | }; | 
| 59 | for(int ip=0;ip<6;ip++){ | 
| 60 | xgood[ip]  = t.xgood[ip]; | 
| 61 | ygood[ip]  = t.ygood[ip]; | 
| 62 | xm[ip]     = t.xm[ip]; | 
| 63 | ym[ip]     = t.ym[ip]; | 
| 64 | zm[ip]     = t.zm[ip]; | 
| 65 | resx[ip]   = t.resx[ip]; | 
| 66 | resy[ip]   = t.resy[ip]; | 
| 67 | xv[ip]     = t.xv[ip]; | 
| 68 | yv[ip]     = t.yv[ip]; | 
| 69 | zv[ip]     = t.zv[ip]; | 
| 70 | axv[ip]    = t.axv[ip]; | 
| 71 | ayv[ip]    = t.ayv[ip]; | 
| 72 | dedx_x[ip] = t.dedx_x[ip]; | 
| 73 | dedx_y[ip] = t.dedx_y[ip]; | 
| 74 | }; | 
| 75 | }; | 
| 76 | //-------------------------------------- | 
| 77 | // | 
| 78 | // | 
| 79 | //-------------------------------------- | 
| 80 | /** | 
| 81 | * Evaluates the trajectory in the apparatus associated to the track. | 
| 82 | * It integrates the equations of motion in the magnetic field. The magnetic field should be previously loaded ( by calling  TrkLevel2::LoadField() ), otherwise an error message is returned. | 
| 83 | * @param t pointer to an object of the class Trajectory, | 
| 84 | * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ). | 
| 85 | * @return error flag. | 
| 86 | */ | 
| 87 | int TrkTrack::DoTrack(Trajectory* t){ | 
| 88 |  | 
| 89 | double *dxout = new double[t->npoint]; | 
| 90 | double *dyout = new double[t->npoint]; | 
| 91 | double *dzin = new double[t->npoint]; | 
| 92 | double dal[5]; | 
| 93 |  | 
| 94 | int ifail = 0; | 
| 95 |  | 
| 96 | for (int i=0; i<5; i++)         dal[i]  = (double)al[i]; | 
| 97 | for (int i=0; i<t->npoint; i++) dzin[i] = (double)t->z[i]; | 
| 98 |  | 
| 99 | dotrack_(&(t->npoint),dzin,dxout,dyout,dal,&ifail); | 
| 100 |  | 
| 101 | for (int i=0; i<t->npoint; i++){ | 
| 102 | t->x[i] = (float)*dxout++; | 
| 103 | t->y[i] = (float)*dyout++; | 
| 104 | } | 
| 105 |  | 
| 106 | //    delete [] dxout; | 
| 107 | //    delete [] dyout; | 
| 108 | //    delete [] dzin; | 
| 109 |  | 
| 110 | return ifail; | 
| 111 | }; | 
| 112 | //-------------------------------------- | 
| 113 | // | 
| 114 | // | 
| 115 | //-------------------------------------- | 
| 116 | /** | 
| 117 | * Evaluates the trajectory in the apparatus associated to the track. | 
| 118 | * It integrates the equations of motion in the magnetic field. The magnetic field should be previously loaded ( by calling  TrkLevel2::LoadField() ), otherwise an error message is returned. | 
| 119 | * @param t pointer to an object of the class Trajectory, | 
| 120 | * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ). | 
| 121 | * @return error flag. | 
| 122 | */ | 
| 123 | int TrkTrack::DoTrack2(Trajectory* t){ | 
| 124 |  | 
| 125 | double *dxout   = new double[t->npoint]; | 
| 126 | double *dyout   = new double[t->npoint]; | 
| 127 | double *dthxout = new double[t->npoint]; | 
| 128 | double *dthyout = new double[t->npoint]; | 
| 129 | double *dtlout  = new double[t->npoint]; | 
| 130 | double *dzin    = new double[t->npoint]; | 
| 131 | double dal[5]; | 
| 132 |  | 
| 133 | int ifail = 0; | 
| 134 |  | 
| 135 | for (int i=0; i<5; i++)         dal[i]  = (double)al[i]; | 
| 136 | for (int i=0; i<t->npoint; i++) dzin[i] = (double)t->z[i]; | 
| 137 |  | 
| 138 | dotrack2_(&(t->npoint),dzin,dxout,dyout,dthxout,dthyout,dtlout,dal,&ifail); | 
| 139 |  | 
| 140 | for (int i=0; i<t->npoint; i++){ | 
| 141 | t->x[i]   = (float)*dxout++; | 
| 142 | t->y[i]   = (float)*dyout++; | 
| 143 | t->thx[i] = (float)*dthxout++; | 
| 144 | t->thy[i] = (float)*dthyout++; | 
| 145 | t->tl[i]  = (float)*dtlout++; | 
| 146 | } | 
| 147 |  | 
| 148 | //    delete [] dxout; | 
| 149 | //    delete [] dyout; | 
| 150 | //    delete [] dzin; | 
| 151 |  | 
| 152 | return ifail; | 
| 153 | }; | 
| 154 | //-------------------------------------- | 
| 155 | // | 
| 156 | // | 
| 157 | //-------------------------------------- | 
| 158 | //float TrkTrack::BdL(){ | 
| 159 | //}; | 
| 160 | //-------------------------------------- | 
| 161 | // | 
| 162 | // | 
| 163 | //-------------------------------------- | 
| 164 | Float_t TrkTrack::GetRigidity(){ | 
| 165 | Float_t rig=0; | 
| 166 | if(chi2>0)rig=1./al[4]; | 
| 167 | if(rig<0) rig=-rig; | 
| 168 | return rig; | 
| 169 | }; | 
| 170 | // | 
| 171 | Float_t TrkTrack::GetDeflection(){ | 
| 172 | Float_t def=0; | 
| 173 | if(chi2>0)def=al[4]; | 
| 174 | return def; | 
| 175 | }; | 
| 176 | // | 
| 177 | Float_t TrkTrack::GetDEDX(){ | 
| 178 | Float_t dedx=0; | 
| 179 | for(Int_t i=0; i<6; i++)dedx+=dedx_x[i]*xgood[i]+dedx_y[i]*ygood[i]; | 
| 180 | dedx = dedx/(this->GetNX()+this->GetNY()); | 
| 181 | return dedx; | 
| 182 | }; | 
| 183 |  | 
| 184 | //-------------------------------------- | 
| 185 | // | 
| 186 | // | 
| 187 | //-------------------------------------- | 
| 188 | void TrkTrack::Dump(){ | 
| 189 | cout << endl << "========== Track " ; | 
| 190 | cout << endl << "al       : "; for(int i=0; i<5; i++)cout << al[i] << " "; | 
| 191 | cout << endl << "chi^2    : "<< chi2; | 
| 192 | cout << endl << "xgood    : "; for(int i=0; i<6; i++)cout << xgood[i] ; | 
| 193 | cout << endl << "ygood    : "; for(int i=0; i<6; i++)cout << ygood[i] ; | 
| 194 | cout << endl << "xm       : "; for(int i=0; i<6; i++)cout << xm[i] << " "; | 
| 195 | cout << endl << "ym       : "; for(int i=0; i<6; i++)cout << ym[i] << " "; | 
| 196 | cout << endl << "zm       : "; for(int i=0; i<6; i++)cout << zm[i] << " "; | 
| 197 | cout << endl << "dedx_x   : "; for(int i=0; i<6; i++)cout << dedx_x[i] << " "; | 
| 198 | cout << endl << "dedx_y   : "; for(int i=0; i<6; i++)cout << dedx_y[i] << " "; | 
| 199 | } | 
| 200 | //-------------------------------------- | 
| 201 | // | 
| 202 | // | 
| 203 | //-------------------------------------- | 
| 204 | TrkSinglet::TrkSinglet(){ | 
| 205 | plane    = 0; | 
| 206 | coord[0] = 0; | 
| 207 | coord[1] = 0; | 
| 208 | sgnl     = 0; | 
| 209 | }; | 
| 210 | //-------------------------------------- | 
| 211 | // | 
| 212 | // | 
| 213 | //-------------------------------------- | 
| 214 | TrkSinglet::TrkSinglet(const TrkSinglet& s){ | 
| 215 | plane    = s.plane; | 
| 216 | coord[0] = s.coord[0]; | 
| 217 | coord[1] = s.coord[1]; | 
| 218 | sgnl     = s.sgnl; | 
| 219 | }; | 
| 220 | //-------------------------------------- | 
| 221 | // | 
| 222 | // | 
| 223 | //-------------------------------------- | 
| 224 | void TrkSinglet::Dump(){ | 
| 225 | int i=0; | 
| 226 | cout << endl << "========== Singlet " ; | 
| 227 | cout << endl << "plane    : " << plane; | 
| 228 | cout << endl << "coord[2] : "; while( i<2 && cout << coord[i] << " ") i++; | 
| 229 | cout << endl << "sgnl     : " << sgnl; | 
| 230 | } | 
| 231 | //-------------------------------------- | 
| 232 | // | 
| 233 | // | 
| 234 | //-------------------------------------- | 
| 235 | TrkLevel2::TrkLevel2(){ | 
| 236 | good2    = -1; | 
| 237 | for(Int_t i=0; i<12 ; i++){ | 
| 238 | crc[i] = -1; | 
| 239 | }; | 
| 240 | Track    = new TClonesArray("TrkTrack"); | 
| 241 | SingletX = new TClonesArray("TrkSinglet"); | 
| 242 | SingletY = new TClonesArray("TrkSinglet"); | 
| 243 |  | 
| 244 | //      PhysicalTrack = new TClonesArray("TrkTrack"); | 
| 245 | //sostituire con TRefArray... appena ho capito come si usa | 
| 246 | } | 
| 247 | //-------------------------------------- | 
| 248 | // | 
| 249 | // | 
| 250 | //-------------------------------------- | 
| 251 | void TrkLevel2::Dump(){ | 
| 252 | TClonesArray &t  = *Track; | 
| 253 | TClonesArray &sx = *SingletX; | 
| 254 | TClonesArray &sy = *SingletY; | 
| 255 |  | 
| 256 | cout << endl << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"; | 
| 257 | cout << endl << "good2    : " << good2; | 
| 258 | cout << endl << "crc      : "; for(int i=0; i<12; i++) cout << crc[i]; | 
| 259 | cout << endl << "ntrk()   : " << this->ntrk() ; | 
| 260 | cout << endl << "nclsx()  : " << this->nclsx(); | 
| 261 | cout << endl << "nclsy()  : " << this->nclsy(); | 
| 262 | for(int i=0; i<this->ntrk(); i++)     ((TrkTrack *)t[i])->Dump(); | 
| 263 | for(int i=0; i<this->nclsx(); i++) ((TrkSinglet *)sx[i])->Dump(); | 
| 264 | for(int i=0; i<this->nclsy(); i++) ((TrkSinglet *)sy[i])->Dump(); | 
| 265 | } | 
| 266 | //-------------------------------------- | 
| 267 | // | 
| 268 | // | 
| 269 | //-------------------------------------- | 
| 270 | /** | 
| 271 | * Fills a TrkLevel2 object with values from a struct cTrkLevel2 (to get data from F77 common). | 
| 272 | */ | 
| 273 | void TrkLevel2::FillCommonVar(cTrkLevel2 *l2){ | 
| 274 | // | 
| 275 | //    Track    = new TClonesArray("TrkTrack"); | 
| 276 | //    SingletX = new TClonesArray("TrkSinglet"); | 
| 277 | //    SingletY = new TClonesArray("TrkSinglet"); | 
| 278 | //  temporary objects: | 
| 279 | TrkSinglet* t_singlet = new TrkSinglet(); | 
| 280 | TrkTrack*   t_track   = new TrkTrack(); | 
| 281 | //  general variables | 
| 282 | good2 = l2->good2; | 
| 283 | for(Int_t i=0; i<12 ; i++){ | 
| 284 | crc[i] = l2->crc[i]; | 
| 285 | }; | 
| 286 | //  *** TRACKS *** | 
| 287 | TClonesArray &t = *Track; | 
| 288 | for(int i=0; i<l2->ntrk; i++){ | 
| 289 | t_track->seqno = i; | 
| 290 | t_track->image = l2->image[i]-1; | 
| 291 | //      cout << "track "<<i<<t_track->seqno << t_track->image<<endl; | 
| 292 | t_track->chi2  = l2->chi2_nt[i]; | 
| 293 | for(int it1=0;it1<5;it1++){ | 
| 294 | t_track->al[it1] = l2->al_nt[i][it1]; | 
| 295 | for(int it2=0;it2<5;it2++) | 
| 296 | t_track->coval[it1][it2] = l2->coval[i][it2][it1]; | 
| 297 | }; | 
| 298 | for(int ip=0;ip<6;ip++){ | 
| 299 | t_track->xgood[ip]  = l2->xgood_nt[i][ip]; | 
| 300 | t_track->ygood[ip]  = l2->ygood_nt[i][ip]; | 
| 301 | t_track->xm[ip]     = l2->xm_nt[i][ip]; | 
| 302 | t_track->ym[ip]     = l2->ym_nt[i][ip]; | 
| 303 | t_track->zm[ip]     = l2->zm_nt[i][ip]; | 
| 304 | t_track->resx[ip]   = l2->resx_nt[i][ip]; | 
| 305 | t_track->resy[ip]   = l2->resy_nt[i][ip]; | 
| 306 | t_track->xv[ip]     = l2->xv_nt[i][ip]; | 
| 307 | t_track->yv[ip]     = l2->yv_nt[i][ip]; | 
| 308 | t_track->zv[ip]     = l2->zv_nt[i][ip]; | 
| 309 | t_track->axv[ip]    = l2->axv_nt[i][ip]; | 
| 310 | t_track->ayv[ip]    = l2->ayv_nt[i][ip]; | 
| 311 | t_track->dedx_x[ip] = l2->dedx_x[i][ip]; | 
| 312 | t_track->dedx_y[ip] = l2->dedx_y[i][ip]; | 
| 313 | }; | 
| 314 | new(t[i]) TrkTrack(*t_track); | 
| 315 | t_track->Clear(); | 
| 316 | }; | 
| 317 | //  *** SINGLETS *** | 
| 318 | TClonesArray &sx = *SingletX; | 
| 319 | for(int i=0; i<l2->nclsx; i++){ | 
| 320 | t_singlet->plane    = l2->planex[i]; | 
| 321 | t_singlet->coord[0] = l2->xs[i][0]; | 
| 322 | t_singlet->coord[1] = l2->xs[i][1]; | 
| 323 | t_singlet->sgnl     = l2->signlxs[i]; | 
| 324 | new(sx[i]) TrkSinglet(*t_singlet); | 
| 325 | t_singlet->Clear(); | 
| 326 | } | 
| 327 | TClonesArray &sy = *SingletY; | 
| 328 | for(int i=0; i<l2->nclsy; i++){ | 
| 329 | t_singlet->plane    = l2->planey[i]; | 
| 330 | t_singlet->coord[0] = l2->ys[i][0]; | 
| 331 | t_singlet->coord[1] = l2->ys[i][1]; | 
| 332 | t_singlet->sgnl     = l2->signlys[i]; | 
| 333 | new(sy[i]) TrkSinglet(*t_singlet); | 
| 334 | t_singlet->Clear(); | 
| 335 | }; | 
| 336 |  | 
| 337 | delete t_track; | 
| 338 | delete t_singlet; | 
| 339 | } | 
| 340 | //-------------------------------------- | 
| 341 | // | 
| 342 | // | 
| 343 | //-------------------------------------- | 
| 344 | void TrkLevel2::Clear(){ | 
| 345 | good2    = -1; | 
| 346 | for(Int_t i=0; i<12 ; i++){ | 
| 347 | crc[i] = -1; | 
| 348 | }; | 
| 349 | /*    Track->RemoveAll(); | 
| 350 | SingletX->RemoveAll(); | 
| 351 | SingletY->RemoveAll();*/ | 
| 352 | // modify to avoid memory leakage | 
| 353 | Track->Clear(); | 
| 354 | SingletX->Clear(); | 
| 355 | SingletY->Clear(); | 
| 356 | } | 
| 357 | //-------------------------------------- | 
| 358 | // | 
| 359 | // | 
| 360 | //-------------------------------------- | 
| 361 | /** | 
| 362 | * Sort physical tracks and stores them in a TObjectArray, ordering by increasing chi**2 value (in case of track image, it selects the one with lower chi**2). The total number of physical tracks is given by GetNTracks() and the it-th physical track can be retrieved by means of the method GetTrack(int it). | 
| 363 | * This method is overridden by PamLevel2::GetTracks(), where calorimeter and TOF information is used. | 
| 364 | */ | 
| 365 | TClonesArray *TrkLevel2::GetTracks(){ | 
| 366 | TClonesArray *sorted = GetTracks_NFitSorted(); | 
| 367 | return sorted; | 
| 368 |  | 
| 369 | // fare di meglio... | 
| 370 | /*      PhysicalTrack->Clear(); | 
| 371 | if(ntrk() > 0) GetTracks_NFitSorted(); | 
| 372 | return PhysicalTrack;*/ | 
| 373 | }; | 
| 374 |  | 
| 375 | /*TClonesArray *TrkLevel2::GetTracks_Chi2Sorted(){ | 
| 376 |  | 
| 377 | TClonesArray *sorted = new TClonesArray("TrkTrack"); | 
| 378 | TClonesArray &t = *Track; | 
| 379 | TClonesArray &ts = *sorted; | 
| 380 | int N=this->ntrk(); | 
| 381 | vector<int> m(N); for(int i=0; i<N; i++)m[i]=1; | 
| 382 |  | 
| 383 | int indo=0; | 
| 384 | int indi=0; | 
| 385 | while(N != 0){ | 
| 386 | float chi2ref=1000000; | 
| 387 | for(int i=0; i<this->ntrk(); i++){ | 
| 388 | if(((TrkTrack *)t[i])->chi2 < chi2ref && m[i]==1){ | 
| 389 | chi2ref = ((TrkTrack *)t[i])->chi2; | 
| 390 | indi = i; | 
| 391 | } | 
| 392 | } | 
| 393 | if( ((TrkTrack *)t[indi])->image != -1 ){ | 
| 394 | m[((TrkTrack *)t[indi])->image] = 0; | 
| 395 | N--; | 
| 396 | } | 
| 397 | new(ts[indo]) TrkTrack(*(TrkTrack*)t[indi]); | 
| 398 | m[indi] = 0; | 
| 399 | N--; | 
| 400 | indo++; | 
| 401 | } | 
| 402 | return sorted; | 
| 403 | }*/ | 
| 404 | TClonesArray *TrkLevel2::GetTracks_NFitSorted(){ | 
| 405 |  | 
| 406 | TClonesArray *sorted = new TClonesArray("TrkTrack"); | 
| 407 | TClonesArray &t = *Track; | 
| 408 | TClonesArray &ts = *sorted; | 
| 409 | //    TClonesArray &ts = *PhysicalTrack; | 
| 410 | int N=this->ntrk(); | 
| 411 | vector<int> m(N); for(int i=0; i<N; i++)m[i]=1; | 
| 412 |  | 
| 413 | int indo=0; | 
| 414 | int indi=0; | 
| 415 | while(N != 0){ | 
| 416 | int nfit =0; | 
| 417 | float chi2ref=1000000; | 
| 418 | // first loop to search maximum num. of fit points | 
| 419 | for(int i=0; i<this->ntrk(); i++){ | 
| 420 | if( ((TrkTrack *)t[i])->GetNtot() >= nfit && m[i]==1){ | 
| 421 | nfit =    ((TrkTrack *)t[i])->GetNtot(); | 
| 422 | //              cout << "1** "<<i<< " " << nfit<<endl; | 
| 423 | } | 
| 424 | } | 
| 425 | //second loop to search minimum chi2 among selected | 
| 426 | for(int i=0; i<this->ntrk(); i++){ | 
| 427 | if(    ((TrkTrack *)t[i])->chi2 < chi2ref | 
| 428 | && ((TrkTrack *)t[i])->GetNtot()== nfit | 
| 429 | && m[i]==1){ | 
| 430 | chi2ref = ((TrkTrack *)t[i])->chi2; | 
| 431 | indi = i; | 
| 432 | //              cout << "2** "<<i<< " " << nfit <<" "<<chi2ref<<endl; | 
| 433 | } | 
| 434 | } | 
| 435 | if( ((TrkTrack *)t[indi])->HasImage() ){ | 
| 436 | m[((TrkTrack *)t[indi])->image] = 0; | 
| 437 | N--; | 
| 438 |  | 
| 439 | //          Int_t nfiti=((TrkTrack *)t[((TrkTrack *)t[indi])->image  ])->GetNtot(); | 
| 440 | //          Float_t chi2i=((TrkTrack *)t[((TrkTrack *)t[indi])->image  ])->chi2; | 
| 441 |  | 
| 442 | //          cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<<chi2i<<endl; | 
| 443 | } | 
| 444 | new(ts[indo]) TrkTrack(*(TrkTrack*)t[indi]); | 
| 445 | m[indi] = 0; | 
| 446 | N--; | 
| 447 | indo++; | 
| 448 | } | 
| 449 | return sorted; | 
| 450 | //    return PhysicalTrack; | 
| 451 | } | 
| 452 | //-------------------------------------- | 
| 453 | // | 
| 454 | // | 
| 455 | //-------------------------------------- | 
| 456 | /** | 
| 457 | * Retrieves the is-th stored track. | 
| 458 | * @param it Track number, ranging from 0 to ntrk(). | 
| 459 | * Fitted tracks ( images included ) are stored in a TObjectArray ( TrkLevel2::Track ) in the same order they are returned by the F77 fitting routine. | 
| 460 | */ | 
| 461 | TrkTrack *TrkLevel2::GetStoredTrack(int is){ | 
| 462 |  | 
| 463 | if(is >= this->ntrk()){ | 
| 464 | cout << "** TrkLevel2 ** Track "<< is << "doen not exits! " << endl; | 
| 465 | cout << "                Stored tracks ntrk() = "<< this->ntrk() << endl; | 
| 466 | return 0; | 
| 467 | } | 
| 468 | TClonesArray &t = *(Track); | 
| 469 | TrkTrack *track = (TrkTrack*)t[is]; | 
| 470 | return track; | 
| 471 | } | 
| 472 | //-------------------------------------- | 
| 473 | // | 
| 474 | // | 
| 475 | //-------------------------------------- | 
| 476 | /** | 
| 477 | * Retrieves the is-th stored X singlet. | 
| 478 | * @param it Singlet number, ranging from 0 to nclsx(). | 
| 479 | */ | 
| 480 | TrkSinglet *TrkLevel2::GetSingletX(int is){ | 
| 481 |  | 
| 482 | if(is >= this->nclsx()){ | 
| 483 | cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl; | 
| 484 | cout << "                Stored x-singlets nclsx() = "<< this->nclsx() << endl; | 
| 485 | return 0; | 
| 486 | } | 
| 487 | TClonesArray &t = *(SingletX); | 
| 488 | TrkSinglet *singlet = (TrkSinglet*)t[is]; | 
| 489 | return singlet; | 
| 490 | } | 
| 491 | //-------------------------------------- | 
| 492 | // | 
| 493 | // | 
| 494 | //-------------------------------------- | 
| 495 | /** | 
| 496 | * Retrieves the is-th stored Y singlet. | 
| 497 | * @param it Singlet number, ranging from 0 to nclsx(). | 
| 498 | */ | 
| 499 | TrkSinglet *TrkLevel2::GetSingletY(int is){ | 
| 500 |  | 
| 501 | if(is >= this->nclsy()){ | 
| 502 | cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl; | 
| 503 | cout << "                Stored y-singlets nclsy() = "<< this->nclsx() << endl; | 
| 504 | return 0; | 
| 505 | } | 
| 506 | TClonesArray &t = *(SingletY); | 
| 507 | TrkSinglet *singlet = (TrkSinglet*)t[is]; | 
| 508 | return singlet; | 
| 509 | } | 
| 510 | //-------------------------------------- | 
| 511 | // | 
| 512 | // | 
| 513 | //-------------------------------------- | 
| 514 | /** | 
| 515 | * Retrieves the it-th "physical" track, sorted by the method GetNTracks(). | 
| 516 | * @param it Track number, ranging from 0 to GetNTracks(). | 
| 517 | */ | 
| 518 | TrkTrack *TrkLevel2::GetTrack(int it){ | 
| 519 |  | 
| 520 | if(it >= this->GetNTracks()){ | 
| 521 | cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl; | 
| 522 | cout << "                Physical tracks GetNTracks() = "<< this->ntrk() << endl; | 
| 523 | return 0; | 
| 524 | } | 
| 525 | TrkTrack *track = (TrkTrack*)(*(this->GetTracks()))[it]; | 
| 526 | GetTracks()->Delete();////TEMPORANEO | 
| 527 | return track; | 
| 528 | } | 
| 529 | /** | 
| 530 | * Give the number of "physical" tracks, sorted by the method GetTracks(). | 
| 531 | */ | 
| 532 | Int_t TrkLevel2::GetNTracks(){ | 
| 533 | Int_t ntot=0; | 
| 534 | ntot = GetTracks()->GetEntries(); | 
| 535 | GetTracks()->Delete();////TEMPORANEO | 
| 536 | return ntot; | 
| 537 | }; | 
| 538 | //-------------------------------------- | 
| 539 | // | 
| 540 | // | 
| 541 | //-------------------------------------- | 
| 542 | /** | 
| 543 | * Retrieves (if present) the image of the it-th "physical" track, sorted by the method GetNTracks(). | 
| 544 | * @param it Track number, ranging from 0 to GetNTracks(). | 
| 545 | */ | 
| 546 | TrkTrack *TrkLevel2::GetTrackImage(int it){ | 
| 547 |  | 
| 548 | if(it >= this->GetNTracks()){ | 
| 549 | cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl; | 
| 550 | cout << "                Physical tracks GetNTracks() = "<< this->ntrk() << endl; | 
| 551 | return 0; | 
| 552 | } | 
| 553 | TrkTrack *track = (TrkTrack*)(*(this->GetTracks()))[it]; | 
| 554 | if(!track->HasImage()){ | 
| 555 | cout << "** TrkLevel2 ** Track "<< it << "does not have image! " << endl; | 
| 556 | return 0; | 
| 557 | } | 
| 558 | TrkTrack *image = (TrkTrack*)(*Track)[track->image]; | 
| 559 | GetTracks()->Delete(); ////TEMPORANEO | 
| 560 | return image; | 
| 561 |  | 
| 562 | } | 
| 563 | //-------------------------------------- | 
| 564 | // | 
| 565 | // | 
| 566 | //-------------------------------------- | 
| 567 | /** | 
| 568 | * Loads the magnetic field. | 
| 569 | * @param s Path of the magnetic-field files. | 
| 570 | */ | 
| 571 | void TrkLevel2::LoadField(TString s){ | 
| 572 | readb_(s.Data()); | 
| 573 | }; | 
| 574 | //-------------------------------------- | 
| 575 | // | 
| 576 | // | 
| 577 | //-------------------------------------- | 
| 578 | /** | 
| 579 | * Get tracker-plane (mechanical) z-coordinate | 
| 580 | * @param plane_id plane index (1=TOP,2,3,4,5,6=BOTTOM) | 
| 581 | */ | 
| 582 | Float_t TrkLevel2::GetZTrk(Int_t plane_id){ | 
| 583 | switch(plane_id){ | 
| 584 | case 1: return ZTRK1; | 
| 585 | case 2: return ZTRK2; | 
| 586 | case 3: return ZTRK3; | 
| 587 | case 4: return ZTRK4; | 
| 588 | case 5: return ZTRK5; | 
| 589 | case 6: return ZTRK6; | 
| 590 | default: return 0.; | 
| 591 | }; | 
| 592 | }; | 
| 593 | //-------------------------------------- | 
| 594 | // | 
| 595 | // | 
| 596 | //-------------------------------------- | 
| 597 | /** | 
| 598 | * Trajectory default constructor. | 
| 599 | * (By default is created with z-coordinates inside the tracking volume) | 
| 600 | */ | 
| 601 | Trajectory::Trajectory(){ | 
| 602 | npoint = 10; | 
| 603 | x = new float[npoint]; | 
| 604 | y = new float[npoint]; | 
| 605 | z = new float[npoint]; | 
| 606 | thx = new float[npoint]; | 
| 607 | thy = new float[npoint]; | 
| 608 | tl = new float[npoint]; | 
| 609 | float dz = ((ZTRK1)-(ZTRK6))/(npoint-1); | 
| 610 | for(int i=0; i<npoint; i++){ | 
| 611 | x[i] = 0; | 
| 612 | y[i] = 0; | 
| 613 | z[i] = (ZTRK1) - i*dz; | 
| 614 | thx[i] = 0; | 
| 615 | thy[i] = 0; | 
| 616 | tl[i] = 0; | 
| 617 | } | 
| 618 | } | 
| 619 | //-------------------------------------- | 
| 620 | // | 
| 621 | // | 
| 622 | //-------------------------------------- | 
| 623 | /** | 
| 624 | * Trajectory constructor. | 
| 625 | * (By default is created with z-coordinates inside the tracking volume) | 
| 626 | * \param n Number of points | 
| 627 | */ | 
| 628 | Trajectory::Trajectory(int n){ | 
| 629 | if(n<=0){ | 
| 630 | cout << "NB! Trajectory must have at least 1 point >>> created with 10 points" << endl; | 
| 631 | n=10; | 
| 632 | } | 
| 633 | npoint = n; | 
| 634 | x = new float[npoint]; | 
| 635 | y = new float[npoint]; | 
| 636 | z = new float[npoint]; | 
| 637 | thx = new float[npoint]; | 
| 638 | thy = new float[npoint]; | 
| 639 | tl = new float[npoint]; | 
| 640 | float dz = ((ZTRK1)-(ZTRK6))/(npoint-1); | 
| 641 | for(int i=0; i<npoint; i++){ | 
| 642 | x[i] = 0; | 
| 643 | y[i] = 0; | 
| 644 | z[i] = (ZTRK1) - i*dz; | 
| 645 | thx[i] = 0; | 
| 646 | thy[i] = 0; | 
| 647 | tl[i] = 0; | 
| 648 | } | 
| 649 | } | 
| 650 | //-------------------------------------- | 
| 651 | // | 
| 652 | // | 
| 653 | //-------------------------------------- | 
| 654 | /** | 
| 655 | * Trajectory constructor. | 
| 656 | * \param n Number of points | 
| 657 | * \param pz Pointer to float array, defining z coordinates | 
| 658 | */ | 
| 659 | Trajectory::Trajectory(int n, float* zin){ | 
| 660 | npoint = 10; | 
| 661 | if(n>0)npoint = n; | 
| 662 | x = new float[npoint]; | 
| 663 | y = new float[npoint]; | 
| 664 | z = new float[npoint]; | 
| 665 | thx = new float[npoint]; | 
| 666 | thy = new float[npoint]; | 
| 667 | tl = new float[npoint]; | 
| 668 | int i=0; | 
| 669 | do{ | 
| 670 | x[i] = 0; | 
| 671 | y[i] = 0; | 
| 672 | z[i] = zin[i]; | 
| 673 | thx[i] = 0; | 
| 674 | thy[i] = 0; | 
| 675 | tl[i] = 0; | 
| 676 | i++; | 
| 677 | }while(zin[i-1] > zin[i] && i < npoint); | 
| 678 | npoint=i; | 
| 679 | if(npoint != n)cout << "NB! Trajectory created with "<<npoint<<" points"<<endl; | 
| 680 | } | 
| 681 | //-------------------------------------- | 
| 682 | // | 
| 683 | // | 
| 684 | //-------------------------------------- | 
| 685 | /** | 
| 686 | * Dump the trajectory coordinates. | 
| 687 | */ | 
| 688 | void Trajectory::Dump(){ | 
| 689 | cout <<endl<< "Trajectory ========== "<<endl; | 
| 690 | for (int i=0; i<npoint; i++){ | 
| 691 | cout << i <<" >> " << x[i] <<" "<< y[i] <<" "<< z[i] ; | 
| 692 | cout <<" -- " << thx[i] <<" "<< thy[i] ; | 
| 693 | cout <<" -- " << tl[i] << endl; | 
| 694 | }; | 
| 695 | } | 
| 696 | //-------------------------------------- | 
| 697 | // | 
| 698 | // | 
| 699 | //-------------------------------------- | 
| 700 | /** | 
| 701 | * Get trajectory length between two points | 
| 702 | * @param ifirst first point (default 0) | 
| 703 | * @param ilast last point (default npoint) | 
| 704 | */ | 
| 705 | float Trajectory::GetLength(int ifirst, int ilast){ | 
| 706 | if( ifirst<0    ) ifirst = 0; | 
| 707 | if( ilast>=npoint) ilast  = npoint-1; | 
| 708 | float l=0; | 
| 709 | for(int i=ifirst;i<=ilast;i++){ | 
| 710 | l=l+tl[i]; | 
| 711 | }; | 
| 712 | if(z[ilast] > ZINI)l=l-tl[ilast]; | 
| 713 | if(z[ifirst] < ZINI)   l=l-tl[ifirst]; | 
| 714 |  | 
| 715 | return l; | 
| 716 |  | 
| 717 | } | 
| 718 |  | 
| 719 | ClassImp(TrkLevel2); | 
| 720 | ClassImp(TrkSinglet); | 
| 721 | ClassImp(TrkTrack); | 
| 722 | ClassImp(Trajectory); |