Print

Print


Author: [log in to unmask]
Date: Tue Feb  3 13:04:17 2015
New Revision: 2031

Log:
Changed from array of pedestals to Map<RawCalorimeterHit,pedestal>

Modified:
    java/trunk/users/src/main/java/org/hps/users/baltzell/ECalRunningPedestalDriver.java
    java/trunk/users/src/main/java/org/hps/users/baltzell/EcalRawConverter_RunPed.java

Modified: java/trunk/users/src/main/java/org/hps/users/baltzell/ECalRunningPedestalDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/baltzell/ECalRunningPedestalDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/baltzell/ECalRunningPedestalDriver.java	Tue Feb  3 13:04:17 2015
@@ -1,7 +1,9 @@
 package org.hps.users.baltzell;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.hps.conditions.database.TableConstants;
 import org.hps.conditions.ecal.EcalChannel;
@@ -18,6 +20,7 @@
 
 /**
  * Calculate a running pedestal average for every channel from Mode7 FADCs.
+ * 
  * @version $Id: ECalRunningPedestalDriver.java,v 0.0 2015/01/31 00:00:00
  * @author <[log in to unmask]>
  */
@@ -25,15 +28,15 @@
 
     // limit array lengths:
     private final int limitLookbackEvents = 1000;
-    
+
     // minimum number of readouts for running averages:
     // (if not satisfied, use pedestals from database)
     private int minLookbackEvents = 10;
-    
+
     // maximum number of readouts for running averages:
     // (if too many, discard the oldest ones)
     private int maxLookbackEvents = 100;
-    
+
     // oldest allowed time for running averages:
     // (discard older readouts ; negative = no time limit)
     private long maxLookbackTime = -1; // units = ms
@@ -47,7 +50,7 @@
 
     // running pedestal averages, one for each channel:
     private List<Double> runningPedestals = new ArrayList<Double>(nChannels);
-    
+
     // FIXME:
     // recent event-by-event pedestals and timestamps:
     private List<Integer>[] eventPedestals = (ArrayList<Integer>[]) new ArrayList[nChannels];
@@ -56,8 +59,6 @@
     private boolean debug = false;
     private EcalConditions ecalConditions = null;
 
-    
-    
     public ECalRunningPedestalDriver() {
         for (int ii = 0; ii < nChannels; ii++) {
             eventPedestals[ii] = new ArrayList<>();
@@ -65,6 +66,7 @@
             runningPedestals.add(-1.);
         }
     }
+
     @Override
     protected void startOfData() {
     }
@@ -74,30 +76,34 @@
         ecalConditions = ConditionsManager.defaultInstance()
                 .getCachedConditions(EcalConditions.class,TableConstants.ECAL_CONDITIONS)
                 .getCachedData();
-        for (int ii=0; ii<nChannels; ii++) {
-            runningPedestals.set(ii,getStaticPedestal(ii+1));
-        }
-        if (debug){
+        for (int ii = 0; ii < nChannels; ii++) {
+            runningPedestals.set(ii,getStaticPedestal(ii + 1));
+        }
+        if (debug) {
+            System.out.println("Running and static pedestals better match here:");
             printPedestals();
         }
     }
+
     public void setMinLookbackEvents(int nev) {
-        if (nev<1){
-            System.err.println(
-                    "ECalRunningPedestalDriver:  MinLookbackEvents too small.  Setting to 1.");
-            nev=1;
+        if (nev < 1) {
+            System.err
+                    .println("ECalRunningPedestalDriver:  MinLookbackEvents too small.  Setting to 1.");
+            nev = 1;
         }
         minLookbackEvents = nev;
     }
+
     public void setMaxLookbackEvents(int nev) {
-        if (nev>limitLookbackEvents){
-            System.err.println(
-                    "ECalRunningPedestalDriver:  MaxLookbackEvents too big.  Setting to "
-                     +limitLookbackEvents+".");
-            nev=limitLookbackEvents;
+        if (nev > limitLookbackEvents) {
+            System.err
+                    .println("ECalRunningPedestalDriver:  MaxLookbackEvents too big.  Setting to "
+                            + limitLookbackEvents + ".");
+            nev = limitLookbackEvents;
         }
         maxLookbackEvents = nev;
     }
+
     public void setMaxLookbackTime(int time) {
         maxLookbackTime = time;
     }
@@ -112,31 +118,28 @@
 
     @Override
     protected void process(EventHeader event) {
+
         if (!event.hasCollection(RawCalorimeterHit.class,rawCollectionName))
             return;
         if (!event.hasCollection(LCRelation.class,extraDataRelationsName))
             return;
+
+        Map<RawCalorimeterHit, Double> pedMap = new HashMap<RawCalorimeterHit, Double>();
+
         for (LCRelation rel : event.get(LCRelation.class,extraDataRelationsName)) {
             RawCalorimeterHit hit = (RawCalorimeterHit) rel.getFrom();
             GenericObject extraData = (GenericObject) rel.getTo();
             updatePedestal(event,hit,extraData);
-        }
-        
-        //
-        // Don't care right now whether this persists in output slcio,
-        // just that it is accessible during reconstruction (and it is)
-        //
-        // Another option would be to put hits' running pedestals into HitExtraData.Mode7Data
-        // Or create another LCRelation.  Either would also remove the need for indexing later.
-        //
-        event.put(runningPedestalsName,runningPedestals,Double.class,1,"dog");
-
+            if (!pedMap.containsKey(hit))
+                pedMap.put(hit,getPedestal(hit));
+        }
+        event.put(runningPedestalsName,pedMap);
         if (debug) {
             printPedestals();
         }
     }
 
-    public void updatePedestal(EventHeader event, RawCalorimeterHit hit, GenericObject mode7data) {
+    private void updatePedestal(EventHeader event, RawCalorimeterHit hit, GenericObject mode7data) {
         final int ii = getChannelID(hit) - 1;
         if (ii < 0 || ii >= nChannels) {
             System.err.println(String.format("Event #%d, Invalid id: %d/%d ",
@@ -148,7 +151,8 @@
         final int max = ((HitExtraData.Mode7Data) mode7data).getAmplHigh();
 
         // ignore if pulse at beginning of window:
-        if (max <= 0) return;
+        if (max <= 0)
+            return;
 
         // If new timestamp is older than previous one, restart pedestals.
         // This should never happen unless firmware counter cycles back to zero,
@@ -176,7 +180,7 @@
             // remove old pedestals surpassing limit on lookback time:
             if (maxLookbackTime > 0) {
                 while (eventTimestamps[ii].size() > 0) {
-                    if (eventTimestamps[ii].get(0) < timestamp - maxLookbackTime*1e6) {
+                    if (eventTimestamps[ii].get(0) < timestamp - maxLookbackTime * 1e6) {
                         eventTimestamps[ii].remove(0);
                         eventPedestals[ii].remove(0);
                     } else {
@@ -194,29 +198,34 @@
             }
             runningPedestals.set(ii,avg / eventPedestals[ii].size());
         } else {
-            runningPedestals.set(ii,getStaticPedestal(ii+1));
+            runningPedestals.set(ii,getStaticPedestal(ii + 1));
         }
     }
 
     public double getPedestal(int channel_id) {
-        return runningPedestals.get(channel_id-1);
-//        final int nped = eventPedestals[channel_id - 1].size();
-//        if (nped < minLookbackEvents) return getStaticPedestal(channel_id);
-//        else                          return runningPedestals.get(channel_id - 1);
-    }
+        return runningPedestals.get(channel_id - 1);
+        // final int nped = eventPedestals[channel_id - 1].size();
+        // if (nped < minLookbackEvents) return getStaticPedestal(channel_id);
+        // else return runningPedestals.get(channel_id - 1);
+    }
+
     public double getPedestal(RawCalorimeterHit hit) {
         return getPedestal(getChannelID(hit));
     }
+
     private double getStaticPedestal(int channel_id) {
         EcalChannel cc = ecalConditions.getChannelCollection().findChannel(channel_id);
         return ecalConditions.getChannelConstants(cc).getCalibration().getPedestal();
     }
+
     private double getStaticPedestal(RawCalorimeterHit hit) {
         return getStaticPedestal(getChannelID(hit));
     }
+
     public int getChannelID(RawCalorimeterHit hit) {
         return findChannel(hit.getCellID()).getCalibration().getChannelId();
     }
+
     public EcalChannelConstants findChannel(long cellID) {
         return ecalConditions.getChannelConstants(ecalConditions.getChannelCollection()
                 .findGeometric(cellID));

Modified: java/trunk/users/src/main/java/org/hps/users/baltzell/EcalRawConverter_RunPed.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/baltzell/EcalRawConverter_RunPed.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/baltzell/EcalRawConverter_RunPed.java	Tue Feb  3 13:04:17 2015
@@ -1,6 +1,7 @@
 package org.hps.users.baltzell;
 
 import java.util.List;
+import java.util.Map;
 
 import org.hps.conditions.database.TableConstants;
 import org.hps.conditions.ecal.EcalCalibration;
@@ -56,24 +57,21 @@
    
     // NAB January 2015
     // Choose whether to use static pedestal from database or running pedestal:
-    public double getPedestal(EventHeader event, long cellID) {
-        EcalCalibration calib = findChannel(cellID).getCalibration();
+    public double getPedestal(EventHeader event,RawCalorimeterHit hit)
+    {
         if (useRunningPedestal) {
-            // works, but remove indexing by using LCRelation or adding to Mode7Data
             if (event.hasCollection(Double.class,"EcalRunningPedestals")) {
-                List<Double> peds = event.get(Double.class,"EcalRunningPedestals");
-                final int cid = calib.getChannelId()-1;
-                if (cid < 0 || cid>=peds.size()) {
-                    // logger, or throw exception, ...
-                    System.err.println("EcalRawConverter::getPedestal Bad Channel_id: "+cid);
+                Map<RawCalorimeterHit, Double> runningPedMap=
+                        (Map<RawCalorimeterHit, Double>)
+                        event.get("EcalRunningPedestals");
+                if (!runningPedMap.containsKey(hit)){
+                    System.err.println("Missing Key Dog");
                 } else {
-                    // System.out.println(String.format("%d -  %.2f",channel_id-1,peds.get(cid)));
-                    return peds.get(cid);
+                    return runningPedMap.get(hit);
                 }
             }
         }
-        // pedestal from database:
-        return calib.getPedestal();
+        return findChannel(hit.getCellID()).getCalibration().getPedestal();
     }
 
     public short sumADC(RawTrackerHit hit) {
@@ -112,11 +110,7 @@
     public CalorimeterHit HitDtoA(EventHeader event,RawCalorimeterHit hit, GenericObject mode7Data, int window, double timeOffset) {
         double time = hit.getTimeStamp() / 16.0; //timestamps use the full 62.5 ps resolution
         long id = hit.getCellID();
-//        // Get the channel data.
-        EcalChannelConstants channelData = findChannel(id);
-//        double adcSum = hit.getAmplitude() - window * channelData.getCalibration().getPedestal();
-//        double adcSum = hit.getAmplitude() - window * Mode7Data.getAmplLow(mode7Data);                              //A.C. is this the proper way to pedestal subtract in mode 7?
-        double adcSum = hit.getAmplitude() - window * getPedestal(event,id);
+        double adcSum = hit.getAmplitude() - window * getPedestal(event,hit);
         double rawEnergy = adcToEnergy(adcSum, id);        
         return CalorimeterHitUtilities.create(rawEnergy, time + timeOffset, id);