Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

Helix.cpp

Go to the documentation of this file.
00001 #include "Helix.h"
00002 #include <iomanip.h>
00003 //-----------------------------------------------------------------------
00004 // Helix member functions
00005 //-----------------------------------------------------------------------
00006 
00007 // default constructor
00008 Helix::Helix() {
00009   HepSymMatrix temp(5,0);
00010   _cov_matrix.assign(temp);
00011 }
00012 
00013 //-----------------------------------------------------------------------
00014 // construct Helix from a track
00015 Helix::Helix(QvecBase* track) {
00016   HepSymMatrix temp(5,0);
00017   _cov_matrix.assign(temp);
00018 
00019   _charge =  track->QCH(); 
00020   _mass   = track->QM(); 
00021 
00022   // Get helix parameters ...
00023 
00024   // -- ordinary charged tracks
00025   if (track->TYPE() == TRACK || track->TYPE() == EFLOW ) { 
00026 
00027     QvecBase* ptrk = track;
00028     if (track->TYPE() == EFLOW) ptrk = ((AlEflw*) track)->getTrack();
00029 
00030     _IR = ((AlTrack*) ptrk)->IR();
00031     _TL = ((AlTrack*) ptrk)->TL(); 
00032     _P0 = ((AlTrack*) ptrk)->P0();
00033     _D0 = ((AlTrack*) ptrk)->D0();
00034     _Z0 = ((AlTrack*) ptrk)->Z0();
00035 
00036     int j = 0;
00037     for (int m = 1; m <= 5; m++) {
00038       for (int n = 1; n <= m; n++) { 
00039         _cov_matrix(m,n) = ((AlTrack*) ptrk)->EM(++j);  
00040       }      
00041     } 
00042 
00043 
00044   } else if (track->TYPE() == USERTRACK) {
00045     // -- User tracks
00046     //
00047     // For the time being, the YTOP auxilary routine YTPAR is being used to calculate 
00048     // the helix parameters (sorry, yet another FORTRAN wrapper)
00049 
00050     //>>>>>
00051     cout << "Helix::Helix: user track !" << endl;
00052 
00053 
00054     QvecBase* ptrk = track;
00055 
00056     // 4-momentum vector and mass
00057     float psum[5];
00058     psum[0] = track->QX();
00059     psum[1] = track->QY();
00060     psum[2] = track->QZ();
00061     psum[3] = sqrt(_mass*_mass + psum[0]*psum[0] +
00062                       psum[1]*psum[1] + psum[2]*psum[2]);
00063     psum[4] = _mass;
00064 
00065     // covariance matrix momentum
00066     float vpsum[10];
00067     for (int j = 0; j < 10; j++) {
00068       vpsum[j] = ((AlUserTrack*)ptrk)->SIG(j);  
00069     } 
00070     
00071     // vertex position 
00072     float vini[3];
00073     QvrtBase* end_vertex = ((AlUserTrack*)ptrk)->getEndVertex();
00074     vini[0] = ((AlUsrVertex*) end_vertex)->QX();
00075     vini[1] = ((AlUsrVertex*) end_vertex)->QY();
00076     vini[2] = ((AlUsrVertex*) end_vertex)->QZ();
00077 
00078     // covariance matrix vertex
00079     float vvini[6];
00080     int j = 0;
00081     for (int m = 1; m <= 3; m++) {
00082       for (int n = 1; n <= m; n++) {
00083         vvini[j++] = ((AlUsrVertex*) end_vertex)->QVEM(m,n);
00084       }
00085     } 
00086 
00087     // correlation momentum-vertex
00088     float vpsvi[9];
00089     j = 0;
00090     for (int m = 0; m < 3; m++) {
00091       for (int n = 0; n < 3; n++) {
00092         vpsvi[j++]= ((AlUserTrack*)ptrk)->corrMatrix(m+1, n+1);
00093       }
00094     }
00095 
00096     float trackpar[5];
00097     float vtrackpar[15];
00098 
00099     // call FORTRAN routine
00100     int ifail =  w_YTPAR(_charge, vini, vvini, psum, vpsum, vpsvi, trackpar, vtrackpar); 
00101 
00102 
00103   } else {
00104     cerr << "***** Helix::Helix: WARNING: Don\'t know tracks of type " << 
00105       int(track->TYPE()) << ". Track ignored !!" << endl;
00106   }
00107 
00108 }
00109 
00110 //-----------------------------------------------------------------------
00111 // set helix parameters according to a track
00112 void Helix::setTrackParameters(QvecBase* track) {
00113   HepSymMatrix temp(5,0);
00114   _cov_matrix.assign(temp);
00115 
00116 
00117   _charge = track->QCH();
00118   _mass   = track->QM(); 
00119 
00120   // Get helix parameters ...
00121   //
00122   // ---  ALPHA charged track  ---
00123   //
00124   if (track->TYPE() == TRACK || track->TYPE() == EFLOW ) {
00125 
00126     QvecBase* ptrk = track;
00127     if (track->TYPE() == EFLOW) ptrk = ((AlEflw*) track)->getTrack();
00128 
00129     _IR = ((AlTrack*)ptrk)->IR();
00130     _TL = ((AlTrack*)ptrk)->TL(); 
00131     _P0 = ((AlTrack*)ptrk)->P0();
00132     _D0 = ((AlTrack*)ptrk)->D0();
00133     _Z0 = ((AlTrack*)ptrk)->Z0();
00134 
00135     int j = 0;
00136     for (int m = 1; m <= 5; m++) {
00137       for (int n = 1; n <= m; n++) { 
00138         _cov_matrix(m,n) = ((AlTrack*)ptrk)->EM(++j);  
00139       }      
00140     } 
00141 
00142   } else if (track->TYPE() == USERTRACK) {
00143     //
00144     // --- User track  ---
00145     //
00146     // For the time being, the YTOP auxilary routine YTPAR is being used to calculate 
00147     // the track parameters (sorry, yet another FORTRAN wrapper)
00148 
00149     // 4-momentum vector and mass
00150     float psum[5];
00151     psum[0] = track->QX();
00152     psum[1] = track->QY();
00153     psum[2] = track->QZ();
00157 
00158     // covariance matrix momentum
00159     float vpsum[10];
00160     for (int j = 1; j <= 10; j++) {
00161       vpsum[j-1] = ((AlUserTrack*)track)->SIG(j);  
00162     } 
00163 
00164     // initial vertex position (here: the track's end vertex) 
00165     float vini[3];
00166     QvrtBase* end_vertex = ((AlUserTrack*)track)->getEndVertex();
00167     vini[0] = ((AlUsrVertex*) end_vertex)->QX();
00168     vini[1] = ((AlUsrVertex*) end_vertex)->QY();
00169     vini[2] = ((AlUsrVertex*) end_vertex)->QZ();
00170 
00171     // covariance matrix vertex
00172     float vvini[6];
00173     int j = 0;
00174     for (int m = 1; m <= 3; m++) {
00175       for (int n = 1; n <= m; n++) {
00176         vvini[j++] = ((AlUsrVertex*) end_vertex)->QVEM(m,n);
00177       }
00178     } 
00179 
00180     // correlation momentum-vertex (seems to be useless for neutral tracks)
00181     float vpsvi[9];
00182     j = 0;
00183     for (int m = 0; m < 3; m++) {
00184       for (int n = 0; n < 3; n++) {
00185         vpsvi[j++]= ((AlUserTrack*)track)->corrMatrix(m+1, n+1);
00186       }
00187     }
00188 
00189     float trackpar[5];
00190     float vtrackpar[15];
00191 
00192     /*
00193       cout << "Input YTPAR" << endl;
00194       cout << "charge:" << _charge << endl;
00195       cout << "vini:  " << setprecision(5) << vini[0] << "  " << vini[1] << "  " << vini[2] << endl; 
00196       cout << "vvini: " << setprecision(5) << vvini[0] << vvini[1] << vvini[2] << endl;
00197       cout << "       " << setprecision(5) << vvini[3] << vvini[4] << endl;
00198       cout << "       " << setprecision(5) << vvini[5] << endl;
00199       cout << "psum:  " << setprecision(5) << psum[0] << "  " << psum[1] << "  " 
00200       << psum[2] << "  "<< psum[3] << "  " << psum[4] << endl;
00201       cout << "vpsum: " << endl;
00202       for (int i = 0; i < 10; i ++ ) cout << setprecision(5) << vpsum[i] << endl;
00203       cout << "vpsvi: " << endl;
00204       for (int i = 0; i < 9; i ++ ) cout << setprecision(5) << vpsvi[i] << endl;
00205       cout << endl;
00206     */
00207 
00208     // call FORTRAN wrapper
00209     int ifail =  w_YTPAR(_charge, vini, vvini, psum, vpsum, vpsvi, trackpar, vtrackpar); 
00210 
00211     _IR = trackpar[0];
00212     _TL = trackpar[1];
00213     _P0 = trackpar[2];
00214     _D0 = trackpar[3];
00215     _Z0 = trackpar[4];
00216 
00217     j = 0;
00218     for (int m = 1; m <= 5; m++) {
00219       for (int n = 1; n <= m; n++) { 
00220         _cov_matrix(m,n) = vtrackpar[j++];  
00221       }      
00222     } 
00223 
00224     /*
00225       cout << "Helix::setTrackParameters: track parameters from YTPAR:" << endl;
00226       cout << _IR << ", " << _TL << ", "<< _P0 << ", "<< _D0 << ", "<< _Z0 << endl;
00227       cout << "cov_matrix:" << endl;
00228       for (int m = 1; m <= 5; m++) {
00229       for (int n = 1; n <= m; n++) { 
00230       cout << setprecision(5) <<  _cov_matrix(m,n) << ", ";  
00231       }      
00232       cout << endl;
00233       }  
00234       cout << "charge: " << _charge << endl;
00235       cout << "mass: " << _mass << endl;
00236     */
00237 
00238   } else {
00239     cerr << "***** Helix::setTrackParameters: WARNING: Don\'t know tracks of type " << 
00240       int(track->TYPE()) << ". Track ignored !!" << endl;
00241   }
00242  
00243 }
00244  
00245 
00246 //-----------------------------------------------------------------------
00247 // YTPAR wrapper (part of YTOP vertex fitting package)
00248 int Helix::w_YTPAR(float charge, float vini[3], float vvini[6], float psum[5], float vpsum[10], 
00249                     float vpsvi[9], float trackpar[5], float vtrackpar[15]) {
00250 
00265    
00266   int ifail;
00267   W_YTPAR(charge, vini, vvini, psum, vpsum, vpsvi, trackpar, vtrackpar, ifail);
00268 
00269   return ifail;
00270 }
00271 

Generated at Wed Jun 18 17:19:20 2003 for ALPHA++ by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001