Print

Print


Author: [log in to unmask]
Date: Tue Nov 25 01:56:05 2014
New Revision: 1585

Log:
Add Driver and basic steering for generating ECAL calibrations (pedestals and noise) from an ECAL raw hit collection, assuming window mode.

Added:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java
    java/trunk/steering-files/src/main/resources/org/hps/steering/calibration/
    java/trunk/steering-files/src/main/resources/org/hps/steering/calibration/EcalCalibrations.lcsim

Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java	(added)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java	Tue Nov 25 01:56:05 2014
@@ -0,0 +1,135 @@
+package org.hps.recon.ecal;
+
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
+import hep.aida.IFunction;
+import hep.aida.IFunctionFactory;
+import hep.aida.IHistogram1D;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.hps.conditions.api.ConditionsObjectException;
+import org.hps.conditions.api.ConditionsRecord;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.database.TableConstants;
+import org.hps.conditions.database.TableMetaData;
+import org.hps.conditions.ecal.EcalCalibration;
+import org.hps.conditions.ecal.EcalCalibration.EcalCalibrationCollection;
+import org.hps.conditions.ecal.EcalChannel;
+import org.hps.conditions.ecal.EcalConditions;
+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;
+
+/**
+ * This Driver will generate a {@link org.hps.conditions.EcalCalibration} collection
+ * from the ADC value distributions of raw ECAL data.  It may optionally insert this
+ * information into the conditions database using the file's run number.
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class EcalCalibrationsDriver extends Driver {
+    
+    EcalConditions ecalConditions = null;
+    DatabaseConditionsManager conditionsManager = null;
+    AIDA aida = AIDA.defaultInstance();
+    boolean loadCalibrations = false;
+    Set<Integer> runs = new HashSet<Integer>();
+    
+    public void setLoadCalibrations(boolean loadCalibrations) {
+        this.loadCalibrations = loadCalibrations;
+    }
+    
+    public void detectorChanged(Detector detector) {
+        conditionsManager = DatabaseConditionsManager.getInstance();
+        ecalConditions = conditionsManager.getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
+        for (EcalChannel channel : ecalConditions.getChannelCollection().getObjects()) {
+            aida.histogram1D("ECAL Channel " + channel.getChannelId(), 300, 0, 300.);
+        }
+    }
+    
+    public void process(EventHeader event) {
+        runs.add(event.getRunNumber());
+        if (event.hasCollection(RawTrackerHit.class, "EcalReadoutHits")) {
+            List<RawTrackerHit> hits = event.get(RawTrackerHit.class, "EcalReadoutHits");
+            for (RawTrackerHit hit : hits) {
+                EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID());
+                if (channel != null) {
+                    int channelId = channel.getChannelId();
+                    for (short adcValue : hit.getADCValues()) {
+                        aida.histogram1D("ECAL Channel " + channelId).fill(adcValue);
+                    }
+                }
+            }
+        }
+    }
+    
+    public void endOfData() {
+        
+        if (runs.size() == 0) {
+            throw new RuntimeException("There was no data processed.");
+        }
+        List<Integer> runList = new ArrayList<Integer>(runs);
+        Collections.sort(runList);
+        
+        IFunctionFactory functionFactory = aida.analysisFactory().createFunctionFactory(null);
+        IFitFactory fitFactory = aida.analysisFactory().createFitFactory();
+        
+        EcalCalibrationCollection calibrations = new EcalCalibrationCollection();
+        TableMetaData tableMetaData = conditionsManager.findTableMetaData(TableConstants.ECAL_CALIBRATIONS);
+        calibrations.setTableMetaData(tableMetaData);
+        
+        for (EcalChannel channel : ecalConditions.getChannelCollection().getObjects()) {
+            IHistogram1D histogram = aida.histogram1D("ECAL Channel " + channel.getChannelId());
+                                 
+            IFunction function = functionFactory.createFunctionByName("Gaussian", "G");        
+            IFitter fitter = fitFactory.createFitter("chi2", "jminuit");
+            double[] parameters = new double[3];
+            parameters[0] = histogram.maxBinHeight();
+            parameters[1] = histogram.mean();
+            parameters[2] = histogram.rms();
+            function.setParameters(parameters);
+            IFitResult fitResult = fitter.fit(histogram, function);
+            int channelId = channel.getChannelId();
+                        
+            double mean = fitResult.fittedParameter("mean");
+            double sigma = fitResult.fittedParameter("sigma");
+            EcalCalibration calibration = new EcalCalibration(channelId, mean, sigma);
+            try {
+                calibrations.add(calibration);
+            } catch (ConditionsObjectException e) {
+                throw new RuntimeException(e);
+            }
+        } 
+        System.out.println(calibrations.toString());
+        if (loadCalibrations) {
+            int collectionId = conditionsManager.getNextCollectionID(TableConstants.ECAL_CALIBRATIONS);
+            try {
+                calibrations.setCollectionId(collectionId);
+                calibrations.insert();
+                int runStart = runList.get(0);
+                int runEnd = runList.get(runList.size() - 1);
+                ConditionsRecord conditionsRecord = new ConditionsRecord(
+                        calibrations.getCollectionId(), 
+                        runStart, 
+                        runEnd, 
+                        TableConstants.ECAL_CALIBRATIONS,
+                        TableConstants.ECAL_CALIBRATIONS, 
+                        "Auto generated by EcalCalibrationsDriver.", 
+                        "eng_run");
+                conditionsRecord.setTableMetaData(conditionsManager.findTableMetaData(TableConstants.CONDITIONS_RECORD));
+                conditionsRecord.insert();
+            } catch (ConditionsObjectException | SQLException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+}

Added: java/trunk/steering-files/src/main/resources/org/hps/steering/calibration/EcalCalibrations.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/calibration/EcalCalibrations.lcsim	(added)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/calibration/EcalCalibrations.lcsim	Tue Nov 25 01:56:05 2014
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        <driver name="EcalCalibrationsDriver"/>
+        <driver name="AidaSaveDriver"/>
+    </execute>
+    <drivers>
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"/>
+        <driver name="EcalCalibrationsDriver" type="org.hps.recon.ecal.EcalCalibrationsDriver">
+            <loadCalibrations>true</loadCalibrations>
+        </driver>
+        <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
+            <outputFileName>EcalCalibrationPlots.aida</outputFileName>
+        </driver>
+    </drivers>
+</lcsim>