Author: [log in to unmask] Date: Wed Nov 25 12:43:16 2015 New Revision: 3988 Log: add GBL kinks to event Added: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java - copied, changed from r3956, java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackData.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.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/MakeGblTracks.java java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java Copied: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java (from r3956, java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackData.java) ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackData.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java Wed Nov 25 12:43:16 2015 @@ -1,103 +1,42 @@ -package org.hps.recon.tracking; +package org.hps.recon.tracking.gbl; import org.lcsim.event.GenericObject; /** - * Generic object used to persist track data not available through a Track - * object. + * Generic object used to persist GBL kink data. * * @author Omar Moreno <[log in to unmask]> * @author Sho Uemura <[log in to unmask]> * */ -public class TrackData implements GenericObject { +public class GBLKinkData implements GenericObject { - public static final int L1_ISOLATION_INDEX = 0; - public static final int L2_ISOLATION_INDEX = 1; - public static final int N_ISOLATIONS = 12; - public static final int TRACK_TIME_INDEX = 0; - public static final int TRACK_VOLUME_INDEX = 0; - public static final String TRACK_DATA_COLLECTION = "TrackData"; - public static final String TRACK_DATA_RELATION_COLLECTION = "TrackDataRelations"; + public static final String DATA_COLLECTION = "GBLKinkData"; + public static final String DATA_RELATION_COLLECTION = "GBLKinkDataRelations"; - private final double[] doubles; - private final float[] floats; - private final int[] ints; + private final double[] phiKinks; + private final float[] lambdaKinks; - /** - * Default constructor - */ - public TrackData() { - doubles = new double[N_ISOLATIONS]; - floats = new float[1]; - ints = new int[1]; + public GBLKinkData(float[] lambdaKinks, double[] phiKinks) { + + this.lambdaKinks = lambdaKinks; + this.phiKinks = phiKinks; } - /** - * Constructor - * - * @param trackVolume : SVT volume associated with the track - * @param trackTime : The track time - * @param isolations : an array of doubles containing isolations for every - * sensor layer - */ - public TrackData(int trackVolume, float trackTime, double[] isolations) { - - this.doubles = isolations; - this.floats = new float[]{trackTime}; - this.ints = new int[]{trackVolume}; + public double getPhiKink(int layer) { + return phiKinks[layer]; } - /** - * Get isolation value for the hit in the given sensor layer. - * - * @param layer The sensor layer of interest (0-11) - * @return The isolation value: positive if the nearest hit is outwards from - * the beam plane, negative if the nearest hit is inwards, offscale low if - * the track has no hit in this layer, offscale high if there is no other - * hit in this layer - */ - public double getIsolation(int layer) { - return doubles[layer]; + public double getLambdaKink(int layer) { + return lambdaKinks[layer]; } - /** - * @return The track time - */ - public float getTrackTime() { - return floats[TRACK_TIME_INDEX]; - } - - /** - * @return The SVT volume associated with the track - */ - public int getTrackVolume() { - return ints[TRACK_VOLUME_INDEX]; - } - - /** - * @param object : The generic object containing the data. - * @param layer The sensor layer of interest (0-11) - * @return The isolation value for the specified layer - */ - public static double getIsolation(GenericObject object, int layer) { + public static double getPhiKink(GenericObject object, int layer) { return object.getDoubleVal(layer); } - /** - * @param object : The generic object containing the data. - * @return The track time - */ - public static float getTrackTime(GenericObject object) { - return object.getFloatVal(TRACK_TIME_INDEX); - } - - /** - * @param object : The generic object containing the data. - * @return The SVT volume associated with the track - */ - public static int getTrackVolume(GenericObject object) { - return object.getIntVal(TRACK_VOLUME_INDEX); + public static double getLambdaKink(GenericObject object, int layer) { + return object.getFloatVal(layer); } /** @@ -105,7 +44,7 @@ */ @Override public double getDoubleVal(int index) { - return doubles[index]; + return phiKinks[index]; } /** @@ -113,7 +52,7 @@ */ @Override public float getFloatVal(int index) { - return floats[index]; + return lambdaKinks[index]; } /** @@ -121,7 +60,7 @@ */ @Override public int getIntVal(int index) { - return ints[index]; + throw new ArrayIndexOutOfBoundsException(); } /** @@ -129,7 +68,7 @@ */ @Override public int getNDouble() { - return doubles.length; + return phiKinks.length; } /** @@ -137,7 +76,7 @@ */ @Override public int getNFloat() { - return floats.length; + return lambdaKinks.length; } /** @@ -145,7 +84,7 @@ */ @Override public int getNInt() { - return ints.length; + return 0; } /** Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java Wed Nov 25 12:43:16 2015 @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.math3.util.Pair; import org.hps.recon.tracking.MaterialSupervisor; import org.hps.recon.tracking.MultipleScattering; import org.hps.recon.tracking.TrackUtils; @@ -68,9 +69,9 @@ Map<Track, Track> inputToRefitted = new HashMap<Track, Track>(); for (Track track : tracks) { - Track newTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, _scattering, bfield); - refittedTracks.add(newTrack); - inputToRefitted.put(track, newTrack); + Pair<Track, GBLKinkData> newTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, _scattering, bfield); + refittedTracks.add(newTrack.getFirst()); + inputToRefitted.put(track, newTrack.getFirst()); } if (mergeTracks) { @@ -105,8 +106,8 @@ } } - Track mergedTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, _scattering, bfield); - mergedTracks.add(mergedTrack); + Pair<Track, GBLKinkData> mergedTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, _scattering, bfield); + mergedTracks.add(mergedTrack.getFirst()); // System.out.format("%f %f %f\n", fit.get_chi2(), inputToRefitted.get(track).getChi2(), inputToRefitted.get(otherTrack).getChi2()); // mergedTrackToTrackList.put(mergedTrack, new ArrayList<Track>()); } 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 Wed Nov 25 12:43:16 2015 @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.apache.commons.math3.util.Pair; import org.hps.recon.tracking.CoordinateTransformations; import org.hps.recon.tracking.MaterialSupervisor; import org.hps.recon.tracking.MultipleScattering; @@ -144,16 +145,16 @@ * @param bfield B-field * @return The refitted track. */ - public static Track refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, MultipleScattering scattering, double bfield) { + public static Pair<Track, GBLKinkData> refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, MultipleScattering scattering, double bfield) { List<TrackerHit> allHthList = sortHits(hth); List<TrackerHit> sortedStripHits = sortHits(stripHits); FittedGblTrajectory fit = GblUtils.doGBLFit(helix, sortedStripHits, scattering, bfield, 0); for (int i = 0; i < nIterations; i++) { - Track newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield); - helix = TrackUtils.getHTF(newTrack); + Pair<Track, GBLKinkData> newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield); + helix = TrackUtils.getHTF(newTrack.getFirst()); fit = GblUtils.doGBLFit(helix, sortedStripHits, scattering, bfield, 0); } - Track mergedTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield); + Pair<Track, GBLKinkData> mergedTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield); return mergedTrack; } 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 Wed Nov 25 12:43:16 2015 @@ -1,27 +1,27 @@ package org.hps.recon.tracking.gbl; -import static org.hps.recon.tracking.gbl.GBLOutput.getPerToClPrj; import hep.physics.matrix.SymmetricMatrix; import hep.physics.vec.BasicHep3Vector; import hep.physics.vec.Hep3Matrix; import hep.physics.vec.Hep3Vector; import hep.physics.vec.VecOp; - import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; - import org.apache.commons.math3.util.Pair; import org.hps.recon.tracking.TrackType; +import static org.hps.recon.tracking.gbl.GBLOutput.getPerToClPrj; import org.hps.recon.tracking.gbl.matrix.Matrix; import org.hps.recon.tracking.gbl.matrix.SymMatrix; import org.hps.recon.tracking.gbl.matrix.Vector; import org.lcsim.constants.Constants; import org.lcsim.event.EventHeader; +import org.lcsim.event.LCRelation; import org.lcsim.event.Track; import org.lcsim.event.TrackState; import org.lcsim.event.TrackerHit; +import org.lcsim.event.base.BaseLCRelation; import org.lcsim.event.base.BaseTrack; import org.lcsim.event.base.BaseTrackState; import org.lcsim.fit.helicaltrack.HelicalTrackFit; @@ -67,6 +67,10 @@ List<Track> tracks = new ArrayList<Track>(); + List<GBLKinkData> kinkDataCollection = new ArrayList<GBLKinkData>(); + + List<LCRelation> kinkDataRelations = new ArrayList<LCRelation>(); + LOGGER.info("adding " + gblTrajectories.size() + " of fitted GBL tracks to the event"); for (FittedGblTrajectory fittedTraj : gblTrajectories) { @@ -75,10 +79,12 @@ SeedCandidate trackseed = seedTrack.getSeedCandidate(); // Create a new Track - Track trk = makeCorrectedTrack(fittedTraj, trackseed.getHelix(), seedTrack.getTrackerHits(), seedTrack.getType(), bfield); + Pair<Track, GBLKinkData> trk = makeCorrectedTrack(fittedTraj, trackseed.getHelix(), seedTrack.getTrackerHits(), seedTrack.getType(), bfield); // Add the track to the list of tracks - tracks.add(trk); + tracks.add(trk.getFirst()); + kinkDataCollection.add(trk.getSecond()); + kinkDataRelations.add(new BaseLCRelation(trk.getSecond(), trk.getFirst())); } LOGGER.info("adding " + Integer.toString(tracks.size()) + " Gbl tracks to event with " + event.get(Track.class, "MatchedTracks").size() + " matched tracks"); @@ -86,9 +92,11 @@ // Put the tracks back into the event and exit int flag = 1 << LCIOConstants.TRBIT_HITS; event.put(_TrkCollectionName, tracks, Track.class, flag); - } - - public static Track makeCorrectedTrack(FittedGblTrajectory fittedTraj, HelicalTrackFit helix, List<TrackerHit> trackHits, int trackType, double bfield) { + event.put(GBLKinkData.DATA_COLLECTION, kinkDataCollection, GBLKinkData.class, 0); + event.put(GBLKinkData.DATA_RELATION_COLLECTION, kinkDataRelations, LCRelation.class, 0); + } + + public static Pair<Track, GBLKinkData> makeCorrectedTrack(FittedGblTrajectory fittedTraj, HelicalTrackFit helix, List<TrackerHit> trackHits, int trackType, double bfield) { // Initialize the reference point to the origin double[] ref = new double[]{0., 0., 0.}; @@ -112,6 +120,8 @@ Pair<double[], SymmetricMatrix> correctedHelixParamsLast = getGblCorrectedHelixParameters(helix, fittedTraj.get_traj(), bfield, FittedGblTrajectory.GBLPOINT.LAST); TrackState stateLast = new BaseTrackState(correctedHelixParamsLast.getFirst(), ref, correctedHelixParamsLast.getSecond().asPackedArray(true), TrackState.AtLastHit, bfield); trk.getTrackStates().add(stateLast); + + GBLKinkData kinkData = getKinks(fittedTraj.get_traj()); // Set other info needed trk.setChisq(fittedTraj.get_chi2()); @@ -128,7 +138,7 @@ LOGGER.info(String.format("param %d: %.10f -> %.10f helix-gbl= %f", i, helix.parameters()[i], trk.getTrackParameter(i), helix.parameters()[i] - trk.getTrackParameter(i))); } } - return trk; + return new Pair<Track, GBLKinkData>(trk, kinkData); } /** @@ -285,6 +295,30 @@ return new Pair<double[], SymmetricMatrix>(parameters_gbl, cov); } + public static GBLKinkData getKinks(GblTrajectory traj) { + + // get corrections from GBL fit + Vector locPar = new Vector(5); + SymMatrix locCov = new SymMatrix(5); + float[] lambdaKinks = new float[traj.getNumPoints() - 1]; + double[] phiKinks = new double[traj.getNumPoints() - 1]; + + double oldPhi = 0, oldLambda = 0; + for (int i = 0; i < traj.getNumPoints(); i++) { + traj.getResults(i + 1, locPar, locCov); // vertex point + double newPhi = locPar.get(FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue()); + double newLambda = locPar.get(FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue()); + if (i > 0) { + lambdaKinks[i - 1] = (float) (newLambda - oldLambda); + phiKinks[i - 1] = newPhi - oldPhi; + } + oldPhi = newPhi; + oldLambda = newLambda; + } + + return new GBLKinkData(lambdaKinks, phiKinks); + } + public void setTrkCollectionName(String name) { _TrkCollectionName = name; } Modified: java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java Wed Nov 25 12:43:16 2015 @@ -124,6 +124,9 @@ continue; } tiTimeOffset = RunManager.getRunManager().getTriggerConfig().getTiTimeOffset(); + if (tiTimeOffset == 0) { + continue; + } } try { @@ -188,9 +191,15 @@ } if (useTI) { + if (firstTI == 0 || lastTI == 0) { + continue; + } startDate = new Date((long) ((firstTI + tiTimeOffset) / 1e6)); endDate = new Date((long) ((lastTI + tiTimeOffset) / 1e6)); } else { + if (firstTime == 0 || lastTime == 0) { + continue; + } startDate = new Date(firstTime * 1000); endDate = new Date(lastTime * 1000); } @@ -285,7 +294,10 @@ } if (date.after(endDate)) {//this is the last interval overlapping the file's time range; backtrack so this line will be read again for the next file date = lastDate; - br.reset(); + try { + br.reset(); + } catch (IOException e) { + } break; } br.mark(1000);