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..4bf50749b 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,54 @@ 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()>1 && ms.hitID>-1){ + Measurement hitOnTrack= allHits.get(ms.hitID); + double hitTime=hitOnTrack.time; + // 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 + // 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{ + 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..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,7 +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.KFKinkData; import org.hps.recon.tracking.MaterialSupervisor.ScatteringDetectorVolume; import org.hps.recon.tracking.MaterialSupervisor.SiStripPlane; @@ -354,14 +353,8 @@ 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); - - // 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()); - // } int flag = 1 << LCIOConstants.TRBIT_HITS; event.put(outputFullTrackCollectionName, outputFullTracks, Track.class, flag); @@ -369,7 +362,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); @@ -419,7 +412,8 @@ 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 + ) { int evtNumb = event.getEventNumber(); String stripHitInputCollectionName = "StripClusterer_SiTrackerHitStrip1D"; @@ -444,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]; @@ -472,11 +460,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List clstrs = KI.createGBLStripClusterData(kTk); @@ -500,9 +483,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List[] 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,17 +530,30 @@ 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; + + double[] isolationsArray=new double[14]; 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); + 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)); @@ -577,7 +564,6 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List(); List Xkinks = new ArrayList(); @@ -598,13 +584,6 @@ 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); + } + }; + }