Print

Print


Commit in java/trunk/hps-java/src/main/java/org/lcsim/hps/monitoring/svt on MAIN
PedestalPlots.java+157added 147
some basic pedestal shift analysis

java/trunk/hps-java/src/main/java/org/lcsim/hps/monitoring/svt
PedestalPlots.java added at 147
--- java/trunk/hps-java/src/main/java/org/lcsim/hps/monitoring/svt/PedestalPlots.java	                        (rev 0)
+++ java/trunk/hps-java/src/main/java/org/lcsim/hps/monitoring/svt/PedestalPlots.java	2014-02-04 03:36:26 UTC (rev 147)
@@ -0,0 +1,157 @@
+package org.lcsim.hps.monitoring.svt;
+
+import hep.aida.IDataPoint;
+import hep.aida.IDataPointSet;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ref.histogram.DataPoint;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants;
+import org.lcsim.hps.recon.tracking.SvtUtils;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: $
+ */
+public class PedestalPlots extends Driver {
+
+    private AIDA aida = AIDA.defaultInstance();
+    private Map<SiSensor, IHistogram2D> hists;
+    private Map<SiSensor, int[]> counts;
+    private Map<SiSensor, double[]> means;
+    private Map<SiSensor, double[]> sumsqs;
+    private Map<SiSensor, IDataPointSet[]> plots;
+    private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
+    private String fitFile = null;
+    private boolean plotTimeSeries = false;
+
+    public void setFitFile(String fitFile) {
+        this.fitFile = fitFile;
+    }
+
+    public void setPlotTimeSeries(boolean plotTimeSeries) {
+        this.plotTimeSeries = plotTimeSeries;
+    }
+
+    @Override
+    protected void detectorChanged(Detector detector) {
+
+        aida.tree().cd("/");
+
+        hists = new HashMap<SiSensor, IHistogram2D>();
+        counts = new HashMap<SiSensor, int[]>();
+        means = new HashMap<SiSensor, double[]>();
+        sumsqs = new HashMap<SiSensor, double[]>();
+        plots = new HashMap<SiSensor, IDataPointSet[]>();
+
+        for (SiSensor sensor : SvtUtils.getInstance().getSensors()) {
+            hists.put(sensor, aida.histogram2D(sensor.getName() + " sample 1 vs. ch", 640, -0.5, 639.5, 500, -500.0, 3000.0));
+            if (plotTimeSeries) {
+                counts.put(sensor, new int[640]);
+                means.put(sensor, new double[640]);
+                sumsqs.put(sensor, new double[640]);
+                IDataPointSet[] plotArray = new IDataPointSet[640];
+                plots.put(sensor, plotArray);
+                for (int i = 0; i < 640; i++) {
+                    plotArray[i] = aida.analysisFactory().createDataPointSetFactory(aida.tree()).create(sensor.getName() + ", channel " + i + " pedestal vs. event", 2);
+                }
+            }
+        }
+
+
+
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
+            // Get RawTrackerHit collection from event.
+            List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+
+            for (RawTrackerHit hit : rawTrackerHits) {
+                SiSensor sensor = (SiSensor) hit.getDetectorElement();
+                int strip = hit.getIdentifierFieldValue("strip");
+                double pedestal = HPSSVTCalibrationConstants.getPedestal(sensor, strip);
+                hists.get(sensor).fill(strip, hit.getADCValues()[0] - pedestal);
+
+                if (plotTimeSeries) {
+
+                    counts.get(sensor)[strip]++;
+                    double delta = hit.getADCValues()[0] - pedestal - means.get(sensor)[strip];
+                    means.get(sensor)[strip] += delta / counts.get(sensor)[strip];
+                    sumsqs.get(sensor)[strip] += delta * (hit.getADCValues()[0] - pedestal - means.get(sensor)[strip]);
+
+                    if (counts.get(sensor)[strip] >= 100) {
+                        double[] data = {event.getEventNumber(), means.get(sensor)[strip]};
+                        double[] errs = {0.0, Math.sqrt(sumsqs.get(sensor)[strip] / counts.get(sensor)[strip])};
+                        IDataPoint point = new DataPoint(data, errs);
+                        plots.get(sensor)[strip].addPoint(point);
+                        counts.get(sensor)[strip] = 0;
+                        means.get(sensor)[strip] = 0;
+                        sumsqs.get(sensor)[strip] = 0;
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void endOfData() {
+        if (fitFile == null) {
+            return;
+        }
+
+        IFitter fitter = aida.analysisFactory().createFitFactory().createFitter("chi2");
+//        fitter.setFitMethod("CleverChiSquared");
+//        fitter.setFitMethod("binnedMaximumLikelihood");
+
+        PrintWriter fitWriter = null;
+        try {
+            fitWriter = new PrintWriter(fitFile);
+        } catch (FileNotFoundException ex) {
+            Logger.getLogger(PedestalPlots.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+        for (SiSensor sensor : hists.keySet()) {
+            fitWriter.println(sensor.getName());
+            IHistogram2D hist = hists.get(sensor);
+            IHistogram1D fit = aida.histogram1D("1D fit", hist.yAxis().bins(), hist.yAxis().lowerEdge(), hist.yAxis().upperEdge());
+            for (int i = 0; i < 640; i++) {
+                fitWriter.format("%d\t", i);
+                for (int y = 0; y < hist.yAxis().bins(); y++) {
+                    for (int j = 0; j < hist.binHeight(i, y); j++) {
+                        fit.fill(hist.binMeanY(i, y));
+                    }
+                }
+                fitWriter.format("%f\t%f\t%f\t", fit.sumBinHeights(), fit.mean(), fit.rms());
+                if (fit.sumBinHeights() > 100) {
+                    IFitResult result = fitter.fit(fit, "g");
+
+                    if (result.isValid()) {
+                        fitWriter.format("%f\t%f\t", result.fittedParameter("mean"), result.fittedParameter("sigma"));
+                    }
+                }
+                fitWriter.println();
+                fit.reset();
+            }
+            fitWriter.flush();
+        }
+        fitWriter.close();
+        aida.tree().rm("1D fit");
+    }
+}
SVNspam 0.1