diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java index f444554573..992516ae74 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java @@ -109,7 +109,6 @@ private void printOrders() { public void mergeEvents(DataEvent event, DataEvent bg1, DataEvent bg2) { if(!event.hasBank("RUN::config") || !bg1.hasBank("RUN::config") || !bg2.hasBank("RUN::config")) { - System.out.println("Missing RUN::config bank"); return; } diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java index 97602d06c9..0e1141ff76 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/EngineProcessor.java @@ -16,7 +16,6 @@ import org.jlab.clara.engine.EngineDataType; import java.util.Arrays; import org.jlab.jnp.hipo4.data.SchemaFactory; -import org.jlab.utils.JsonUtils; import org.json.JSONObject; import org.jlab.logging.DefaultLogger; import org.jlab.utils.ClaraYaml; @@ -27,6 +26,8 @@ */ public class EngineProcessor { + public static final String ENGINE_CLASS_BG = "org.jlab.service.bg.BackgroundEngine"; + private final Map processorEngines = new LinkedHashMap<>(); private static final Logger LOGGER = Logger.getLogger(EngineProcessor.class.getPackage().getName()); private boolean updateDictionary = true; @@ -35,6 +36,24 @@ public class EngineProcessor { public EngineProcessor(){} + private ReconstructionEngine findEngine(String clazz) { + for (String k : processorEngines.keySet()) { + if (processorEngines.get(k).getClass().getName().equals(clazz)) { + return processorEngines.get(k); + } + } + return null; + } + + public void setBackgroundFiles(String filenames) { + if (findEngine(ENGINE_CLASS_BG) == null) { + LOGGER.info("Adding BackgroundEngine for -B option."); + addEngine("BG",ENGINE_CLASS_BG); + } + findEngine(ENGINE_CLASS_BG).engineConfigMap.put("filename", filenames); + findEngine(ENGINE_CLASS_BG).init(); + } + private void updateDictionary(HipoDataSource source, HipoDataSync sync){ SchemaFactory fsync = sync.getWriter().getSchemaFactory(); SchemaFactory fsrc = source.getReader().getSchemaFactory(); @@ -121,7 +140,6 @@ public void initAll(){ "org.jlab.service.raster.RasterEngine", "org.jlab.rec.cvt.services.CVTEngine", "org.jlab.service.ctof.CTOFEngine", - //"org.jlab.service.cnd.CNDEngine", "org.jlab.service.cnd.CNDCalibrationEngine", "org.jlab.service.band.BANDEngine", "org.jlab.service.htcc.HTCCReconstructionService", @@ -324,7 +342,7 @@ public static void main(String[] args){ parser.addOption("-u","true","update dictionary from writer ? "); parser.addOption("-d","1","Debug level [0 - OFF, 1 - ON/default]"); parser.addOption("-S",null,"schema directory"); - parser.setDescription("previously known as notsouseful-util"); + parser.addOption("-B",null,"background file"); parser.parse(args); @@ -380,6 +398,11 @@ else if (config>0){ if (parser.getOption("-S").stringValue() != null) proc.setBanksToKeep(parser.getOption("-S").stringValue()); + // command-line filename for background merging overrides YAML: + if (parser.getOption("-B").stringValue() != null) + proc.setBackgroundFiles(parser.getOption("-B").stringValue()); + proc.processFile(inputFile,outputFile,nskip,nevents); } + } diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java index 55541cfdd3..8a4e88a62b 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/ReconstructionEngine.java @@ -137,12 +137,12 @@ public ConstantsManager getConstantsManager(){ return constManagerMap.get(this.getClass().getName()); } + public String getEngineConfigString(String key, String def) { + return engineConfigMap.containsKey(key) ? engineConfigMap.get(key) : def; + } + public String getEngineConfigString(String key) { - String val=null; - if (this.engineConfigMap.containsKey(key)) { - val=this.engineConfigMap.get(key); - } - return val; + return getEngineConfigString(key, null); } /** diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml new file mode 100644 index 0000000000..eaadf67071 --- /dev/null +++ b/reconstruction/bg/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + org.jlab.clas12.detector + clas12detector-bg + 1.0-SNAPSHOT + jar + + + org.jlab.clas + clas12rec + ../../parent/pom.xml + 11.0.0-SNAPSHOT + + + + + + org.jlab.clas + clas-io + 11.0.0-SNAPSHOT + + + + org.jlab.clas + clas-reco + 11.0.0-SNAPSHOT + + + + org.jlab.clas + clas-analysis + 11.0.0-SNAPSHOT + + + + diff --git a/reconstruction/bg/src/main/java/org/jlab/service/bg/BackgroundEngine.java b/reconstruction/bg/src/main/java/org/jlab/service/bg/BackgroundEngine.java new file mode 100644 index 0000000000..8c464c35ef --- /dev/null +++ b/reconstruction/bg/src/main/java/org/jlab/service/bg/BackgroundEngine.java @@ -0,0 +1,83 @@ +package org.jlab.service.bg; + +import java.io.File; +import java.util.LinkedList; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jlab.analysis.eventmerger.EventMerger; +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.io.base.DataEvent; +import org.jlab.io.hipo.HipoDataSource; + +/** + * + * @author baltzell + */ +public class BackgroundEngine extends ReconstructionEngine { + + public static final String CONF_FILENAME = "filename"; + public static final String CONF_DETECTORS = "detectors"; + public static final String CONF_ORDERS = "orders"; + public static final String CONF_SUPPRESS_DOUBLES = "suppressDoubles"; + public static final String CONF_PRESERVE_ORDER = "preserveOrder"; + + static final Logger logger = Logger.getLogger(BackgroundEngine.class.getName()); + + EventMerger bgmerger = null; + HipoDataSource bgreader = null; + LinkedList bgfilenames = new LinkedList<>(); + + public BackgroundEngine() { + super("BG", "baltzell", "1.0"); + } + + @Override + public boolean init() { + if (getEngineConfigString(CONF_FILENAME) != null) + return init(getEngineConfigString(CONF_FILENAME).split(",")); + return true; + } + + public boolean init(String... filenames) { + bgfilenames.clear(); + for (String filename : filenames) { + File f = new File(filename); + if (!f.exists() || !f.isFile() || !f.canRead()) { + logger.log(Level.SEVERE,"BackgroundEngine:: filename {0} invalid.",filename); + return false; + } + logger.log(Level.INFO,"BackgroundEngine:: reading {0}",filename); + bgfilenames.add(filename); + } + String detectors = getEngineConfigString(CONF_DETECTORS,"DC,FTOF"); + String orders = getEngineConfigString(CONF_ORDERS,"NOMINAL"); + Boolean suppressDoubles = Boolean.valueOf(getEngineConfigString(CONF_SUPPRESS_DOUBLES,"true")); + Boolean preserveOrder = Boolean.valueOf(getEngineConfigString(CONF_PRESERVE_ORDER,"true")); + bgmerger = new EventMerger(detectors.split(","), orders.split(","), suppressDoubles, preserveOrder); + openNextFile(); + return true; + } + + private void openNextFile() { + String filename = bgfilenames.remove(); + bgfilenames.add(filename); + bgreader = new HipoDataSource(); + bgreader.open(filename); + } + + synchronized public DataEvent getBackgroundEvent() { + if (!bgreader.hasEvent()) openNextFile(); + return bgreader.getNextEvent(); + } + + @Override + public boolean processDataEvent(DataEvent event) { + if (!bgfilenames.isEmpty()) { + DataEvent a = getBackgroundEvent(); + DataEvent b = getBackgroundEvent(); + bgmerger.mergeEvents(event, a, b); + } + return true; + } + +} diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index f34336a7be..368fdfcaaa 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -34,5 +34,6 @@ vtx urwell alert + bg