lcsim/sandbox/RobKutschke/TRFTests/v1
diff -u -r1.3 -r1.4
--- FitTest_sid00Driver.java 13 Sep 2007 22:36:02 -0000 1.3
+++ FitTest_sid00Driver.java 18 Sep 2007 16:50:17 -0000 1.4
@@ -21,17 +21,22 @@
import org.lcsim.recon.tracking.trfcyl.SurfCylinder;
import org.lcsim.recon.tracking.trfzp.SurfZPlane;
+import org.lcsim.recon.tracking.trfcyl.ThinCylMs;
+import org.lcsim.recon.tracking.trfcyl.ThinCylMsSim;
+
import org.lcsim.recon.tracking.trffit.HTrack;
+import hep.physics.vec.Hep3Vector;
+
/**
* Driver for exercises learning how to use the TRF code.
* This version exercises the fitter with only measurement errors,
* no multiple scattering or energy loss.
*
*@author $Author: kutschke $
- *@version $Id: FitTest_sid00Driver.java,v 1.3 2007/09/13 22:36:02 kutschke Exp $
+ *@version $Id: FitTest_sid00Driver.java,v 1.4 2007/09/18 16:50:17 kutschke Exp $
*
- * Date $Date: 2007/09/13 22:36:02 $
+ * Date $Date: 2007/09/18 16:50:17 $
*
*/
@@ -49,15 +54,24 @@
RKTrackGenParams param = null;
RKTrackGen gen = null;
- private TrackError vstartc_in = new TrackError();
- private TrackError vstartz_in = new TrackError();
- private TrackError vstart_out = new TrackError();
+ private TrackError vstartc_in = new TrackError();
+ private TrackError vstartz_in = new TrackError();
+ private TrackError vstart_out = new TrackError();
private RKTrackFitDiag DiagForward = null;
private RKTrackFitDiag DiagBackward = null;
private RKCovSmear covsmear = null;
+ private ThinCylMsSim scatSim0 = null;
+ private ThinCylMsSim scatSim1 = null;
+ private ThinCylMsSim scatSim2 = null;
+ private double scatThick0 = 0.006136;
+ private double scatThick1 = 0.000916;
+ private double scatThick2 = 0.013747;
+
+ private boolean doms = true;
+
public FitTest_sid00Driver(){
}
@@ -69,18 +83,28 @@
// Limits for track generation parameters.
param = new RKTrackGenParams();
param.setbz(rkgeom.getBz());
- param.setptmin( 0.5);
+ param.setptmin( 1.0 );
+ //param.setptmin( 20.0);
+ //param.setptmax( 20.0);
//param.setczmin( 0.93);
//param.setczmax( 0.993);
- param.setczmin( -0.993);
- param.setczmax( 0.993);
+ //param.setczmin( -0.993);
+ //param.setczmax( 0.993);
+ //param.setczmin( 0.);
+ //param.setczmax( 0.);
//param.setczmax( -0.93);
//param.setczmin( -0.97);
//param.setczmax( -0.93);
- //param.setczmin( -0.4);
- //param.setczmax( 0.4);
+ param.setczmin( -0.6);
+ param.setczmax( 0.6);
//param.setczmin( -0.995);
//param.setczmax( 0.995);
+
+ //param.setd0min( 0.0);
+ //param.setd0max( 0.0);
+ //param.setz0min( 0.0);
+ //param.setz0max( 0.0);
+
System.out.println (param);
// Seed for track random number generator
@@ -118,6 +142,32 @@
vstart_out.set(3,3,sig);
vstart_out.set(4,4,sig);
+ RKDebug.Instance().setDoMs(doms);
+ RKDebug.Instance().setMsFac(1.0);
+
+ scatSim0 = new ThinCylMsSim(scatThick0*RKDebug.Instance().getMsFac());
+ scatSim1 = new ThinCylMsSim(scatThick1*RKDebug.Instance().getMsFac());
+ scatSim2 = new ThinCylMsSim(scatThick2*RKDebug.Instance().getMsFac());
+
+ // Cylinder track: Pt= 1 GeV, phat=(1,0.,0.) as it goes through some cylinder.
+ SurfCylinder stmp = new SurfCylinder(1.0);
+ TrackVector vtmp = new TrackVector();
+ vtmp.set(0,0.0);
+ vtmp.set(1,0.0);
+ vtmp.set(2,0.0);
+ vtmp.set(3,0.0);
+ vtmp.set(3,1.0);
+ VTrack ttmp = new VTrack( stmp, vtmp );
+
+ // Desynchronize the random number generators.
+ // Want moderate size prime numbers to avoid any of the
+ // periodicities that might occur in the detector.
+ for ( int i=0; i<101; ++i ){
+ scatSim0.interact(ttmp);
+ }
+ for ( int i=0; i<211; ++i ){
+ scatSim2.interact(ttmp);
+ }
}
@@ -156,7 +206,8 @@
RKHitList hlist = GenerateMixedOneArcHits( rktrk );
// Diagnostics for the generated hits.
- CheckHitList( hlist, rktrk );
+ // Only useful when there is not scattering or eloss.
+ //CheckHitList( hlist, rktrk );
// Check for sufficient hits.
if ( ! hlist.fitable() ){
@@ -173,6 +224,7 @@
VTrack vtdca = trftrk.atDcaZaxis();
TrackError vstart = vstart_out;
+
RKDebug.Instance().setStartType(0);
// Prep for the outward fit.
@@ -206,6 +258,7 @@
DiagForward.fill( fstatf, ht, vtend, hlist.nDof(), vstart, rktrk);
// Check code for smearing tracks with covariance matrix.
+ /*
TrackError te = ht.newTrack().error();
TrackVector vv = covsmear.Smear( ht.newTrack().error(), ht.newTrack().vector() );
for ( int i=0; i<5; ++i ){
@@ -214,6 +267,7 @@
double pull = (vv.get(i)-ht.newTrack().vector(i))/sig;
aida.histogram1D("Smear Check",100, -5., 5.).fill(pull);
}
+ */
// Prep for the inward fit.
if ( vtend.surface().pureType().equals(SurfCylinder.staticType()) ){
@@ -380,6 +434,7 @@
toTRF trftrk = new toTRF(rktrk);
VTrack vtdca = trftrk.atDcaZaxis();
+
// This code only looks at the first arc of a track.
double pathlimit = trftrk.halfarc();
@@ -438,7 +493,6 @@
rks_cyl = cyls.get(next_cyl);
ps_cyl = prop.vecDirProp( vt_cyl, rks_cyl.getCylinder(), PropDir.FORWARD);
-
// If we do not get to this cylinder, try the next one.
// This can happen if starting point is outside this one but inside a later one.
if ( !ps_cyl.success() ) {
@@ -567,7 +621,7 @@
if ( sum > pathlimit ) break;
// Track parameters at this step.
- vtdca = vt_cyl;
+ vtdca = new VTrack(vt_cyl);
// Add the hit.
rkl.addHit( new RKHit( rktrk, rks_cyl, vtdca, ps_cyl, sum ) );
@@ -580,6 +634,84 @@
nmeas += rks_cyl.rodim;
ncmeas += rks_cyl.rodim;
+ if ( r_cyl > 1.3 && doms ){
+
+ aida.histogram1D("Gen scat radius", 300, 0., 150.).fill(r_cyl);
+
+ // Interact.
+ VTrack test = new VTrack(vtdca);
+ //rks_cyl.getCylinder().simInteract(vtdca);
+ if ( r_cyl < 10. ){
+ scatSim1.interact(vtdca);
+ }else{
+ scatSim2.interact(vtdca);
+ }
+
+ /*
+ // Diagnostics.
+ for ( int i=0;i<5; ++i){
+ double d = test.vector(i) - vtdca.vector(i);
+ aida.cloud1D("Thin MS for param " +i ).fill(d);
+ }
+ VTUtil vnew = new VTUtil(vtdca);
+ VTUtil vold = new VTUtil(test);
+
+ double d = vnew.momentum()-vold.momentum();
+ aida.cloud1D("Thin MS for p").fill(d);
+
+ Hep3Vector v1 = vnew.asHep3Vector();
+ Hep3Vector v2 = vold.asHep3Vector();
+
+ double dot = v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z();
+ dot = dot/v1.magnitude()/v2.magnitude()-1.;
+ aida.cloud1D("Thin MS for dot").fill(dot);
+ */
+
+ //if ( r_cyl <1.3 ){
+ if ( r_cyl > 10. ){
+ double scatThick = (r_cyl<10.) ? scatThick1 : scatThick2;
+ ThinCylMs scat1 = new ThinCylMs(scatThick);
+ TrackError vtmp = new TrackError();
+ ETrack et = new ETrack( test.surface().newPureSurface(), test.vector(), vtmp);
+ ETrack ets = new ETrack(et);
+ scat1.interact(et);
+
+ /*
+ for ( int i=0;i<5; ++i){
+ if ( et.error(i,i) >0. ){
+ double sig = Math.sqrt(et.error(i,i));
+ double pull = (test.vector(i) - vtdca.vector(i))/sig;
+ if ( rktrk.q() > 0. ){
+ aida.histogram1D("Gen Pull param: q=+1 " + i,200,-10.,10.).fill(pull);
+ }else {
+ aida.histogram1D("Gen Pull param: q=-1 " + i,200,-10.,10.).fill(pull);
+ }
+ if ( i == 4 ){
+ if ( rktrk.q() > 0. ){
+ aida.histogram1D("Gen Pull curve: q=+1 r= " + r_cyl,200,-10.,10.).fill(pull);
+ aida.cloud1D("Gen Sig(4) for q=+1 layer " + r_cyl).fill(sig);
+ }else {
+ aida.histogram1D("Gen Pull curve: q=-1 r= " + r_cyl,200,-10.,10.).fill(pull);
+ aida.cloud1D("Gen Sig(4) for q=-1 layer " + r_cyl).fill(sig);
+ }
+ }
+ }
+
+ }
+ */
+
+ // This occurs for d0=0, z0=0, tanlambada=0 and any phi or curvature.
+ // I am not sure if this is a problem or not but I think it is.
+ if ( et.error(4,4) == 0. && et.error(4,3)==0. ){
+ System.out.println ("Scatter matrix at r: " + r_cyl + "\n" + et.error() );
+ }
+
+ }
+
+
+
+ }
+
} else if ( addzp ) {
// Advance counter to next surface.
@@ -629,9 +761,17 @@
}
+ private String GenDir = null;
// Monitoring histograms for the generated track.
private void plotGenTrk( RKTrack t ){
+ String pwd = aida.tree().pwd();
+ if ( GenDir == null ){
+ GenDir = "GeneratorInfo";
+ aida.tree().mkdir(GenDir);
+ }
+ aida.tree().cd(GenDir);
+
int nbins = 50;
double d0min = -5.;
@@ -648,6 +788,8 @@
aida.histogram1D("p", nbins, 0., 50.).fill(t.p());
aida.cloud2D("PCA0",-1).fill(t.x0(),t.y0());
aida.cloud2D("D0 vs Z0",-1).fill(t.z0(),t.d0());
+
+ aida.tree().cd(pwd);
}
lcsim/sandbox/RobKutschke/TRFTests/v1
diff -u -r1.2 -r1.3
--- FullFitKalman.java 7 Sep 2007 19:00:40 -0000 1.2
+++ FullFitKalman.java 18 Sep 2007 16:50:17 -0000 1.3
@@ -3,6 +3,8 @@
import org.lcsim.recon.tracking.trfbase.PropDir;
import org.lcsim.recon.tracking.trfbase.PropStat;
import org.lcsim.recon.tracking.trfbase.Hit;
+import org.lcsim.recon.tracking.trfbase.ETrack;
+import org.lcsim.recon.tracking.trfbase.TrackError;
import org.lcsim.recon.tracking.trfbase.Surface;
import java.util.*;
@@ -11,6 +13,12 @@
import org.lcsim.recon.tracking.trfdca.SurfDCA;
+import org.lcsim.recon.tracking.trfcyl.SurfCylinder;
+import org.lcsim.recon.tracking.trfcyl.ThinCylMs;
+
+
+import org.lcsim.util.aida.AIDA;
+
/**
*
* Copied from org.lcsim.recon.tracking.trffit.FullFitKalman
@@ -24,14 +32,16 @@
* a single track.
*
*@author $Author: kutschke $
- *@version $Id: FullFitKalman.java,v 1.2 2007/09/07 19:00:40 kutschke Exp $
+ *@version $Id: FullFitKalman.java,v 1.3 2007/09/18 16:50:17 kutschke Exp $
*
- * Date $Date: 2007/09/07 19:00:40 $
+ * Date $Date: 2007/09/18 16:50:17 $
*
*/
public class FullFitKalman extends FullFitter
{
+
+ private AIDA aida = AIDA.defaultInstance();
// static methods
@@ -147,6 +157,7 @@
public int fitForward(HTrack trh)
{
+
PropDir dir = PropDir.FORWARD;
RKDebug.Instance().setPropDir(dir);
@@ -162,6 +173,7 @@
for ( Iterator ihit=hits.iterator(); ihit.hasNext(); )
{
Surface s_save = trh.newTrack().surface().newPureSurface();
+ ETrack e_save = trh.newTrack();
// Extract the next hit pointer.
Hit hit = (Hit)ihit.next();
@@ -172,10 +184,12 @@
System.out.println ("Error: "
+ RKDebug.Instance().getTrack() + " "
+ RKDebug.Instance().getPropDir() + " "
+ + icount
);
System.out.println ("From surface 5: " + s_save );
System.out.println ("To surface 5: " + hit.surface());
- return icount;
+ System.out.println ("Params: " + e_save.vector() );
+ return icount+1;
}
// Add the hit.
@@ -189,7 +203,53 @@
System.out.println ("To surface 4: " + hit.surface());
}
if ( fstat>0 ) return 10000 + 1000*fstat + icount;
-
+
+ // This fails since the interactor is lost in copying.
+ // if ( hit.surface().getInteractor() != null ){
+ //System.out.println ("Have interactor: " + hit.surface() );
+ //}
+
+ if ( hit.surface().pureType().equals(SurfCylinder.staticType()) ){
+
+ SurfCylinder s = (SurfCylinder) hit.surface();
+ double r = s.radius();
+ if ( r > 1.3 && RKDebug.Instance().getDoMs() && r < 100. ){
+ TrackError eold = trh.newTrack().error();
+ //System.out.println( "Error before: " + eold );
+
+ aida.histogram1D("Fit scat radius forward:",300,0.,150.).fill(r);
+
+ double l_over_radl = ( r< 10) ? 0.000916 : 0.013747;
+ ThinCylMs scat = new ThinCylMs(l_over_radl*RKDebug.Instance().getMsFac());
+ ETrack et = trh.newTrack();
+ ETrack ets = new ETrack(et);
+ double chnew = trh.chisquared();
+
+ scat.interact(et);
+ hit.update(et);
+ trh.setFit(et,chnew);
+
+ /*
+ for ( int i=0; i<5; ++i ){
+ double ex1 = et.error().get(i,i);
+ double ex2 = ets.error().get(i,i);
+ double sigsq = ex1-ex2;
+ //double pull = -9.;
+ double sig=-1.;
+ if ( sigsq > 0. ){
+ sig = Math.sqrt(sigsq);
+ //pull = (et.vector(i)-ets.vector(i))/sig;
+ }
+ aida.cloud1D("Forward Fit Delta param:"+i).fill(et.vector(i)-ets.vector(i));
+ if ( sig > 0. ) aida.cloud1D("Forward Fit Delta error:"+i).fill(sig);
+ }
+ //System.out.println( "Error after: " + trh.newTrack().error().minus(eold) );
+ */
+ }
+
+ }
+
+ ++icount;
}
return 0;
@@ -235,10 +295,11 @@
System.out.println ("Error: "
+ RKDebug.Instance().getTrack() + " "
+ RKDebug.Instance().getPropDir() + " "
+ + icount
);
System.out.println ("From surface 1: " + s_save );
System.out.println ("To surface 1: " + hit.surface());
- return icount;
+ return icount+1;
}
// Add the hit.
@@ -266,6 +327,58 @@
System.out.println ("To surface 3: " + hit.surface());
}
chold = chnew;
+
+ if ( hit.surface().pureType().equals(SurfCylinder.staticType()) ){
+
+ SurfCylinder s = (SurfCylinder) hit.surface();
+ double r = s.radius();
+ if ( r > 1.3 && RKDebug.Instance().getDoMs() ){
+ TrackError eold = trh.newTrack().error();
+
+ aida.histogram1D("Fit scat radius backward:",300, 0., 150.).fill(r);
+
+ double l_over_radl = ( r< 10) ? 0.000916 : 0.013747;
+ ThinCylMs scat = new ThinCylMs(l_over_radl*RKDebug.Instance().getMsFac());
+ ETrack et = trh.newTrack();
+ ETrack ets = new ETrack(et);
+ double chnew1 = trh.chisquared();
+
+ scat.interact(et);
+ hit.update(et);
+ trh.setFit(et,chnew1);
+
+ /*
+ for ( int i=0; i<5; ++i ){
+ double ex1 = et.error().get(i,i);
+ double ex2 = ets.error().get(i,i);
+ double sigsq = ex1-ex2;
+ //double pull = -9.;
+ double sig=-1.;
+ if ( sigsq > 0. ){
+ sig = Math.sqrt(sigsq);
+ //pull = (et.vector(i)-ets.vector(i))/sig;
+ }
+ //System.out.println ("Delta: "
+ // + i + " "
+ // + r + " "
+ // + (et.vector(i)-ets.vector(i)) + " "
+ // + (ex1-ex2)
+ // );
+ aida.cloud1D("Backward Fit Delta param:"+i).fill(et.vector(i)-ets.vector(i));
+ aida.cloud1D("Backward Fit Delta error:"+i).fill(sig);
+
+ }
+ //System.out.println( "Error after: " + trh.newTrack().error().minus(eold) );
+ */
+ }
+ }
+ /*
+ ETrack et = trh.newTrack();
+ hit.surface().interact(et);
+ hit.update(et);
+ trh.setFit(et,chnew);
+ */
+
++icount;
}
lcsim/sandbox/RobKutschke/TRFTests/v1
diff -u -r1.3 -r1.4
--- RKGeom.java 7 Sep 2007 19:09:28 -0000 1.3
+++ RKGeom.java 18 Sep 2007 16:50:17 -0000 1.4
@@ -37,9 +37,9 @@
*
*
*@author $Author: kutschke $
- *@version $Id: RKGeom.java,v 1.3 2007/09/07 19:09:28 kutschke Exp $
+ *@version $Id: RKGeom.java,v 1.4 2007/09/18 16:50:17 kutschke Exp $
*
- * Date $Date: 2007/09/07 19:09:28 $
+ * Date $Date: 2007/09/18 16:50:17 $
*
*/
@@ -165,6 +165,7 @@
Surf.add( new RKSurf ( de, 2, RKSurf.ixy_Undef, respixel, respixel ) );
}
for ( IDetectorElement de: tbar_layers ){
+ //Surf.add( new RKSurf ( de, 2, RKSurf.ixy_phi, resstrip, resstrip ) );
//Surf.add( new RKSurf ( de, 2, RKSurf.ixy_phi, resstrip, zres_strip ) );
Surf.add( new RKSurf ( de, 1, RKSurf.ixy_phi, resstrip ) );
}