Author: [log in to unmask] Date: Fri Apr 24 16:58:23 2015 New Revision: 2815 Log: Merge in minor updates from trunk. Added: java/branches/HPSJAVA-488/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim - copied unchanged from r2814, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim Modified: java/branches/HPSJAVA-488/ (props changed) java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/StripMaker.java Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java ============================================================================= --- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java (original) +++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java Fri Apr 24 16:58:23 2015 @@ -8,23 +8,27 @@ import hep.aida.IHistogram2D; import hep.aida.IPlotter; import hep.aida.IPlotterStyle; +import hep.physics.vec.BasicHep3Vector; +import hep.physics.vec.Hep3Vector; import java.io.IOException; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import org.hps.recon.ecal.triggerbank.AbstractIntData; -import org.hps.recon.ecal.triggerbank.TDCData; -import org.hps.recon.ecal.triggerbank.TIData; +import org.hps.recon.tracking.FittedRawTrackerHit; import org.hps.recon.tracking.ShapeFitParameters; import org.lcsim.detector.tracker.silicon.HpsSiSensor; import org.lcsim.event.EventHeader; import org.lcsim.event.GenericObject; import org.lcsim.event.LCRelation; import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.RelationalTable; +import org.lcsim.event.SimTrackerHit; import org.lcsim.event.TrackerHit; +import org.lcsim.event.base.BaseRelationalTable; import org.lcsim.geometry.Detector; /** @@ -88,8 +92,16 @@ //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639); IHistogram1D occupancyPlot = createSensorPlot(plotDir + "occupancy_", sensor, maxChannels, 0, maxChannels - 1); IHistogram1D t0Plot = createSensorPlot(plotDir + "t0Hit_", sensor, 400, -100., 100.); + IHistogram1D nHits = createSensorPlot(plotDir + "nHitsPerEvent_", sensor, 100, -0.5, 99.5); + IHistogram1D pileup = createSensorPlot(plotDir + "nFitsPerHit_", sensor, 3, 0.5, 3.5); + IHistogram1D amplitudePlot = createSensorPlot(plotDir + "amplitude_", sensor, 50, 0, 4000.0); IHistogram2D t0AmpPlot = createSensorPlot2D(plotDir + "t0AmpHit_", sensor, 200, -100., 100., 50, 0, 4000.0); + IHistogram2D t0ChanPlot = createSensorPlot2D(plotDir + "t0ChanBigHit_", sensor, 640, -0.5, 639.5, 200, -100., 100.); + IHistogram2D ampChanPlot = createSensorPlot2D(plotDir + "ampChanHit_", sensor, 640, -0.5, 639.5, 50, 0, 4000); + IHistogram2D chiprobChanPlot = createSensorPlot2D(plotDir + "chiprobChanBigHit_", sensor, 640, -0.5, 639.5, 50, 0, 1.0); + IHistogram2D t0TrigTimeHitPlot = createSensorPlot2D(plotDir + "t0BigHitTrigTime_", sensor, 400, -100., 100., 6, -2, 22); + IHistogram1D chiProbPlot = createSensorPlot(plotDir + "chiProb_", sensor, 50, 0, 1.0); IHistogram1D t0ClusterPlot = createSensorPlot(plotDir + "t0Cluster_", sensor, 400, -100., 100.); IHistogram2D t0TrigTimePlot = createSensorPlot2D(plotDir + "t0ClusterTrigTime_", sensor, 400, -100., 100., 6, -2, 22); @@ -104,30 +116,63 @@ public void process(EventHeader event) { /* increment the strip occupancy arrays */ + Map<String, Integer> hitsPerSensor = new HashMap<String, Integer>(); + if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) { // System.out.println("Found a raw hit collection"); List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); for (RawTrackerHit hit : rawTrackerHits) { int[] strips = occupancyMap.get(hit.getDetectorElement().getName()); strips[hit.getIdentifierFieldValue("strip")] += 1; + + Integer nHits = hitsPerSensor.get(hit.getDetectorElement().getName()); + if (nHits == null) { + nHits = 0; + } + nHits++; + hitsPerSensor.put(hit.getDetectorElement().getName(), nHits); } ++eventCountRaw; + } + for (HpsSiSensor sensor : sensors) { + IHistogram1D sensorHist = getSensorPlot(plotDir + "nHitsPerEvent_", sensor); + Integer nHits = hitsPerSensor.get(sensor.getName()); + if (nHits == null) { + sensorHist.fill(0); + } else { + sensorHist.fill(nHits); + } } /* fill the FittedTrackerHit related histograms */ if (event.hasCollection(LCRelation.class, fittedTrackerHitCollectionName)) { List<LCRelation> fittedTrackerHits = event.get(LCRelation.class, fittedTrackerHitCollectionName); + + RelationalTable rthtofit = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + for (LCRelation hit : fittedTrackerHits) { + rthtofit.add(FittedRawTrackerHit.getRawTrackerHit(hit), FittedRawTrackerHit.getShapeFitParameters(hit)); + } + for (LCRelation hit : fittedTrackerHits) { RawTrackerHit rth = (RawTrackerHit) hit.getFrom(); GenericObject pars = (GenericObject) hit.getTo(); + String sensorName = getNiceSensorName((HpsSiSensor) rth.getDetectorElement()); //this is a clever way to get the parameters we want from the generic object double t0 = ShapeFitParameters.getT0(pars); double amp = ShapeFitParameters.getAmp(pars); double chiProb = ShapeFitParameters.getChiProb(pars); + int channel = rth.getIdentifierFieldValue("strip"); + getSensorPlot(plotDir + "nFitsPerHit_", sensorName).fill(rthtofit.allFrom(rth).size()); getSensorPlot(plotDir + "t0Hit_", sensorName).fill(t0); getSensorPlot(plotDir + "amplitude_", sensorName).fill(amp); getSensorPlot2D(plotDir + "t0AmpHit_", sensorName).fill(t0, amp); getSensorPlot(plotDir + "chiProb_", sensorName).fill(chiProb); + getSensorPlot2D(plotDir + "ampChanHit_", sensorName).fill(channel, amp); + if (amp > 1000.0) { + getSensorPlot2D(plotDir + "t0ChanBigHit_", sensorName).fill(channel, t0); + getSensorPlot2D(plotDir + "chiprobChanBigHit_", sensorName).fill(channel, chiProb); + getSensorPlot2D(plotDir + "t0BigHitTrigTime_", sensorName).fill(t0, event.getTimeStamp() % 24); + } } ++eventCountFit; } Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java ============================================================================= --- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java (original) +++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java Fri Apr 24 16:58:23 2015 @@ -31,9 +31,12 @@ private final String rotatedHelicalTrackHitRelationsCollectionName = "RotatedHelicalTrackHitRelations"; private String trackCollectionName = "MatchedTracks"; private final String trackerName = "Tracker"; + private static final String nameStrip = "Tracker_TestRunModule_"; String ecalSubdetectorName = "Ecal"; String ecalCollectionName = "EcalClusters"; private Detector detector = null; + private List<HpsSiSensor> sensors; + IDDecoder dec; int nEvents = 0; int nTotTracks = 0; @@ -66,10 +69,20 @@ IHistogram1D trklam = aida.histogram1D(plotDir + "tan(lambda) ", 25, -0.1, 0.1); IHistogram1D trkz0 = aida.histogram1D(plotDir + "z0 ", 25, -1.0, 1.0); IHistogram1D nHits = aida.histogram1D(plotDir + "Hits per Track", 2, 5, 7); - IHistogram1D trackMeanTime = aida.histogram1D(plotDir + "Mean time of hits on track", 200, -20., 20.); + IHistogram1D trackMeanTime = aida.histogram1D(plotDir + "Mean time of hits on track", 400, -100., 100.); IHistogram1D trackRMSTime = aida.histogram1D(plotDir + "RMS time of hits on track", 200, 0., 15.); IHistogram2D trackChi2RMSTime = aida.histogram2D(plotDir + "Track chi2 vs. RMS time of hits", 200, 0., 15., 25, 0, 25.0); IHistogram1D seedRMSTime = aida.histogram1D(plotDir + "RMS time of hits on seed layers", 200, 0., 15.); + + // Make a list of SiSensors in the SVT. + sensors = this.detector.getSubdetector(trackerName).getDetectorElement().findDescendants(HpsSiSensor.class); + + // Setup the occupancy plots. + aida.tree().cd("/"); + for (HpsSiSensor sensor : sensors) { + //IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName().replaceAll("Tracker_TestRunModule_", ""), 640, 0, 639); + IHistogram1D hitTimeResidual = createSensorPlot(plotDir + "hitTimeResidual_", sensor, 100, -20, 20); + } } @@ -141,10 +154,13 @@ Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit)); for (TrackerHit hts : htsList) { rmsTime += Math.pow(hts.getTime() - meanTime, 2); - int layer = ((HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement()).getLayerNumber(); + HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) hts.getRawHits().get(0)).getDetectorElement(); + int layer = sensor.getLayerNumber(); if (layer <= 6) { rmsSeedTime += Math.pow(hts.getTime() - meanSeedTime, 2); } + String sensorName = getNiceSensorName(sensor); + getSensorPlot(plotDir + "hitTimeResidual_", sensorName).fill(hts.getTime() - meanTime); } } rmsTime = Math.sqrt(rmsTime / nStrips); @@ -185,4 +201,32 @@ System.out.println("ALTER TABLE dqm ADD " + entry.getKey() + " double;"); } } + + private IHistogram1D getSensorPlot(String prefix, HpsSiSensor sensor) { + String hname = prefix + getNiceSensorName(sensor); + return aida.histogram1D(hname); + } + + private IHistogram1D getSensorPlot(String prefix, String sensorName) { + return aida.histogram1D(prefix + sensorName); + } + + private IHistogram1D createSensorPlot(String prefix, HpsSiSensor sensor, int nchan, double min, double max) { + String hname = prefix + getNiceSensorName(sensor); + IHistogram1D hist = aida.histogram1D(hname, nchan, min, max); + hist.setTitle(sensor.getName().replaceAll(nameStrip, "") + .replace("module", "mod") + .replace("layer", "lyr") + .replace("sensor", "sens")); + + return hist; + } + + private String getNiceSensorName(HpsSiSensor sensor) { + return sensor.getName().replaceAll(nameStrip, "") + .replace("module", "mod") + .replace("layer", "lyr") + .replace("sensor", "sens"); + } + } Modified: java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java ============================================================================= --- java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java (original) +++ java/branches/HPSJAVA-488/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java Fri Apr 24 16:58:23 2015 @@ -56,16 +56,16 @@ /* beamspot constrained */ IHistogram1D nV0 = aida.histogram1D(plotDir + "Number of V0 per event", 10, 0, 10); IHistogram1D bsconMass = aida.histogram1D(plotDir + "BS Constrained Mass (GeV)", 100, 0, 0.200); - IHistogram1D bsconVx = aida.histogram1D(plotDir + "BS Constrained Vx (mm)", 50, -1, 1); - IHistogram1D bsconVy = aida.histogram1D(plotDir + "BS Constrained Vy (mm)", 50, -1, 1); - IHistogram1D bsconVz = aida.histogram1D(plotDir + "BS Constrained Vz (mm)", 50, -10, 10); - IHistogram1D bsconChi2 = aida.histogram1D(plotDir + "BS Constrained Chi2", 25, 0, 25); + IHistogram1D bsconVx = aida.histogram1D(plotDir + "BS Constrained Vx (mm)", 200, -5, 5); + IHistogram1D bsconVy = aida.histogram1D(plotDir + "BS Constrained Vy (mm)", 200, -5, 5); + IHistogram1D bsconVz = aida.histogram1D(plotDir + "BS Constrained Vz (mm)", 200, -50, 50); + IHistogram1D bsconChi2 = aida.histogram1D(plotDir + "BS Constrained Chi2", 100, 0, 100); /* target constrained */ IHistogram1D tarconMass = aida.histogram1D(plotDir + "Target Constrained Mass (GeV)", 100, 0, 0.200); - IHistogram1D tarconVx = aida.histogram1D(plotDir + "Target Constrained Vx (mm)", 50, -1, 1); - IHistogram1D tarconVy = aida.histogram1D(plotDir + "Target Constrained Vy (mm)", 50, -1, 1); - IHistogram1D tarconVz = aida.histogram1D(plotDir + "Target Constrained Vz (mm)", 50, -10, 10); - IHistogram1D tarconChi2 = aida.histogram1D(plotDir + "Target Constrained Chi2", 25, 0, 25); + IHistogram1D tarconVx = aida.histogram1D(plotDir + "Target Constrained Vx (mm)", 200, -5, 5); + IHistogram1D tarconVy = aida.histogram1D(plotDir + "Target Constrained Vy (mm)", 200, -5, 5); + IHistogram1D tarconVz = aida.histogram1D(plotDir + "Target Constrained Vz (mm)", 200, -50, 50); + IHistogram1D tarconChi2 = aida.histogram1D(plotDir + "Target Constrained Chi2", 100, 0, 100); } Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java ============================================================================= --- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java (original) +++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/RawTrackerHitFitterDriver.java Fri Apr 24 16:58:23 2015 @@ -29,12 +29,14 @@ private String fittedHitCollectionName = "SVTFittedRawTrackerHits"; private int genericObjectFlags = 1 << LCIOConstants.GOBIT_FIXED; private int relationFlags = 0; + private double timeOffset = 0.0; private boolean correctT0Shift = false; private boolean useTimestamps = false; private boolean useTruthTime = false; private boolean subtractTOF = false; private boolean subtractTriggerTime = false; private int triggerPhaseOffset = 4; + private boolean correctChanT0 = true; /** * Report time relative to the nearest expected truth event time. @@ -47,6 +49,10 @@ public void setDebug(boolean debug) { this.debug = debug; + } + + public void setTimeOffset(double timeOffset) { + this.timeOffset = timeOffset; } public void setCorrectT0Shift(boolean correctT0Shift) { @@ -67,6 +73,10 @@ public void setTriggerPhaseOffset(int triggerPhaseOffset) { this.triggerPhaseOffset = triggerPhaseOffset; + } + + public void setCorrectChanT0(boolean correctChanT0) { + this.correctChanT0 = correctChanT0; } public void setFitAlgorithm(String fitAlgorithm) { @@ -134,8 +144,13 @@ //===> ChannelConstants constants = HPSSVTCalibrationConstants.getChannelConstants((SiSensor) hit.getDetectorElement(), strip); //for (ShapeFitParameters fit : _shaper.fitShape(hit, constants)) { for (ShapeFitParameters fit : fitter.fitShape(hit, shape)) { + fit.setT0(fit.getT0() - timeOffset); + if (subtractTriggerTime) { fit.setT0(fit.getT0() - (((event.getTimeStamp() + 4 * triggerPhaseOffset) % 24) - 12)); + } + if (correctChanT0) { + fit.setT0(fit.getT0() - sensor.getShapeFitParameters(strip)[HpsSiSensor.T0_INDEX]); } if (correctT0Shift) { //===> fit.setT0(fit.getT0() - constants.getT0Shift()); Modified: java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/StripMaker.java ============================================================================= --- java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/StripMaker.java (original) +++ java/branches/HPSJAVA-488/tracking/src/main/java/org/hps/recon/tracking/StripMaker.java Fri Apr 24 16:58:23 2015 @@ -26,7 +26,7 @@ import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType; /** - * + * * @author Matt Graham */ // TODO: Add class documentation. @@ -87,7 +87,6 @@ public List<SiTrackerHit> makeHits(SiSensor sensor) { // System.out.println("makeHits: " + sensor.getName()); - List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>(); // Get SiTrackerIdentifierHelper for this sensor and refresh the strip map used to increase @@ -183,8 +182,9 @@ } private SiTrackerHitStrip1D makeTrackerHit(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) { - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " makeTrackerHit "); + } Hep3Vector position = getPosition(cluster, electrodes); SymmetricMatrix covariance = getCovariance(cluster, electrodes); double time = getTime(cluster); @@ -195,25 +195,29 @@ rth_cluster.add(bth.getRawTrackerHit()); } SiTrackerHitStrip1D hit = new SiTrackerHitStrip1D(position, covariance, energy, time, rth_cluster, type); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " SiTrackerHitStrip1D created at " + position + "(" + hit.getPositionAsVector().toString() + ")" + " E " + energy + " time " + time); + } return hit; } private Hep3Vector getPosition(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) { - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " getPosition for cluster size " + cluster.size()); + } List<Double> signals = new ArrayList<Double>(); List<Hep3Vector> positions = new ArrayList<Hep3Vector>(); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " Loop of " + cluster.size() + " and add signals and positions to vectors"); + } for (FittedRawTrackerHit hit : cluster) { signals.add(hit.getAmp()); positions.add(((SiStrips) electrodes).getStripCenter(_strip_map.get(hit))); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " Added hit with signal " + hit.getAmp() + " at strip center posiiton " + (((SiStrips) electrodes).getStripCenter(_strip_map.get(hit)))); + } } // Average charge on central strips of longer clusters @@ -233,8 +237,9 @@ } } - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " Calculate charge weighted mean for " + signals.size() + " signals"); + } double total_charge = 0; Hep3Vector position = new BasicHep3Vector(0, 0, 0); @@ -244,29 +249,34 @@ total_charge += signal; position = VecOp.add(position, VecOp.mult(signal, positions.get(istrip))); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + "strip " + istrip + ": signal " + signal + " position " + positions.get(istrip) + " -> total_position " + position.toString() + " ( total charge " + total_charge + ")"); + } } position = VecOp.mult(1 / total_charge, position); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " charge weighted position " + position.toString() + " (before trans)"); + } electrodes.getParentToLocal().inverse().transform(position); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " charge weighted position " + position.toString() + " (after trans)"); + } // Swim position back through lorentz drift direction to midpoint between bias surfaces if (_simulation != null) { _simulation.setSensor((SiSensor) electrodes.getDetectorElement()); _simulation.lorentzCorrect(position, electrodes.getChargeCarrier()); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + ": Position " + position.toString() + " ( after Lorentz)"); + } } // return position in global coordinates Hep3Vector newpos = ((SiSensor) electrodes.getDetectorElement()).getGeometry().getLocalToGlobal().transformed(position); - if (_debug) + if (_debug) { System.out.println(this.getClass().getSimpleName() + " final cluster position " + newpos.toString()); + } return ((SiSensor) electrodes.getDetectorElement()).getGeometry().getLocalToGlobal().transformed(position); // return electrodes.getLocalToGlobal().transformed(position); @@ -283,8 +293,8 @@ double time = hit.getT0(); // System.out.format("t0=%f\tA=%f\n",hit.getT0(),hit.getAmp()); - time_sum += time * signal; - signal_sum += signal; + time_sum += time * signal * signal; + signal_sum += signal * signal; } return time_sum / signal_sum; @@ -299,7 +309,6 @@ SymmetricMatrix covariance_global = electrodes.getLocalToGlobal().transformed(covariance); // System.out.println("Global covariance matrix: \n"+covariance_global); - return covariance_global; // BasicHep3Matrix rotation_matrix = @@ -320,22 +329,22 @@ } private double getMeasuredResolution(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) // should - // replace - // this - // by - // a - // ResolutionModel - // class - // that - // gives - // expected - // resolution. - // This - // could - // be - // a - // big - // job. + // replace + // this + // by + // a + // ResolutionModel + // class + // that + // gives + // expected + // resolution. + // This + // could + // be + // a + // big + // job. { double measured_resolution; @@ -347,7 +356,6 @@ // double signal_expected = (0.000280/DopedSilicon.ENERGY_EHPAIR) * // ((SiSensor)electrodes.getDetectorElement()).getThickness(); // ~280 KeV/mm for thick Si // sensors - if (cluster.size() == 1) { measured_resolution = sense_pitch * _oneClusterErr; } else if (cluster.size() == 2) {