Author: [log in to unmask]
Date: Tue Oct 27 11:33:16 2015
New Revision: 3892
Log:
Other changes to Led analysis
Modified:
java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java
java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java
java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java
java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java
Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java
=============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java (original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java Tue Oct 27 11:33:16 2015
@@ -13,6 +13,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.lang.IllegalArgumentException;
import javax.swing.SwingUtilities;
@@ -67,7 +68,7 @@
// LCIO Collection names.
private String inputCollection = "EcalCalHits";
private String inputCollectionRaw = "EcalReadoutHits";
- private final boolean[] isFirstRaw = new boolean[NUM_CHANNELS]; // Whether a waveform plot was initiated for each
+
// channel.
private long lastEventTime = 0; // Tracks the time at which the last event occurred.
private double maxEch = 3500 * EcalUtils.MeV; // The energy scale maximum.
@@ -81,8 +82,7 @@
private boolean resetOnUpdate = true; // Clears the event display on each update.
// Internal variables.
private final PEventViewer viewer; // Single event display.
- private final int[] windowRaw = new int[NUM_CHANNELS]; // The number of samples in a waveform for each channel.
-
+
public EcalEventDisplay() {
// Check if the configuration mapping file exists.
final File config = new File("ecal-mapping-config.csv");
@@ -192,16 +192,6 @@
this.pstyle.yAxisStyle().setLabel(NO_TITLE);
this.plotter.region(3).plot(this.clusterEnergyPlot.get(id), this.pstyle);
- /**
- * // Process and plot the region 3 plot. if(!isFirstRaw[id]) {
- * pstyle.yAxisStyle().setLabel(SIGNAL_AMPLITUDE_TITLE);
- * pstyle.xAxisStyle().setLabel(SIGNAL_TIME_TITLE);
- * pstyle.dataStyle().fillStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
- * pstyle.dataStyle().markerStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
- * pstyle.dataStyle().errorBarStyle().setVisible(false); } else {
- * pstyle.xAxisStyle().setLabel(HIT_ENERGY_TITLE); pstyle.yAxisStyle().setLabel(""); }
- * plotter.region(3).plot(channelRawWaveform.get(id), pstyle);
- **/
}
}
}
@@ -252,10 +242,8 @@
this.clusterEnergyPlot.add(this.aida.histogram1D(this.detectorName + " : " + this.inputCollection
+ " : Cluster Energy : " + column + " " + row + ": " + ii, 100, -0.2, this.maxEch));
- // Note that no raw waveform has yet been read for this
- // crystal/channel.
- this.windowRaw[ii] = 1;
- this.isFirstRaw[ii] = true;
+
+
}
// Define the plot region that will display the single channel
@@ -321,29 +309,43 @@
System.out.println("done disposing ECAL event display");
}
});
- // Comment this out for now. It is causing problems. --JM
-
- int row,column;
- String hName;
+
+ int row,column; String hName;
System.out.println("EcalEventDisplay endOfData clear histograms");
for(int ii = 0; ii < NUM_CHANNELS; ii++) {
- row=EcalMonitoringUtilities.getRowFromHistoID(ii);
- column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
- hName=detectorName + " : " + inputCollection + " : Hit Energy : " + column + " " + row + ": " + ii;
- aida.tree().rm(hName);
- hName=detectorName + " : " + inputCollection + " : Hit Time : " + column + " " + row +": " + ii;
- aida.tree().rm(hName);
- hName=detectorName+ " : " + inputCollection + " : Hit Time Vs Energy : " + column + " " + row + ": " + ii;
- aida.tree().rm(hName);
- hName=detectorName + " : " + inputCollection +" : Cluster Energy : " + column + " " + row + ": " + ii;
- aida.tree().rm(hName);
-
-
- if (isFirstRaw[ii]==false) {
- hName=detectorName+ " : " + inputCollectionRaw + " : Raw Waveform : " + column + " " + row + ": " + ii; aida.tree().rm(hName);
- }
- }
- System.out.println("EcalEventDisplay endOfData clear histograms done");
+ row = EcalMonitoringUtilities.getRowFromHistoID(ii);
+ column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
+ hName=detectorName + " : " + inputCollection + " : Hit Energy : " + column + " " + row + ": " + ii;
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
+
+
+
+ hName=detectorName + " : " + inputCollection + " : Hit Time : " + column + " " + row + ": " + ii;
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
+
+
+
+ hName=detectorName+ " : " + inputCollection + " : Hit Time Vs Energy : " + column + " " + row + ": " + ii;
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
+
+
+ }
+ System.out.println("EcalEventDisplay endOfData clear histograms done");
}
@Override
@@ -420,35 +422,7 @@
}
}
- /**
- * // Plot the raw waveform only if raw tracker hit exist in the // event. if
- * (event.hasCollection(RawTrackerHit.class, inputCollectionRaw)){ // Get the list of raw tracker hits.
- * List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollectionRaw);
- *
- * // Process each raw tracker hit. for (RawTrackerHit hit : hits) { // Get the x and y indices for the hit. int
- * ix = hit.getIdentifierFieldValue("ix"); int iy = hit.getIdentifierFieldValue("iy");
- *
- * if(iy != 0 && ix != 0) { if(!ECalUtils.isInHole(iy, ix)) { // Get the crystal ID for the current hit. int id
- * = ECalUtils.getHistoIDFromRowColumn(iy, ix);
- *
- * // The window is length is not known by default. // If this is the first hit, read the window // length and
- * initialize the plot. if(isFirstRaw[id]) { // Note that this plot is initialized. isFirstRaw[id] = false;
- *
- * // Set the waveform array. windowRaw[id] = hit.getADCValues().length;
- *
- * // Initialize the waveform plot. channelRawWaveform.set(id, aida.histogram1D(detector.getDetectorName() +
- * " : " + inputCollectionRaw + " : Raw Waveform : " + ix + " " + iy + ": " + id, windowRaw[id], -0.5 *
- * ECalUtils.ecalReadoutPeriod, (-0.5 + windowRaw[id]) * ECalUtils.ecalReadoutPeriod)); }
- *
- * // If the plot should be updated, do so. if(update) { channelRawWaveform.get(id).reset(); for (int jj = 0; jj
- * < windowRaw[id]; jj++) { channelRawWaveform.get(id).fill(jj * ECalUtils.ecalReadoutPeriod,
- * hit.getADCValues()[jj] * ECalUtils.adcResolution * 1000); } double[] result =
- * ECalUtils.computeAmplitude(hit.getADCValues(), windowRaw[id], pedSamples);
- * channelRawWaveform.get(id).setTitle("Ampl: " + String.format("%.2f", result[0]) + " mV , ped : " +
- * String.format("%.2f", result[1]) + " " + String.format("%.2f", result[2]) + " ADC counts");
- * plotter.region(3).refresh(); } } } } }
- **/
-
+
// Update the single event display.
if (update) {
this.viewer.updateDisplay();
Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java
=============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java (original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java Tue Oct 27 11:33:16 2015
@@ -13,6 +13,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.lang.IllegalArgumentException;
import org.hps.monitoring.ecal.eventdisplay.ui.PDataEventViewer;
import org.hps.monitoring.ecal.eventdisplay.ui.PEventViewer;
@@ -47,251 +48,251 @@
* @author Andrea Celentano
*/
public class EcalEventDisplayWithRawWaveform extends Driver implements CrystalListener, ActionListener {
- // Class variables.
- private static final int NUM_CHANNELS = 11 * 47;
-
- // Plotter objects and variables.
- private IPlotter plotter;
- private IPlotterFactory plotterFactory;
- private AIDA aida = AIDA.defaultInstance();
-
- // LCIO Collection names.
- private String inputCollection = "EcalCalHits";
- private String clusterCollection = "EcalClusters";
- private String inputCollectionRaw = "EcalReadoutHits";
-
- // Channel plot lists.
- private ArrayList<IHistogram1D> channelEnergyPlot;
- private ArrayList<IHistogram1D> clusterEnergyPlot;
- private ArrayList<IHistogram1D> channelTimePlot;
- private ArrayList<IHistogram1D> channelRawWaveform;
- private ArrayList<IHistogram2D> channelTimeVsEnergyPlot;
-
- // Internal variables.
- private PEventViewer viewer; // Single event display.
- private int pedSamples = 10; //
- private IPlotterStyle pstyle; // The plotter style for all plots.
- private long lastEventTime = 0; // Tracks the time at which the last event occurred.
- private int eventRefreshRate = 1; // The number of seconds before an update occurs.
- private boolean resetOnUpdate = true; // Clears the event display on each update.
- private double minEch = 10 * EcalUtils.MeV; // The energy scale minimum.
- private double maxEch = 3500 * EcalUtils.MeV; // The energy scale maximum.
- private int[] windowRaw = new int[NUM_CHANNELS]; // The number of samples in a waveform for each channel.
- private boolean[] isFirstRaw = new boolean[NUM_CHANNELS]; // Whether a waveform plot was initiated for each channel.
-
- // Plot style and title variables.
- private static final String NO_TITLE = "";
- private static final String SIGNAL_TIME_TITLE = "Time (ns)";
- private static final String HIT_TIME_TITLE = "Hit Time (ns)";
- private static final String SIGNAL_DATA_STYLE_COLOR = "orange";
- private static final String RAW_WAVEFORM_TITLE = "Raw Waveform";
- private static final String HIT_ENERGY_TITLE = "Hit Energy (GeV)";
- private static final String CLUSTER_ENERGY_TITLE = "Cluster Energy (GeV)";
- private static final String SIGNAL_AMPLITUDE_TITLE = "Signal Amplitude (mV)";
- private String detectorName;
-
- /**
- * Sets the upper bound of the energy scales used by the driver.
- * Energy units are in GeV.
- * @param maxEch - The energy scale upper bound.
- */
- public void setMaxEch(double maxEch) {
- this.maxEch = maxEch;
- }
-
- /**
- * Sets the lower bound of the energy scales used by the driver.
- * Energy units are in GeV.
- * @param minEch - The lower energy scale bound.
- */
- public void setMinEch(double minEch) {
- this.minEch = minEch;
- }
-
- public void setPedSamples(int pedSamples) {
- this.pedSamples = pedSamples;
- }
- /**
- * Sets the LCIO collection name for the processed calorimeter hits.
- * @param inputCollection - The LCIO collection name.
- */
- public void setInputCollection(String inputCollection) {
- this.inputCollection = inputCollection;
- }
-
- /**
- * Sets the LCIO collection name for the raw waveform hits.
- * @param inputCollectionRaw - The LCIO collection name.
- */
- public void setInputCollectionRaw(String inputCollectionRaw) {
- this.inputCollectionRaw = inputCollectionRaw;
- }
-
- /**
- * Sets the LCIO collection name for calorimeter clusters.
- * @param inputClusterCollection - The LCIO collection name.
- */
- public void setInputClusterCollection(String inputClusterCollection) {
- this.clusterCollection = inputClusterCollection;
- }
-
- /**
- * Sets the rate at which the GUI updates its elements,
- * @param eventRefreshRate - The rate at which the GUI should be
- * updated, in seconds.
- */
- public void setEventRefreshRate(int eventRefreshRate) {
- this.eventRefreshRate = eventRefreshRate;
- }
-
- /**
- * Sets whether the event display should be cleared after event
- * or whether it should retain the previously displayed results.
- * @param resetOnUpdate - <code>true</code> means that the event
- * display should be cleared on each update and <code>false</code>
- * that it should not.
- */
- public void setResetOnUpdate(boolean resetOnUpdate) {
- this.resetOnUpdate = resetOnUpdate;
- }
-
- /**
- * Initializes the single channel monitoring plots for all crystal
- * channels and defines the plotter region that contains them.
- */
- @Override
- public void detectorChanged(Detector detector) {
- detectorName=detector.getName();
- // Reset the AIDA tree directory.
- aida.tree().cd("/");
-
- // Store histograms for the crystals.
- channelEnergyPlot = new ArrayList<IHistogram1D>(NUM_CHANNELS);
- channelTimePlot = new ArrayList<IHistogram1D>(NUM_CHANNELS);
- channelRawWaveform = new ArrayList<IHistogram1D>(NUM_CHANNELS);
- clusterEnergyPlot = new ArrayList<IHistogram1D>(NUM_CHANNELS);
- channelTimeVsEnergyPlot = new ArrayList<IHistogram2D>(NUM_CHANNELS);
-
- // Create the histograms for single channel energy and time
- // distribution.
- for(int ii = 0; ii < NUM_CHANNELS; ii++) {
- // The above instruction is a terrible hack, just to fill
- // the arrayList with all the elements. They'll be initialized
- // properly during the event readout, Since we want to account
- // for possibly different raw waveform dimensions!
-
- //Get the x and y indices for the current channel.
- int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
- int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
-
- // Initialize the histograms for the current crystal channel.
- channelEnergyPlot.add(aida.histogram1D(detectorName + " : "
- + inputCollection + " : Hit Energy : " + column + " " + row
- + ": " + ii, 100, -0.2, maxEch));
- channelTimePlot.add(aida.histogram1D(detectorName + " : "
- + inputCollection + " : Hit Time : " + column + " " + row + ": "
- + ii, 100, 0, 400));
- channelTimeVsEnergyPlot.add(aida.histogram2D(detectorName
- + " : " + inputCollection + " : Hit Time Vs Energy : " + column
- + " " + row + ": " + ii, 100, 0, 400, 100, -0.2, maxEch));
- channelRawWaveform.add(aida.histogram1D(detectorName + " : "
- + inputCollection + " : Hit Energy : " + column + " " + row + ": " + ii));
- clusterEnergyPlot.add(aida.histogram1D(detectorName + " : "
- + inputCollection + " : Cluster Energy : " + column + " " + row
- + ": " + ii, 100, -0.2, maxEch));
-
- // Note that no raw waveform has yet been read for this
- // crystal/channel.
- windowRaw[ii] = 1;
- isFirstRaw[ii] = true;
- }
-
- // Define the plot region that will display the single channel
- // plots in the monitoring application.
- plotterFactory = aida.analysisFactory().createPlotterFactory("Single Channel");
- plotter = plotterFactory.create("Single Channel");
- pstyle = this.createDefaultStyle();
- plotter.setTitle("");
- plotter.createRegions(2,2);
-
- // Define the first plot region.
- pstyle.xAxisStyle().setLabel(HIT_ENERGY_TITLE);
- pstyle.yAxisStyle().setLabel(NO_TITLE);
- plotter.region(0).plot(channelEnergyPlot.get(0), pstyle);
-
- // Define the second plot region.
- pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
- pstyle.yAxisStyle().setLabel(NO_TITLE);
- plotter.region(1).plot(channelTimePlot.get(0), pstyle);
-
- // Define the third plot region; this encompasses the time vs.
- // energy plots.
- pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
- pstyle.yAxisStyle().setLabel(HIT_ENERGY_TITLE);
- plotter.region(2).plot(channelTimeVsEnergyPlot.get(0), pstyle);
-
-
-
-
- // Define the fourth plot region; this encompasses the raw
- // wave form plots.
- pstyle.xAxisStyle().setLabel(RAW_WAVEFORM_TITLE);
- pstyle.yAxisStyle().setLabel(NO_TITLE);
- pstyle.dataStyle().fillStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
- pstyle.dataStyle().markerStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
- pstyle.dataStyle().errorBarStyle().setVisible(false);
- plotter.region(3).plot(channelRawWaveform.get(0), pstyle);
-
-
- // Display the plot region.
- plotter.show();
-
- // Set the time tracker variables.
- lastEventTime = 0;
- }
-
- /**
- * Initializes the <code>Viewer</code> for the single event display.
- * If a configuration file is available, then it is used by the
- * <code>Viewer</code> to display hardware configuration mappings.
- * Otherwise, this is excluded.
- */
- @Override
- public void startOfData() {
- // Check if the configuration mapping file exists.
- File config = new File("ecal-mapping-config.csv");
-
- // If the file exists, load the viewer that will display it.
- if(config.exists() && config.canRead()) {
- // Account for IO read errors. Only load this version if
- // the data file can be read successfully.
- try { viewer = new PDataEventViewer(config.getAbsolutePath()); }
-
- // Otherwise, open the regular version.
- catch (IOException e) { viewer = new PEventViewer(); }
- }
-
- // If the file is not present, then just load the normal version.
- else { viewer = new PEventViewer(); }
-
- // Set the viewer properties.
- viewer.setScaleMinimum(minEch);
- viewer.setScaleMaximum(maxEch);
- viewer.addCrystalListener(this);
-
- // Make the Viewer object visible.
- viewer.setVisible(true);
- }
-
- /**
- * Hides the single event display and disposes it from memory.
- */
- @Override
- public void endOfData() {
- viewer.setVisible(false);
- viewer.dispose();
-
-
+ // Class variables.
+ private static final int NUM_CHANNELS = 11 * 47;
+
+ // Plotter objects and variables.
+ private IPlotter plotter;
+ private IPlotterFactory plotterFactory;
+ private AIDA aida = AIDA.defaultInstance();
+
+ // LCIO Collection names.
+ private String inputCollection = "EcalCalHits";
+ private String clusterCollection = "EcalClusters";
+ private String inputCollectionRaw = "EcalReadoutHits";
+
+ // Channel plot lists.
+ private ArrayList<IHistogram1D> channelEnergyPlot;
+ private ArrayList<IHistogram1D> clusterEnergyPlot;
+ private ArrayList<IHistogram1D> channelTimePlot;
+ private ArrayList<IHistogram1D> channelRawWaveform;
+ private ArrayList<IHistogram2D> channelTimeVsEnergyPlot;
+
+ // Internal variables.
+ private PEventViewer viewer; // Single event display.
+ private int pedSamples = 10; //
+ private IPlotterStyle pstyle; // The plotter style for all plots.
+ private long lastEventTime = 0; // Tracks the time at which the last event occurred.
+ private int eventRefreshRate = 1; // The number of seconds before an update occurs.
+ private boolean resetOnUpdate = true; // Clears the event display on each update.
+ private double minEch = 10 * EcalUtils.MeV; // The energy scale minimum.
+ private double maxEch = 3500 * EcalUtils.MeV; // The energy scale maximum.
+ private int[] windowRaw = new int[NUM_CHANNELS]; // The number of samples in a waveform for each channel.
+ private boolean[] isFirstRaw = new boolean[NUM_CHANNELS]; // Whether a waveform plot was initiated for each channel.
+
+ // Plot style and title variables.
+ private static final String NO_TITLE = "";
+ private static final String SIGNAL_TIME_TITLE = "Time (ns)";
+ private static final String HIT_TIME_TITLE = "Hit Time (ns)";
+ private static final String SIGNAL_DATA_STYLE_COLOR = "orange";
+ private static final String RAW_WAVEFORM_TITLE = "Raw Waveform";
+ private static final String HIT_ENERGY_TITLE = "Hit Energy (GeV)";
+ private static final String CLUSTER_ENERGY_TITLE = "Cluster Energy (GeV)";
+ private static final String SIGNAL_AMPLITUDE_TITLE = "Signal Amplitude (mV)";
+ private String detectorName;
+
+ /**
+ * Sets the upper bound of the energy scales used by the driver.
+ * Energy units are in GeV.
+ * @param maxEch - The energy scale upper bound.
+ */
+ public void setMaxEch(double maxEch) {
+ this.maxEch = maxEch;
+ }
+
+ /**
+ * Sets the lower bound of the energy scales used by the driver.
+ * Energy units are in GeV.
+ * @param minEch - The lower energy scale bound.
+ */
+ public void setMinEch(double minEch) {
+ this.minEch = minEch;
+ }
+
+ public void setPedSamples(int pedSamples) {
+ this.pedSamples = pedSamples;
+ }
+ /**
+ * Sets the LCIO collection name for the processed calorimeter hits.
+ * @param inputCollection - The LCIO collection name.
+ */
+ public void setInputCollection(String inputCollection) {
+ this.inputCollection = inputCollection;
+ }
+
+ /**
+ * Sets the LCIO collection name for the raw waveform hits.
+ * @param inputCollectionRaw - The LCIO collection name.
+ */
+ public void setInputCollectionRaw(String inputCollectionRaw) {
+ this.inputCollectionRaw = inputCollectionRaw;
+ }
+
+ /**
+ * Sets the LCIO collection name for calorimeter clusters.
+ * @param inputClusterCollection - The LCIO collection name.
+ */
+ public void setInputClusterCollection(String inputClusterCollection) {
+ this.clusterCollection = inputClusterCollection;
+ }
+
+ /**
+ * Sets the rate at which the GUI updates its elements,
+ * @param eventRefreshRate - The rate at which the GUI should be
+ * updated, in seconds.
+ */
+ public void setEventRefreshRate(int eventRefreshRate) {
+ this.eventRefreshRate = eventRefreshRate;
+ }
+
+ /**
+ * Sets whether the event display should be cleared after event
+ * or whether it should retain the previously displayed results.
+ * @param resetOnUpdate - <code>true</code> means that the event
+ * display should be cleared on each update and <code>false</code>
+ * that it should not.
+ */
+ public void setResetOnUpdate(boolean resetOnUpdate) {
+ this.resetOnUpdate = resetOnUpdate;
+ }
+
+ /**
+ * Initializes the single channel monitoring plots for all crystal
+ * channels and defines the plotter region that contains them.
+ */
+ @Override
+ public void detectorChanged(Detector detector) {
+ detectorName=detector.getName();
+ // Reset the AIDA tree directory.
+ aida.tree().cd("/");
+
+ // Store histograms for the crystals.
+ channelEnergyPlot = new ArrayList<IHistogram1D>(NUM_CHANNELS);
+ channelTimePlot = new ArrayList<IHistogram1D>(NUM_CHANNELS);
+ channelRawWaveform = new ArrayList<IHistogram1D>(NUM_CHANNELS);
+ clusterEnergyPlot = new ArrayList<IHistogram1D>(NUM_CHANNELS);
+ channelTimeVsEnergyPlot = new ArrayList<IHistogram2D>(NUM_CHANNELS);
+
+ // Create the histograms for single channel energy and time
+ // distribution.
+ for(int ii = 0; ii < NUM_CHANNELS; ii++) {
+ // The above instruction is a terrible hack, just to fill
+ // the arrayList with all the elements. They'll be initialized
+ // properly during the event readout, Since we want to account
+ // for possibly different raw waveform dimensions!
+
+ //Get the x and y indices for the current channel.
+ int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
+ int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
+
+ // Initialize the histograms for the current crystal channel.
+ channelEnergyPlot.add(aida.histogram1D(detectorName + " : "
+ + inputCollection + " : Hit Energy : " + column + " " + row
+ + ": " + ii, 100, -0.2, maxEch));
+ channelTimePlot.add(aida.histogram1D(detectorName + " : "
+ + inputCollection + " : Hit Time : " + column + " " + row + ": "
+ + ii, 100, 0, 400));
+ channelTimeVsEnergyPlot.add(aida.histogram2D(detectorName
+ + " : " + inputCollection + " : Hit Time Vs Energy : " + column
+ + " " + row + ": " + ii, 100, 0, 400, 100, -0.2, maxEch));
+ channelRawWaveform.add(aida.histogram1D(detectorName + " : "
+ + inputCollection + " : Hit Energy : " + column + " " + row + ": " + ii));
+ clusterEnergyPlot.add(aida.histogram1D(detectorName + " : "
+ + inputCollection + " : Cluster Energy : " + column + " " + row
+ + ": " + ii, 100, -0.2, maxEch));
+
+ // Note that no raw waveform has yet been read for this
+ // crystal/channel.
+ windowRaw[ii] = 1;
+ isFirstRaw[ii] = true;
+ }
+
+ // Define the plot region that will display the single channel
+ // plots in the monitoring application.
+ plotterFactory = aida.analysisFactory().createPlotterFactory("Single Channel");
+ plotter = plotterFactory.create("Single Channel");
+ pstyle = this.createDefaultStyle();
+ plotter.setTitle("");
+ plotter.createRegions(2,2);
+
+ // Define the first plot region.
+ pstyle.xAxisStyle().setLabel(HIT_ENERGY_TITLE);
+ pstyle.yAxisStyle().setLabel(NO_TITLE);
+ plotter.region(0).plot(channelEnergyPlot.get(0), pstyle);
+
+ // Define the second plot region.
+ pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
+ pstyle.yAxisStyle().setLabel(NO_TITLE);
+ plotter.region(1).plot(channelTimePlot.get(0), pstyle);
+
+ // Define the third plot region; this encompasses the time vs.
+ // energy plots.
+ pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
+ pstyle.yAxisStyle().setLabel(HIT_ENERGY_TITLE);
+ plotter.region(2).plot(channelTimeVsEnergyPlot.get(0), pstyle);
+
+
+
+
+ // Define the fourth plot region; this encompasses the raw
+ // wave form plots.
+ pstyle.xAxisStyle().setLabel(RAW_WAVEFORM_TITLE);
+ pstyle.yAxisStyle().setLabel(NO_TITLE);
+ pstyle.dataStyle().fillStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
+ pstyle.dataStyle().markerStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
+ pstyle.dataStyle().errorBarStyle().setVisible(false);
+ plotter.region(3).plot(channelRawWaveform.get(0), pstyle);
+
+
+ // Display the plot region.
+ plotter.show();
+
+ // Set the time tracker variables.
+ lastEventTime = 0;
+ }
+
+ /**
+ * Initializes the <code>Viewer</code> for the single event display.
+ * If a configuration file is available, then it is used by the
+ * <code>Viewer</code> to display hardware configuration mappings.
+ * Otherwise, this is excluded.
+ */
+ @Override
+ public void startOfData() {
+ // Check if the configuration mapping file exists.
+ File config = new File("ecal-mapping-config.csv");
+
+ // If the file exists, load the viewer that will display it.
+ if(config.exists() && config.canRead()) {
+ // Account for IO read errors. Only load this version if
+ // the data file can be read successfully.
+ try { viewer = new PDataEventViewer(config.getAbsolutePath()); }
+
+ // Otherwise, open the regular version.
+ catch (IOException e) { viewer = new PEventViewer(); }
+ }
+
+ // If the file is not present, then just load the normal version.
+ else { viewer = new PEventViewer(); }
+
+ // Set the viewer properties.
+ viewer.setScaleMinimum(minEch);
+ viewer.setScaleMaximum(maxEch);
+ viewer.addCrystalListener(this);
+
+ // Make the Viewer object visible.
+ viewer.setVisible(true);
+ }
+
+ /**
+ * Hides the single event display and disposes it from memory.
+ */
+ @Override
+ public void endOfData() {
+ viewer.setVisible(false);
+ viewer.dispose();
+
+
int row,column;
String hName;
@@ -301,263 +302,289 @@
// the arrayList with all the elements. They'll be initialized
// properly during the event readout, Since we want to account
// for possibly different raw waveform dimensions!
-
+
//Get the x and y indices for the current channel.
row = EcalMonitoringUtilities.getRowFromHistoID(ii);
column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
hName=detectorName + " : "
+ inputCollection + " : Hit Energy : " + column + " " + row
+ ": " + ii;
- aida.tree().rm(hName);
-
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
hName=detectorName + " : "
+ inputCollection + " : Hit Time : " + column + " " + row + ": "
+ ii;
- aida.tree().rm(hName);
-
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
+
hName=detectorName+ " : " + inputCollection + " : Hit Time Vs Energy : " + column
+ " " + row + ": " + ii;
- aida.tree().rm(hName);
-
+
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
+
+
hName=detectorName + " : "
+ inputCollection + " : Cluster Energy : " + column + " " + row
+ ": " + ii;
- aida.tree().rm(hName);
-
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
+
+
+
hName=detectorName + " : "
+ inputCollection + " : Cluster Energy : " + column + " " + row
+ ": " + ii;
- aida.tree().rm(hName);
-
-
- }
- //System.out.println("EcalEventDisplay endOfData clear histograms done");
-
-
- }
-
- @Override
- public void process(EventHeader event){
- // Check whether enough time has passed to perform an update
- // on the event display.
- boolean update = false;
- long currentTime = System.currentTimeMillis() / 1000;
- if((currentTime - lastEventTime) > eventRefreshRate){
- lastEventTime = currentTime;
- update = true;
- }
-
- // If an update should be made, perform the update.
- if(update && resetOnUpdate) { viewer.resetDisplay(); }
-
- // If the event has calorimeter hit objects...
- if(event.hasCollection(CalorimeterHit.class, inputCollection)) {
- // Get the list of calorimeter hits.
- List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
-
- // For each of the calorimeter hits...
- for (CalorimeterHit hit : hits) {
- // Get the x and y indices for the current hit.
- int ix = hit.getIdentifierFieldValue("ix");
- int iy = hit.getIdentifierFieldValue("iy");
-
- if (iy != 0 && ix != 0) {
- // Get the histogram index for the hit.
- int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(iy, ix);
-
- // If the hit has energy, populate the plots.
- if(hit.getCorrectedEnergy() > 0) {
- channelEnergyPlot.get(id).fill(hit.getCorrectedEnergy());
- channelTimePlot.get(id).fill(hit.getTime());
- channelTimeVsEnergyPlot.get(id).fill(hit.getTime(), hit.getCorrectedEnergy());
- }
-
- // If an update to the event display should be
- // performed, give it the hits.
- if(update) { viewer.addHit(hit); }
- }
- }
- }
-
- // If there are clusters in the event...
- if (event.hasCollection(Cluster.class, clusterCollection)) {
- // Get the list of clusters.
- List<Cluster> clusters = event.get(Cluster.class, clusterCollection);
-
- // Iterate over the clusters and add them to the event
- // display if appropriate.
- for (Cluster cluster : clusters) {
- // Get the ix and iy indices for the seed.
- int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix");
- int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy");
-
- // Get the histogram index for the hit.
- int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(iy, ix);
-
- // Add the cluster energy to the plot.
- if(cluster.getEnergy() > 0.0) {
- clusterEnergyPlot.get(id).fill(cluster.getEnergy());
- }
-
- // If an update is needed, add the cluster to the viewer.
- if(update) { viewer.addCluster(cluster); }
- }
- }
-
-
- // Plot the raw waveform only if raw tracker hit exist in the
- // event.
- if (event.hasCollection(RawTrackerHit.class, inputCollectionRaw)){
- // Get the list of raw tracker hits.
- List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollectionRaw);
-
- // Process each raw tracker hit.
- for (RawTrackerHit hit : hits) {
- // Get the x and y indices for the hit.
- int ix = hit.getIdentifierFieldValue("ix");
- int iy = hit.getIdentifierFieldValue("iy");
-
- if(iy != 0 && ix != 0) {
- if(!EcalMonitoringUtilities.isInHole(iy, ix)) {
- // Get the crystal ID for the current hit.
- int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(iy, ix);
-
- // The window is length is not known by default.
- // If this is the first hit, read the window
- // length and initialize the plot.
- if(isFirstRaw[id]) {
- // Note that this plot is initialized.
- isFirstRaw[id] = false;
-
- // Set the waveform array.
- windowRaw[id] = hit.getADCValues().length;
-
- // Initialize the waveform plot.
- channelRawWaveform.set(id,aida.histogram1D(event.getDetectorName()
- + " : " + inputCollectionRaw + " : Raw Waveform : " + ix + " "
- + iy + ": " + id, windowRaw[id], -0.5 * EcalUtils.ecalReadoutPeriod,
- (-0.5 + windowRaw[id]) * EcalUtils.ecalReadoutPeriod));
- }
-
- // If the plot should be updated, do so.
- if(update) {
- channelRawWaveform.get(id).reset();
- for (int jj = 0; jj < windowRaw[id]; jj++) {
- channelRawWaveform.get(id).fill(jj * EcalUtils.ecalReadoutPeriod,
- hit.getADCValues()[jj] * EcalUtils.adcResolution * 1000);
- }
- double[] result = EcalUtils.computeAmplitude(hit.getADCValues(), windowRaw[id], pedSamples);
- channelRawWaveform.get(id).setTitle("Ampl: " + String.format("%.2f", result[0])
- + " mV , ped : " + String.format("%.2f", result[1]) + " "
- + String.format("%.2f", result[2]) + " ADC counts");
- plotter.region(3).refresh();
- }
- }
- }
- }
- }
-
-
- // Update the single event display.
- if(update) { viewer.updateDisplay(); }
- }
-
- @Override
- public void actionPerformed(ActionEvent ae) { }
-
- @Override
- public void crystalActivated(CrystalEvent e) { }
-
- @Override
- public void crystalDeactivated(CrystalEvent e) { }
-
- /**
- * Updates the monitoring plots for the crystal that was clicked.
- */
- @Override
- public void crystalClicked(CrystalEvent e) {
- // Get the crystal that was clicked in the LCSim coordinate system.
- Point ecalPoint = Viewer.toEcalPoint(e.getCrystalID());
-
- // Make sure that the clicked crystal is valid. Necessary??
- if((ecalPoint.x != 0) && (ecalPoint.y != 0))
- if (!EcalMonitoringUtilities.isInHole(ecalPoint.y, ecalPoint.x)) {
- // Get the crystal ID.
- int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(ecalPoint.y, ecalPoint.x);
-
- // Clear and replot region 0 for the new crystal.
- plotter.region(0).clear();
- pstyle.xAxisStyle().setLabel(HIT_ENERGY_TITLE);
- pstyle.yAxisStyle().setLabel(NO_TITLE);
- plotter.region(0).plot(channelEnergyPlot.get(id), pstyle);
-
- // Clear and replot region 1 for the new crystal.
- plotter.region(1).clear();
- pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
- pstyle.yAxisStyle().setLabel(NO_TITLE);
- plotter.region(1).plot(channelTimePlot.get(id), pstyle);
-
- // Clear and replot region 2 for the new crystal.
- plotter.region(2).clear();
- pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
- pstyle.yAxisStyle().setLabel(HIT_ENERGY_TITLE);
- plotter.region(2).plot(channelTimeVsEnergyPlot.get(id), pstyle);
-
-
- // Process and plot the region 3 plot.
- plotter.region(3).clear();
- if(!isFirstRaw[id]) {
- pstyle.yAxisStyle().setLabel(SIGNAL_AMPLITUDE_TITLE);
- pstyle.xAxisStyle().setLabel(SIGNAL_TIME_TITLE);
- pstyle.dataStyle().fillStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
- pstyle.dataStyle().markerStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
- pstyle.dataStyle().errorBarStyle().setVisible(false);
- }
- else {
- pstyle.xAxisStyle().setLabel(HIT_ENERGY_TITLE);
- pstyle.yAxisStyle().setLabel("");
- }
- plotter.region(3).plot(channelRawWaveform.get(id), pstyle);
- }
- }
-
- /**
- * Initializes the default style for plots.
- * @return Returns an <code>IPlotterStyle</code> object that
- * represents the default style for plots.
- */
- public IPlotterStyle createDefaultStyle() {
- IPlotterStyle pstyle = plotterFactory.createPlotterStyle();
- // Set the appearance of the axes.
- pstyle.xAxisStyle().labelStyle().setBold(true);
- pstyle.yAxisStyle().labelStyle().setBold(true);
- pstyle.xAxisStyle().tickLabelStyle().setBold(true);
- pstyle.yAxisStyle().tickLabelStyle().setBold(true);
- pstyle.xAxisStyle().lineStyle().setColor("black");
- pstyle.yAxisStyle().lineStyle().setColor("black");
- pstyle.xAxisStyle().lineStyle().setThickness(2);
- pstyle.yAxisStyle().lineStyle().setThickness(2);
-
- // Set color settings.
- pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
- pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
- pstyle.dataStyle().errorBarStyle().setVisible(false);
- pstyle.setParameter("hist2DStyle", "colorMap");
-
- // Force auto range to zero.
- pstyle.yAxisStyle().setParameter("allowZeroSuppression", "false");
- pstyle.xAxisStyle().setParameter("allowZeroSuppression", "false");
-
- // Set the title style.
- pstyle.titleStyle().textStyle().setFontSize(20);
-
- // Draw caps on error bars.
- pstyle.dataStyle().errorBarStyle().setParameter("errorBarDecoration", (new Float(1.0f)).toString());
-
- // Turn off grid lines until explicitly enabled.
- pstyle.gridStyle().setVisible(false);
-
- // Return the style.
- return pstyle;
- }
+
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException e){
+ System.out.println("Got exception "+e);
+ }
+
+ }
+ System.out.println("EcalEventDisplay endOfData clear histograms done");
+ }
+
+ @Override
+ public void process(EventHeader event){
+ // Check whether enough time has passed to perform an update
+ // on the event display.
+ boolean update = false;
+ long currentTime = System.currentTimeMillis() / 1000;
+ if((currentTime - lastEventTime) > eventRefreshRate){
+ lastEventTime = currentTime;
+ update = true;
+ }
+
+ // If an update should be made, perform the update.
+ if(update && resetOnUpdate) { viewer.resetDisplay(); }
+
+ // If the event has calorimeter hit objects...
+ if(event.hasCollection(CalorimeterHit.class, inputCollection)) {
+ // Get the list of calorimeter hits.
+ List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
+
+ // For each of the calorimeter hits...
+ for (CalorimeterHit hit : hits) {
+ // Get the x and y indices for the current hit.
+ int ix = hit.getIdentifierFieldValue("ix");
+ int iy = hit.getIdentifierFieldValue("iy");
+
+ if (iy != 0 && ix != 0) {
+ // Get the histogram index for the hit.
+ int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(iy, ix);
+
+ // If the hit has energy, populate the plots.
+ if(hit.getCorrectedEnergy() > 0) {
+ channelEnergyPlot.get(id).fill(hit.getCorrectedEnergy());
+ channelTimePlot.get(id).fill(hit.getTime());
+ channelTimeVsEnergyPlot.get(id).fill(hit.getTime(), hit.getCorrectedEnergy());
+ }
+
+ // If an update to the event display should be
+ // performed, give it the hits.
+ if(update) { viewer.addHit(hit); }
+ }
+ }
+ }
+
+ // If there are clusters in the event...
+ if (event.hasCollection(Cluster.class, clusterCollection)) {
+ // Get the list of clusters.
+ List<Cluster> clusters = event.get(Cluster.class, clusterCollection);
+
+ // Iterate over the clusters and add them to the event
+ // display if appropriate.
+ for (Cluster cluster : clusters) {
+ // Get the ix and iy indices for the seed.
+ int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix");
+ int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy");
+
+ // Get the histogram index for the hit.
+ int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(iy, ix);
+
+ // Add the cluster energy to the plot.
+ if(cluster.getEnergy() > 0.0) {
+ clusterEnergyPlot.get(id).fill(cluster.getEnergy());
+ }
+
+ // If an update is needed, add the cluster to the viewer.
+ if(update) { viewer.addCluster(cluster); }
+ }
+ }
+
+
+ // Plot the raw waveform only if raw tracker hit exist in the
+ // event.
+ if (event.hasCollection(RawTrackerHit.class, inputCollectionRaw)){
+ // Get the list of raw tracker hits.
+ List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollectionRaw);
+
+ // Process each raw tracker hit.
+ for (RawTrackerHit hit : hits) {
+ // Get the x and y indices for the hit.
+ int ix = hit.getIdentifierFieldValue("ix");
+ int iy = hit.getIdentifierFieldValue("iy");
+
+ if(iy != 0 && ix != 0) {
+ if(!EcalMonitoringUtilities.isInHole(iy, ix)) {
+ // Get the crystal ID for the current hit.
+ int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(iy, ix);
+
+ // The window is length is not known by default.
+ // If this is the first hit, read the window
+ // length and initialize the plot.
+ if(isFirstRaw[id]) {
+ // Note that this plot is initialized.
+ isFirstRaw[id] = false;
+
+ // Set the waveform array.
+ windowRaw[id] = hit.getADCValues().length;
+
+ // Initialize the waveform plot.
+ channelRawWaveform.set(id,aida.histogram1D(event.getDetectorName()
+ + " : " + inputCollectionRaw + " : Raw Waveform : " + ix + " "
+ + iy + ": " + id, windowRaw[id], -0.5 * EcalUtils.ecalReadoutPeriod,
+ (-0.5 + windowRaw[id]) * EcalUtils.ecalReadoutPeriod));
+ }
+
+ // If the plot should be updated, do so.
+ if(update) {
+ channelRawWaveform.get(id).reset();
+ for (int jj = 0; jj < windowRaw[id]; jj++) {
+ channelRawWaveform.get(id).fill(jj * EcalUtils.ecalReadoutPeriod,
+ hit.getADCValues()[jj] * EcalUtils.adcResolution * 1000);
+ }
+ double[] result = EcalUtils.computeAmplitude(hit.getADCValues(), windowRaw[id], pedSamples);
+ channelRawWaveform.get(id).setTitle("Ampl: " + String.format("%.2f", result[0])
+ + " mV , ped : " + String.format("%.2f", result[1]) + " "
+ + String.format("%.2f", result[2]) + " ADC counts");
+ plotter.region(3).refresh();
+ }
+ }
+ }
+ }
+ }
+
+
+ // Update the single event display.
+ if(update) { viewer.updateDisplay(); }
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent ae) { }
+
+ @Override
+ public void crystalActivated(CrystalEvent e) { }
+
+ @Override
+ public void crystalDeactivated(CrystalEvent e) { }
+
+ /**
+ * Updates the monitoring plots for the crystal that was clicked.
+ */
+ @Override
+ public void crystalClicked(CrystalEvent e) {
+ // Get the crystal that was clicked in the LCSim coordinate system.
+ Point ecalPoint = Viewer.toEcalPoint(e.getCrystalID());
+
+ // Make sure that the clicked crystal is valid. Necessary??
+ if((ecalPoint.x != 0) && (ecalPoint.y != 0))
+ if (!EcalMonitoringUtilities.isInHole(ecalPoint.y, ecalPoint.x)) {
+ // Get the crystal ID.
+ int id = EcalMonitoringUtilities.getHistoIDFromRowColumn(ecalPoint.y, ecalPoint.x);
+
+ // Clear and replot region 0 for the new crystal.
+ plotter.region(0).clear();
+ pstyle.xAxisStyle().setLabel(HIT_ENERGY_TITLE);
+ pstyle.yAxisStyle().setLabel(NO_TITLE);
+ plotter.region(0).plot(channelEnergyPlot.get(id), pstyle);
+
+ // Clear and replot region 1 for the new crystal.
+ plotter.region(1).clear();
+ pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
+ pstyle.yAxisStyle().setLabel(NO_TITLE);
+ plotter.region(1).plot(channelTimePlot.get(id), pstyle);
+
+ // Clear and replot region 2 for the new crystal.
+ plotter.region(2).clear();
+ pstyle.xAxisStyle().setLabel(HIT_TIME_TITLE);
+ pstyle.yAxisStyle().setLabel(HIT_ENERGY_TITLE);
+ plotter.region(2).plot(channelTimeVsEnergyPlot.get(id), pstyle);
+
+
+ // Process and plot the region 3 plot.
+ plotter.region(3).clear();
+ if(!isFirstRaw[id]) {
+ pstyle.yAxisStyle().setLabel(SIGNAL_AMPLITUDE_TITLE);
+ pstyle.xAxisStyle().setLabel(SIGNAL_TIME_TITLE);
+ pstyle.dataStyle().fillStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
+ pstyle.dataStyle().markerStyle().setColor(SIGNAL_DATA_STYLE_COLOR);
+ pstyle.dataStyle().errorBarStyle().setVisible(false);
+ }
+ else {
+ pstyle.xAxisStyle().setLabel(HIT_ENERGY_TITLE);
+ pstyle.yAxisStyle().setLabel("");
+ }
+ plotter.region(3).plot(channelRawWaveform.get(id), pstyle);
+ }
+ }
+
+ /**
+ * Initializes the default style for plots.
+ * @return Returns an <code>IPlotterStyle</code> object that
+ * represents the default style for plots.
+ */
+ public IPlotterStyle createDefaultStyle() {
+ IPlotterStyle pstyle = plotterFactory.createPlotterStyle();
+ // Set the appearance of the axes.
+ pstyle.xAxisStyle().labelStyle().setBold(true);
+ pstyle.yAxisStyle().labelStyle().setBold(true);
+ pstyle.xAxisStyle().tickLabelStyle().setBold(true);
+ pstyle.yAxisStyle().tickLabelStyle().setBold(true);
+ pstyle.xAxisStyle().lineStyle().setColor("black");
+ pstyle.yAxisStyle().lineStyle().setColor("black");
+ pstyle.xAxisStyle().lineStyle().setThickness(2);
+ pstyle.yAxisStyle().lineStyle().setThickness(2);
+
+ // Set color settings.
+ pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
+ pstyle.dataStyle().errorBarStyle().setVisible(false);
+ pstyle.setParameter("hist2DStyle", "colorMap");
+
+ // Force auto range to zero.
+ pstyle.yAxisStyle().setParameter("allowZeroSuppression", "false");
+ pstyle.xAxisStyle().setParameter("allowZeroSuppression", "false");
+
+ // Set the title style.
+ pstyle.titleStyle().textStyle().setFontSize(20);
+
+ // Draw caps on error bars.
+ pstyle.dataStyle().errorBarStyle().setParameter("errorBarDecoration", (new Float(1.0f)).toString());
+
+ // Turn off grid lines until explicitly enabled.
+ pstyle.gridStyle().setVisible(false);
+
+ // Return the style.
+ return pstyle;
+ }
}
Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java
=============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java (original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java Tue Oct 27 11:33:16 2015
@@ -58,794 +58,814 @@
*/
public class EcalLedSequenceMonitor extends Driver{
- private static final int NUM_CHANNELS = 11 * 47;
- private static final String dbTag = "led";
- private static final String dbTableName = "ecal_led_calibrations";
- private static final int runNumberMax = 9999;
- private static final int nDrivers = 8;
- private static final int nSteps = 56;
-
- String inputCollectionRaw = "EcalReadoutHits";
- String inputCollection = "EcalCalHits";
- AIDA aida;
-
- DatabaseConditionsManager conditionsManager;
-
- private EcalChannelCollection ChannelCollection;
- private EcalLedCollection LedCollection;
- private EcalConditions ecalConditions;
-
- Map < Integer,Integer > LedTopMap; //chid (conditions) --> LED id
- Map < Integer,Integer > LedBotMap; //chid (conditions) --> LED id
-
- Map < Integer,Integer > LedTopMapInverted; //LED id --> chid (conditions)
- Map < Integer,Integer > LedBotMapInverted; //LED id --> chid (conditions)
-
- private boolean useRawEnergy=false;
-
- String outFileName;
-
-
- private int runNumber = 0;
- private int eventN = 0;
- private int id,row,column,chid,ledid,driverid;
- private int[][] LEDStep = new int[][]{
- //first 4 are the flasher1 sequence, TOP controller
- {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},
- {56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111},
- {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,-1}, //missing 135 is ok
- {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
- //second 4 are the flasher2 sequence, BOTTOM controller
- {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},
- {56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, //missing 69 is OK
- {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167},
- {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
- };
-
- private int[] iStep = new int[nDrivers];
- private int[] nEvents = new int[NUM_CHANNELS];
- private double[] mMean = new double[NUM_CHANNELS];
- private double[] mRMS = new double[NUM_CHANNELS];
-
- private int nEventsMin=200;
- private int nMinChannelsWithEvents=350;
- private double energy,fillEnergy,fillTime;
- private double energyCut=2; //we expect very high energy from the LEDs..
- private double skipInitial=0.05;
- private double skipMin=0.3;
- private long cellID;
-
-
-
-
- //Histograms-functions-ntuples
- private ArrayList<ITuple> iTuple;
-
- private IFunction fFunction,fFunction1;
- private IProfile1D cProfile;
- private IHistogram2D hMeanCharge2D;
- private ArrayList<IHistogram1D> hCharge;
- private ArrayList<IHistogram2D> hChargeVsEvn;
- private IPlotterFactory factory;
- private IPlotter pPlotter=null;
- private IPlotter pPlotter2=null;
- private IPlotterStyle style ;
- private int[] fitStatus = new int[NUM_CHANNELS];
-
- private boolean doFullAnalysis=false;
- private boolean isMonitoringApp=false;
-
- private double[] fPars;
- private double[] fPrevPars;
- private double[] fParErrs;
- private String[] fParNames;
-
-
- private double fEvnMinDraw=0.;
- private double fEvnMaxDraw=80000.;
- private double fChargeMinDraw=0.;
- private double fChargeMaxDraw=100.;
-
- /*Components for user interaction*/
- private JDialog dialog;
- private JLabel label;
- private JFrame frame;
- private JPanel panel;
- String labelString;
- private JButton okButton,cancelButton;
- private int m_iteration=0;
- private int m_ret=0;
- static Object modalMonitor = new Object();
-
- public void setUseRawEnergy(boolean useRawEnergy) {
- this.useRawEnergy=useRawEnergy;
- }
-
- public void setEnergyCut(double energyCut) {
- this.energyCut=energyCut;
- }
- public void setSkipInitial(double skipInitial) {
- this.skipInitial=skipInitial;
- }
- public void setSkipMin(double skipMin) {
- this.skipMin=skipMin;
- }
-
- public void setEvnMinDraw(double evnMinDraw){
- this.fEvnMinDraw=evnMinDraw;
- }
- public void setEvnMaxDraw(double evnMaxDraw){
- this.fEvnMaxDraw=evnMaxDraw;
- }
- public void setChargeMinDraw(double chargeMinDraw){
- this.fChargeMinDraw=chargeMinDraw;
- }
- public void setChargeMaxDraw(double chargeMaxDraw){
- this.fChargeMaxDraw=chargeMaxDraw;
- }
-
- public void setNEventsMin(int nEeventsMin){
- this.nEventsMin=nEventsMin;
- }
-
- public void setIsMonitoringApp(boolean app){
- this.isMonitoringApp=app;
- }
-
- public void setDoFullAnalysis(boolean fullAnalysis){
- this.doFullAnalysis=fullAnalysis;
- }
-
- @Override
- protected void detectorChanged(Detector detector) {
- System.out.println("LedAnalysis::Detector changed was called");
- System.out.println(fEvnMinDraw+" "+fEvnMaxDraw);
- for (int ii=0;ii<nDrivers;ii++){
- iStep[ii]=-1;
- }
-
- // Setup conditions
-
- conditionsManager = DatabaseConditionsManager.getInstance();
-
- LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: led id
- LedBotMap = new HashMap< Integer , Integer >();
-
- LedTopMapInverted = new HashMap< Integer , Integer >(); //key: led id. Value: ecal channel id
- LedBotMapInverted = new HashMap< Integer , Integer >();
-
-
- ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData();
- LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData();
- ecalConditions = conditionsManager.getEcalConditions();
-
- for (EcalChannel channel : ChannelCollection){
- chid = channel.getChannelId();
- for (EcalLed Led : LedCollection) {
- if (Led.getEcalChannelId()==chid){
- if (channel.getY()>0){
- LedTopMap.put( chid , Led.getLedNumber() );
- LedTopMapInverted.put( Led.getLedNumber(), chid );
- }
- else if (channel.getY()<0){
- LedBotMap.put( chid , Led.getLedNumber() );
- LedBotMapInverted.put( Led.getLedNumber(), chid );
- }
- }
- }
- }
-
-
-
- // Setup plots
- aida = AIDA.defaultInstance();
- aida.tree().cd("/");
- hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5);
-
- factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence");
- pPlotter= factory.create("Drivers");
- pPlotter.createRegions(4,2);
- if (isMonitoringApp){
- pPlotter2=factory.create("Sequence Map");
- pPlotter2.createRegions(1,1);
- pPlotter2.region(0).plot(hMeanCharge2D);
- }
- iTuple = new ArrayList<ITuple>(NUM_CHANNELS);
- hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS);
- hChargeVsEvn = new ArrayList<IHistogram2D>(nDrivers);
-
-
-
- //pPlotter2.region(0).plot(hMeanCharge2D);
-
- for (int ii=0;ii<NUM_CHANNELS;ii++){
- int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
- int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
- iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.",""));
- }
-
- for (int ii=0;ii<nDrivers;ii++){
- hChargeVsEvn.add(aida.histogram2D("Driver"+ii,100,fEvnMinDraw,fEvnMaxDraw,100,fChargeMinDraw,fChargeMaxDraw));
- pPlotter.region(ii).plot( hChargeVsEvn.get(ii));
- }
-
- pPlotter.show();
- if (isMonitoringApp) pPlotter2.show();
-
- }
-
- @Override
- public void process(EventHeader event) {
- runNumber = event.getRunNumber();
- eventN++;
- if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
- //List<BaseRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw);
- List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
- for (CalorimeterHit hit : hits) {
-
- column = hit.getIdentifierFieldValue("ix");
- row = hit.getIdentifierFieldValue("iy");
- id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column);
- cellID=hit.getCellID();
- chid = ChannelCollection.findGeometric(cellID).getChannelId();
-
- energy = hit.getCorrectedEnergy();
- if (useRawEnergy){
- fillEnergy = getRawADCSum(energy,cellID);
- }
- else {
- fillEnergy = energy;
- }
- fillTime = hit.getTime();
-
-
- //find the LED
- if (row>0){
- ledid=LedTopMap.get(chid);
- }
- else if (row<0){
- ledid=LedBotMap.get(chid);
- }
- driverid=getDriver(ledid);
- if (row<0) driverid+=4;
-
-
-
- /*Skip the events under thr*/
- if (energy<energyCut) continue;
-
- /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/
- if (iStep[driverid]<(nSteps-1)){
- if (ledid==LEDStep[driverid][iStep[driverid]+1]){
- iStep[driverid]++;
- System.out.println("LedAnalysis:: increment step ("+iStep[driverid]+") for driver "+driverid+" . Led ID: "+ledid+" Column: "+column+" Row: "+row);
- if (iStep[driverid]>0) drawProfiles(LEDStep[driverid][iStep[driverid]-1],driverid);
- }
- }
-
-
- if (iStep[driverid]==-1) continue;
-
- /*Put this code here, since we want to always fill the ntuple*/
- iTuple.get(id).fill(0,nEvents[id]);
- iTuple.get(id).fill(1,fillEnergy);
- iTuple.get(id).fill(2,fillTime);
- iTuple.get(id).addRow();
- nEvents[id]++;
-
- /*Case 1: this led is the one in the corresponding step*/;
- if (ledid==LEDStep[driverid][iStep[driverid]]){
-
- }
- else{ /*Case 2: this led is not one in the corresponding step (but maybe is the neighborhood??Ctalk??)*/;
-
- }
-
- /*Add a debug print */
- if (eventN % 10000==0){
- System.out.println("Debug. LED ID: "+ledid+" DRIVER ID: "+driverid+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id);
- }
- }
- if (eventN % 10000==0){
- System.out.println("\n");
- }
- }
- }
-
- /*
- * The endOfData() method analises each ntuple to find the LED response.
- * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on:
- * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the
- * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a
- * plateau, that corresponds to the value at thermal equilibrium.
- *
- * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau.
- * To handle these, I always cut the first 10% events
- * To properly handle this:
- *
- * 1) First create a profile histogram, charge VS event number.
- * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage
- * 3) Cut the events with event_number < 5*N0.
- * 4) Fit the remaining events with a gaussian.
- */
- @Override
- public void endOfData() {
- System.out.println("LedAnalysis::end of data");
- System.out.println("LedAnalysis:: nEventsMin is: "+nEventsMin);
-
- double e,eMin,eMax;
- double t;
- int n,nBins,nFits,nSkip;
-
- int row, column;
-
- String hName;
- IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree());
-
- IFitResult fResult;
- IFitter fFitter;
-
- for (int id = 0; id < 11 * 47; id++) {
-
- eMin=9999;
- eMax=-9999;
- row = EcalMonitoringUtilities.getRowFromHistoID(id);
- column = EcalMonitoringUtilities.getColumnFromHistoID(id);
- System.out.println("");
- System.out.println("Doing channel: X= "+column+" Y= "+row);
- System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows());
- System.out.println("Number of recognized events: "+nEvents[id]);
- /*Create the profile. Create it for all the channels, to keep sync.*/
- nBins=nEvents[id]/100;
- if (nBins<=0) nBins=1;
-
- /*Clear previous*/
-
- if (id>0){
- aida.tree().rm("strip");
- aida.tree().rm("fun0");
- aida.tree().rm("fun1");
- }
- /*Create the profile.*/
- cProfile=aida.profile1D("strip",nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5);
- cProfile.reset();
- /*Create the function for the profile fit and the gaus fit*/
- fFunction=fFactory.createFunctionFromScript("fun0",1,"A*exp(-x[0]/tau)+B","A,tau,B","",null);
- fFunction1=fFactory.createFunctionByName("fun1","G");
-
- if (EcalMonitoringUtilities.isInHole(row,column)==true){
- System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip");
- hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
- System.out.println("In hole, skip");
- continue;
- }
- else if (nEvents[id]<nEventsMin) {
- hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
- System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin);
-
- continue;
- }
-
- //Fill the profile*/
- nSkip=(int)(nEvents[id]*skipInitial);
- if (nSkip>iTuple.get(id).rows()){
- System.out.println("Can't skip initial events?");
- nSkip=0;
- }
- iTuple.get(id).start();
- iTuple.get(id).skip(nSkip); //This is the work-around for those channels with charge starting from 0 and rapidly growing//
- n=0;
- iTuple.get(id).next();
- while ( iTuple.get(id).next() ){
- e=iTuple.get(id).getDouble(1);
- if (e<eMin) eMin=e;
- if (e>eMax) eMax=e;
- cProfile.fill(1.*n,e);
- n++;
- }
- fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v");
-
- if (doFullAnalysis){
- //Init function parameters
- double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin};
- if (initialPars[0]<0) initialPars[0]=0;
- fFunction.setParameters(initialPars);
-
- //Do the fit
- System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName());
- System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]);
- fResult=fFitter.fit(cProfile,fFunction);
- fPars = fResult.fittedParameters();
- fParErrs = fResult.errors();
- fParNames = fResult.fittedParameterNames();
- System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
- for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
- System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
- }
- fFunction.setParameters(fPars);
-
-
- //Do again the fit: it is a terrible work-around
- nFits=0;
- if (Double.isNaN(fParErrs[1])){
- fPars=fPrevPars;
- }
- while (Double.isNaN(fParErrs[1])){
- System.out.println("LedAnalysis:: redo fit");
- fFunction.setParameters(fPars);
- fResult=fFitter.fit(cProfile,fFunction);
- fPars = fResult.fittedParameters();
- fParErrs = fResult.errors();
- System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
- for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
- System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
- }
- fFunction.setParameters(fPars);
- nFits++;
- if (nFits>=10){
- System.out.println("LedAnalysis:: Error, too many fits without convergence");
- break;
- }
- }
- fPrevPars=Arrays.copyOf(fPars,fPars.length);
- System.out.println("LedAnalysis:: fit "+id+" done");
-
- //Now we have the tau parameter. Take ONLY the events that are with N>5*tau/
- //As a cross-check, also verify that tau > Nevents/10, otherwise skip the first Nevents/2
- //and emit warning
- nSkip=(int)( fPars[1]*5);
- if (nSkip < (nEvents[id]*skipMin)){
- System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2);
- nSkip=(int)(nEvents[id]*skipMin);
- }
- if (nSkip > nEvents[id]){
- System.out.println("LedAnalysis:: Skip number too high, reduce it");
- nSkip=(int)(nEvents[id]*skipMin);
- }
-
- }
- else{
- nSkip=(int)(nEvents[id]*(skipMin+skipInitial));
- }
-
- System.out.println("LedAnalysis:: gaus fit :: Going to skip "+nSkip+" out of "+nEvents[id]);
- System.out.println("eMin is: "+eMin+" eMax is: "+eMax);
- hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1));
-
-
- iTuple.get(id).start();
- iTuple.get(id).skip(nSkip);
- n=0;
- while (iTuple.get(id).next()){
- e=iTuple.get(id).getDouble(1);
- t=iTuple.get(id).getDouble(2);
- hCharge.get(id).fill(e);
- n++;
- }
-
- /*Finally do the fit with the gaussian*/
- double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()};
-
- System.out.println("LedAnalysis:: Gaus fit");
- System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]);
-
- fFunction1.setParameters(initialPars1);
- fResult=fFitter.fit(hCharge.get(id),fFunction1);
- fPars = fResult.fittedParameters();
- fParErrs = fResult.errors();
- fParNames = fResult.fittedParameterNames();
- System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
- for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
- System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
- }
- fFunction1.setParameters(fPars);
- mMean[id]=fPars[1];
- mRMS[id]=fPars[2];
-
- hMeanCharge2D.fill(column,row,mMean[id]);
- System.out.println("\n");
- }//End loop on channels
-
-
-
- if ((pPlotter2!=null)&&(isMonitoringApp)){
- style = pPlotter2.region(0).style();
- style.setParameter("hist2DStyle", "colorMap");
- style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
- style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
- pPlotter2.region(0).plot(hMeanCharge2D);
- pPlotter2.region(0).refresh();
- }
- else{
- IPlotterStyle pstyle = aida.analysisFactory().createPlotterFactory().createPlotterStyle();
- pPlotter2 = null;
- pPlotter2 = aida.analysisFactory().createPlotterFactory().create();
- pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
- pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
- pstyle.setParameter("hist2DStyle", "colorMap");
- if (pPlotter2!=null){
- pPlotter2.createRegion().plot(hMeanCharge2D,pstyle);
- pPlotter2.show();
- }
- }
-
-
- askUploadToDBDialog();
- synchronized (modalMonitor) {
- try{
- modalMonitor.wait(120000); //wait 2 minutes for user interaction.
- }
- catch(InterruptedException excp){
- System.out.println("Got exception: "+excp);
- }
- }
- if (m_ret==1){
- System.out.println("OK, upload to DB");
- try {
- uploadToDB();
- } catch (SQLException | DatabaseObjectException | ConditionsObjectException error) {
- throw new RuntimeException("Error uploading to the database.", error);
- }
- if (isMonitoringApp){
- System.out.println("Save an Elog too");
- uploadToElog();
- }
- }
-
- /*Write a file with the LED values*/
- try {
- if (useRawEnergy){
- outFileName=runNumber+".raw.txt";
- }
- else{
- outFileName=runNumber+".energy.txt";
- }
- PrintWriter writer = new PrintWriter(outFileName, "UTF-8");
-
-
- for (int id = 0; id < 11 * 47; id++) {
-
- row = EcalMonitoringUtilities.getRowFromHistoID(id);
- column = EcalMonitoringUtilities.getColumnFromHistoID(id);
- if (EcalMonitoringUtilities.isInHole(row, column)) continue;
- if ((row == 0) || (column == 0)) continue;
-
- writer.print(column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n");
-
- }
- writer.close();
-
- }
- catch (FileNotFoundException fnfe) {
-
- System.out.println(fnfe.getMessage());
-
- }
-
- catch (IOException ioe) {
-
- System.out.println(ioe.getMessage());
-
- }
-
-
- System.out.println("EcalLedSequenceMonitor endOfData clear histograms");
- for(int ii = 0; ii < NUM_CHANNELS; ii++) {
- row=EcalMonitoringUtilities.getRowFromHistoID(ii);
- column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
- hName="charge_"+ii;
- aida.tree().rm(hName);
- /*aida.tree().add(iTuple.get(ii));*/
- }
- System.out.println("EcalLedSequenceMonitor endOfData clear histograms done");
- System.out.println("endOfData end");
- System.out.println("The program is not stucked. It is writing the output AIDA file, this takes time!");
- }/*End endOfData*/
-
-
- /**
- * This function returns the driver number (from 0 to 3) given the LED id.
- * @param led
- * @return
- */
- public int getDriver(int led){
- int ret=-1;
- if ((led>=2)&&(led<56)) ret=0;
- else if ((led>=56)&&(led<112)) ret=1;
- else if ((led>=112)&&(led<168)) ret=2;
- else if ((led>=168)&&(led<224)) ret=3;
- return ret;
- }
-
- /**
- * Very simple method to retreive the pedestal-subtracted raw Energy.
- * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis
- * @param energy
- * @param cellID
- * @return
- */
- public double getRawADCSum(double energy,long cellID){
- EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID));
- double RawSum=energy / EcalUtils.GeV;
- double gain=channelData.getGain().getGain();
- double ret=RawSum/gain;
- // System.out.println("A:C "+RawSum+" "+ret);
- return ret;
- }
-
- private void uploadToDB() throws DatabaseObjectException, ConditionsObjectException, SQLException {
- int x,y,id;
- double mean,rms;
- System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....",
- runNumber,runNumberMax,dbTag));
-
- EcalLedCalibrationCollection led_calibrations = new EcalLedCalibrationCollection();
-
- TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName);
- led_calibrations.setTableMetaData(tableMetaData);
-
- for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/
- EcalChannel cc = findChannel(cid);
- x = cc.getX(); //This is the column
- y = cc.getY(); //This is the row
- id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x);
- mean=mMean[id];
- rms=mRMS[id];
- led_calibrations.add(new EcalLedCalibration(cid,mean,rms));
- }
-
- int collectionId = -1;
-
- try {
- collectionId = conditionsManager.getCollectionId(led_calibrations, "loaded by EcalLedSequenceMonitor");
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- System.err.println("CollectionID: "+collectionId);
- led_calibrations.insert();
- ConditionsRecord conditionsRecord = new ConditionsRecord(
- led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName,
- "Generated by LedAnalysis from Run #"+runNumber, dbTag);
- conditionsRecord.insert();
-
- System.out.println("Upload to DB done");
- }
-
- private void uploadToElog(){
- String path,exe,command,imgpath;
- path="/home/hpsrun/LedSequenceData";
- exe=path+"/doElog.csh";
- imgpath=path+"/screenshots/"+runNumber+".png";
-
- File f=new File(path);
- if (!f.exists()){
- System.err.println("LedMonitoringSequence:: wrong path");
- return;
- }
- if (pPlotter2==null){
- System.err.println("LedMonitoringSquence:: no plotter");
- return;
- }
- try{
- pPlotter2.writeToFile(imgpath);
- }
- catch(Exception e){
- System.err.println("Exception "+e);
- }
- File f1=new File(exe);
- if (!f1.exists()){
- System.err.println("LedMonitoringSequence:: no script!");
- return;
- }
- command=exe+" "+imgpath;
- try{
- System.out.println("LedMonitoringSequence:: try this command: "+command);
- Runtime.getRuntime().exec(command);
- }
- catch(Exception e){
- System.err.println("Exception "+e);
- }
- }
-
-
- private void drawProfiles(int ledID,int driverID){
-
- int m_column,m_row,m_ledID,m_chID,m_ID,m_driverID;
-
- m_ledID = ledID;
- m_driverID = driverID;
- m_chID = 0;
-
-
- if (m_driverID<=3) m_chID = LedTopMapInverted.get(ledID);
- else m_chID = LedBotMapInverted.get(ledID);
-
- m_column=findChannel(m_chID).getX();
- m_row=findChannel(m_chID).getY();
- m_ID=EcalMonitoringUtilities.getHistoIDFromRowColumn(m_row, m_column);
- /*
+ private static final int NUM_CHANNELS = 11 * 47;
+ private static final String dbTag = "led";
+ private static final String dbTableName = "ecal_led_calibrations";
+ private static final int runNumberMax = 9999;
+ private static final int nDrivers = 8;
+ private static final int nSteps = 56;
+
+ String inputCollectionRaw = "EcalReadoutHits";
+ String inputCollection = "EcalCalHits";
+ AIDA aida;
+
+ DatabaseConditionsManager conditionsManager;
+
+ private EcalChannelCollection ChannelCollection;
+ private EcalLedCollection LedCollection;
+ private EcalConditions ecalConditions;
+
+ Map < Integer,Integer > LedTopMap; //chid (conditions) --> LED id
+ Map < Integer,Integer > LedBotMap; //chid (conditions) --> LED id
+
+ Map < Integer,Integer > LedTopMapInverted; //LED id --> chid (conditions)
+ Map < Integer,Integer > LedBotMapInverted; //LED id --> chid (conditions)
+
+ private boolean useRawEnergy=false;
+
+ String outFileName;
+
+
+ private int runNumber = 0;
+ private int eventN = 0;
+ private int id,row,column,chid,ledid,driverid;
+ private int[][] LEDStep = new int[][]{
+ //first 4 are the flasher1 sequence, TOP controller
+ {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},
+ {56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111},
+ {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,-1}, //missing 135 is ok
+ {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
+ //second 4 are the flasher2 sequence, BOTTOM controller
+ {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1},
+ {56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, //missing 69 is OK
+ {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167},
+ {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},
+ };
+
+ private int[] iStep = new int[nDrivers];
+ private int[] nEvents = new int[NUM_CHANNELS];
+ private double[] mMean = new double[NUM_CHANNELS];
+ private double[] mRMS = new double[NUM_CHANNELS];
+
+ private int nEventsMin=200;
+ private int nMinChannelsWithEvents=350;
+ private double energy,fillEnergy,fillTime;
+ private double energyCut=2; //we expect very high energy from the LEDs..
+ private double skipInitial=0.05;
+ private double skipMin=0.3;
+ private long cellID;
+
+
+
+
+ //Histograms-functions-ntuples
+ private ArrayList<ITuple> iTuple;
+
+ private IFunction fFunction,fFunction1;
+ private IProfile1D cProfile;
+ private IHistogram2D hMeanCharge2D;
+ private ArrayList<IHistogram1D> hCharge;
+ private ArrayList<IHistogram2D> hChargeVsEvn;
+ private IPlotterFactory factory;
+ private IPlotter pPlotter=null;
+ private IPlotter pPlotter2=null;
+ private IPlotterStyle style ;
+ private int[] fitStatus = new int[NUM_CHANNELS];
+
+ private boolean doFullAnalysis=false;
+ private boolean isMonitoringApp=false;
+ private boolean saveTuple=false;
+
+ private double[] fPars;
+ private double[] fPrevPars;
+ private double[] fParErrs;
+ private String[] fParNames;
+
+
+ private double fEvnMinDraw=0.;
+ private double fEvnMaxDraw=80000.;
+ private double fChargeMinDraw=0.;
+ private double fChargeMaxDraw=100.;
+
+ /*Components for user interaction*/
+ private JDialog dialog;
+ private JLabel label;
+ private JFrame frame;
+ private JPanel panel;
+ String labelString;
+ private JButton okButton,cancelButton;
+ private int m_iteration=0;
+ private int m_ret=0;
+ static Object modalMonitor = new Object();
+
+ public void setUseRawEnergy(boolean useRawEnergy) {
+ this.useRawEnergy=useRawEnergy;
+ }
+
+ public void setEnergyCut(double energyCut) {
+ this.energyCut=energyCut;
+ }
+ public void setSkipInitial(double skipInitial) {
+ this.skipInitial=skipInitial;
+ }
+ public void setSkipMin(double skipMin) {
+ this.skipMin=skipMin;
+ }
+
+ public void setEvnMinDraw(double evnMinDraw){
+ this.fEvnMinDraw=evnMinDraw;
+ }
+ public void setEvnMaxDraw(double evnMaxDraw){
+ this.fEvnMaxDraw=evnMaxDraw;
+ }
+ public void setChargeMinDraw(double chargeMinDraw){
+ this.fChargeMinDraw=chargeMinDraw;
+ }
+ public void setChargeMaxDraw(double chargeMaxDraw){
+ this.fChargeMaxDraw=chargeMaxDraw;
+ }
+
+ public void setNEventsMin(int nEeventsMin){
+ this.nEventsMin=nEventsMin;
+ }
+
+ public void setIsMonitoringApp(boolean app){
+ this.isMonitoringApp=app;
+ }
+
+ public void setDoFullAnalysis(boolean fullAnalysis){
+ this.doFullAnalysis=fullAnalysis;
+ }
+
+ public void setSaveTuple(boolean flag){
+ this.saveTuple=flag;
+ }
+
+ @Override
+ protected void detectorChanged(Detector detector) {
+ System.out.println("LedAnalysis::Detector changed was called");
+ System.out.println(fEvnMinDraw+" "+fEvnMaxDraw);
+ for (int ii=0;ii<nDrivers;ii++){
+ iStep[ii]=-1;
+ }
+
+ // Setup conditions
+
+ conditionsManager = DatabaseConditionsManager.getInstance();
+
+ LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: led id
+ LedBotMap = new HashMap< Integer , Integer >();
+
+ LedTopMapInverted = new HashMap< Integer , Integer >(); //key: led id. Value: ecal channel id
+ LedBotMapInverted = new HashMap< Integer , Integer >();
+
+
+ ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData();
+ LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData();
+ ecalConditions = conditionsManager.getEcalConditions();
+
+ for (EcalChannel channel : ChannelCollection){
+ chid = channel.getChannelId();
+ for (EcalLed Led : LedCollection) {
+ if (Led.getEcalChannelId()==chid){
+ if (channel.getY()>0){
+ LedTopMap.put( chid , Led.getLedNumber() );
+ LedTopMapInverted.put( Led.getLedNumber(), chid );
+ }
+ else if (channel.getY()<0){
+ LedBotMap.put( chid , Led.getLedNumber() );
+ LedBotMapInverted.put( Led.getLedNumber(), chid );
+ }
+ }
+ }
+ }
+
+
+
+ // Setup plots
+ aida = AIDA.defaultInstance();
+ aida.tree().cd("/");
+ hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5);
+
+ factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence");
+ pPlotter= factory.create("Drivers");
+ pPlotter.createRegions(4,2);
+ if (isMonitoringApp){
+ pPlotter2=factory.create("Sequence Map");
+ pPlotter2.createRegions(1,1);
+ pPlotter2.region(0).plot(hMeanCharge2D);
+ }
+ iTuple = new ArrayList<ITuple>(NUM_CHANNELS);
+ hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS);
+ hChargeVsEvn = new ArrayList<IHistogram2D>(nDrivers);
+
+
+
+ //pPlotter2.region(0).plot(hMeanCharge2D);
+
+ for (int ii=0;ii<NUM_CHANNELS;ii++){
+ int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
+ int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
+ iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.",""));
+ }
+
+ for (int ii=0;ii<nDrivers;ii++){
+ hChargeVsEvn.add(aida.histogram2D("Driver"+ii,100,fEvnMinDraw,fEvnMaxDraw,100,fChargeMinDraw,fChargeMaxDraw));
+ pPlotter.region(ii).plot( hChargeVsEvn.get(ii));
+ }
+
+ pPlotter.show();
+ if (isMonitoringApp) pPlotter2.show();
+
+ }
+
+ @Override
+ public void process(EventHeader event) {
+ runNumber = event.getRunNumber();
+ eventN++;
+ if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
+ //List<BaseRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw);
+ List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
+ for (CalorimeterHit hit : hits) {
+
+ column = hit.getIdentifierFieldValue("ix");
+ row = hit.getIdentifierFieldValue("iy");
+ id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column);
+ cellID=hit.getCellID();
+ chid = ChannelCollection.findGeometric(cellID).getChannelId();
+
+ energy = hit.getCorrectedEnergy();
+ if (useRawEnergy){
+ fillEnergy = getRawADCSum(energy,cellID);
+ }
+ else {
+ fillEnergy = energy;
+ }
+ fillTime = hit.getTime();
+
+
+ //find the LED
+ if (row>0){
+ ledid=LedTopMap.get(chid);
+ }
+ else if (row<0){
+ ledid=LedBotMap.get(chid);
+ }
+ driverid=getDriver(ledid);
+ if (row<0) driverid+=4;
+
+
+
+ /*Skip the events under thr*/
+ if (energy<energyCut) continue;
+
+ /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/
+ if (iStep[driverid]<(nSteps-1)){
+ if (ledid==LEDStep[driverid][iStep[driverid]+1]){
+ iStep[driverid]++;
+ System.out.println("LedAnalysis:: increment step ("+iStep[driverid]+") for driver "+driverid+" . Led ID: "+ledid+" Column: "+column+" Row: "+row);
+ if (iStep[driverid]>0) drawProfiles(LEDStep[driverid][iStep[driverid]-1],driverid);
+ }
+ }
+
+
+ if (iStep[driverid]==-1) continue;
+
+ /*Put this code here, since we want to always fill the ntuple*/
+ iTuple.get(id).fill(0,nEvents[id]);
+ iTuple.get(id).fill(1,fillEnergy);
+ iTuple.get(id).fill(2,fillTime);
+ iTuple.get(id).addRow();
+ nEvents[id]++;
+
+ /*Case 1: this led is the one in the corresponding step*/;
+ if (ledid==LEDStep[driverid][iStep[driverid]]){
+
+ }
+ else{ /*Case 2: this led is not one in the corresponding step (but maybe is the neighborhood??Ctalk??)*/;
+
+ }
+
+ /*Add a debug print */
+ if (eventN % 10000==0){
+ System.out.println("Debug. LED ID: "+ledid+" DRIVER ID: "+driverid+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id);
+ }
+ }
+ if (eventN % 10000==0){
+ System.out.println("\n");
+ }
+ }
+ }
+
+ /*
+ * The endOfData() method analises each ntuple to find the LED response.
+ * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on:
+ * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the
+ * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a
+ * plateau, that corresponds to the value at thermal equilibrium.
+ *
+ * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau.
+ * To handle these, I always cut the first 10% events
+ * To properly handle this:
+ *
+ * 1) First create a profile histogram, charge VS event number.
+ * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage
+ * 3) Cut the events with event_number < 5*N0.
+ * 4) Fit the remaining events with a gaussian.
+ */
+ @Override
+ public void endOfData() {
+ System.out.println("LedAnalysis::end of data");
+ System.out.println("LedAnalysis:: nEventsMin is: "+nEventsMin);
+
+ double e,eMin,eMax;
+ double t;
+ int n,nBins,nFits,nSkip;
+
+ int row, column;
+
+ String hName;
+ IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree());
+
+ IFitResult fResult;
+ IFitter fFitter;
+
+ for (int id = 0; id < 11 * 47; id++) {
+
+ eMin=9999;
+ eMax=-9999;
+ row = EcalMonitoringUtilities.getRowFromHistoID(id);
+ column = EcalMonitoringUtilities.getColumnFromHistoID(id);
+ System.out.println("");
+ System.out.println("Doing channel: X= "+column+" Y= "+row);
+ System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows());
+ System.out.println("Number of recognized events: "+nEvents[id]);
+ /*Create the profile. Create it for all the channels, to keep sync.*/
+ nBins=nEvents[id]/100;
+ if (nBins<=0) nBins=1;
+
+ /*Clear previous*/
+
+ if (id>0){
+ aida.tree().rm("strip");
+ aida.tree().rm("fun0");
+ aida.tree().rm("fun1");
+ }
+ /*Create the profile.*/
+ cProfile=aida.profile1D("strip",nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5);
+ cProfile.reset();
+ /*Create the function for the profile fit and the gaus fit*/
+ fFunction=fFactory.createFunctionFromScript("fun0",1,"A*exp(-x[0]/tau)+B","A,tau,B","",null);
+ fFunction1=fFactory.createFunctionByName("fun1","G");
+
+ if (EcalMonitoringUtilities.isInHole(row,column)==true){
+ System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip");
+ hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
+ System.out.println("In hole, skip");
+ continue;
+ }
+ else if (nEvents[id]<nEventsMin) {
+ hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync
+ System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin);
+
+ continue;
+ }
+
+ //Fill the profile*/
+ nSkip=(int)(nEvents[id]*skipInitial);
+ if (nSkip>iTuple.get(id).rows()){
+ System.out.println("Can't skip initial events?");
+ nSkip=0;
+ }
+ iTuple.get(id).start();
+ iTuple.get(id).skip(nSkip); //This is the work-around for those channels with charge starting from 0 and rapidly growing//
+ n=0;
+ iTuple.get(id).next();
+ while ( iTuple.get(id).next() ){
+ e=iTuple.get(id).getDouble(1);
+ if (e<eMin) eMin=e;
+ if (e>eMax) eMax=e;
+ cProfile.fill(1.*n,e);
+ n++;
+ }
+ fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v");
+
+ if (doFullAnalysis){
+ //Init function parameters
+ double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin};
+ if (initialPars[0]<0) initialPars[0]=0;
+ fFunction.setParameters(initialPars);
+
+ //Do the fit
+ System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName());
+ System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]);
+ fResult=fFitter.fit(cProfile,fFunction);
+ fPars = fResult.fittedParameters();
+ fParErrs = fResult.errors();
+ fParNames = fResult.fittedParameterNames();
+ System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
+ for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
+ System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
+ }
+ fFunction.setParameters(fPars);
+
+
+ //Do again the fit: it is a terrible work-around
+ nFits=0;
+ if (Double.isNaN(fParErrs[1])){
+ fPars=fPrevPars;
+ }
+ while (Double.isNaN(fParErrs[1])){
+ System.out.println("LedAnalysis:: redo fit");
+ fFunction.setParameters(fPars);
+ fResult=fFitter.fit(cProfile,fFunction);
+ fPars = fResult.fittedParameters();
+ fParErrs = fResult.errors();
+ System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
+ for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
+ System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
+ }
+ fFunction.setParameters(fPars);
+ nFits++;
+ if (nFits>=10){
+ System.out.println("LedAnalysis:: Error, too many fits without convergence");
+ break;
+ }
+ }
+ fPrevPars=Arrays.copyOf(fPars,fPars.length);
+ System.out.println("LedAnalysis:: fit "+id+" done");
+
+ //Now we have the tau parameter. Take ONLY the events that are with N>5*tau/
+ //As a cross-check, also verify that tau > Nevents/10, otherwise skip the first Nevents/2
+ //and emit warning
+ nSkip=(int)( fPars[1]*5);
+ if (nSkip < (nEvents[id]*skipMin)){
+ System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2);
+ nSkip=(int)(nEvents[id]*skipMin);
+ }
+ if (nSkip > nEvents[id]){
+ System.out.println("LedAnalysis:: Skip number too high, reduce it");
+ nSkip=(int)(nEvents[id]*skipMin);
+ }
+
+ }
+ else{
+ nSkip=(int)(nEvents[id]*(skipMin+skipInitial));
+ }
+
+ System.out.println("LedAnalysis:: gaus fit :: Going to skip "+nSkip+" out of "+nEvents[id]);
+ System.out.println("eMin is: "+eMin+" eMax is: "+eMax);
+ hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1));
+
+
+ iTuple.get(id).start();
+ iTuple.get(id).skip(nSkip);
+ n=0;
+ while (iTuple.get(id).next()){
+ e=iTuple.get(id).getDouble(1);
+ t=iTuple.get(id).getDouble(2);
+ hCharge.get(id).fill(e);
+ n++;
+ }
+
+ /*Finally do the fit with the gaussian*/
+ double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()};
+
+ System.out.println("LedAnalysis:: Gaus fit");
+ System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]);
+
+ fFunction1.setParameters(initialPars1);
+ fResult=fFitter.fit(hCharge.get(id),fFunction1);
+ fPars = fResult.fittedParameters();
+ fParErrs = fResult.errors();
+ fParNames = fResult.fittedParameterNames();
+ System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf());
+ for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){
+ System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]);
+ }
+ fFunction1.setParameters(fPars);
+ mMean[id]=fPars[1];
+ mRMS[id]=fPars[2];
+
+ hMeanCharge2D.fill(column,row,mMean[id]);
+ System.out.println("\n");
+ }//End loop on channels
+
+
+
+ if ((pPlotter2!=null)&&(isMonitoringApp)){
+ style = pPlotter2.region(0).style();
+ style.setParameter("hist2DStyle", "colorMap");
+ style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
+ pPlotter2.region(0).plot(hMeanCharge2D);
+ pPlotter2.region(0).refresh();
+ }
+ else{
+ IPlotterStyle pstyle = aida.analysisFactory().createPlotterFactory().createPlotterStyle();
+ pPlotter2 = null;
+ pPlotter2 = aida.analysisFactory().createPlotterFactory().create();
+ pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString());
+ pstyle.setParameter("hist2DStyle", "colorMap");
+ if (pPlotter2!=null){
+ pPlotter2.createRegion().plot(hMeanCharge2D,pstyle);
+ pPlotter2.show();
+ }
+ }
+
+
+ askUploadToDBDialog();
+ synchronized (modalMonitor) {
+ try{
+ modalMonitor.wait(120000); //wait 2 minutes for user interaction.
+ }
+ catch(InterruptedException excp){
+ System.out.println("Got exception: "+excp);
+ }
+ }
+ if (m_ret==1){
+ System.out.println("OK, upload to DB");
+ try {
+ uploadToDB();
+ } catch (SQLException | DatabaseObjectException | ConditionsObjectException error) {
+ throw new RuntimeException("Error uploading to the database.", error);
+ }
+ if (isMonitoringApp){
+ System.out.println("Save an Elog too");
+ uploadToElog();
+ }
+ }
+
+ /*Write a file with the LED values*/
+ try {
+ if (useRawEnergy){
+ outFileName=runNumber+".raw.txt";
+ }
+ else{
+ outFileName=runNumber+".energy.txt";
+ }
+ PrintWriter writer = new PrintWriter(outFileName, "UTF-8");
+
+
+ for (int id = 0; id < 11 * 47; id++) {
+
+ row = EcalMonitoringUtilities.getRowFromHistoID(id);
+ column = EcalMonitoringUtilities.getColumnFromHistoID(id);
+ if (EcalMonitoringUtilities.isInHole(row, column)) continue;
+ if ((row == 0) || (column == 0)) continue;
+
+ writer.print(column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n");
+
+ }
+ writer.close();
+
+ }
+ catch (FileNotFoundException fnfe) {
+
+ System.out.println(fnfe.getMessage());
+
+ }
+
+ catch (IOException ioe) {
+
+ System.out.println(ioe.getMessage());
+
+ }
+
+
+ System.out.println("EcalLedSequenceMonitor endOfData clear histograms");
+ for(int ii = 0; ii < NUM_CHANNELS; ii++) {
+ row=EcalMonitoringUtilities.getRowFromHistoID(ii);
+ column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
+ hName="charge_"+ii;
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException ee){
+ System.out.println("Got exception "+ee);
+ }
+
+ if (!saveTuple||(isMonitoringApp)){
+ hName="nTuple"+ii;
+ try{
+ aida.tree().rm(hName);
+ }
+ catch(IllegalArgumentException ee){
+ System.out.println("Got exception "+ee);
+ }
+ }
+
+ }
+ System.out.println("EcalLedSequenceMonitor endOfData clear histograms done");
+ System.out.println("endOfData end");
+ System.out.println("The program is not stucked. It is writing the output AIDA file, this takes time!");
+ }/*End endOfData*/
+
+
+ /**
+ * This function returns the driver number (from 0 to 3) given the LED id.
+ * @param led
+ * @return
+ */
+ public int getDriver(int led){
+ int ret=-1;
+ if ((led>=2)&&(led<56)) ret=0;
+ else if ((led>=56)&&(led<112)) ret=1;
+ else if ((led>=112)&&(led<168)) ret=2;
+ else if ((led>=168)&&(led<224)) ret=3;
+ return ret;
+ }
+
+ /**
+ * Very simple method to retreive the pedestal-subtracted raw Energy.
+ * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis
+ * @param energy
+ * @param cellID
+ * @return
+ */
+ public double getRawADCSum(double energy,long cellID){
+ EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID));
+ double RawSum=energy / EcalUtils.GeV;
+ double gain=channelData.getGain().getGain();
+ double ret=RawSum/gain;
+ // System.out.println("A:C "+RawSum+" "+ret);
+ return ret;
+ }
+
+ private void uploadToDB() throws DatabaseObjectException, ConditionsObjectException, SQLException {
+ int x,y,id;
+ double mean,rms;
+ System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....",
+ runNumber,runNumberMax,dbTag));
+
+ EcalLedCalibrationCollection led_calibrations = new EcalLedCalibrationCollection();
+
+ TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName);
+ led_calibrations.setTableMetaData(tableMetaData);
+
+ for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/
+ EcalChannel cc = findChannel(cid);
+ x = cc.getX(); //This is the column
+ y = cc.getY(); //This is the row
+ id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x);
+ mean=mMean[id];
+ rms=mRMS[id];
+ led_calibrations.add(new EcalLedCalibration(cid,mean,rms));
+ }
+
+ int collectionId = -1;
+
+ try {
+ collectionId = conditionsManager.getCollectionId(led_calibrations, "loaded by EcalLedSequenceMonitor");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ System.err.println("CollectionID: "+collectionId);
+ led_calibrations.insert();
+ ConditionsRecord conditionsRecord = new ConditionsRecord(
+ led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName,
+ "Generated by LedAnalysis from Run #"+runNumber, dbTag);
+ conditionsRecord.insert();
+
+ System.out.println("Upload to DB done");
+ }
+
+ private void uploadToElog(){
+ String path,exe,command,imgpath;
+ path="/home/hpsrun/LedSequenceData";
+ exe=path+"/doElog.csh";
+ imgpath=path+"/screenshots/"+runNumber+".png";
+
+ File f=new File(path);
+ if (!f.exists()){
+ System.err.println("LedMonitoringSequence:: wrong path");
+ return;
+ }
+ if (pPlotter2==null){
+ System.err.println("LedMonitoringSquence:: no plotter");
+ return;
+ }
+ try{
+ pPlotter2.writeToFile(imgpath);
+ }
+ catch(Exception e){
+ System.err.println("Exception "+e);
+ }
+ File f1=new File(exe);
+ if (!f1.exists()){
+ System.err.println("LedMonitoringSequence:: no script!");
+ return;
+ }
+ command=exe+" "+imgpath;
+ try{
+ System.out.println("LedMonitoringSequence:: try this command: "+command);
+ Runtime.getRuntime().exec(command);
+ }
+ catch(Exception e){
+ System.err.println("Exception "+e);
+ }
+ }
+
+
+ private void drawProfiles(int ledID,int driverID){
+
+ int m_column,m_row,m_ledID,m_chID,m_ID,m_driverID;
+
+ m_ledID = ledID;
+ m_driverID = driverID;
+ m_chID = 0;
+
+
+ if (m_driverID<=3) m_chID = LedTopMapInverted.get(ledID);
+ else m_chID = LedBotMapInverted.get(ledID);
+
+ m_column=findChannel(m_chID).getX();
+ m_row=findChannel(m_chID).getY();
+ m_ID=EcalMonitoringUtilities.getHistoIDFromRowColumn(m_row, m_column);
+ /*
System.out.println("Going to draw LED id "+m_ledID+" X= "+m_column+" Y= "+m_row+" driver: "+m_driverID);
System.out.println("Ch_ID: "+m_chID);
System.out.println("Histo ID:"+m_ID);
System.out.println("Events: "+iTuple.get(m_ID).rows());
- */
- hChargeVsEvn.get(m_driverID).reset();
- hChargeVsEvn.get(m_driverID).setTitle("Driver_"+m_driverID+" Led_"+ledID);
- IEvaluator evaluatorX = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fEvn");
- IEvaluator evaluatorY = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fCharge");
-
- iTuple.get(m_ID).project(hChargeVsEvn.get(m_driverID),evaluatorX,evaluatorY);
-
- pPlotter.region(m_driverID).clear();
- pPlotter.region(m_driverID).plot(hChargeVsEvn.get(m_driverID));
- pPlotter.region(m_driverID).refresh();
-
- }
-
- private EcalChannel findChannel(int channel_id) {
- return ecalConditions.getChannelCollection().findChannel(channel_id);
- }
-
-
- private void askUploadToDBDialog(){
- m_ret=0;
-
- okButton = new JButton("OK");
- cancelButton = new JButton("Cancel");
- labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? <br> "
- + "Use the monitoring app to look at the map<br>"
- + "(Tab LED sequence)<br"
- +"Reply in 60 seconds<br>"+"</html>";
- label = new JLabel( labelString);
-
- frame = new JFrame("Upload to DB?");
- frame.setSize(500,250);
- panel = new JPanel();
- frame.add(panel);
-
-
- // dialog = new JDialog((JFrame)null, "User selection");
- // dialog.setSize(200,200);
- // dialog.setLayout(new FlowLayout());
- // dialog.add(label);
- // dialog.add(cancelButton);
- // dialog.add(okButton);
- // dialog.setVisible(true);
- //dialog.pack();
- panel.add(label);
- panel.add(cancelButton);
- panel.add(okButton);
-
- frame.setVisible(true);
- okButton.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent event)
- {
- m_ret=1;
- frame.dispose();
- synchronized(modalMonitor)
- {
- System.out.println("Ok pressed");
- modalMonitor.notify();
- }
- }
- }
- );
-
- cancelButton.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent event)
- {
- m_ret=0;
- frame.dispose();
- synchronized(modalMonitor)
- {
- System.out.println("Cancel pressed");
- modalMonitor.notify();
- }
- }
- }
- );
-
- System.out.println("askUploadDB done");
- }
+ */
+ hChargeVsEvn.get(m_driverID).reset();
+ hChargeVsEvn.get(m_driverID).setTitle("Driver_"+m_driverID+" Led_"+ledID);
+ IEvaluator evaluatorX = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fEvn");
+ IEvaluator evaluatorY = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fCharge");
+
+ iTuple.get(m_ID).project(hChargeVsEvn.get(m_driverID),evaluatorX,evaluatorY);
+
+ pPlotter.region(m_driverID).clear();
+ pPlotter.region(m_driverID).plot(hChargeVsEvn.get(m_driverID));
+ pPlotter.region(m_driverID).refresh();
+
+ }
+
+ private EcalChannel findChannel(int channel_id) {
+ return ecalConditions.getChannelCollection().findChannel(channel_id);
+ }
+
+
+ private void askUploadToDBDialog(){
+ m_ret=0;
+
+ okButton = new JButton("OK");
+ cancelButton = new JButton("Cancel");
+ labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? <br> "
+ + "Use the monitoring app to look at the map<br>"
+ + "(Tab LED sequence)<br"
+ +"Reply in 60 seconds<br>"+"</html>";
+ label = new JLabel( labelString);
+
+ frame = new JFrame("Upload to DB?");
+ frame.setSize(500,250);
+ panel = new JPanel();
+ frame.add(panel);
+
+
+ // dialog = new JDialog((JFrame)null, "User selection");
+ // dialog.setSize(200,200);
+ // dialog.setLayout(new FlowLayout());
+ // dialog.add(label);
+ // dialog.add(cancelButton);
+ // dialog.add(okButton);
+ // dialog.setVisible(true);
+ //dialog.pack();
+ panel.add(label);
+ panel.add(cancelButton);
+ panel.add(okButton);
+
+ frame.setVisible(true);
+ okButton.addActionListener(new ActionListener(){
+ public void actionPerformed(ActionEvent event)
+ {
+ m_ret=1;
+ frame.dispose();
+ synchronized(modalMonitor)
+ {
+ System.out.println("Ok pressed");
+ modalMonitor.notify();
+ }
+ }
+ }
+ );
+
+ cancelButton.addActionListener(new ActionListener(){
+ public void actionPerformed(ActionEvent event)
+ {
+ m_ret=0;
+ frame.dispose();
+ synchronized(modalMonitor)
+ {
+ System.out.println("Cancel pressed");
+ modalMonitor.notify();
+ }
+ }
+ }
+ );
+
+ System.out.println("askUploadDB done");
+ }
}
Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java
=============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java (original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java Tue Oct 27 11:33:16 2015
@@ -111,7 +111,7 @@
public static Boolean isInHole(final int row, final int column) {
if (row == 1 || row == -1) {
- if ((column <= XHOLESTART + XHOLEWIDTH) && (column >= XHOLESTART)) {
+ if ((column < XHOLESTART + XHOLEWIDTH) && (column >= XHOLESTART)) {
return true;
}
}
|