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));
|