LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  October 2015

HPS-SVN October 2015

Subject:

r3844 - in /java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl: GBLOutput.java GBLOutputDriver.java

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Wed, 14 Oct 2015 00:49:21 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (980 lines)

Author: [log in to unmask]
Date: Tue Oct 13 17:49:19 2015
New Revision: 3844

Log:
Add possibility of adding beamspot as a stereo pair hit in GBL.

Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	Tue Oct 13 17:49:19 2015
@@ -9,10 +9,14 @@
 import hep.physics.vec.Hep3Matrix;
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.VecOp;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+
+import org.apache.commons.math.geometry.Rotation;
+import org.apache.commons.math.geometry.Vector3D;
 import org.hps.recon.tracking.CoordinateTransformations;
 import org.hps.recon.tracking.MaterialSupervisor;
 import org.hps.recon.tracking.MultipleScattering;
@@ -49,15 +53,21 @@
 
     private int _debug = 0;
     private GBLFileIO textFile = null;
-    private Hep3Vector _B;
-    private final TrackerHitUtils _trackerHitUtils = new TrackerHitUtils();
-    private final MaterialSupervisor _materialmanager;
+    private Hep3Vector bFieldVector;
+    private final TrackerHitUtils trackerHitUtils = new TrackerHitUtils();
+    private final MaterialSupervisor materialManager;
     private final MultipleScattering _scattering;
     private final double _beamEnergy = 1.1; //GeV
     private boolean AprimeEvent = false; // do extra checks
     private boolean hasXPlanes = false;
-    private boolean _addBeamspot = false;
-    private double beamTilt = 0.03052; //hardcode for now...
+    private boolean addBeamspot = false;
+    private double beamspotTiltZOverY = 0; //Math.PI/180* 15;
+    private double beamspotScatAngle = 0.000001;
+    // beam spot with in tracking frame
+    private double beamspotWidthZ = 0.05;
+    private double beamspotWidthY = 0.150;
+    double beamspotPosition[] = {0,0,0};
+    
 
     /**
      * Constructor
@@ -71,10 +81,10 @@
         if (!outputFileName.equalsIgnoreCase("")) {
             textFile = new GBLFileIO(outputFileName);
         }
-        _materialmanager = new MaterialSupervisor();
-        _scattering = new MultipleScattering(_materialmanager);
-        _B = CoordinateTransformations.transformVectorToTracking(bfield);
-        _scattering.setBField(Math.abs(_B.z())); // only absolute of B is needed as it's used for momentum calculation only
+        materialManager = new MaterialSupervisor();
+        _scattering = new MultipleScattering(materialManager);
+        bFieldVector = CoordinateTransformations.transformVectorToTracking(bfield);
+        _scattering.setBField(Math.abs(bFieldVector.z())); // only absolute of B is needed as it's used for momentum calculation only
     }
 
     public void setDebug(int debug) {
@@ -83,13 +93,33 @@
     }
 
     public void buildModel(Detector detector) {
-        _materialmanager.buildModel(detector);
+        materialManager.buildModel(detector);
     }
 
     public void setAddBeamspot(boolean add) {
-        this._addBeamspot = add;
-    }
-
+        this.addBeamspot = add;
+    }
+    
+    public void setBeamspotScatAngle(double beamspotScatAngle) {
+        this.beamspotScatAngle = beamspotScatAngle;
+    }
+    
+    public void setBeamspotWidthZ (double beamspotWidthZ) {
+        this.beamspotWidthZ = beamspotWidthZ;
+    }
+    
+    public void setBeamspotWidthY (double beamspotWidthY) {
+        this.beamspotWidthY = beamspotWidthY;
+    }
+    
+    public void setBeamspotTiltZOverY(double beamspotTiltZOverY) {
+        this.beamspotTiltZOverY = beamspotTiltZOverY;
+    }
+    
+    public void setBeamspotPosition(double[] beamspotPosition) {
+        this.beamspotPosition = beamspotPosition;  
+    }
+    
     void printNewEvent(int eventNumber, double Bz) {
         if (textFile != null) {
             textFile.printEventInfo(eventNumber, Bz);
@@ -117,11 +147,11 @@
     }
 
     public Hep3Vector get_B() {
-        return _B;
+        return bFieldVector;
     }
 
     public void set_B(Hep3Vector _B) {
-        this._B = _B;
+        this.bFieldVector = _B;
     }
 
     void printGBL(Track trk, List<SiTrackerHitStrip1D> stripHits, GBLTrackData gtd, List<GBLStripClusterData> stripClusterDataList, List<MCParticle> mcParticles, List<SimTrackerHit> simTrackerHits, boolean isMC) {
@@ -156,13 +186,13 @@
         }
 
         // Get track parameters from MC particle 
-        HelicalTrackFit htfTruth = (isMC && mcp != null) ? TrackUtils.getHTF(mcp, -1.0 * this._B.z()) : null;
+        HelicalTrackFit htfTruth = (isMC && mcp != null) ? TrackUtils.getHTF(mcp, -1.0 * this.bFieldVector.z()) : null;
 
         // Use the truth helix as the initial track for GBL?
         //htf = htfTruth;
         // Get perigee parameters to curvilinear frame
-        PerigeeParams perPar = new PerigeeParams(htf, _B.z());
-        PerigeeParams perParTruth = new PerigeeParams(htfTruth, _B.z());
+        PerigeeParams perPar = new PerigeeParams(htf, bFieldVector.z());
+        PerigeeParams perParTruth = new PerigeeParams(htfTruth, bFieldVector.z());
 
         //GBLDATA
         gtd.setPerigeeTrackParameters(perPar);
@@ -173,8 +203,8 @@
 
         // Get curvilinear parameters
         if (textFile != null) {
-            ClParams clPar = new ClParams(htf, _B.z());
-            ClParams clParTruth = new ClParams(htfTruth, _B.z());
+            ClParams clPar = new ClParams(htf, bFieldVector.z());
+            ClParams clParTruth = new ClParams(htfTruth, bFieldVector.z());
             textFile.printClTrackParam(clPar);
             textFile.printClTrackParamTruth(clParTruth);
 
@@ -232,37 +262,86 @@
             System.out.printf("%s: truth perPar chi2 %f\n", this.getClass().getSimpleName(), chi2_truth);
         }
 
+        
+        
+        
         if (_debug > 0) {
-            System.out.printf("%d hits\n", hits.size());
-        }
-
+            System.out.printf("%d 3D hits \n", hits.size());
+        }
+
+        
+
+        
+        
         int istrip = 0;
-        for (int ihit = 0; ihit != hits.size(); ++ihit) {
-
-            HelicalTrackHit hit = hits.get(ihit);
-            HelicalTrackCross htc = (HelicalTrackCross) hit;
-            List<HelicalTrackStrip> strips = htc.getStrips();
-
+        final int iBeamspotHit = -1; // human readable ID for beam spot 
+        int beamSpotMillepedeId = 98; // just a random int number that I came up with
+        
+        for (int ihit = -1; ihit != hits.size(); ++ihit) {
+
+            HelicalTrackHit hit = null;
+            HelicalTrackCross htc = null;
+            List<HelicalTrackStrip> strips;
+            List<MCParticle> hitMCParticles = null;
+            Hep3Vector correctedHitPosition = null;
+
+            // Add beamspot first
+            if(ihit == iBeamspotHit) {
+                 if( addBeamspot ) {
+                     strips = this.getBeamSpotHits();
+                     correctedHitPosition = new BasicHep3Vector(0, 0, 0);
+                 } else 
+                     continue;
+            } 
+            else {
+                hit = hits.get(ihit);
+                htc = (HelicalTrackCross) hit;
+                strips = htc.getStrips();
+                correctedHitPosition = hit.getCorrectedPosition();
+                if(isMC)
+                    hitMCParticles = hit.getMCParticles();
+            }
+            
+            
             for (HelicalTrackStrip stripOld : strips) {
-                HelicalTrackStripGbl strip = new HelicalTrackStripGbl(stripOld, true);
-
+                
+                // flag to make sure that the normal to the plane is not required to be 
+                // along the track direction
+                final boolean flipNormal = true;
+
+                // Use a different class that overrides u- and v- vectors to avoid problems here for the beamspot
+                HelicalTrackStripGbl strip;
+                if( ihit == iBeamspotHit)
+                    strip = new BeamspotHelicalTrackStrip(stripOld, flipNormal);
+                else 
+                    strip = new HelicalTrackStripGbl(stripOld, flipNormal);
+
+                // find detector element name
+                String sensorName;
+                
                 // find Millepede layer definition from DetectorElement
-                IDetectorElement de = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
-                HpsSiSensor sensor;
-                if (de instanceof HpsSiSensor) {
-                    sensor = (HpsSiSensor) de;
+                int millepedeId;
+
+                // Check for beam spot as it has no detector element at this point
+                if(ihit == iBeamspotHit) {
+                
+                    millepedeId = beamSpotMillepedeId++;
+                    sensorName = strip.getStrip().detector(); // use detector name for now since it has no detector element
+
                 } else {
-                    throw new ClassCastException("Detector element " + de.getName() + " couldn't be casted to " + HpsSiSensor.class.getName());
-                }
-
-                int millepedeId = sensor.getMillepedeId();
+                    IDetectorElement de= ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
+                    if (! (de instanceof HpsSiSensor)) 
+                        throw new ClassCastException("Detector element " + de.getName() + " couldn't be casted to " + HpsSiSensor.class.getName());
+                    sensorName = de.getName();
+                    millepedeId = ((HpsSiSensor) de).getMillepedeId();
+                } 
 
                 if (_debug > 0) {
-                    System.out.printf("%s: layer %d millepede %d (DE=\"%s\", origin %s) \n", this.getClass().getSimpleName(), strip.layer(), millepedeId, sensor.getName(), strip.origin().toString());
+                    System.out.printf("%s: layer %d millepede %d (DE=\"%s\", origin %s (%s) w %s) \n", this.getClass().getSimpleName(), strip.layer(), millepedeId, sensorName, strip.origin().toString(),strip.toString(),strip.w());
                 }
 
                 if (textFile != null) {
-                    textFile.printStrip(istrip, millepedeId, de.getName());
+                    textFile.printStrip(istrip, millepedeId, sensorName);
                 }
 
                 //Center of the sensor
@@ -274,18 +353,18 @@
 
                 // associated 3D position of the crossing of this and it's stereo partner sensor
                 if (textFile != null) {
-                    textFile.printHitPos3D(hit.getCorrectedPosition());
+                    textFile.printHitPos3D(correctedHitPosition);
                 }
 
                 //Find intercept point with sensor in tracking frame
-                Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B.z()));
+                Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(bFieldVector.z()));
                 if (trkpos == null) {
                     if (_debug > 0) {
                         System.out.println("Can't find track intercept; use sensor origin");
                     }
                     trkpos = strip.origin();
                 }
-                Hep3Vector trkposTruth = htfTruth != null ? TrackUtils.getHelixPlaneIntercept(htfTruth, strip, Math.abs(_B.z())) : new BasicHep3Vector(-999999.9, -999999.9, -999999.9);
+                Hep3Vector trkposTruth = htfTruth != null ? TrackUtils.getHelixPlaneIntercept(htfTruth, strip, Math.abs(bFieldVector.z())) : new BasicHep3Vector(-999999.9, -999999.9, -999999.9);
                 if (textFile != null) {
                     textFile.printStripTrackPos(trkpos);
                 }
@@ -313,16 +392,14 @@
                 if (isMC) {
                     if (simHit == null) {
                         System.out.printf("%s: no sim hit for strip hit at layer %d\n", this.getClass().getSimpleName(), strip.layer());
-                        System.out.printf("%s: it as %d mc particles associated with it:\n", this.getClass().getSimpleName(), hit.getMCParticles().size());
-                        for (MCParticle particle : hit.getMCParticles()) {
+                        System.out.printf("%s: it as %d mc particles associated with it:\n", this.getClass().getSimpleName(), hitMCParticles.size());
+                        for (MCParticle particle : hitMCParticles) {
                             System.out.printf("%s: %d p %s \n", this.getClass().getSimpleName(), particle.getPDGID(), particle.getMomentum().toString());
                         }
                         System.out.printf("%s: these are sim hits in the event:\n", this.getClass().getSimpleName());
                         for (SimTrackerHit simhit : simTrackerHits) {
                             System.out.printf("%s sim hit at %s with MC particle pdgid %d with p %s \n", this.getClass().getSimpleName(), simhit.getPositionVec().toString(), simhit.getMCParticle().getPDGID(), simhit.getMCParticle().getMomentum().toString());
                         }
-                        //System.out.printf("%s: these are all the MC particles in the event:\n",this.getClass().getSimpleName());
-                        //System.exit(1);
                     }
 
                     if (_debug > 0) {
@@ -373,27 +450,25 @@
                     textFile.printStripTrackDirFull(stripData.getTrackDirection());
                 }
 
-                if (_debug > 0 || textFile != null) {
-                    // calculate isolation to other strip clusters
-                    double stripIsoMin = 9999.9;
+                // calculate strip isolation if we are printing a text file or debugging
+                // Don't do this for the  beam spot strip
+                double stripIsoMin = 9999.9;
+                if ((_debug > 0 || textFile != null) && ihit != iBeamspotHit) {
                     for (SiTrackerHitStrip1D stripHit : stripHits) {
-                        if (stripHit.getRawHits().get(0).getDetectorElement().getName().equals(de.getName())) {
+                        if (stripHit.getRawHits().get(0).getDetectorElement().getName().equals(sensorName)) {
                             SiTrackerHitStrip1D local = stripHit.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
                             double d = Math.abs(strip.umeas() - local.getPosition()[0]);
-                            if (d < stripIsoMin && d > 0) {
+                            if (d < stripIsoMin && d > 0) 
                                 stripIsoMin = d;
-                            }
                         }
                     }
-
-                    if (_debug > 0) {
+                    if (_debug > 0)
                         System.out.printf("%s: stripIsoMin = %f \n", this.getClass().getSimpleName(), stripIsoMin);
-                    }
-
-                    // Add isolation to text file output
-                    if (textFile != null) {
-                        textFile.printStripIso(stripIsoMin);
-                    }
+                }
+
+                // Add isolation to text file output
+                if (textFile != null) {
+                    textFile.printStripIso(stripIsoMin);
                 }
 
                 //Print residual in measurement system
@@ -401,7 +476,12 @@
                 Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin);
 
                 // then find the rotation from tracking to measurement frame
-                Hep3Matrix trkToStripRot = _trackerHitUtils.getTrackToStripRotation(strip.getStrip());
+                Hep3Matrix trkToStripRot;
+                
+                if(ihit == iBeamspotHit)
+                    trkToStripRot = this.getTrkToStripRot(strip);
+                else
+                    trkToStripRot = trackerHitUtils.getTrackToStripRotation(strip.getStrip());
 
                 // then rotate that vector into the measurement frame to get the predicted measurement position
                 Hep3Vector trkpos_meas = VecOp.mult(trkToStripRot, vdiffTrk);
@@ -451,17 +531,12 @@
                 }
 
                 // find scattering angle
-                ScatterPoint scatter = scatters.getScatterPoint(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement());
-                double scatAngle;
-
-                if (scatter != null) {
-                    scatAngle = scatter.getScatterAngle().Angle();
-                } else {
-                    if (_debug > 0) {
-                        System.out.printf("%s: WARNING cannot find scatter for detector %s with strip cluster at %s\n", this.getClass(), ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
-                    }
-                    scatAngle = GblUtils.estimateScatter(sensor, htf, _scattering, _B.magnitude());
-                }
+                double scatAngle;                
+                if(ihit == iBeamspotHit)
+                    scatAngle = beamspotScatAngle;
+                else
+                    scatAngle = this.getScatterAngle(strip, scatters, htf);
+                
 
                 //GBLDATA
                 stripData.setScatterAngle(scatAngle);
@@ -474,274 +549,139 @@
             }
         }
 
-        if (_addBeamspot) {
-            addBeamspotToHitList(htf, stripClusterDataList, istrip, htfTruth);
-        }
-
-    }
-
+    }
+
+    
     /**
-     * Make a pair of HelicalTrackStrips from the beam spot
+     * 
+     * Find the multiple scattering angle among the estimated scatters for this {@link HelicalTrackStripGbl}.
+     * 
+     * @param strip
+     * @param scatters
+     * @param htf
+     * @return the angle
+     */
+    private double getScatterAngle(HelicalTrackStripGbl strip, ScatterPoints scatters, HelicalTrackFit htf) {
+        IDetectorElement de = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
+        ScatterPoint scatter = scatters.getScatterPoint(de);
+        double scatAngle;
+        if (scatter != null) {
+            scatAngle = scatter.getScatterAngle().Angle();
+        } else {
+            if (_debug > 0)
+                System.out.printf("%s: WARNING cannot find scatter for detector %s with strip cluster at %s\n", this.getClass(), ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
+            scatAngle = GblUtils.estimateScatter(de, htf, _scattering, bFieldVector.magnitude());
+        }
+        return scatAngle;
+
+    }
+    
+    
+    /**
+     * Make a pair of HelicalTrackStrips from the beam spot.
      *
      */
-    private List<HelicalTrackStrip> makeHelicalTrackStripsFromBeamSpot() {
-        Hep3Vector pos = new BasicHep3Vector(0, 0, 0);//hardcode for now....
-        double time = 0;
-        int lyr = 0;
-        BarrelEndcapFlag be = BarrelEndcapFlag.BARREL;
-        //  note...the "x" and "y" here refer to the JLAB frame
-        Hep3Vector u_x = new BasicHep3Vector(Math.sin(beamTilt), Math.cos(beamTilt), 0);
-        Hep3Vector v_x = new BasicHep3Vector(0, 0, 1);
-        Hep3Vector u_y = new BasicHep3Vector(0, 0, 1);
-        Hep3Vector v_y = new BasicHep3Vector(Math.sin(beamTilt), -Math.cos(beamTilt), 0);
-        double umeas_x = 0;
-        double umeas_y = 0;
-        double du_x = 0.2; // beamspot in x...hardcode for now...should get this from the event eventually
-        double du_y = 0.04; // beamspot in y...hardcode for now...should get this from the event eventually
-
-        double vmin = -666;
-        double vmax = 666;
-
-        HelicalTrackStrip hitx = new HelicalTrackStrip(pos, u_x, v_x,
-                umeas_x, du_x, vmin, vmax, 0.0, time,
-                null, "BeamSpot", lyr, be);
-        HelicalTrackStrip hity = new HelicalTrackStrip(pos, u_y, v_y,
-                umeas_y, du_y, vmin, vmax, 0.0, time,
-                null, "BeamSpot", lyr, be);
+    private List<HelicalTrackStrip> getBeamSpotHits() {
+        
+        // dummy constants
+        final double time = 0;
+        final int lyr = 0;
+        final BarrelEndcapFlag be = BarrelEndcapFlag.BARREL;
+
+       
+
+        // width of strip?
+        final double vmin = -200;
+        final double vmax = 200;
+        
+        // measurement in local sensor frame
+        final double umeas = 0;
+        
+        
+        // calculate stereo angle to give approximately the right horizontal resolution
+        final double stereo_angle = Math.asin(beamspotWidthZ / beamspotWidthY);
+
+        // Place stereo sensor origin
+        Hep3Vector posStereo = new BasicHep3Vector(beamspotPosition[0], beamspotPosition[1], beamspotPosition[2]); 
+        // Place axial sensor translated along beam line
+        Hep3Vector posAxial = VecOp.add(posStereo, new BasicHep3Vector(0.1, 0, 0)); 
+        
+        // Set the local coordinates of the sensors
+        // make these similar orientation as bottom L1-3 modules
+        
+        // Start with u pointing in tracking z direction
+        Vector3D u_start = new Vector3D(0, 0, 1);
+        
+        //AXIAL u
+        // flip around tracking y to get correct u
+        Rotation r1 = new Rotation(new Vector3D(0, 1, 0), Math.PI);
+        // then rotate around X to get correct beamspot tilt
+        Rotation r11 = new Rotation(new Vector3D(1, 0, 0), beamspotTiltZOverY);
+        Vector3D uAxial_v = r11.applyTo(r1).applyTo(u_start); 
+
+        //AXIAL v
+        // v is orthogonal to u around x 
+        Rotation r2 = new Rotation(new Vector3D(1, 0, 0), Math.PI/2.0);
+        Vector3D vAxial_v = r2.applyTo(uAxial_v); 
+        
+        //STEREO u
+        // flip around x w.r.t. axial and then apply stereo angle
+        // that is don't do the initial flip
+        Rotation r3 = new Rotation(new Vector3D(1, 0, 0), stereo_angle);
+        // first apply the beamspot tilt, then the stereo around the same axis
+        Vector3D uStereo_v = r3.applyTo(r11).applyTo(u_start);
+
+        //STEREO v
+        // v is orthogonal to u, negative compared to u above around new 
+        Rotation r22 = new Rotation(new Vector3D(1, 0, 0), -Math.PI/2.0);
+        Vector3D vStereo_v = r22.applyTo(uStereo_v);
+
+        // convert to Hep3Vector
+        Hep3Vector uStereo = new BasicHep3Vector(uStereo_v.getX(), uStereo_v.getY(), uStereo_v.getZ());        
+        Hep3Vector vStereo = new BasicHep3Vector(vStereo_v.getX(), vStereo_v.getY(), vStereo_v.getZ());    
+        Hep3Vector uAxial = new BasicHep3Vector(uAxial_v.getX(), uAxial_v.getY(), uAxial_v.getZ());        
+        Hep3Vector vAxial = new BasicHep3Vector(vAxial_v.getX(), vAxial_v.getY(), vAxial_v.getZ());    
+
+        // Create the actual strip hit objects
+        NormalHelicalTrackStrip hitAxial = new NormalHelicalTrackStrip(posAxial, uAxial, vAxial,
+                umeas, beamspotWidthZ, vmin, vmax, 0.0, time,
+                null, "module_L0b_halfmodule_axial_sensor0", lyr, be);
+        NormalHelicalTrackStrip hitStereo = new NormalHelicalTrackStrip(posStereo, uStereo, vStereo,
+                umeas, beamspotWidthZ, vmin, vmax, 0.0, time,
+                null, "module_L0b_halfmodule_stereo_sensor0", lyr, be);
+
+        if(_debug > 0) {
+            System.out.printf("%s: created beamspot strip hits\n", this.getClass().getSimpleName());
+            System.out.printf("%s: %s\n", this.getClass().getSimpleName(), hitStereo.toString());
+            System.out.printf("%s: %s\n", this.getClass().getSimpleName(), hitAxial.toString());
+        }
 
         List<HelicalTrackStrip> htsList = new ArrayList<HelicalTrackStrip>();
-        htsList.add(hitx);
-        htsList.add(hity);
+        htsList.add(hitStereo);
+        htsList.add(hitAxial);
+        
         return htsList;
 
     }
-
-    private void addBeamspotToHitList(HelicalTrackFit htf, List<GBLStripClusterData> stripClusterDataList, int istrip, HelicalTrackFit htfTruth) {
-
-        Hep3Vector targetNormal = new BasicHep3Vector(Math.cos(beamTilt), Math.sin(beamTilt), 0);
-        int millepedeId = 665;
-        List<HelicalTrackStrip> beamspotStrips = makeHelicalTrackStripsFromBeamSpot();
-        for (HelicalTrackStrip stripOld : beamspotStrips) {
-            HelicalTrackStripGbl strip = new HelicalTrackStripGbl(stripOld, false);
-
-            // find Millepede layer definition from DetectorElement
-//            IDetectorElement de = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
-//            HpsSiSensor sensor;
-//            if (de instanceof HpsSiSensor)
-//                sensor = (HpsSiSensor) de;
-//            else
-//                throw new ClassCastException("Detector element " + de.getName() + " couldn't be casted to " + HpsSiSensor.class.getName());
-//            int millepedeId = sensor.getMillepedeId();
-            millepedeId++;
-            if (_debug > 0) {
-                System.out.printf("%s: layer %d millepede %d (DE=\"%s\", origin %s) \n", this.getClass().getSimpleName(), strip.layer(), millepedeId, "BeamSpot", strip.origin().toString());
-            }
-
-            if (textFile != null) {
-                textFile.printStrip(istrip, millepedeId, "BeamSpot");
-            }
-
-            //GBLDATA
-            GBLStripClusterData stripData = new GBLStripClusterData(millepedeId);
-            //Add to output list
-            stripClusterDataList.add(stripData);
-
-            //Center of the sensor
-            Hep3Vector origin = strip.origin();
-
-            if (textFile != null) {
-                textFile.printOrigin(origin);
-            }
-
-            // associated 3D position of beamspot on target
-            if (textFile != null) {
-                textFile.printHitPos3D(new BasicHep3Vector(0, 0, 0));
-            }
-
-            //Find intercept point with sensor in tracking frame
-//            Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B.z()));
-            Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip.w(), strip.origin(), Math.abs(_B.z()));
-            if (trkpos == null) {
-                if (_debug > 0) {
-                    System.out.println("Can't find track intercept; use sensor origin");
-                }
-                trkpos = strip.origin();
-            }
-            Hep3Vector trkposTruth = htfTruth != null ? TrackUtils.getHelixPlaneIntercept(htfTruth, strip.w(), strip.origin(), Math.abs(_B.z())) : new BasicHep3Vector(-999999.9, -999999.9, -999999.9);
-            if (textFile != null) {
-                textFile.printStripTrackPos(trkpos);
-            }
-            if (_debug > 0) {
-                System.out.printf("trkpos at intercept [%.10f %.10f %.10f]\n", trkpos.x(), trkpos.y(), trkpos.z());
-                System.out.printf("trkposTruth at intercept %s\n", trkposTruth != null ? trkposTruth.toString() : "no truth track");
-            }
-
-            // cross-check intercept point
-            if (hasXPlanes) {
-                Hep3Vector trkposXPlaneIter = TrackUtils.getHelixPlanePositionIter(htf, strip.origin(), strip.w(), 1.0e-8);
-                Hep3Vector trkposDiff = VecOp.sub(trkposXPlaneIter, trkpos);
-                if (trkposDiff.magnitude() > 1.0e-7) {
-                    System.out.printf("WARNING trkposDiff mag = %.10f [%.10f %.10f %.10f]\n", trkposDiff.magnitude(), trkposDiff.x(), trkposDiff.y(), trkposDiff.z());
-                    System.exit(1);
-                }
-                if (_debug > 0) {
-                    System.out.printf("trkposXPlaneIter at intercept [%.10f %.10f %.10f]\n", trkposXPlaneIter.x(), trkposXPlaneIter.y(), trkposXPlaneIter.z());
-                }
-            }
-
-//        // Find the sim tracker hit for this layer
-//        SimTrackerHit simHit = simHitsLayerMap.get(strip.layer());
-//
-//        if (isMC) {
-//            if (simHit == null) {
-//                System.out.printf("%s: no sim hit for strip hit at layer %d\n", this.getClass().getSimpleName(), strip.layer());
-//                System.out.printf("%s: it as %d mc particles associated with it:\n", this.getClass().getSimpleName(), hit.getMCParticles().size());
-//                for (MCParticle particle : hit.getMCParticles())
-//                    System.out.printf("%s: %d p %s \n", this.getClass().getSimpleName(), particle.getPDGID(), particle.getMomentum().toString());
-//                System.out.printf("%s: these are sim hits in the event:\n", this.getClass().getSimpleName());
-//                for (SimTrackerHit simhit : simTrackerHits)
-//                    System.out.printf("%s sim hit at %s with MC particle pdgid %d with p %s \n", this.getClass().getSimpleName(), simhit.getPositionVec().toString(), simhit.getMCParticle().getPDGID(), simhit.getMCParticle().getMomentum().toString());
-//                        //System.out.printf("%s: these are all the MC particles in the event:\n",this.getClass().getSimpleName());
-//                //System.exit(1);
-//            }
-//
-//            if (_debug > 0)
-//                if (htfTruth != null && simHit != null) {
-//                    double s_truthSimHit = HelixUtils.PathToXPlane(htfTruth, simHit.getPositionVec().z(), 0, 0).get(0);
-//                    Hep3Vector trkposTruthSimHit = HelixUtils.PointOnHelix(htfTruth, s_truthSimHit);
-//                    Hep3Vector resTruthSimHit = VecOp.sub(CoordinateTransformations.transformVectorToTracking(simHit.getPositionVec()), trkposTruthSimHit);
-//                    System.out.printf("TruthSimHit residual %s for layer %d\n", resTruthSimHit.toString(), strip.layer());
-//                }
-//        }
-            //path length to intercept         
-            double s = HelixUtils.PathToXPlane(htf, trkpos.x(), 0, 0).get(0);
-            double s3D = s / Math.cos(Math.atan(htf.slope()));
-            if (textFile != null) {
-                textFile.printStripPathLen(s);
-                textFile.printStripPathLen3D(s3D);
-            }
-
-            //GBLDATA
-            stripData.setPath(s);
-            stripData.setPath3D(s3D);
-            //
-            //print stereo angle in YZ plane
-            if (textFile != null) {
-                textFile.printMeasDir(strip.u());
-                textFile.printNonMeasDir(strip.v());
-                textFile.printNormalDir(targetNormal);
-            }
-
-            //GBLDATA
-            stripData.setU(strip.u());
-            stripData.setV(strip.v());
-            stripData.setW(strip.w());
-
-            //Print track direction at intercept
-            Hep3Vector tDir = HelixUtils.Direction(htf, s);
-            double phi = htf.phi0() - s / htf.R();
-            double lambda = Math.atan(htf.slope());
-            if (textFile != null) {
-                textFile.printStripTrackDir(Math.sin(phi), Math.sin(lambda));
-                textFile.printStripTrackDirFull(tDir);
-            }
-
-            //GBLDATA
-            stripData.setTrackDir(tDir);
-            stripData.setTrackPhi(phi);
-            stripData.setTrackLambda(lambda);
-
-            // calculate isolation to other strip clusters
-            double stripIsoMin = 9999.9;
-//            for (SiTrackerHitStrip1D stripHit : stripHits)
-//                if (stripHit.getRawHits().get(0).getDetectorElement().getName().equals(de.getName())) {
-//                    SiTrackerHitStrip1D local = stripHit.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
-//                    double d = Math.abs(strip.umeas() - local.getPosition()[0]);
-//                    if (d < stripIsoMin && d > 0)
-//                        stripIsoMin = d;
-//                }
-
-            if (_debug > 0) {
-                System.out.printf("%s: stripIsoMin = %f \n", this.getClass().getSimpleName(), stripIsoMin);
-            }
-
-            // Add isolation to text file output
-            if (textFile != null) {
-                textFile.printStripIso(stripIsoMin);
-            }
-
-            //Print residual in measurement system
-            // start by find the distance vector between the center and the track position
-            Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin);
-            Hep3Vector vdiffTrkTruth = htfTruth != null ? VecOp.sub(trkposTruth, origin) : null;
-
-            // then find the rotation from tracking to measurement frame
-//            Hep3Matrix trkToStripRot = _trackerHitUtils.getTrackToStripRotation(strip.getStrip());
-            Hep3Matrix trkToBeamSpot = new BasicHep3Matrix(Math.cos(beamTilt), Math.sin(beamTilt), 0,
-                    -Math.sin(beamTilt), Math.cos(beamTilt), 0,
-                    0, 0, 1);
-            // then rotate that vector into the measurement frame to get the predicted measurement position
-            Hep3Vector trkpos_meas = VecOp.mult(trkToBeamSpot, vdiffTrk);
-            Hep3Vector trkposTruth_meas = vdiffTrkTruth != null ? VecOp.mult(trkToBeamSpot, vdiffTrkTruth) : null;
-
-            // hit measurement and uncertainty in measurement frame
-            Hep3Vector m_meas = new BasicHep3Vector(strip.umeas(), 0., 0.);
-            Hep3Vector res_err_meas = new BasicHep3Vector(strip.du(), (strip.vmax() - strip.vmin()) / Math.sqrt(12), 10.0 / Math.sqrt(12));
-
-            if (textFile != null) {
-                textFile.printStripMeas(m_meas.x());
-            }
-
-            //if(textFile != null) {
-            //    textFile.printStripTrackPosMeasFrame(trkpos_meas);
-            //}
-            //GBLDATA
-            stripData.setMeas(strip.umeas());
-            stripData.setTrackPos(trkpos_meas);
-
-            if (_debug > 1) {
-                System.out.printf("%s: rotation matrix to meas frame\n%s\n", getClass().getSimpleName(), VecOp.toString(trkToBeamSpot));
-                System.out.printf("%s: tPosGlobal %s origin %s\n", getClass().getSimpleName(), trkpos.toString(), origin.toString());
-                System.out.printf("%s: tDiff %s\n", getClass().getSimpleName(), vdiffTrk.toString());
-                System.out.printf("%s: tPosMeas %s\n", getClass().getSimpleName(), trkpos_meas.toString());
-            }
-
-            // residual in measurement frame
-            Hep3Vector res_meas = VecOp.sub(m_meas, trkpos_meas);
-            Hep3Vector resTruth_meas = trkposTruth_meas != null ? VecOp.sub(m_meas, trkposTruth_meas) : null;
-            if (textFile != null) {
-                textFile.printStripMeasRes(res_meas.x(), res_err_meas.x());
-                textFile.printStripMeasResTruth(resTruth_meas != null ? resTruth_meas.x() : -9999999.9, res_err_meas.x());
-            }
-
-            //GBLDATA
-            stripData.setMeasErr(res_err_meas.x());
-
-            if (_debug > 0) {
-                System.out.printf("layer %d millePedeId %d uRes %.10f\n", strip.layer(), millepedeId, res_meas.x());
-            }
-
-//          
-            double scatAngle = 0.0001;
-
-            //print scatterer to file
-            if (textFile != null) {
-                textFile.printStripScat(scatAngle);
-            }
-
-            //GBLDATA
-            stripData.setScatterAngle(scatAngle);
-
-            ++istrip;
-        }
-    }
+    
+    
+    private Hep3Matrix getTrkToStripRot(HelicalTrackStripGbl strip) {
+        Hep3Matrix prjTrkToStrip = new BasicHep3Matrix(strip.u().x(), strip.u().y(), strip.u().z(), 
+                strip.v().x(), strip.v().y(), strip.v().z(),
+                strip.w().x(), strip.w().y(), strip.w().z());
+        return prjTrkToStrip;
+
+    }
+
+    
+   
 
     private void checkAprimeTruth(MCParticle mcp, List<MCParticle> mcParticles) {
         List<MCParticle> mcp_pair = getAprimeDecayProducts(mcParticles);
 
         if (_debug > 0) {
             double invMassTruth = Math.sqrt(Math.pow(mcp_pair.get(0).getEnergy() + mcp_pair.get(1).getEnergy(), 2) - VecOp.add(mcp_pair.get(0).getMomentum(), mcp_pair.get(1).getMomentum()).magnitudeSquared());
-            double invMassTruthTrks = getInvMassTracks(TrackUtils.getHTF(mcp_pair.get(0), -1.0 * this._B.z()), TrackUtils.getHTF(mcp_pair.get(1), -1.0 * this._B.z()));
+            double invMassTruthTrks = getInvMassTracks(TrackUtils.getHTF(mcp_pair.get(0), -1.0 * this.bFieldVector.z()), TrackUtils.getHTF(mcp_pair.get(1), -1.0 * this.bFieldVector.z()));
             System.out.printf("%s: invM = %f\n", this.getClass().getSimpleName(), invMassTruth);
             System.out.printf("%s: invMTracks = %f\n", this.getClass().getSimpleName(), invMassTruthTrks);
         }
@@ -1012,8 +952,8 @@
     }
 
     private double getInvMassTracks(HelicalTrackFit htf1, HelicalTrackFit htf2) {
-        double p1 = htf1.p(this._B.magnitude());
-        double p2 = htf2.p(this._B.magnitude());
+        double p1 = htf1.p(this.bFieldVector.magnitude());
+        double p2 = htf2.p(this.bFieldVector.magnitude());
         Hep3Vector p1vec = VecOp.mult(p1, HelixUtils.Direction(htf1, 0));
         Hep3Vector p2vec = VecOp.mult(p2, HelixUtils.Direction(htf2, 0));
         double me = 0.000510998910;
@@ -1043,6 +983,13 @@
         return new BasicMatrix(1, 5);
     }
 
+    /**
+     * 
+     * Store perigee track parameters. 
+     * 
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
     public static class PerigeeParams {
 
         private final BasicMatrix _params;
@@ -1131,6 +1078,14 @@
          */
     }
 
+    
+    /**
+     * 
+     * Store curvilinear track parameters. 
+     * 
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
     public static class ClParams {
 
         private BasicMatrix _params = new BasicMatrix(1, 5);
@@ -1191,5 +1146,56 @@
         }
 
     }
+    
+    
+    /**
+     * 
+     * {@link HelicalTrackStripGbl} that explicitly uses the given unit vectors when accessed. 
+     * This class is used when there is no strip geometry objects assoviated and thus the 
+     * parent {@link HelicalTrackStripGbl} methods cannot be used to get unit vectors.
+     * Make sure this strip uses the given u and v vectors all the time.
+     * 
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
+    private static class BeamspotHelicalTrackStrip extends HelicalTrackStripGbl {
+        public BeamspotHelicalTrackStrip(HelicalTrackStrip strip, boolean useGeomDef) {
+            super(strip, useGeomDef);
+        }
+        @Override
+        public Hep3Vector u() {
+            return _strip.u();
+        }
+        @Override
+        public Hep3Vector v() {
+            return _strip.v();
+        }
+    }
+    
+    /**
+     * 
+     * {@link HelicalTrackStrip} that doesn't flip unit vectors to point along the track.
+     * 
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
+    private static class NormalHelicalTrackStrip extends HelicalTrackStrip {
+
+        public NormalHelicalTrackStrip(Hep3Vector origin, Hep3Vector u, Hep3Vector v,
+                double umeas, double du, double vmin, double vmax, double dEdx,
+                double time, List rawhits, String detector, int layer,
+                org.lcsim.geometry.subdetector.BarrelEndcapFlag beflag) {
+            super(origin, u, v, umeas, du, vmin, vmax, dEdx, time, rawhits, detector,
+                    layer, beflag);
+
+        }
+
+        @Override
+        protected void initW() {
+            _w = VecOp.cross(_u, _v);
+        }
+    }
+
+    
 
 }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	Tue Oct 13 17:49:19 2015
@@ -58,7 +58,15 @@
     private int totalTracksProcessed = 0;
     private int iTrack = 0;
     private int iEvent = 0;
-    private boolean _addBeamspot=false;
+    private boolean addBeamspot=false;
+    private double beamspotScatAngle = 0.000001;
+    private double beamspotWidthZ = 0.05;
+    private double beamspotWidthY = 0.15;
+    private double beamspotTiltZOverY = 15.0*180.0/Math.PI;
+    private double beamspotPosition[] = {0,0,0};
+
+    
+    
 
     public GBLOutputDriver() {
     }
@@ -73,7 +81,12 @@
         gbl.buildModel(detector);
         gbl.setAPrimeEventFlag(false);
         gbl.setXPlaneFlag(false);
-        gbl.setAddBeamspot(_addBeamspot);
+        gbl.setAddBeamspot(addBeamspot);
+        gbl.setBeamspotScatAngle(beamspotScatAngle);
+        gbl.setBeamspotWidthY(beamspotWidthY);
+        gbl.setBeamspotWidthZ(beamspotWidthZ);
+        gbl.setBeamspotTiltZOverY(beamspotTiltZOverY);
+        gbl.setBeamspotPosition(beamspotPosition);
 
         //Create the class that makes residual plots for cross-checking
         //truthRes = new TruthResiduals(bfield);
@@ -95,7 +108,7 @@
 
         List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
         if (_debug > 0) {
-            System.out.printf("%s: Got %d SiTrackerHitStrip1D in this event\n", stripHits.size());
+            System.out.printf("%s: Got %d SiTrackerHitStrip1D in this event\n",this.getClass().getSimpleName(), stripHits.size());
         }
 
         List<MCParticle> mcParticles = new ArrayList<MCParticle>();
@@ -131,7 +144,13 @@
         // Loop over each of the track collections retrieved from the event
         for (Track trk : tracklist) {
             totalTracks++;
-
+            
+            if (_debug > 0) System.out.printf("%s: PX %f bottom %d\n", this.getClass().getSimpleName(), trk.getPX(), TrackUtils.isBottomTrack(trk, 4)?1:0) ;
+            
+            //if( trk.getPX() < 0.9) continue;
+            
+            //if( TrackUtils.isBottomTrack(trk, 4)) continue;
+            
             if (TrackUtils.isGoodTrack(trk, tracklist, EventQuality.Quality.NONE)) {
                 if (_debug > 0) {
                     System.out.printf("%s: Print GBL output for this track\n", this.getClass().getSimpleName());
@@ -211,7 +230,47 @@
     }
 
     public void setAddBeamspot(boolean add){
-        this._addBeamspot=add;
+        this.addBeamspot=add;
+    }
+
+    public double getBeamspotScatAngle() {
+        return beamspotScatAngle;
+    }
+
+    public void setBeamspotScatAngle(double beamspotScatAngle) {
+        this.beamspotScatAngle = beamspotScatAngle;
+    }
+
+    public double getBeamspotWidthZ() {
+        return beamspotWidthZ;
+    }
+
+    public void setBeamspotWidthZ(double beamspotWidthZ) {
+        this.beamspotWidthZ = beamspotWidthZ;
+    }
+
+    public double getBeamspotWidthY() {
+        return beamspotWidthY;
+    }
+
+    public void setBeamspotWidthY(double beamspotWidthY) {
+        this.beamspotWidthY = beamspotWidthY;
+    }
+
+    public double getBeamspotTiltZOverY() {
+        return beamspotTiltZOverY;
+    }
+
+    public void setBeamspotTiltZOverY(double beamspotTiltZOverY) {
+        this.beamspotTiltZOverY = beamspotTiltZOverY;
+    }
+
+    public double[] getBeamspotPosition() {
+        return beamspotPosition;
+    }
+
+    public void setBeamspotPosition(double beamspotPosition[]) {
+        this.beamspotPosition = beamspotPosition;
     }
     
 }

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use