Commit in java/trunk/monitoring-drivers/src/main on MAIN
java/org/lcsim/monitoring/drivers/ecal/BasicMonitoringPlotsDriver.java+105added 149
java/org/lcsim/monitoring/drivers/svt/BasicMonitoringPlotsDriver.java+328added 149
resources/org/hps/steering/monitoring/ECalBasicMonitoring.lcsim+33added 149
                                     /SVTBasicMonitoring.lcsim+62added 149
+528
4 added files
add basic working monitoring drivers and steering files

java/trunk/monitoring-drivers/src/main/java/org/lcsim/monitoring/drivers/ecal
BasicMonitoringPlotsDriver.java added at 149
--- java/trunk/monitoring-drivers/src/main/java/org/lcsim/monitoring/drivers/ecal/BasicMonitoringPlotsDriver.java	                        (rev 0)
+++ java/trunk/monitoring-drivers/src/main/java/org/lcsim/monitoring/drivers/ecal/BasicMonitoringPlotsDriver.java	2014-02-04 23:38:08 UTC (rev 149)
@@ -0,0 +1,105 @@
+package org.hps.monitoring.drivers.ecal;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+
+import java.util.List;
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.util.Driver;
+
+/**
+ * Basic ECal monitoring plots that work on Test Run data.
+ * @author jeremym
+ */
+public class BasicMonitoringPlotsDriver extends Driver {
+	
+	private String calHitsCollectionName = "EcalCalHits"; 
+	private String rawHitsCollectionName = "EcalReadoutHits";
+	private String clustersCollectionName = "EcalClusters";
+	
+	private IHistogram1D calHitEnergyH1D;
+	private IHistogram1D clusterEnergyH1D;
+	private IHistogram1D rawHitAmplitudeH1D;
+	private IHistogram2D calHitEnergyMapH2D;
+	
+	public BasicMonitoringPlotsDriver() {		
+	}
+	
+	public void startOfData() {		
+		
+		IAnalysisFactory.create().createHistogramFactory(null);
+		IPlotterFactory plotFactory = IAnalysisFactory.create().createPlotterFactory("ECAL Monitoring");
+		IHistogramFactory histogramFactory = IAnalysisFactory.create().createHistogramFactory(null);
+		
+		calHitEnergyH1D = histogramFactory.createHistogram1D(calHitsCollectionName + ": Energy", calHitsCollectionName + ": Energy", 200, 0.0, 2.0);
+		calHitEnergyH1D.annotation().addItem("xAxisLabel", "GeV");
+		calHitEnergyH1D.annotation().addItem("yAxisLabel", "Count");
+		IPlotter plotter = plotFactory.create("CalorimeterHits");
+		plotter.createRegion();
+		plotter.style().gridStyle().setVisible(false);
+		plotter.style().dataStyle().errorBarStyle().setVisible(false);
+		plotter.region(0).plot(calHitEnergyH1D);
+		plotter.show();
+		
+		rawHitAmplitudeH1D = histogramFactory.createHistogram1D(rawHitsCollectionName + ": Amplitude", rawHitsCollectionName + ": Amplitude", 150, 0.0, 15000.0);
+		rawHitAmplitudeH1D.annotation().addItem("xAxisLabel", "ADC Value");
+		rawHitAmplitudeH1D.annotation().addItem("yAxisLabel", "Count");
+		plotter = plotFactory.create("RawCalorimeterHits");
+		plotter.createRegion();
+		plotter.style().gridStyle().setVisible(false);
+		plotter.style().dataStyle().errorBarStyle().setVisible(false);
+		plotter.region(0).plot(rawHitAmplitudeH1D);
+		plotter.show();
+		
+		clusterEnergyH1D = histogramFactory.createHistogram1D(clustersCollectionName + ": Energy", clustersCollectionName + ": Energy", 100, 0.0, 3.0);
+		clusterEnergyH1D.annotation().addItem("xAxisLabel", "GeV");
+		clusterEnergyH1D.annotation().addItem("yAxisLabel", "Count");
+		plotter = plotFactory.create("Clusters");
+		plotter.createRegion();
+		plotter.style().gridStyle().setVisible(false);
+		plotter.style().dataStyle().errorBarStyle().setVisible(false);
+		plotter.region(0).plot(clusterEnergyH1D);
+		plotter.show();
+		
+		calHitEnergyMapH2D = histogramFactory.createHistogram2D(calHitsCollectionName + ": Energy Map", calHitsCollectionName + ": Energy Map", 47, -23.5, 23.5, 11, -5.5, 5.5);
+		plotter = plotFactory.create("CalorimeterHit Energy Map");
+		plotter.createRegion();
+		plotter.style().setParameter("hist2DStyle", "colorMap");
+		plotter.style().gridStyle().setVisible(false);
+		plotter.region(0).plot(calHitEnergyMapH2D);
+		plotter.show();
+	}
+	
+	public void process(EventHeader event) {
+		
+		List<CalorimeterHit> calHits = event.get(CalorimeterHit.class, calHitsCollectionName);
+		for (CalorimeterHit hit : calHits) {
+			calHitEnergyH1D.fill(hit.getCorrectedEnergy());
+			calHitEnergyMapH2D.fill(
+					hit.getIdentifierFieldValue("ix"), 
+					hit.getIdentifierFieldValue("iy"), 
+					hit.getCorrectedEnergy());
+		}
+		
+		List<Cluster> clusters = event.get(Cluster.class, clustersCollectionName);
+		for (Cluster cluster : clusters) {
+			clusterEnergyH1D.fill(cluster.getEnergy());
+		}
+		
+		List<RawCalorimeterHit> rawHits = null; 
+		if (event.hasCollection(RawCalorimeterHit.class, rawHitsCollectionName)) {
+			rawHits = event.get(RawCalorimeterHit.class, rawHitsCollectionName); 
+			for (RawCalorimeterHit hit : rawHits) {
+				rawHitAmplitudeH1D.fill(hit.getAmplitude());
+			}
+		}
+	}
+}

java/trunk/monitoring-drivers/src/main/java/org/lcsim/monitoring/drivers/svt
BasicMonitoringPlotsDriver.java added at 149
--- java/trunk/monitoring-drivers/src/main/java/org/lcsim/monitoring/drivers/svt/BasicMonitoringPlotsDriver.java	                        (rev 0)
+++ java/trunk/monitoring-drivers/src/main/java/org/lcsim/monitoring/drivers/svt/BasicMonitoringPlotsDriver.java	2014-02-04 23:38:08 UTC (rev 149)
@@ -0,0 +1,328 @@
+package org.lcsim.monitoring.drivers.svt;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+
+import java.util.List;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.hps.monitoring.deprecated.Resettable;
+import org.lcsim.hps.recon.tracking.SvtUtils;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHit;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * Plots hit counts for all SVT channels at each stage of reconstruction.
+ * This class can be configured to reset after each event for use as an
+ * event display by calling {@link #setSingleEvent(boolean)}.
+ * 
+ * @version $Id: SVTSimpleEventDisplay.java,v 1.13 2013/11/06 19:19:55 jeremy Exp $
+ */
+public class BasicMonitoringPlotsDriver extends Driver implements Resettable {
+
+    /*
+     * Names of collections.
+     */
+    private String inputCollection = "SVTRawTrackerHits";
+    private String trackerHitCollection = "StripClusterer_SiTrackerHitStrip1D";
+    private String helicalHitCollection = "HelicalTrackHits";
+    
+    /* 
+     * Reference to AIDA utility.
+     */
+    private AIDA aida = AIDA.defaultInstance();
+    
+    /*
+     * AIDA objects that will be setup during initialization.
+     */
+    private IPlotter plotter, plotter2, plotter3, plotter4;
+    private IHistogram1D[][] rth = new IHistogram1D[2][10];
+    private IHistogram1D[][] th = new IHistogram1D[2][10];
+    private IHistogram1D[][] hth = new IHistogram1D[2][10];
+    private IHistogram1D hitCount[] = new IHistogram1D[2];
+    private IPlotterFactory factory;
+    
+    /*
+     * Single event mode setting.
+     */
+    private boolean singleEvent = true;
+
+    /**
+     * Class constructor.
+     */
+    public BasicMonitoringPlotsDriver() {
+    }
+
+    /**
+     * Set the name of the HelicalTrackHit collection.
+     * @param helicalHitCollection The name of the HelicalTrackHit collection.
+     */
+    public void setHelicalHitCollection(String helicalHitCollection) {
+        this.helicalHitCollection = helicalHitCollection;
+    }
+
+    /**
+     * Set this Driver to reset after each event.
+     * @param singleEvent Set to true if Driver should reset after each event.
+     */
+    public void setSingleEvent(boolean singleEvent) {
+        this.singleEvent = singleEvent;
+    }
+
+    /**
+     * Set the RawTrackerHit collection name.
+     * @param inputCollection The name of the RawTrackerHit collection.
+     * FIXME: This method should really be called setRawTrackerHitCollection instead.
+     */
+    public void setInputCollection(String inputCollection) {
+        this.inputCollection = inputCollection;
+    }
+
+    /**
+     * Set the name of the TrackerHit collection.
+     * @param trackerHitCollection The name of the TrackerHit collection.
+     */
+    public void setTrackerHitCollection(String trackerHitCollection) {
+        this.trackerHitCollection = trackerHitCollection;
+    }
+
+    /**
+     * Get the plotter region index from a layer and module number of a sensor.
+     * @param layer The sensor's layer number.
+     * @param module The sensor's module number.
+     * @return The index of the plotter region for the layer and module.
+     */
+    private int computePlotterRegion(int layer, int module) {
+        // Compute the sensor's x and y grid coordinates and then translate to region number.
+        int iy = (layer - 1) / 2;
+        int ix = 0;
+        if (module > 0) {
+            ix += 2;
+        }
+        if (layer % 2 == 0) {
+            ix += 1;
+        }
+        int region = ix * 5 + iy;
+        //System.out.println(sensor.getName() + "; lyr=" + layer + "; mod=" + module + " -> xy[" + ix + "][" + iy + "] -> reg="+region);
+        return region;
+    }
+
+    /**
+     * Configure this Driver for a new Detector, e.g. setup the plots and show them.
+     */
+    protected void detectorChanged(Detector detector) {
+        createPlotterFactory();
+        setupRawTrackerHitPlots();
+        setupTrackerHitPlots();
+        setupHelicalTrackHitPlots();
+        setupHitCountPlots();
+        setupOccupancyPlots();
+        showPlots();
+    }
+
+    /**
+     * Create the PlotterFactory.
+     */
+    private void createPlotterFactory() {
+        factory = aida.analysisFactory().createPlotterFactory("SVT Event Display");
+    }
+
+    private void setupHitCountPlots() {
+        plotter4 = factory.create("Hit Counts");
+        plotter4.setTitle("Hit Counts");
+        //plotter4.setStyle(new DefaultHistogram1DStyle());
+        plotter4.style().dataStyle().errorBarStyle().setVisible(false);
+        plotter4.createRegions(1, 2);
+        
+        hitCount[0] = aida.histogram1D("Hit layers in top", 6, -0.5, 5.5);
+        plotter4.region(0).plot(hitCount[0]);
+        hitCount[1] = aida.histogram1D("Hit layers in bottom", 6, -0.5, 5.5);
+        plotter4.region(1).plot(hitCount[1]);
+    }
+
+    private void setupHelicalTrackHitPlots() {
+        plotter3 = factory.create("HelicalTrackHits");
+        plotter3.setTitle("HelicalTrackHits");
+        //plotter3.setStyle(new DefaultHistogram1DStyle());
+        plotter3.style().dataStyle().errorBarStyle().setVisible(false);
+        plotter3.style().statisticsBoxStyle().setVisible(false);
+        plotter3.createRegions(4, 5);
+    }
+
+    private void setupTrackerHitPlots() {
+        plotter2 = factory.create("TrackerHits");
+        plotter2.setTitle("TrackerHits");
+        //plotter2.setStyle(new DefaultHistogram1DStyle());
+        plotter2.style().dataStyle().errorBarStyle().setVisible(false);
+        plotter2.style().statisticsBoxStyle().setVisible(false);
+        plotter2.createRegions(4, 5);
+    }
+
+    private void setupRawTrackerHitPlots() {
+        plotter = factory.create("RawTrackerHits");
+        plotter.setTitle("RawTrackerHits");
+        //plotter.setStyle(new DefaultHistogram1DStyle());
+        plotter.style().dataStyle().errorBarStyle().setVisible(false);
+        plotter.style().statisticsBoxStyle().setVisible(false);
+        plotter.createRegions(4, 5);
+    }
+
+    private void showPlots() {
+        plotter.show();
+        plotter2.show();
+        plotter3.show();
+        plotter4.show();
+    }
+
+    private void setupOccupancyPlots() {
+        aida.tree().cd("/");
+        for (int module = 0; module < 2; module++) {
+            for (int layer = 0; layer < 10; layer++) {
+                int region = computePlotterRegion(layer + 1, module);
+                rth[module][layer] = aida.histogram1D(SvtUtils.getInstance().getSensor(module, layer).getName() + " RawTrackerHits", 640, -0.5, 639.5);
+                plotter.region(region).plot(rth[module][layer]);
+                th[module][layer] = aida.histogram1D(SvtUtils.getInstance().getSensor(module, layer).getName() + " TrackerHits", 640, -0.5, 639.5);
+                plotter2.region(region).plot(th[module][layer]);
+                hth[module][layer] = aida.histogram1D(SvtUtils.getInstance().getSensor(module, layer).getName() + " HelicalTrackHits", 640, -0.5, 639.5);
+                plotter3.region(region).plot(hth[module][layer]);
+            }
+        }
+    }
+
+    /**
+     * Process a single event by filling histograms with event data.
+     * @param event The current event.
+     */
+    public void process(EventHeader event) {
+
+        // Clear histograms if in single event mode.
+        if (singleEvent) {
+            resetPlots();
+        }
+
+        plotRawTrackerHits(event);
+
+        plotTrackerHits(event);
+
+        plotHelicalTrackHits(event);
+    }
+
+    /**
+     * Fill HelicalTrackHit plots for one event.
+     * @param event The event.
+     */
+    private void plotHelicalTrackHits(EventHeader event) {
+        if (event.hasCollection(HelicalTrackHit.class, helicalHitCollection)) {
+            
+            List<HelicalTrackHit> helicalTrackerHits = event.get(HelicalTrackHit.class, helicalHitCollection);
+
+            System.out.println(helicalHitCollection + " has " + helicalTrackerHits.size() + " hits");
+            
+            boolean[][] hasHit = new boolean[2][5];
+
+            // Increment strip hit count.
+            for (HelicalTrackHit hit : helicalTrackerHits) {
+                for (Object rawHit : hit.getRawHits()) {
+                    int layer = ((RawTrackerHit) rawHit).getIdentifierFieldValue("layer"); // 1-10; axial layers are odd layers; stereo layers are even
+                    int module = ((RawTrackerHit) rawHit).getIdentifierFieldValue("module"); // 0-1; module number is top or bottom
+                    hasHit[module][(layer - 1) / 2] = true;
+                    hth[module][layer - 1].fill(((RawTrackerHit) rawHit).getIdentifierFieldValue("strip"));
+                }
+            }
+
+            for (int module = 0; module < 2; module++) {
+                int count = 0;
+                for (int i = 0; i < 5; i++) {
+                    if (hasHit[module][i]) {
+                        count++;
+                    }
+                }
+                hitCount[module].fill(count);
+            }
+        } else {
+            throw new RuntimeException("Collection " + helicalHitCollection + " was not found.");
+        }
+    }
+
+    /**
+     * Fill TrackerHit plots for one event.
+     * @param event The event.
+     */
+    private void plotTrackerHits(EventHeader event) {
+        if (event.hasCollection(SiTrackerHit.class, trackerHitCollection)) {
+            
+            List<SiTrackerHit> trackerHits = event.get(SiTrackerHit.class, trackerHitCollection);
+
+            System.out.println(trackerHitCollection + " has " + trackerHits.size() + " hits");
+            
+            // Increment strip hit count.
+            for (SiTrackerHit hit : trackerHits) {
+                for (RawTrackerHit rawHit : hit.getRawHits()) {
+                    int layer = rawHit.getIdentifierFieldValue("layer"); // 1-10; axial layers are odd layers; stereo layers are even
+                    int module = rawHit.getIdentifierFieldValue("module"); // 0-1; module number is top or bottom
+
+                    th[module][layer - 1].fill(rawHit.getIdentifierFieldValue("strip"));
+                }
+            }
+        } else {
+            throw new RuntimeException("Collection " + trackerHitCollection + " was not found.");
+        }
+    }
+
+    /**
+     * Fill RawTrackerHit plots for one event.
+     * @param event The event.
+     */
+    private void plotRawTrackerHits(EventHeader event) {
+        if (event.hasCollection(RawTrackerHit.class, inputCollection)) {
+            List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, inputCollection);
+
+            System.out.println(inputCollection + " has " + rawTrackerHits.size() + " hits");
+            
+            // Increment strip hit count.
+            for (RawTrackerHit hit : rawTrackerHits) {
+                int layer = hit.getIdentifierFieldValue("layer"); // 1-10; axial layers are odd layers; stereo layers are even
+                int module = hit.getIdentifierFieldValue("module"); // 0-1; module number is top or bottom
+
+                rth[module][layer - 1].fill(hit.getIdentifierFieldValue("strip"));
+            }
+        } else {
+            throw new RuntimeException("Collection " + inputCollection + " was not found.");
+        }
+    }
+
+    /**
+     * Reset the plots for running in single event mode.
+     */
+    private void resetPlots() {
+        for (int module = 0; module < 2; module++) {
+            for (int layer = 1; layer < 11; layer++) {
+                rth[module][layer - 1].reset();
+                th[module][layer - 1].reset();
+                hth[module][layer - 1].reset();
+            }
+        }
+    }
+
+    /**
+     * Reset the hit count plot, which is not affected by single event setting. 
+     */
+    private void resetHitCountPlot() {
+        for (int module = 0; module < 2; module++) {
+            hitCount[module].reset();
+        }
+    }
+
+    /**
+     * Reset this Driver's plots.
+     */
+    public void reset() {
+        resetPlots();
+        resetHitCountPlot();
+    }
+}

java/trunk/monitoring-drivers/src/main/resources/org/hps/steering/monitoring
ECalBasicMonitoring.lcsim added at 149
--- java/trunk/monitoring-drivers/src/main/resources/org/hps/steering/monitoring/ECalBasicMonitoring.lcsim	                        (rev 0)
+++ java/trunk/monitoring-drivers/src/main/resources/org/hps/steering/monitoring/ECalBasicMonitoring.lcsim	2014-02-04 23:38:08 UTC (rev 149)
@@ -0,0 +1,33 @@
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
+    
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        <driver name="CalibrationDriver"/>
+        <driver name="EcalRawConverter"/>
+        <driver name="EcalClusterer"/>
+        <driver name="EcalMonitoringPlots"/>
+    </execute>    
+    
+    <drivers>
+
+        <driver name="EventMarkerDriver"
+                type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1</eventInterval>
+        </driver>
+
+        <driver name="CalibrationDriver" type="org.lcsim.hps.conditions.CalibrationDriver"/>   
+
+        <driver name="EcalRawConverter" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+        </driver>
+        
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.EcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        </driver>
+        
+        <driver name="EcalMonitoringPlots" type="org.lcsim.hps.monitoring.ecal.BasicMonitoringPlotsDriver"/>
+
+    </drivers>
+</lcsim>

java/trunk/monitoring-drivers/src/main/resources/org/hps/steering/monitoring
SVTBasicMonitoring.lcsim added at 149
--- java/trunk/monitoring-drivers/src/main/resources/org/hps/steering/monitoring/SVTBasicMonitoring.lcsim	                        (rev 0)
+++ java/trunk/monitoring-drivers/src/main/resources/org/hps/steering/monitoring/SVTBasicMonitoring.lcsim	2014-02-04 23:38:08 UTC (rev 149)
@@ -0,0 +1,62 @@
+
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
+    
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        <driver name="CalibrationDriver"/>
+        <driver name="EcalRawConverter"/>
+        <driver name="EcalClusterer"/>
+        <driver name="RawTrackerHitFitterDriver"/>
+        <driver name="TrackerHitDriver"/>
+        <driver name="HelicalTrackHitDriver"/>
+        <driver name="TrackerReconDriver"/>
+        <driver name="SVTBasicMonitoringPlots"/>
+        <driver name="CleanupDriver"/>
+    </execute>    
+    
+    <drivers>
+
+        <driver name="CalibrationDriver" type="org.lcsim.hps.conditions.CalibrationDriver"/>   
+
+        <driver name="EcalRawConverter" type="org.lcsim.hps.recon.ecal.EcalRawConverterDriver">
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        </driver>
+
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.EcalClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+        </driver>
+
+        <driver name="RawTrackerHitFitterDriver" type="org.lcsim.hps.recon.tracking.HPSRawTrackerHitFitterDriver">
+            <fitAlgorithm>Analytic</fitAlgorithm>
+        </driver>
+
+        <driver name="TrackerHitDriver" type="org.lcsim.hps.recon.tracking.DataTrackerHitDriver"/>
+
+        <driver name="CleanupDriver" 
+                type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits</collectionNames>
+        </driver>
+
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1</eventInterval>
+        </driver>
+
+        <driver name="HelicalTrackHitDriver" type="org.lcsim.hps.recon.tracking.HelicalTrackHitDriver">
+            <debug>false</debug>
+            <maxSeperation>20.0</maxSeperation>
+            <tolerance>1.0</tolerance>
+        </driver>
+
+        <driver name="TrackerReconDriver" type="org.lcsim.hps.recon.tracking.TrackerReconDriver">
+            <debug>false</debug>
+        </driver>        
+
+        <driver name="SVTBasicMonitoringPlots" type="org.hps.monitoring.drivers.svt.BasicMonitoringPlotsDriver">
+            <inputCollection>SVTRawTrackerHits</inputCollection>
+            <singleEvent>false</singleEvent>
+        </driver>
+
+    </drivers>
+</lcsim>
SVNspam 0.1