Author: [log in to unmask] Date: Thu Sep 3 19:18:59 2015 New Revision: 3520 Log: dedupe tracks with identical hit content before making GBL info Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.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 Sep 3 19:18:59 2015 @@ -940,10 +940,15 @@ return meanTime; } + public static List<TrackerHit> getStripHits(Track track, RelationalTable hitToStrips, RelationalTable hitToRotated) { + List<TrackerHit> hits = new ArrayList<TrackerHit>(); + for (TrackerHit hit : track.getTrackerHits()) + hits.addAll(hitToStrips.allFrom(hitToRotated.from(hit))); + return hits; + } + public static boolean hasSharedStrips(Track track1, Track track2, RelationalTable hitToStrips, RelationalTable hitToRotated) { - Set<TrackerHit> track1hits = new HashSet<TrackerHit>(); - for (TrackerHit hit : track1.getTrackerHits()) - track1hits.addAll(hitToStrips.allFrom(hitToRotated.from(hit))); + Set<TrackerHit> track1hits = new HashSet<TrackerHit>(getStripHits(track1, hitToStrips, hitToRotated)); for (TrackerHit hit : track2.getTrackerHits()) for (TrackerHit hts : (Set<TrackerHit>) hitToStrips.allFrom(hitToRotated.from(hit))) if (track1hits.contains(hts)) 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 Sep 3 19:18:59 2015 @@ -15,14 +15,11 @@ import java.util.Map; import org.hps.recon.tracking.CoordinateTransformations; import org.hps.recon.tracking.MaterialSupervisor; -import org.hps.recon.tracking.MaterialSupervisor.DetectorPlane; -import org.hps.recon.tracking.MaterialSupervisor.ScatteringDetectorVolume; import org.hps.recon.tracking.MultipleScattering; import org.hps.recon.tracking.MultipleScattering.ScatterPoint; import org.hps.recon.tracking.MultipleScattering.ScatterPoints; import org.hps.recon.tracking.TrackUtils; import org.hps.recon.tracking.TrackerHitUtils; -import org.lcsim.constants.Constants; import org.lcsim.detector.IDetectorElement; import org.lcsim.detector.tracker.silicon.HpsSiSensor; import org.lcsim.event.MCParticle; @@ -38,7 +35,6 @@ import org.lcsim.geometry.Detector; import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D; import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType; -import org.lcsim.recon.tracking.seedtracker.ScatterAngle; import org.lcsim.recon.tracking.seedtracker.SeedCandidate; import org.lcsim.recon.tracking.seedtracker.SeedTrack; @@ -197,13 +193,6 @@ } } - //GBLDATA - 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) { textFile.printChi2(htf.chisq(), htf.ndf()); @@ -226,8 +215,7 @@ } // dummy cov matrix for CL parameters - BasicMatrix clCov = new BasicMatrix(5, 5); - initUnit(clCov); + BasicMatrix clCov = GblUtils.unitMatrix(5, 5); clCov = (BasicMatrix) MatrixOp.mult(0.1 * 0.1, clCov); if (textFile != null) { @@ -657,26 +645,6 @@ // return j; // // } - private void initUnit(BasicMatrix mat) { - for (int row = 0; row != mat.getNRows(); row++) { - for (int col = 0; col != mat.getNColumns(); col++) { - if (row != col) { - mat.setElement(row, col, 0); - } else { - mat.setElement(row, col, 1); - } - } - } - } - - private void initZero(BasicMatrix mat) { - for (int row = 0; row != mat.getNRows(); row++) { - for (int col = 0; col != mat.getNColumns(); col++) { - mat.setElement(row, col, 0); - } - } - } - /** * Transform MCParticle into a Helix object. Note that it produces the helix * parameters at nominal x=0 and assumes that there is no field at x<0 @@ -723,13 +691,13 @@ p.setElement(0, 0, perPar.getD0()); p.setElement(0, 1, perPar.getPhi()); p.setElement(0, 2, perPar.getKappa()); - p.setElement(0, 0, perPar.getZ0()); + p.setElement(0, 3, perPar.getZ0()); p.setElement(0, 4, Math.tan(Math.PI / 2.0 - perPar.getTheta())); BasicMatrix pt = new BasicMatrix(1, 5); pt.setElement(0, 0, perParTruth.getD0()); pt.setElement(0, 1, perParTruth.getPhi()); pt.setElement(0, 2, perParTruth.getKappa()); - pt.setElement(0, 0, perParTruth.getZ0()); + pt.setElement(0, 3, perParTruth.getZ0()); pt.setElement(0, 4, Math.tan(Math.PI / 2.0 - perParTruth.getTheta())); Matrix error_matrix = MatrixOp.inverse(covariance); BasicMatrix res = (BasicMatrix) MatrixOp.sub(p, pt); @@ -887,6 +855,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 +*/ } 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 Sep 3 19:18:59 2015 @@ -2,20 +2,24 @@ import hep.physics.vec.BasicHep3Vector; import hep.physics.vec.Hep3Vector; - import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; - import org.hps.recon.tracking.EventQuality; import org.hps.recon.tracking.TrackUtils; import org.lcsim.event.EventHeader; import org.lcsim.event.LCRelation; import org.lcsim.event.MCParticle; +import org.lcsim.event.RelationalTable; import org.lcsim.event.SimTrackerHit; import org.lcsim.event.Track; +import org.lcsim.event.TrackerHit; import org.lcsim.event.base.MyLCRelation; import org.lcsim.geometry.Detector; import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D; @@ -23,8 +27,7 @@ import org.lcsim.util.aida.AIDA; /** - * This driver class is used to - * 1) write lcio collection of GBL info objects OR + * This driver class is used to 1) write lcio collection of GBL info objects OR * 2) write GBL info into a unstructures text-based output * * It uses a helper class that does the actual work. We will port GBL to java @@ -37,13 +40,13 @@ */ public class GBLOutputDriver extends Driver { - private AIDA aida = AIDA.defaultInstance(); + private final AIDA aida = AIDA.defaultInstance(); int nevt = 0; GBLOutput gbl = null; TruthResiduals truthRes = null; private String gblFileName = ""; private String outputPlotFileName = ""; - private String MCParticleCollectionName = "MCParticle"; + private final String MCParticleCollectionName = "MCParticle"; private int _debug = 0; private boolean isMC = false; private int totalTracks = 0; @@ -72,46 +75,63 @@ } @Override - public void process(EventHeader event) { + public void process(EventHeader event) { // Check if the event contains a collection of the type Track. If it // doesn't skip the event. - if (!event.hasCollection(Track.class)) + if (!event.hasCollection(Track.class)) { return; + } // Get all collections of the type Track from the event. This is // required since the event contains a track collection for each of the // different tracking strategies. List<List<Track>> trackCollections = event.get(Track.class); - if (_debug > 0) + if (_debug > 0) { System.out.printf("%s: Event %d has %d tracks\n", this.getClass().getSimpleName(), event.getEventNumber(), trackCollections.size()); + } List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D"); - if (_debug > 0) + if (_debug > 0) { System.out.printf("%s: Got %d SiTrackerHitStrip1D in this event\n", stripHits.size()); + } List<MCParticle> mcParticles = new ArrayList<MCParticle>(); - if (event.hasCollection(MCParticle.class, this.MCParticleCollectionName)) + if (event.hasCollection(MCParticle.class, this.MCParticleCollectionName)) { mcParticles = event.get(MCParticle.class, this.MCParticleCollectionName); + } List<SimTrackerHit> simTrackerHits = new ArrayList<SimTrackerHit>(); - if (event.hasCollection(SimTrackerHit.class, "TrackerHits")) + if (event.hasCollection(SimTrackerHit.class, "TrackerHits")) { simTrackerHits = event.get(SimTrackerHit.class, "TrackerHits"); - - if (isMC) - if (truthRes != null) + } + + if (isMC) { + if (truthRes != null) { truthRes.processSim(mcParticles, simTrackerHits); + } + } + + RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); // Loop over each of the track collections retrieved from the event - List<Track> selected_tracks = new ArrayList<Track>(); - for (List<Track> tracklist : trackCollections) { + Map<Set<TrackerHit>, List<Track>> hitsToTracksMap = new HashMap<Set<TrackerHit>, List<Track>>(); + for (List<Track> tracklist : trackCollections) { for (Track trk : tracklist) { totalTracks++; if (TrackUtils.isGoodTrack(trk, tracklist, EventQuality.Quality.NONE)) { - if (_debug > 0) - System.out.printf("%s: Track failed selection\n", this.getClass().getSimpleName()); - selected_tracks.add(trk); + Set<TrackerHit> trackHits = new HashSet<TrackerHit>(TrackUtils.getStripHits(trk, hitToStrips, hitToRotated)); + List<Track> matchingTracks = hitsToTracksMap.get(trackHits); + if (matchingTracks == null) { + matchingTracks = new ArrayList<Track>(); + hitsToTracksMap.put(trackHits, matchingTracks); + } + matchingTracks.add(trk); + } else if (_debug > 0) { + System.out.printf("%s: Track failed selection\n", this.getClass().getSimpleName()); } } } + // GBLData // containers and data List<GBLEventData> gblEventData = new ArrayList<GBLEventData>(); @@ -125,9 +145,13 @@ gbl.printNewEvent(iEvent, gbl.get_B().z()); iTrack = 0; - for (Track trk : selected_tracks) { - if (_debug > 0) + + for (List<Track> matchingTracks : hitsToTracksMap.values()) { + Track trk = matchingTracks.get(0);//arbitrarily pick one track to use to generate GBL data + + if (_debug > 0) { System.out.printf("%s: Print GBL output for this track\n", this.getClass().getSimpleName()); + } //GBLDATA GBLTrackData gblTrackData = new GBLTrackData(iTrack); @@ -139,7 +163,9 @@ //GBLDATA //add relation to normal track object - trackToGBLTrackRelationListAll.add(new MyLCRelation(trk, gblTrackData)); + for (Track matchingTrack : matchingTracks) { + trackToGBLTrackRelationListAll.add(new MyLCRelation(matchingTrack, gblTrackData)); + } // add strip clusters to lists for (GBLStripClusterData gblStripClusterData : gblStripDataList) { // add all strip clusters from this track to output list @@ -153,12 +179,12 @@ totalTracksProcessed++; ++iTrack; } - - event.put("GBLEventData" , gblEventData, GBLEventData.class, 0); - event.put("GBLTrackData" , gblTrackDataList, GBLTrackData.class, 0); - event.put("GBLStripClusterData" , gblStripDataListAll, GBLStripClusterData.class, 0); - event.put("GBLTrackToStripData" , gblTrackToStripClusterRelationListAll, LCRelation.class, 0); - event.put("TrackToGBLTrack" , trackToGBLTrackRelationListAll, LCRelation.class, 0); + + event.put("GBLEventData", gblEventData, GBLEventData.class, 0); + event.put("GBLTrackData", gblTrackDataList, GBLTrackData.class, 0); + event.put("GBLStripClusterData", gblStripDataListAll, GBLStripClusterData.class, 0); + event.put("GBLTrackToStripData", gblTrackToStripClusterRelationListAll, LCRelation.class, 0); + event.put("TrackToGBLTrack", trackToGBLTrackRelationListAll, LCRelation.class, 0); ++iEvent; @@ -166,18 +192,20 @@ @Override public void endOfData() { - if (gbl != null) + if (gbl != null) { gbl.close(); - - if (!"".equals(outputPlotFileName)) + } + + if (!"".equals(outputPlotFileName)) { try { aida.saveAs(outputPlotFileName); } catch (IOException ex) { Logger.getLogger(GBLOutputDriver.class.getName()).log(Level.SEVERE, "Couldn't save aida plots to file " + outputPlotFileName, ex); } + } System.out.println(this.getClass().getSimpleName() + ": Total Number of Events = " + iEvent); System.out.println(this.getClass().getSimpleName() + ": Total Number of Tracks = " + totalTracks); - System.out.println(this.getClass().getSimpleName() + ": Total Number of Tracks Processed = " + totalTracksProcessed); + System.out.println(this.getClass().getSimpleName() + ": Total Number of Unique Tracks Processed = " + totalTracksProcessed); } 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 Sep 3 19:18:59 2015 @@ -17,20 +17,10 @@ */ public class GblUtils { - private static GblUtils INSTANCE = null; - private GblUtils() { } - public static GblUtils getInstance() { - if (INSTANCE == null) { - return new GblUtils(); - } else { - return INSTANCE; - } - } - - public BasicMatrix gblSimpleJacobianLambdaPhi(double ds, double cosl, double bfac) { + public static BasicMatrix gblSimpleJacobianLambdaPhi(double ds, double cosl, double bfac) { /* Simple jacobian: quadratic in arc length difference. using lambda phi as directions @@ -68,7 +58,7 @@ return mat; } - public BasicMatrix unitMatrix(int rows, int cols) { + public static BasicMatrix unitMatrix(int rows, int cols) { BasicMatrix mat = new BasicMatrix(rows, cols); for (int row = 0; row != mat.getNRows(); row++) { for (int col = 0; col != mat.getNColumns(); col++) { @@ -82,7 +72,7 @@ return mat; } - public BasicMatrix zeroMatrix(int rows, int cols) { + public static BasicMatrix zeroMatrix(int rows, int cols) { BasicMatrix mat = new BasicMatrix(rows, cols); for (int row = 0; row != mat.getNRows(); row++) { for (int col = 0; col != mat.getNColumns(); col++) { 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 Sep 3 19:18:59 2015 @@ -10,20 +10,15 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.hps.recon.tracking.MaterialSupervisor; -import org.hps.recon.tracking.MaterialSupervisor.DetectorPlane; -import org.hps.recon.tracking.MaterialSupervisor.ScatteringDetectorVolume; import org.hps.recon.tracking.MultipleScattering; import org.hps.recon.tracking.MultipleScattering.ScatterPoint; import org.hps.recon.tracking.MultipleScattering.ScatterPoints; import org.hps.recon.tracking.TrackUtils; import org.hps.recon.tracking.TrackerHitUtils; import org.lcsim.constants.Constants; -import org.lcsim.detector.IDetectorElement; import org.lcsim.event.RawTrackerHit; import org.lcsim.event.Track; import org.lcsim.fit.helicaltrack.HelicalTrackCross; @@ -31,7 +26,6 @@ import org.lcsim.fit.helicaltrack.HelicalTrackHit; import org.lcsim.fit.helicaltrack.HelicalTrackStrip; import org.lcsim.fit.helicaltrack.HelixUtils; -import org.lcsim.recon.tracking.seedtracker.ScatterAngle; import org.lcsim.recon.tracking.seedtracker.SeedCandidate; import org.lcsim.recon.tracking.seedtracker.SeedTrack; @@ -45,7 +39,7 @@ */ public class HpsGblFitter { - private boolean _debug = true; + private final boolean _debug = true; private double _B = 0.; private double _bfac = 0.; private boolean isMC = false; @@ -104,7 +98,7 @@ // path length along trajectory double s = 0.; // jacobian to transport errors between points along the path - BasicMatrix jacPointToPoint = GblUtils.getInstance().unitMatrix(5, 5); + BasicMatrix jacPointToPoint = GblUtils.unitMatrix(5, 5); // Option to use uncorrelated MS errors // This is similar to what is done in lcsim seedtracker // The msCov below holds the MS errors @@ -139,6 +133,7 @@ // TODO use actual path length and not layer id! //Collections.sort(stripClusters, new HelicalTrackStripComparer()); Collections.sort(stripClusters, new Comparator<HelicalTrackStrip>() { + @Override public int compare(HelicalTrackStrip o1, HelicalTrackStrip o2) { return o1.layer() < o2.layer() ? -1 : o1.layer() > o2.layer() ? 1 : 0; } @@ -268,7 +263,7 @@ } //Find the Jacobian to be able to propagate the covariance matrix to this strip position - jacPointToPoint = GblUtils.getInstance().gblSimpleJacobianLambdaPhi(step, cosLambda, Math.abs(_bfac)); + jacPointToPoint = GblUtils.gblSimpleJacobianLambdaPhi(step, cosLambda, Math.abs(_bfac)); if (_debug) { System.out.printf("%s: jacPointToPoint \n%s\n", this.getClass().getSimpleName(), jacPointToPoint.toString()); @@ -296,7 +291,7 @@ //Add scatterer in curvilinear frame to the point // no direction in this frame as it moves along the track - BasicMatrix scat = GblUtils.getInstance().zeroMatrix(0, 2); + BasicMatrix scat = GblUtils.zeroMatrix(0, 2); // find scattering angle ScatterPoint scatter = scatters.getScatterPoint(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement()); @@ -421,6 +416,7 @@ public static class HelicalTrackStripComparer implements Comparator<HelicalTrackStrip> { + @Override public int compare(HelicalTrackStrip o1, HelicalTrackStrip o2) { // TODO Change this to path length!? return compare(o1.layer(), o2.layer()); 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 Sep 3 19:18:59 2015 @@ -1,10 +1,8 @@ package org.hps.recon.tracking.gbl; -import hep.physics.matrix.SymmetricMatrix; import hep.physics.vec.BasicHep3Vector; import hep.physics.vec.Hep3Vector; import hep.physics.vec.VecOp; -import static java.lang.Math.abs; import static java.lang.Math.abs; import static java.lang.Math.sin; import static java.lang.Math.sqrt; 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 Sep 3 19:18:59 2015 @@ -216,7 +216,7 @@ // Strandlie, Wittek, NIMA 566, 2006 Matrix covariance_gbl = new Matrix(5, 5); //helpers - double Bz = Constants.fieldConversion * Math.abs(bfield); // TODO sign convention and should it be it scaled from Telsa? + double Bz = -Constants.fieldConversion * Math.abs(bfield); // TODO sign convention and should it be it scaled from Telsa? double p = Math.abs(1 / qOverP_gbl); double q = Math.signum(qOverP_gbl); double tanLambda = Math.tan(lambda_gbl); @@ -240,35 +240,46 @@ double TdotI = VecOp.dot(T, I); double VdotI = VecOp.dot(V, I); double VdotK = VecOp.dot(V, K); + covariance_gbl.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), VdotK / TdotI); + covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 1); + covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XT.getValue(), -alpha * Q * UdotI * NdotU / (cosLambda * TdotI)); + covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -alpha * Q * VdotI * NdotU / (cosLambda * TdotI)); covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.QOVERP.getValue(), -1 * Bz / cosLambda); +// covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 0); covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), -1 * q * Bz * tanLambda / (p * cosLambda)); - covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 0); covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), q * Bz * alpha * Q * tanLambda * UdotI * NdotV / (p * cosLambda * TdotI)); covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YT.getValue(), q * Bz * alpha * Q * tanLambda * VdotI * NdotV / (p * cosLambda * TdotI)); + covariance_gbl.set(HelicalTrackFit.z0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -1 / TdotI); covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), -1); covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), alpha * Q * UdotI * NdotV / TdotI); covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.YT.getValue(), alpha * Q * VdotI * NdotV / TdotI); - covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 1); - covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XT.getValue(), -alpha * Q * UdotI * NdotU / (cosLambda * TdotI)); - covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -alpha * Q * VdotI * NdotU / (cosLambda * TdotI)); - covariance_gbl.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), VdotK / TdotI); - covariance_gbl.set(HelicalTrackFit.z0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -1 / TdotI); - + +// System.out.println(clToPerPrj); + +// covariance_gbl.print(15, 13); +//// System.out.println(-alpha * Q * UdotI * NdotU / (cosLambda * TdotI)); +// System.out.println(-alpha * Q * VdotI * NdotU / (cosLambda * TdotI)); +// System.out.format("%f %f %f %f %f %f\n", -alpha, Q, VdotI, NdotU, cosLambda, TdotI); +// System.out.format("%f %f %f %f %f %f\n", -Math.cos(lambda)/Math.abs(bfield), Q, perToClPrj.e(1, 0), perToClPrj.e(0, 1), Math.cos(lambda_gbl), perToClPrj.e(2, 0)); +// +//// System.out.println(q * Bz * alpha * Q * tanLambda * UdotI * NdotV / (p * cosLambda * TdotI)); +// System.out.println(q * Bz * alpha * Q * tanLambda * VdotI * NdotV / (p * cosLambda * TdotI)); +//// System.out.println(alpha * Q * UdotI * NdotV / TdotI); +// System.out.println(alpha * Q * VdotI * NdotV / TdotI); // Sho's magic Matrix jacobian = new Matrix(5, 5); jacobian.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), -clToPerPrj.e(1, 0)); jacobian.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -clToPerPrj.e(1, 1)); + jacobian.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 1.0); + jacobian.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.QOVERP.getValue(), Constants.fieldConversion * Math.abs(bfield) / Math.cos(lambda_gbl)); + jacobian.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), Constants.fieldConversion * Math.abs(bfield) * qOverP_gbl * Math.tan(lambda_gbl) / Math.cos(lambda_gbl)); jacobian.set(HelicalTrackFit.z0Index, FittedGblTrajectory.GBLPARIDX.XT.getValue(), clToPerPrj.e(2, 0)); jacobian.set(HelicalTrackFit.z0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), clToPerPrj.e(2, 1)); - jacobian.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 1.0); jacobian.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), Math.pow(Math.cos(lambda_gbl), -2.0)); - jacobian.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.QOVERP.getValue(), Constants.fieldConversion * Math.abs(bfield) / Math.cos(lambda_gbl)); - jacobian.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), Constants.fieldConversion * Math.abs(bfield) * qOverP_gbl * Math.tan(lambda_gbl) / Math.cos(lambda_gbl)); - -// covariance_gbl.print(10, 8); -// -// jacobian.print(10, 8); - + +// jacobian.print(15, 13); +// System.out.println(-clToPerPrj.e(1, 1)); +// System.out.println(clToPerPrj.e(2, 0)); Matrix helixCovariance = jacobian.times(locCov.times(jacobian.transpose())); SymmetricMatrix cov = new SymmetricMatrix(5); for (int i = 0; i < 5; i++) {