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++) {
|