Author: [log in to unmask]
Date: Fri Sep 18 10:05:13 2015
New Revision: 3634
Log:
add beamspot as a HelicalTrackCross to the GblOutput...don't include it in the refitter.
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
java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.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 Fri Sep 18 10:05:13 2015
@@ -27,12 +27,14 @@
import org.lcsim.event.SimTrackerHit;
import org.lcsim.event.Track;
import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrack3DHit;
import org.lcsim.fit.helicaltrack.HelicalTrackCross;
import org.lcsim.fit.helicaltrack.HelicalTrackFit;
import org.lcsim.fit.helicaltrack.HelicalTrackHit;
import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
import org.lcsim.fit.helicaltrack.HelixUtils;
import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType;
import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
@@ -55,6 +57,8 @@
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;
/**
* Constructor
@@ -65,9 +69,8 @@
*/
GBLOutput(String outputFileName, Hep3Vector bfield) {
//System.out.printf("name \"%s\" \n", outputFileName);
- if (!outputFileName.equalsIgnoreCase("")) {
+ if (!outputFileName.equalsIgnoreCase(""))
textFile = new GBLFileIO(outputFileName);
- }
_materialmanager = new MaterialSupervisor();
_scattering = new MultipleScattering(_materialmanager);
_B = CoordinateTransformations.transformVectorToTracking(bfield);
@@ -83,22 +86,23 @@
_materialmanager.buildModel(detector);
}
+ public void setAddBeamspot(boolean add) {
+ this._addBeamspot = add;
+ }
+
void printNewEvent(int eventNumber, double Bz) {
- if (textFile != null) {
+ if (textFile != null)
textFile.printEventInfo(eventNumber, Bz);
- }
}
void printTrackID(int iTrack) {
- if (textFile != null) {
+ if (textFile != null)
textFile.printTrackID(iTrack);
- }
}
void close() {
- if (textFile != null) {
+ if (textFile != null)
textFile.closeFile();
- }
}
void setAPrimeEventFlag(boolean flag) {
@@ -139,15 +143,11 @@
System.out.printf("%s: WARNING!! no truth particle found in event!\n", this.getClass().getSimpleName());
this.printMCParticles(mcParticles);
//System.exit(1);
- } else {
- if (_debug > 0) {
- System.out.printf("%s: truth particle (pdgif %d ) found in event!\n", this.getClass().getSimpleName(), mcp.getPDGID());
- }
- }
-
- if (AprimeEvent) {
+ } else if (_debug > 0)
+ System.out.printf("%s: truth particle (pdgif %d ) found in event!\n", this.getClass().getSimpleName(), mcp.getPDGID());
+
+ if (AprimeEvent)
checkAprimeTruth(mcp, mcParticles);
- }
}
// Get track parameters from MC particle
@@ -182,45 +182,37 @@
// find the projection from the I,J,K to U,V,T curvilinear coordinates
Hep3Matrix perToClPrj = getPerToClPrj(htf);
- if (textFile != null) {
+ if (textFile != null)
textFile.printPerToClPrj(perToClPrj);
- }
//GBLDATA
- for (int row = 0; row < perToClPrj.getNRows(); ++row) {
- for (int col = 0; col < perToClPrj.getNColumns(); ++col) {
+ for (int row = 0; row < perToClPrj.getNRows(); ++row)
+ for (int col = 0; col < perToClPrj.getNColumns(); ++col)
gtd.setPrjPerToCl(row, col, perToClPrj.e(row, col));
- }
- }
// print chi2 of fit
- if (textFile != null) {
+ if (textFile != null)
textFile.printChi2(htf.chisq(), htf.ndf());
- }
// build map of layer to SimTrackerHits that belongs to the MC particle
Map<Integer, SimTrackerHit> simHitsLayerMap = new HashMap<Integer, SimTrackerHit>();
- for (SimTrackerHit sh : simTrackerHits) {
+ for (SimTrackerHit sh : simTrackerHits)
if (sh.getMCParticle() == mcp) {
int layer = sh.getIdentifierFieldValue("layer");
- if (!simHitsLayerMap.containsKey(layer) || (sh.getPathLength() < simHitsLayerMap.get(layer).getPathLength())) {
+ if (!simHitsLayerMap.containsKey(layer) || (sh.getPathLength() < simHitsLayerMap.get(layer).getPathLength()))
simHitsLayerMap.put(layer, sh);
- }
- }
- }
+ }
// covariance matrix from the fit
- if (textFile != null) {
+ if (textFile != null)
textFile.printPerTrackCov(htf);
- }
// dummy cov matrix for CL parameters
BasicMatrix clCov = GblUtils.unitMatrix(5, 5);
clCov = (BasicMatrix) MatrixOp.mult(0.1 * 0.1, clCov);
- if (textFile != null) {
+ if (textFile != null)
textFile.printCLTrackCov(clCov);
- }
if (_debug > 0) {
System.out.printf("%s: perPar covariance matrix\n%s\n", this.getClass().getSimpleName(), htf.covariance().toString());
@@ -228,9 +220,8 @@
System.out.printf("%s: truth perPar chi2 %f\n", this.getClass().getSimpleName(), chi2_truth);
}
- if (_debug > 0) {
+ if (_debug > 0)
System.out.printf("%d hits\n", hits.size());
- }
int istrip = 0;
for (int ihit = 0; ihit != hits.size(); ++ihit) {
@@ -245,21 +236,18 @@
// find Millepede layer definition from DetectorElement
IDetectorElement de = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
HpsSiSensor sensor;
- if (de instanceof HpsSiSensor) {
+ if (de instanceof HpsSiSensor)
sensor = (HpsSiSensor) de;
- } else {
+ else
throw new ClassCastException("Detector element " + de.getName() + " couldn't be casted to " + HpsSiSensor.class.getName());
- }
int millepedeId = sensor.getMillepedeId();
- if (_debug > 0) {
+ 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());
- }
-
- if (textFile != null) {
+
+ if (textFile != null)
textFile.printStrip(istrip, millepedeId, de.getName());
- }
//GBLDATA
GBLStripClusterData stripData = new GBLStripClusterData(millepedeId);
@@ -269,27 +257,23 @@
//Center of the sensor
Hep3Vector origin = strip.origin();
- if (textFile != null) {
+ if (textFile != null)
textFile.printOrigin(origin);
- }
// associated 3D position of the crossing of this and it's stereo partner sensor
- if (textFile != null) {
+ if (textFile != null)
textFile.printHitPos3D(hit.getCorrectedPosition());
- }
//Find intercept point with sensor in tracking frame
Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B.z()));
if (trkpos == null) {
- if (_debug > 0) {
+ 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);
- if (textFile != null) {
+ 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");
@@ -303,9 +287,8 @@
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) {
+ 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
@@ -315,25 +298,22 @@
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()) {
+ 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) {
+ 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 (_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
@@ -376,24 +356,20 @@
// calculate isolation to other strip clusters
double stripIsoMin = 9999.9;
- for (SiTrackerHitStrip1D stripHit : stripHits) {
+ 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) {
+ 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) {
+ if (textFile != null)
textFile.printStripIso(stripIsoMin);
- }
//Print residual in measurement system
// start by find the distance vector between the center and the track position
@@ -411,9 +387,8 @@
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) {
+ if (textFile != null)
textFile.printStripMeas(m_meas.x());
- }
//if(textFile != null) {
// textFile.printStripTrackPosMeasFrame(trkpos_meas);
@@ -440,50 +415,293 @@
//GBLDATA
stripData.setMeasErr(res_err_meas.x());
- if (_debug > 0) {
+ if (_debug > 0)
System.out.printf("layer %d millePedeId %d uRes %.10f\n", strip.layer(), millepedeId, res_meas.x());
- }
// sim hit residual
if (simHit != null) {
Hep3Vector simHitPos = CoordinateTransformations.transformVectorToTracking(simHit.getPositionVec());
- if (_debug > 0) {
+ if (_debug > 0)
System.out.printf("simHitPos %s\n", simHitPos.toString());
- }
Hep3Vector vdiffSimHit = VecOp.sub(simHitPos, trkpos);
Hep3Vector simHitPos_meas = VecOp.mult(trkToStripRot, vdiffSimHit);
- if (textFile != null) {
+ if (textFile != null)
textFile.printStripMeasResSimHit(simHitPos_meas.x(), res_err_meas.x());
- }
- } else {
- if (textFile != null) {
- textFile.printStripMeasResSimHit(-999999.9, -999999.9);
- }
- }
+ } else if (textFile != null)
+ textFile.printStripMeasResSimHit(-999999.9, -999999.9);
// find scattering angle
ScatterPoint scatter = scatters.getScatterPoint(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement());
double scatAngle;
- if (scatter != null) {
+ if (scatter != null)
scatAngle = scatter.getScatterAngle().Angle();
- } else {
- if (_debug > 0) {
+ 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(strip, htf, _scattering, _B.magnitude());
}
//print scatterer to file
- if (textFile != null) {
+ if (textFile != null)
textFile.printStripScat(scatAngle);
- }
//GBLDATA
stripData.setScatterAngle(scatAngle);
++istrip;
}
+ }
+
+ if (_addBeamspot)
+ addBeamspotToHitList(htf, stripClusterDataList, istrip, htfTruth);
+
+ }
+
+ /**
+ * Make a pair of HelicalTrackStrips from the beam spot
+ *
+ */
+ private List<HelicalTrackStrip> makeHelicalTrackStripsFromBeamSpot() {
+ Hep3Vector pos = new BasicHep3Vector(0, 0, 0);//hardcode for now....
+ SymmetricMatrix cov = new SymmetricMatrix(3);
+ double beamTilt = 0.03052; //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);
+
+ List<HelicalTrackStrip> htsList = new ArrayList<HelicalTrackStrip>();
+ htsList.add(hitx);
+ htsList.add(hity);
+ 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;
}
}
@@ -500,21 +718,16 @@
// cross-check
if (!mcp_pair.contains(mcp)) {
boolean hasBeamElectronParent = false;
- for (MCParticle parent : mcp.getParents()) {
- if (parent.getGeneratorStatus() != MCParticle.FINAL_STATE && parent.getPDGID() == 11 && parent.getMomentum().y() == 0.0 && Math.abs(parent.getMomentum().magnitude() - _beamEnergy) < 0.01) {
+ for (MCParticle parent : mcp.getParents())
+ if (parent.getGeneratorStatus() != MCParticle.FINAL_STATE && parent.getPDGID() == 11 && parent.getMomentum().y() == 0.0 && Math.abs(parent.getMomentum().magnitude() - _beamEnergy) < 0.01)
hasBeamElectronParent = true;
- }
- }
if (!hasBeamElectronParent) {
System.out.printf("%s: the matched MC particle is not an A' daughter and not a the recoil electrons!?\n", this.getClass().getSimpleName());
System.out.printf("%s: %s %d p %s org %s\n", this.getClass().getSimpleName(), mcp.getGeneratorStatus() == MCParticle.FINAL_STATE ? "F" : "I", mcp.getPDGID(), mcp.getMomentum().toString(), mcp.getOrigin().toString());
printMCParticles(mcParticles);
System.exit(1);
- } else {
- if (_debug > 0) {
- System.out.printf("%s: the matched MC particle is the recoil electron\n", this.getClass().getSimpleName());
- }
- }
+ } else if (_debug > 0)
+ System.out.printf("%s: the matched MC particle is the recoil electron\n", this.getClass().getSimpleName());
}
}
@@ -523,22 +736,19 @@
Map<MCParticle, Integer> particlesOnTrack = new HashMap<MCParticle, Integer>();
- if (debug) {
+ if (debug)
System.out.printf("getmatched mc particle from %d tracker hits on the track \n", track.getTrackerHits().size());
- }
for (TrackerHit hit : track.getTrackerHits()) {
List<MCParticle> mcps = ((HelicalTrackHit) hit).getMCParticles();
- if (mcps == null) {
+ if (mcps == null)
System.out.printf("%s: warning, this hit (layer %d pos=%s) has no mc particles.\n", this.getClass().getSimpleName(), ((HelicalTrackHit) hit).Layer(), ((HelicalTrackHit) hit).getCorrectedPosition().toString());
- } else {
- if (debug) {
+ else {
+ if (debug)
System.out.printf("%s: this hit (layer %d pos=%s) has %d mc particles.\n", this.getClass().getSimpleName(), ((HelicalTrackHit) hit).Layer(), ((HelicalTrackHit) hit).getCorrectedPosition().toString(), mcps.size());
- }
for (MCParticle mcp : mcps) {
- if (!particlesOnTrack.containsKey(mcp)) {
+ if (!particlesOnTrack.containsKey(mcp))
particlesOnTrack.put(mcp, 0);
- }
int c = particlesOnTrack.get(mcp);
particlesOnTrack.put(mcp, c + 1);
}
@@ -547,29 +757,23 @@
if (debug) {
System.out.printf("Track p=[ %f, %f, %f] \n", track.getTrackStates().get(0).getMomentum()[0], track.getTrackStates().get(0).getMomentum()[1], track.getTrackStates().get(0).getMomentum()[1]);
System.out.printf("FOund %d particles\n", particlesOnTrack.size());
- for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet()) {
+ for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet())
System.out.printf("%d hits assigned to %d p=%s \n", entry.getValue(), entry.getKey().getPDGID(), entry.getKey().getMomentum().toString());
- }
}
Map.Entry<MCParticle, Integer> maxEntry = null;
- for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet()) {
- if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0) {
- maxEntry = entry;
- }
- //if ( maxEntry != null ) {
- // if(entry.getValue().compareTo(maxEntry.getValue()) < 0) continue;
- //}
- //maxEntry = entry;
- }
- if (debug) {
- if (maxEntry != null) {
+ for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet())
+ if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
+ maxEntry = entry; //if ( maxEntry != null ) {
+ // if(entry.getValue().compareTo(maxEntry.getValue()) < 0) continue;
+ //}
+ //maxEntry = entry;
+ if (debug)
+ if (maxEntry != null)
System.out.printf("Matched particle with pdgId=%d and mom %s to track with charge %d and momentum [%f %f %f]\n",
maxEntry.getKey().getPDGID(), maxEntry.getKey().getMomentum().toString(),
track.getCharge(), track.getTrackStates().get(0).getMomentum()[0], track.getTrackStates().get(0).getMomentum()[1], track.getTrackStates().get(0).getMomentum()[2]);
- } else {
+ else
System.out.printf("No truth particle found on this track\n");
- }
- }
return maxEntry == null ? null : maxEntry.getKey();
}
@@ -702,27 +906,22 @@
Matrix error_matrix = MatrixOp.inverse(covariance);
BasicMatrix res = (BasicMatrix) MatrixOp.sub(p, pt);
BasicMatrix chi2 = (BasicMatrix) MatrixOp.mult(res, MatrixOp.mult(error_matrix, MatrixOp.transposed(res)));
- if (chi2.getNColumns() != 1 || chi2.getNRows() != 1) {
+ if (chi2.getNColumns() != 1 || chi2.getNRows() != 1)
throw new RuntimeException("matrix dim is screwed up!");
- }
return chi2.e(0, 0);
}
private List<MCParticle> getAprimeDecayProducts(List<MCParticle> mcParticles) {
List<MCParticle> pair = new ArrayList<MCParticle>();
for (MCParticle mcp : mcParticles) {
- if (mcp.getGeneratorStatus() != MCParticle.FINAL_STATE) {
+ if (mcp.getGeneratorStatus() != MCParticle.FINAL_STATE)
continue;
- }
boolean hasAprimeParent = false;
- for (MCParticle parent : mcp.getParents()) {
- if (Math.abs(parent.getPDGID()) == 622) {
+ for (MCParticle parent : mcp.getParents())
+ if (Math.abs(parent.getPDGID()) == 622)
hasAprimeParent = true;
- }
- }
- if (hasAprimeParent) {
+ if (hasAprimeParent)
pair.add(mcp);
- }
}
if (pair.size() != 2) {
System.out.printf("%s: ERROR this event has %d mcp with 622 as parent!!?? \n", this.getClass().getSimpleName(), pair.size());
@@ -747,9 +946,8 @@
System.out.printf("%s: printMCParticles \n", this.getClass().getSimpleName());
System.out.printf("%s: %d mc particles \n", this.getClass().getSimpleName(), mcParticles.size());
for (MCParticle mcp : mcParticles) {
- if (mcp.getGeneratorStatus() != MCParticle.FINAL_STATE) {
+ if (mcp.getGeneratorStatus() != MCParticle.FINAL_STATE)
continue;
- }
System.out.printf("\n%s: (%s) %d p %s org %s %s \n", this.getClass().getSimpleName(),
mcp.getGeneratorStatus() == MCParticle.FINAL_STATE ? "F" : "I", mcp.getPDGID(), mcp.getMomentum().toString(), mcp.getOrigin().toString(),
mcp.getParents().size() > 0 ? "parents:" : "");
@@ -757,11 +955,10 @@
System.out.printf("%s: (%s) %d p %s org %s %s \n", this.getClass().getSimpleName(),
parent.getGeneratorStatus() == MCParticle.FINAL_STATE ? "F" : "I", parent.getPDGID(), parent.getMomentum().toString(), parent.getOrigin().toString(),
parent.getParents().size() > 0 ? "parents:" : "");
- for (MCParticle grparent : parent.getParents()) {
+ for (MCParticle grparent : parent.getParents())
System.out.printf("%s: (%s) %d p %s org %s %s \n", this.getClass().getSimpleName(),
grparent.getGeneratorStatus() == MCParticle.FINAL_STATE ? "F" : "I", grparent.getPDGID(), grparent.getMomentum().toString(), grparent.getOrigin().toString(),
grparent.getParents().size() > 0 ? "parents:" : "");
- }
}
}
@@ -855,29 +1052,28 @@
trans.setElement(2, 1, VecOp.dot(J, T));
trans.setElement(2, 2, VecOp.dot(K, T));
return trans;
-
+
/*
- Hep3Vector B = new BasicHep3Vector(0, 0, 1); // TODO sign convention?
- Hep3Vector H = VecOp.mult(1 / bfield, B);
- Hep3Vector T = HelixUtils.Direction(helix, 0.);
- Hep3Vector HcrossT = VecOp.cross(H, T);
- double alpha = HcrossT.magnitude(); // this should be Bvec cross TrackDir/|B|
- double Q = Math.abs(bfield) * q / p;
- Hep3Vector Z = new BasicHep3Vector(0, 0, 1);
- Hep3Vector J = VecOp.mult(1. / VecOp.cross(T, Z).magnitude(), VecOp.cross(T, Z));
- Hep3Vector K = Z;
- Hep3Vector U = VecOp.mult(-1, J);
- Hep3Vector V = VecOp.cross(T, U);
- Hep3Vector I = VecOp.cross(J, K);
- Hep3Vector N = VecOp.mult(1 / alpha, VecOp.cross(H, T)); //-cross(T,H)/alpha = -cross(T,Z) = -J
- double UdotI = VecOp.dot(U, I); // 0,0
- double NdotV = VecOp.dot(N, V); // 1,1?
- double NdotU = VecOp.dot(N, U); // 0,1?
- double TdotI = VecOp.dot(T, I); // 2,0
- double VdotI = VecOp.dot(V, I); // 1,0
- double VdotK = VecOp.dot(V, K); // 1,2
-*/
-
+ Hep3Vector B = new BasicHep3Vector(0, 0, 1); // TODO sign convention?
+ Hep3Vector H = VecOp.mult(1 / bfield, B);
+ Hep3Vector T = HelixUtils.Direction(helix, 0.);
+ Hep3Vector HcrossT = VecOp.cross(H, T);
+ double alpha = HcrossT.magnitude(); // this should be Bvec cross TrackDir/|B|
+ double Q = Math.abs(bfield) * q / p;
+ Hep3Vector Z = new BasicHep3Vector(0, 0, 1);
+ Hep3Vector J = VecOp.mult(1. / VecOp.cross(T, Z).magnitude(), VecOp.cross(T, Z));
+ Hep3Vector K = Z;
+ Hep3Vector U = VecOp.mult(-1, J);
+ Hep3Vector V = VecOp.cross(T, U);
+ Hep3Vector I = VecOp.cross(J, K);
+ Hep3Vector N = VecOp.mult(1 / alpha, VecOp.cross(H, T)); //-cross(T,H)/alpha = -cross(T,Z) = -J
+ double UdotI = VecOp.dot(U, I); // 0,0
+ double NdotV = VecOp.dot(N, V); // 1,1?
+ double NdotU = VecOp.dot(N, U); // 0,1?
+ double TdotI = VecOp.dot(T, I); // 2,0
+ double VdotI = VecOp.dot(V, I); // 1,0
+ double VdotK = VecOp.dot(V, K); // 1,2
+ */
}
public static class ClParams {
@@ -886,9 +1082,8 @@
public ClParams(HelicalTrackFit htf, double B) {
- if (htf == null) {
+ if (htf == null)
return;
- }
Hep3Matrix perToClPrj = getPerToClPrj(htf);
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 Fri Sep 18 10:05:13 2015
@@ -58,6 +58,7 @@
private int totalTracksProcessed = 0;
private int iTrack = 0;
private int iEvent = 0;
+ private boolean _addBeamspot=false;
public GBLOutputDriver() {
}
@@ -72,6 +73,7 @@
gbl.buildModel(detector);
gbl.setAPrimeEventFlag(false);
gbl.setXPlaneFlag(false);
+ gbl.setAddBeamspot(_addBeamspot);
//Create the class that makes residual plots for cross-checking
//truthRes = new TruthResiduals(bfield);
@@ -208,4 +210,8 @@
this.isMC = isMC;
}
+ public void setAddBeamspot(boolean add){
+ this._addBeamspot=add;
+ }
+
}
Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
=============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java (original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java Fri Sep 18 10:05:13 2015
@@ -212,6 +212,9 @@
int n_strips = hits.size();
for (int istrip = 0; istrip != n_strips; ++istrip) {
GBLStripClusterData strip = hits.get(istrip);
+ //MG--9/18/2015--beamspot has Id=666/667...don't include it in the GBL fit
+ if(strip.getId()>99)
+ continue;
if (_debug) {
System.out.println("HpsGblFitter: Processing strip " + istrip + " with id/layer " + strip.getId());
}
|