Author: [log in to unmask]
Date: Mon Feb 2 19:01:58 2015
New Revision: 2027
Log:
Add a simple fit to example monitoring plots.
Modified:
java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java
Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java
=============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java (original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/ExamplePlotDriver.java Mon Feb 2 19:01:58 2015
@@ -2,6 +2,11 @@
import hep.aida.ICloud1D;
import hep.aida.ICloud2D;
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
+import hep.aida.IFunction;
+import hep.aida.IFunctionFactory;
import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
import hep.aida.IPlotter;
@@ -9,6 +14,8 @@
import hep.aida.IPlotterStyle;
import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import org.lcsim.detector.identifier.IIdentifier;
import org.lcsim.detector.identifier.IIdentifierHelper;
@@ -17,91 +24,141 @@
import org.lcsim.event.Cluster;
import org.lcsim.event.EventHeader;
import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.geometry.Detector;
import org.lcsim.util.Driver;
import org.lcsim.util.aida.AIDA;
+/**
+ * Example monitoring plots, currently only using ECAL data.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
/*
-TODO:
+TODO List
Add the following example plot types...
[X] Histogram1D
-[X] overlaid Histogram1D
+[X] Histogram1D overlay
[X] Cloud1D
-[X] overlaid Cloud1D
+[X] Cloud1D overlay
[X] Histogram2D color map
[X] Histogram2D box plot
-[X] overlaid Histogram2D box plot
+[X] Histogram2D overlay
[ ] Cloud2D as scatter plot
-[ ] overlaid Cloud2D scatter plots
-
-[ ] Cloud2D convertered to histogram
+[ ] Cloud2D scatter plot overlay
+
+[ ] Cloud2D converted to histogram
[ ] Profile1D
[ ] Profile2D
-[ ] IFunction
+[X] IFunction
[ ] IDataPointSet
-see "Aida to JFree" doc for complete list
+See this link for complete list.
https://docs.google.com/spreadsheets/d/1bqKvriNOEaeTrpTrk38kBGXM8oC_F5QIZeLcSSa3JsQ/
*/
-
public class ExamplePlotDriver extends Driver {
AIDA aida = AIDA.defaultInstance();
IPlotterFactory plotterFactory;
+ IFunctionFactory functionFactory;
+ IFitFactory fitFactory;
IHistogram1D calRawHitH1D, calClusterH1D, calHitH1D, calClusterEnergyH1D;
IHistogram2D calHitMapH2D, calRawHitMapH2D;
ICloud1D calRawHitsC1D, calClustersC1D;
ICloud2D calHitsVsEnergyC2D;
+ IFunction fittedFunction;
final static String ECAL_READOUT_HITS = "EcalReadoutHits";
final static String ECAL_CAL_HITS = "EcalCalHits";
final static String ECAL_CLUSTERS = "EcalClusters";
+
+ IIdentifierHelper helper;
+
+ private static final Logger minuitLogger = Logger.getLogger("org.freehep.math.minuit");
+ static {
+ minuitLogger.setLevel(Level.OFF);
+ }
public ExamplePlotDriver() {
+ }
+
+ public void detectorChanged(Detector detector) {
+ helper = detector.getSubdetector("Ecal").getDetectorElement().getIdentifierHelper();
}
public void startOfData() {
+ // AIDA boilerplate stuff.
plotterFactory = aida.analysisFactory().createPlotterFactory("Example Plots");
+ functionFactory = aida.analysisFactory().createFunctionFactory(null);
+ fitFactory = aida.analysisFactory().createFitFactory();
+
IPlotter plotter = null;
IPlotterStyle style = null;
- //
- // Example of single Histogram1D plot.
- //
- calClusterEnergyH1D = aida.histogram1D("Cal Cluster Energy", 100, 0., 10.);
+ // Define all of the AIDA objects to be used for example plotting.
+ calClusterEnergyH1D = aida.histogram1D("Cal Cluster Energy", 100, 0., 10.);
+ calRawHitH1D = aida.histogram1D("CalRawHit Count H1D", 20, 0., 20.);
+ calHitH1D = aida.histogram1D("CalHit Count H1D", 20, 0., 20.);
+ calClusterH1D = aida.histogram1D("CalCluster Count H1D", 20, 0., 20.);
+ calHitMapH2D = aida.histogram2D("CalHit Map H2D", 47, -23.5, 23.5, 11, -5.5, 5.5);
+ calRawHitMapH2D = aida.histogram2D("CalRawHit Map H2D", 47, -23.5, 23.5, 11, -5.5, 5.5);
+ calRawHitsC1D = aida.cloud1D("CalRawHit Count C1D", 500);
+ calClustersC1D = aida.cloud1D("CalCluster Count C1D", 500);
+ calHitsVsEnergyC2D = aida.cloud2D("CalHits vs Energy C2D", 1000000);
+ fittedFunction = functionFactory.createFunctionByName("Gaussian", "G");
+ fittedFunction.setTitle("Example Fit");
+
+ /*
+ * Histogram1D
+ */
plotter = plotterFactory.create("IHistogram1D");
+ plotter.createRegion();
style = createDefaultPlotterStyle();
style.dataStyle().fillStyle().setColor("blue");
- plotter.createRegion();
plotter.region(0).setTitle("IHistogram1D");
plotter.region(0).plot(calClusterEnergyH1D, style);
plotter.show();
- //
- // Example of overlaid Histogram1D plots.
- //
- calRawHitH1D = aida.histogram1D("CalRawHit Count H1D", 20, 0., 20.);
- calHitH1D = aida.histogram1D("CalHit Count H1D", 20, 0., 20.);
- calClusterH1D = aida.histogram1D("CalCluster Count H1D", 20, 0., 20.);
+ /*
+ * Fit of Histogram1D
+ */
+ plotter = plotterFactory.create("IHistogram1D Fit");
+ plotter.createRegion();
+ style = createDefaultPlotterStyle();
+ style.dataStyle().fillStyle().setColor("blue");
+ plotter.region(0).setTitle("IHistogram1D");
+ plotter.region(0).plot(calHitH1D, style);
+ IPlotterStyle functionStyle = plotterFactory.createPlotterStyle();
+ functionStyle.dataStyle().lineStyle().setColor("red");
+ functionStyle.dataStyle().markerStyle().setVisible(true);
+ functionStyle.dataStyle().markerStyle().setColor("black");
+ functionStyle.dataStyle().markerStyle().setShape("dot");
+ functionStyle.dataStyle().markerStyle().setSize(2);
+ plotter.region(0).plot(fittedFunction, functionStyle);
+ plotter.show();
+
+ /*
+ * Histogram1D overlay
+ */
plotter = plotterFactory.create("Overlayed IHistogram1D");
plotter.createRegion();
plotter.region(0).setTitle("Overlayed IHistogram1D");
@@ -122,8 +179,9 @@
plotter.region(0).plot(calClusterH1D, style);
plotter.show();
- // Example of Histogram2D displayed as a color map.
- calHitMapH2D = aida.histogram2D("CalHit Map H2D", 47, -23.5, 23.5, 11, -5.5, 5.5);
+ /*
+ * Histogram2D as color map.
+ */
plotter = plotterFactory.create("Histogram2D Color Map");
style = createDefaultPlotterStyle();
style.setParameter("hist2DStyle", "colorMap");
@@ -132,7 +190,9 @@
plotter.region(0).plot(calHitMapH2D, style);
plotter.show();
- // Example of Histogram2D displayed as box plot.
+ /*
+ * Histogram2D as box plot.
+ */
plotter = plotterFactory.create("Histogram2D Box Plot");
style = createDefaultPlotterStyle();
style.dataStyle().fillStyle().setVisible(false);
@@ -142,8 +202,9 @@
plotter.region(0).plot(calHitMapH2D, style);
plotter.show();
- // Example of overlaid Histogram2D box plots.
- calRawHitMapH2D = aida.histogram2D("CalRawHit Map H2D", 47, -23.5, 23.5, 11, -5.5, 5.5);
+ /*
+ * Histogram2D overlay box plots
+ */
plotter = plotterFactory.create("Overlaid IHistogram2D Box Plots");
plotter.createRegion();
plotter.region(0).setTitle("Overlaid Histogram2D Box Plots");
@@ -157,8 +218,9 @@
plotter.region(0).plot(calHitMapH2D, style);
plotter.show();
- // Example of Cloud1D which will convert to a histogram.
- calRawHitsC1D = aida.cloud1D("CalRawHit Count C1D", 500);
+ /*
+ * Cloud1D which will convert to a histogram on the fly
+ */
plotter = plotterFactory.create("Cloud1D");
style = createDefaultPlotterStyle();
plotter.createRegion();
@@ -166,8 +228,9 @@
plotter.region(0).plot(calRawHitsC1D, style);
plotter.show();
- // Example of overlaid Cloud1D plots.
- calClustersC1D = aida.cloud1D("CalCluster Count C1D", 500);
+ /*
+ * Cloud1D overlay
+ */
plotter = plotterFactory.create("Overlayed Cloud1D");
plotter.createRegion();
plotter.region(0).setTitle("Overlayed Cloud1D");
@@ -183,8 +246,9 @@
plotter.region(0).plot(calClustersC1D, style);
plotter.show();
- // Example of Cloud2D displayed as scatter.
- calHitsVsEnergyC2D = aida.cloud2D("CalHits vs Energy C2D", 1000000);
+ /*
+ * Cloud2D as scatter plot.
+ */
plotter = plotterFactory.create("Cloud2D Scatter Plot");
plotter.createRegion();
plotter.region(0).setTitle("Cloud2D Scatter Plot");
@@ -193,18 +257,13 @@
style.dataStyle().markerStyle().setColor("purple");
style.dataStyle().markerStyle().setSize(2);
style.dataStyle().markerStyle().setShape("diamond");
- plotter.region(0).plot(calHitsVsEnergyC2D, style);
- plotter.show();
+ plotter.region(0).plot(calHitsVsEnergyC2D, style);
+ plotter.show();
}
public void process(EventHeader event) {
//printCollectionSummary(event);
-
- // FIXME: This is ugly.
- IIdentifierHelper helper =
- event.getMetaData(event.get(CalorimeterHit.class, ECAL_CAL_HITS))
- .getIDDecoder().getSubdetector().getDetectorElement().getIdentifierHelper();
-
+
if (event.hasCollection(RawCalorimeterHit.class, ECAL_READOUT_HITS)) {
List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, ECAL_READOUT_HITS);
int nHits = hits.size();
@@ -215,8 +274,7 @@
int ix = helper.getValue(id, "ix");
int iy = helper.getValue(id, "iy");
calRawHitMapH2D.fill(ix, iy);
- }
-
+ }
}
if (event.hasCollection(CalorimeterHit.class, ECAL_CAL_HITS)) {
@@ -239,24 +297,32 @@
for (Cluster cluster : clusters) {
calClusterEnergyH1D.fill(cluster.getEnergy());
}
- }
- }
-
- private IPlotterStyle createDefaultPlotterStyle() {
+ }
+
+ // Fit an H1D.
+ IFunction currentFitFunction = performGaussianFit(calHitH1D).fittedFunction();
+
+ // Copy function parameters into the plotted function which will trigger an update.
+ fittedFunction.setParameters(currentFitFunction.parameters());
+ }
+
+ IPlotterStyle createDefaultPlotterStyle() {
IPlotterStyle style = plotterFactory.createPlotterStyle();
style.gridStyle().setVisible(false);
style.legendBoxStyle().setVisible(true);
return style;
}
- /*
- private void printCollectionSummary(EventHeader event) {
- System.out.println("Collections in event #" + event.getEventNumber() + " ...");
- Collection<LCMetaData> metaData = event.getMetaData();
- for (LCMetaData meta : metaData) {
- System.out.println(" " + meta.getName() + " has " + event.get(meta.getType()).size() + " objects");
- }
- }
- */
-
-}
+ IFitResult performGaussianFit(IHistogram1D histogram) {
+ IFunction function = functionFactory.createFunctionByName("Example Fit", "G");
+ IFitter fitter = fitFactory.createFitter("chi2", "jminuit");
+ double[] parameters = new double[3];
+ parameters[0] = histogram.maxBinHeight();
+ parameters[1] = histogram.mean();
+ parameters[2] = histogram.rms();
+ function.setParameters(parameters);
+ IFitResult fitResult = fitter.fit(histogram, function);
+ return fitResult;
+ }
+
+}
|