Author: [log in to unmask]
Date: Mon Apr 20 10:19:19 2015
New Revision: 2753
Log:
Style all plots. Added some code that allows filtering by trigger.
Modified:
java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java
Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java
=============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java (original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java Mon Apr 20 10:19:19 2015
@@ -13,30 +13,33 @@
import hep.aida.IPlotterFactory;
import hep.aida.IPlotterStyle;
import hep.aida.ITree;
-import hep.aida.jfree.plotter.Plotter;
import hep.aida.ref.rootwriter.RootFileStore;
import org.lcsim.util.Driver;
import org.lcsim.detector.tracker.silicon.HpsSiSensor;
import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.event.Cluster;
import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
import org.lcsim.event.LCRelation;
import org.lcsim.event.RawTrackerHit;
import org.lcsim.geometry.Detector;
+import org.hps.recon.ecal.triggerbank.SSPCluster;
+import org.hps.recon.ecal.triggerbank.SSPData;
+import org.hps.recon.ecal.triggerbank.AbstractIntData;
+import org.hps.recon.ecal.triggerbank.SSPSinglesTrigger;
+import org.hps.recon.ecal.triggerbank.TIData;
import org.hps.recon.tracking.FittedRawTrackerHit;
import org.hps.recon.tracking.ShapeFitParameters;
/**
* Monitoring driver that will be used when 'timing in' the SVT.
*
+ * @author Omar Moreno <[log in to unmask]>
* @author Sho Uemura <[log in to unmask]>
- * @author Omar Moreno <[log in to unmask]>
*/
public class SvtTimingInPlots extends Driver {
// TODO: Add documentation
- // TODO: Set plot styles
static {
hep.aida.jfree.AnalysisFactory.register();
@@ -57,12 +60,27 @@
protected Map<SiSensor, IHistogram2D> t0vChi2Plots = new HashMap<SiSensor, IHistogram2D>();
protected Map<SiSensor, IHistogram2D> chi2vAmpPlots = new HashMap<SiSensor, IHistogram2D>();
- String rootFile = "default.root";
-
+ String rootFile = null;
+
+ // Collection names
+ String fittedHitsCollectioName = "SVTFittedRawTrackerHits";
+ String triggerBankCollectionName = "TriggerBank";
+
boolean batchMode = false;
+ boolean isSingleClusterTrigger = false;
+ boolean isEcalTopCluster = false;
+ boolean enableTriggerFilter = false;
public void setBatchMode(boolean batchMode) {
this.batchMode = batchMode;
+ }
+
+ public void setUseTriggerFilter(boolean enableTriggerFilter) {
+ this.enableTriggerFilter = enableTriggerFilter;
+ }
+
+ public void setRootFileName(String rootFile) {
+ this.rootFile = rootFile;
}
private int computePlotterRegion(HpsSiSensor sensor) {
@@ -168,9 +186,9 @@
plotters.get("L1-L3 t0").region(this.computePlotterRegion(sensor))
.plot(t0Plots.get(sensor), this.createStyle("t0 [ns]", ""));
plotters.get("L1-L3 Amplitude").region(this.computePlotterRegion(sensor))
- .plot(amplitudePlots.get(sensor), this.createStyle("Amplitude [ADC Counts] ", ""));
+ .plot(amplitudePlots.get(sensor), this.createStyle(sensor, "Amplitude [ADC Counts] ", ""));
plotters.get("L1-L3 Chi^2 Probability").region(this.computePlotterRegion(sensor))
- .plot(chi2Plots.get(sensor), this.createStyle("#chi^{2} Probability", ""));
+ .plot(chi2Plots.get(sensor), this.createStyle(sensor, "#chi^{2} Probability", ""));
plotters.get("L1-L3 t0 vs Amplitude").region(this.computePlotterRegion(sensor))
.plot(t0vAmpPlots.get(sensor), this.createStyle("t0 [ns]", "Amplitude [ADC Counts]"));
plotters.get("L1-L3 t0 vs Chi^2 Prob.").region(this.computePlotterRegion(sensor))
@@ -178,16 +196,16 @@
plotters.get("L1-L3 Chi^2 Prob. vs Amplitude").region(this.computePlotterRegion(sensor))
.plot(chi2vAmpPlots.get(sensor), this.createStyle("#chi^{2} Probability","Amplitude [ADC Counts]"));
plotters.get("L1-L3 Max Sample Number").region(this.computePlotterRegion(sensor))
- .plot(maxSampleNumberPerSensorPlots.get(sensor), this.createStyle("Max Sample Number", ""));
+ .plot(maxSampleNumberPerSensorPlots.get(sensor), this.createStyle(sensor, "Max Sample Number", ""));
plotters.get("L1-L3 Max Sample Number - Opposite").region(this.computePlotterRegion(sensor))
- .plot(maxSampleNumberPerSensorOppPlots.get(sensor),this.createStyle("Max Sample Number", ""));
+ .plot(maxSampleNumberPerSensorOppPlots.get(sensor),this.createStyle(sensor, "Max Sample Number", ""));
} else {
plotters.get("L4-L6 t0").region(this.computePlotterRegion(sensor))
- .plot(t0Plots.get(sensor), this.createStyle("t0 [ns]", ""));
+ .plot(t0Plots.get(sensor), this.createStyle(sensor, "t0 [ns]", ""));
plotters.get("L4-L6 Amplitude").region(this.computePlotterRegion(sensor))
- .plot(amplitudePlots.get(sensor), this.createStyle("Amplitude [ADC Counts] ", ""));
+ .plot(amplitudePlots.get(sensor), this.createStyle(sensor, "Amplitude [ADC Counts] ", ""));
plotters.get("L4-L6 Chi^2 Probability").region(this.computePlotterRegion(sensor))
- .plot(chi2Plots.get(sensor), this.createStyle("#chi^{2} Probability", ""));
+ .plot(chi2Plots.get(sensor), this.createStyle(sensor, "#chi^{2} Probability", ""));
plotters.get("L4-L6 t0 vs Amplitude").region(this.computePlotterRegion(sensor))
.plot(t0vAmpPlots.get(sensor), this.createStyle("t0 [ns]", "Amplitude [ADC Counts]"));
plotters.get("L4-L6 t0 vs Chi^2 Prob.").region(this.computePlotterRegion(sensor))
@@ -195,17 +213,16 @@
plotters.get("L4-L6 Chi^2 Prob. vs Amplitude").region(this.computePlotterRegion(sensor))
.plot(chi2vAmpPlots.get(sensor), this.createStyle("#chi^{2} Probability","Amplitude [ADC Counts]"));
plotters.get("L4-L6 Max Sample Number").region(this.computePlotterRegion(sensor))
- .plot(maxSampleNumberPerSensorPlots.get(sensor), this.createStyle("Max Sample Number", ""));
+ .plot(maxSampleNumberPerSensorPlots.get(sensor), this.createStyle(sensor, "Max Sample Number", ""));
plotters.get("L4-L6 Max Sample Number - Opposite").region(this.computePlotterRegion(sensor))
- .plot(maxSampleNumberPerSensorOppPlots.get(sensor), this.createStyle("Max Sample Number", ""));
+ .plot(maxSampleNumberPerSensorOppPlots.get(sensor), this.createStyle(sensor, "Max Sample Number", ""));
}
}
maxSampleNumberPerVolumePlots.put("Top", histogramFactory.createHistogram1D("SVT Top - Max Sample Number", 6, 0, 6));
maxSampleNumberPerVolumePlots.put("Bottom", histogramFactory.createHistogram1D("SVT Bottom - Max Sample Number", 6, 0, 6));
- plotters.get("Max Sample Per Volume").region(0).plot(maxSampleNumberPerVolumePlots.get("Top"));
- plotters.get("Max Sample Per Volume").region(1).plot(maxSampleNumberPerVolumePlots.get("Bottom"));
-
+ plotters.get("Max Sample Per Volume").region(0).plot(maxSampleNumberPerVolumePlots.get("Top"), this.createStyle("Max Sample Number - Top SVT Hits", ""));
+ plotters.get("Max Sample Per Volume").region(1).plot(maxSampleNumberPerVolumePlots.get("Bottom"), this.createStyle("Max Sample Number - SVT Bottom Hits", ""));
if (batchMode) return;
@@ -215,22 +232,86 @@
}
public void process(EventHeader event) {
-
+
+ // If the event doesn't have a collection of fitted SVT raw hits, skip
+ // it.
if (!event.hasCollection(LCRelation.class, "SVTFittedRawTrackerHits"))
return;
-
+
+ // If the event has a collection of trigger banks, get them and extract
+ // the trigger information for the event.
+ isSingleClusterTrigger = false;
+ isEcalTopCluster = false;
+ List<SSPCluster> clusters = null;
+ SSPData sspData = null;
+ /*if(event.hasCollection(GenericObject.class, triggerBankCollectionName)) {
+
+ // Get the list of trigger banks from the event
+ List<GenericObject> triggerBanks = event.get(GenericObject.class, triggerBankCollectionName);
+
+ System.out.println("Total trigger banks: " + triggerBanks.size());
+
+ // Loop through the collection of banks and get the SSP and TI banks.
+ for (GenericObject triggerBank : triggerBanks) {
+
+ // If the bank contains TI data, process it
+ if (AbstractIntData.getTag(triggerBank) == TIData.BANK_TAG) {
+
+ TIData tiData = new TIData(triggerBank);
+
+ // Check if the trigger is singles
+ if (tiData.isSingle0Trigger() || tiData.isSingle1Trigger()) {
+ isSingleClusterTrigger = true;
+ }
+
+ } else if (AbstractIntData.getTag(triggerBank) == SSPData.BANK_TAG) {
+
+ sspData = new SSPData(triggerBank);
+
+ clusters = sspData.getClusters();
+
+ for (SSPCluster cluster : clusters) {
+ if (cluster.getYIndex() > 0) {
+ isEcalTopCluster = true;
+ }
+ }
+ }
+ }
+
+ if (isSingleClusterTrigger) {
+ System.out.println("Total number of singles triggers: " + sspData.getSinglesTriggers().size());
+ for (SSPSinglesTrigger trigger : sspData.getSinglesTriggers()) {
+ System.out.println("Trigger: " + trigger.toString());
+ }
+ System.out.println("Total number of SSP clusters: " + clusters.size());
+ for (SSPCluster cluster : clusters) {
+ System.out.println("X: " + cluster.getXIndex() + " Y: " + cluster.getYIndex() + " time: " + cluster.getTime());
+ }
+ }
+ }*/
+
+ // Obtain all relations between an SVT raw hit and its corresponding
+ // fit parameters. The fit parameters are obtained from the fit to
+ // the six samples read out.
List<LCRelation> fittedHits = event.get(LCRelation.class, "SVTFittedRawTrackerHits");
for (LCRelation fittedHit : fittedHits) {
-
+
+ // Obtain the SVT raw hit associated with this relation
RawTrackerHit rawHit = (RawTrackerHit) fittedHit.getFrom();
+ // Obtain the HpsSiSensor associated with the raw hit
HpsSiSensor sensor
= (HpsSiSensor) rawHit.getDetectorElement();
-
+
+ // Obtain the raw ADC samples for each of the six samples readout
short[] adcValues = rawHit.getADCValues();
-
+
+ // Find the sample that has the largest amplitude. This should
+ // correspond to the peak of the shaper signal if the SVT is timed
+ // in correctly. Otherwise, the maximum sample value will default
+ // to 0.
int maxAmplitude = 0;
int maxSampleNumber = -1;
for (int sampleN = 0; sampleN < 6; sampleN++) {
@@ -239,16 +320,31 @@
maxSampleNumber = sampleN;
}
}
-
- // WARNING: This is only meant to be used when running with clusters
- // which are purely top clusters
- if (sensor.isTopLayer()) {
- maxSampleNumberPerSensorPlots.get(sensor).fill(maxSampleNumber);
- maxSampleNumberPerVolumePlots.get("Top").fill(maxSampleNumber);
+
+ if (enableTriggerFilter) {
+ if (isSingleClusterTrigger) {
+ if (isEcalTopCluster && sensor.isTopLayer()) {
+ maxSampleNumberPerSensorPlots.get(sensor).fill(maxSampleNumber);
+ maxSampleNumberPerVolumePlots.get("Top").fill(maxSampleNumber);
+ } else if (isEcalTopCluster && sensor.isBottomLayer()) {
+ maxSampleNumberPerSensorOppPlots.get(sensor).fill(maxSampleNumber);
+ } else if (!isEcalTopCluster && sensor.isTopLayer()) {
+ maxSampleNumberPerSensorOppPlots.get(sensor).fill(maxSampleNumber);
+ } else if (!isEcalTopCluster && sensor.isBottomLayer()) {
+ maxSampleNumberPerSensorPlots.get(sensor).fill(maxSampleNumber);
+ maxSampleNumberPerVolumePlots.get("Bottom").fill(maxSampleNumber);
+ }
+ }
} else {
- maxSampleNumberPerSensorOppPlots.get(sensor).fill(maxSampleNumber);
- maxSampleNumberPerVolumePlots.get("Bottom").fill(maxSampleNumber);
+ if (sensor.isTopLayer()) {
+ maxSampleNumberPerSensorPlots.get(sensor).fill(maxSampleNumber);
+ maxSampleNumberPerVolumePlots.get("Top").fill(maxSampleNumber);
+ } else {
+ maxSampleNumberPerSensorPlots.get(sensor).fill(maxSampleNumber);
+ maxSampleNumberPerVolumePlots.get("Bottom").fill(maxSampleNumber);
+ }
}
+
double t0 = FittedRawTrackerHit.getT0(fittedHit);
t0Plots.get(sensor).fill(t0);
@@ -268,9 +364,10 @@
@Override
public void endOfData() {
+
+ if (rootFile == null) return;
RootFileStore store = new RootFileStore(rootFile);
try {
- //tree.commit();
store.open();
store.add(tree);
store.close();
@@ -299,10 +396,10 @@
// Set the style of the data
style.dataStyle().lineStyle().setVisible(false);
- style.dataStyle().outlineStyle().setVisible(true);
+ style.dataStyle().outlineStyle().setVisible(false);
style.dataStyle().outlineStyle().setThickness(3);
style.dataStyle().fillStyle().setVisible(true);
- style.dataStyle().fillStyle().setOpacity(.10);
+ style.dataStyle().fillStyle().setOpacity(.30);
style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
style.dataStyle().errorBarStyle().setVisible(false);
@@ -310,11 +407,20 @@
// Turn off the legend
style.legendBoxStyle().setVisible(false);
- // Turn off the title
- style.titleStyle().setVisible(false);
-
return style;
}
-
+ IPlotterStyle createStyle(HpsSiSensor sensor, String xAxisTitle, String yAxisTitle) {
+ IPlotterStyle style = this.createStyle(xAxisTitle, yAxisTitle);
+
+ if (sensor.isTopLayer()) {
+ style.dataStyle().fillStyle().setColor("31, 137, 229, 1");
+ style.dataStyle().outlineStyle().setColor("31, 137, 229, 1");
+ } else {
+ style.dataStyle().fillStyle().setColor("93, 228, 47, 1");
+ style.dataStyle().outlineStyle().setColor("93, 228, 47, 1");
+ }
+
+ return style;
+ }
}
|