Print

Print


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;
+    }
 }