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; + } + + + +}