hps-java/src/main/java/org/lcsim/hps/evio
diff -u -r1.1 -r1.2
--- ECalHitWriter.java 30 Jul 2012 23:31:45 -0000 1.1
+++ ECalHitWriter.java 3 Aug 2012 21:37:12 -0000 1.2
@@ -1,5 +1,6 @@
package org.lcsim.hps.evio;
+import org.jlab.coda.jevio.BaseStructure;
import org.lcsim.event.RawTrackerHit;
import org.jlab.coda.jevio.CompositeData;
import java.util.ArrayList;
@@ -11,7 +12,6 @@
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.geometry.IDDecoder;
import org.lcsim.hps.recon.ecal.HPSEcalConditions;
@@ -25,7 +25,7 @@
/**
*
* @author Sho Uemura <[log in to unmask]>
- * @version $Id: ECalHitWriter.java,v 1.1 2012/07/30 23:31:45 meeg Exp $
+ * @version $Id: ECalHitWriter.java,v 1.2 2012/08/03 21:37:12 meeg Exp $
*/
public class ECalHitWriter implements HitWriter {
@@ -62,38 +62,33 @@
@Override
public void writeData(EventHeader event, EventBuilder builder) {
- LCMetaData meta;
- List<RawCalorimeterHit> rawCalorimeterHits;
- List<RawTrackerHit> rawTrackerHits;
+ List<Object> hits = new ArrayList<Object>();
switch (mode) {
case EventConstants.ECAL_WINDOW_MODE:
- rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
- meta = event.getMetaData(rawTrackerHits);
- writeWindowHits(meta, rawTrackerHits, builder);
+ hits.addAll(event.get(RawTrackerHit.class, hitCollectionName));
+ writeHits(hits, builder, mode);
break;
case EventConstants.ECAL_PULSE_MODE:
- rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
- meta = event.getMetaData(rawTrackerHits);
- writePulseHits(meta, rawTrackerHits, builder);
+ hits.addAll(event.get(RawTrackerHit.class, hitCollectionName));
+ writeHits(hits, builder, mode);
break;
case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
- rawCalorimeterHits = event.get(RawCalorimeterHit.class, hitCollectionName);
- meta = event.getMetaData(rawCalorimeterHits);
- writeIntegralHits(meta, rawCalorimeterHits, builder);
+ hits.addAll(event.get(RawCalorimeterHit.class, hitCollectionName));
+ writeHits(hits, builder, mode);
break;
default:
break;
}
}
- private void writeIntegralHits(LCMetaData meta, List<RawCalorimeterHit> rawCalorimeterHits, EventBuilder builder) {
+ private void writeHits(List<Object> rawCalorimeterHits, EventBuilder builder, int mode) {
System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in integral format");
// Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
- List<RawCalorimeterHit> topHits = new ArrayList<RawCalorimeterHit>();
- List<RawCalorimeterHit> bottomHits = new ArrayList<RawCalorimeterHit>();
- for (RawCalorimeterHit hit : rawCalorimeterHits) {
- Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
+ List<Object> topHits = new ArrayList<Object>();
+ List<Object> bottomHits = new ArrayList<Object>();
+ for (Object hit : rawCalorimeterHits) {
+ Long daqID = HPSEcalConditions.physicalToDaqID(getCellID(hit));
int crate = HPSEcalConditions.getCrate(daqID);
if (crate == ECAL_BOTTOM_BANK_TAG) {
bottomHits.add(hit);
@@ -102,22 +97,80 @@
}
}
- // Write the two collections for top and bottom hits to separate EVIO banks.
- writeIntegralHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
- writeIntegralHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
+ // Make a new bank for this crate.
+ BaseStructure topBank = null;
+ BaseStructure botBank = null;
+ // Do these banks already exist?
+ for (BaseStructure bank : builder.getEvent().getChildren()) {
+ switch (bank.getHeader().getTag()) {
+ case ECAL_TOP_BANK_TAG:
+ topBank = bank;
+ break;
+ case ECAL_BOTTOM_BANK_TAG:
+ botBank = bank;
+ break;
+ }
+ }
+ // If they don't exist, make them.
+ if (topBank == null) {
+ topBank = new EvioBank(ECAL_TOP_BANK_TAG, DataType.BANK, ECAL_BANK_NUMBER);
+ try {
+ builder.addChild(builder.getEvent(), topBank);
+ } catch (EvioException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ if (botBank == null) {
+ botBank = new EvioBank(ECAL_BOTTOM_BANK_TAG, DataType.BANK, ECAL_BANK_NUMBER);
+ try {
+ builder.addChild(builder.getEvent(), botBank);
+ } catch (EvioException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ switch (mode) {
+ case EventConstants.ECAL_WINDOW_MODE:
+ // Write the two collections for top and bottom hits to separate EVIO banks.
+ writeWindowHitCollection(topHits, topBank, builder);
+ writeWindowHitCollection(bottomHits, botBank, builder);
+ break;
+ case EventConstants.ECAL_PULSE_MODE:
+ // Write the two collections for top and bottom hits to separate EVIO banks.
+ writePulseHitCollection(topHits, topBank, builder);
+ writePulseHitCollection(bottomHits, botBank, builder);
+ break;
+ case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
+ // Write the two collections for top and bottom hits to separate EVIO banks.
+ writeIntegralHitCollection(topHits, topBank, builder);
+ writeIntegralHitCollection(bottomHits, botBank, builder);
+ break;
+ default:
+ break;
+ }
+ }
+
+ private long getCellID(Object hit) {
+ if (RawCalorimeterHit.class.isInstance(hit)) {
+ return ((RawCalorimeterHit) hit).getCellID();
+ } else if (RawTrackerHit.class.isInstance(hit)) {
+ return ((RawTrackerHit) hit).getCellID();
+ }
+ return 0;
}
- private void writeIntegralHitCollection(List<RawCalorimeterHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
+ private void writeIntegralHitCollection(List<Object> hits, BaseStructure crateBank, EventBuilder builder) {
if (hits.isEmpty()) {
return;
}
// Get the ID decoder.
- IDDecoder dec = meta.getIDDecoder();
+ IDDecoder dec = HPSEcalConditions.getSubdetector().getIDDecoder();
// Make a hit map; allow for multiple hits in a crystal.
Map<Long, List<RawCalorimeterHit>> hitMap = new HashMap<Long, List<RawCalorimeterHit>>();
- for (RawCalorimeterHit hit : hits) {
+ for (Object thing : hits) {
+ RawCalorimeterHit hit = (RawCalorimeterHit) thing;
if (hitMap.get(hit.getCellID()) == null) {
hitMap.put(hit.getCellID(), new ArrayList<RawCalorimeterHit>());
}
@@ -141,14 +194,6 @@
slots.add(id);
}
- // Make a new bank for this crate.
- EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
-
-// // New bank for this slot.
-// EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_INTEGRAL_BANK_TAG, DataType.COMPOSITE, 0);
-//
-// List<CompositeData> slotDataList = new ArrayList<CompositeData>();
-//
// Loop over the slots in the map.
for (int slot : slotMap.keySet()) {
@@ -191,47 +236,20 @@
throw new RuntimeException(e);
}
}
- try {
-// slotBank.appendCompositeData(slotDataList.toArray(new CompositeData[slotDataList.size()]));
-// builder.addChild(crateBank, slotBank);
- builder.addChild(builder.getEvent(), crateBank);
- } catch (EvioException e) {
- throw new RuntimeException(e);
- }
- }
-
- private void writePulseHits(LCMetaData meta, List<RawTrackerHit> rawCalorimeterHits, EventBuilder builder) {
- System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in pulse format");
-
- // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
- List<RawTrackerHit> topHits = new ArrayList<RawTrackerHit>();
- List<RawTrackerHit> bottomHits = new ArrayList<RawTrackerHit>();
- for (RawTrackerHit hit : rawCalorimeterHits) {
- Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
- int crate = HPSEcalConditions.getCrate(daqID);
- if (crate == ECAL_BOTTOM_BANK_TAG) {
- bottomHits.add(hit);
- } else {
- topHits.add(hit);
- }
- }
-
- // Write the two collections for top and bottom hits to separate EVIO banks.
- writePulseHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
- writePulseHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
}
- private void writePulseHitCollection(List<RawTrackerHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
+ private void writePulseHitCollection(List<Object> hits, BaseStructure crateBank, EventBuilder builder) {
if (hits.isEmpty()) {
return;
}
// Get the ID decoder.
- IDDecoder dec = meta.getIDDecoder();
+ IDDecoder dec = HPSEcalConditions.getSubdetector().getIDDecoder();
// Make a hit map; allow for multiple hits in a crystal.
Map<Long, List<RawTrackerHit>> hitMap = new HashMap<Long, List<RawTrackerHit>>();
- for (RawTrackerHit hit : hits) {
+ for (Object thing : hits) {
+ RawTrackerHit hit = (RawTrackerHit) thing;
if (hitMap.get(hit.getCellID()) == null) {
hitMap.put(hit.getCellID(), new ArrayList<RawTrackerHit>());
}
@@ -255,9 +273,6 @@
slots.add(id);
}
- // Make a new bank for this crate.
- EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
-
// // New bank for this slot.
// EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_BANK_TAG, DataType.COMPOSITE, 0);
//
@@ -310,38 +325,18 @@
}
}
- private void writeWindowHits(LCMetaData meta, List<RawTrackerHit> rawCalorimeterHits, EventBuilder builder) {
- System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in window format");
-
- // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
- List<RawTrackerHit> topHits = new ArrayList<RawTrackerHit>();
- List<RawTrackerHit> bottomHits = new ArrayList<RawTrackerHit>();
- for (RawTrackerHit hit : rawCalorimeterHits) {
- Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
- int crate = HPSEcalConditions.getCrate(daqID);
- if (crate == ECAL_BOTTOM_BANK_TAG) {
- bottomHits.add(hit);
- } else {
- topHits.add(hit);
- }
- }
-
- // Write the two collections for top and bottom hits to separate EVIO banks.
- writeWindowHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
- writeWindowHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
- }
-
- private void writeWindowHitCollection(List<RawTrackerHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
+ private void writeWindowHitCollection(List<Object> hits, BaseStructure crateBank, EventBuilder builder) {
if (hits.isEmpty()) {
return;
}
// Get the ID decoder.
- IDDecoder dec = meta.getIDDecoder();
+ IDDecoder dec = HPSEcalConditions.getSubdetector().getIDDecoder();
// Make a hit map; allow for multiple hits in a crystal.
Map<Long, RawTrackerHit> hitMap = new HashMap<Long, RawTrackerHit>();
- for (RawTrackerHit hit : hits) {
+ for (Object thing : hits) {
+ RawTrackerHit hit = (RawTrackerHit) thing;
hitMap.put(hit.getCellID(), hit);
}
@@ -361,9 +356,6 @@
slots.add(id);
}
- // Make a new bank for this crate.
- EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
-
// // New bank for this slot.
// EvioBank slotBank = new EvioBank(EventConstants.ECAL_WINDOW_BANK_TAG, DataType.COMPOSITE, 0);
//