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