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">
|