Author: [log in to unmask] Date: Thu Apr 23 14:37:28 2015 New Revision: 2802 Log: use new SVT pulse shape stuff in readout sim Modified: java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java Modified: java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java (original) +++ java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java Thu Apr 23 14:37:28 2015 @@ -26,6 +26,7 @@ import org.hps.readout.ecal.ClockSingleton; import org.hps.readout.ecal.ReadoutTimestamp; import org.hps.readout.ecal.TriggerableDriver; +import org.hps.recon.tracking.PulseShape; import org.hps.util.RandomGaussian; /** @@ -39,6 +40,8 @@ //--- Constants ---// //-----------------// private static final String SVT_SUBDETECTOR_NAME = "Tracker"; + + private PulseShape shape = new PulseShape.FourPole(); private SimTrackerHitReadoutDriver readoutDriver = new SimTrackerHitReadoutDriver(); private SiSensorSim siSimulation = new CDFSiSensorSim(); @@ -112,6 +115,19 @@ */ public void setVerbosity(int verbosity) { this.verbosity = verbosity; + } + + public void setPulseShape(String pulseShape) { + switch (pulseShape) { + case "CR-RC": + shape = new PulseShape.CRRC(); + break; + case "FourPole": + shape = new PulseShape.FourPole(); + break; + default: + throw new RuntimeException("Unrecognized pulseShape: " + pulseShape); + } } /** @@ -197,11 +213,12 @@ for (int sampleN = 0; sampleN < 6; sampleN++) { double time = sampleN * HPSSVTConstants.SAMPLING_INTERVAL - timeOffset; - double tp = sensor.getShapeFitParameters(channel)[HpsSiSensor.TP_INDEX]; - signal[sampleN] += amplitude * pulseAmplitude(time, tp);//add the pulse to the pedestal + shape.setParameters(channel, (HpsSiSensor) sensor); + signal[sampleN] += amplitude * shape.getAmplitudePeakNorm(time);//add the pulse to the pedestal samples[sampleN] = (short) Math.round(signal[sampleN]); - if (verbosity >= 1) + if (verbosity >= 1) { System.out.println("\t\tMaking samples: sample#" + sampleN + " has " + samples[sampleN] + " ADC counts"); + } } long channel_id = sensor.makeChannelID(channel); @@ -292,18 +309,21 @@ private boolean readoutCuts(RawTrackerHit hit) { if (enableThresholdCut && !samplesAboveThreshold(hit)) { - if (verbosity > 1) + if (verbosity > 1) { System.out.println("Failed threshold cut"); + } return false; } if (enablePileupCut && !pileupCut(hit)) { - if (verbosity > 1) + if (verbosity > 1) { System.out.println("Failed pileup cut"); + } return false; } if (dropBadChannels && !badChannelCut(hit)) { - if (verbosity > 1) + if (verbosity > 1) { System.out.println("Failed bad channel cut"); + } return false; } return true; @@ -323,25 +343,28 @@ private boolean samplesAboveThreshold(RawTrackerHit hit) { HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement(); int channel = hit.getIdentifierFieldValue("strip"); - double pedestal = 0; - double noise = 0; + double pedestal; + double noise; int count = 0; short[] samples = hit.getADCValues(); for (int sampleN = 0; sampleN < samples.length; sampleN++) { pedestal = sensor.getPedestal(channel, sampleN); noise = sensor.getNoise(channel, sampleN); - if (verbosity > 1) + if (verbosity > 1) { System.out.format("%f, %f\n", samples[sampleN] - pedestal, noise * noiseThreshold); - if (samples[sampleN] - pedestal > noise * noiseThreshold) + } + if (samples[sampleN] - pedestal > noise * noiseThreshold) { count++; + } } return count >= samplesAboveThreshold; } @Override protected void processTrigger(EventHeader event) { - if (noPileup) + if (noPileup) { return; + } //System.out.println("Got trigger"); // Create a list to hold the analog data @@ -372,8 +395,8 @@ double meanNoise = 0; for (int sampleN = 0; sampleN < 6; sampleN++) { double sampleTime = firstSample + sampleN * HPSSVTConstants.SAMPLING_INTERVAL; - double tp = ((HpsSiSensor) sensor).getShapeFitParameters(channel)[HpsSiSensor.TP_INDEX]; - double signalAtTime = hit.amplitude * pulseAmplitude(sampleTime - hit.time, tp); + shape.setParameters(channel, (HpsSiSensor) sensor); + double signalAtTime = hit.amplitude * shape.getAmplitudePeakNorm(sampleTime - hit.time); totalContrib += signalAtTime; signal[sampleN] += signalAtTime; meanNoise += ((HpsSiSensor) sensor).getNoise(channel, sampleN); @@ -442,21 +465,17 @@ @Override public int compareTo(Object o) { double deltaT = time - ((StripHit) o).time; - if (deltaT > 0) + if (deltaT > 0) { return 1; - else if (deltaT < 0) + } else if (deltaT < 0) { return -1; - else + } else { return 0; - } - } - - private double pulseAmplitude(double time, double tp) { - if (time <= 0.0) - return 0.0; - return (time / tp) * Math.exp(1.0 - time / tp); - } - + } + } + } + + @Override public int getTimestampType() { return ReadoutTimestamp.SYSTEM_TRACKER; }