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;
}
}
|