Author: [log in to unmask] Date: Tue May 5 02:06:17 2015 New Revision: 2900 Log: change time cuts, add optional amplitude cut Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java Tue May 5 02:06:17 2015 @@ -37,8 +37,8 @@ private double clusterSeedThreshold = 4.0; private double clusterNeighborThreshold = 3.0; private double clusterThreshold = 4.0; - private double meanTime = 24.0; - private double timeWindow = 48.0; + private double meanTime = 0.0; + private double timeWindow = 72.0; private double neighborDeltaT = 24.0; private int clusterMaxSize = 10; private int clusterCentralStripAveragingThreshold = 4; Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java Tue May 5 02:06:17 2015 @@ -14,6 +14,7 @@ import org.lcsim.detector.ITransform3D; import org.lcsim.detector.converter.compact.subdetector.HpsTracker2; import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer; +import org.lcsim.detector.tracker.silicon.DopedSilicon; import org.lcsim.detector.tracker.silicon.HpsSiSensor; import org.lcsim.detector.tracker.silicon.SiSensor; import org.lcsim.detector.tracker.silicon.SiTrackerModule; @@ -51,6 +52,7 @@ private double _clusterTimeCut = -99; // if negative, don't cut..otherwise, // dt cut time in ns private double maxDt = -99; // max time difference between the two hits in a cross + private double clusterAmplitudeCut = -99; // cluster amplitude cut private String _subdetectorName = "Tracker"; private final Map<String, String> _stereomap = new HashMap<String, String>(); private List<SvtStereoLayer> stereoLayers = null; @@ -93,6 +95,10 @@ public void setMaxDt(double maxDt) { this.maxDt = maxDt; + } + + public void setClusterAmplitudeCut(double clusterAmplitudeCut) { + this.clusterAmplitudeCut = clusterAmplitudeCut; } /** @@ -169,9 +175,11 @@ RelationalTable hittomc = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); if (event.hasCollection(LCRelation.class, "SVTTrueHitRelations")) { List<LCRelation> trueHitRelations = event.get(LCRelation.class, "SVTTrueHitRelations"); - for (LCRelation relation : trueHitRelations) - if (relation != null && relation.getFrom() != null && relation.getTo() != null) + for (LCRelation relation : trueHitRelations) { + if (relation != null && relation.getFrom() != null && relation.getTo() != null) { hittomc.add(relation.getFrom(), relation.getTo()); + } + } } List<HelicalTrack2DHit> axialhits = new ArrayList<>(); @@ -180,45 +188,58 @@ // ...for HPS, probably this is just a single one... for (String _colname : this._colnames) { if (!event.hasCollection(SiTrackerHit.class, _colname)) { - if (_debug) + if (_debug) { System.out.println("Event: " + event.getRunNumber() + " does not contain the collection " + _colname); + } continue; } // Get the list of SiTrackerHits for this collection List<SiTrackerHit> hitlist = event.get(SiTrackerHit.class, _colname); - if (_debug) + if (_debug) { System.out.printf("%s: found %d SiTrackerHits\n", this.getClass().getSimpleName(), hitlist.size()); + } Map<HelicalTrackStrip, SiTrackerHitStrip1D> stripmap = new HashMap<HelicalTrackStrip, SiTrackerHitStrip1D>(); - for (SiTrackerHit hit : hitlist) + for (SiTrackerHit hit : hitlist) { if (hit instanceof SiTrackerHitStrip1D) { // Cast the hit as a 1D strip hit and find the // identifier for the detector/layer combo SiTrackerHitStrip1D h = (SiTrackerHitStrip1D) hit; - - if ((_clusterTimeCut > 0 && Math.abs(h.getTime()) < _clusterTimeCut) || _clusterTimeCut < 0) { - // Create a HelicalTrackStrip for this hit - HelicalTrackStrip strip = makeDigiStrip(h); - for (RawTrackerHit rth : h.getRawHits()) - for (Object simHit : hittomc.allFrom(rth)) - strip.addMCParticle(((SimTrackerHit) simHit).getMCParticle()); - - // Map a reference back to the hit needed to create - // the stereo hit LC relations - stripmap.put(strip, h); - if (_debug) - System.out.printf("%s: added strip org %s layer %d\n", this.getClass().getSimpleName(), strip.origin().toString(), strip.layer()); - - if (_saveAxialHits)// - if (((HpsSiSensor) h.getSensor()).isAxial()) { - HelicalTrack2DHit haxial = makeDigiAxialHit(h); - axialhits.add(haxial); - List<RawTrackerHit> rl = haxial.getRawHits(); - for (RawTrackerHit rth : rl) - for (Object simHit : hittomc.allFrom(rth)) - haxial.addMCParticle(((SimTrackerHit) simHit).getMCParticle()); - axialmcrelations.add(new MyLCRelation(haxial, haxial.getMCParticles())); + if (clusterAmplitudeCut > 0 && h.getdEdx()/DopedSilicon.ENERGY_EHPAIR < clusterAmplitudeCut) { + continue; + } + if (_clusterTimeCut > 0 && Math.abs(h.getTime()) > _clusterTimeCut) { + continue; + } + + // Create a HelicalTrackStrip for this hit + HelicalTrackStrip strip = makeDigiStrip(h); + for (RawTrackerHit rth : h.getRawHits()) { + for (Object simHit : hittomc.allFrom(rth)) { + strip.addMCParticle(((SimTrackerHit) simHit).getMCParticle()); + } + } + + // Map a reference back to the hit needed to create + // the stereo hit LC relations + stripmap.put(strip, h); + if (_debug) { + System.out.printf("%s: added strip org %s layer %d\n", this.getClass().getSimpleName(), strip.origin().toString(), strip.layer()); + } + + if (_saveAxialHits)// + { + if (((HpsSiSensor) h.getSensor()).isAxial()) { + HelicalTrack2DHit haxial = makeDigiAxialHit(h); + axialhits.add(haxial); + List<RawTrackerHit> rl = haxial.getRawHits(); + for (RawTrackerHit rth : rl) { + for (Object simHit : hittomc.allFrom(rth)) { + haxial.addMCParticle(((SimTrackerHit) simHit).getMCParticle()); + } } + axialmcrelations.add(new MyLCRelation(haxial, haxial.getMCParticles())); + } } } else { // If not a 1D strip hit, make a pixel hit @@ -227,6 +248,7 @@ helhits.add(hit3d); hitrelations.add(new MyLCRelation(hit3d, hit)); } + } List<HelicalTrackCross> helicalTrackCrosses = new ArrayList<HelicalTrackCross>(); @@ -242,8 +264,9 @@ // This hit should be a on a stereo pair! // With our detector setup, when is this not true? - if (!_stereomap.containsKey(id) && !_stereomap.containsValue(id)) + if (!_stereomap.containsKey(id) && !_stereomap.containsValue(id)) { throw new RuntimeException(this.getClass().getSimpleName() + ": this " + id + " was not among the stereo modules!"); + } // Get the list of strips for this layer - create a new // list if one doesn't already exist @@ -258,8 +281,9 @@ lyrhits.add(strip); } - if (_debug) + if (_debug) { System.out.printf("%s: Create stereo hits from %d strips \n", this.getClass().getSimpleName(), striplistmap.size()); + } // Loop over the stereo layer pairs // TODO: Change this so that it makes use of StereoPairs @@ -267,17 +291,19 @@ // Get the second layer String id2 = _stereomap.get(id1); - if (_debug) + if (_debug) { System.out.printf("%s: Form stereo hits from sensor id %s with %d hits and %s with %d hits\n", this.getClass().getSimpleName(), id1, striplistmap.get(id1) == null ? 0 : striplistmap.get(id1).size(), id2, striplistmap.get(id2) == null ? 0 : striplistmap.get(id2).size()); + } // Form the stereo hits and add them to our hit list helicalTrackCrosses.addAll(_crosser.MakeHits(striplistmap.get(id1), striplistmap.get(id2))); } // End of loop over stereo pairs } else { - if(_debug) + if (_debug) { System.out.printf("%s: Associate %d strips to their sensors before pairing\n", this.getClass().getSimpleName(), stripmap.size()); - + } + Map<SiSensor, List<HelicalTrackStrip>> striplistmap = new HashMap<SiSensor, List<HelicalTrackStrip>>(); for (HelicalTrackStrip strip : stripmap.keySet()) { @@ -293,46 +319,50 @@ // Add the strip to the list of strips on this sensor hitsOnSensor.add(strip); - - if(_debug) + + if (_debug) { System.out.printf("%s: Adding strip hit with origin %s to sensor %s\n", this.getClass().getSimpleName(), strip.origin().toString(), sensor.getName()); - - } - - - if(_debug) { - System.out.printf("%s: Form stereo hits based on %d stereo layers:\n",this.getClass().getSimpleName(), stereoLayers.size()); - System.out.printf("%s: %42s %42s\n",this.getClass().getSimpleName(), "<axial>", "<stereo>"); + } + + } + + if (_debug) { + System.out.printf("%s: Form stereo hits based on %d stereo layers:\n", this.getClass().getSimpleName(), stereoLayers.size()); + System.out.printf("%s: %42s %42s\n", this.getClass().getSimpleName(), "<axial>", "<stereo>"); for (SvtStereoLayer stereoLayer : stereoLayers) { - System.out.printf("%s: %42s %42s\n",this.getClass().getSimpleName(), stereoLayer.getAxialSensor().getName(), stereoLayer.getStereoSensor().getName()); - } - } - - if(_debug) + System.out.printf("%s: %42s %42s\n", this.getClass().getSimpleName(), stereoLayer.getAxialSensor().getName(), stereoLayer.getStereoSensor().getName()); + } + } + + if (_debug) { System.out.printf("%s: Create crosses\n", this.getClass().getSimpleName()); - + } + //===> for (StereoPair stereoPair : SvtUtils.getInstance().getStereoPairs()) { for (SvtStereoLayer stereoLayer : stereoLayers) { - if(_debug) + if (_debug) { System.out.printf("%s: axial %s stereo %s \n", this.getClass().getSimpleName(), stereoLayer.getAxialSensor().getName(), stereoLayer.getStereoSensor().getName()); - - + } + // Form the stereo hits and add them to our hit list List<HelicalTrackCross> newCrosses; //===> if (stereoPair.getDetectorVolume() == detectorVolume.Top) { if (stereoLayer.getAxialSensor().isTopLayer()) { - if(_debug) + if (_debug) { System.out.printf("%s: make hits for top\n", this.getClass().getSimpleName()); - + } + newCrosses = _crosser.MakeHits(striplistmap.get(stereoLayer.getAxialSensor()), striplistmap.get(stereoLayer.getStereoSensor())); //===> } else if (stereoPair.getDetectorVolume() == detectorVolume.Bottom) { } else if (stereoLayer.getAxialSensor().isBottomLayer()) { - if(_debug) + if (_debug) { System.out.printf("%s: make hits for bottom\n", this.getClass().getSimpleName()); + } newCrosses = _crosser.MakeHits(striplistmap.get(stereoLayer.getStereoSensor()), striplistmap.get(stereoLayer.getAxialSensor())); - } else + } else { throw new RuntimeException("stereo pair is neither top nor bottom"); + } helicalTrackCrosses.addAll(newCrosses); } // Loop over stereo pairs @@ -344,25 +374,31 @@ iter.remove(); continue; } - if (cross.getMCParticles() != null) - for (MCParticle mcp : cross.getMCParticles()) + if (cross.getMCParticles() != null) { + for (MCParticle mcp : cross.getMCParticles()) { mcrelations.add(new MyLCRelation((HelicalTrackHit) cross, mcp)); - for (HelicalTrackStrip strip : cross.getStrips()) + } + } + for (HelicalTrackStrip strip : cross.getStrips()) { hitrelations.add(new MyLCRelation(cross, stripmap.get(strip))); - if (_debug) + } + if (_debug) { System.out.printf("%s: cross at %.2f,%.2f,%.2f \n", this.getClass().getSimpleName(), cross.getPosition()[0], cross.getPosition()[1], cross.getPosition()[2]); + } } stereoCrosses.addAll(helicalTrackCrosses); - if (_debug) + if (_debug) { System.out.printf("%s: added %d stereo hits from %s collection \n", this.getClass().getSimpleName(), helicalTrackCrosses.size(), _colname); + } } // End of loop over collection names if (_debug) { System.out.printf("%s: totally added %d stereo hits:\n", this.getClass().getSimpleName(), stereoCrosses.size()); - for (HelicalTrackCross cross : stereoCrosses) + for (HelicalTrackCross cross : stereoCrosses) { System.out.printf("%s: %.2f,%.2f,%.2f \n", this.getClass().getSimpleName(), cross.getPosition()[0], cross.getPosition()[1], cross.getPosition()[2]); + } } // Add things to the event @@ -378,8 +414,9 @@ } if (_doTransformToTracking) { addRotatedHitsToEvent(event, stereoCrosses); - if (_saveAxialHits) + if (_saveAxialHits) { addRotated2DHitsToEvent(event, axialhits); + } } } // Process() @@ -409,30 +446,36 @@ /* * Setup default pairing */ - if (_debug) + if (_debug) { System.out.printf("%s: Setup stereo hit pair modules \n", this.getClass().getSimpleName()); + } List<SiTrackerModule> modules = detector.getSubdetector(this._subdetectorName).getDetectorElement().findDescendants(SiTrackerModule.class); - if (modules.isEmpty()) + if (modules.isEmpty()) { throw new RuntimeException(this.getClass().getName() + ": No SiTrackerModules found in detector."); + } if (LayerGeometryType.Common == this._layerGeometryType) { int nLayersTotal = detector.getSubdetector(_subdetectorName).getLayering().getLayers().getNumberOfLayers(); - if (_debug) + if (_debug) { System.out.printf("%s: %d layers \n", this.getClass().getSimpleName(), nLayersTotal); - if (nLayersTotal % 2 != 0) + } + if (nLayersTotal % 2 != 0) { throw new RuntimeException(this.getClass().getName() + ": Don't know how to do stereo pairing for odd number of modules."); + } for (int i = 1; i <= (nLayersTotal) - 1; i += 2) { - if (_debug) + if (_debug) { System.out.printf("%s: Adding stereo pair: %d,%d\n", this.getClass().getSimpleName(), i, i + 1); + } setStereoPair(_subdetectorName, i, i + 1); } } - if (_debug) + if (_debug) { System.out.printf("%s: %d stereo modules added", this.getClass().getSimpleName(), this._stereomap.size()); + } } @@ -465,11 +508,11 @@ Hep3Vector org = trans.transformed(_orgloc); Hep3Vector u = global.getMeasuredCoordinate(); Hep3Vector v = global.getUnmeasuredCoordinate(); - - if (_debug) + + if (_debug) { System.out.println(this.getClass().getSimpleName() + ": makeDigiStrip: org " + org.toString() + " and u " + u.toString() + " v " + v.toString()); - - + } + double umeas = local.getPosition()[0]; double vmin = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getStartPoint()); double vmax = VecOp.dot(local.getUnmeasuredCoordinate(), local.getHitSegment().getEndPoint()); @@ -486,15 +529,18 @@ HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du, vmin, vmax, dEdx, time, rawhits, det, lyr, be); try { - if (h.getMCParticles() != null) - for (MCParticle p : h.getMCParticles()) + if (h.getMCParticles() != null) { + for (MCParticle p : h.getMCParticles()) { strip.addMCParticle(p); + } + } } catch (RuntimeException e) { // Okay when MC info not present. } - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + ": makeDigiStrip: produced HelicalTrackStrip with origin " + strip.origin().toString() + " and u " + strip.u().toString() + " v " + strip.v().toString() + " w " + strip.w().toString()); + } return strip; } @@ -525,19 +571,23 @@ Hep3Vector newu = CoordinateTransformations.transformVectorToTracking(u); Hep3Vector newv = CoordinateTransformations.transformVectorToTracking(v); HelicalTrackStrip newstrip = new HelicalTrackStrip(neworigin, newu, newv, umeas, du, vmin, vmax, dedx, time, rthList, detname, layer, bec); - for (MCParticle p : strip.MCParticles()) + for (MCParticle p : strip.MCParticles()) { newstrip.addMCParticle(p); + } rotatedstriphits.add(newstrip); - if(_debug) - System.out.printf("%s: adding rotated strip with origin %s and u %s v %s w %s \n", getClass().toString(), newstrip.origin().toString(), newstrip.u().toString(),newstrip.v().toString(), newstrip.w().toString()); + if (_debug) { + System.out.printf("%s: adding rotated strip with origin %s and u %s v %s w %s \n", getClass().toString(), newstrip.origin().toString(), newstrip.u().toString(), newstrip.v().toString(), newstrip.w().toString()); + } } HelicalTrackCross newhit = new HelicalTrackCross(rotatedstriphits.get(0), rotatedstriphits.get(1)); - for (MCParticle mcp : cross.getMCParticles()) + for (MCParticle mcp : cross.getMCParticles()) { newhit.addMCParticle(mcp); + } rotatedhits.add(newhit); hthrelations.add(new MyLCRelation(cross, newhit)); - for (MCParticle mcp : newhit.getMCParticles()) + for (MCParticle mcp : newhit.getMCParticles()) { mcrelations.add(new MyLCRelation(newhit, mcp)); + } } event.put("Rotated" + _outname, rotatedhits, HelicalTrackHit.class, 0); @@ -567,11 +617,13 @@ Hep3Vector newaxdir = CoordinateTransformations.transformVectorToTracking(axDir); SymmetricMatrix newcov = CoordinateTransformations.transformCovarianceToTracking(cov); HelicalTrack2DHit newhit = new HelicalTrack2DHit(newpos, newcov, dedx, time, rthList, detname, layer, bec, vmin, vmax, newaxdir); - for (MCParticle mcp : twodhit.getMCParticles()) + for (MCParticle mcp : twodhit.getMCParticles()) { newhit.addMCParticle(mcp); + } rotatedhits.add(newhit); - for (MCParticle mcp : newhit.getMCParticles()) + for (MCParticle mcp : newhit.getMCParticles()) { mcrelations.add(new MyLCRelation(newhit, mcp)); + } } if (_debug) { System.out.println(this.getClass().getSimpleName() + ": " + _axialname + " size = " + rotatedhits.size());