Author: [log in to unmask] Date: Thu Oct 1 18:39:46 2015 New Revision: 3749 Log: more cleanup to GBL Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java 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/GblUtils.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java Thu Oct 1 18:39:46 2015 @@ -994,16 +994,12 @@ } public static double getTrackTime(Track track, RelationalTable hitToStrips, RelationalTable hitToRotated) { - int nStrips = 0; double meanTime = 0; - for (TrackerHit hit : track.getTrackerHits()) { - Set<TrackerHit> htsList = hitToStrips.allFrom(hitToRotated.from(hit)); - for (TrackerHit hts : htsList) { - nStrips++; - meanTime += hts.getTime(); - } - } - meanTime /= nStrips; + List<TrackerHit> stripHits = getStripHits(track, hitToStrips, hitToRotated); + for (TrackerHit hit : stripHits) { + meanTime += hit.getTime(); + } + meanTime /= stripHits.size(); return meanTime; } @@ -1280,4 +1276,8 @@ } return null; } + + public static Hep3Vector getBField(Detector detector) { + return detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 500.0)); + } } Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/FittedGblTrajectory.java Thu Oct 1 18:39:46 2015 @@ -56,12 +56,6 @@ _ndf = ndf; _lost = lost; } - public void set_track_data(GBLTrackData t) { - _t = t; - } - public GBLTrackData get_track_data() { - return _t; - } public void set_seed(Track seed) { _seed = seed; } 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 Thu Oct 1 18:39:46 2015 @@ -13,7 +13,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.math3.util.Pair; import org.hps.recon.tracking.CoordinateTransformations; import org.hps.recon.tracking.MaterialSupervisor; import org.hps.recon.tracking.MultipleScattering; @@ -21,15 +20,8 @@ import org.hps.recon.tracking.MultipleScattering.ScatterPoints; import org.hps.recon.tracking.TrackUtils; import org.hps.recon.tracking.TrackerHitUtils; -import org.lcsim.detector.DetectorIdentifierHelper; import org.lcsim.detector.IDetectorElement; -import org.lcsim.detector.ITransform3D; -import org.lcsim.detector.identifier.IIdentifier; -import org.lcsim.detector.identifier.IIdentifierHelper; -import org.lcsim.detector.tracker.silicon.ChargeCarrier; import org.lcsim.detector.tracker.silicon.HpsSiSensor; -import org.lcsim.detector.tracker.silicon.SiSensor; -import org.lcsim.detector.tracker.silicon.SiSensorElectrodes; import org.lcsim.event.MCParticle; import org.lcsim.event.RawTrackerHit; import org.lcsim.event.SimTrackerHit; @@ -468,7 +460,7 @@ 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()); + scatAngle = GblUtils.estimateScatter(sensor, htf, _scattering, _B.magnitude()); } //GBLDATA @@ -486,223 +478,6 @@ addBeamspotToHitList(htf, stripClusterDataList, istrip, htfTruth); } - } - - static List<GBLStripClusterData> printGBL(HelicalTrackFit htf, List<SiTrackerHitStrip1D> hitsOnTrack, MultipleScattering _scattering, double _B, int _debug) { - List<GBLStripClusterData> stripClusterDataList = new ArrayList<GBLStripClusterData>(); - - // Find scatter points along the path - ScatterPoints scatters = _scattering.FindHPSScatterPoints(htf); - - if (_debug > 0) { - System.out.printf("perPar covariance matrix\n%s\n", htf.covariance().toString()); - } - - for (SiTrackerHitStrip1D hitOnTrack : hitsOnTrack) { - HelicalTrackStripGbl strip = new HelicalTrackStripGbl(makeDigiStrip(hitOnTrack), true); - - // 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(); - - if (_debug > 0) { - System.out.printf("layer %d millepede %d (DE=\"%s\", origin %s) \n", strip.layer(), millepedeId, sensor.getName(), strip.origin().toString()); - } - - //Center of the sensor - Hep3Vector origin = strip.origin(); - - //Find intercept point with sensor in tracking frame - Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B)); - if (trkpos == null) { - if (_debug > 0) { - System.out.println("Can't find track intercept; use sensor origin"); - } - trkpos = strip.origin(); - } - if (_debug > 0) { - System.out.printf("trkpos at intercept [%.10f %.10f %.10f]\n", trkpos.x(), trkpos.y(), trkpos.z()); - } - - //GBLDATA - GBLStripClusterData stripData = new GBLStripClusterData(millepedeId); - //Add to output list - stripClusterDataList.add(stripData); - - //path length to intercept - double s = HelixUtils.PathToXPlane(htf, trkpos.x(), 0, 0).get(0); - double s3D = s / Math.cos(Math.atan(htf.slope())); - - //GBLDATA - stripData.setPath(s); - stripData.setPath3D(s3D); - - //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()); - - //GBLDATA - stripData.setTrackDir(tDir); - stripData.setTrackPhi(phi); - stripData.setTrackLambda(lambda); - - //Print residual in measurement system - // start by find the distance vector between the center and the track position - Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin); - - // then find the rotation from tracking to measurement frame - Hep3Matrix trkToStripRot = getTrackToStripRotation(strip.getStrip()); - - // then rotate that vector into the measurement frame to get the predicted measurement position - Hep3Vector trkpos_meas = VecOp.mult(trkToStripRot, vdiffTrk); - - //GBLDATA - stripData.setMeas(strip.umeas()); - stripData.setTrackPos(trkpos_meas); - stripData.setMeasErr(strip.du()); - - if (_debug > 1) { - System.out.printf("rotation matrix to meas frame\n%s\n", VecOp.toString(trkToStripRot)); - System.out.printf("tPosGlobal %s origin %s\n", trkpos.toString(), origin.toString()); - System.out.printf("tDiff %s\n", vdiffTrk.toString()); - System.out.printf("tPosMeas %s\n", trkpos_meas.toString()); - } - - if (_debug > 0) { - System.out.printf("layer %d millePedeId %d uRes %.10f\n", strip.layer(), millepedeId, stripData.getMeas() - stripData.getTrackPos().x()); - } - - // 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("WARNING cannot find scatter for detector %s with strip cluster at %s\n", ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString()); - } - scatAngle = GblUtils.estimateScatter(strip, htf, _scattering, _B); - } - - //GBLDATA - stripData.setScatterAngle(scatAngle); - } - return stripClusterDataList; - } - - private static Hep3Matrix getTrackToStripRotation(HelicalTrackStrip strip) { - // This function transforms the hit to the sensor coordinates - - // Transform from JLab frame to sensor frame (done through the RawTrackerHit) - RawTrackerHit rth = (RawTrackerHit) strip.rawhits().get(0); - IDetectorElement ide = rth.getDetectorElement(); - SiSensor sensor = ide.findDescendants(SiSensor.class).get(0); - SiSensorElectrodes electrodes = sensor.getReadoutElectrodes(ChargeCarrier.HOLE); - ITransform3D detToStrip = electrodes.getGlobalToLocal(); - // Get rotation matrix - Hep3Matrix detToStripMatrix = detToStrip.getRotation().getRotationMatrix(); - // Transformation between the JLAB and tracking coordinate systems - Hep3Matrix detToTrackMatrix = CoordinateTransformations.getMatrix(); - - return VecOp.mult(detToStripMatrix, VecOp.inverse(detToTrackMatrix)); - } - - private static String getName(IDetectorElement de) { - // Find the first level down from the top of the de tree - while (de.getParent().getParent() != null) { - de = de.getParent(); - } - // Find the name of this detector - String detname = de.getName(); - return detname; - } - - private static int getLayer(IDetectorElement de) { - int layer = -1; - IIdentifierHelper hlp = de.getIdentifierHelper(); - if (hlp instanceof DetectorIdentifierHelper) { - DetectorIdentifierHelper dehlp = (DetectorIdentifierHelper) hlp; - // Get the identifier - IIdentifier id = de.getIdentifier(); - // Get the layer number - layer = dehlp.getLayerValue(id); - } - return layer; - } - - private static BarrelEndcapFlag getBarrelEndcapFlag(IDetectorElement de) { - BarrelEndcapFlag beflag = BarrelEndcapFlag.UNKNOWN; - // Find the second level down from the top of the de tree - while (de.getParent().getParent().getParent() != null) { - de = de.getParent(); - } - // Get the DetectorIdentifierHelper - IIdentifierHelper hlp = de.getIdentifierHelper(); - if (hlp instanceof DetectorIdentifierHelper) { - DetectorIdentifierHelper dehlp = (DetectorIdentifierHelper) hlp; - // Get the identifier - IIdentifier id = de.getIdentifier(); - // Get the BarrelEndcapFlag - if (dehlp.isBarrel(id)) { - beflag = BarrelEndcapFlag.BARREL; - } else if (dehlp.isEndcapPositive(id)) { - beflag = BarrelEndcapFlag.ENDCAP_NORTH; - } else if (dehlp.isEndcapNegative(id)) { - beflag = BarrelEndcapFlag.ENDCAP_SOUTH; - } - } - return beflag; - } - - private static HelicalTrackStrip makeDigiStrip(SiTrackerHitStrip1D h) { - SiTrackerHitStrip1D local = h.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR); - SiTrackerHitStrip1D global = h.getTransformedHit(TrackerHitType.CoordinateSystem.GLOBAL); - - ITransform3D trans = local.getLocalToGlobal(); - Hep3Vector org = trans.transformed(new BasicHep3Vector(0., 0., 0.)); - Hep3Vector u = global.getMeasuredCoordinate(); - Hep3Vector v = global.getUnmeasuredCoordinate(); - - double umeas = local.getPosition()[0]; - double vmin = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getStartPoint()); - double vmax = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getEndPoint()); - double du = Math.sqrt(local.getCovarianceAsMatrix().diagonal(0)); - - IDetectorElement de = h.getSensor(); - String det = getName(de); - int lyr = getLayer(de); - BarrelEndcapFlag be = getBarrelEndcapFlag(de); - - double dEdx = h.getdEdx(); - double time = h.getTime(); - List<RawTrackerHit> rawhits = h.getRawHits(); - HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du, vmin, vmax, dEdx, time, rawhits, det, lyr, be); - - try { - if (h.getMCParticles() != null) { - for (MCParticle p : h.getMCParticles()) { - strip.addMCParticle(p); - } - } - } catch (RuntimeException e) { - // Okay when MC info not present. - } - - return strip; } /** 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 Thu Oct 1 18:39:46 2015 @@ -65,7 +65,7 @@ @Override public void detectorChanged(Detector detector) { - Hep3Vector bfield = detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 500.0)); + Hep3Vector bfield = TrackUtils.getBField(detector); // Create the class that handles all the GBL output gbl = new GBLOutput(gblFileName, bfield); // if filename is empty no text file is written Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java Thu Oct 1 18:39:46 2015 @@ -1,12 +1,30 @@ package org.hps.recon.tracking.gbl; import hep.physics.matrix.BasicMatrix; +import hep.physics.vec.BasicHep3Vector; +import hep.physics.vec.Hep3Matrix; +import hep.physics.vec.Hep3Vector; +import hep.physics.vec.VecOp; +import java.util.ArrayList; +import java.util.List; +import org.hps.recon.tracking.CoordinateTransformations; import org.hps.recon.tracking.MaterialSupervisor; import org.hps.recon.tracking.MultipleScattering; +import org.hps.recon.tracking.TrackUtils; +import org.lcsim.constants.Constants; import org.lcsim.detector.IDetectorElement; +import org.lcsim.detector.ITransform3D; +import org.lcsim.detector.tracker.silicon.ChargeCarrier; +import org.lcsim.detector.tracker.silicon.HpsSiSensor; +import org.lcsim.detector.tracker.silicon.SiSensor; +import org.lcsim.detector.tracker.silicon.SiSensorElectrodes; import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.TrackerHit; import org.lcsim.fit.helicaltrack.HelicalTrackFit; +import org.lcsim.fit.helicaltrack.HelicalTrackStrip; import org.lcsim.fit.helicaltrack.HelixUtils; +import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D; +import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType; import org.lcsim.recon.tracking.seedtracker.ScatterAngle; /** @@ -82,12 +100,11 @@ return mat; } - public static double estimateScatter(HelicalTrackStripGbl strip, HelicalTrackFit htf, MultipleScattering scattering, double _B) { + public static double estimateScatter(IDetectorElement hitElement, HelicalTrackFit htf, MultipleScattering scattering, double _B) { //can be edge case where helix is outside, but close to sensor, so make a new scatter point assuming the helix does pass through the sensor MaterialSupervisor.DetectorPlane hitPlane = null; if (MaterialSupervisor.class.isInstance(scattering.getMaterialManager())) { MaterialSupervisor matSup = (MaterialSupervisor) scattering.getMaterialManager(); - IDetectorElement hitElement = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement(); for (MaterialSupervisor.ScatteringDetectorVolume vol : matSup.getMaterialVolumes()) { if (vol.getDetectorElement() == hitElement) { hitPlane = (MaterialSupervisor.DetectorPlane) vol; @@ -107,4 +124,174 @@ throw new UnsupportedOperationException("Should not happen. This problem is only solved with the MaterialSupervisor."); } } + + public static FittedGblTrajectory doGBLFit(HelicalTrackFit htf, List<TrackerHit> stripHits, MultipleScattering _scattering, double bfield, int debug) { + List<GBLStripClusterData> stripData = makeStripData(htf, stripHits, _scattering, bfield, debug); + double bfac = Constants.fieldConversion * bfield; + + FittedGblTrajectory fit = HpsGblRefitter.fit(stripData, bfac, debug > 0); + return fit; + } + + public static List<GBLStripClusterData> makeStripData(HelicalTrackFit htf, List<TrackerHit> stripHits, MultipleScattering _scattering, double _B, int _debug) { + List<GBLStripClusterData> stripClusterDataList = new ArrayList<GBLStripClusterData>(); + + // Find scatter points along the path + MultipleScattering.ScatterPoints scatters = _scattering.FindHPSScatterPoints(htf); + + if (_debug > 0) { + System.out.printf("perPar covariance matrix\n%s\n", htf.covariance().toString()); + } + + for (TrackerHit stripHit : stripHits) { + HelicalTrackStripGbl strip; + if (stripHit instanceof SiTrackerHitStrip1D) { + strip = new HelicalTrackStripGbl(makeDigiStrip((SiTrackerHitStrip1D) stripHit), true); + } else { + SiTrackerHitStrip1D newHit = new SiTrackerHitStrip1D(stripHit); + strip = new HelicalTrackStripGbl(makeDigiStrip(newHit), true); + } + + // find Millepede layer definition from DetectorElement + HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) stripHit.getRawHits().get(0)).getDetectorElement(); + + int millepedeId = sensor.getMillepedeId(); + + if (_debug > 0) { + System.out.printf("layer %d millepede %d (DE=\"%s\", origin %s) \n", strip.layer(), millepedeId, sensor.getName(), strip.origin().toString()); + } + + //Center of the sensor + Hep3Vector origin = strip.origin(); + + //Find intercept point with sensor in tracking frame + Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B)); + if (trkpos == null) { + if (_debug > 0) { + System.out.println("Can't find track intercept; use sensor origin"); + } + trkpos = strip.origin(); + } + if (_debug > 0) { + System.out.printf("trkpos at intercept [%.10f %.10f %.10f]\n", trkpos.x(), trkpos.y(), trkpos.z()); + } + + //GBLDATA + GBLStripClusterData stripData = new GBLStripClusterData(millepedeId); + //Add to output list + stripClusterDataList.add(stripData); + + //path length to intercept + double s = HelixUtils.PathToXPlane(htf, trkpos.x(), 0, 0).get(0); + double s3D = s / Math.cos(Math.atan(htf.slope())); + + //GBLDATA + stripData.setPath(s); + stripData.setPath3D(s3D); + + //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()); + + //GBLDATA + stripData.setTrackDir(tDir); + stripData.setTrackPhi(phi); + stripData.setTrackLambda(lambda); + + //Print residual in measurement system + // start by find the distance vector between the center and the track position + Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin); + + // then find the rotation from tracking to measurement frame + Hep3Matrix trkToStripRot = getTrackToStripRotation(sensor); + + // then rotate that vector into the measurement frame to get the predicted measurement position + Hep3Vector trkpos_meas = VecOp.mult(trkToStripRot, vdiffTrk); + + //GBLDATA + stripData.setMeas(strip.umeas()); + stripData.setTrackPos(trkpos_meas); + stripData.setMeasErr(strip.du()); + + if (_debug > 1) { + System.out.printf("rotation matrix to meas frame\n%s\n", VecOp.toString(trkToStripRot)); + System.out.printf("tPosGlobal %s origin %s\n", trkpos.toString(), origin.toString()); + System.out.printf("tDiff %s\n", vdiffTrk.toString()); + System.out.printf("tPosMeas %s\n", trkpos_meas.toString()); + } + + if (_debug > 0) { + System.out.printf("layer %d millePedeId %d uRes %.10f\n", strip.layer(), millepedeId, stripData.getMeas() - stripData.getTrackPos().x()); + } + + // find scattering angle + MultipleScattering.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("WARNING cannot find scatter for detector %s with strip cluster at %s\n", ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString()); + } + scatAngle = GblUtils.estimateScatter(sensor, htf, _scattering, _B); + } + + //GBLDATA + stripData.setScatterAngle(scatAngle); + } + return stripClusterDataList; + } + + private static Hep3Matrix getTrackToStripRotation(SiSensor sensor) { + // This function transforms the hit to the sensor coordinates + + // Transform from JLab frame to sensor frame (done through the RawTrackerHit) + SiSensorElectrodes electrodes = sensor.getReadoutElectrodes(ChargeCarrier.HOLE); + ITransform3D detToStrip = electrodes.getGlobalToLocal(); + // Get rotation matrix + Hep3Matrix detToStripMatrix = detToStrip.getRotation().getRotationMatrix(); + // Transformation between the JLAB and tracking coordinate systems + Hep3Matrix detToTrackMatrix = CoordinateTransformations.getMatrix(); + + return VecOp.mult(detToStripMatrix, VecOp.inverse(detToTrackMatrix)); + } + + private static HelicalTrackStrip makeDigiStrip(SiTrackerHitStrip1D h) { + SiTrackerHitStrip1D local = h.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR); + SiTrackerHitStrip1D global = h.getTransformedHit(TrackerHitType.CoordinateSystem.GLOBAL); + + ITransform3D trans = local.getLocalToGlobal(); + Hep3Vector org = trans.transformed(new BasicHep3Vector(0., 0., 0.)); + Hep3Vector u = global.getMeasuredCoordinate(); + Hep3Vector v = global.getUnmeasuredCoordinate(); + + //rotate to tracking frame + Hep3Vector neworigin = CoordinateTransformations.transformVectorToTracking(org); + Hep3Vector newu = CoordinateTransformations.transformVectorToTracking(u); + Hep3Vector newv = CoordinateTransformations.transformVectorToTracking(v); + + double umeas = local.getPosition()[0]; + double vmin = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getStartPoint()); + double vmax = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getEndPoint()); + double du = Math.sqrt(local.getCovarianceAsMatrix().diagonal(0)); + + //don't fill fields we don't use +// IDetectorElement de = h.getSensor(); +// String det = getName(de); +// int lyr = getLayer(de); +// BarrelEndcapFlag be = getBarrelEndcapFlag(de); + double dEdx = h.getdEdx(); + double time = h.getTime(); + List<RawTrackerHit> rawhits = h.getRawHits(); + HelicalTrackStrip strip = new HelicalTrackStrip(neworigin, newu, newv, umeas, du, vmin, vmax, dEdx, time, rawhits, null, -1, null); + + return strip; + } } Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java Thu Oct 1 18:39:46 2015 @@ -303,7 +303,7 @@ if (_debug) { 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); + scatAngle = GblUtils.estimateScatter(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement(), htf, _scattering, _B); } // Scattering angle in the curvilinear frame 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 Thu Oct 1 18:39:46 2015 @@ -13,6 +13,7 @@ import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.Logger; +import org.hps.recon.tracking.TrackUtils; import org.hps.recon.tracking.gbl.matrix.Matrix; import org.hps.recon.tracking.gbl.matrix.SymMatrix; import org.hps.recon.tracking.gbl.matrix.Vector; @@ -94,9 +95,7 @@ @Override protected void process(EventHeader event) { -// Hep3Vector bfieldvec = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 1.)); - Hep3Vector bfieldvec = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 500.));//mg...get the b-field in the middle of the magnet - double bfield = bfieldvec.y(); + double bfield = TrackUtils.getBField(event.getDetector()).y(); //double bfac = 0.0002998 * bfield; double bfac = Constants.fieldConversion * bfield; @@ -155,11 +154,9 @@ // loop over the tracks and do the GBL fit List<FittedGblTrajectory> trackFits = new ArrayList<FittedGblTrajectory>(); - int trackNum = 0; logger.info("Trying to fit " + stripsGblMap.size() + " tracks"); for (GBLTrackData t : stripsGblMap.keySet()) { FittedGblTrajectory traj = fit(stripsGblMap.get(t), bfac, _debug); - ++trackNum; if (traj != null) { logger.info("GBL fit successful"); if (_debug) { @@ -170,7 +167,6 @@ traj.get_traj().milleOut(mille); } traj.set_seed(gblToSeedMap.get(t)); - traj.set_track_data(t); trackFits.add(traj); } else { logger.info("GBL fit failed"); @@ -194,7 +190,7 @@ } - private static FittedGblTrajectory fit(List<GBLStripClusterData> hits, double bfac, boolean debug) { + public static FittedGblTrajectory fit(List<GBLStripClusterData> hits, double bfac, boolean debug) { // path length along trajectory double s = 0.; Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java Thu Oct 1 18:39:46 2015 @@ -13,6 +13,7 @@ import org.apache.commons.math3.util.Pair; import org.hps.recon.tracking.TrackType; +import static org.hps.recon.tracking.gbl.GBLOutput.getPerToClPrj; import org.hps.recon.tracking.gbl.matrix.Matrix; import org.hps.recon.tracking.gbl.matrix.SymMatrix; import org.hps.recon.tracking.gbl.matrix.Vector; @@ -50,10 +51,11 @@ } public void setDebug(boolean debug) { - if (debug) + if (debug) { logger.setLevel(Level.INFO); - else + } else { logger.setLevel(Level.OFF); + } } /** @@ -72,50 +74,14 @@ for (FittedGblTrajectory fittedTraj : gblTrajectories) { - // Initialize the reference point to the origin - double[] ref = new double[]{0., 0., 0.}; SeedTrack seedTrack = (SeedTrack) fittedTraj.get_seed(); SeedCandidate trackseed = seedTrack.getSeedCandidate(); - // Create a new SeedTrack - BaseTrack trk = new BaseTrack(); - - // Add the hits to the track - for (HelicalTrackHit hit : trackseed.getHits()) { - trk.addHit((TrackerHit) hit); - } - - // Retrieve the helix - HelicalTrackFit helix = trackseed.getHelix(); - // Set state at vertex - Pair<double[], SymmetricMatrix> correctedHelixParams = getGblCorrectedHelixParameters(helix, fittedTraj, bfield, FittedGblTrajectory.GBLPOINT.IP); - trk.setTrackParameters(correctedHelixParams.getFirst(), bfield);// hack to set the track charge - trk.getTrackStates().clear(); - - TrackState stateVertex = new BaseTrackState(correctedHelixParams.getFirst(), ref, correctedHelixParams.getSecond().asPackedArray(true), TrackState.AtIP, bfield); - trk.getTrackStates().add(stateVertex); - - // Set state at last point - Pair<double[], SymmetricMatrix> correctedHelixParamsLast = getGblCorrectedHelixParameters(helix, fittedTraj, bfield, FittedGblTrajectory.GBLPOINT.LAST); - TrackState stateLast = new BaseTrackState(correctedHelixParamsLast.getFirst(), ref, correctedHelixParamsLast.getSecond().asPackedArray(true), TrackState.AtLastHit, bfield); - trk.getTrackStates().add(stateLast); - - // Set other info needed - trk.setChisq(fittedTraj.get_chi2()); - trk.setNDF(fittedTraj.get_ndf()); - trk.setFitSuccess(true); - trk.setRefPointIsDCA(true); - trk.setTrackType(TrackType.setGBL(seedTrack.getType(), true)); - + // Create a new Track + Track trk = makeCorrectedTrack(fittedTraj, trackseed.getHelix(), seedTrack.getTrackerHits(), seedTrack.getType(), bfield); + // Add the track to the list of tracks tracks.add(trk); - logger.info(String.format("helix chi2 %f ndf %d gbl chi2 %f ndf %d\n", helix.chisqtot(), helix.ndf()[0] + helix.ndf()[1], trk.getChi2(), trk.getNDF())); - if (logger.getLevel().intValue() <= Level.INFO.intValue()) { - for (int i = 0; i < 5; ++i) { - logger.info(String.format("param %d: %.10f -> %.10f helix-gbl= %f", i, helix.parameters()[i], trk.getTrackParameter(i), helix.parameters()[i] - trk.getTrackParameter(i))); - } - } - } logger.info("adding " + Integer.toString(tracks.size()) + " Gbl tracks to event with " + event.get(Track.class, "MatchedTracks").size() + " matched tracks"); @@ -125,16 +91,59 @@ event.put(_TrkCollectionName, tracks, Track.class, flag); } - + public static Track makeCorrectedTrack(FittedGblTrajectory fittedTraj, HelicalTrackFit helix, List<TrackerHit> trackHits, int trackType, double bfield) { + // Initialize the reference point to the origin + double[] ref = new double[]{0., 0., 0.}; + + // Create a new SeedTrack + BaseTrack trk = new BaseTrack(); + + // Add the hits to the track + for (TrackerHit hit : trackHits) { + trk.addHit(hit); + } + + // Set state at vertex + Pair<double[], SymmetricMatrix> correctedHelixParams = getGblCorrectedHelixParameters(helix, fittedTraj.get_traj(), bfield, FittedGblTrajectory.GBLPOINT.IP); + trk.setTrackParameters(correctedHelixParams.getFirst(), bfield);// hack to set the track charge + trk.getTrackStates().clear(); + + TrackState stateVertex = new BaseTrackState(correctedHelixParams.getFirst(), ref, correctedHelixParams.getSecond().asPackedArray(true), TrackState.AtIP, bfield); + trk.getTrackStates().add(stateVertex); + + // Set state at last point + Pair<double[], SymmetricMatrix> correctedHelixParamsLast = getGblCorrectedHelixParameters(helix, fittedTraj.get_traj(), bfield, FittedGblTrajectory.GBLPOINT.LAST); + TrackState stateLast = new BaseTrackState(correctedHelixParamsLast.getFirst(), ref, correctedHelixParamsLast.getSecond().asPackedArray(true), TrackState.AtLastHit, bfield); + trk.getTrackStates().add(stateLast); + + // Set other info needed + trk.setChisq(fittedTraj.get_chi2()); + trk.setNDF(fittedTraj.get_ndf()); + trk.setFitSuccess(true); + trk.setRefPointIsDCA(true); + trk.setTrackType(TrackType.setGBL(trackType, true)); + + // Add the track to the list of tracks +// tracks.add(trk); + logger.info(String.format("helix chi2 %f ndf %d gbl chi2 %f ndf %d\n", helix.chisqtot(), helix.ndf()[0] + helix.ndf()[1], trk.getChi2(), trk.getNDF())); + if (logger.getLevel().intValue() <= Level.INFO.intValue()) { + for (int i = 0; i < 5; ++i) { + logger.info(String.format("param %d: %.10f -> %.10f helix-gbl= %f", i, helix.parameters()[i], trk.getTrackParameter(i), helix.parameters()[i] - trk.getTrackParameter(i))); + } + } + return trk; + } + /** - * Compute the updated helix parameters and covariance matrix at a given point along the trajectory. + * Compute the updated helix parameters and covariance matrix at a given + * point along the trajectory. * * @param helix - original seed track * @param traj - fitted GBL trajectory * @param point - the point along the track where the result is computed. * @return corrected parameters. */ - private Pair<double[], SymmetricMatrix> getGblCorrectedHelixParameters(HelicalTrackFit helix, FittedGblTrajectory traj, double bfield, FittedGblTrajectory.GBLPOINT point) { + public static Pair<double[], SymmetricMatrix> getGblCorrectedHelixParameters(HelicalTrackFit helix, GblTrajectory traj, double bfield, FittedGblTrajectory.GBLPOINT point) { // get seed helix parameters double qOverP = helix.curvature() / (Constants.fieldConversion * Math.abs(bfield) * Math.sqrt(1 + Math.pow(helix.slope(), 2))); @@ -151,14 +160,15 @@ Vector locPar = new Vector(5); SymMatrix locCov = new SymMatrix(5); int pointIndex; - if( point.compareTo( FittedGblTrajectory.GBLPOINT.IP) == 0 ) + if (point.compareTo(FittedGblTrajectory.GBLPOINT.IP) == 0) { pointIndex = 1; - else if (point.compareTo(FittedGblTrajectory.GBLPOINT.LAST) == 0) - pointIndex = traj.get_traj().getNumPoints(); - else + } else if (point.compareTo(FittedGblTrajectory.GBLPOINT.LAST) == 0) { + pointIndex = traj.getNumPoints(); + } else { throw new RuntimeException("This GBLPOINT " + point.toString() + "( " + point.name() + ") is not valid"); - - traj.get_traj().getResults(pointIndex, locPar, locCov); // vertex point + } + + traj.getResults(pointIndex, locPar, locCov); // vertex point // locCov.print(10, 8); double qOverPCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.QOVERP.getValue()); double xTPrimeCorr = locPar.get(FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue()); @@ -169,7 +179,9 @@ logger.info((helix.slope() > 0 ? "top: " : "bot ") + "qOverPCorr " + qOverPCorr + " xtPrimeCorr " + xTPrimeCorr + " yTPrimeCorr " + yTPrimeCorr + " xTCorr " + xTCorr + " yTCorr " + yTCorr); // calculate new d0 and z0 - Hep3Matrix perToClPrj = traj.get_track_data().getPrjPerToCl(); +// Hep3Matrix perToClPrj = traj.get_track_data().getPrjPerToCl(); + Hep3Matrix perToClPrj = getPerToClPrj(helix); + Hep3Matrix clToPerPrj = VecOp.inverse(perToClPrj); Hep3Vector corrPer = VecOp.mult(clToPerPrj, new BasicHep3Vector(xTCorr, yTCorr, 0.0));