Author: [log in to unmask] Date: Fri Sep 4 18:29:34 2015 New Revision: 3538 Log: merge track collections; rework how track types are handled and used Added: java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.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/MakeGblTracks.java Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim Fri Sep 4 18:29:34 2015 @@ -52,10 +52,11 @@ TrackDataDriver needs to be run before ReconParticleDriver so the ReconstructedParticle types are properly set. --> - <driver name="TrackDataDriver" /> - <driver name="ReconParticle" /> - <driver name="GBLOutputDriver"/> + <driver name="MergeTrackCollections"/> + <driver name="GBLOutputDriver" /> <driver name="GBLRefitterDriver" /> + <driver name="TrackDataDriver" /> + <driver name="ReconParticleDriver" /> <driver name="LCIOWriter"/> <driver name="CleanupDriver"/> </execute> @@ -94,7 +95,7 @@ </driver> <!-- SVT Track finding --> <driver name="TrackReconSeed345Conf2Extd16" type="org.hps.recon.tracking.TrackerReconDriver"> - <trackCollectionName>MatchedTracks</trackCollectionName> + <trackCollectionName>Tracks_s345_c2_e16</trackCollectionName> <strategyResource>HPS_s345_c2_e16.xml</strategyResource> <debug>false</debug> <rmsTimeCut>8.0</rmsTimeCut> @@ -117,6 +118,7 @@ <debug>false</debug> <rmsTimeCut>8.0</rmsTimeCut> </driver> + <driver name="MergeTrackCollections" type="org.hps.recon.tracking.MergeTrackCollections" /> <driver name="GBLOutputDriver" type="org.hps.recon.tracking.gbl.GBLOutputDriver"/> <driver name="GBLRefitterDriver" type="org.hps.recon.tracking.gbl.HpsGblRefitter"/> <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim Fri Sep 4 18:29:34 2015 @@ -47,19 +47,20 @@ --> <driver name="TrackReconSeed123Conf5Extd46"/> <!-- - TrackDataDriver needs to be run before ReconParticleDriver so the - ReconstructedParticle types are properly set. - --> + TrackDataDriver needs to be run before ReconParticleDriver so the + ReconstructedParticle types are properly set. + --> + <driver name="MergeTrackCollections"/> + <driver name="GBLOutputDriver" /> + <driver name="GBLRefitterDriver" /> <driver name="TrackDataDriver" /> <driver name="ReconParticleDriver" /> - <driver name="GBLOutputDriver" /> - <driver name="GBLRefitterDriver" /> <driver name="LCIOWriter"/> <driver name="CleanupDriver"/> </execute> <drivers> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>1000</eventInterval> + <eventInterval>1</eventInterval> </driver> <!-- Ecal reconstruction drivers --> @@ -104,7 +105,7 @@ </driver> <!-- SVT Track finding --> <driver name="TrackReconSeed345Conf2Extd16" type="org.hps.recon.tracking.TrackerReconDriver"> - <trackCollectionName>MatchedTracks</trackCollectionName> + <trackCollectionName>Tracks_s345_c2_e16</trackCollectionName> <strategyResource>HPS_s345_c2_e16.xml</strategyResource> <debug>false</debug> <rmsTimeCut>8.0</rmsTimeCut> @@ -127,6 +128,7 @@ <debug>false</debug> <rmsTimeCut>8.0</rmsTimeCut> </driver> + <driver name="MergeTrackCollections" type="org.hps.recon.tracking.MergeTrackCollections" /> <driver name="TrackDataDriver" type="org.hps.recon.tracking.TrackDataDriver" /> <driver name="ReconParticleDriver" type="org.hps.recon.particle.HpsReconParticleDriver" > <ecalClusterCollectionName>EcalClustersCorr</ecalClusterCollectionName> Added: java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java (added) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java Fri Sep 4 18:29:34 2015 @@ -0,0 +1,94 @@ +package org.hps.recon.tracking; + +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 org.lcsim.event.EventHeader; +import org.lcsim.event.RelationalTable; +import org.lcsim.event.Track; +import org.lcsim.event.TrackerHit; +import org.lcsim.lcio.LCIOConstants; +import org.lcsim.recon.tracking.seedtracker.SeedTrack; +import org.lcsim.util.Driver; + +/** + * + * @author Sho Uemura <[log in to unmask]> + * @version $Id: $ + */ +public class MergeTrackCollections extends Driver { + + private String outputCollectionName = "MatchedTracks"; + private boolean removeCollections = true; + + public void setOutputCollectionName(String outputCollectionName) { + this.outputCollectionName = outputCollectionName; + } + + public void setRemoveCollections(boolean removeCollections) { + this.removeCollections = removeCollections; + } + + @Override + public void process(EventHeader event) { + RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); + List<List<Track>> trackCollections = event.get(Track.class); + + // Loop over each of the track collections retrieved from the event + Map<Set<TrackerHit>, List<Track>> hitsToTracksMap = new HashMap<Set<TrackerHit>, List<Track>>(); + for (List<Track> tracklist : trackCollections) { + for (Track trk : tracklist) { + 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); + + } + } + + List<Track> deduplicatedTracks = new ArrayList<Track>(); + + for (List<Track> matchingTracks : hitsToTracksMap.values()) { + Track trk = matchingTracks.get(0);// pick lowest-chisq track (this probably doesn't matter) + for (Track matchingTrack : matchingTracks) { + if (matchingTrack.getChi2() < trk.getChi2()) { + trk = matchingTrack; + } + } + + int trackType = 0; + for (Track matchingTrack : matchingTracks) { + // Get the name of the strategy used to find this track + SeedTrack seedTrack = (SeedTrack) matchingTrack; + String strategyName = seedTrack.getStrategy().getName(); + + // Check if a StrategyType is associated with this strategy. + // If it is, set the track type. Otherwise, just move on + // and stick with the default value of zero. + StrategyType strategyType = StrategyType.getType(strategyName); + if (strategyType != null) { + trackType = TrackType.addStrategy(trackType, strategyType); + } + } + + ((SeedTrack) trk).setTrackType(trackType); + deduplicatedTracks.add(trk); + } + + int flag = 1 << LCIOConstants.TRBIT_HITS; + event.put(outputCollectionName, deduplicatedTracks, Track.class, flag); + + if (removeCollections) { + for (List<Track> tracklist : trackCollections) { + event.remove(event.getMetaData(tracklist).getName()); + } + } + } +} Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java Fri Sep 4 18:29:34 2015 @@ -172,23 +172,6 @@ // Loop over all the tracks in the event for (Track track : tracks) { - // - // Set the TrackType of the track based on the tracking - // strategy that was used to find it. - // - - // Get the name of the strategy used to find this track - SeedTrack seedTrack = (SeedTrack) track; - String strategyName = seedTrack.getStrategy().getName(); - - // Check if a StrategyType is associated with this strategy. - // If it is, set the track type. Otherwise, just move on - // and stick with the default value of zero. - StrategyType strategyType = StrategyType.getType(strategyName); - if (strategyType != null) { - seedTrack.setTrackType(TrackType.getType(strategyType)); - } - totalT0 = 0; totalHits = 0; t0Residuals.clear(); Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java Fri Sep 4 18:29:34 2015 @@ -1,59 +1,80 @@ package org.hps.recon.tracking; /** - * Class containing utilities used to retrieve the track type value - * based on the tracking strategy and whether it's a GBL track or not. - * + * Class containing utilities used to retrieve the track type value based on the + * tracking strategy and whether it's a GBL track or not. + * * @author <a href="mailto:[log in to unmask]">Omar Moreno</a> */ public final class TrackType { /** - * Returns the track type for the given strategy. This assumes that the + * Returns the track type for the given strategy. This assumes that the * track is not a GBL track. - * - * @param strategyType The StrategyType associated with the tracking - * tracking strategy of interest. + * + * @param strategyType The StrategyType associated with the tracking + * tracking strategy of interest. * @return The track type value for this StrategyType */ - public static int getType(StrategyType strategyType) { + public static int getType(StrategyType strategyType) { return TrackType.encodeType(strategyType, false); } - + /** - * Returns the track type for a given strategy based of whether the - * track is a GBL track or not. + * Returns the track type for a given strategy based of whether the track is + * a GBL track or not. * - * @param strategyType The StrategyType associated with the tracking - * tracking strategy of interest. + * @param strategyType The StrategyType associated with the tracking + * tracking strategy of interest. * @param isGblTrack Flag indicating whether the track is a GBL track - * @return The track type value + * @return The track type value */ - public static int getType(StrategyType strategyType, boolean isGblTrack) { + public static int getType(StrategyType strategyType, boolean isGblTrack) { return TrackType.encodeType(strategyType, isGblTrack); } - + /** - * Track type encoder. The strategy (S) and GBL flag (G) are packed as + * Track type encoder. The strategy (S) and GBL flag (G) are packed as * follows: - * + * * Note that Z denotes zero - * + * * ZZZZZZZZZZZZZZZZZZZZZZZZZZGSSSSS - * - * @param strategyType The StrategyType associated with the tracking - * tracking strategy of interest. + * + * @param strategyType The StrategyType associated with the tracking + * tracking strategy of interest. * @param isGblTrack Flag indicating whether the track is a GBL track * @return The enoded track type value */ - private static int encodeType(StrategyType strategyType, boolean isGblTrack) { - - int type = strategyType.getType(); - if (isGblTrack) type = (type ^ (1 << 6)); - - return type; + private static int encodeType(StrategyType strategyType, boolean isGblTrack) { + + int type = 1 << (strategyType.getType() - 1); + if (isGblTrack) { + type = (type ^ (1 << 5)); + } + + return type; } - - /** Constructor */ - private TrackType() {} + + public static int addStrategy(int type, StrategyType strategyType) { + return type | 1 << (strategyType.getType() - 1); + } + + public static boolean isGBL(int type) { + return (type & (1 << 5)) != 0; + } + + public static int setGBL(int type, boolean isGblTrack) { + if (isGblTrack != isGBL(type)) { + return type ^ (1 << 5); + } else { + return type; + } + } + + /** + * Constructor + */ + private TrackType() { + } } 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 Fri Sep 4 18:29:34 2015 @@ -780,7 +780,7 @@ if (track.getClass().isInstance(SeedTrack.class)) return ((SeedTrack) track).getSeedCandidate().getHelix(); else - return getHTF(track.getTrackStates().get(0).getParameters()); + return getHTF(track.getTrackStates().get(0)); } public static HelicalTrackFit getHTF(double par[]) { @@ -788,6 +788,13 @@ SymmetricMatrix cov = new SymmetricMatrix(5); for (int i = 0; i < cov.getNRows(); ++i) cov.setElement(i, i, 1.); + HelicalTrackFit htf = new HelicalTrackFit(par, cov, new double[2], new int[2], null, null); + return htf; + } + + public static HelicalTrackFit getHTF(TrackState state) { + double par[] = state.getParameters(); + SymmetricMatrix cov = new SymmetricMatrix(5, state.getCovMatrix(), true); HelicalTrackFit htf = new HelicalTrackFit(par, cov, new double[2], new int[2], null, null); return 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 4 18:29:34 2015 @@ -12,6 +12,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.hps.recon.tracking.EventQuality; +import org.hps.recon.tracking.StrategyType; +import org.hps.recon.tracking.TrackType; import org.hps.recon.tracking.TrackUtils; import org.lcsim.event.EventHeader; import org.lcsim.event.LCRelation; @@ -22,7 +24,9 @@ import org.lcsim.event.TrackerHit; import org.lcsim.event.base.MyLCRelation; import org.lcsim.geometry.Detector; +import org.lcsim.lcio.LCIOConstants; import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D; +import org.lcsim.recon.tracking.seedtracker.SeedTrack; import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA; @@ -47,6 +51,7 @@ private String gblFileName = ""; private String outputPlotFileName = ""; private final String MCParticleCollectionName = "MCParticle"; + private String trackCollectionName = "MatchedTracks"; private int _debug = 0; private boolean isMC = false; private int totalTracks = 0; @@ -76,18 +81,14 @@ @Override 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)) { + List<Track> tracklist = null; + if (event.hasCollection(Track.class, trackCollectionName)) { + tracklist = event.get(Track.class, trackCollectionName); + if (_debug > 0) { + System.out.printf("%s: Event %d has %d tracks\n", this.getClass().getSimpleName(), event.getEventNumber(), tracklist.size()); + } + } else { 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) { - 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"); @@ -108,27 +109,6 @@ 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 - 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)) { - 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()); - } } } @@ -146,38 +126,41 @@ iTrack = 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); - gblTrackDataList.add(gblTrackData); - - //print to text file - gbl.printTrackID(iTrack); - gbl.printGBL(trk, stripHits, gblTrackData, gblStripDataList, mcParticles, simTrackerHits, this.isMC); - - //GBLDATA - //add relation to normal track object - 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 - gblStripDataListAll.add(gblStripClusterData); - // add LC relations between cluster and track - gblTrackToStripClusterRelationListAll.add(new MyLCRelation(gblTrackData, gblStripClusterData)); - } - // clear list of strips for next track - gblStripDataList.clear(); - - totalTracksProcessed++; - ++iTrack; + // Loop over each of the track collections retrieved from the event + for (Track trk : tracklist) { + totalTracks++; + + if (TrackUtils.isGoodTrack(trk, tracklist, EventQuality.Quality.NONE)) { + if (_debug > 0) { + System.out.printf("%s: Print GBL output for this track\n", this.getClass().getSimpleName()); + } + + //GBLDATA + GBLTrackData gblTrackData = new GBLTrackData(iTrack); + gblTrackDataList.add(gblTrackData); + + //print to text file + gbl.printTrackID(iTrack); + gbl.printGBL(trk, stripHits, gblTrackData, gblStripDataList, mcParticles, simTrackerHits, this.isMC); + + //GBLDATA + //add relation to normal track object + trackToGBLTrackRelationListAll.add(new MyLCRelation(trk, gblTrackData)); + // add strip clusters to lists + for (GBLStripClusterData gblStripClusterData : gblStripDataList) { + // add all strip clusters from this track to output list + gblStripDataListAll.add(gblStripClusterData); + // add LC relations between cluster and track + gblTrackToStripClusterRelationListAll.add(new MyLCRelation(gblTrackData, gblStripClusterData)); + } + // clear list of strips for next track + gblStripDataList.clear(); + + totalTracksProcessed++; + ++iTrack; + } else if (_debug > 0) { + System.out.printf("%s: Track failed selection\n", this.getClass().getSimpleName()); + } } event.put("GBLEventData", gblEventData, GBLEventData.class, 0); @@ -205,7 +188,7 @@ } 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 Unique Tracks Processed = " + totalTracksProcessed); + System.out.println(this.getClass().getSimpleName() + ": Total Number of Tracks Processed = " + totalTracksProcessed); } 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 Fri Sep 4 18:29:34 2015 @@ -115,13 +115,8 @@ // Set the SeedCandidate this track is based on trk.setSeedCandidate(trackseed); - // Check if a StrategyType is associated with this strategy. - // If it is, set the track type with the GBL flag set to true. - // Otherwise, just move on and stick with the default value. - StrategyType strategyType = StrategyType.getType(seedTrack.getType()); - if (strategyType != null) { - trk.setTrackType(TrackType.getType(strategyType, true)); - } + // Add the GBL flag to the track type. + trk.setTrackType(TrackType.setGBL(seedTrack.getType(), true)); // Check the track - hook for plugging in external constraint //if ((_trackCheck != null) && (! _trackCheck.checkTrack(trk))) continue; @@ -214,50 +209,49 @@ logger.info(String.format("corrected helix: d0=%f, z0=%f, omega=%f, tanlambda=%f, phi0=%f, p=%f", dca_gbl, z0_gbl, C_gbl, slope_gbl, phi0_gbl, Math.abs(1 / qOverP_gbl))); /* - // 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 p = Math.abs(1 / qOverP_gbl); - double q = Math.signum(qOverP_gbl); - double tanLambda = Math.tan(lambda_gbl); - double cosLambda = Math.cos(lambda_gbl); -// Hep3Vector B = new BasicHep3Vector(0, 0, Bz); // TODO sign convention? - Hep3Vector H = new BasicHep3Vector(0, 0, 1); - 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 = Bz * 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)); - double UdotI = VecOp.dot(U, I); - double NdotV = VecOp.dot(N, V); - double NdotU = VecOp.dot(N, U); - 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.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.print(15, 13); - */ - + // 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 p = Math.abs(1 / qOverP_gbl); + double q = Math.signum(qOverP_gbl); + double tanLambda = Math.tan(lambda_gbl); + double cosLambda = Math.cos(lambda_gbl); + // Hep3Vector B = new BasicHep3Vector(0, 0, Bz); // TODO sign convention? + Hep3Vector H = new BasicHep3Vector(0, 0, 1); + 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 = Bz * 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)); + double UdotI = VecOp.dot(U, I); + double NdotV = VecOp.dot(N, V); + double NdotU = VecOp.dot(N, U); + 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.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.print(15, 13); + */ // Sho's magic Matrix jacobian = new Matrix(5, 5); jacobian.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), -clToPerPrj.e(1, 0));