From 36f0523656c74801c503b759b5609f39a179233c Mon Sep 17 00:00:00 2001 From: Matt Graham Date: Wed, 3 Dec 2025 10:04:02 -0800 Subject: [PATCH 1/6] add isolations as a generic object and save to event --- .../recon/tracking/TrackIsolationData.java | 82 +++++++++++++++++++ .../hps/recon/tracking/kalman/KalTrack.java | 46 ++++++++++- .../tracking/kalman/KalmanPatRecDriver.java | 53 +++++++++--- .../recon/tracking/kalman/Measurement.java | 21 ++++- 4 files changed, 188 insertions(+), 14 deletions(-) create mode 100644 tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java diff --git a/tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java b/tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java new file mode 100644 index 000000000..229d19590 --- /dev/null +++ b/tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java @@ -0,0 +1,82 @@ +package org.hps.recon.tracking; + +import java.util.List; +import java.util.ArrayList; + +import org.lcsim.event.GenericObject; + +public class TrackIsolationData implements GenericObject { + + List isolations = new ArrayList(); + List isot0 = new ArrayList(); + List layers = new ArrayList(); + + /** + * Default Ctor + * + * @param trackerVolume : The SVT volume to which the track used to calculate + * the residuals corresponds to. + */ + public TrackIsolationData(int trackerVolume, List layers, List isolations, List isot0){ + this.layers.addAll(layers); + this.layers.add(trackerVolume); + this.isolations.addAll(isolations); + this.isot0.addAll(isot0); + } + + /** + * + */ + @Override + public double getDoubleVal(int index) { + return isolations.get(index); + } + + /** + * + */ + @Override + public float getFloatVal(int index) { + return isot0.get(index); + } + + /** + * + */ + @Override + public int getIntVal(int index) { + return layers.get(index); + } + + /** + * + */ + @Override + public int getNDouble() { + return isolations.size(); + } + + /** + * + */ + @Override + public int getNFloat() { + return isot0.size(); + } + + /** + * + */ + @Override + public int getNInt() { + return layers.size(); + } + + /** + * + */ + @Override + public boolean isFixedSize() { + return false; + } +} diff --git a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java index 4c1fef118..256d021b2 100644 --- a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java +++ b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java @@ -4,13 +4,14 @@ import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.List; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; - +import java.util.Comparator; import org.apache.commons.math.util.FastMath; import org.ejml.data.DMatrixRMaj; import org.ejml.dense.row.CommonOps_DDRM; @@ -514,6 +515,49 @@ public Pair unbiasedIntersect(int layer, boolean local) { } } + public Pair getIsoAndT0(int layer){ + if (lyrMap == null) { + makeLyrMap(); + } + if (lyrMap.containsKey(layer)) { + return getIsoAndT0(lyrMap.get(layer)); + }else{ + return new Pair(-999., -999.); + } + } + + public Pair getIsoAndT0(MeasurementSite ms){ + double iso=-999.; + double isot0=-999.; + SiModule sensor=ms.m; + List allHits=sensor.hits; + if(allHits.size()>2 && ms.hitID>-1){ + Measurement hitOnTrack= allHits.get(ms.hitID); + double[] hpsSensorPos=KalmanInterface.localKalToHps(sensor.p.X()); + // keep track of sensor position & orientation + // use the sign of the global plane position (vertical = z) + // times the local-->global v-->z element + // to determine if sensor is aligned (+ive v --> away from beam) + // or anti-aligned (+ive v is towards beam) + + double vertPos=sensor.p.X().v[2]; + double l2gv2z=sensor.R.M[1][2]; + int awayFromBeam = (int)Math.signum(vertPos*l2gv2z); + //sort the hits on the module by increasing v + Collections.sort(allHits,Measurement.MeasurementComparatorUp); + // now get the position of nearest hit _away_ from beam + // the hits on the SiModule are sorted by v + int isoID=ms.hitID+awayFromBeam*1; + if(isoID-1){ + iso=Math.abs(allHits.get(isoID).v-allHits.get(ms.hitID).v); + isot0=allHits.get(isoID).time; + } + return new Pair(iso, isot0); + }else{ + return new Pair(-999., -999.); + } + } + // Returns the unbiased residual for the track at a given layer, together with the variance on that residual public Pair unbiasedResidual(MeasurementSite site) { double resid = -999.; diff --git a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java index 0fbf7e927..be4707491 100644 --- a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java +++ b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java @@ -17,6 +17,7 @@ import org.hps.recon.tracking.TrackData; import org.hps.recon.tracking.TrackIntersectData; import org.hps.recon.tracking.TrackResidualsData; +import org.hps.recon.tracking.TrackIsolationData; //import org.hps.recon.tracking.KFKinkData; import org.hps.recon.tracking.MaterialSupervisor.ScatteringDetectorVolume; @@ -109,6 +110,7 @@ public class KalmanPatRecDriver extends Driver { private Level logLevel = Level.WARNING; // Set log level from steering private boolean addKinks; private boolean addResiduals; // If true add the hit-on-track residuals to the LCIO event + private boolean addIsolations; // If true add the hit-on-track isolations to the LCI0 even private List sensors = null; // List of tracker sensors @@ -148,6 +150,10 @@ public void setAddResiduals(boolean input) { addResiduals = input; } + public void setAddIsolations(boolean input) { + addIsolations = input; + } + public void setDoForLayer(boolean input) { doForLayer = input; } @@ -354,8 +360,9 @@ public void process(EventHeader event) { List trackResidualsRelations = new ArrayList(); List trackIntersects = new ArrayList(); List trackIntersectsRelations = new ArrayList(); - - ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations,trackXKinks,trackXKinksRelations,trackZKinks,trackZKinksRelations,trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations); + List trackIsos = new ArrayList(); + List trackIsosRelations = new ArrayList(); + ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations,trackXKinks,trackXKinksRelations,trackZKinks,trackZKinksRelations,trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations, trackIsos, trackIsosRelations); // ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations, trackResiduals, trackResidualsRelations); //mg debug why the track data relations (and others I think) are screwed @@ -369,7 +376,7 @@ public void process(EventHeader event) { event.put("KFGBLStripClusterDataRelations", gblStripClusterDataRelations, LCRelation.class, flag); event.put("KFTrackData",trackDataCollection, TrackData.class,0); event.put("KFTrackDataRelations",trackDataRelations,LCRelation.class,0); - + if (addKinks) { event.put("KFXKink", trackXKinks, TrackResidualsData.class,0); event.put("KFXKinkRelations", trackXKinksRelations,LCRelation.class,0); @@ -384,6 +391,11 @@ public void process(EventHeader event) { event.put("KFUnbiasIntRelations", trackIntersectsRelations, LCRelation.class, 0); } + if (addIsolations) { + event.put("KFIsolations", trackIsos, TrackIsolationData.class, 0); + event.put("KFIsolationsRelations", trackIsosRelations, LCRelation.class, 0); + } + if (kPlot != null) { long startTime = System.nanoTime(); @@ -419,7 +431,9 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List trackXKinks, List trackXKinksRelations, List trackZKinks, List trackZKinksRelations, List trackResiduals, List trackResidualsRelations, - List trackIntersects, List trackIntersectsRelations) { + List trackIntersects, List trackIntersectsRelations, + List trackIsolations, List trackIsolationsRelations + ) { int evtNumb = event.getEventNumber(); String stripHitInputCollectionName = "StripClusterer_SiTrackerHitStrip1D"; @@ -537,13 +551,7 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List layers = new ArrayList(); List residuals = new ArrayList(); - List sigmas = new ArrayList(); - List layersInt = new ArrayList(); - List intersect = new ArrayList(); - List sigmasInt = new ArrayList(); - int uindex = 0; - int vindex = 1; - int windex = 2; + List sigmas = new ArrayList(); for (GBLStripClusterData clstr: clstrs) { Pair res_and_sigma = kTk.unbiasedResidualMillipede(clstr.getId()); if (res_and_sigma.getSecondElement() > -1.) { @@ -556,13 +564,31 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List layersInt = new ArrayList(); + List intersect = new ArrayList(); + List sigmasInt = new ArrayList(); + + int uindex = 0; + int vindex = 1; + int windex = 2; + //And the track isolations + List layersIso = new ArrayList(); + List iso = new ArrayList(); + List isot0 = new ArrayList(); + for(int ilay = 0;ilay<14;ilay++){ Pair inter_and_sigma = kTk.unbiasedIntersect(ilay, true); layersInt.add(ilay); intersect.add(inter_and_sigma.getFirstElement()[uindex]); intersect.add(inter_and_sigma.getFirstElement()[vindex]); intersect.add(inter_and_sigma.getFirstElement()[windex]); - sigmasInt.add(inter_and_sigma.getSecondElement().floatValue()); + sigmasInt.add(inter_and_sigma.getSecondElement().floatValue()); + //get isolations + Pair isolation=kTk.getIsoAndT0(ilay); + layersIso.add(ilay); + iso.add(isolation.getFirstElement()); + isot0.add(isolation.getSecondElement().floatValue()); }//Loop on layers //Add the Track Data @@ -576,6 +602,9 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List MeasurementComparatorUp = new Comparator() { + public int compare(Measurement s1, Measurement s2) { + double v1 = s1.v; + double v2 = s2.v; + if(v1==v2) + return(0); + else if(v1>v2) + return(1); + else + return(-1); + } + }; + } From 400cdc406e3a15a371b04442f800bfae3d3771fb Mon Sep 17 00:00:00 2001 From: Matt Graham Date: Wed, 3 Dec 2025 15:09:10 -0800 Subject: [PATCH 2/6] use the double array in TrackData to store the isolations instead --- .../recon/tracking/TrackIsolationData.java | 82 ------------------- .../tracking/kalman/KalmanPatRecDriver.java | 55 +++++-------- 2 files changed, 22 insertions(+), 115 deletions(-) delete mode 100644 tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java diff --git a/tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java b/tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java deleted file mode 100644 index 229d19590..000000000 --- a/tracking/src/main/java/org/hps/recon/tracking/TrackIsolationData.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.hps.recon.tracking; - -import java.util.List; -import java.util.ArrayList; - -import org.lcsim.event.GenericObject; - -public class TrackIsolationData implements GenericObject { - - List isolations = new ArrayList(); - List isot0 = new ArrayList(); - List layers = new ArrayList(); - - /** - * Default Ctor - * - * @param trackerVolume : The SVT volume to which the track used to calculate - * the residuals corresponds to. - */ - public TrackIsolationData(int trackerVolume, List layers, List isolations, List isot0){ - this.layers.addAll(layers); - this.layers.add(trackerVolume); - this.isolations.addAll(isolations); - this.isot0.addAll(isot0); - } - - /** - * - */ - @Override - public double getDoubleVal(int index) { - return isolations.get(index); - } - - /** - * - */ - @Override - public float getFloatVal(int index) { - return isot0.get(index); - } - - /** - * - */ - @Override - public int getIntVal(int index) { - return layers.get(index); - } - - /** - * - */ - @Override - public int getNDouble() { - return isolations.size(); - } - - /** - * - */ - @Override - public int getNFloat() { - return isot0.size(); - } - - /** - * - */ - @Override - public int getNInt() { - return layers.size(); - } - - /** - * - */ - @Override - public boolean isFixedSize() { - return false; - } -} diff --git a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java index be4707491..3f1766d49 100644 --- a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java +++ b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java @@ -17,7 +17,7 @@ import org.hps.recon.tracking.TrackData; import org.hps.recon.tracking.TrackIntersectData; import org.hps.recon.tracking.TrackResidualsData; -import org.hps.recon.tracking.TrackIsolationData; +//import org.hps.recon.tracking.TrackIsolationData; //import org.hps.recon.tracking.KFKinkData; import org.hps.recon.tracking.MaterialSupervisor.ScatteringDetectorVolume; @@ -110,7 +110,7 @@ public class KalmanPatRecDriver extends Driver { private Level logLevel = Level.WARNING; // Set log level from steering private boolean addKinks; private boolean addResiduals; // If true add the hit-on-track residuals to the LCIO event - private boolean addIsolations; // If true add the hit-on-track isolations to the LCI0 even + // private boolean addIsolations; // If true add the hit-on-track isolations to the LCI0 even private List sensors = null; // List of tracker sensors @@ -150,9 +150,11 @@ public void setAddResiduals(boolean input) { addResiduals = input; } + /* public void setAddIsolations(boolean input) { addIsolations = input; } + */ public void setDoForLayer(boolean input) { doForLayer = input; @@ -360,15 +362,10 @@ public void process(EventHeader event) { List trackResidualsRelations = new ArrayList(); List trackIntersects = new ArrayList(); List trackIntersectsRelations = new ArrayList(); - List trackIsos = new ArrayList(); - List trackIsosRelations = new ArrayList(); - ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations,trackXKinks,trackXKinksRelations,trackZKinks,trackZKinksRelations,trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations, trackIsos, trackIsosRelations); - - // ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations, trackResiduals, trackResidualsRelations); - //mg debug why the track data relations (and others I think) are screwed - // for (LCRelation tdRel: trackDataRelations){ - // System.out.println(tdRel.getFrom()+" ---> " +tdRel.getTo()); - // } + // List trackIsos = new ArrayList(); + //List trackIsosRelations = new ArrayList(); + //ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations,trackXKinks,trackXKinksRelations,trackZKinks,trackZKinksRelations,trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations, trackIsos, trackIsosRelations); + ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations,trackXKinks,trackXKinksRelations,trackZKinks,trackZKinksRelations,trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations); int flag = 1 << LCIOConstants.TRBIT_HITS; event.put(outputFullTrackCollectionName, outputFullTracks, Track.class, flag); @@ -391,10 +388,10 @@ public void process(EventHeader event) { event.put("KFUnbiasIntRelations", trackIntersectsRelations, LCRelation.class, 0); } - if (addIsolations) { - event.put("KFIsolations", trackIsos, TrackIsolationData.class, 0); - event.put("KFIsolationsRelations", trackIsosRelations, LCRelation.class, 0); - } + // if (addIsolations) { + // event.put("KFIsolations", trackIsos, TrackIsolationData.class, 0); + //event.put("KFIsolationsRelations", trackIsosRelations, LCRelation.class, 0); + //} if (kPlot != null) { long startTime = System.nanoTime(); @@ -431,8 +428,8 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List trackXKinks, List trackXKinksRelations, List trackZKinks, List trackZKinksRelations, List trackResiduals, List trackResidualsRelations, - List trackIntersects, List trackIntersectsRelations, - List trackIsolations, List trackIsolationsRelations + List trackIntersects, List trackIntersectsRelations + // List trackIsolations, List trackIsolationsRelations ) { int evtNumb = event.getEventNumber(); @@ -514,9 +511,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List[] prepareTrackCollections(EventHeader event, List layersIso = new ArrayList(); List iso = new ArrayList(); List isot0 = new ArrayList(); - + double[] isolationsArray=new double[14]; for(int ilay = 0;ilay<14;ilay++){ Pair inter_and_sigma = kTk.unbiasedIntersect(ilay, true); layersInt.add(ilay); @@ -586,13 +580,14 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List isolation=kTk.getIsoAndT0(ilay); - layersIso.add(ilay); - iso.add(isolation.getFirstElement()); - isot0.add(isolation.getSecondElement().floatValue()); + // layersIso.add(ilay); + // iso.add(isolation.getFirstElement()); + // isot0.add(isolation.getSecondElement().floatValue()); + isolationsArray[ilay]=isolation.getFirstElement(); }//Loop on layers //Add the Track Data - TrackData KFtrackData = new TrackData(trackerVolume, (float) kTk.getTime(), qualityArray, momentum_f, (float) origin_bFieldY, (float) target_bFieldY, (float) ecal_bFieldY, (float) svtCenter_bFieldY); + TrackData KFtrackData = new TrackData(trackerVolume, (float) kTk.getTime(), isolationsArray, momentum_f, (float) origin_bFieldY, (float) target_bFieldY, (float) ecal_bFieldY, (float) svtCenter_bFieldY); trackDataCollection.add(KFtrackData); trackDataRelations.add(new BaseLCRelation(KFtrackData, KalmanTrackHPS)); @@ -602,10 +597,11 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List(); @@ -627,13 +623,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List Date: Wed, 3 Dec 2025 15:11:20 -0800 Subject: [PATCH 3/6] clean up commented code --- .../tracking/kalman/KalmanPatRecDriver.java | 43 +------------------ 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java index 3f1766d49..4cc683600 100644 --- a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java +++ b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalmanPatRecDriver.java @@ -17,8 +17,6 @@ import org.hps.recon.tracking.TrackData; import org.hps.recon.tracking.TrackIntersectData; import org.hps.recon.tracking.TrackResidualsData; -//import org.hps.recon.tracking.TrackIsolationData; -//import org.hps.recon.tracking.KFKinkData; import org.hps.recon.tracking.MaterialSupervisor.ScatteringDetectorVolume; import org.hps.recon.tracking.MaterialSupervisor.SiStripPlane; @@ -110,7 +108,6 @@ public class KalmanPatRecDriver extends Driver { private Level logLevel = Level.WARNING; // Set log level from steering private boolean addKinks; private boolean addResiduals; // If true add the hit-on-track residuals to the LCIO event - // private boolean addIsolations; // If true add the hit-on-track isolations to the LCI0 even private List sensors = null; // List of tracker sensors @@ -150,12 +147,6 @@ public void setAddResiduals(boolean input) { addResiduals = input; } - /* - public void setAddIsolations(boolean input) { - addIsolations = input; - } - */ - public void setDoForLayer(boolean input) { doForLayer = input; } @@ -362,9 +353,7 @@ public void process(EventHeader event) { List trackResidualsRelations = new ArrayList(); List trackIntersects = new ArrayList(); List trackIntersectsRelations = new ArrayList(); - // List trackIsos = new ArrayList(); - //List trackIsosRelations = new ArrayList(); - //ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations,trackXKinks,trackXKinksRelations,trackZKinks,trackZKinksRelations,trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations, trackIsos, trackIsosRelations); + ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations,trackXKinks,trackXKinksRelations,trackZKinks,trackZKinksRelations,trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations); int flag = 1 << LCIOConstants.TRBIT_HITS; @@ -388,11 +377,6 @@ public void process(EventHeader event) { event.put("KFUnbiasIntRelations", trackIntersectsRelations, LCRelation.class, 0); } - // if (addIsolations) { - // event.put("KFIsolations", trackIsos, TrackIsolationData.class, 0); - //event.put("KFIsolationsRelations", trackIsosRelations, LCRelation.class, 0); - //} - if (kPlot != null) { long startTime = System.nanoTime(); @@ -429,7 +413,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List trackZKinks, List trackZKinksRelations, List trackResiduals, List trackResidualsRelations, List trackIntersects, List trackIntersectsRelations - // List trackIsolations, List trackIsolationsRelations ) { int evtNumb = event.getEventNumber(); @@ -455,12 +438,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List rawhits = event.get(RawTrackerHit.class, "SVTRawTrackerHits"); - //if (rawhits == null) { - // logger.log(Level.FINE, String.format("KalmanPatRecDriver.process: the raw hits collection is missing")); - // return null; - //} - int nKalTracks = 0; for (int topBottom=0; topBottom<2; ++topBottom) { ArrayList kPat = kPatList[topBottom]; @@ -483,11 +460,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List clstrs = KI.createGBLStripClusterData(kTk); @@ -566,10 +538,7 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List layersIso = new ArrayList(); - List iso = new ArrayList(); - List isot0 = new ArrayList(); + double[] isolationsArray=new double[14]; for(int ilay = 0;ilay<14;ilay++){ Pair inter_and_sigma = kTk.unbiasedIntersect(ilay, true); @@ -580,9 +549,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List isolation=kTk.getIsoAndT0(ilay); - // layersIso.add(ilay); - // iso.add(isolation.getFirstElement()); - // isot0.add(isolation.getSecondElement().floatValue()); isolationsArray[ilay]=isolation.getFirstElement(); }//Loop on layers @@ -597,11 +563,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List(); From 1e3a7224e15c17e81df0fc02bd56ab59c0c8b642 Mon Sep 17 00:00:00 2001 From: Matt Graham Date: Fri, 5 Dec 2025 10:36:25 -0700 Subject: [PATCH 4/6] Update condition to check allHits size in KalTrack --- .../src/main/java/org/hps/recon/tracking/kalman/KalTrack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java index 256d021b2..03738dcca 100644 --- a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java +++ b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java @@ -531,7 +531,7 @@ public Pair getIsoAndT0(MeasurementSite ms){ double isot0=-999.; SiModule sensor=ms.m; List allHits=sensor.hits; - if(allHits.size()>2 && ms.hitID>-1){ + if(allHits.size()>1 && ms.hitID>-1){ Measurement hitOnTrack= allHits.get(ms.hitID); double[] hpsSensorPos=KalmanInterface.localKalToHps(sensor.p.X()); // keep track of sensor position & orientation From 4967fffa52b1b745679dee2fe44b5276bb467e53 Mon Sep 17 00:00:00 2001 From: Matt Graham Date: Fri, 5 Dec 2025 10:41:23 -0700 Subject: [PATCH 5/6] Remove unused variable hpsSensorPos Remove unused variable hpsSensorPos in KalTrack.java --- .../src/main/java/org/hps/recon/tracking/kalman/KalTrack.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java index 03738dcca..d89d6d25c 100644 --- a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java +++ b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java @@ -533,13 +533,12 @@ public Pair getIsoAndT0(MeasurementSite ms){ List allHits=sensor.hits; if(allHits.size()>1 && ms.hitID>-1){ Measurement hitOnTrack= allHits.get(ms.hitID); - double[] hpsSensorPos=KalmanInterface.localKalToHps(sensor.p.X()); + // keep track of sensor position & orientation // use the sign of the global plane position (vertical = z) // times the local-->global v-->z element // to determine if sensor is aligned (+ive v --> away from beam) // or anti-aligned (+ive v is towards beam) - double vertPos=sensor.p.X().v[2]; double l2gv2z=sensor.R.M[1][2]; int awayFromBeam = (int)Math.signum(vertPos*l2gv2z); From 3dafcbcd33f045a5a4eeeced78989a1a903ee960 Mon Sep 17 00:00:00 2001 From: Matt Graham Date: Fri, 5 Dec 2025 15:23:41 -0800 Subject: [PATCH 6/6] require the iso hit be within 40ns of hit on track --- .../org/hps/recon/tracking/kalman/KalTrack.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java index 256d021b2..946d91d70 100644 --- a/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java +++ b/tracking/src/main/java/org/hps/recon/tracking/kalman/KalTrack.java @@ -533,6 +533,7 @@ public Pair getIsoAndT0(MeasurementSite ms){ List allHits=sensor.hits; if(allHits.size()>2 && ms.hitID>-1){ Measurement hitOnTrack= allHits.get(ms.hitID); + double hitTime=hitOnTrack.time; double[] hpsSensorPos=KalmanInterface.localKalToHps(sensor.p.X()); // keep track of sensor position & orientation // use the sign of the global plane position (vertical = z) @@ -546,11 +547,17 @@ public Pair getIsoAndT0(MeasurementSite ms){ //sort the hits on the module by increasing v Collections.sort(allHits,Measurement.MeasurementComparatorUp); // now get the position of nearest hit _away_ from beam - // the hits on the SiModule are sorted by v - int isoID=ms.hitID+awayFromBeam*1; - if(isoID-1){ - iso=Math.abs(allHits.get(isoID).v-allHits.get(ms.hitID).v); - isot0=allHits.get(isoID).time; + // within 40ns of original hit + int nSteps=1; + int isoID=ms.hitID+awayFromBeam*nSteps; + while(isoID-1){ + if(Math.abs(allHits.get(isoID).time-hitTime)<40.0){ + iso=Math.abs(allHits.get(isoID).v-hitOnTrack.v); + isot0=allHits.get(isoID).time; + break; + }//otherwise step to the next one + nSteps++; + isoID=ms.hitID+awayFromBeam*nSteps; } return new Pair(iso, isot0); }else{