10 |
//...................................... |
//...................................... |
11 |
extern "C" { |
extern "C" { |
12 |
void dotrack_(int*, double*, double*, double*, double*, int*); |
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*); |
int readb_(const char*); |
15 |
} |
} |
16 |
//-------------------------------------- |
//-------------------------------------- |
111 |
// |
// |
112 |
// |
// |
113 |
//-------------------------------------- |
//-------------------------------------- |
114 |
|
/** |
115 |
|
* Evaluates the trajectory in the apparatus associated to the track. |
116 |
|
* 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. |
117 |
|
* @param t pointer to an object of the class Trajectory, |
118 |
|
* which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ). |
119 |
|
* @return error flag. |
120 |
|
*/ |
121 |
|
int TrkTrack::DoTrack2(Trajectory* t){ |
122 |
|
|
123 |
|
double *dxout = new double[t->npoint]; |
124 |
|
double *dyout = new double[t->npoint]; |
125 |
|
double *dthxout = new double[t->npoint]; |
126 |
|
double *dthyout = new double[t->npoint]; |
127 |
|
double *dtlout = new double[t->npoint]; |
128 |
|
double *dzin = new double[t->npoint]; |
129 |
|
double dal[5]; |
130 |
|
|
131 |
|
int ifail = 0; |
132 |
|
|
133 |
|
for (int i=0; i<5; i++) dal[i] = (double)al[i]; |
134 |
|
for (int i=0; i<t->npoint; i++) dzin[i] = (double)t->z[i]; |
135 |
|
|
136 |
|
dotrack2_(&(t->npoint),dzin,dxout,dyout,dthxout,dthyout,dtlout,dal,&ifail); |
137 |
|
|
138 |
|
for (int i=0; i<t->npoint; i++){ |
139 |
|
t->x[i] = (float)*dxout++; |
140 |
|
t->y[i] = (float)*dyout++; |
141 |
|
t->thx[i] = (float)*dthxout++; |
142 |
|
t->thy[i] = (float)*dthyout++; |
143 |
|
t->tl[i] = (float)*dtlout++; |
144 |
|
} |
145 |
|
|
146 |
|
// delete [] dxout; |
147 |
|
// delete [] dyout; |
148 |
|
// delete [] dzin; |
149 |
|
|
150 |
|
return ifail; |
151 |
|
}; |
152 |
|
//-------------------------------------- |
153 |
|
// |
154 |
|
// |
155 |
|
//-------------------------------------- |
156 |
//float TrkTrack::BdL(){ |
//float TrkTrack::BdL(){ |
157 |
//}; |
//}; |
158 |
//-------------------------------------- |
//-------------------------------------- |
451 |
// |
// |
452 |
//-------------------------------------- |
//-------------------------------------- |
453 |
/** |
/** |
454 |
|
* Trajectory default constructor. |
455 |
|
* (By default is created with z-coordinates inside the tracking volume) |
456 |
|
*/ |
457 |
|
Trajectory::Trajectory(){ |
458 |
|
npoint = 10; |
459 |
|
x = new float[npoint]; |
460 |
|
y = new float[npoint]; |
461 |
|
z = new float[npoint]; |
462 |
|
thx = new float[npoint]; |
463 |
|
thy = new float[npoint]; |
464 |
|
tl = new float[npoint]; |
465 |
|
float dz = ((ZTRKUP)-(ZTRKDW))/(npoint-1); |
466 |
|
for(int i=0; i<npoint; i++){ |
467 |
|
x[i] = 0; |
468 |
|
y[i] = 0; |
469 |
|
z[i] = (ZTRKUP) - i*dz; |
470 |
|
thx[i] = 0; |
471 |
|
thy[i] = 0; |
472 |
|
tl[i] = 0; |
473 |
|
} |
474 |
|
} |
475 |
|
//-------------------------------------- |
476 |
|
// |
477 |
|
// |
478 |
|
//-------------------------------------- |
479 |
|
/** |
480 |
* Trajectory constructor. |
* Trajectory constructor. |
481 |
|
* (By default is created with z-coordinates inside the tracking volume) |
482 |
* \param n Number of points |
* \param n Number of points |
483 |
*/ |
*/ |
484 |
Trajectory::Trajectory(int n){ |
Trajectory::Trajectory(int n){ |
485 |
|
if(n<=0){ |
486 |
|
cout << "NB! Trajectory must have at least 1 point >>> created with 10 points" << endl; |
487 |
|
n=10; |
488 |
|
} |
489 |
npoint = n; |
npoint = n; |
490 |
x = new float[npoint]; |
x = new float[npoint]; |
491 |
y = new float[npoint]; |
y = new float[npoint]; |
492 |
z = new float[npoint]; |
z = new float[npoint]; |
493 |
|
thx = new float[npoint]; |
494 |
|
thy = new float[npoint]; |
495 |
|
tl = new float[npoint]; |
496 |
|
float dz = ((ZTRKUP)-(ZTRKDW))/(npoint-1); |
497 |
for(int i=0; i<npoint; i++){ |
for(int i=0; i<npoint; i++){ |
498 |
x[i] = 0; |
x[i] = 0; |
499 |
y[i] = 0; |
y[i] = 0; |
500 |
z[i] = 0; |
z[i] = (ZTRKUP) - i*dz; |
501 |
|
thx[i] = 0; |
502 |
|
thy[i] = 0; |
503 |
|
tl[i] = 0; |
504 |
} |
} |
505 |
} |
} |
506 |
//-------------------------------------- |
//-------------------------------------- |
513 |
* \param pz Pointer to float array, defining z coordinates |
* \param pz Pointer to float array, defining z coordinates |
514 |
*/ |
*/ |
515 |
Trajectory::Trajectory(int n, float* zin){ |
Trajectory::Trajectory(int n, float* zin){ |
516 |
npoint = n; |
npoint = 10; |
517 |
|
if(n>0)npoint = n; |
518 |
x = new float[npoint]; |
x = new float[npoint]; |
519 |
y = new float[npoint]; |
y = new float[npoint]; |
520 |
z = new float[npoint]; |
z = new float[npoint]; |
521 |
for(int i=0; i<npoint; i++){ |
thx = new float[npoint]; |
522 |
|
thy = new float[npoint]; |
523 |
|
tl = new float[npoint]; |
524 |
|
int i=0; |
525 |
|
do{ |
526 |
x[i] = 0; |
x[i] = 0; |
527 |
y[i] = 0; |
y[i] = 0; |
528 |
z[i] = zin[i]; |
z[i] = zin[i]; |
529 |
} |
thx[i] = 0; |
530 |
|
thy[i] = 0; |
531 |
|
tl[i] = 0; |
532 |
|
i++; |
533 |
|
}while(zin[i-1] > zin[i] && i < npoint); |
534 |
|
npoint=i; |
535 |
|
if(npoint != n)cout << "NB! Trajectory created with "<<npoint<<" points"<<endl; |
536 |
} |
} |
537 |
//-------------------------------------- |
//-------------------------------------- |
538 |
// |
// |
544 |
void Trajectory::Dump(){ |
void Trajectory::Dump(){ |
545 |
cout <<endl<< "Trajectory ========== "<<endl; |
cout <<endl<< "Trajectory ========== "<<endl; |
546 |
for (int i=0; i<npoint; i++){ |
for (int i=0; i<npoint; i++){ |
547 |
cout << i <<" >> " << x[i] <<" "<< y[i] <<" "<< z[i] << endl;; |
cout << i <<" >> " << x[i] <<" "<< y[i] <<" "<< z[i] ; |
548 |
|
cout <<" -- " << thx[i] <<" "<< thy[i] ; |
549 |
|
cout <<" -- " << tl[i] << endl; |
550 |
}; |
}; |
551 |
} |
} |
552 |
|
//-------------------------------------- |
553 |
|
// |
554 |
|
// |
555 |
|
//-------------------------------------- |
556 |
|
/** |
557 |
|
* Get trajectory length between two points |
558 |
|
* @param ifirst first point (default 0) |
559 |
|
* @param ilast last point (default npoint) |
560 |
|
*/ |
561 |
|
float Trajectory::GetLength(int ifirst, int ilast){ |
562 |
|
if( ifirst<0 ) ifirst = 0; |
563 |
|
if( ilast>=npoint) ilast = npoint-1; |
564 |
|
float l=0; |
565 |
|
for(int i=ifirst;i<=ilast;i++){ |
566 |
|
l=l+tl[i]; |
567 |
|
}; |
568 |
|
if(z[ilast] > ZINI)l=l-tl[ilast]; |
569 |
|
if(z[ifirst] < ZINI) l=l-tl[ifirst]; |
570 |
|
|
571 |
|
return l; |
572 |
|
|
573 |
|
} |
574 |
ClassImp(TrkLevel2); |
ClassImp(TrkLevel2); |
575 |
ClassImp(TrkSinglet); |
ClassImp(TrkSinglet); |
576 |
ClassImp(TrkTrack); |
ClassImp(TrkTrack); |