/[PAMELA software]/DarthVader/TrackerLevel2/src/TrkLevel2.cpp
ViewVC logotype

Diff of /DarthVader/TrackerLevel2/src/TrkLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.14 by pam-fi, Fri Oct 27 16:59:20 2006 UTC revision 1.17 by pam-fi, Tue Nov 14 16:21:08 2006 UTC
# Line 12  using namespace std; Line 12  using namespace std;
12  extern "C" {      extern "C" {    
13      void dotrack_(int*, double*, double*, double*, double*, int*);      void dotrack_(int*, double*, double*, double*, double*, int*);
14      void dotrack2_(int*, double*, double*, double*, double*,double*, double*, double*,int*);      void dotrack2_(int*, double*, double*, double*, double*,double*, double*, double*,int*);
15      int  readb_(const char*);  //    int  readb_(const char*);
16        int  readb_();
17      void mini2_(int*,int*,int*);      void mini2_(int*,int*,int*);
18        void guess_();
19  }  }
20  //--------------------------------------  //--------------------------------------
21  //  //
22  //  //
23  //--------------------------------------  //--------------------------------------
24    /**
25     * Evaluates the trajectory in the apparatus associated to the track.
26     * 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.  
27     * @param t pointer to an object of the class Trajectory,
28     * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ).
29     * @return error flag.
30     */
31    int Trajectory::DoTrack2(float* al){
32    
33        double *dxout   = new double[t->npoint];
34        double *dyout   = new double[t->npoint];
35        double *dthxout = new double[t->npoint];
36        double *dthyout = new double[t->npoint];
37        double *dtlout  = new double[t->npoint];
38        double *dzin    = new double[t->npoint];
39        double dal[5];
40    
41        int ifail = 0;
42    
43        for (int i=0; i<5; i++)         dal[i]  = (double)al[i];
44        for (int i=0; i<t->npoint; i++) dzin[i] = (double)z[i];
45    
46        dotrack2_(&(t->npoint),dzin,dxout,dyout,dthxout,dthyout,dtlout,dal,&ifail);
47        
48        for (int i=0; i<t->npoint; i++){
49            x[i]   = (float)*dxout++;
50            y[i]   = (float)*dyout++;
51            thx[i] = (float)*dthxout++;
52            thy[i] = (float)*dthyout++;
53            tl[i]  = (float)*dtlout++;
54        }
55    
56        return ifail;
57    };
58    //---------------------------------------------
59    //---------------------------------------------
60  TrkTrack::TrkTrack(){  TrkTrack::TrkTrack(){
61      seqno = -1;      seqno = -1;
62      image = -1;      image = -1;
# Line 248  void TrkTrack::SetGood(int *xg, int *yg) Line 286  void TrkTrack::SetGood(int *xg, int *yg)
286  /**  /**
287   * Load the magnetic field   * Load the magnetic field
288   */   */
289  void TrkTrack::LoadField(TString s){  void TrkTrack::LoadField(TString path){
290      readb_(s.Data());      
291        strcpy(path_.path,path.Data());
292        path_.pathlen = path.Length();
293        path_.error   = 0;
294        readb_();
295    
296  };  };
297  /**  /**
298   * Tracking method. It calls F77 mini routine.   * Tracking method. It calls F77 mini routine.
299   */   */
300  void TrkTrack::Fit(double pfixed, int& fail, int iprint){  void TrkTrack::Fit(double pfixed, int& fail, int iprint){
301    
302        float al_ini[] = {0.,0.,0.,0.,0.};
303    
304      extern cMini2track track_;      extern cMini2track track_;
305      fail = 0;      fail = 0;
306  //    extern cMini2fitinfo fit_info_;  
 //    extern void mini_2_(int*,int*);  
 //    track_.xm[0]=1.0;  
307      for(int i=0; i<6; i++) track_.xm[i]=xm[i];      for(int i=0; i<6; i++) track_.xm[i]=xm[i];
308      for(int i=0; i<6; i++) track_.ym[i]=ym[i];      for(int i=0; i<6; i++) track_.ym[i]=ym[i];
309      for(int i=0; i<6; i++) track_.zm[i]=zm[i];      for(int i=0; i<6; i++) track_.zm[i]=zm[i];
# Line 267  void TrkTrack::Fit(double pfixed, int& f Line 311  void TrkTrack::Fit(double pfixed, int& f
311      for(int i=0; i<6; i++) track_.resy[i]=resy[i];      for(int i=0; i<6; i++) track_.resy[i]=resy[i];
312      for(int i=0; i<6; i++) track_.xgood[i]=xgood[i];      for(int i=0; i<6; i++) track_.xgood[i]=xgood[i];
313      for(int i=0; i<6; i++) track_.ygood[i]=ygood[i];      for(int i=0; i<6; i++) track_.ygood[i]=ygood[i];
314    
315  // initial guess of "al" with linear fit  // initial guess of "al" with linear fit
316      if(al[0]==-9999.&&al[1]==-9999.&&al[2]==-9999.&&al[3]==-9999.&&al[4]==-9999.){  //     if(al[0]==-9999.&&al[1]==-9999.&&al[2]==-9999.&&al[3]==-9999.&&al[4]==-9999.){
317          double szz=0., szx=0., szy=0., ssx=0., ssy=0., sz=0., s1=0.;  //      cout << "initial guess "<<endl;
318          double det, ax, ay, bx, by;  //      double szz=0., szx=0., szy=0., ssx=0., ssy=0., sz=0., s1=0.;
319          for(int i=0; i<NPLANE; i++) {  //      double det, ax, ay, bx, by;
320              szz=szz+zm[i]*zm[i];  //      for(int i=0; i<NPLANE; i++) {
321              szx=szx+zm[i]*xm[i];  //          szz=szz+zm[i]*zm[i];
322              szy=szy+zm[i]*ym[i];  //          szx=szx+zm[i]*xm[i];
323              ssx=ssx+xm[i];  //          szy=szy+zm[i]*ym[i];
324              ssy=ssy+ym[i];  //          ssx=ssx+xm[i];
325              sz=sz+zm[i];  //          ssy=ssy+ym[i];
326              s1=s1+1.;  //          sz=sz+zm[i];
327          }  //          s1=s1+1.;
328          det=szz*s1-sz*sz;  //      }
329          ax=(szx*s1-sz*ssx)/det;  //      det=szz*s1-sz*sz;
330          bx=(szz*ssx-szx*sz)/det;  //      ax=(szx*s1-sz*ssx)/det;
331          ay=(szy*s1-sz*ssy)/det;  //      bx=(szz*ssx-szx*sz)/det;
332          by=(szz*ssy-szy*sz)/det;  //      ay=(szy*s1-sz*ssy)/det;
333          al[0]=ax*23.5+bx; // ZINI = 23.5 !!! it should be the same parameter in all codes  //      by=(szz*ssy-szy*sz)/det;
334          al[1]=ay*23.5+by; //  "    //      al[0]=ax*23.5+bx; // ZINI = 23.5 !!! it should be the same parameter in all codes
335          al[2]= sqrt(pow(ax,2)+pow(ay,2))/ sqrt(pow(ax,2)+pow(ay,2)+1.);  //      al[1]=ay*23.5+by; //  "  
336          al[3]=0.;  //      al[2]= sqrt(pow(ax,2)+pow(ay,2))/ sqrt(pow(ax,2)+pow(ay,2)+1.);
337          if( (ax!=0.)||(ay!=0.) ) {  //      al[3]=0.;
338              al[3]= asin(ay/ sqrt(pow(ax,2)+pow(ay,2)));  //      if( (ax!=0.)||(ay!=0.) ) {
339              if(ax<0.) al[3]=acos(-1.)-al[3];  //          al[3]= asin(ay/ sqrt(pow(ax,2)+pow(ay,2)));
340          }  //          if(ax<0.) al[3]=acos(-1.)-al[3];
341          al[4]=0.;  //      }
342      }  //      al[4]=0.;
343    //     }
344  // end guess  // end guess
345    
346        for(int i=0; i<5; i++) track_.al[i]=al[i];
347        track_.zini = 23.5;
348    // ZINI = 23.5 !!! it should be the same parameter in all codes
349    
350        if(al[0]==-9999.&&al[1]==-9999.&&al[2]==-9999.&&al[3]==-9999.&&al[4]==-9999.)guess_();
351    
352        // --------------------- free momentum
353      if(pfixed==0.) {      if(pfixed==0.) {
354          al[4]=0.;         // free momentum  //      al[4]=0.;         // free momentum
355          track_.pfixed=0.; //         "          track_.pfixed=0.; //         "
356      }      }
357        // --------------------- fixed momentum
358      if(pfixed!=0.) {      if(pfixed!=0.) {
359          al[4]=1./pfixed;      // to fix the momentum          al[4]=1./pfixed;      // to fix the momentum
360          track_.pfixed=pfixed; //         "          track_.pfixed=pfixed; //         "
361      }      }
362      track_.zini = 23.5; // ZINI = 23.5 !!! it should be the same parameter in all codes  
363      for(int i=0; i<5; i++) track_.al[i]=al[i];  //  store temporarily the initial guess
364        for(int i=0; i<5; i++) al_ini[i]=track_.al[i];
365    
366    
367      int istep=0;      int istep=0;
368      int ifail=0;      int ifail=0;
369      mini2_(&istep,&ifail, &iprint);      mini2_(&istep,&ifail, &iprint);
# Line 314  void TrkTrack::Fit(double pfixed, int& f Line 372  void TrkTrack::Fit(double pfixed, int& f
372          fail = 1;          fail = 1;
373  //      return;  //      return;
374      }      }
375        
376    
377  //    cout << endl << "eta ===> " << track_.al[4] << endl;  //    cout << endl << "eta ===> " << track_.al[4] << endl;
378    
# Line 328  void TrkTrack::Fit(double pfixed, int& f Line 387  void TrkTrack::Fit(double pfixed, int& f
387      for(int i=0; i<5; i++) {      for(int i=0; i<5; i++) {
388          for(int j=0; j<5; j++) coval[i][j]=track_.cov[i][j];          for(int j=0; j<5; j++) coval[i][j]=track_.cov[i][j];
389      }      }
390    
391        if(fail){
392            cout << " >>>> fit failed >>>> drawing initial par"<<endl;
393            for(int i=0; i<5; i++) al[i]=al_ini[i];
394        }
395    
396  };  };
397  /*  /*
398   * Reset the parameters fit   * Reset the fit parameters
399   */   */
400  void TrkTrack::FitReset(){  void TrkTrack::FitReset(){
401      for(int i=0; i<5; i++) al[i]=-9999.;      for(int i=0; i<5; i++) al[i]=-9999.;
# Line 914  TrkTrack *TrkLevel2::GetTrackImage(int i Line 979  TrkTrack *TrkLevel2::GetTrackImage(int i
979   * Loads the magnetic field.   * Loads the magnetic field.
980   * @param s Path of the magnetic-field files.   * @param s Path of the magnetic-field files.
981   */   */
982  void TrkLevel2::LoadField(TString s){  void TrkLevel2::LoadField(TString path){
983      readb_(s.Data());  //
984        strcpy(path_.path,path.Data());
985        path_.pathlen = path.Length();
986        path_.error   = 0;
987        readb_();
988    //
989  };  };
990  //--------------------------------------  //--------------------------------------
991  //  //

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.17

  ViewVC Help
Powered by ViewVC 1.1.23