Print

Print


Commit in lcsim/src/org/lcsim/util/step on MAIN
TrackStepper.java+220-1221.10 -> 1.11
C. Milstene-06-16-2006To Include curling back low momenta tracks as well as infinite detaT- not fully debugged

lcsim/src/org/lcsim/util/step
TrackStepper.java 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- TrackStepper.java	27 Dec 2005 23:04:12 -0000	1.10
+++ TrackStepper.java	16 Jun 2006 20:45:36 -0000	1.11
@@ -17,7 +17,9 @@
  * Particle assumed is a Muon, but can be changed by setting rp[6] at input
  * Units are Tesla, cm, GeV/c
  * @author C. Milstene.
- * @version $Id: TrackStepper.java,v 1.10 2005/12/27 23:04:12 caroline Exp $
+ * @version $Id: TrackStepper.java,v 1.11 2006/06/16 20:45:36 caroline Exp $
+ *NEXT To BE DONE: get subdet/layer info diretly
+ *get materiel info from a util/step/stepperCondition.class
  */
 public class TrackStepper
 {
@@ -26,10 +28,12 @@
     private static AIDA aida = AIDA.defaultInstance();
     private static CalHitMapMgr evtptr = null;
     // constants
-    private static final double clight = 2.99792458e08; // m/s
+    //private static final double clight = 2.99792458e08; // m/s
+    private static final double clight = 3.0e08; // m/s
     private static final double halfpi = 0.5 * Math.PI;
     private static final double m_default = 0.105658369;  // mu mass in GeV
     private static final double BField_default=5.0; // in Tesla
+    private static double dT0=1.0E-13;
     //   Instance field
     private TrkParams tpar   = new TrkParams(0.,0.,0.,0.,0.);
     private TrkPhaseSpace trakPs = new TrkPhaseSpace();
@@ -42,8 +46,6 @@
     private double [] vxyz     = new double[3]; // velocity in mm/s
     private double dTof;
     private double dL ;
-
-    double []xy                = new double[3];
     private double []dpF       = new double[3];
     private double []dpM       = new double[3];
     private double []vstep     = new double[3];
@@ -57,17 +59,26 @@
     private int numSteps_i;
     protected double BField_i  =-10.  ;
     private double materDeDx_i        ;
+    private boolean curlBack   = false;
 
-    //    private Detector detNow              ;
+    //    private Detector detNow         ;
     // Multiple Local use
-    private double tmpxyz                ;
-    private double tmpp                  ;
-    private double mass_i                ;
-    private double particleR;
-    private double particlePt;
-    private double particlePabs;
-
-    /** Default Constructor */
+    private double mass_i                 ;
+    private double pFactor            ;
+    private double a_r                ;
+    private double a_zmax             ;
+    private double dThick             ;
+    private double rv                 ;
+    private int curlBackFlag = 0          ;
+    private double tmpxyz                 ;
+    private double tmpp                   ;
+    private double particleR              ;
+    private double particlePt             ;
+    private double particlePabs           ;
+    private double sumdL                  ;
+    private double sumdpFM                ;
+    
+  /** Default Constructor */
     public TrackStepper()
     {
 	evtptr = CalHitMapMgr.getInstance();
@@ -81,102 +92,156 @@
      * calculated to reach the r boundary is exhausted.  Allow a
      * Delta_r = 0.001mm for round_off differences in r.
      *
-     * @param r 
+     * @param r
      * the radial boundary to aim for- generally r next layer
-     * @param zmax 
+     * @param zmax
      * the z boundary of the detector
-     * @param stpcd 
+     * @param stpcd
      * an array ={xNumberOfSteps, BField, Mean_dE/dx_this layer}
      */
     public void tkSteps(double r,double zmax,double[]stpcd)
     {
+
 	if(debug) System.out.println("Stepper.tkSteps() called: rstep: r="+r+", zmax="+zmax);
-// 	for(int i=0; i<6; ++i) {
-// 	    System.out.print("["+i+"] = )");
-// 	}
          // put all values used in comparison to calculations in cm
 	 // put all values returned in mm
         // put values of x,y,z,px,py,pz,q,amass in rp
         // Check if at boundary at entry, if so return with old values
-
-	rpn=trakPs.getRp();       // get phaseSpace at entry
-
-        double a_r = r;
-	double d=Math.abs(Math.sqrt(rpn[0]*rpn[0]+rpn[1]*rpn[1])-a_r) ;
-	double a_zmax=zmax;
-	numSteps_i =(int) stpcd[0]; BField_i  = stpcd[1];
-	double steplen = d/numSteps_i  ;
-        mass_i = (rpn[6] ==-1.)?m_default:rpn[6];
-        atZmax = (Math.abs(rpn[2])>(a_zmax+(steplen/40)) )? 1 :0;
-        atR    = (Math.sqrt(rpn[0]*rpn[0]+rpn[1]*rpn[1])>(a_r+(steplen/20)))?1:0;  // add 0.001 in mm now-Sept05
-        if(atZmax==1 || stopTkElow) return;
-
+     double[]vv=new double[3];
+     double rv; double drLength;
+     rpn=trakPs.getRp();       // get phaseSpace at entry
+     setVelocity(rpn)  ;       // particle velocity
+     double pabsEntry =partPabs(rpn) ;
+     a_r = r;
+     a_zmax=zmax;
+     dThick = stpcd[0]; BField_i  = stpcd[1];
+
+      sumdL =0.            ;
+      sumdpFM=0.           ;
+      mass_i = (rpn[6] ==-1.)?m_default:rpn[6];
+      pFactor=(partPabs(rpn)>=1.)?1.:(5*partPabs(rpn));
+       drLength =(dThick>=1200.)?6.:((dThick/10)*pFactor);
+       materDeDx_i=(stpcd[2]/stpcd[0])  ; //mean per mmm multiplied by dL-in dPFromMatter
+       numSteps_i =(dThick>=1200.)?210:(int)(dThick/drLength);
+       System.out.println("dThick="+dThick+" rpn-012="+rpn[0]+" "+rpn[1]+" "+rpn[2]);
+       System.out.print("drLength="+drLength+"numSteps_i="+numSteps_i);
+       System.out.println("materDeDx_i"+materDeDx_i);
+       setDTOF(rpn,drLength);
+       vv=getVelocity();
+       rv=((rpn[0]*vv[0]+rpn[1]*vv[1]))/(partR(rpn)*Math.sqrt(vv[0]*vv[0]+vv[1]*vv[1]));
+       double vv1=Math.sqrt(vv[0]*vv[0]+vv[1]*vv[1]);
+         aida.cloud1D("Evolution vradial ").fill(vv1);
+      atZmax = (Math.abs(rpn[2])>(a_zmax+(drLength/10)) )? 1 :0;
+      atR    = ((Math.sqrt(rpn[0]*rpn[0]+rpn[1]*rpn[1])-(a_r))<(drLength))?1:0;  // add 0.001 in mm now-Sept05
+      if(atZmax==1 || stopTkElow) return;
         // access values of dE/dx & number of steps from stpcd
-        
-        
-	// Check if distance cm or distance mm !!!!
-        materDeDx_i= stpcd[2]/d ;
-
+	    // Check if distance cm or distance mm !!!!
         // Call stepBy to do the stepping && update array[] rp
-        
-	if(debug) System.out.println("Before "+numSteps_i+" steps particle Radius="+partR()+" Pabs="+ partPabs());                    ;
-
-        for( int i=0; i<numSteps_i; i++)
-        {
-            rpn = stepBy(steplen,materDeDx_i)     ; // rpn  each step
-	   // System.out.println("Stpr:rpn[0..2]=( "+rpn[0]+", "+rpn[1]+", "+rpn[2]+" )");
-           // System.out.println("stpr:rpn[3..5]=( "+rpn[3]+", "+rpn[4]+", "+rpn[5]+" )");
-
-            // Check boundaries after each step
-            atZmax = (Math.abs(rpn[2])>(a_zmax+(steplen/40)))? 1 :0; //each step
-	    double aux = Math.sqrt(rpn[0]*rpn[0]+rpn[1]*rpn[1]);
-            atR    = ( Math.abs(aux-a_r) < steplen/20) ? 1 : 0; //each step
-            if(atZmax ==1 || stopTkElow )
-            {
-	      if(debug) {
-                if(atZmax==1)System.out.println(" break For z>zMax of the Detector ");
-                if(stopTkElow)System.out.println("The Track is left with too little energy to continue");
-	      }
-	      break;
-            }
-        }
-	if(debug) System.out.println(" After "+numSteps_i+" steps, particle Radius="+partR()+" Pabs="+partPabs());
+        System.out.println("Before "+numSteps_i+" steps:Px   Py   x   y    Radius (r.v)" );
+        System.out.println(rpn[3]+" "+rpn[4]+" "+rpn[0]+" "+rpn[1]+" "+partR(rpn)+" "+rv);
+        if(partR(rpn)<2.)dT0=getDTOF();
+        System.out.println("Before bigloop DTOF="+getDTOF());
+        int nLoop=0;
+        atR=0;
+        System.out.print("Loop Entry:atZmax=" +atZmax+" stopTkElow="+stopTkElow);
+        System.out.println(" curlBack="+curlBack+" atR="+atR);
+        System.out.println("          RLIMIT="+a_r);
+
+        bigLoop:while(((atZmax!=1)&&!stopTkElow)&&((nLoop<=10)||((a_r>1000)&&(nLoop<=1270)))){
+          nLoop++;
+          if(nLoop==1)System.out.println("HERE: numSteps_i"+numSteps_i+"drLength="+drLength+"R="+partR(rpn));
+          if(partR(rpn)==0)break;
+          System.out.println(" ENTRY OF BIGLOOP nLoop="+nLoop+" drLength="+drLength+" dt="+getDTOF()+" dTof="+dTof);
+          if(nLoop==1)System.out.println("    ENTRY OF FOR LOOP  numsteps_i="+numSteps_i);
+              rpn = stepBy(drLength,materDeDx_i)     ; // rpn  each step
+              pFactor=(partPabs(rpn)>=1.)?1.:(5*partPabs(rpn));
+              setVelocity(rpn); vv=getVelocity();
+              rv = (rpn[0]*vv[0]+rpn[1]*vv[1])/(partR(rpn)*Math.sqrt(vv[0]*vv[0]+vv[1]*vv[1]));
+              setDTOF(rpn,drLength);
+              aida.cloud2D("behavior of rv in loop").fill(getDTOF(),rv);
+              pFactor=(partPabs(rpn)>=1.)?1.:(5*partPabs(rpn));
+              setCurlBack(rv<=0.35);
+              if((rv<0.35) && (Math.abs(rv)>0.35)&&(curlBackFlag==1)){
+				  curlBackFlag=2; break;
+		      }
+               if(( (curlBackFlag==0) && (rv<=0.35) )||(getDTOF()>1.5*dT0))
+               {
+	               if(rv<=0.35)curlBackFlag=1      ;
+		           drLength =(dThick>1200.)?6.:((dThick/100)*pFactor);
+		           numSteps_i =(dThick>1200.)?210:(int)(dThick/drLength);
+	           }
+              // Check boundaries after each step
+	          atZmax = (Math.abs(rpn[2])>(a_zmax+(drLength/10)))? 1 :0; //each step
+              atR    = ( Math.abs(partR(rpn)-a_r) < drLength) ? 1 : 0; //each step
+              if((atZmax==1)||stopTkElow||(atR==1)) break;
+	         }
+             if(atZmax ==1 || stopTkElow ||curlBack)
+             {
+		if((atZmax==1)||stopTkElow){
+                  if(atZmax==1)System.out.println(" break For z>zMax of the Detector ");
+                  if(stopTkElow)System.out.println("The Track is left with too little energy to continue");
+	        }else if(curlBack){
+		System.out.println(" The track curls back go to a smaller radius");
+		   }
+              }
+         double pabsExit = partPabs(rpn);
+         double dpFromDedxLay =sumdpFM;
+//         {
+         //System.out.print("meanDeDx="+stpcd[2]+" dpFromDedxLay="+dpFromDedxLay+" sumdL="+sumdL);
+         //System.out.println(" pEntry"+pabsEntry+" pExit="+pabsExit+" pExit-PEntry="+(pabsExit-pabsEntry));
+//         }
+        System.out.println("After "+numSteps_i+"Px Py x y En Radius r.v DTOF" );
+         rv=((rpn[0]*vv[0]+rpn[1]*vv[1]))/(partR(rpn)*Math.sqrt(vv[0]*vv[0]+vv[1]*vv[1]));
+        aida.cloud1D("Evolution of scalar productrv ").fill(rv);
+        setDTOF(rpn,drLength);
+        System.out.print(rpn[3]+" "+rpn[4]+" "+rpn[0]+" "+rpn[1]+" "+partR(rpn)+" "+rv);
+        System.out.println(getDTOF());
     }
     /**
      * make a step along this track
      * @return position after step
      * rp[0-5]={x,y,z,px,py,pz}after step&trp[6-7]={mass,q}
      */
-    public double [] stepBy(double dc,double matDeDx)
+
+    private double [] stepBy(double dc,double matDeDx)
     {
 	//System.out.println("stepBy: rpn[0..2]=( "+rpn[0]+", "+rpn[1]+", "+rpn[2]+" )");
-        setVelocity();
+        setVelocity(rpn);
         tmpxyz=0.;  tmpp=0.;
-        setDTOF(dc);
-        setPathLength(dc);
-        dTof             = getDTOF();
+        if(!curlBack){
+            setDTOF(rpn,dc);
+            dTof=getDTOF();
+            if(dTof>1.5*dT0)dTof=dT0;
+        } else{
+            dTof=dT0;
+        }
+        setPathLength(rpn,dc);
+        // dTof             = getDTOF();
         dL               = getPathLength();
         dpF     	 = dpFromField(dc);
         dpM              = dpFromMatter(dc,matDeDx);
-
+        sumdL            =  sumdL+dL;   // Jan30-06
 	//System.out.println("   !!!=> px,dpF0,dpM0="+rpn[3]+" "+dpF[0]+" "+dpM[0]);
 	//System.out.println("!!!=> py,dpF1,dpM1="+rpn[4]+" "+dpF[1]+" "+dpM[1]);
         vstep            = getVelocity();
+        double vt        = Math.sqrt(vstep[0]*vstep[0]+vstep[1]*vstep[1]);
         double dpFromMat2 = dpM[0]*dpM[0]+dpM[1]*dpM[1]+dpM[2]*dpM[2];
         double pAvalaible2= rpn[3]*rpn[3]+rpn[4]*rpn[4]+rpn[5]*rpn[5];
-        stopTkElow = (pAvalaible2 < dpFromMat2);
-	if(!stopTkElow) {
-	    for(int i=0;i<3;i++)
-	    {
-		tmpxyz   = rpn[i]  ; tmpp    = rpn[i+3];
-		rpn[i]    = tmpxyz + vstep[i]*dTof;
-                rpn[i+3]  = tmpp   + dpF[i] ;//- dpM[i];
-	    }
-	}
+        setStopTkELow(pAvalaible2 < dpFromMat2);
+         if(!stopTkElow) {
+             for(int i=0;i<3;i++)
+             {
+	  tmpxyz   = rpn[i]  ; tmpp    = rpn[i+3];
+	  rpn[i]    = tmpxyz + vstep[i]*dTof;
+          rpn[i+3]  = tmpp   + dpF[i] -dpM[i];
+          }
+              sumdpFM  =  sumdpFM +Math.sqrt(dpFromMat2);
+                }
 	//System.out.println("stepBy end: rpn[0..2]=( "+rpn[0]+", "+rpn[1]+", "+rpn[2]+" )");
 // 	String evtnum = Integer.toString( evtptr.getEvent().getEventNumber() );
 // 	System.out.println("filling cloud2D, rpn: "+rpn[0]+" "+rpn[1]);
-// 	aida.cloud2D("y vs x, evt "+evtnum).fill(rpn[0],rpn[1]);
+	aida.cloud2D("y vs x, evt ").fill(rpn[0],rpn[1]);
+        aida.cloud2D("py vs px,evt").fill(rpn[3],rpn[4]);
 // 	Histogram.find("py vs px").fill(rpn[3],rpn[4]);
         return trakPs.upDateRp(rpn);
     }
@@ -189,48 +254,44 @@
 
     private double[] dpFromField(double dc)
     {
+		double [] dpField  = new double[3];
         double alpha; double delta; double adjust; double mainTerm;
         double pabs2   = rpn[3]*rpn[3]+rpn[4]*rpn[4]+rpn[5]*rpn[5];
         mass_i = rpn[6];
         double a_En    = Math.sqrt(pabs2 + mass_i*mass_i);
         double a_q     = rpn[7];
 
-        //dpField[0]=a_q*(clight*1e-9)*(rpn[4]/a_En) * clight*(-BField_i)*dTof;
-        //dpField[1]=-a_q*(clight*1e-9)*(rpn[3]/a_En)* clight*(-BField_i)*dTof;
+       // dpField[0]=a_q*(clight*1e-9)*(rpn[4]/a_En) * clight*(BField_i)*dTof;
+       // dpField[1]=-a_q*(clight*1e-9)*(rpn[3]/a_En)* clight*(BField_i)*dTof;
 
 // 	assert BField_i > 4.0 : "BField too small!";
 
-	alpha = a_q*(clight*1e-9)*(1./a_En)*(clight*dTof);
-	delta =1.+0.25*alpha*alpha*BField_i*BField_i; mainTerm=alpha/delta;
-	adjust = 0.5*(1./delta)*alpha*alpha*BField_i*BField_i;
-	//	dpField[0]=mainTerm*rpn[4]*(-BField_i)  - adjust*rpn[3];
-	//	dpField[1]=-mainTerm*rpn[3]*(-BField_i) - adjust*rpn[4];
-       	dpField[0]=mainTerm*rpn[4]*(BField_i)  - adjust*rpn[3];
-       	dpField[1]=-mainTerm*rpn[3]*(BField_i) - adjust*rpn[4];
-
-        dpField[2]=0.;
+	 alpha = a_q*0.3*(1./a_En)*(clight*dTof);
+	 delta =1.+0.25*alpha*alpha*BField_i*BField_i; mainTerm=alpha/delta;
+	 adjust = 0.5*(1./delta)*alpha*alpha*BField_i*BField_i;
+       	 dpField[0]=mainTerm*rpn[4]*(BField_i)  - adjust*rpn[3];
+       	 dpField[1]=-mainTerm*rpn[3]*(BField_i) - adjust*rpn[4];
+         dpField[2]=0.;
         return dpField;
     }
     /** Return dpx,dpy,dpz after pathLength  in Material this step
      *@param dc steplength
-     *@param meanDeDx this layer, namely sum(dedx)*dx, on all the materiels 
+     *@param meanDeDx this layer, namely sum(dedx)*dx, on all the materiels
      */
     private double[] dpFromMatter(double dc,double materMeanDeDx)
     {
-
+		double [] dpFordL  = new double[3];
         double pabs2= rpn[3]*rpn[3]+rpn[4]*rpn[4]+rpn[5]*rpn[5];
         materDeDx_i        = materMeanDeDx;
         double tempdpoverdl;
         double mass_i        = rpn[6];
         double a_En           = Math.sqrt(pabs2 + mass_i*mass_i);
-
         for (int i  =0; i<3;i++)
         {
             // Change in Momentum due to material
             tempdpoverdl = (materDeDx_i*a_En*(rpn[i+3]/pabs2));
             dpFordL[i]   = tempdpoverdl*dL;
         }
-
         return (dpFordL);
     }
 
@@ -238,7 +299,7 @@
      * Return vector rp(x,y,z,px,py,pz,mass_i=MuonMass,charge,BField)
      * from the information at the Interaction Point given by TrkParams.
      *
-     * @param tkprm 
+     * @param tkprm
      *TrkParams at Interaction Point (IP)
      */
     public double[] rpFromTrkParams(TrkParams tkprm)
@@ -255,7 +316,7 @@
     /**
      * Return vector rp(x,y,z,px,py,pz,mass_i=inMass,charge,BField)
      * from the information at the Interaction Point given by TrkParams.
-     * @param tkprm 
+     * @param tkprm
      * TrkParams at Interaction Point(IP
      * @param inMass
      */
@@ -270,18 +331,19 @@
         return  trakPs.getRp();
     }
 
-    /** set velocity vx,vy,vz  of the particle this step
+    /** set velocity vx,vy,vz  of the particle this step-mm/sec
      */
-    public void setVelocity()
+    public void setVelocity(double []vectRp)
     {
         double tempV ;
+        for(int i=0;i<8;i++){rpn[i]=vectRp[i];}
         //rpn = trakPs.getRp();
         mass_i=(rpn[6]==-1.)?m_default:rpn[6] ; // Default Muon mass
         double En    = 	Math.sqrt(rpn[3]*rpn[3]+rpn[4]*rpn[4]+rpn[5]*rpn[5]+mass_i*mass_i);
         for(int i=0;i<3;i++)
         {
             tempV = (rpn[i+3]/En)*clight*1000. ;
-            vxyz[i]=tempV           ;
+            vxyz[i]=tempV ;
         }
     }
     /**
@@ -293,16 +355,20 @@
     }
     /**
      * Set dTimeOfFlight for the step dc
-     * @param dc 
+     * @param dc
      * @param step
      */
-    public void setDTOF(double dc)
+    public void setDTOF(double [] vectRp,double dc)
     {
 
         double a=0.;double b=0.; double c=0.;
         double a_dc = dc ;
-	xy[0]=rpn[0]; xy[1]=rpn[1];xy[2]=rpn[2];
+        double [] xy=new double[3]  ;
+        for(int i=0;i<8;i++){rpn[i]=vectRp[i];}
+	    xy[0]=rpn[0]; xy[1]=rpn[1];xy[2]=rpn[2];
+        setVelocity(rpn);
         vstep=getVelocity();
+       // System.out.println("DTOF:velocity="+vstep[0]+" "+vstep[1]+" "+vstep[2]);
         for(int i=0;i<2;i++)
         {
             a     += vstep[i]*vstep[i]  ;
@@ -310,7 +376,13 @@
             c     += xy[i]*xy[i];
         }
         c      = Math.sqrt(c)*2*a_dc + a_dc*a_dc  ;
+        if((b*b+a*c)<=0 || a==0){ // put a default value
+		  dTof=dT0;
+	}else{
+        double fornow=Math.sqrt(b*b+a*c);
         dTof = (-b + Math.sqrt(b*b+a*c))/a;
+        aida.cloud2D(" -b vs discri").fill(-b,fornow);
+        }
     }
     /** @return TOF this step
      */
@@ -320,14 +392,20 @@
     }
     /**
      * Set path length (x,y,z) after step dc
-     * @param dc 
+     * @param dc
      * steplength
      */
-    public void setPathLength(double dc)
+    public void setPathLength(double [] vectRp,double dc)
     {
+        setVelocity(vectRp);
         vstep           = getVelocity();
-        double vabs = Math.sqrt(vstep[0]*vstep[0]+vstep[1]*vstep[1]);
-        dL   = dTof * vabs;
+        double vabs = vstep[0]*vstep[0]+vstep[1]*vstep[1]+vstep[2]*vstep[2];
+        vabs=Math.sqrt(vabs);
+        //setDTOF(vectRp,dc); -- In order to deal with undefined DTOF
+        //getDTOF();          -- use default
+        dL   = dTof* vabs;
+        if(curlBack)System.out.println("     PL   : vabs="+vabs+" dTof="+dTof+" dL="+dL);
+       // System.out.println("SPL: vabs="+vabs+" dL="+dL);
     }
 
     /** @return change in pathLength this step
@@ -351,15 +429,15 @@
     }
        /** Dec-25-05-
     * Set New Phase Space point setNewRp
-    * @param []rp 
-    * containing x,y,z,px,py,pz,q,m 
+    * @param []rp
+    * containing x,y,z,px,py,pz,q,m
     */
     public void setNewRp(double[] rpv)
     {
        for(int i=0; i<6;i++)
        {
           rpn[i]=rpv[i];
-       } 
+       }
        rpn[7]=(rpv[7]<0)? m_default:rpv[7];
        trakPs.upDateRp(rpn);
     }
@@ -370,31 +448,32 @@
 
         return rpn= trakPs.getRp();
     }
-    /** 
-    * @return Radius 
+    /**
+    * @return Radius
     * at which the particle is
     */
-     public double partR()
+     public double partR(double []vectRp)
      {
+       for(int i=0;i<2;i++){rpn[i]=vectRp[i];}
        particleR= rpn[0]*rpn[0]+rpn[1]*rpn[1];
        if(particleR!=0.)particleR = Math.sqrt(particleR);
        return particleR;
      }
      /** @return  The Pt of the particle
      */
-     public double partPt()
+     public double partPt(double [] vectRp)
      {
-
+        for(int i=3;i<5;i++){rpn[i]=vectRp[i];}
 	particlePt= rpn[3]*rpn[3]+rpn[4]*rpn[4];
 	if(particlePt!=0.) particlePt=Math.sqrt(particlePt);
 	return particlePt;
      }
      /** @return the absolute momentum pabs
      */
-     public double partPabs()
+     public double partPabs(double[]vectRp)
      {
-
-	particlePabs= rpn[3]*rpn[3]+rpn[4]*rpn[4]+rpn[5]*rpn[5];
+        for(int i=3;i<5;i++){rpn[i]=vectRp[i];}
+	 particlePabs= rpn[3]*rpn[3]+rpn[4]*rpn[4]+rpn[5]*rpn[5];
 	if(particlePabs!=0.) particlePabs= Math.sqrt(particlePabs);
 	return particlePabs;
      }
@@ -405,6 +484,7 @@
     {
         resetStopTkELow();
         resetAtZmax()    ;
+        resetCurlBack()  ;
 
         int stepFlags = 0;
     }
@@ -422,6 +502,20 @@
         }
         return  stepFlags;
     }
+
+    /** Set Boolean Indicator If Energy Left
+     */
+    public void setCurlBack(boolean b)
+    { curlBack=b;}
+    /** Reset Boolean Indicator Energy Left for the step
+     */
+    public void resetCurlBack()
+    {setCurlBack(false);}
+    /** Return Boolean Indicator Energy Left for the step
+     */
+    public boolean getCurlBack()
+    {return curlBack;}
+
     /** Set Boolean Indicator If Energy Left
      */
     public void setStopTkELow(boolean b)
@@ -466,26 +560,30 @@
     {
         clearTrackStepper();
     }
+
     /** Reset- put all the 8 vector elements to 0.
      */
     public void clearTrackStepper()
     {
         trakPs.clear();
-	BField_i = -10.;
-        setDTOF(0.);
-        setPathLength(0.);
-        dpFromField(0.);
-        dpFromMatter(0.,0.);
-        resetStepFlags();
+	    BField_i = -10.;
+        curlBackFlag=0;
         for(int i=0;i<3;i++)
         {
             r_ints[i]=0.;p_ints[i]=0.;
             rpn[i]=0.  ;rpn[i+3]=0.;
             dpF[i]=0.  ; dpM[i]=0. ;
+            dpField[i]=0.; dpFordL[i]=0.;
             vxyz[i]=0. ;vstep[i]=0.;
-            xy[i]=0.;
         }
-	rpn[6]=m_default; rpn[7]=0.;
+	    rpn[6]=m_default; rpn[7]=0.;
+	    setVelocity(rpn);
+	    setDTOF(rpn,0.);
+	    setPathLength(rpn,0.);
+	    dpFromField(0.);
+	    dpFromMatter(0.,0.);
+	    resetStepFlags();
+
     }
 
 }
CVSspam 0.2.8