Author: [log in to unmask] Date: Fri Feb 20 16:56:08 2015 New Revision: 2173 Log: Adding pedestal funcionality. Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EcalPedestals.lcsim Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java (added) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java Fri Feb 20 16:56:08 2015 @@ -0,0 +1,198 @@ +package org.hps.recon.ecal; + +import hep.aida.IHistogram1D; + +import java.io.FileWriter; +import java.io.IOException; + +import org.hps.conditions.database.TableConstants; +import org.hps.conditions.ecal.EcalChannel; +import org.hps.conditions.ecal.EcalConditions; +import org.lcsim.conditions.ConditionsManager; +import org.lcsim.event.EventHeader; +import org.lcsim.event.GenericObject; +import org.lcsim.event.LCRelation; +import org.lcsim.event.RawCalorimeterHit; +import org.lcsim.geometry.Detector; +import org.lcsim.util.Driver; +import org.lcsim.util.aida.AIDA; + +/** + * Calculate pedestals from Mode-7 Data. + * + * To be used online with org.hps.monitoring.ecal.plots.EcalPedestalViewer + * and ET-ring to create config files for DAQ and/or conditions DB. + * + * When user clicks "Disconnect" in monitoring app (after confirming sufficient + * statistics), endOfData is called and config files will be written. Copying + * files to proper location for DAQ must be done manually. + *gg + * TODO: Merge with EcalCalibrationDriver (which works on Mode-1). + * + * @version $Id: EcalPedestalCalculator.java,v 0.1 2015/02/20 00:00:00 + * @author <[log in to unmask]> + */ +public class EcalPedestalCalculator extends Driver { + + private static final String rawCollectionName = "EcalReadoutHits"; + private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations"; + + private String histoNameFormat = "Ecal/Pedestals/Mode7/ped%3d"; + + private String outputFilePrefix = ""; + private static final String[] filenamesDAQ = { "fadc37.ped", "fadc39.ped" }; + private static final String filenameDB = "EcalPedsForDB.txt"; + + // The number of samples used by FADCs to report an event's pedestal. + private int nSamples = 4; + + private boolean writeFileForDB=true; + private boolean writeFileForDAQ=true; + + private EcalConditions ecalConditions = null; + + AIDA aida = AIDA.defaultInstance(); + + private int nDetectorChanges = 0; + + public EcalPedestalCalculator() { + } + + public void setOutputFilePrefix(String prefix) { + outputFilePrefix = "_"+prefix; + } + + @Override + protected void startOfData() { + } + + @Override + public void endOfData() { + if (writeFileForDAQ) writeFileForDAQ(); + if (writeFileForDB) writeFileForDB(); + } + + @Override + public void detectorChanged(Detector detector) { + + if (nDetectorChanges++ > 1) { + throw new RuntimeException("No Detector Change Allowed."); + } + ecalConditions = ConditionsManager.defaultInstance() + .getCachedConditions(EcalConditions.class,TableConstants.ECAL_CONDITIONS) + .getCachedData(); + + aida.tree().cd("/"); + for (EcalChannel cc : ecalConditions.getChannelCollection()) { + aida.histogram1D(getHistoName(cc),181,19.5,200.5); + } + + } + + private String getHistoName(EcalChannel cc) { + return String.format(histoNameFormat,cc.getChannelId()); + } + + private void writeFileForDB() { + FileWriter wout = null; + try { + wout = new FileWriter(outputFilePrefix + filenameDB); + for (int cid=1; cid<=442; cid++) { + EcalChannel cc= findChannel(cid); + IHistogram1D hh = aida.histogram1D(getHistoName(cc)); + wout.write(String.format("%3d %7.3f %7.3f\n",cid, + hh.mean(),hh.rms()*Math.sqrt(nSamples))); + } + } catch (IOException ee) { + throw new RuntimeException("Error writing file.",ee); + } finally { + if (wout != null) { + try { + wout.close(); + } catch (IOException ee) { + ee.printStackTrace(); + } + } + } + } + private void writeFileForDAQ() { + FileWriter[] wout = { null, null }; + try { + for (int crate = 1; crate <= 2; crate++) { + wout[crate - 1] = new FileWriter(outputFilePrefix + filenamesDAQ[crate - 1]); + for (int slot = 3; slot <= 20; slot++) { + for (int chan = 0; chan < 16; chan++) { + if (slot > 9 && slot < 14) + continue; + if (slot == 20 && chan > 12) + continue; + EcalChannel cc = findChannel(crate,slot,chan); + IHistogram1D hh = aida.histogram1D(getHistoName(cc)); + wout[crate - 1].write(String.format("%2d %2d %7.3f %7.3f\n",slot,chan, + hh.mean(),hh.rms()*Math.sqrt(nSamples))); + } + } + } + } catch (IOException ee) { + throw new RuntimeException("Error writing file.",ee); + } finally { + if (wout[0] != null || wout[1] != null) { + try { + if (wout[0] != null) + wout[0].close(); + if (wout[1] != null) + wout[1].close(); + } catch (IOException ee) { + ee.printStackTrace(); + } + } + } + } + + @Override + protected void process(EventHeader event) { + if (event.hasCollection(RawCalorimeterHit.class,rawCollectionName)) { + if (event.hasCollection(LCRelation.class,extraDataRelationsName)) { + for (LCRelation rel : event.get(LCRelation.class,extraDataRelationsName)) { + RawCalorimeterHit hit = (RawCalorimeterHit) rel.getFrom(); + GenericObject extraData = (GenericObject) rel.getTo(); + fillHisto(event,hit,extraData); + } + } + } + } + + private void fillHisto(EventHeader event, RawCalorimeterHit hit, GenericObject mode7data) { + final int min = ((HitExtraData.Mode7Data) mode7data).getAmplLow(); + final int max = ((HitExtraData.Mode7Data) mode7data).getAmplHigh(); + // ignore if pulse at beginning of window: + if (max <= 0) return; + EcalChannel cc = findChannel(hit); + if (cc == null) { + System.err.println("Hit doesn't correspond to ecalchannel."); + return; + } + aida.histogram1D(getHistoName(cc)).fill(min); + } + + public EcalChannel findChannel(int channel_id) { + return ecalConditions.getChannelCollection().findChannel(channel_id); + } + + public EcalChannel findChannel(RawCalorimeterHit hit) { + return ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); + } + + public EcalChannel findChannel(int crate, int slot, int chan) { + for (EcalChannel cc : ecalConditions.getChannelCollection()) { + if (crate == cc.getCrate() && + slot == cc.getSlot() && + chan == cc.getChannel()) { + return cc; + } + } + throw new RuntimeException(String.format( + "Could not find channel: (crate,slot,channel)=(%d,%d,%d)",crate,slot,chan)); + } + +} Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalMonitoringUtilities.java Fri Feb 20 16:56:08 2015 @@ -5,9 +5,13 @@ * * @author Jeremy McCormick <[log in to unmask]> * @author Andrea Celentano <[log in to unmask]> + * @author <[log in to unmask]> */ public final class EcalMonitoringUtilities { + final static int XOFFSET = 23; + final static int YOFFSET = 5; + private EcalMonitoringUtilities() { } @@ -32,4 +36,16 @@ } return ret; } + + public static int getChannelIdFromRowColumn(int row, int col) + { + int ix = col + XOFFSET + (col>0 ? -1 : 0); + int iy = row + YOFFSET + (row>0 ? -1 : 0); + iy = YOFFSET*2 - iy - 1; + int cid = ix + 2*XOFFSET*iy + 1; + if (row== 1 && col>-10) cid -= 9; + else if (row==-1 && col<-10) cid -= 9; + else if (row < 0) cid -= 18; + return cid; + } } Added: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java (added) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java Fri Feb 20 16:56:08 2015 @@ -0,0 +1,87 @@ +package org.hps.monitoring.ecal.plots; + +import hep.aida.IHistogram1D; +import hep.aida.IPlotter; +import hep.aida.IPlotterFactory; +import hep.aida.IPlotterStyle; + +import java.awt.Point; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; + +import org.hps.monitoring.ecal.eventdisplay.ui.PDataEventViewer; +import org.hps.monitoring.ecal.eventdisplay.ui.PEventViewer; +import org.hps.monitoring.ecal.eventdisplay.ui.Viewer; +import org.hps.monitoring.ecal.eventdisplay.util.CrystalEvent; +import org.hps.monitoring.ecal.eventdisplay.util.CrystalListener; +import org.lcsim.geometry.Detector; +import org.lcsim.util.Driver; +import org.lcsim.util.aida.AIDA; +/* + * Display histograms created by org.hps.recon.ecal.EcalPedestalCalculator + * + * When user clicks on crystal in Kyle's event viewer, the corresponding channel's + * pedestal histogram is drawn. + * + * @version $Id: EcalPedestalViewer.java,v 0.1 2015/02/20 00:00:00 + * @author <[log in to unmask]> + */ +public class EcalPedestalViewer extends Driver implements CrystalListener, ActionListener { + + // this has to match the one in EcalPedstalCalculator: + private String histoNameFormat = "Ecal/Pedestals/Mode7/ped%3d"; + + private AIDA aida = AIDA.defaultInstance(); + private IPlotter plotter; + private IPlotterFactory plotterFactory; + private IPlotterStyle pstyle; + private PEventViewer viewer; + + @Override + public void detectorChanged(Detector detector) { + plotterFactory = aida.analysisFactory().createPlotterFactory("ECal Peds"); + plotter = plotterFactory.create("ECal Peds"); + plotter.createRegions(1,1); + plotter.show(); + } + + @Override + public void startOfData() { + File config = new File("ecal-mapping-config.csv"); + if(config.exists() && config.canRead()) { + try { viewer = new PDataEventViewer(config.getAbsolutePath()); } + catch (IOException e) { viewer = new PEventViewer(); } + } else { viewer = new PEventViewer(); } + viewer.addCrystalListener(this); + viewer.setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent ae) { } + + @Override + public void crystalActivated(CrystalEvent e) { } + + @Override + public void crystalDeactivated(CrystalEvent e) { } + + @Override + public void crystalClicked(CrystalEvent e) { + aida.tree().cd("/"); + Point ecalPoint = Viewer.toEcalPoint(e.getCrystalID()); + if (ecalPoint.x == 0 || ecalPoint.y == 0) return; + if (EcalMonitoringUtilities.isInHole(ecalPoint.y,ecalPoint.x)) return; + final int cid=EcalMonitoringUtilities.getChannelIdFromRowColumn(ecalPoint.y,ecalPoint.x); + IHistogram1D hist=aida.histogram1D(String.format(histoNameFormat,cid)); + if (hist==null) { + System.err.println("Running the Driver?"); + } else { + plotter.region(0).clear(); + plotter.region(0).plot(hist,pstyle); + } + } + + +} Added: java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EcalPedestals.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EcalPedestals.lcsim (added) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EcalPedestals.lcsim Fri Feb 20 16:56:08 2015 @@ -0,0 +1,20 @@ +<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="EcalPedestalCalculator"/> + <driver name="EcalRunningPedestal"/> + <driver name="EcalPedestalViewer"/> + <driver name="CleanupDriver" /> + </execute> + <drivers> + <driver name="EcalPedestalCalculator" type="org.hps.recon.ecal.EcalPedestalCalculator"> + </driver> + <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.ECalRunningPedestalDriver"> + <minLookbackEvents>10</minLookbackEvents> + <maxLookbackEvents>50</maxLookbackEvents> + </driver> + <driver name="EcalPedestalViewer" type="org.hps.monitoring.ecal.plots.EcalPedestalViewer"> + </driver> + <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" /> + </drivers> +</lcsim>