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 c713a7a0a..c617c6a24 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 @@ -35,6 +35,7 @@ public class KalTrack { private Map interceptMomVects; Map millipedeMap; Map lyrMap; + Map laymilli; public int eventNumber; public boolean bad; HelixState helixAtOrigin; @@ -317,6 +318,48 @@ private void makeMillipedeMap() { } } + private void makeLayMilli(){ + laymilli = new HashMap(14); + for (MeasurementSite site : SiteList){ + laymilli.put(site.m.millipedeID,site.m.Layer); + } + } + + public int millToLay(int millipedeID){ + if (laymilli == null) { + makeLayMilli(); + } + if (millipedeMap.containsKey(millipedeID)) { + return laymilli.get(millipedeID); + } else { + return -1; + } + } + + // Does the scatX for Millipede + public double scatXMillipede(int millipedeID){ + if (laymilli == null) { + makeLayMilli(); + } + if (laymilli.containsKey(millipedeID)) { + return scatX(laymilli.get(millipedeID)); + } else { + return -1000.0; + } + } + + // Does the scatZ for Millipede + public double scatZMillipede(int millipedeID){ + if (laymilli == null) { + makeLayMilli(); + } + if (laymilli.containsKey(millipedeID)) { + return scatZ(laymilli.get(millipedeID)); + } else { + return -1000.0; + } + } + // Find the change in smoothed helix angle in XY between one layer and the next public double scatX(int layer) { if (lyrMap == null) { 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 6121d5e67..9118deb45 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,8 @@ 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; import org.hps.recon.tracking.gbl.GBLStripClusterData; @@ -85,6 +87,7 @@ public class KalmanPatRecDriver extends Driver { private double mxChi2Vtx; // Maximum chi^2 for 5-hit tracks with a vertex constraint private int numEvtPlots; // Number of event displays to plot (gnuplot files) private boolean doDebugPlots; // Whether to make all the debugging histograms + private boolean doForLayer; // Does the track residuals and kinks per layer, not millipede id private int siHitsLimit; // Maximum number of SiClusters in one event allowed for KF pattern reco // (protection against monster events) private double seedCompThr; // Threshold for seedTrack helix parameters compatibility @@ -100,6 +103,7 @@ public class KalmanPatRecDriver extends Driver { private boolean useBeamPositionConditions; // True to use beam position from database private boolean useFixedVertexZPosition; // True to override the database just for the z beam position 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 List sensors = null; // List of tracker sensors @@ -132,10 +136,18 @@ public void setSiHitsLimit(int input) { siHitsLimit = input; } + public void setAddKinks(boolean input) { + addKinks = input; + } + public void setAddResiduals(boolean input) { addResiduals = input; } + public void setDoForLayer(boolean input) { + doForLayer = input; + } + public void setTargetPosition(double target_pos){ this.target_pos = target_pos; } @@ -322,16 +334,21 @@ public void process(EventHeader event) { //For GBL Refitting List allClstrs = new ArrayList(); List gblStripClusterDataRelations = new ArrayList(); - + + //For layer by layer X and Z Kinks + List trackXKinks = new ArrayList(); + List trackXKinksRelations = new ArrayList(); + List trackZKinks = new ArrayList(); + List trackZKinksRelations = new ArrayList(); + //For hit-on-track residuals information List trackResiduals = new ArrayList(); List trackResidualsRelations = new ArrayList(); List trackIntersects = new ArrayList(); List trackIntersectsRelations = new ArrayList(); - ArrayList[] kPatList = prepareTrackCollections(event, outputFullTracks, trackDataCollection, trackDataRelations, allClstrs, gblStripClusterDataRelations, trackResiduals, trackResidualsRelations, trackIntersects, trackIntersectsRelations); + 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){ @@ -344,12 +361,19 @@ 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); + event.put("KFZKink", trackZKinks, TrackResidualsData.class,0); + event.put("KFZKinkRelations", trackZKinksRelations,LCRelation.class,0); + } + if (addResiduals) { event.put("KFUnbiasRes", trackResiduals, TrackResidualsData.class,0); event.put("KFUnbiasResRelations",trackResidualsRelations, LCRelation.class,0); - event.put("KFUnbiasInt", trackIntersects, TrackIntersectData.class, 0); - event.put("KFUnbiasIntRelations", trackIntersectsRelations, LCRelation.class, 0); + event.put("KFUnbiasInt", trackIntersects, TrackIntersectData.class, 0); + event.put("KFUnbiasIntRelations", trackIntersectsRelations, LCRelation.class, 0); } if (kPlot != null) { @@ -384,6 +408,8 @@ public int compare(TrackerHit o1, TrackerHit o2) { private ArrayList[] prepareTrackCollections(EventHeader event, List outputFullTracks, List trackDataCollection, List trackDataRelations, List allClstrs, List gblStripClusterDataRelations, + List trackXKinks, List trackXKinksRelations, + List trackZKinks, List trackZKinksRelations, List trackResiduals, List trackResidualsRelations, List trackIntersects, List trackIntersectsRelations) { @@ -502,24 +528,27 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List layers = new ArrayList(); - List residuals = new ArrayList(); + List residuals = new ArrayList(); List sigmas = new ArrayList(); - List layersInt = new ArrayList(); - List intersect = new ArrayList(); + List layersInt = new ArrayList(); + List intersect = new ArrayList(); List sigmasInt = new ArrayList(); int uindex = 0; int vindex = 1; int windex = 2; - //...loop over clusters and save millipedID to residuals - for (GBLStripClusterData clstr : clstrs) { + for (GBLStripClusterData clstr: clstrs) { Pair res_and_sigma = kTk.unbiasedResidualMillipede(clstr.getId()); if (res_and_sigma.getSecondElement() > -1.) { - layers.add(clstr.getId()); - residuals.add(res_and_sigma.getFirstElement()); + int i = clstr.getId(); + if(doForLayer){ + i = kTk.millToLay(i); + } + layers.add(i); + residuals.add(res_and_sigma.getFirstElement()); sigmas.add(res_and_sigma.getSecondElement().floatValue()); } - }//Loop on clusters - for (int ilay = 0; ilay<14; ilay++) { + } + 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]); @@ -527,7 +556,7 @@ private ArrayList[] prepareTrackCollections(EventHeader event, List[] prepareTrackCollections(EventHeader event, List(); + List Xkinks = new ArrayList(); + List Zkinks = new ArrayList(); + for(GBLStripClusterData clstr: clstrs){ + int milliID = clstr.getId(); + int i = milliID; + if(doForLayer){ + i = kTk.millToLay(i); + } + layers.add(i); + Xkinks.add(kTk.scatXMillipede(i)); + Zkinks.add(kTk.scatZMillipede(i)); + } + TrackResidualsData kinkXData = new TrackResidualsData(trackerVolume,layers,Xkinks,sigmas); + trackXKinks.add(kinkXData); + trackXKinksRelations.add(new BaseLCRelation(kinkXData, KalmanTrackHPS)); + TrackResidualsData kinkZData = new TrackResidualsData(trackerVolume,layers,Zkinks,sigmas); + trackZKinks.add(kinkZData); + trackZKinksRelations.add(new BaseLCRelation(kinkZData, KalmanTrackHPS)); + /* if (KalmanTrackHPS.getTrackerHits().size() != residuals.size()) { System.out.println("KalmanPatRecDriver::Residuals consistency check failed."); System.out.printf("Track has %d hits while I have %d residuals \n", KalmanTrackHPS.getTrackerHits().size(), residuals.size());