Print

Print


Author: [log in to unmask]
Date: Tue Dec 16 11:20:09 2014
New Revision: 1758

Log:
Added dqm driver + steering file for ecal monitoring; some random changes to other stuff. 

Added:
    java/trunk/steering-files/src/main/resources/org/hps/steering/production/DataQualityEcalOnlyEngineeringRun.lcsim
      - copied, changed from r1755, java/trunk/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim
Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java
    java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java
    java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2014ECalRecon.lcsim

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java	Tue Dec 16 11:20:09 2014
@@ -1,11 +1,16 @@
 package org.hps.analysis.dataquality;
 
 import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import org.apache.commons.math.stat.StatUtils;
+import org.hps.recon.ecal.HPSEcalCluster;
+import org.hps.recon.ecal.HPSEcalClusterIC;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
-import org.lcsim.event.RawCalorimeterHit;
-import org.lcsim.event.ReconstructedParticle;
 import org.lcsim.geometry.Detector;
 
 /**
@@ -13,6 +18,9 @@
  * @author mgraham on Mar 28, 2014...just added empty (almost) file into svn May
  * 14, 2014 put some DQM template stuff in...ECal-ers should really fill in the
  * guts
+ *
+ * mg...12/16/2014: added a bunch of plots to use with engineering run data;
+ * mostly copied from online monitoring
  */
 public class EcalMonitoring extends DataQualityMonitor {
 
@@ -20,23 +28,150 @@
     String calibratedHitCollectionName = "EcalCalHits";//these are in energy
     String clusterCollectionName = "EcalClusters";
 
+    //ecal hit plots
+    IHistogram1D hitCountPlot;
+    IHistogram1D hitTimePlot;
+    IHistogram1D hitEnergyPlot;
+    IHistogram1D fiducialHitCountPlot;
+    IHistogram1D fiducialEnergyPlot;
+    //  ecal cluster plots
+    IHistogram1D clusterCountPlot;
+    IHistogram1D clusterSizePlot;
+    IHistogram1D clusterEnergyPlot;
+    IHistogram1D clusterTimes;
+    IHistogram1D clusterTimeSigma;
+    //mg...12/13/2014
+    IHistogram1D twoclusterTotEnergy;
+    IHistogram1D twoclusterEnergyAsymmetry;
+//    IHistogram1D twoclusterEnergyMeanYPos;
+//    IHistogram1D twoclusterEnergyMeanXPos;
+    //mg...12/14/2014
+    IHistogram1D fiducialClusterCountPlot;
+    IHistogram1D fiducialClusterEnergyPlot;
+    IHistogram1D fiducialClusterSizePlot;
+    IHistogram2D fiducialenergyVsY;
+    IHistogram2D fiducialenergyVsX;
+    IHistogram2D energyVsY;
+    IHistogram2D energyVsX;
+
     private Map<String, Double> monitoredQuantityMap = new HashMap<>();
     String[] ecalQuantNames = {"Good", "Stuff", "For", "ECAL"};
+    double maxE = 2.5;
+    private final String plotHitsDir = "EcalHits/";
+    private final String plotClustersDir = "EcalClusters/";
 
     protected void detectorChanged(Detector detector) {
         System.out.println("EcalMonitoring::detectorChanged  Setting up the plotter");
         aida.tree().cd("/");
 
-        //make some cool plots that will get saved in root format...2D is good too!
-        IHistogram1D energy = aida.histogram1D("Cluster Energy", 25, 0, 2.5);
+        // Setup hit plots.
+        hitCountPlot = aida.histogram1D(plotHitsDir + "Hit Count In Event", 40, -0.5, 39.5);
+        hitTimePlot = aida.histogram1D(plotHitsDir + "Hit Time", 50, 0 * 4.0, 50 * 4.0);
+        hitEnergyPlot = aida.histogram1D(plotHitsDir + "Hit Energy", 100, -0.1, maxE);
+        fiducialHitCountPlot = aida.histogram1D(plotHitsDir + "Hit Count with Fiducial Cut", 10, -0.5, 9.5);
+        fiducialEnergyPlot = aida.histogram1D(plotHitsDir + "Hit Energy with Fiducial Cut", 100, -0.1, maxE);
+
+        // Setup cluster plots
+        clusterCountPlot = aida.histogram1D(plotClustersDir + "Cluster Count per Event", 10, -0.5, 9.5);
+        clusterSizePlot = aida.histogram1D(plotClustersDir + "Cluster Size", 10, -0.5, 9.5);
+        clusterEnergyPlot = aida.histogram1D(plotClustersDir + "Cluster Energy", 100, -0.1, maxE);
+        clusterTimes = aida.histogram1D(plotClustersDir + "Cluster Time Mean", 200, 0, 4.0 * 50);
+        clusterTimeSigma = aida.histogram1D(plotClustersDir + "Cluster Time Sigma", 100, 0, 10);
+        twoclusterTotEnergy = aida.histogram1D(plotClustersDir + "Two Cluster Energy Sum", 100, 0, maxE);
+        twoclusterEnergyAsymmetry = aida.histogram1D(plotClustersDir + "Two Cluster Energy Asymmetry", 100, 0, 1.0);
+        energyVsX = aida.histogram2D(plotClustersDir + "Energy vs X", 50, 0, 1.6, 50, .0, 200.0);
+        energyVsY = aida.histogram2D(plotClustersDir + "Energy vs Y", 50, 0, 1.6, 50, 20.0, 85.0);
+
+        fiducialClusterCountPlot = aida.histogram1D(plotClustersDir + "Cluster Count with Fiducal Cut", 10, -0.5, 9.5);
+        fiducialClusterSizePlot = aida.histogram1D(plotClustersDir + "Cluster Size with Fiducal Cut", 10, -0.5, 9.5);
+        fiducialClusterEnergyPlot = aida.histogram1D(plotClustersDir + "Cluster Energy with Fiducal Cut", 100, -0.1, maxE);
+        fiducialenergyVsY = aida.histogram2D(plotClustersDir + "Energy vs Y with Fiducial Cuts", 50, 0, 1.6, 50, 45.0, 85.0);
+        fiducialenergyVsX = aida.histogram2D(plotClustersDir + "Energy vs X with Fiducial Cuts", 50, 0, 1.6, 50, 0.0, 200.0);
 
     }
 
     @Override
     public void process(EventHeader event) {
         /*  make sure everything is there */
-        if (!event.hasCollection(RawCalorimeterHit.class, readoutHitCollectionName))
+        List<CalorimeterHit> hits;
+        if (event.hasCollection(CalorimeterHit.class, calibratedHitCollectionName))
+            hits = event.get(CalorimeterHit.class, calibratedHitCollectionName);
+        else
+            return; //this might be a non-data event
+
+        hitCountPlot.fill(hits.size());
+        int fidHitCount = 0;
+        for (CalorimeterHit hit : hits) {
+
+            hitEnergyPlot.fill(hit.getCorrectedEnergy());
+            hitTimePlot.fill(hit.getTime());
+            int ix = hit.getIdentifierFieldValue("ix");
+            int iy = hit.getIdentifierFieldValue("iy");
+            if (Math.abs(iy) > 2) {
+                fidHitCount++;
+                fiducialEnergyPlot.fill(hit.getCorrectedEnergy());
+            }
+            fiducialHitCountPlot.fill(fidHitCount);
+        }
+
+        List<Cluster> clusters;
+        if (event.hasCollection(HPSEcalCluster.class, clusterCollectionName))
+            clusters = event.get(Cluster.class, clusterCollectionName);
+        else if (event.hasCollection(HPSEcalClusterIC.class, clusterCollectionName))
+            clusters = event.get(Cluster.class, clusterCollectionName);
+        else if(event.hasCollection(Cluster.class, clusterCollectionName))
+            clusters = event.get(Cluster.class, clusterCollectionName);
+        else {
+            clusterCountPlot.fill(0);
             return;
+        }
+
+        clusterCountPlot.fill(clusters.size());
+
+        int fidcnt = 0;
+        for (Cluster cluster : clusters) {
+            clusterEnergyPlot.fill(cluster.getEnergy());
+            double[] times = new double[cluster.getCalorimeterHits().size()];
+            double[] energies = new double[cluster.getCalorimeterHits().size()];
+            CalorimeterHit seed = cluster.getCalorimeterHits().get(0);
+            int ix = seed.getIdentifierFieldValue("ix");
+            int iy = seed.getIdentifierFieldValue("iy");
+            if (cluster.getCalorimeterHits().size() > 1) {
+                energyVsX.fill(cluster.getEnergy(), Math.abs(cluster.getPosition()[0]));
+                energyVsY.fill(cluster.getEnergy(), Math.abs(cluster.getPosition()[1]));
+            }
+            if (Math.abs(iy) > 2) {
+                fidcnt++;
+                fiducialClusterSizePlot.fill(cluster.getCalorimeterHits().size());
+                fiducialClusterEnergyPlot.fill(cluster.getEnergy());
+                if (cluster.getCalorimeterHits().size() > 1)
+                    fiducialenergyVsY.fill(cluster.getEnergy(), Math.abs(cluster.getPosition()[1]));
+            }
+
+            int size = 0;
+            for (CalorimeterHit hit : cluster.getCalorimeterHits()) {
+                energies[size] = hit.getCorrectedEnergy();
+                times[size] = hit.getTime();
+                size++;
+            }
+            clusterTimes.fill(StatUtils.mean(times, 0, size));
+            clusterSizePlot.fill(size); //The number of "hits" in a "cluster"
+            clusterTimeSigma.fill(Math.sqrt(StatUtils.variance(times, 0, size)));
+
+        }
+        fiducialClusterCountPlot.fill(fidcnt);
+        //make some interesting 2-cluster plots
+        if (clusters.size() == 2) {
+            Cluster cl1 = clusters.get(0);
+            Cluster cl2 = clusters.get(1);
+            double[] p1 = cl1.getPosition();
+            double[] p2 = cl2.getPosition();
+            double e1 = cl1.getEnergy();
+            double e2 = cl2.getEnergy();
+            twoclusterTotEnergy.fill(e1 + e2);
+            twoclusterEnergyAsymmetry.fill(Math.abs(e1 - e2)/(e1+e2));
+        }
+        
 
     }
 

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TrackMCEfficiency.java	Tue Dec 16 11:20:09 2014
@@ -153,11 +153,9 @@
         Map<Track, TrackAnalysis> tkanalMap = new HashMap<Track, TrackAnalysis>();
         RelationalTable hittomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         List<LCRelation> mcrelations = event.get(LCRelation.class, trackHitMCRelationsCollectionName);
-        System.out.println(this.getClass().getSimpleName() + ": number of MC relations = " + mcrelations.size());
         for (LCRelation relation : mcrelations)
             if (relation != null && relation.getFrom() != null && relation.getTo() != null)
                 hittomc.add(relation.getFrom(), relation.getTo());
-        System.out.println(this.getClass().getSimpleName() + ": number of hittomc relations = " + hittomc.size());
         RelationalTable mcHittomcP = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
         //  Get the collections of SimTrackerHits
         List<List<SimTrackerHit>> simcols = event.get(SimTrackerHit.class);
@@ -214,13 +212,11 @@
         FindableTrack findable = new FindableTrack(event);
 
         List<Track> tracks = event.get(Track.class, trackCollectionName);
-        System.out.println(this.getClass().getSimpleName() + ": nTracks = " + tracks.size());
         for (Track trk : tracks) {
             TrackAnalysis tkanal = new TrackAnalysis(trk, hittomc, rawtomc, hittostrip, hittorotated);
             tkanalMap.put(trk, tkanal);
             MCParticle mcp = tkanal.getMCParticleNew();
             if (mcp != null) {//  Create a map between the tracks found and the assigned MC particle            
-                System.out.println(this.getClass().getSimpleName() + ": found MCP match");
                 trktomc.add(trk, tkanal.getMCParticleNew());
             }
         }
@@ -242,7 +238,6 @@
             double eta = -Math.log(Math.tan(Math.atan2(pt, pz) / 2));
             double phi = Math.atan2(px, pz);
             //  Find the number of layers hit by this mc particle
-            System.out.println("MC pt=" + pt);
             int nhits = findable.LayersHit(mcp);
             boolean isFindable = findable.InnerTrackerIsFindable(mcp, nlayers - 2);
 
@@ -364,30 +359,30 @@
                 if (hit.Layer() == layer)
                     hasThisLayer = true;
             if (!hasThisLayer) {
-                System.out.println("Missing reconstructed hit in layer = " + layer);
+//                System.out.println("Missing reconstructed hit in layer = " + layer);
                 boolean hasFitHitSL1 = false;
                 boolean hasFitHitSL2 = false;
                 FittedRawTrackerHit fitSL1 = null;
                 FittedRawTrackerHit fitSL2 = null;
-                System.out.println("fitted hit list size = " + fitlist.size());
+//                System.out.println("fitted hit list size = " + fitlist.size());
                 for (FittedRawTrackerHit fit : fitlist) {
-                    System.out.println("fitted hit layer number = " + fit.getRawTrackerHit().getLayerNumber());
+//                    System.out.println("fitted hit layer number = " + fit.getRawTrackerHit().getLayerNumber());
                     if (fit.getRawTrackerHit().getLayerNumber() == layer) {
                         hasFitHitSL1 = true;
                         fitSL1 = fit;
-                        System.out.println("Found a hit in SL1 with t0 = " + fitSL1.getT0() + "; amp = " + fitSL1.getAmp() + "; chi^2 = " + fitSL1.getShapeFitParameters().getChiProb() + "; strip = " + fitSL1.getRawTrackerHit().getCellID());
+//                        System.out.println("Found a hit in SL1 with t0 = " + fitSL1.getT0() + "; amp = " + fitSL1.getAmp() + "; chi^2 = " + fitSL1.getShapeFitParameters().getChiProb() + "; strip = " + fitSL1.getRawTrackerHit().getCellID());
                     }
                     if (fit.getRawTrackerHit().getLayerNumber() == layer + 1) {
                         hasFitHitSL2 = true;
                         fitSL2 = fit;
-                        System.out.println("Found a hit in SL2 with t0 = " + fitSL2.getT0() + "; amp = " + fitSL2.getAmp() + "; chi^2 = " + fitSL2.getShapeFitParameters().getChiProb() + "; strip = " + fitSL2.getRawTrackerHit().getCellID());
+//                        System.out.println("Found a hit in SL2 with t0 = " + fitSL2.getT0() + "; amp = " + fitSL2.getAmp() + "; chi^2 = " + fitSL2.getShapeFitParameters().getChiProb() + "; strip = " + fitSL2.getRawTrackerHit().getCellID());
 
                     }
                 }
-                if (!hasFitHitSL1)
-                    System.out.println("MISSING a hit in SL1!!!");
-                if (!hasFitHitSL2)
-                    System.out.println("MISSING a hit in SL2!!!");
+//                if (!hasFitHitSL1)
+//                    System.out.println("MISSING a hit in SL1!!!");
+//                if (!hasFitHitSL2)
+//                    System.out.println("MISSING a hit in SL2!!!");
 
                 return false;
             }

Copied: java/trunk/steering-files/src/main/resources/org/hps/steering/production/DataQualityEcalOnlyEngineeringRun.lcsim (from r1755, java/trunk/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim)
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/production/DataQualityRecon.lcsim	(original)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/production/DataQualityEcalOnlyEngineeringRun.lcsim	Tue Dec 16 11:20:09 2014
@@ -6,48 +6,20 @@
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
     <execute>
         <driver name="EventMarkerDriver"/>
-        <!--        <driver name="DQMDatabaseDriver"/>  -->
-        <driver name="RawTrackerHitSensorSetup"/>
-        <driver name="SVTMonitoring"/>  
-        <driver name="SVTHitMCEfficiency"/>  
-        <driver name="TrackingMonitoring"/>  
-        <driver name="TrackingResiduals"/>
-        <driver name="TrackMCEfficiency"/> 
-        <driver name="FinalStateMonitoring"/>          
-        <driver name="V0Monitoring"/>          
+        <driver name="EcalMonitoring"/>
         <driver name="AidaSaveDriver"/>
         <driver name="CleanupDriver"/>
     </execute>    
     <drivers>    
-        <!--    <driver name="DQMDatabaseDriver" type="org.hps.analysis.dataquality.DQMDatabaseDriver"/> -->
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1</eventInterval>
+            <eventInterval>1000</eventInterval>
         </driver>        
-        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/>
         <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
             <outputFileName>${outputFile}.root</outputFileName>
         </driver>
-        <driver name="SVTMonitoring" type="org.hps.analysis.dataquality.SvtMonitoring">
-            <overwriteDB>false</overwriteDB>
-        </driver>
-        <driver name="TrackingMonitoring" type="org.hps.analysis.dataquality.TrackingMonitoring">
-            <overwriteDB>false</overwriteDB>
-        </driver>
-        <driver name="TrackingResiduals" type="org.hps.analysis.dataquality.TrackingResiduals">
-            <overwriteDB>false</overwriteDB>
-        </driver>
-        <driver name="FinalStateMonitoring" type="org.hps.analysis.dataquality.FinalStateMonitoring">
-            <overwriteDB>false</overwriteDB>
-        </driver>
-        <driver name="TrackMCEfficiency" type="org.hps.analysis.dataquality.TrackMCEfficiency">
+        <driver name="EcalMonitoring" type="org.hps.analysis.dataquality.EcalMonitoring">
             <overwriteDB>false</overwriteDB>
         </driver> 
-        <driver name="SVTHitMCEfficiency" type="org.hps.analysis.dataquality.SVTHitMCEfficiency">
-            <overwriteDB>false</overwriteDB>
-        </driver> 
-        <driver name="V0Monitoring" type="org.hps.analysis.dataquality.V0Monitoring">
-            <overwriteDB>false</overwriteDB>
-        </driver>
         <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/>
 
     </drivers>

Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2014ECalRecon.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2014ECalRecon.lcsim	(original)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2014ECalRecon.lcsim	Tue Dec 16 11:20:09 2014
@@ -8,15 +8,17 @@
         <driver name="EventMarkerDriver"/>              
         <driver name="EcalRawConverter" />
         <driver name="EcalClusterer" />
+<!--        <driver name="EcalClustererIC" /> -->
         <driver name="EcalHitPlots"/>             <!-- Single hit distributions -->
         <driver name="EcalClusterPlots"/>         <!-- Clusters distributions -->
-        <driver name="LCIOWriter"/>
+<!--      <driver name="EcalClusterPlotsIC"/>   -->       <!-- Clusters distributions with IC clusters-->
+        <driver name="LCIOWriter"/> 
         <driver name="AidaSaveDriver"/>  
         <driver name="CleanupDriver"/>
    </execute>    
     <drivers>    
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
+            <eventInterval>1</eventInterval>
         </driver>        
         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
             <ecalCollectionName>EcalCalHits</ecalCollectionName>
@@ -27,9 +29,19 @@
         <driver name="EcalClusterer" type="org.hps.recon.ecal.EcalClusterer">
             <ecalName>Ecal</ecalName>
             <ecalCollectionName>EcalCalHits</ecalCollectionName>
+            <seedEMin>0.1</seedEMin>
             <addEMin>0.01</addEMin>
 <!--            <timeCut>true</timeCut>  -->
         </driver>
+   <driver name="EcalClustererIC" type="org.hps.recon.ecal.EcalClusterIC">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalCalHits</ecalCollectionName>
+            <clusterCollectionName>EcalClustersIC</clusterCollectionName>
+            <hitEnergyThreshold>0.01</hitEnergyThreshold>
+            <seedEnergyThreshold>0.100</seedEnergyThreshold>        
+            <clusterEnergyThreshold>0.200</clusterEnergyThreshold>        
+        </driver>
+
      <driver name="EcalHitPlots" type="org.hps.monitoring.ecal.plots.EcalHitPlots">
             <inputCollection>EcalCalHits</inputCollection>        
             <maxE>2.0</maxE>
@@ -39,10 +51,17 @@
         <driver name="EcalClusterPlots" type="org.hps.monitoring.ecal.plots.EcalClusterPlots">
             <maxE>2.0</maxE>
             <logScale>false</logScale>
-            <hide>true</hide>            
+            <hide>true</hide>                        
         </driver>
+        <driver name="EcalClusterPlotsIC" type="org.hps.monitoring.ecal.plots.EcalClusterPlots">
+            <maxE>2.0</maxE>
+            <logScale>false</logScale>
+            <hide>true</hide>
+            <inputCollection>EcalClustersIC</inputCollection>
+        </driver>
+
         <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
-            <outputFileName>triggerEPlots.root</outputFileName>
+            <outputFileName>ecalplots.root</outputFileName>
         </driver> 
 
         <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver">