Author: [log in to unmask] Date: Wed Mar 11 19:57:01 2015 New Revision: 2413 Log: EcalEventDisplay: now aida does not save all histograms at the end. Also work on the led sequence monitor (almost there) 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 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 Wed Mar 11 19:57:01 2015 @@ -44,194 +44,195 @@ * @author Andrea Celentano */ public class EcalEventDisplay 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)"; - - /** - * 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) { - // 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(detector.getDetectorName() + " : " - + inputCollection + " : Hit Energy : " + column + " " + row - + ": " + ii, 100, -0.2, maxEch)); - channelTimePlot.add(aida.histogram1D(detector.getDetectorName() + " : " - + inputCollection + " : Hit Time : " + column + " " + row + ": " - + ii, 100, 0, 400)); - channelTimeVsEnergyPlot.add(aida.histogram2D(detector.getDetectorName() - + " : " + inputCollection + " : Hit Time Vs Energy : " + column - + " " + row + ": " + ii, 100, 0, 400, 100, -0.2, maxEch)); - //channelRawWaveform.add(aida.histogram1D(detector.getDetectorName() + " : " - // + inputCollection + " : Hit Energy : " + column + " " + row + ": " + ii)); - clusterEnergyPlot.add(aida.histogram1D(detector.getDetectorName() + " : " - + 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 cluster - // energy for each channel. - pstyle.xAxisStyle().setLabel(CLUSTER_ENERGY_TITLE); - pstyle.yAxisStyle().setLabel(NO_TITLE); - plotter.region(3).plot(clusterEnergyPlot.get(0), pstyle); - - /** + // 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 String detectorName; + //private static final String SIGNAL_AMPLITUDE_TITLE = "Signal Amplitude (mV)"; + + /** + * 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) { + // Reset the AIDA tree directory. + aida.tree().cd("/"); + detectorName=detector.getName(); + // 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(detector.getDetectorName() + " : " + // + 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 cluster + // energy for each channel. + pstyle.xAxisStyle().setLabel(CLUSTER_ENERGY_TITLE); + pstyle.yAxisStyle().setLabel(NO_TITLE); + plotter.region(3).plot(clusterEnergyPlot.get(0), pstyle); + + /** // Define the fourth plot region; this encompasses the raw // wave form plots. pstyle.xAxisStyle().setLabel(RAW_WAVEFORM_TITLE); @@ -240,160 +241,205 @@ 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(); - } - - @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); } - } - } - - /** + **/ + + // 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. + * Also removes histograms from aida tree. We do not want them in the output aida file, if any.. + */ + @Override + public void endOfData() { + viewer.setVisible(false); + viewer.dispose(); + + int row,column; + String hName; + System.out.println("EcalEventDisplay endOfData clear histograms"); + 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. + 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); + + + if (isFirstRaw[ii]==false){ + hName=detectorName+ + " : " + inputCollectionRaw + " : Raw Waveform : " + 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(!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(); @@ -411,60 +457,60 @@ } } } - **/ - - // 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(); - pstyle.xAxisStyle().setLabel(CLUSTER_ENERGY_TITLE); - pstyle.yAxisStyle().setLabel(NO_TITLE); - plotter.region(3).plot(clusterEnergyPlot.get(id), pstyle); - - /** + **/ + + // 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(); + pstyle.xAxisStyle().setLabel(CLUSTER_ENERGY_TITLE); + pstyle.yAxisStyle().setLabel(NO_TITLE); + plotter.region(3).plot(clusterEnergyPlot.get(id), pstyle); + + /** // Process and plot the region 3 plot. if(!isFirstRaw[id]) { pstyle.yAxisStyle().setLabel(SIGNAL_AMPLITUDE_TITLE); @@ -478,47 +524,47 @@ 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; - } + **/ + } + } + + /** + * 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/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 Wed Mar 11 19:57:01 2015 @@ -20,7 +20,6 @@ import org.hps.monitoring.ecal.eventdisplay.util.CrystalEvent; import org.hps.monitoring.ecal.eventdisplay.util.CrystalListener; import org.hps.monitoring.ecal.plots.EcalMonitoringUtilities; - import org.hps.recon.ecal.ECalUtils; import org.lcsim.event.CalorimeterHit; import org.lcsim.event.RawTrackerHit; @@ -89,6 +88,7 @@ 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. @@ -161,6 +161,7 @@ */ @Override public void detectorChanged(Detector detector) { + detectorName=detector.getName(); // Reset the AIDA tree directory. aida.tree().cd("/"); @@ -184,18 +185,18 @@ int column = EcalMonitoringUtilities.getColumnFromHistoID(ii); // Initialize the histograms for the current crystal channel. - channelEnergyPlot.add(aida.histogram1D(detector.getDetectorName() + " : " + channelEnergyPlot.add(aida.histogram1D(detectorName + " : " + inputCollection + " : Hit Energy : " + column + " " + row + ": " + ii, 100, -0.2, maxEch)); - channelTimePlot.add(aida.histogram1D(detector.getDetectorName() + " : " + channelTimePlot.add(aida.histogram1D(detectorName + " : " + inputCollection + " : Hit Time : " + column + " " + row + ": " + ii, 100, 0, 400)); - channelTimeVsEnergyPlot.add(aida.histogram2D(detector.getDetectorName() + channelTimeVsEnergyPlot.add(aida.histogram2D(detectorName + " : " + inputCollection + " : Hit Time Vs Energy : " + column + " " + row + ": " + ii, 100, 0, 400, 100, -0.2, maxEch)); - channelRawWaveform.add(aida.histogram1D(detector.getDetectorName() + " : " + channelRawWaveform.add(aida.histogram1D(detectorName + " : " + inputCollection + " : Hit Energy : " + column + " " + row + ": " + ii)); - clusterEnergyPlot.add(aida.histogram1D(detector.getDetectorName() + " : " + clusterEnergyPlot.add(aida.histogram1D(detectorName + " : " + inputCollection + " : Cluster Energy : " + column + " " + row + ": " + ii, 100, -0.2, maxEch)); @@ -289,6 +290,50 @@ public void endOfData() { viewer.setVisible(false); viewer.dispose(); + + + + int row,column; + String hName; + System.out.println("EcalEventDisplay endOfData clear histograms"); + 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. + 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); + + hName=detectorName + " : " + + inputCollection + " : Cluster Energy : " + column + " " + row + + ": " + ii; + aida.tree().rm(hName); + + + } + System.out.println("EcalEventDisplay endOfData clear histograms done"); + + } @Override 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 Wed Mar 11 19:57:01 2015 @@ -21,6 +21,7 @@ import javax.swing.JFrame; import javax.swing.JButton; +import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JDialog; import javax.swing.JOptionPane; @@ -124,8 +125,8 @@ private int nEventsMin=200; private double energy,fillEnergy,fillTime; private double energyCut=2; //we expect very high energy from the LEDs.. - private double skipInitial=0.1; - + private double skipInitial=0.05; + private double skipMin=0.3; private long cellID; @@ -143,14 +144,15 @@ private IPlotter pPlotter=null; private IPlotter pPlotter2=null; private IPlotterStyle style ; - - private boolean doEmbedded=false; + private int[] fitStatus = new int[NUM_CHANNELS]; + + private boolean doEmbedded=true; private double[] fPars; private double[] fPrevPars; private double[] fParErrs; private String[] fParNames; - + private double fEvnMinDraw=0.; private double fEvnMaxDraw=80000.; @@ -160,9 +162,10 @@ /*Components for user interaction*/ private JDialog dialog; private JLabel label; + private JFrame frame; + private JPanel panel; String labelString; private JButton okButton,cancelButton; - private JFrame frame; private int m_iteration=0; private int m_ret=0; static Object modalMonitor = new Object(); @@ -177,6 +180,9 @@ public void setSkipInitial(double skipInitial) { this.skipInitial=skipInitial; } + public void setSkipMin(double skipMin) { + this.skipMin=skipMin; + } public void setEvnMinDraw(double evnMinDraw){ this.fEvnMinDraw=evnMinDraw; @@ -195,6 +201,11 @@ this.nEventsMin=nEventsMin; } + + public void setDoEmbedded(boolean embedded){ + this.doEmbedded=embedded; + } + @Override protected void detectorChanged(Detector detector) { System.out.println("LedAnalysis::Detector changed was called"); @@ -441,6 +452,7 @@ /*Init function parameters*/ double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin}; + if (initialPars[0]<0) initialPars[0]=0; fFunction.setParameters(initialPars); /*Do the fit*/ @@ -489,13 +501,13 @@ */ hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1)); nSkip=(int)( fPars[1]*5); - if (nSkip < (nEvents[id]/2)){ + if (nSkip < (nEvents[id]*skipMin)){ System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2); - nSkip=nEvents[id]/2; + nSkip=(int)(nEvents[id]*skipMin); } if (nSkip > nEvents[id]){ System.out.println("LedAnalysis:: Skip number too high, reduce it"); - nSkip=nEvents[id]/2; + nSkip=(int)(nEvents[id]*skipMin); } 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*/ @@ -578,7 +590,7 @@ askUploadToDBDialog(); synchronized (modalMonitor) { try{ - modalMonitor.wait(120000); //wait 2 minutes, then go on! + modalMonitor.wait(120000); //wait 2 minutes for user interaction. } catch(InterruptedException excp){ System.out.println("Got exception: "+excp); @@ -589,6 +601,7 @@ uploadToDB(); } 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*/ @@ -659,7 +672,7 @@ throw new RuntimeException(e); } - + System.out.println("Upload to DB done"); } private void drawProfiles(int ledID,int driverID){ @@ -705,25 +718,36 @@ okButton = new JButton("OK"); cancelButton = new JButton("Cancel"); - labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? </html>"; + 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); - // frame = new JFrame("Upload to DB?"); - // frame.setPreferredSize(new Dimension(200,200)); - 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 = 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(); - // frame.setVisible(true); + panel.add(label); + panel.add(cancelButton); + panel.add(okButton); + + frame.setVisible(true); okButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { m_ret=1; - dialog.dispose(); + frame.dispose(); synchronized(modalMonitor) { System.out.println("Ok pressed"); @@ -737,7 +761,7 @@ public void actionPerformed(ActionEvent event) { m_ret=0; - dialog.dispose(); + frame.dispose(); synchronized(modalMonitor) { System.out.println("Cancel pressed");