Print

Print


Commit in hps-java/src/main/java/org/lcsim/hps/evio on MAIN
EvioConsumer.java+271-631.4 -> 1.5
current working version of ET consumer example

hps-java/src/main/java/org/lcsim/hps/evio
EvioConsumer.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- EvioConsumer.java	12 Mar 2012 21:30:36 -0000	1.4
+++ EvioConsumer.java	16 Mar 2012 19:10:47 -0000	1.5
@@ -2,12 +2,18 @@
 
 import hep.aida.IAnalysisFactory;
 import hep.aida.ICloud1D;
+import hep.aida.IHistogram1D;
 import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
 
+import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.freehep.record.loop.event.RecordSuppliedEvent;
 import org.jlab.coda.et.EtAttachment;
 import org.jlab.coda.et.EtConstants;
 import org.jlab.coda.et.EtEvent;
@@ -21,8 +27,21 @@
 import org.jlab.coda.jevio.CompositeData;
 import org.jlab.coda.jevio.EvioEvent;
 import org.jlab.coda.jevio.EvioReader;
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseLCSimEvent;
 import org.lcsim.event.base.BaseRawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.job.JobControlManager;
+import org.lcsim.util.Driver;
+import org.lcsim.util.DriverAdapter;
 import org.lcsim.util.aida.AIDA;
 
 /**
@@ -34,6 +53,14 @@
  */
 public class EvioConsumer {
     
+    private static final String detectorName = "HPS-Test-JLAB-v4pt0";
+    private static final String trackerName = "Tracker";
+    private static final String rawTrackerHitCollectionName = "RawTrackerHitMaker_RawTrackerHits";
+    private static final String readoutName = "TrackerHits";
+    private static final String trackCollectionName = "MatchedTracks";
+    private static final String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D";
+    private static final String lcsimXml = "/org/lcsim/hps/steering/EtTest.lcsim";
+            
     public EvioConsumer() {
     }
 
@@ -201,124 +228,244 @@
             // array of events
             EtEvent[] mevs = null;
             
-            // Test plots.
+            // Data plots.
             AIDA aida = AIDA.defaultInstance();
-            //ICloud1D idsPlot = aida.cloud1D("Cell IDs");
             //ICloud1D timePlot = aida.cloud1D("Time");
-            ICloud1D adcValuePlot = aida.cloud1D("ADC Value");
-            ICloud1D eventRatePlot = aida.cloud1D("Event Rate [Hz]");
-            ICloud1D hitCountPlot = aida.cloud1D("Number of RawTrackerHits in Event");
-            
+            aida.tree().cd("/");
+            IHistogram1D adcValuePlot = aida.histogram1D("ADC Value", 500, 0, 1000);            
+            ICloud1D eventRatePlot = aida.cloud1D("Event Rate [Hz]");            
+            IHistogram1D rawHitCountPlot = aida.histogram1D("Number of RawTrackerHits in Event", 100, 0, 100);                        
+            IHistogram1D tkrHitCountPlot = aida.histogram1D("Number of TrackerHits in Event", 50, 0, 50);            
+            IHistogram1D tkrCountPlot = aida.histogram1D("Number of Tracks in Event", 20, 0, 20);
+            ICloud1D hitsPerTrackPlot = aida.cloud1D("Number of Hits per Track");
+            IHistogram1D tkrMomXPlot = aida.histogram1D("Track Px", 200, 0, 2.0);
+            IHistogram1D tkrMomYPlot = aida.histogram1D("Track Py", 160, -0.2, 0.2);
+            IHistogram1D tkrMomZPlot = aida.histogram1D("Track Pz", 160, -0.2, 0.2);
+            IHistogram1D tkrMomPlot = aida.histogram1D("Track P", 200, 0, 10.0);
+                        
             IAnalysisFactory fac = aida.analysisFactory();
-            IPlotter plotter = fac.createPlotterFactory().create("Plot");
-            plotter.createRegions(2,2);
+            IPlotter plotter = fac.createPlotterFactory().create("HPS SVT Plots");
+            plotter.style().dataStyle().errorBarStyle().setVisible(false);
+            plotter.createRegions(4,4);
             plotter.region(0).plot(adcValuePlot);
             plotter.region(1).plot(eventRatePlot);
-            plotter.region(2).plot(hitCountPlot);
+            plotter.region(2).plot(rawHitCountPlot);
+            plotter.region(3).plot(tkrHitCountPlot);
+            plotter.region(4).plot(tkrCountPlot);
+            plotter.region(5).plot(hitsPerTrackPlot);
+            plotter.region(6).plot(tkrMomXPlot);
+            plotter.region(7).plot(tkrMomYPlot);
+            plotter.region(8).plot(tkrMomZPlot);
+            plotter.region(9).plot(tkrMomPlot);
             plotter.show();
-                        
-            // Number of current event from 0.
-            int eventCount = 0;
+                                                           
+            // Job manager to run LCSim.
+            JobControlManager jobMgr = new JobControlManager();
+            jobMgr.checkInputFiles(false);
+            InputStream is = (new EvioConsumer()).getClass().getResourceAsStream(lcsimXml);
+            jobMgr.setup(is);
+            
+            // Get list of Drivers.
+            List<Driver> drivers = jobMgr.getDriverExecList();
+            
+            // Wrap Drivers with DriverAdapter.
+            Driver topDriver = new Driver();
+            for (Driver driver : drivers) {
+                topDriver.add(driver);
+            }
+            DriverAdapter driverAdapter = new DriverAdapter(topDriver);
+                                    
+            // Call wrapper to startOfData() on DriverAdapter.
+            driverAdapter.configure(null);            
             
+            // Create a dummy event in order to get Detector conditions.
+            BaseLCSimEvent dummyEvent = new BaseLCSimEvent(0, 0, detectorName);
+            Detector detector = dummyEvent.getDetector();
+                                    
+            // Make a list of sensors in the SVT.
+            List<SiSensor> sensors = detector.getSubdetector("Tracker").getDetectorElement().findDescendants(SiSensor.class);            
+            
+            // Setup occupancy plots.
+            IPlotter plotter2 = fac.createPlotterFactory().create("HPS SVT Sensor Occupancy Plots");
+            IPlotterStyle style = plotter2.style();
+            style.dataStyle().fillStyle().setColor("yellow");
+            //style.dataStyle().lineStyle().setColor("yellow");
+            style.dataStyle().errorBarStyle().setVisible(false);
+            plotter2.createRegions(5, 4);
+            int ns = sensors.size();
+            for (int i=0; i<ns; i++) {
+                IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName(), 640, 0, 639);
+                plotter2.region(i).plot(occupancyPlot);
+            }
+            plotter2.show();
+            
+            // Data structure for occupancy calculations by sensor.
+            Map<SiSensor,int[]> occupancyMap = new HashMap<SiSensor,int[]>();
+            for (SiSensor sensor : sensors) {
+                occupancyMap.put(sensor, new int[640]);
+            }
+            
+            // Setup normalized occupancy plots.
+            IPlotter plotter3 = fac.createPlotterFactory().create("HPS SVT Normalized Sensor Occupancy Plots");
+            IPlotterStyle style3 = plotter3.style();
+            style3.dataStyle().fillStyle().setColor("green");
+            style3.dataStyle().markerStyle().setColor("green");
+            style3.dataStyle().errorBarStyle().setVisible(false);
+            style3.statisticsBoxStyle().setVisible(false);
+            plotter3.createRegions(5, 4);
+            for (int i=0; i<ns; i++) {
+                IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName() + " Normalized", 640, 0, 639);
+                plotter3.region(i).plot(occupancyPlot);
+            }
+            plotter3.show();
+                                                                                   
+            // Number of current event from 0.
+            int eventCount = 0;                        
             while (true) {
-
+                
                 long startTime = System.nanoTime();
                 
                 // get events from ET system
-                //mevs = sys.getEvents(att, Mode.SLEEP, null, 0, chunk);
+                //mevs = sys.getEvents(att, Mode.SLEEP, null, 0, chunk);                
                 boolean timedOut = false;
                 try {
                     mevs = sys.getEvents(att, Mode.TIMED, Modify.NOTHING, 5000000, chunk);
                 } catch (EtTimeoutException e) {
-                    System.out.println("timed out!!!");
+                    System.out.println("Timed out!!!");
                     timedOut = true;
-                }                
+                }              
+                // Exit point here.
                 if (timedOut) {
                     
+                    // Driver cleanup.
+                    // FIXME This requires that Driver.endOfData() be made public.
+                    //for (Driver driver : drivers) {
+                    //    driver.endOfData();
+                    //}
+                    
+                    // Call wrapper to endOfData() on DriverAdapter.
+                    driverAdapter.finish(null);
+                    
                     // Save AIDA plots.
-                    aida.saveAs("EtTestPlots.aida");
+                    AIDA.defaultInstance().saveAs("EtTestPlots.aida");                   
                     
                     // Exit after user pressed enter.
-                    System.out.println("press ENTER to exit");
+                    System.out.println("Press ENTER to exit ...");
                     System.console().readLine();
                     System.exit(0);
-                }
+                }                
                 
-                if (debug)
-                    System.out.println("EvioConsumer read event #" + eventCount);
+                //if (debug)
+                //    System.out.println("EvioConsumer read event #" + eventCount);
                 
                 if (mevs.length > 1) {
-                    throw new RuntimeException("Did not expect more than 1 event in array!");
+                    throw new RuntimeException("Did not expect to get more than one EtEvent!");
                 }
                 
+                // This is the EtEvent corresponding to a single MC event with tracker data.
                 EtEvent mev = mevs[0];
                 
-                // example of reading & printing event data
-                //for (EtEvent mev : mevs) {
-                    
-                // This may be applicable when reading off the actual C-based ET server.
-                if (mev.needToSwap()) {                        
-                    System.out.println("data needs swapping");
-                }
-
-                // Get CompositeData using event buffer.
+                // Get EvioEvent and make CompositeData from the EtEvent's data buffer.
                 ByteBuffer buf = mev.getDataBuffer();
                 EvioReader reader = new EvioReader(buf);
                 EvioEvent evioEvent = null;
                 try {
-                    evioEvent = reader.parseNextEvent();
+                    evioEvent = reader.parseNextEvent();                    
                 } catch (java.nio.BufferUnderflowException e) {
-                    System.out.println("caught underflow"); 
+                    System.out.println("Caught underflow!"); 
                 }                
-                // Something bad happened and event was not built.  Skip it.
+                // Something bad happened and event was not built.  Just skip it.
                 if (evioEvent == null) {
-                    System.out.println("failed to build EVIO event; skipping this EtEvent");
+                    System.out.println("Failed to build EVIO event.  Skipping this EtEvent!");
                     continue;
                 }
-
-                // Build composite data.
                 CompositeData cdata = evioEvent.getCompositeData();
 
-                // Make RawTrackerHits from composite data.
-                List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
-                List<Object> items = cdata.getItems();                        
-                int n = items.size();
-                for (int i=0; i<n; i+=3) {
-                    Long id = (Long)items.get(i);
-                    int time = (Integer)items.get(i+1);
-                    int adcValue = (Integer)items.get(i+2);
-                    if (debug)
-                        System.out.println("EvioConsumer --> id=0x"+Long.toHexString(id)+"; time="+time+"; adcValue="+adcValue);
-                    RawTrackerHit hit = new BaseRawTrackerHit(id, time, new short[] {(short)adcValue});
-                    hits.add(hit);
-                }         
-                if (debug)
-                    System.out.println("made " + hits.size() + " RawTrackerHits from EtEvent");
-
-                hitCountPlot.fill(hits.size());
+                // Make LCSim RawTrackerHits from CompositeData.
+                List<RawTrackerHit> hits = makeRawTrackerHits(detector, cdata);
+ 
+                // Create a new LCSimEvent and add the hits.
+                BaseLCSimEvent lcsimEvent = new BaseLCSimEvent(0, eventCount, detectorName);
+                lcsimEvent.put(rawTrackerHitCollectionName, hits, RawTrackerHit.class, 0, readoutName);
+                
+                // Make a new event for DriverAdapter.
+                RecordSuppliedEvent loopEvent = new RecordSuppliedEvent(new Object(), lcsimEvent);
+                
+                // Call process methods via Driver Adapter.
+                driverAdapter.recordSupplied(loopEvent);
+                                                               
+                // Fill RawTrackerHit count.
+                rawHitCountPlot.fill(hits.size());
 
-                // Make some test plots from tracker data.
                 for (RawTrackerHit hit : hits) {
+                    
+                    // Fill ADC value plot.
                     adcValuePlot.fill(hit.getADCValues()[0]);
-                } 
-                //}                
-
+                    
+                    // Fill basic (non-normalized) occupancy plot.
+                    aida.histogram1D(hit.getDetectorElement().getName()).fill(hit.getIdentifierFieldValue("strip"));
+                    
+                    // Increment hit counts for occupancy calculations.
+                    int[] strips = occupancyMap.get((SiSensor)hit.getDetectorElement());
+                    strips[hit.getIdentifierFieldValue("strip")] += 1;
+                }
+                
+                // Normalized occupancy plots.
+                plotter3.clearRegions();
+                int si = 0;
+                for (SiSensor sensor : occupancyMap.keySet()) {
+                    int[] strips = occupancyMap.get(sensor);
+                    aida.histogram1D(sensor.getName() + " Normalized").reset();
+                    for (int i=0; i<strips.length; i++) {
+                        double stripOccupancy = (double)strips[i] / (double)(eventCount + 1);
+                        if (stripOccupancy != 0) {
+                            aida.histogram1D(sensor.getName() + " Normalized").fill(i, stripOccupancy);
+                        }
+                    }
+                    plotter3.region(si).plot(aida.histogram1D(sensor.getName() + " Normalized"));
+                    ++si;
+                }
+                plotter3.show();
+                
+                // Number of Tracks.
+                List<Track> tracks = lcsimEvent.get(Track.class, trackCollectionName);
+                tkrCountPlot.fill(tracks.size());
+                
+                // Track plots.
+                for (Track track : tracks) {
+                    hitsPerTrackPlot.fill(track.getTrackerHits().size());
+                    tkrMomXPlot.fill(track.getPX());
+                    tkrMomYPlot.fill(track.getPY());
+                    tkrMomZPlot.fill(track.getPZ());
+                    double[] p = track.getMomentum();
+                    tkrMomPlot.fill(Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]));
+                }
+                
+                // Number of TrackerHits.
+                List<TrackerHit> trackerHits = lcsimEvent.get(TrackerHit.class, trackerHitCollectionName);
+                tkrHitCountPlot.fill(trackerHits.size());
+                                                
                 // put events back into ET system
+                // TODO Is this even necessary when running in read-only mode???
                 sys.putEvents(att, mevs);
                 
                 // Compute event processing time.
                 long endTime = System.nanoTime();
                 long elapsed = endTime - startTime;
-                System.out.println("processed event in " + elapsed + " ns");
+                //System.out.println("processed event in " + elapsed + " ns");
                 
+                // Compute instantaneous event rate e.g. this event only.
                 double eventRate = 10e9 / elapsed;
-                System.out.println("instantaneous event rate = " + eventRate + " hz");
-                
+                //System.out.println("instantaneous event rate = " + eventRate + " hz");
+                                
+                // Fill event rate plot.
                 eventRatePlot.fill(eventRate);
-                
+                             
+                // Increment event count.
                 ++eventCount;
                 
-                System.out.println("----------------------");
+                //if (debug)
+                //    System.out.println("----------------------");
             }
         }
         catch (Exception ex) {
@@ -326,4 +473,65 @@
             ex.printStackTrace();
         }
     }   
+    
+    private static boolean HIT_MAKING_DEBUG = false;
+    private static List<RawTrackerHit> makeRawTrackerHits(Detector detector, CompositeData cdata) {
+        
+        // Get some ID info before looping in order to strip out irrelevant fields.
+        // TODO Next three can be removed from here and done only once at start of run. 
+        IIdentifierDictionary dict = detector.getSubdetector(trackerName).getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
+        int fieldIdx = dict.getFieldIndex("side");
+        int sideIdx = dict.getFieldIndex("strip");
+        
+        // List of hits to be returned.
+        List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
+        
+        // Loop over the items in the CompositeData.
+        List<Object> items = cdata.getItems();                        
+        int n = items.size();
+        for (int i=0; i<n; i+=3) {
+            
+            // Get values for hit.
+            Long id = (Long)items.get(i);
+            int time = (Integer)items.get(i+1);
+            int adcValue = (Integer)items.get(i+2);
+            
+            // Make the new hit.
+            RawTrackerHit hit = new BaseRawTrackerHit(id, time, new short[] {(short)adcValue});
+            
+            if (HIT_MAKING_DEBUG) {
+                System.out.println("id=0x"+Long.toHexString(id)+"; time="+time+"; adcValue="+adcValue);
+            }
+                                                
+            // The "side" and "strip" fields needs to be taken out of the ID or the geometry lookup will fail.
+            IExpandedIdentifier expId = dict.unpack(hit.getIdentifier());            
+            expId.setValue(fieldIdx, 0);
+            expId.setValue(sideIdx, 0);
+            IIdentifier strippedId = dict.pack(expId);
+            
+            // Find the SiSensor of this hit.  This is more complicated than it should be,
+            // because DetectorElements are not guaranteed to have unique IDs.
+            List<IDetectorElement> des = DetectorElementStore.getInstance().find(strippedId);
+            SiSensor sensor = null;
+            if (des == null || des.size() == 0) {
+                throw new RuntimeException("Failed to find DetectorElement for hit with id 0x"+Long.toHexString(strippedId.getValue()));
+            }
+            else if (des.size() == 1) {
+                sensor = (SiSensor)des.get(0);
+            }
+            else {
+                for (IDetectorElement de : des) {
+                    if (de instanceof SiSensor) {
+                        sensor = (SiSensor)de;
+                        break;
+                    }
+                }
+            }                        
+            hit.setDetectorElement(sensor);
+                 
+            // Add this hit to the list.
+            hits.add(hit);                            
+        }                           
+        return hits;
+    }
 }
\ No newline at end of file
CVSspam 0.2.12


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