Commit in hps-java/src/main on MAIN | |||
resources/org/lcsim/hps/steering/EcalGainDriver.lcsim | +102 | added 1.1 | |
java/org/lcsim/hps/users/phansson/ECalGainDriver.java | +512 | added 1.1 | |
+614 |
Driver to print for offline use.
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>
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."); + } + + +}
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1