hps-java/src/main/java/org/lcsim/hps/evio
diff -u -r1.10 -r1.11
--- EvioConsumer.java 21 Mar 2012 20:19:13 -0000 1.10
+++ EvioConsumer.java 22 Mar 2012 02:21:16 -0000 1.11
@@ -45,29 +45,21 @@
import org.jlab.coda.et.enums.Mode;
import org.jlab.coda.et.enums.Modify;
import org.jlab.coda.et.exception.EtTimeoutException;
-import org.jlab.coda.jevio.BaseStructure;
-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.EventHeader;
import org.lcsim.event.RawCalorimeterHit;
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.BaseRawCalorimeterHit;
-import org.lcsim.event.base.BaseRawTrackerHit;
import org.lcsim.geometry.Detector;
+import org.lcsim.hps.monitoring.ConnectionParameters;
+import org.lcsim.hps.monitoring.ConnectionParameters.ConnectionParametersException;
import org.lcsim.job.JobControlManager;
import org.lcsim.util.Driver;
import org.lcsim.util.DriverAdapter;
import org.lcsim.util.aida.AIDA;
-import org.lcsim.util.lcio.LCIOConstants;
/**
* This class is an example of an event consumer for an ET system.
@@ -76,52 +68,30 @@
*
* @author Jeremy McCormick
*/
+// FIXME Try to put plots into separate Driver which can be called from the .lcsim file, in order to cleanup this class.
public class EvioConsumer {
+ //private static final String trackCollectionName = "MatchedTracks";
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 trackerReadoutName = "TrackerHits";
- private static final String trackCollectionName = "MatchedTracks";
private static final String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D";
- private static final String rawCalorimeterHitCollectionName = "EcalRawHits";
- private static final String ecalReadoutName = "EcalHits";
-
private static final String lcsimXml = "/org/lcsim/hps/steering/EtTest.lcsim";
- private static final boolean debug = false;
- private static Detector detector;
+
+ private static Detector detector;
private static Map<SiSensor,int[]> occupancyMap;
private static IPlotter occuPlot;
private static EvioConsumerGui gui;
+
private static long jobStartTime;
private static int eventCount;
private static List<IPlotter> plotters = new ArrayList<IPlotter>();
+
+ private static final boolean debug = true;
public EvioConsumer() {
}
-
- private static void usage() {
- System.out.println("\nUsage: java Consumer -f <et name> -host <ET host> -s <station name> [-h] [-v] [-nb]\n" +
- " [-p <ET server port>] [-c <chunk size>] [-q <queue size>]\n" +
- " [-pos <station position>] [-ppos <parallel station position>]\n\n" +
- " -host ET system's host\n" +
- " -f ET system's (memory-mapped file) name\n" +
- " -s create station of this name\n" +
- " -h help\n" +
- " -v verbose output\n" +
- " -nb make station non-blocking\n" +
- " -p ET server port\n" +
- " -c number of events in one get/put array\n" +
- " -q queue size if creating nonblocking station\n" +
- " -pos position of created station in station list (1,2,...)\n" +
- " -ppos position of created station within a group of parallel stations (-1=end, -2=head)\n\n" +
- " This consumer works by making a direct connection\n" +
- " to the ET system's tcp server port.\n");
- }
-
+
static void clearAidaTree() {
ITree tree = AIDA.defaultInstance().tree();
String names[] = tree.listObjectNames("/", true);
@@ -221,124 +191,22 @@
plotter4.region(2).plot(ecalHitsPlot);
plotter4.show();
}
-
+
public static void main(String[] args) {
- int position = 1, pposition = 0, qSize = 0, chunk = 1;
- boolean blocking = true, verbose = false;
- String etName = null, host = null, statName = null;
- int port = EtConstants.serverPort;
- int flowMode = EtConstants.stationSerial;
-
- for (int i = 0; i < args.length; i++) {
- if (args[i].equalsIgnoreCase("-f")) {
- etName = args[++i];
- }
- else if (args[i].equalsIgnoreCase("-host")) {
- host = args[++i];
- }
- else if (args[i].equalsIgnoreCase("-nb")) {
- blocking = false;
- }
- else if (args[i].equalsIgnoreCase("-v")) {
- verbose = true;
- }
- else if (args[i].equalsIgnoreCase("-s")) {
- statName = args[++i];
- }
- else if (args[i].equalsIgnoreCase("-p")) {
- try {
- port = Integer.parseInt(args[++i]);
- if ((port < 1024) || (port > 65535)) {
- System.out.println("Port number must be between 1024 and 65535.");
- usage();
- return;
- }
- }
- catch (NumberFormatException ex) {
- System.out.println("Did not specify a proper port number.");
- usage();
- return;
- }
- }
- else if (args[i].equalsIgnoreCase("-c")) {
- try {
- chunk = Integer.parseInt(args[++i]);
- if ((chunk < 1) || (chunk > 1000)) {
- System.out.println("Chunk size may be 1 - 1000.");
- usage();
- return;
- }
- }
- catch (NumberFormatException ex) {
- System.out.println("Did not specify a proper chunk size.");
- usage();
- return;
- }
- }
- else if (args[i].equalsIgnoreCase("-q")) {
- try {
- qSize = Integer.parseInt(args[++i]);
- if (qSize < 1) {
- System.out.println("Queue size must be > 0.");
- usage();
- return;
- }
- }
- catch (NumberFormatException ex) {
- System.out.println("Did not specify a proper queue size number.");
- usage();
- return;
- }
- }
- else if (args[i].equalsIgnoreCase("-pos")) {
- try {
- position = Integer.parseInt(args[++i]);
- if (position < 1) {
- System.out.println("Position must be > 0.");
- usage();
- return;
- }
- }
- catch (NumberFormatException ex) {
- System.out.println("Did not specify a proper position number.");
- usage();
- return;
- }
- }
- else if (args[i].equalsIgnoreCase("-ppos")) {
- try {
- pposition = Integer.parseInt(args[++i]);
- if (pposition < -2 || pposition == 0) {
- System.out.println("Parallel position must be > -3 and != 0.");
- usage();
- return;
- }
- System.out.println("FLOW moDE is ||");
- flowMode = EtConstants.stationParallel;
- if (pposition == -2) pposition = EtConstants.newHead;
- else if (pposition == -1) pposition = EtConstants.end;
-
- }
- catch (NumberFormatException ex) {
- System.out.println("Did not specify a proper parallel position number.");
- usage();
- return;
- }
- }
- else {
- usage();
- return;
- }
- }
-
- if (host == null || etName == null || statName == null) {
- usage();
- return;
+
+ // Create ET system connection parameters.
+ ConnectionParameters cn = new ConnectionParameters();
+ try {
+ cn.setup(args);
+ } catch (ConnectionParametersException e) {
+ e.printStackTrace();
+ ConnectionParameters.usage();
+ System.exit(1);
}
try {
// make a direct connection to ET system's tcp server
- EtSystemOpenConfig config = new EtSystemOpenConfig(etName, host, port);
+ EtSystemOpenConfig config = new EtSystemOpenConfig(cn.etName, cn.host, cn.port);
// create ET system object with verbose debugging output
EtSystem sys = new EtSystem(config, EtConstants.debugInfo);
@@ -346,16 +214,16 @@
// configuration of a new station
EtStationConfig statConfig = new EtStationConfig();
- statConfig.setFlowMode(flowMode);
- if (!blocking) {
+ statConfig.setFlowMode(cn.flowMode);
+ if (!cn.blocking) {
statConfig.setBlockMode(EtConstants.stationNonBlocking);
- if (qSize > 0) {
- statConfig.setCue(qSize);
+ if (cn.qSize > 0) {
+ statConfig.setCue(cn.qSize);
}
}
// create station
- EtStation stat = sys.createStation(statConfig, statName, position, pposition);
+ EtStation stat = sys.createStation(statConfig, cn.statName, cn.position, cn.pposition);
// attach to new station
EtAttachment att = sys.attach(stat);
@@ -383,9 +251,19 @@
driverAdapter.configure(null);
// Create a dummy event in order to get Detector conditions.
- BaseLCSimEvent dummyEvent = new BaseLCSimEvent(0, 0, detectorName);
- Detector detector = dummyEvent.getDetector();
- EvioConsumer.detector = detector;
+ //BaseLCSimEvent dummyEvent = new BaseLCSimEvent(0, 0, detectorName);
+ //Detector detector = dummyEvent.getDetector();
+ //EvioConsumer.detector = detector;
+
+ // Make the builder for creating LCSim events from EVIO data.
+ LCSimEventBuilder eventBuilder = new LCSimEventBuilder(detectorName);
+ eventBuilder.setDebug(true);
+
+ EvioConsumer.detector = eventBuilder.getDetector();
+
+ // Get names of raw data collections.
+ String rawTrackerHitCollectionName = eventBuilder.getRawTrackerHitCollectionName();
+ String rawCalorimeterHitCollectionName = eventBuilder.getRawCalorimeterHitCollectionName();
// Setup all the plots for the job.
setupPlots();
@@ -393,7 +271,7 @@
// The default AIDA instance.
AIDA aida = AIDA.defaultInstance();
- ConnectionPanel.main(new String[]{});
+ //ConnectionPanel.main(new String[]{});
// Show GUI.
EvioConsumerGui.main(new String[]{});
@@ -403,28 +281,26 @@
//int eventCount = 0;
jobStartTime = System.currentTimeMillis();
long eventRateStart = System.nanoTime();
- final int eventRateInterval = 10;
+ final int eventRateInterval = 50;
while (true) {
-
- //long startTime = System.nanoTime();
-
- // get events from ET system
+
+ // Use this for unlimited wait time.
//mevs = sys.getEvents(att, Mode.SLEEP, null, 0, chunk);
boolean timedOut = false;
try {
- mevs = sys.getEvents(att, Mode.TIMED, Modify.NOTHING, 5000000, chunk);
+ mevs = sys.getEvents(att, Mode.TIMED, Modify.NOTHING, 5000000, cn.chunk);
} catch (EtTimeoutException e) {
timedOut = true;
}
// When timeout occurs, do cleanup and exit.
if (timedOut) {
- long jobEndTime = System.currentTimeMillis();
+ long jobEndTime = System.currentTimeMillis();
long jobTime = jobEndTime - jobStartTime;
System.out.println("Job time: " + jobTime / 1000 + " seconds");
- long avgEventTime = jobTime / (eventCount);
- System.out.println("Avg event processing time: " + avgEventTime + " ms");
+ //long avgEventTime = jobTime / (eventCount);
+ //System.out.println("Avg event processing time: " + avgEventTime + " ms");
// Call wrapper to endOfData() on DriverAdapter.
driverAdapter.finish(null);
@@ -434,249 +310,140 @@
System.console().readLine();
System.exit(0);
}
-
- //if (debug)
- // System.out.println("EvioConsumer read event #" + eventCount);
-
- if (mevs.length > 1) {
- 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];
-
- // Get EvioEvent and check for errors.
- ByteBuffer buf = mev.getDataBuffer();
- EvioReader reader = new EvioReader(buf);
- EvioEvent evioEvent = null;
- try {
- evioEvent = reader.parseNextEvent();
- } catch (java.nio.BufferUnderflowException e) {
- System.out.println("Caught underflow!");
- }
- // Something bad happened and event was not built. Just skip it.
- if (evioEvent == null) {
- System.out.println("Failed to build EVIO event <" + eventCount + ">. Skipping this EtEvent!");
- aida.cloud1D("Bad Event Count").fill(0);
- continue;
- }
-
- // Make CompositeData from data buffer.
- //CompositeData cdata = evioEvent.getCompositeData();
-
- // Convert from EVIO to LCIO objects.
- List<RawTrackerHit> rawTrackerHits = null;
- List<RawCalorimeterHit> rawCalorimeterHits = null;
- for (BaseStructure bank : evioEvent.getChildren()) {
- if (bank.getHeader().getNumber() == MCRawDataToEvio4Converter.trackerBankNumber) {
- rawTrackerHits = makeRawTrackerHits(detector, bank.getCompositeData());
+
+ // Loop over retrieved EtEvents.
+ for (EtEvent mev : mevs) {
+
+ // Get EvioEvent and check for errors.
+ ByteBuffer buf = mev.getDataBuffer();
+ EvioReader reader = new EvioReader(buf);
+ EvioEvent evioEvent = null;
+ try {
+ evioEvent = reader.parseNextEvent();
+ } catch (java.nio.BufferUnderflowException e) {
+ System.out.println("Caught underflow!");
}
- else if (bank.getHeader().getNumber() == MCRawDataToEvio4Converter.ecalBankNumber) {
- rawCalorimeterHits = makeRawCalorimeterHits(detector, bank.getCompositeData());
+ // Something bad happened and event was not built. Just skip it.
+ if (evioEvent == null) {
+ System.out.println("Failed to build EVIO event <" + eventCount + ">. Skipping this EtEvent!");
+ aida.cloud1D("Bad Event Count").fill(0);
+ continue;
}
- }
-
- //System.out.println("rawTrackerHits.size = " + rawTrackerHits.size());
- //System.out.println("rawCalorimeterHits.size = " + rawCalorimeterHits.size());
-
- // Create a new LCSimEvent and add the hit collections.
- BaseLCSimEvent lcsimEvent = new BaseLCSimEvent(0, eventCount, detectorName);
- lcsimEvent.put(rawTrackerHitCollectionName, rawTrackerHits, RawTrackerHit.class, (1 << LCIOConstants.TRAWBIT_ID1), trackerReadoutName);
- lcsimEvent.put(rawCalorimeterHitCollectionName, rawCalorimeterHits, RawCalorimeterHit.class, 0, ecalReadoutName);
-
- // Make a new event for DriverAdapter.
- RecordSuppliedEvent loopEvent = new RecordSuppliedEvent(new Object(), lcsimEvent);
-
- // Call process methods via Driver Adapter.
- driverAdapter.recordSupplied(loopEvent);
-
- // Make ECal plots.
- makeEcalPlots(aida, rawCalorimeterHits);
-
- // Fill RawTrackerHit count.
- aida.histogram1D("Number of RawTrackerHits in Event").fill(rawTrackerHits.size());
- // Loop over RawTrackerHit collection.
- for (RawTrackerHit hit : rawTrackerHits) {
-
- // Fill ADC value plot.
- aida.histogram1D("ADC Value").fill(hit.getADCValues()[0]);
-
- // Fill time plot.
- aida.cloud1D("Time [ns]").fill(hit.getTime());
-
- // 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.
- occuPlot.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);
+ // Create LCSim event from EVIO data.
+ EventHeader lcsimEvent = eventBuilder.makeLCSimEvent(evioEvent);
+
+ // Get collections from event.
+ List<RawTrackerHit> rawTrackerHits = lcsimEvent.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+ if (debug)
+ System.out.println("rawTrackerHits.size = " + rawTrackerHits.size());
+ List<RawCalorimeterHit> rawCalorimeterHits = lcsimEvent.get(RawCalorimeterHit.class, rawCalorimeterHitCollectionName);
+ if (debug)
+ System.out.println("rawCalHits.size = " + rawCalorimeterHits.size());
+
+ // Make a new event for DriverAdapter.
+ RecordSuppliedEvent loopEvent = new RecordSuppliedEvent(new Object(), lcsimEvent);
+
+ // Call process methods via Driver Adapter.
+ driverAdapter.recordSupplied(loopEvent);
+
+ // Make ECal plots.
+ makeEcalPlots(aida, rawCalorimeterHits);
+
+ // Fill RawTrackerHit count.
+ aida.histogram1D("Number of RawTrackerHits in Event").fill(rawTrackerHits.size());
+
+ // Loop over RawTrackerHit collection.
+ for (RawTrackerHit hit : rawTrackerHits) {
+
+ // Fill ADC value plot.
+ aida.histogram1D("ADC Value").fill(hit.getADCValues()[0]);
+
+ // Fill time plot.
+ aida.cloud1D("Time [ns]").fill(hit.getTime());
+
+ // 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.
+ occuPlot.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);
+ }
}
+ occuPlot.region(si).plot(aida.histogram1D(sensor.getName() + " Normalized"));
+ ++si;
}
- occuPlot.region(si).plot(aida.histogram1D(sensor.getName() + " Normalized"));
- ++si;
- }
- occuPlot.show();
-
- // Get Tracks from event.
- List<Track> tracks = lcsimEvent.get(Track.class, trackCollectionName);
-
- // Plot number of Tracks.
- aida.histogram1D("Number of Tracks in Event").fill(tracks.size());
-
- // Track plots.
- for (Track track : tracks) {
- aida.cloud1D("Number of Hits per Track").fill(track.getTrackerHits().size());
- aida.histogram1D("Track Px").fill(track.getPX());
- aida.histogram1D("Track Py").fill(track.getPY());
- aida.histogram1D("Track Pz").fill(track.getPZ());
- double[] p = track.getMomentum();
- aida.histogram1D("Track P").fill(Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]));
+ occuPlot.show();
+
+ // Get Tracks from event.
+ //List<Track> tracks = lcsimEvent.get(Track.class, trackCollectionName);
+ List<Track> tracks = lcsimEvent.get(Track.class).get(0);
+
+ // Plot number of Tracks.
+ aida.histogram1D("Number of Tracks in Event").fill(tracks.size());
+
+ // Track plots.
+ for (Track track : tracks) {
+ aida.cloud1D("Number of Hits per Track").fill(track.getTrackerHits().size());
+ aida.histogram1D("Track Px").fill(track.getPX());
+ aida.histogram1D("Track Py").fill(track.getPY());
+ aida.histogram1D("Track Pz").fill(track.getPZ());
+ double[] p = track.getMomentum();
+ aida.histogram1D("Track P").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);
+ aida.histogram1D("Number of TrackerHits in Event").fill(trackerHits.size());
+
+ long currTime = System.currentTimeMillis() - jobStartTime;
+ gui.setElapsedTime(currTime);
+
+ // Increment event count.
+ ++eventCount;
+
+ // Periodically compute event rate.
+ if (eventCount % eventRateInterval == 0) {
+
+ long eventRateEnd = System.nanoTime();
+ long eventElapsed = eventRateEnd - eventRateStart;
+ long nsPerEvent = eventElapsed / eventRateInterval;
+ double eventRate = 10e9 / nsPerEvent;
+ gui.setEventRate(eventRate);
+ eventRateStart = System.nanoTime();
+
+ // Compute rolling average event processing time.
+ double avgProcTime = (System.currentTimeMillis() - jobStartTime) / (double) eventCount;
+ double avgEventRate = 1000 / avgProcTime;
+ gui.setAverageEventRate(avgEventRate);
+ }
+
+ gui.incrEventCount();
+
}
-
- // Number of TrackerHits.
- List<TrackerHit> trackerHits = lcsimEvent.get(TrackerHit.class, trackerHitCollectionName);
- aida.histogram1D("Number of TrackerHits in Event").fill(trackerHits.size());
// put events back into ET system
// FIXME 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");
-
- // Compute instantaneous event rate e.g. this event only.
- //double eventRate = 10e9 / elapsed;
- //System.out.println("instantaneous event rate = " + eventRate + " hz");
-
- // Fill event rate plot.
- //aida.cloud1D("Event Rate [Hz]").fill(eventRate);
-
- long currTime = System.currentTimeMillis() - jobStartTime;
- gui.setElapsedTime(currTime);
-
- // Increment event count.
- ++eventCount;
-
- // Periodically compute event rate.
- if (eventCount % eventRateInterval == 0) {
- long eventRateEnd = System.nanoTime();
- long eventElapsed = eventRateEnd - eventRateStart;
- long nsPerEvent = eventElapsed / eventRateInterval;
- double eventRate = 10e9 / nsPerEvent;
- gui.setEventRate(eventRate);
- eventRateStart = System.nanoTime();
- }
-
- gui.incrEventCount();
-
- // Compute rolling average event processing time.
- double avgProcTime = (System.currentTimeMillis() - jobStartTime) / (double)eventCount;
- double avgEventRate = 1000 / avgProcTime;
- gui.setAverageEventRate(avgEventRate);
-
- //if (debug)
- // System.out.println("----------------------");
}
}
catch (Exception ex) {
System.out.println("Error using ET system as consumer.");
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();
- int n = cdata.getNValue();
- System.out.println("RawTrackerHit.N = " + n);
- for (int i=1; 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;
- }
-
- private static List<RawCalorimeterHit> makeRawCalorimeterHits(Detector detector, CompositeData cdata) {
- List<RawCalorimeterHit> hits = new ArrayList<RawCalorimeterHit>();
- List<Object> items = cdata.getItems();
- //int n = items.size();
- int n = cdata.getNValue();
- System.out.println("RawCalHit.N = " + n);
- for (int i=1; i<n; i+=3) {
- long id = (Long)items.get(i);
- int amplitude = (Integer)items.get(i+1);
- int timestamp = (Integer)items.get(i+2);
- hits.add(new BaseRawCalorimeterHit(id, amplitude, timestamp));
- }
- return hits;
- }
+ }
private static void makeEcalPlots(AIDA aida, List<RawCalorimeterHit> hits) {
aida.cloud1D("Number of Hits").fill(hits.size());
@@ -685,18 +452,6 @@
aida.cloud1D("Amplitude").fill(hit.getAmplitude());
}
}
-
- static class ConnectionParameters {
- String etName; // x
- String host; // x
- int port; // x
- boolean nonBlocking;
- String stationName;
- int neventsPerArray;
- int queueSize;
- int stationPos;
- int stationParallelPos;
- }
static class ConnectionPanel extends JPanel implements ActionListener {
@@ -847,45 +602,7 @@
c.gridy = 1;
JPanel buttonsPanel = new JPanel();
buttonsPanel.setLayout(new GridBagLayout());
- add(buttonsPanel, c);
-
- /*
- c = new GridBagConstraints();
- c.gridx = 0;
- c.gridy = 0;
- c.anchor = GridBagConstraints.WEST;
- JLabel hostLabel = new JLabel("Host:");
- hostLabel.setHorizontalAlignment(JLabel.LEFT);
- fieldsPanel.add(hostLabel, c);
-
- c = new GridBagConstraints();
- c.gridx = 1;
- c.gridy = 0;
- c.anchor = GridBagConstraints.EAST;
- host = new JTextField("", 20);
- host.setHorizontalAlignment(JTextField.RIGHT);
- host.setEditable(false);
- host.setBackground(Color.WHITE);
- fieldsPanel.add(host, c);
-
- c = new GridBagConstraints();
- c.gridx = 0;
- c.gridy = 1;
- c.anchor = GridBagConstraints.WEST;
- JLabel portLabel = new JLabel("Port:");
- portLabel.setHorizontalAlignment(JLabel.LEFT);
- fieldsPanel.add(portLabel, c);
-
- c = new GridBagConstraints();
- c.gridx = 1;
- c.gridy = 1;
- c.anchor = GridBagConstraints.EAST;
- port = new JTextField("", 6);
- port.setHorizontalAlignment(JTextField.RIGHT);
- port.setEditable(false);
- port.setBackground(Color.WHITE);
- fieldsPanel.add(port, c);
- */
+ add(buttonsPanel, c);
c = new GridBagConstraints();
c.gridx = 0;
@@ -1002,17 +719,6 @@
eventCounter.setText(Integer.toString(e));
}
- /*
-
- public void setHost(String host) {
- this.host.setText(host);
- }
-
- public void setPort(int port) {
- this.port.setText(Integer.toString(port));
- }
- */
-
public void setElapsedTime(long time) {
elapsedTime.setText(Long.toString(time));
}
@@ -1067,7 +773,7 @@
plotters.clear();
clearAidaTree();
- setupPlots();
+ setupPlots();
resetEventCount();
resetTimer();
hps-java/src/main/java/org/lcsim/hps/evio
diff -u -r1.1 -r1.2
--- MCRawDataToEvio4Converter.java 21 Mar 2012 20:19:13 -0000 1.1
+++ MCRawDataToEvio4Converter.java 22 Mar 2012 02:21:16 -0000 1.2
@@ -1,6 +1,7 @@
package org.lcsim.hps.evio;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
import org.jlab.coda.jevio.CompositeData;
@@ -10,8 +11,10 @@
import org.jlab.coda.jevio.EvioBank;
import org.jlab.coda.jevio.EvioException;
import org.lcsim.event.EventHeader;
+import org.lcsim.event.EventHeader.LCMetaData;
import org.lcsim.event.RawCalorimeterHit;
import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.IDDecoder;
import org.lcsim.util.Driver;
/**
@@ -40,14 +43,19 @@
String rawTrackerHitCollectionName = "RawTrackerHitMaker_RawTrackerHits";
String rawCalorimeterHitCollectionName = "EcalRawHits";
-
- public static final int trackerBankTag = 0x0;
- public static final int trackerBankNumber = 1;
+
+ // These correspond to ROC (readout crate) IDs from the DAQ system.
+ public static final int ecalTopBankTag = 0x1;
+ public static final int ecalBottomBankTag = 0x2;
+ public static final int trackerBankTag = 0x3;
+
+ // CompositeData formats.
public static final String trackerFormat = "N(L,I,I)";
+ public static final String ecalFormat = "N(L,I,I)";
- public static final int ecalBankTag = 0xe103;
+ //public static final int ecalBankTag = 0xe103;
+ public static final int trackerBankNumber = 1;
public static final int ecalBankNumber = 2;
- public static final String ecalFormat = "N(L,I,I)";
public MCRawDataToEvio4Converter()
{}
@@ -85,9 +93,18 @@
public void process(EventHeader event) {
+ // Make a new EVIO event.
EventBuilder builder = new EventBuilder(0, DataType.BANK, event.getEventNumber());
+
+ // Write RawTrackerHit collection.
writeRawTrackerHits(event.get(RawTrackerHit.class, rawTrackerHitCollectionName), builder);
- writeRawCalorimeterHits(event.get(RawCalorimeterHit.class, rawCalorimeterHitCollectionName), builder);
+
+ // Write RawCalorimeterHit collection.
+ List<RawCalorimeterHit> rawCalorimeterHits = event.get(RawCalorimeterHit.class, rawCalorimeterHitCollectionName);
+ LCMetaData meta = event.getMetaData(rawCalorimeterHits);
+ writeRawCalorimeterHits(meta, rawCalorimeterHits, builder);
+
+ // Write this EVIO event.
builder.setAllHeaderLengths();
try {
writer.writeEvent(builder.getEvent());
@@ -101,7 +118,10 @@
public void writeRawTrackerHits(List<RawTrackerHit> rawTrackerHits, EventBuilder builder) {
int dataSize = rawTrackerHits.size();
- CompositeData.Data data = new CompositeData.Data();
+
+ System.out.println("writeRawTrackerHits will write " + dataSize + " hits");
+
+ CompositeData.Data data = new CompositeData.Data();
data.addN(dataSize);
for (RawTrackerHit hit : rawTrackerHits) {
data.addLong(hit.getCellID());
@@ -128,24 +148,24 @@
throw new RuntimeException(e);
}
}
-
- public void writeRawCalorimeterHits(List<RawCalorimeterHit> rawCalorimeterHits, EventBuilder builder) {
+
+ public void writeRawCalorimeterHitCollection(List<RawCalorimeterHit> hits, int bankTag, EventBuilder builder) {
CompositeData.Data data = new CompositeData.Data();
- int nhits = rawCalorimeterHits.size();
- data.addN(nhits);
- for (RawCalorimeterHit hit : rawCalorimeterHits) {
+ int nTopHits = hits.size();
+ data.addN(nTopHits);
+ for (RawCalorimeterHit hit : hits) {
data.addLong(hit.getCellID());
data.addInt(hit.getAmplitude());
data.addInt(hit.getTimeStamp());
- }
+ }
CompositeData cdata = null;
try {
- cdata = new CompositeData(ecalFormat, 1, data, 0 ,0);
+ cdata = new CompositeData(ecalFormat, 1, data, 0, 0);
}
catch (EvioException e) {
throw new RuntimeException(e);
- }
- EvioBank bank = new EvioBank(ecalBankTag, DataType.COMPOSITE, ecalBankNumber);
+ }
+ EvioBank bank = new EvioBank(bankTag, DataType.COMPOSITE, ecalBankNumber);
try {
bank.appendCompositeData(cdata);
} catch (EvioException e) {
@@ -158,4 +178,28 @@
throw new RuntimeException(e);
}
}
+
+ public void writeRawCalorimeterHits(LCMetaData meta, List<RawCalorimeterHit> rawCalorimeterHits, EventBuilder builder) {
+
+ // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
+ IDDecoder dec = meta.getIDDecoder();
+ List<RawCalorimeterHit> topHits = new ArrayList<RawCalorimeterHit>();
+ List<RawCalorimeterHit> bottomHits = new ArrayList<RawCalorimeterHit>();
+ for (RawCalorimeterHit hit : rawCalorimeterHits) {
+ dec.setID(hit.getCellID());
+ int iy = dec.getValue("iy");
+ // Negative iy should be bottom section.
+ if (iy < 0) {
+ bottomHits.add(hit);
+ }
+ // Positive iy should be top section.
+ else {
+ topHits.add(hit);
+ }
+ }
+
+ // Write the two collections for top and bottom hits to separate EVIO banks.
+ writeRawCalorimeterHitCollection(topHits, ecalTopBankTag, builder);
+ writeRawCalorimeterHitCollection(bottomHits, ecalBottomBankTag, builder);
+ }
}
\ No newline at end of file
hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -u -r1.1 -r1.2
--- TrackerHitDriver.java 16 Mar 2012 19:11:11 -0000 1.1
+++ TrackerHitDriver.java 22 Mar 2012 02:21:17 -0000 1.2
@@ -34,11 +34,12 @@
* algorithm like Seed Tracker.
*
* @author jeremym
- * @version $Id: TrackerHitDriver.java,v 1.1 2012/03/16 19:11:11 jeremy Exp $
+ * @version $Id: TrackerHitDriver.java,v 1.2 2012/03/22 02:21:17 jeremy Exp $
*/
public class TrackerHitDriver extends Driver {
+
// Debug switch for development.
- private static final boolean DEBUG = false;
+ private boolean debug = false;
// Collection name.
private String readoutCollectionName = "TrackerHits";
@@ -87,6 +88,14 @@
// Digi class objects.
private StripHitMaker stripClusterer;
+
+ public void setDebug(boolean debug) {
+ this.debug = debug;
+ }
+
+ public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
+ this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
+ }
public void setReadoutCollectionName(String readoutCollectionName) {
this.readoutCollectionName = readoutCollectionName;
@@ -257,11 +266,6 @@
sensorMap.put(sensor.getIdentifier().getValue(), sensor);
}
}
-
- public void setRawTrackerHitCollectionName(
- String rawTrackerHitCollectionName) {
- this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
- }
private static IIdentifier makeSensorId(Detector detector, RawTrackerHit hit) {
@@ -288,6 +292,9 @@
// Read RawTrackerHits from LCSimEvent.
List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+
+ if (debug)
+ System.out.println("RawTrackerHit collection " + rawTrackerHitCollectionName + " has " + rawHits.size() + " hits.");
// Add hits to sensors.
for (RawTrackerHit hit : rawHits) {
@@ -302,16 +309,18 @@
// Make strip hits.
List<SiTrackerHit> stripHits1D = new ArrayList<SiTrackerHit>();
for (SiSensor sensor : processSensors) {
- //System.out.println("making TrackerHits for sensor " + sensor.getName() + " with " + sensor.getReadout().getHits(RawTrackerHit.class).size() + " hits");
+ if (debug)
+ System.out.println("Making TrackerHits for sensor " + sensor.getName() + " with " + sensor.getReadout().getHits(RawTrackerHit.class).size() + " hits.");
List<SiTrackerHit> trackerHits = stripClusterer.makeHits(sensor);
- //System.out.println("made " + trackerHits.size() + " hits on sensor " + sensor.getName());
+ if (debug)
+ System.out.println("Made " + trackerHits.size() + " hits on sensor " + sensor.getName() + ".");
stripHits1D.addAll(trackerHits);
}
// Debug prints.
- //if (DEBUG) {
- // System.out.println("TrackerHit collection " + this.stripHitOutputCollectionName + " has " + stripHits1D.size() + " hits.");
- //}
+ if (debug) {
+ System.out.println("TrackerHit collection " + this.stripHitOutputCollectionName + " has " + stripHits1D.size() + " hits.");
+ }
// Put output TrackerHits into event.
// FIXME Does this collection need a non-zero flag?