hps-java/src/main/resources/org/lcsim/hps/steering
diff -N EcalGainDriver.lcsim
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ EcalGainDriver.lcsim 25 Jul 2012 22:27:49 -0000 1.1
@@ -0,0 +1,102 @@
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+ <control>
+ <numberOfEvents>-1</numberOfEvents>
+ <printInputFiles>true</printInputFiles>
+ <printDriversDetailed>true</printDriversDetailed>
+ </control>
+ <execute>
+ <driver name="EventMarkerDriver"/>
+ <driver name="HPSCalibrationDriver"/>
+ <driver name="SVTSetupDriver"/>
+ <driver name="EcalRawConverter"/>
+ <driver name="EcalClusterer"/>
+ <driver name="RawTrackerHitMaker"/>
+ <driver name="RawTrackerHitFitterDriver"/>
+ <driver name="TrackerHitDriver"/>
+ <driver name="TrackerReconDriver"/>
+
+<!--
+ <driver name="SVTOccupancyPlots"/>
+ <driver name="TrackingReconstructionPlots"/>
+ <driver name="HPSSVTDAQMaps"/>
+ <driver name="EcalMonitoringPlots"/>
+-->
+ <driver name="EcalGainDriver"/>
+
+ <driver name="CleanupDriver"/>
+<!--
+ <driver name="LCIOWriter"/>
+-->
+ </execute>
+ <drivers>
+
+
+
+ <driver name="EcalGainDriver"
+ type="org.lcsim.hps.users.phansson.ECalGainDriver">
+ <debug>false</debug>
+ <hideFrame>true</hideFrame>
+ <outputPlotFileName>gaindriver.aida</outputPlotFileName>
+ <ecalGainFileName>clusterlist.txt</ecalGainFileName>
+ </driver>
+
+
+
+
+ <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver"/>
+ <driver name="EcalRawConverter"
+ type="org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver">
+ <ecalCollectionName>EcalCalHits</ecalCollectionName>
+ </driver>
+ <driver name="EcalClusterer"
+ type="org.lcsim.hps.recon.ecal.HPSEcalClusterer">
+ <ecalName>Ecal</ecalName>
+ <ecalCollectionName>EcalCalHits</ecalCollectionName>
+ </driver>
+ <driver name="RawTrackerHitFitterDriver"
+ type="org.lcsim.hps.recon.tracking.HPSRawTrackerHitFitterDriver">
+<!-- <fitAlgorithm>Dumb</fitAlgorithm> -->
+ <fitAlgorithm>Analytic</fitAlgorithm>
+ </driver>
+
+
+ <driver name="TrackerHitDriver"
+ type="org.lcsim.hps.users.mgraham.DataTrackerHitDriver"/>
+ <driver name="EcalDaqPlots" type="org.lcsim.hps.monitoring.ecal.EcalDaqPlots">
+ </driver>
+ <driver name="CleanupDriver"
+ type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+ <collectionNames>TrackerHits SVTRawTrackerHits SVTFittedRawTrackerHits</collectionNames>
+ </driver>
+ <driver name="EcalMonitoringPlots" type="org.lcsim.hps.monitoring.ecal.EcalMonitoringPlots"/>
+ <driver name="EcalEventMonitor" type="org.lcsim.hps.monitoring.ecal.EcalEventMonitor">
+ <eventRefreshRate>1</eventRefreshRate>
+ </driver>
+ <driver name="SVTOccupancyPlots" type="org.lcsim.hps.monitoring.svt.SensorOccupancyPlotsDriver">
+ <rawTrackerHitCollectionName>SVTRawTrackerHits</rawTrackerHitCollectionName>
+ <eventRefreshRate>1</eventRefreshRate>
+ </driver>
+ <driver name="SVTSetupDriver"
+ type="org.lcsim.hps.recon.tracking.HPSSVTSensorSetup">
+ </driver>
+ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+ <eventInterval>1000</eventInterval>
+ </driver>
+ <driver name="RawTrackerHitMaker" type="org.lcsim.hps.recon.tracking.SVTDataToRawTrackerHitDriver"/>
+ <driver name="TrackerReconDriver"
+ type="org.lcsim.hps.recon.tracking.TrackerReconDriver">
+ <debug>false</debug>
+ <strategyResource>/org/lcsim/hps/recon/tracking/strategies/HPS-Test-4pt1.xml</strategyResource>
+ <stripMaxSeparation>20.0</stripMaxSeparation>
+ <stripTolerance>1.0</stripTolerance>
+ </driver>
+ <driver name="TrackingReconstructionPlots" type="org.lcsim.hps.monitoring.svt.TrackingReconstructionPlots">
+ <outputPlots>trackingPlots.aida</outputPlots>
+ </driver>
+ <driver name="LCIOWriter"
+ type="org.lcsim.util.loop.LCIODriver">
+ <outputFilePath>/Users/phansson/work/HPS/software/reco/run/hps_recon.slcio</outputFilePath>
+ </driver>
+ </drivers>
+</lcsim>
hps-java/src/main/java/org/lcsim/hps/users/phansson
diff -N ECalGainDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ECalGainDriver.java 25 Jul 2012 22:27:49 -0000 1.1
@@ -0,0 +1,512 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.lcsim.hps.users.phansson;
+
+import org.lcsim.hps.recon.ecal.*;
+import hep.aida.*;
+import hep.aida.ref.histogram.Histogram1D;
+import hep.aida.ref.plotter.PlotterRegion;
+import java.awt.Button;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.base.BaseRawCalorimeterHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.Subdetector;
+import org.lcsim.hps.monitoring.AIDAFrame;
+import org.lcsim.hps.monitoring.Redrawable;
+import org.lcsim.hps.monitoring.Resettable;
+import org.lcsim.hps.recon.ecal.HPSEcalRawConverterDriver;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.tracking.EcalTrackMatch;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ *
+ * @author phansson+
+ */
+public class ECalGainDriver extends Driver implements Resettable, ActionListener, Redrawable {
+
+ int nevents = 0;
+ boolean debug = true;
+ protected IDDecoder dec = null;
+ protected Subdetector ecal;
+ private String ecalName = "Ecal";
+ String rawCollectionName = "EcalReadoutHits";
+ String ecalReadoutName = "EcalHits";
+ String ecalTmpCollectionName = "EcalCalHitsTmp";
+ private String trackCollectionName = "MatchedTracks";
+ private String ecalClusterCollectionName = "EcalClusters";
+ private String outputPlotFileName = "test.aida";
+ private String ecalGainFileName = "clusterList.txt";
+
+ //Print out cluster and track to file
+ PrintWriter gainWriter=null;
+
+
+
+
+ EcalTrackMatch trkMatchTool = null;
+ HPSEcalRawConverter converter = null;
+
+
+
+ private boolean hideFrame = false;
+ private int refreshRate = 100;
+ private AIDA aida = AIDA.defaultInstance();
+ private IAnalysisFactory af = aida.analysisFactory();
+ IHistogramFactory hf = aida.histogramFactory();
+ private AIDAFrame plotterFrame;
+ private AIDAFrame pePlotterFrame;
+ IPlotter plotter;
+ JComboBox xCombo;
+ JLabel xLabel;
+ JComboBox yCombo;
+ JLabel yLabel;
+ Integer xList[];
+ Integer yList[];
+ JButton blankButton;
+
+ boolean alive = true;
+
+
+
+ IHistogram1D pePlots[][][] = new IHistogram1D[47][11][5];
+ IHistogram2D mpePlot;
+ IHistogram2D spePlot;
+ IHistogram2D hitmap;
+ IHistogram1D[] h_PE_t = new IHistogram1D[5];
+ IHistogram1D[] h_PE_b = new IHistogram1D[5];
+
+
+
+
+
+
+ public void startOfData() {
+ }
+
+ public void detectorChanged(Detector detector) {
+ // Get the Subdetector.
+ ecal = detector.getSubdetector(ecalName);
+
+
+
+ // Cache ref to decoder.
+ dec = ecal.getIDDecoder();
+
+
+
+
+
+
+ pePlotterFrame = new AIDAFrame();
+ pePlotterFrame.setTitle("Gain Frame");
+
+ //plotterFrame = new AIDAFrame();
+ //plotterFrame.setTitle("Gain General");
+
+ IPlotterStyle style;
+
+
+ IPlotter plotter_hitmap_gr = af.createPlotterFactory().create();
+ plotter_hitmap_gr.createRegions(1,3,0);
+ plotter_hitmap_gr.setTitle("Cluster hit map");
+ plotter_hitmap_gr.style().statisticsBoxStyle().setVisible(false);
+ pePlotterFrame.addPlotter(plotter_hitmap_gr);
+
+ hitmap = aida.histogram2D("Cluster hit map", 47, -23.5, 23.5, 11, -5.5, 5.5);
+ plotter_hitmap_gr.region(0).plot(hitmap);
+
+ style = plotter_hitmap_gr.region(0).style();
+ style.setParameter("hist2DStyle", "colorMap");
+ style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ ((PlotterRegion) plotter_hitmap_gr.region(0)).getPlot().setAllowUserInteraction(true);
+ ((PlotterRegion) plotter_hitmap_gr.region(0)).getPlot().setAllowPopupMenus(true);
+
+ IPlotter[] plotter_PoverE = new IPlotter[5];
+
+
+ for(int iE=0;iE<=4;++iE) {
+
+ String str = iE==0?"":(" iE="+iE);
+
+ h_PE_t[iE] = aida.histogram1D("E over p top"+str,50,0,2);
+ h_PE_b[iE] = aida.histogram1D("E over p bottom"+str,50,0,2);
+
+ plotter_PoverE[iE] = af.createPlotterFactory().create();
+ plotter_PoverE[iE].createRegions(1,2,0);
+ plotter_PoverE[iE].setTitle("E over P"+str);
+ plotter_PoverE[iE].style().statisticsBoxStyle().setVisible(true);
+ pePlotterFrame.addPlotter(plotter_PoverE[iE]);
+
+ plotter_PoverE[iE].region(0).plot(h_PE_t[iE]);
+ plotter_PoverE[iE].region(1).plot(h_PE_b[iE]);
+ }
+
+ plotter = af.createPlotterFactory().create();
+ plotter.createRegions(1,3,0);
+ plotter.setTitle("Gain Plots");
+
+ pePlotterFrame.addPlotter(plotter);
+
+ mpePlot = aida.histogram2D("<E over p>",47,-23.5,23.5,11,-5.5,5.5);
+ plotter.region(0).plot(mpePlot);
+ spePlot = aida.histogram2D("RMS(E over p)",47,-23.5,23.5,11,-5.5,5.5);
+ plotter.region(1).plot(spePlot);
+ plotter.region(0).style().statisticsBoxStyle().setVisible(false);
+ plotter.region(0).style().setParameter("hist2DStyle", "colorMap");
+ plotter.region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ plotter.region(1).style().statisticsBoxStyle().setVisible(false);
+ plotter.region(1).style().setParameter("hist2DStyle", "colorMap");
+ plotter.region(1).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+
+
+
+ for(int iE=0;iE<=4;++iE) {
+ for(int irow=-5;irow<=5;++irow) {
+ for(int icol=-23;icol<=23;++icol) {
+ if(iE==0) {
+ pePlots[icol+23][irow+5][iE] = aida.histogram1D("E over p x=" + icol + " y=" + irow, 50, 0,2);
+ } else {
+ pePlots[icol+23][irow+5][iE] = aida.histogram1D("E over p x=" + icol + " y=" + irow + " iE="+iE, 50, 0,2);
+ }
+ }
+ }
+ }
+
+
+ xList = new Integer[46];
+ yList = new Integer[10];
+ int in=0;
+ for(int i=-5;i<=5;++i) {
+ if(i!=0) {
+ yList[in] = i;
+ ++in;
+ }
+ }
+ in=0;
+ for(int i=-23;i<=23;++i) {
+ if(i!=0) {
+ xList[in] = i;
+ ++in;
+ }
+ }
+
+
+ xCombo = new JComboBox(xList);
+ xCombo.addActionListener(this);
+ xLabel = new JLabel("x");
+ xLabel.setLabelFor(xCombo);
+ pePlotterFrame.getControlsPanel().add(xLabel);
+ pePlotterFrame.getControlsPanel().add(xCombo);
+ yCombo = new JComboBox(yList);
+ yCombo.addActionListener(this);
+ yLabel = new JLabel("y");
+ yLabel.setLabelFor(xCombo);
+ pePlotterFrame.getControlsPanel().add(yLabel);
+ pePlotterFrame.getControlsPanel().add(yCombo);
+
+
+ plotter.region(2).plot(pePlots[-5 + 23][2 + 5 - 1][0]);
+ xCombo.setSelectedIndex(-5 + 23);
+ yCombo.setSelectedIndex(2 + 5 - 1);
+
+ blankButton = new JButton("Hide histogram");
+ pePlotterFrame.getControlsPanel().add(blankButton);
+ blankButton.addActionListener(this);
+
+
+
+
+
+ if(!hideFrame) {
+
+ //plotterFrame.pack();
+ //plotterFrame.setVisible(true);
+
+ pePlotterFrame.pack();
+ pePlotterFrame.setVisible(true);
+
+ }
+
+
+
+
+
+
+
+ }
+
+ public ECalGainDriver() {
+ converter = new HPSEcalRawConverter();
+ trkMatchTool = new EcalTrackMatch(false);
+
+
+
+ try {
+ gainWriter = new PrintWriter(ecalGainFileName);
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(ECalGainDriver.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+
+
+ }
+
+
+
+
+
+ public void setDebug(boolean flag) {
+ this.debug = flag;
+ }
+
+ public void setOutputPlotFileName( String name ) {
+ this.outputPlotFileName = name;
+ }
+
+ public void setEcalGainFileName( String name ) {
+ this.ecalGainFileName = name;
+ }
+
+ public void setHideFrame( boolean val ) {
+ this.hideFrame = val;
+ }
+
+
+
+ public void process(EventHeader event) {
+ ++nevents;
+ if( debug ) {
+ System.out.println("Processing event " + nevents);
+ }
+
+ if( refreshRate > 0 && nevents % refreshRate == 0 ) {
+ redraw();
+ }
+
+
+
+ List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, ecalClusterCollectionName);
+
+ if(debug) System.out.println(clusters.size() + " clusters found");
+
+
+ List<Track> tracks = null;
+ if(event.hasCollection(Track.class, trackCollectionName)) {
+ tracks = event.get(Track.class, trackCollectionName);
+ }
+
+ if(debug) System.out.println( tracks.size() + " tracks in this event");
+
+ if(tracks==null) return;
+
+
+
+ for(HPSEcalCluster cl : clusters) {
+
+
+
+
+ int[] pos = getCrystalPair(cl);
+ int side = pos[1]>0 ? 0 : 1; //top or bottom
+
+ if(debug) System.out.println("Looking at cluster at ix=" + pos[0] + " iy=" + pos[1]);
+
+ trkMatchTool.setCluster(cl);
+ trkMatchTool.match(tracks);
+
+ if(!trkMatchTool.isMatchedY(50)) {
+ if(debug) System.out.println("Cluster not matched to a track");
+ continue;
+ }
+
+
+ if(debug) System.out.println("Cluster matched to track at distance Y " + trkMatchTool.getDistanceToTrackInY() + " and X " + trkMatchTool.getDistanceToTrackInX());
+
+
+ double P = trkMatchTool.getMatchedTrack().getPX()*1000;
+ double E = cl.getEnergy();
+ double Ep = E;
+ double Eoverp = Ep/P;
+
+ if(debug) System.out.println("P " + P + " E " + E);
+
+
+// double Eseed = cl.getSeedHit().getRawEnergy();
+// double ErawSum = 0;
+// for(CalorimeterHit hit : cl.getCalorimeterHits()) {
+// ErawSum += hit.getRawEnergy();
+// }
+//
+// if(Eseed/ErawSum<0.6) continue;
+//
+ int ebin = -1;
+ if(P>500&&P<=700) ebin=1;
+ else if(P>700&&P<=900) ebin=2;
+ else if(P>900&&P<=1100) ebin=3;
+ else ebin=4;
+
+ if(side==0) {
+ h_PE_t[0].fill(Eoverp);
+ h_PE_t[ebin].fill(Eoverp);
+
+ }
+ else {
+ h_PE_b[0].fill(Eoverp);
+ h_PE_b[ebin].fill(Eoverp);
+ }
+
+ hitmap.fill(pos[0], pos[1]);
+
+ pePlots[pos[0]+23][pos[1]+5][0].fill(Eoverp);
+
+ pePlots[pos[0]+23][pos[1]+5][ebin].fill(Eoverp);
+
+
+ gainWriter.print(event.getEventNumber()+" "+P+" "+E+" "+pos[0]+" "+pos[1]);
+ for(CalorimeterHit hit: cl.getCalorimeterHits()) {
+ gainWriter.print(" "+hit.getIdentifierFieldValue("ix")+" "+hit.getIdentifierFieldValue("iy")+" "+hit.getRawEnergy()+" "+converter.gain );
+ }
+ gainWriter.println("");
+
+
+
+
+
+ }
+
+
+
+
+ }
+
+
+
+
+
+ public int[] getCrystalPair(HPSEcalCluster cluster) {
+ int[] pos = new int[2];
+ pos[0] = cluster.getSeedHit().getIdentifierFieldValue("ix");
+ pos[1] = cluster.getSeedHit().getIdentifierFieldValue("iy");
+
+ //System.out.println("cluster ix,iy " + pos[0] + "," + pos[1] + " from pos " + cluster.getSeedHit().getPositionVec().toString());
+ return pos;
+ //getCrystalPair(cluster.getPosition());
+ }
+
+
+
+
+
+
+
+
+
+ public void endOfData() {
+
+ redraw();
+
+ if (outputPlotFileName != "")
+ try {
+ aida.saveAs(outputPlotFileName);
+ } catch (IOException ex) {
+ Logger.getLogger(ECalGainDriver.class.getName()).log(Level.SEVERE, "Couldn't save aida plots to file " + outputPlotFileName, ex);
+ }
+ //displayFastTrackingPlots();
+
+ gainWriter.close();
+
+ }
+
+ @Override
+ public void reset() {
+ if (plotter != null) {
+ plotter.hide();
+ plotter.destroyRegions();
+ for (int x = -23; x <= 23; x++) { // slot
+ for (int y = -5; y <= 5; y++) { // crate
+ for(int iE=0;iE<=4;++iE) {
+ pePlots[x + 23][y + 5][iE].reset();
+ }
+ }
+ }
+ }
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent ae) {
+
+ if(ae.getSource()==blankButton) {
+ plotter.region(2).clear();
+ } else {
+ //get the col and row to display
+ Integer x = (Integer) xCombo.getSelectedItem();
+ Integer y = (Integer) yCombo.getSelectedItem();
+ plotter.region(2).clear();
+ plotter.region(2).plot(pePlots[x+23][y+5][0]);
+ }
+
+
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void redraw() {
+
+ //do something if needed
+ mpePlot.reset();
+ spePlot.reset();
+
+ for(int irow=-5;irow<=5;++irow) {
+ for(int icol=-23;icol<=23;++icol) {
+ //System.out.println(" redraw irow " + irow + " icol " + icol + " entries " + pePlots[icol+23][irow+5].entries());
+ if(pePlots[icol+23][irow+5][0].entries()>10) {
+ mpePlot.fill(icol,irow,pePlots[icol+23][irow+5][0].mean());
+ spePlot.fill(icol,irow,pePlots[icol+23][irow+5][0].rms());
+
+ }
+ }
+ }
+
+
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setEventRefreshRate(int eventRefreshRate) {
+ refreshRate = eventRefreshRate;
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+
+}