Author: [log in to unmask]
Date: Mon Feb 2 16:17:50 2015
New Revision: 2022
Log:
Adding Gbl track refit to event. Need to actually correct the helix pars still.
Added:
java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
Modified:
java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.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/HpsGblFitter.java
java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.java
=============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.java (original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.java Mon Feb 2 16:17:50 2015
@@ -35,20 +35,24 @@
_debug = debug;
}
- public void setMC(boolean mcflag) {
+ public void setIsMC(boolean mcflag) {
_isMC = mcflag;
}
protected void detectorChanged(Detector det) {
- Hep3Vector bfield = det.getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
+ System.out.printf("%s: detectorChanged\n",getClass().getSimpleName());
+ Hep3Vector bfieldvec = det.getFieldMap().getField(new BasicHep3Vector(0., 1., 0.));
+ double bfield = bfieldvec.y();
+ System.out.printf("%s: b-field %s\n",getClass().getSimpleName(),bfieldvec.toString());
_materialManager = new MaterialSupervisor();
_scattering = new MultipleScattering(_materialManager);
_materialManager.buildModel(det);
- _scattering.setBField(Math.abs(bfield.z())); // only absolute of B is needed as it's used for momentum calculation only
- _gbl_fitter = new HpsGblFitter(bfield.z(), _scattering, _isMC);
+ _scattering.setBField(Math.abs(bfield)); // only absolute of B is needed as it's used for momentum calculation only
+ _gbl_fitter = new HpsGblFitter(bfield, _scattering, _isMC);
if(!milleBinaryName.equalsIgnoreCase("")) {
_gbl_fitter.setMilleBinary(new MilleBinary());
}
+ System.out.printf("%s: detectorChanged end\n",getClass().getSimpleName());
}
protected void process(EventHeader event) {
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 Mon Feb 2 16:17:50 2015
@@ -316,8 +316,8 @@
for (MCParticle particle : hit.getMCParticles()) System.out.printf("%s: %d p %s \n",this.getClass().getSimpleName(),particle.getPDGID(),particle.getMomentum().toString());
System.out.printf("%s: these are sim hits in the event:\n",this.getClass().getSimpleName());
for (SimTrackerHit simhit : simTrackerHits) System.out.printf("%s sim hit at %s with MC particle pdgid %d with p %s \n",this.getClass().getSimpleName(),simhit.getPositionVec().toString(),simhit.getMCParticle().getPDGID(),simhit.getMCParticle().getMomentum().toString());
- System.out.printf("%s: these are all the MC particles in the event:\n",this.getClass().getSimpleName());
- System.exit(1);
+ //System.out.printf("%s: these are all the MC particles in the event:\n",this.getClass().getSimpleName());
+ //System.exit(1);
}
if(_debug>0) {
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 Mon Feb 2 16:17:50 2015
@@ -66,12 +66,14 @@
}
public HpsGblFitter(double Bz, MultipleScattering scattering, boolean isMCFlag) {
+ System.out.printf("%s: Constructor\n",getClass().getSimpleName());
isMC = isMCFlag;
_B = Bz;
_bfac = Bz * Constants.fieldConversion;
_trackHitUtils = new TrackerHitUtils();
_scattering = scattering;
- System.out.println("Constructor");
+ System.out.printf("%s: b-field set to %f (%f)\n",getClass().getSimpleName(), _B, _bfac);
+ System.out.printf("%s: Constructor end\n",getClass().getSimpleName());
}
public void setMilleBinary(MilleBinary mille) {
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 Mon Feb 2 16:17:50 2015
@@ -2,16 +2,19 @@
import hep.physics.vec.BasicHep3Vector;
import hep.physics.vec.Hep3Vector;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+
import org.lcsim.event.EventHeader;
import org.lcsim.event.GenericObject;
import org.lcsim.event.LCRelation;
import org.lcsim.event.Track;
import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.seedtracker.MakeTracks;
import org.lcsim.util.Driver;
import static java.lang.Math.sin;
@@ -33,7 +36,7 @@
*/
public class HpsGblRefitter extends Driver
{
-
+ private enum gblFitResult {SUCCESS, FAILURE};
private boolean _debug = false;
private final String trackCollectionName = "MatchedTracks";
private final String track2GblTrackRelationName = "TrackToGBLTrack";
@@ -42,6 +45,8 @@
private MilleBinary mille;
private String milleBinaryFileName = MilleBinary.DEFAULT_OUTPUT_FILE_NAME;
private boolean writeMilleBinary = false;
+
+ private MakeGblTracks _makeTracks = null;
public void setDebug(boolean debug)
{
@@ -60,6 +65,7 @@
public HpsGblRefitter()
{
+ _makeTracks = new MakeGblTracks();
}
@Override
@@ -81,9 +87,9 @@
@Override
protected void process(EventHeader event)
{
- Hep3Vector bfield = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
- double By = bfield.y();
- double bfac = 0.0002998 * By;
+ Hep3Vector bfieldvec = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
+ double bfield = bfieldvec.y();
+ double bfac = 0.0002998 * bfield;
// get the tracks
// List<Track> tracks = null;
if (event.hasCollection(Track.class, trackCollectionName)) {
@@ -116,13 +122,16 @@
List<LCRelation> track2GblTrackRelations = event.get(LCRelation.class, track2GblTrackRelationName);
//need a map of GBLTrackData keyed on the Generic object from which it created
Map<GenericObject, GBLTrackData> gblObjMap = new HashMap<GenericObject, GBLTrackData>();
-
+ //need a map of SeedTrack to GBLTrackData keyed on the track object from which it created
+ Map<GBLTrackData, Track> gblToSeedMap = new HashMap<GBLTrackData, Track>();
+
// loop over the relations
for (LCRelation relation : track2GblTrackRelations) {
Track t = (Track) relation.getFrom();
GenericObject gblTrackObject = (GenericObject) relation.getTo();
GBLTrackData gblT = new GBLTrackData(gblTrackObject);
gblObjMap.put(gblTrackObject, gblT);
+ gblToSeedMap.put(gblT, t);
} //end of loop over tracks
//get the strip hit relations
@@ -144,16 +153,29 @@
}
}
- Set<GBLTrackData> keys = stripsGblMap.keySet();
+ Map<GblTrajectory,Track> trackFits = new HashMap<GblTrajectory,Track>();
int trackNum = 0;
- for (GBLTrackData t : keys) {
- int stat = fit(t, stripsGblMap.get(t), bfac);
+ for (GBLTrackData t : stripsGblMap.keySet()) {
+ GblTrajectory traj = fit(t, stripsGblMap.get(t), bfac);
++trackNum;
- }
-
- }
-
- private int fit(GBLTrackData track, List<GBLStripClusterData> hits, double bfac)
+ if(traj!=null) {
+ if(_debug) System.out.printf("%s: GBL fit successful.\n",getClass().getSimpleName());
+ Track seed = gblToSeedMap.get(t);
+ trackFits.put(traj, seed);
+ } else {
+ if(_debug) System.out.printf("%s: GBL fit failed.\n",getClass().getSimpleName());
+ }
+ }
+ if(_debug) System.out.printf("%s: Save %d/%d GBL fitted tracks in this event.\n",getClass().getSimpleName(),trackFits.size(), trackNum);
+
+ _makeTracks.Process(event, trackFits, bfield);
+
+ if(_debug) System.out.printf("%s: Done.\n",getClass().getSimpleName());
+
+
+ }
+
+ private GblTrajectory fit(GBLTrackData track, List<GBLStripClusterData> hits, double bfac)
{
// path length along trajectory
double s = 0.;
@@ -381,7 +403,7 @@
if (!traj.isValid()) {
System.out.println("HpsGblFitter: " + " Invalid GblTrajectory -> skip");
- return 1;//INVALIDTRAJ;
+ return null; //1;//INVALIDTRAJ;
}
// print the trajectory
@@ -414,7 +436,7 @@
traj.milleOut(mille);
}
//
- return 0;
+ return traj;
}
@Override
Added: 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 (added)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java Mon Feb 2 16:17:50 2015
@@ -0,0 +1,124 @@
+package org.hps.recon.tracking.gbl;
+
+import hep.physics.matrix.SymmetricMatrix;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.lcio.LCIOConstants;
+import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+
+public class MakeGblTracks {
+
+
+ private String _TrkCollectionName = "GblTracks";
+
+ /**
+ * Creates a new instance of MakeTracks.
+ */
+ public MakeGblTracks() {
+ }
+
+ /**
+ * Process a Gbl track and store it into the event
+ * @param event event header
+ * @param track Gbl trajectory
+ * @param seed SeedTrack
+ * @param bfield magnetic field (used to turn curvature into momentum)
+ */
+ public void Process(EventHeader event, Map<GblTrajectory, Track> gblTrajectories, double bfield) {
+
+ List<Track> tracks = new ArrayList<Track>();
+
+ for(Entry<GblTrajectory, Track> entry : gblTrajectories.entrySet()) {
+
+ GblTrajectory traj = entry.getKey();
+ Track seed = entry.getValue();
+
+ // Initialize the reference point to the origin
+ double[] ref = new double[] {0., 0., 0.};
+ SeedTrack seedTrack = (SeedTrack) seed;
+ SeedCandidate trackseed = seedTrack.getSeedCandidate();
+
+ // Create a new SeedTrack (SeedTrack extends BaseTrack)
+ SeedTrack trk = new SeedTrack();
+
+ // Add the hits to the track
+ for (HelicalTrackHit hit : trackseed.getHits()) {
+ trk.addHit((TrackerHit) hit);
+ }
+
+ // Retrieve the helix and save the relevant bits of helix info
+ HelicalTrackFit helix = trackseed.getHelix();
+ double gblParameters[] = getGblCorrectedHelixParameters(helix,traj);
+ trk.setTrackParameters(gblParameters, bfield); // Sets first TrackState.
+ //trk.setTrackParameters(helix.parameters(), bfield); // Sets first TrackState.
+ SymmetricMatrix gblCovariance = getGblCorrectedHelixCovariance(helix, traj);
+ trk.setCovarianceMatrix(gblCovariance); // Modifies first TrackState.
+ //trk.setCovarianceMatrix(helix.covariance()); // Modifies first TrackState.
+ trk.setChisq(helix.chisqtot());
+ trk.setNDF(helix.ndf()[0]+helix.ndf()[1]);
+
+ // Flag that the fit was successful and set the reference point
+ trk.setFitSuccess(true);
+ trk.setReferencePoint(ref); // Modifies first TrackState.
+ trk.setRefPointIsDCA(true);
+
+ // Set the strategy used to find this track
+ trk.setStratetgy(trackseed.getSeedStrategy());
+
+ // Set the SeedCandidate this track is based on
+ trk.setSeedCandidate(trackseed);
+
+ // Check the track - hook for plugging in external constraint
+ //if ((_trackCheck != null) && (! _trackCheck.checkTrack(trk))) continue;
+
+ // Add the track to the list of tracks
+ tracks.add((Track) trk);
+ }
+
+ // Put the tracks back into the event and exit
+ int flag = 1<<LCIOConstants.TRBIT_HITS;
+ event.put(_TrkCollectionName, tracks, Track.class, flag);
+
+ return;
+ }
+
+ /**
+ * Compute the track fit covariance matrix
+ * @param helix - original seed track
+ * @param traj - fitted GBL trajectory
+ * @return covariance matrix.
+ */
+ private SymmetricMatrix getGblCorrectedHelixCovariance(
+ HelicalTrackFit helix, GblTrajectory traj) {
+ // TODO Actually implement this method
+ return helix.covariance();
+ }
+
+ /**
+ * Compute the updated helix parameters.
+ * @param helix - original seed track
+ * @param traj - fitted GBL trajectory
+ * @return corrected parameters.
+ */
+ private double[] getGblCorrectedHelixParameters(HelicalTrackFit helix, GblTrajectory traj) {
+ //TODO Actually implement this method
+ return helix.parameters();
+ }
+
+ public void setTrkCollectionName(String name) {
+ _TrkCollectionName = name;
+ }
+
+
+
+}
|