Print

Print


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>