Print

Print


Author: [log in to unmask]
Date: Thu Dec  4 17:25:29 2014
New Revision: 1650

Log:
Updates from work on ECAL cosmics analysis.

Added:
    java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCProfilePlotsDriver.java
    java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterPlotsDriver.java
    java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicHitSelectionDriver.java
Removed:
    java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCSignalPlotsDriver.java
Modified:
    java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterDriver.java

Added: java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCProfilePlotsDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCProfilePlotsDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/jeremym/EcalADCProfilePlotsDriver.java	Thu Dec  4 17:25:29 2014
@@ -0,0 +1,62 @@
+package org.hps.users.jeremym;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IProfile1D;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hps.conditions.database.TableConstants;
+import org.hps.conditions.ecal.EcalChannel;
+import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
+import org.hps.conditions.ecal.EcalConditions;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class EcalADCProfilePlotsDriver extends Driver {
+
+    EcalConditions conditions = null;
+    EcalChannelCollection channels = null;
+    Map<EcalChannel, IProfile1D> adcProfiles = new HashMap<EcalChannel, IProfile1D>();       
+    AIDA aida = AIDA.defaultInstance();
+    IAnalysisFactory analysisFactory = aida.analysisFactory();
+    String inputHitsCollectionName = "EcalReadoutHits";
+    
+    public void setInputHitsCollectionName(String inputHitsCollectionName) {
+        this.inputHitsCollectionName = inputHitsCollectionName;
+    }
+
+    public void detectorChanged(Detector detector) {
+        conditions = ConditionsManager.defaultInstance().getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
+        channels = conditions.getChannelCollection();
+        for (EcalChannel channel : conditions.getChannelCollection()) {            
+            adcProfiles.put(channel, aida.profile1D(inputHitsCollectionName + "/ : ADC Values : " + String.format("%03d", channel.getChannelId()), 100, 0, 100));
+        }
+    }
+
+    public void process(EventHeader event) {                       
+        if (event.hasCollection(RawTrackerHit.class, inputHitsCollectionName)) {
+            List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputHitsCollectionName);
+            for (RawTrackerHit hit : hits) {
+                EcalChannel channel = channels.findGeometric(hit.getCellID());                
+                if (channel != null) {                    
+                    IProfile1D profile = adcProfiles.get(channel);                                        
+                    for (int adcIndex = 0; adcIndex < hit.getADCValues().length; adcIndex++) {
+                        // Fill the Profile1D with ADC value.
+                        profile.fill(adcIndex, hit.getADCValues()[adcIndex]);
+                    }                    
+                } else {
+                    System.err.println("EcalChannel not found for cell ID 0x" + String.format("%08d", Long.toHexString(hit.getCellID())));
+                }
+            }
+        }
+    }
+}

Modified: java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterDriver.java	Thu Dec  4 17:25:29 2014
@@ -26,9 +26,10 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Tim "THammer" Nelson <[log in to unmask]>
  */
+// TODO: Add output collection of RawTrackerHits.
 public class EcalCosmicClusterDriver extends Driver {
 
-    String inputHitCollectionName = "SelectedEcalCalHits";
+    String inputHitCollectionName = "EcalCosmicCalHits";
     String outputClusterCollectionName = "EcalCosmicClusters";
     String ecalName = "Ecal";
     HPSEcal3 ecal = null;
@@ -91,7 +92,7 @@
             if (clusterCollection.size() > 0) {
                 int flags = 1 << LCIOConstants.CLBIT_HITS;                
                 event.put(outputClusterCollectionName, clusterCollection, Cluster.class, flags);
-                //System.out.println("added cluster to " + outputClusterCollectionName + " with size " + clusterCollection.size());
+                //System.out.println("added " + clusterCollection.size() + " clusters to " + outputClusterCollectionName);
             } else {
                 throw new NextEventException();
             }

Added: java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterPlotsDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterPlotsDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicClusterPlotsDriver.java	Thu Dec  4 17:25:29 2014
@@ -0,0 +1,87 @@
+package org.hps.users.jeremym;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IProfile1D;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hps.conditions.database.TableConstants;
+import org.hps.conditions.ecal.EcalChannel;
+import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
+import org.hps.conditions.ecal.EcalConditions;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * Create ADC value plots from the cosmic clusters.
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class EcalCosmicClusterPlotsDriver extends Driver {
+
+    EcalConditions conditions = null;
+    EcalChannelCollection channels = null;
+    Map<EcalChannel, IProfile1D> adcProfiles = new HashMap<EcalChannel, IProfile1D>();
+    AIDA aida = AIDA.defaultInstance();
+    IAnalysisFactory analysisFactory = aida.analysisFactory();
+    String inputClusterCollectionName = "EcalCosmicClusters";
+    String rawHitsCollectionName = "EcalCosmicReadoutHits";
+
+    public void setInputHitsCollectionName(String inputClusterCollectionName) {
+        this.inputClusterCollectionName = inputClusterCollectionName;
+    }
+    
+    public void setRawHitsCollectionName(String rawHitsCollectionName) {
+        this.rawHitsCollectionName = rawHitsCollectionName;
+    }
+
+    public void detectorChanged(Detector detector) {
+        conditions = ConditionsManager.defaultInstance().getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
+        channels = conditions.getChannelCollection();
+        for (EcalChannel channel : conditions.getChannelCollection()) {
+            adcProfiles.put(channel, aida.profile1D(inputClusterCollectionName + "/ADC Values : " + String.format("%03d", channel.getChannelId()), 100, 0, 100));
+        }
+    }
+
+    public void process(EventHeader event) {
+        if (event.hasCollection(Cluster.class, inputClusterCollectionName)) {
+            if (event.hasCollection(RawTrackerHit.class, rawHitsCollectionName)) {
+                Map<Long, RawTrackerHit> rawHitMap = createRawHitMap(event.get(RawTrackerHit.class, rawHitsCollectionName));
+                List<Cluster> clusters = event.get(Cluster.class, inputClusterCollectionName);
+                for (Cluster cluster : clusters) {
+                    for (CalorimeterHit calHit : cluster.getCalorimeterHits()) {
+                        RawTrackerHit rawHit = rawHitMap.get(calHit.getCellID());
+                        EcalChannel channel = channels.findGeometric(rawHit.getCellID());
+                        if (channel != null) {
+                            IProfile1D profile = adcProfiles.get(channel);
+                            for (int adcIndex = 0; adcIndex < rawHit.getADCValues().length; adcIndex++) {
+                                // Fill the Profile1D with ADC value.
+                                profile.fill(adcIndex, rawHit.getADCValues()[adcIndex]);
+                            }
+                        } else {
+                            throw new RuntimeException("EcalChannel not found for cell ID 0x" + String.format("%08d", Long.toHexString(rawHit.getCellID())));
+                        }
+                    }
+                }
+            } else {
+                throw new RuntimeException("Missing raw hit collection: " + rawHitsCollectionName);
+            }                       
+        }
+    }
+    
+    Map<Long, RawTrackerHit> createRawHitMap(List<RawTrackerHit> rawHits) {
+        Map<Long, RawTrackerHit> rawHitMap = new HashMap<Long, RawTrackerHit>();
+        for (RawTrackerHit hit : rawHits) {
+            rawHitMap.put(hit.getCellID(), hit);
+        }
+        return rawHitMap;
+    }
+
+}

Added: java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicHitSelectionDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicHitSelectionDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/jeremym/EcalCosmicHitSelectionDriver.java	Thu Dec  4 17:25:29 2014
@@ -0,0 +1,124 @@
+package org.hps.users.jeremym;
+
+import hep.aida.IAnalysisFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hps.conditions.database.TableConstants;
+import org.hps.conditions.ecal.EcalChannel;
+import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
+import org.hps.conditions.ecal.EcalChannelConstants;
+import org.hps.conditions.ecal.EcalConditions;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.subdetector.HPSEcal3;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * This Driver will process ECAL raw mode (window) data and extract hits 
+ * that look like signal, by requiring a certain number of ADC samples
+ * in a row that are above a sigma threshold.  For events with number
+ * of hits greater than a minimum (5 by default), it will convert
+ * the raw data into CalorimeterHits and write them to an output
+ * collection.
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class EcalCosmicHitSelectionDriver extends Driver {
+
+    EcalConditions conditions = null;
+    EcalChannelCollection channels = null;
+        
+    AIDA aida = AIDA.defaultInstance();
+    IAnalysisFactory analysisFactory = aida.analysisFactory();
+    double sigmaThreshold = 2.5;
+    
+    int minimumSelectedSamples = 3;
+    int minimumNumberOfHits = 3;
+    int minNeighbors = 2;
+    String outputHitsCollectionName = "EcalCosmicReadoutHits";
+    String inputHitsCollectionName = "EcalReadoutHits";
+    HPSEcal3 ecal = null;
+    static String ecalName = "Ecal";
+
+    /**
+     * Set the sigma threshold for an ADC value.
+     * @param sigmaThreshold The sigma threshold.
+     */
+    public void setSigmaThreshold(double sigmaThreshold) {
+        this.sigmaThreshold = sigmaThreshold;
+    }
+
+    /**
+     * Set the number of hits in a row which must be above threshold for the ADC values to be 
+     * saved for the event.
+     * @param selectedHits The minimum number of hits above threshold.
+     */
+    public void setMinimumSelectedSamples(int minimumSelectedSamples) {
+        this.minimumSelectedSamples = minimumSelectedSamples;
+    }
+    
+    public void setMinimumNumberOfHits(int minimumNumberOfHits) {
+        this.minimumNumberOfHits = minimumNumberOfHits;
+    }
+    
+    public void setOutputHitsCollectionName(String outputHitsCollectionName) {
+        this.outputHitsCollectionName = outputHitsCollectionName;
+    }
+
+    public void detectorChanged(Detector detector) {
+        ecal = (HPSEcal3)detector.getSubdetector(ecalName);
+        conditions = ConditionsManager.defaultInstance().getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
+        channels = conditions.getChannelCollection();
+    }
+
+    public void process(EventHeader event) {
+        if (event.hasCollection(RawTrackerHit.class, inputHitsCollectionName)) {
+            List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputHitsCollectionName);
+            List<RawTrackerHit> selectedHitsList = new ArrayList<RawTrackerHit>();
+            for (RawTrackerHit hit : hits) {
+                EcalChannel channel = channels.findGeometric(hit.getCellID());
+                if (channel != null) {
+                    int nSelectedHits = 0;
+                    boolean saveHit = false;
+                    EcalChannelConstants channelConstants = conditions.getChannelConstants(channel);
+                    double pedestal = channelConstants.getCalibration().getPedestal();
+                    double noise = channelConstants.getCalibration().getNoise();
+                    double threshold = pedestal + sigmaThreshold * noise;
+                    adcThresholdLoop: for (int adcIndex = 0; adcIndex < hit.getADCValues().length; adcIndex++) {
+                        short adcValue = hit.getADCValues()[adcIndex];
+                        if (adcValue > threshold) {
+                            ++nSelectedHits;
+                            if (nSelectedHits >= minimumSelectedSamples) {
+                                saveHit = true;
+                                break adcThresholdLoop;
+                            }
+                        } else {
+                            nSelectedHits = 0;
+                        }                        
+                    }
+                    
+                    if (saveHit) {
+                        // Add hit to output list.
+                        selectedHitsList.add(hit);
+                    }                   
+                } else {
+                    System.err.println("EcalChannel not found for cell ID 0x" + String.format("%08d", Long.toHexString(hit.getCellID())));
+                }
+            }
+                             
+            // Is number of hits above minimum?
+            if (selectedHitsList.size() >= this.minimumNumberOfHits) {
+                // Save selected hits list to event.
+                //getLogger().info("writing " + selectedHitsList.size() + " hits into " + outputHitsCollectionName);
+                event.put(outputHitsCollectionName, selectedHitsList, RawTrackerHit.class, event.getMetaData(hits).getFlags(), ecal.getReadout().getName());
+            } else {
+                // Skip this event so LCIODriver does not write this event.
+                throw new NextEventException();
+            }                                   
+        }
+    }
+}