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>