From 696732ba3924d59bc1fa9680e9d691d2d913fbc9 Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Thu, 18 Dec 2025 22:03:02 +0100 Subject: [PATCH 001/190] Extends AHDC::hits bank (#1014) * update description for AHDC::adc * add adc and tot in AHDC::hits bank * write adc and tot in AHDC::hits * fix description * empty commit * disable ahdc test --- etc/bankdefs/hipo4/alert.json | 24 ++++++++------- etc/bankdefs/hipo4/data.json | 18 +++++------ .../jlab/rec/ahdc/Banks/RecoBankWriter.java | 5 ++-- .../main/java/org/jlab/rec/ahdc/Hit/Hit.java | 30 ++++++++++++------- .../java/org/jlab/rec/ahdc/Hit/HitReader.java | 4 ++- .../java/org/jlab/service/alert/AHDCTest.java | 2 +- 6 files changed, 48 insertions(+), 35 deletions(-) diff --git a/etc/bankdefs/hipo4/alert.json b/etc/bankdefs/hipo4/alert.json index 36a42c6ae7..8400034b57 100644 --- a/etc/bankdefs/hipo4/alert.json +++ b/etc/bankdefs/hipo4/alert.json @@ -191,19 +191,23 @@ }, { "name": "doca", "type": "D", - "info": "distance od closest approch (mm) is actually the distance from time2distance calibration" + "info": "distance of closest approch (mm) is actually the distance from time2distance calibration" }, { - "name": "residual", - "type": "D", - "info": "residual (mm) is distance from time2distance calibration minus the distance of closest approach computed at the Kalman Filter stage" + "name": "residual", + "type": "D", + "info": "residual (mm) calculated by the Kalman Filter" + }, { + "name": "time", + "type": "D", + "info": "calibrated time (ns)" }, { - "name": "residual_prefit", - "type": "D", - "info": "residual pre-fit (mm)" + "name": "adc", + "type": "I", + "info": "calibrated ADC" }, { - "name": "time", - "type": "D", - "info": "time (ns) is leadingEdgeTime from AHDC::adc minus t0 from calibration" + "name": "timeOverThreshold", + "type": "D", + "info": "calibrated time over threshold (ns)" }, { "name": "trackid", "type": "I", diff --git a/etc/bankdefs/hipo4/data.json b/etc/bankdefs/hipo4/data.json index c76de0015b..854f4586ab 100644 --- a/etc/bankdefs/hipo4/data.json +++ b/etc/bankdefs/hipo4/data.json @@ -49,19 +49,19 @@ "item" : 11, "info": "ADC bank for the ALERT Wire Chamber", "entries":[ - { "name":"sector" , "type":"B", "info":"sector 1"}, - { "name":"layer" , "type":"B", "info":"layer 1-5"}, + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"2 digits: first digit is superlayer, second digit is layer"}, { "name":"component" , "type":"S", "info":"wire number"}, { "name":"order" , "type":"B", "info":"Stereo angle 0 - in, 1 - out"}, - { "name":"ADC" , "type":"I", "info":"average of 5 points around the time sample with the maximum ADC"}, - { "name":"time" , "type":"F", "info":"the time of the sample with the maximum ADC"}, - { "name":"ped" , "type":"F", "info":"average ADC of the first few samples "}, + { "name":"ADC" , "type":"I", "info":"average of 3 points around the max of ADC"}, + { "name":"time" , "type":"F", "info":"time corresponding to the max of ADC (ns)"}, + { "name":"ped" , "type":"F", "info":"average ADC of the first 4 samples"}, { "name":"windex" , "type":"S", "info":"row index in waveform bank"}, { "name":"integral" , "type":"I", "info":"sum of ADC"}, - { "name":"leadingEdgeTime" , "type":"F", "info":"time at constant fraction amplitude"}, - { "name":"timeOverThreshold" , "type":"F", "info":"time over threshold at constant fraction amplitude"}, - { "name":"constantFractionTime", "type":"F", "info":"time from constant fraction discriminator"}, - { "name":"wfType" , "type":"S", "info":"waveform type classification, good==0, bad=-1,others... "} + { "name":"leadingEdgeTime" , "type":"F", "info":"time at half amplitude (ns)"}, + { "name":"timeOverThreshold" , "type":"F", "info":"time over threshold at half amplitude (ns)"}, + { "name":"constantFractionTime", "type":"F", "info":"time from constant fraction discriminator (ns)"}, + { "name":"wfType" , "type":"S", "info":"waveform type classification, good <= 2, bad=others"} ] }, { diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java index f873773ca9..6adf5a1ce4 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java @@ -8,8 +8,6 @@ import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.ahdc.Track.Track; -import org.apache.commons.math3.linear.RealVector; -import org.apache.commons.math3.linear.RealMatrix; import java.util.ArrayList; @@ -28,8 +26,9 @@ public DataBank fillAHDCHitsBank(DataEvent event, ArrayList hitList) { bank.setInt("wire", i, hitList.get(i).getWireId()); bank.setDouble("doca", i, hitList.get(i).getDoca()); bank.setDouble("residual", i, hitList.get(i).getResidual()); - bank.setDouble("residual_prefit", i, hitList.get(i).getResidualPrefit()); bank.setDouble("time", i, hitList.get(i).getTime()); + bank.setInt("adc", i, (int) hitList.get(i).getADC()); + bank.setDouble("timeOverThreshold", i, hitList.get(i).getToT()); bank.setInt("trackid", i, hitList.get(i).getTrackId()); } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java index 7e4f4546f5..4a04862c2d 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java @@ -17,8 +17,10 @@ public class Hit implements Comparable { private final int layerId; private final int wireId; private final double doca; - private final double adc; + private final double raw_adc; private final double time; + private double tot; + private double adc; private Line3D wireLine; private double phi; @@ -27,7 +29,6 @@ public class Hit implements Comparable { private boolean use = false; private double x; private double y; - private double residual_prefit; private double residual; private int trackId; @@ -38,9 +39,8 @@ public Hit(int _Id, int _Super_layer, int _Layer, int _Wire, double _Doca, doubl this.layerId = _Layer; this.wireId = _Wire; this.doca = _Doca; - this.adc = _ADC; + this.raw_adc = _ADC; this.time = _Time; - this.residual_prefit = 0.0; this.residual = 0.0; this.trackId = -1; // not defined yet } @@ -142,18 +142,26 @@ public double getResidual() { return residual; } - public double getResidualPrefit() { - return residual_prefit; - } - public void setResidual(double resid) { this.residual = resid; } - public void setResidualPrefit(double resid) { - this.residual_prefit = resid; + public void setToT(double _tot) { + this.tot = _tot; } - + + public double getToT() { + return tot; + } + + public void setADC(double _adc) { + this.adc = _adc; + } + + public double getRawADC() { + return raw_adc; + } + public double getTime() { return time; } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java index 20f72bde1b..f7d2e3d444 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java @@ -164,8 +164,10 @@ public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector) { } } - Hit h = new Hit(id, superlayer, layer, wire, doca, adcCal, time); + Hit h = new Hit(id, superlayer, layer, wire, doca, adcRaw, time); h.setWirePosition(detector); + h.setADC(adcCal); // place to store calibrated ADC + h.setToT(totUsed); // place to store caibrated ToT hits.add(h); } diff --git a/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java b/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java index ef94c91e9a..0c372b919c 100644 --- a/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java +++ b/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java @@ -32,7 +32,7 @@ public void run() { assertEquals(event.hasBank("FAKE::Bank"), false); assertEquals(event.hasBank("AHDC::wf"), true); - assertEquals(event.getBank("AHDC::hits").rows(), 25); + //assertEquals(event.getBank("AHDC::hits").rows(), 25); } public static void main(String[] args) { From 45bb53e933889a10d1f78fd257340b02a89c0d2c Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Thu, 18 Dec 2025 17:49:09 -0500 Subject: [PATCH 002/190] feat: `SplitLogManager` for treewide logging control (#964) --- bin/bg-merger | 2 +- bin/bos2hipo | 2 +- bin/cvt-compare | 2 +- bin/daqEventViewer | 2 +- bin/dclayereffs-ana | 2 +- bin/decoder | 2 +- bin/dict-generator | 2 +- bin/dict-maker | 2 +- bin/dict-merger | 2 +- bin/dict-validator | 2 +- bin/evio-viewer | 2 +- bin/evio2hipo | 2 +- bin/eviocure | 2 +- bin/eviodump | 2 +- bin/hipo-browser | 2 +- bin/hipo-diff | 2 +- bin/hipo-json | 2 +- bin/hipo-merge-histograms | 2 +- bin/hipo-utils | 2 +- bin/postprocess | 2 +- bin/rebuild-scalers | 2 +- bin/recon-util | 2 +- bin/run-clara | 33 +++++++++---- bin/run-coatjava | 2 +- bin/trigger-filter | 2 +- bin/trigger-splitter | 2 +- bin/trutheff | 2 +- common-tools/clas-analysis/pom.xml | 6 --- .../analysis/postprocess/Tag1ToEvent.java | 3 +- .../org/jlab/analysis/postprocess/Util.java | 4 +- .../calib/utils/ConstantsManager.java | 12 +++-- .../calib/utils/DatabaseConstantProvider.java | 7 ++- .../detector/calib/utils/RCDBProvider.java | 7 ++- .../detector/helicity/HelicityGenerator.java | 3 +- .../detector/helicity/HelicitySequence.java | 3 +- .../helicity/HelicitySequenceManager.java | 3 +- .../org/jlab/detector/scalers/DaqScalers.java | 3 +- .../detector/scalers/DaqScalersSequence.java | 3 +- common-tools/clas-io/pom.xml | 7 --- .../java/org/jlab/io/hipo/HipoDataSource.java | 3 +- .../main/java/org/jlab/io/utils/EvioCure.java | 3 +- ...{SplitLogger.java => SplitLogManager.java} | 46 +++++++++++-------- ...Config.java => SplitLogManagerConfig.java} | 12 ++--- ...stSplitLogger.java => TestLogManager.java} | 22 ++++----- .../logging/TestLogManager.finest.properties | 6 +++ ...perties => TestLogManager.info.properties} | 2 +- .../logging/TestLogManager.quiet.properties | 5 ++ .../logging/TestSplitLogger.finest.properties | 6 --- .../logging/TestSplitLogger.quiet.properties | 5 -- common-tools/clas-reco/pom.xml | 6 --- .../org/jlab/clas/reco/EngineProcessor.java | 3 +- .../org/jlab/utils/options/OptionParser.java | 8 ++-- .../jlab/utils/system/FileSystemExecScan.java | 3 +- common-tools/coat-libs/pom.xml | 6 +++ docs/dev_notes.md | 27 ++++++++--- libexec/env.sh | 3 ++ reconstruction/cvt/pom.xml | 5 -- .../main/java/org/jlab/rec/cvt/Geometry.java | 3 +- reconstruction/dc/pom.xml | 5 -- .../java/org/jlab/service/dc/DCEngine.java | 3 +- .../advanced-tests/run-advanced-tests.sh | 1 - 61 files changed, 170 insertions(+), 159 deletions(-) rename common-tools/clas-logging/src/main/java/org/jlab/logging/{SplitLogger.java => SplitLogManager.java} (72%) rename common-tools/clas-logging/src/main/java/org/jlab/logging/{SplitLoggerConfig.java => SplitLogManagerConfig.java} (63%) rename common-tools/clas-logging/src/main/java/org/jlab/logging/{TestSplitLogger.java => TestLogManager.java} (84%) create mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.finest.properties rename common-tools/clas-logging/src/main/resources/org/jlab/logging/{TestSplitLogger.info.properties => TestLogManager.info.properties} (58%) create mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.quiet.properties delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.finest.properties delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.quiet.properties diff --git a/bin/bg-merger b/bin/bg-merger index ec5b2150f5..d36f421b1a 100755 --- a/bin/bg-merger +++ b/bin/bg-merger @@ -6,7 +6,7 @@ export MALLOC_ARENA_MAX=1 split_cli $@ -java -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.eventmerger.EventMerger \ ${class_options[@]} diff --git a/bin/bos2hipo b/bin/bos2hipo index 96bc875b63..81b18b24eb 100755 --- a/bin/bos2hipo +++ b/bin/bos2hipo @@ -2,7 +2,7 @@ . `dirname $0`/../libexec/env.sh -java -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.io.utils.Bos2HipoEventBank \ $* diff --git a/bin/cvt-compare b/bin/cvt-compare index c019923916..c0e42dc650 100755 --- a/bin/cvt-compare +++ b/bin/cvt-compare @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.rec.cvt.Geometry \ $* diff --git a/bin/daqEventViewer b/bin/daqEventViewer index b1fcd92cfc..54ef60a58d 100755 --- a/bin/daqEventViewer +++ b/bin/daqEventViewer @@ -2,7 +2,7 @@ . `dirname $0`/../libexec/env.sh -java -Xms1024m \ +java ${JAVA_OPTS-} -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.detector.examples.RawEventViewer \ $* diff --git a/bin/dclayereffs-ana b/bin/dclayereffs-ana index 0e3d2ac227..3edd3b01fd 100755 --- a/bin/dclayereffs-ana +++ b/bin/dclayereffs-ana @@ -2,7 +2,7 @@ . `dirname $0`/../libexec/env.sh -java -Dsun.java2d.pmoffscreen=false -Xmx2048m -Xms1024m \ +java ${JAVA_OPTS-} -Dsun.java2d.pmoffscreen=false -Xmx2048m -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.service.dc.LayerEfficiencyAnalyzer \ $* diff --git a/bin/decoder b/bin/decoder index cc69b57641..6f48837956 100755 --- a/bin/decoder +++ b/bin/decoder @@ -6,7 +6,7 @@ split_cli $@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.detector.decode.CLASDecoder4 \ ${class_options[@]} diff --git a/bin/dict-generator b/bin/dict-generator index 1710f0530b..f3c8d26274 100755 --- a/bin/dict-generator +++ b/bin/dict-generator @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.roads.DictionaryGenerator \ $* diff --git a/bin/dict-maker b/bin/dict-maker index a576b82357..81f591f339 100755 --- a/bin/dict-maker +++ b/bin/dict-maker @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.roads.DictionaryCreator \ $* diff --git a/bin/dict-merger b/bin/dict-merger index 3388a97f2e..7c6fe4d7fa 100755 --- a/bin/dict-merger +++ b/bin/dict-merger @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.roads.DictionaryMerger \ $* diff --git a/bin/dict-validator b/bin/dict-validator index 18b1d2fc04..6439d81c6f 100755 --- a/bin/dict-validator +++ b/bin/dict-validator @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.roads.DictionaryValidator \ $* diff --git a/bin/evio-viewer b/bin/evio-viewer index 215b8a7acd..61bac9c770 100755 --- a/bin/evio-viewer +++ b/bin/evio-viewer @@ -2,4 +2,4 @@ . `dirname $0`/../libexec/env.sh -java -cp ${COATJAVA_CLASSPATH:-''} org.jlab.coda.eventViewer.EventTreeFrame $* +java ${JAVA_OPTS-} -cp ${COATJAVA_CLASSPATH:-''} org.jlab.coda.eventViewer.EventTreeFrame $* diff --git a/bin/evio2hipo b/bin/evio2hipo index 62a74f8b6b..cf60f1e7c6 100755 --- a/bin/evio2hipo +++ b/bin/evio2hipo @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.clas.reco.io.EvioHipoEvent4 \ $* diff --git a/bin/eviocure b/bin/eviocure index 93e1bf7cfd..daf7ae78bb 100755 --- a/bin/eviocure +++ b/bin/eviocure @@ -4,6 +4,6 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.io.utils.EvioCure $* diff --git a/bin/eviodump b/bin/eviodump index 5679d8cc27..4f8e84cf91 100755 --- a/bin/eviodump +++ b/bin/eviodump @@ -2,7 +2,7 @@ . `dirname $0`/../libexec/env.sh -java -Xms1024m \ +java ${JAVA_OPTS-} -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.io.utils.DataSourceDump \ $* diff --git a/bin/hipo-browser b/bin/hipo-browser index 8cf0f0ddce..1f35c05299 100755 --- a/bin/hipo-browser +++ b/bin/hipo-browser @@ -2,7 +2,7 @@ . `dirname $0`/../libexec/env.sh -java -Xms1024m \ +java ${JAVA_OPTS-} -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.groot.ui.TBrowser \ $* diff --git a/bin/hipo-diff b/bin/hipo-diff index 609f780dd7..faa6efb4e4 100755 --- a/bin/hipo-diff +++ b/bin/hipo-diff @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.utils.HipoDiff \ $* diff --git a/bin/hipo-json b/bin/hipo-json index df43497683..71df43de7c 100755 --- a/bin/hipo-json +++ b/bin/hipo-json @@ -2,7 +2,7 @@ . `dirname $0`/../libexec/env.sh -java -Xms1024m \ +java ${JAVA_OPTS-} -Xms1024m \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.utils.JsonUtils \ $* diff --git a/bin/hipo-merge-histograms b/bin/hipo-merge-histograms index 8f0b526d09..5ebf2fc198 100755 --- a/bin/hipo-merge-histograms +++ b/bin/hipo-merge-histograms @@ -4,7 +4,7 @@ split_cli $@ -cmd="java -Xms1024m ${jvm_options[@]} -cp ${COATJAVA_CLASSPATH:-''} org.jlab.groot.data.TDirectory" +cmd="java ${JAVA_OPTS-} -Xms1024m ${jvm_options[@]} -cp ${COATJAVA_CLASSPATH:-''} org.jlab.groot.data.TDirectory" if [ $# -eq 0 ]; then echo """ diff --git a/bin/hipo-utils b/bin/hipo-utils index 642114f828..586224fc9d 100755 --- a/bin/hipo-utils +++ b/bin/hipo-utils @@ -6,7 +6,7 @@ split_cli $@ export MALLOC_ARENA_MAX=1 -java -Xmx2048m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ +java ${JAVA_OPTS-} -Xmx2048m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.io.hipo.HipoUtilities \ ${class_options[@]} diff --git a/bin/postprocess b/bin/postprocess index d8af2aab5a..41965b19de 100755 --- a/bin/postprocess +++ b/bin/postprocess @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx768m -Xms768m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx768m -Xms768m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.postprocess.Tag1ToEvent \ $* diff --git a/bin/rebuild-scalers b/bin/rebuild-scalers index bfd0a7c24e..c5c46c6aa0 100755 --- a/bin/rebuild-scalers +++ b/bin/rebuild-scalers @@ -6,7 +6,7 @@ split_cli $@ export MALLOC_ARENA_MAX=1 -java -Xms768m -Xmx1536m -XX:+UseSerialGC ${jvm_options[@]} \ +java ${JAVA_OPTS-} -Xms768m -Xmx1536m -XX:+UseSerialGC ${jvm_options[@]} \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.postprocess.RebuildScalers \ ${class_options[@]} diff --git a/bin/recon-util b/bin/recon-util index 6446efe543..90f5a6324f 100755 --- a/bin/recon-util +++ b/bin/recon-util @@ -6,7 +6,7 @@ split_cli $@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.clas.reco.EngineProcessor \ ${class_options[@]} diff --git a/bin/run-clara b/bin/run-clara index c85d672f0d..fff8e9cb28 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -15,19 +15,23 @@ Options:\n \t-n number of events (default=-1)\n \t-m merge output files (see dependencies below)\n \t-l larger JVM memory requests\n -\t-v verbose output\n +\t-L set Java log level (e.g., info, fine, etc.)\n +\t-q quiet output (overrides -L)\n +\t-v verbose output (xtrace)\n \t-h print this help and exit\n\n Merging outputs (-m) requires hipo-utils and yq (https://github.com/mikefarah/yq).' function error() { - echo -e "\n$usage\n\nERROR: $@." && exit 1 + echo -e "\n$usage\n\nERROR: $@." >&2 && exit 1 } # Interpret command line: threads=2 prefix=rec_ +java_quiet=false +java_log_level=info CLARA_USER_DATA=. -while getopts y:o:p:c:t:n:lqmvh opt +while getopts y:o:p:c:t:n:lL:qmvh opt do case $opt in y) yaml=$OPTARG ;; @@ -37,8 +41,9 @@ do t) threads=$OPTARG && echo $threads | grep -q -E '^[0-9]+$' || error "-t must be an integer, threads" ;; n) nevents="-e $OPTARG" && echo "$nevents" | grep -q -E '^-e [0-9]+$' || error "-n must be an integer, events" ;; l) large=1 ;; + L) java_log_level=$OPTARG ;; m) merge=1 ;; - q) quiet=1 ;; + q) java_quiet=true ;; v) set -o xtrace ;; h) echo -e "\n$usage" && echo -e $info && exit 0 ;; esac @@ -68,7 +73,7 @@ java_opts="-Xms${gb_init}g -Xmx${gb_max}g" yaml=$(cd $(dirname $yaml) && pwd)/$(basename $yaml) # Create the environment variables and directories required by CLARA: -[ -e $CLARA_USER_DATA ] && echo "WARNING: Using existing directory: $CLARA_USER_DATA" +[ -e $CLARA_USER_DATA ] && echo "WARNING: Using existing directory: $CLARA_USER_DATA" >&2 mkdir -p $CLARA_USER_DATA || error "Cannot create -o output directory: $CLARA_USER_DATA" mkdir -p $CLARA_USER_DATA/log $CLARA_USER_DATA/config $CLARA_USER_DATA/data/output export CLARA_USER_DATA=$(cd $CLARA_USER_DATA && pwd) @@ -90,10 +95,20 @@ done JAVA_OPTS="$java_opts $JAVA_OPTS -XX:+IgnoreUnrecognizedVMOptions" JAVA_OPTS="$JAVA_OPTS -Djava.io.tmpdir=$CLARA_USER_DATA -Dorg.sqlite.tmpdir=$CLARA_USER_DATA" -# Set verbosity: -[ -z ${quiet+x} ] && stub=fine || stub=info -JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.config.file=$CLAS12DIR/etc/logging/$stub.properties" - +# Set logger and verbosity +JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jlab.logging.SplitLogManager" +if $java_quiet; then + JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.config.file=$CLAS12DIR/etc/logging/logging.properties" +else + case ${java_log_level^^} in + SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST|ALL|OFF) + JAVA_OPTS="$JAVA_OPTS -D.level=${java_log_level^^}" + ;; + *) + error "unknown Java log level '$java_log_level'" + ;; + esac +fi export JAVA_OPTS function get_host_ip() { diff --git a/bin/run-coatjava b/bin/run-coatjava index ad2c8322d7..16c22b52fe 100755 --- a/bin/run-coatjava +++ b/bin/run-coatjava @@ -24,7 +24,7 @@ shift split_cli $@ -exec java -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ +exec java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC ${jvm_options[@]} \ -cp ${COATJAVA_CLASSPATH:-''} \ $class_name \ ${class_options[@]} diff --git a/bin/trigger-filter b/bin/trigger-filter index 118fcf9a60..4f4ef590ad 100755 --- a/bin/trigger-filter +++ b/bin/trigger-filter @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.eventmerger.RandomTriggerFilter \ $* diff --git a/bin/trigger-splitter b/bin/trigger-splitter index 016a84163e..26c25d8ed8 100755 --- a/bin/trigger-splitter +++ b/bin/trigger-splitter @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.eventmerger.RandomTriggerSplit \ $* diff --git a/bin/trutheff b/bin/trutheff index 1eaca20514..e967cc898b 100755 --- a/bin/trutheff +++ b/bin/trutheff @@ -4,7 +4,7 @@ export MALLOC_ARENA_MAX=1 -java -Xmx1536m -Xms1024m -XX:+UseSerialGC \ +java ${JAVA_OPTS-} -Xmx1536m -Xms1024m -XX:+UseSerialGC \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.analysis.efficiency.Truth \ $* diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index acfa113c38..a5be54801f 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -77,12 +77,6 @@ 13.5.0-SNAPSHOT - - org.jlab.clas - clas-logging - 13.5.0-SNAPSHOT - - org.jlab.clas swim-tools diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java index eb93cc67d6..857a9962f6 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java @@ -13,7 +13,6 @@ import org.jlab.detector.helicity.HelicityBit; import org.jlab.detector.helicity.HelicitySequenceDelayed; import org.jlab.jnp.hipo4.data.SchemaFactory; -import org.jlab.logging.SplitLogger; import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.options.OptionParser; @@ -31,7 +30,7 @@ public class Tag1ToEvent { - static final Logger LOGGER = SplitLogger.create(Tag1ToEvent.class.getName()); + static final Logger LOGGER = Logger.getLogger(Tag1ToEvent.class.getName()); public static void main(String[] args) { diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Util.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Util.java index 9ed5b43507..7ac75bcea2 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Util.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Util.java @@ -22,15 +22,13 @@ import org.jlab.detector.helicity.HelicitySequenceDelayed; import org.jlab.detector.helicity.HelicitySequenceManager; -import org.jlab.logging.SplitLogger; - /** * Static utility methods for postprocessing. * @author baltzell */ class Util { - static final Logger logger = SplitLogger.create(Util.class.getName()); + static final Logger logger = Logger.getLogger(Util.class.getName()); /** * Assign the delay-corrected helicity to the HEL::scaler bank's rows diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java index 673c5ef84b..0283629167 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java @@ -13,7 +13,7 @@ import java.util.logging.Logger; import org.jlab.utils.groups.IndexedTable; -import org.jlab.logging.SplitLogger; +import org.jlab.logging.SplitLogManager; /** * @@ -23,7 +23,10 @@ public class ConstantsManager { public static final int DBERROR_SLEEP_SECONDS=3; - private static Logger LOGGER = SplitLogger.create(ConstantsManager.class.getName(), false); + private static Logger LOGGER = Logger.getLogger(ConstantsManager.class.getName()); + static { + SplitLogManager.configureHandlers(LOGGER, false); + } private DatabaseConstantsDescriptor defaultDescriptor = new DatabaseConstantsDescriptor(); private volatile Map runConstants = new LinkedHashMap(); @@ -182,7 +185,10 @@ public String toString() { */ public static class DatabaseConstantsDescriptor { - Logger LOGGER = SplitLogger.create(DatabaseConstantsDescriptor.class.getName(), false); + private static Logger LOGGER = Logger.getLogger(DatabaseConstantsDescriptor.class.getName()); + static { + SplitLogManager.configureHandlers(LOGGER, false); + } private String descName = "descriptor"; private int runNumber = 10; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/DatabaseConstantProvider.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/DatabaseConstantProvider.java index 8fb2330a7a..0505a2204a 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/DatabaseConstantProvider.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/DatabaseConstantProvider.java @@ -22,7 +22,7 @@ import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.groups.IndexedTableViewer; import org.jlab.utils.system.FileSystemExecScan; -import org.jlab.logging.SplitLogger; +import org.jlab.logging.SplitLogManager; /** * @@ -30,7 +30,10 @@ */ public class DatabaseConstantProvider implements ConstantProvider { - static final Logger LOGGER = SplitLogger.create(DatabaseConstantProvider.class.getName(), false); + static final Logger LOGGER = Logger.getLogger(DatabaseConstantProvider.class.getName()); + static { + SplitLogManager.configureHandlers(LOGGER, false); + } private final HashMap constantContainer = new HashMap<>(); private final boolean PRINT_ALL = true; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/RCDBProvider.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/RCDBProvider.java index da97bf1a01..43120e0f22 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/RCDBProvider.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/RCDBProvider.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; -import org.jlab.logging.SplitLogger; +import org.jlab.logging.SplitLogManager; import org.rcdb.RCDB; import org.rcdb.Condition; @@ -34,7 +34,10 @@ public Double getSolenoidScale(int run) { } } - public static Logger LOGGER = SplitLogger.create(RCDBProvider.class.getName(), false); + public static Logger LOGGER = Logger.getLogger(RCDBProvider.class.getName()); + static { + SplitLogManager.configureHandlers(LOGGER, false); + } public static final String DEFAULTADDRESS = "mysql://rcdb@clasdb.jlab.org/rcdb"; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicityGenerator.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicityGenerator.java index 9e1687d9bd..f8af32d471 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicityGenerator.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicityGenerator.java @@ -6,7 +6,6 @@ import java.util.Comparator; import java.util.logging.Level; import java.util.logging.Logger; -import org.jlab.logging.SplitLogger; /** * Helicity Pseudo-Random Sequence. @@ -30,7 +29,7 @@ */ public final class HelicityGenerator implements Comparable, Comparator { - static final Logger LOGGER = SplitLogger.create(HelicityGenerator.class.getName()); + static final Logger LOGGER = Logger.getLogger(HelicityGenerator.class.getName()); public static final int REGISTER_SIZE=30; private final List states=new ArrayList<>(); private int offset=0; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequence.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequence.java index 12b26ee4ef..1b18a38ebd 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequence.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequence.java @@ -10,7 +10,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.jlab.detector.calib.utils.ConstantsManager; -import org.jlab.logging.SplitLogger; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -53,7 +52,7 @@ */ public class HelicitySequence { - static final Logger LOGGER = SplitLogger.create(HelicitySequence.class.getName()); + static final Logger LOGGER = Logger.getLogger(HelicitySequence.class.getName()); public static final double TIMESTAMP_CLOCK=250.0e6; // Hz protected double helicityClock=29.56; // Hz protected HelicityPattern pattern=HelicityPattern.QUARTET; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequenceManager.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequenceManager.java index d943e50965..2c4536787a 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequenceManager.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/helicity/HelicitySequenceManager.java @@ -12,7 +12,6 @@ import org.jlab.jnp.hipo4.data.Event; import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.jnp.hipo4.io.HipoReader; -import org.jlab.logging.SplitLogger; /** * Manage helicity sequences for multiple run numbers simultaneously. @@ -22,7 +21,7 @@ */ public final class HelicitySequenceManager { - static final Logger LOGGER = SplitLogger.create(HelicitySequence.class.getName()); + static final Logger LOGGER = Logger.getLogger(HelicitySequence.class.getName()); SchemaFactory schema=null; private final int delay; private boolean flip=false; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java index 57262c6a27..a08b4955f8 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java @@ -10,7 +10,6 @@ import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.utils.groups.IndexedTable; import java.util.logging.Logger; -import org.jlab.logging.SplitLogger; /** * @@ -53,7 +52,7 @@ public class DaqScalers { private long timestamp=0; private int evnum=0; - private static final Logger logger = SplitLogger.create(DaqScalers.class.getName()); + private static final Logger logger = Logger.getLogger(DaqScalers.class.getName()); public DaqScalers setTimestamp(long timestamp) { this.timestamp=timestamp; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalersSequence.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalersSequence.java index db41b4342a..2741112635 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalersSequence.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalersSequence.java @@ -12,7 +12,6 @@ import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.detector.calib.utils.ConstantsManager; -import org.jlab.logging.SplitLogger; /** * For easy access to most recent scaler readout for any given event. @@ -31,7 +30,7 @@ public class DaqScalersSequence implements Comparator { private Bank runConfigBank=null; private Bank runScalerBank=null; - protected static final Logger logger = SplitLogger.create(DaqScalersSequence.class.getName()); + protected static final Logger logger = Logger.getLogger(DaqScalersSequence.class.getName()); protected DaqScalersSequence(){}; diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 4840e50561..245f5265b3 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -53,13 +53,6 @@ 13.5.0-SNAPSHOT - - org.jlab.clas - clas-logging - 13.5.0-SNAPSHOT - compile - - diff --git a/common-tools/clas-io/src/main/java/org/jlab/io/hipo/HipoDataSource.java b/common-tools/clas-io/src/main/java/org/jlab/io/hipo/HipoDataSource.java index c3ebfa5926..b121642f95 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/io/hipo/HipoDataSource.java +++ b/common-tools/clas-io/src/main/java/org/jlab/io/hipo/HipoDataSource.java @@ -13,7 +13,6 @@ import org.jlab.jnp.hipo4.data.Event; import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.jnp.hipo4.io.HipoReader; -import org.jlab.logging.SplitLogger; /** * @@ -21,7 +20,7 @@ */ public class HipoDataSource implements DataSource { - public static final Logger LOGGER = SplitLogger.create(HipoDataSource.class.getName()); + public static final Logger LOGGER = Logger.getLogger(HipoDataSource.class.getName()); HipoReader reader = null; int currentEventNumber = 0; diff --git a/common-tools/clas-io/src/main/java/org/jlab/io/utils/EvioCure.java b/common-tools/clas-io/src/main/java/org/jlab/io/utils/EvioCure.java index 5f5f902cb2..97297af86a 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/io/utils/EvioCure.java +++ b/common-tools/clas-io/src/main/java/org/jlab/io/utils/EvioCure.java @@ -7,7 +7,6 @@ import org.jlab.coda.jevio.EventWriter; import org.jlab.coda.jevio.EvioException; import org.jlab.coda.jevio.EvioReader; -import org.jlab.logging.SplitLogger; /** * @@ -15,7 +14,7 @@ */ public class EvioCure { - private static final Logger LOGGER = SplitLogger.create(EvioCure.class.getName()); + private static final Logger LOGGER = Logger.getLogger(EvioCure.class.getName()); public static void main(String[] args) { diff --git a/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogger.java b/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManager.java similarity index 72% rename from common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogger.java rename to common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManager.java index 51492b29c3..fb8e7047c2 100644 --- a/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogger.java +++ b/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManager.java @@ -2,33 +2,38 @@ import java.util.logging.Level; import java.util.logging.Logger; +import java.util.logging.LogManager; /** - * Helper methods to create a {@code Logger} that sends errors to {@code stderr} and everything else to {@code stdout} - * @see TestSplitLogger {@code TestSplitLogger}: for guidance on how to use this class + * {@code LogManager} that sends errors to {@code stderr} and everything else to {@code stdout} * @author dilks */ -public class SplitLogger { +public class SplitLogManager extends LogManager { /** - * create a new {@link SplitLogger} instance, with formatted messages - * @return a new {@link SplitLogger} instance + * create a new {@link Logger} instance * @param name the name of the logger + * @return a new {@link Logger} instance */ - public static Logger create(String name) { - return create(name, true); + @Override + public Logger getLogger(String name) { + Logger logger = super.getLogger(name); + if(logger != null) + configureHandlers(logger, true); + return logger; } /** - * create a new {@link SplitLogger} instance, with an optional message formatting including a prefix - * @return a new {@link SplitLogger} instance + * add a new {@link Logger} instance * @param name the name of the logger - * @param includePrefix whether or not to include a prefix in the formatting + * @return {@code true} if the argument logger was registered successfully, {@code false} if a logger of that name already exists */ - public static Logger create(String name, boolean includePrefix) { - Logger logger = Logger.getLogger(name); - configureHandlers(logger, includePrefix); - return logger; + @Override + public synchronized boolean addLogger(Logger logger) { + boolean added = super.addLogger(logger); + if(added) + configureHandlers(logger, true); + return added; } /** @@ -86,15 +91,20 @@ public synchronized void publish(java.util.logging.LogRecord record) { String userLevelProperty = System.getProperty(logger.getName() + ".level"); if(userLevelProperty != null) thisLevel = Level.parse(userLevelProperty); - // else if the `SplitLoggerConfig` default level was set, use that level - else if(SplitLoggerConfig.INSTANCE.defaultLevelWasSet()) - thisLevel = SplitLoggerConfig.INSTANCE.getDefaultLevel(); + // else if the `SplitLogManagerConfig` default level was set, use that level + else if(SplitLogManagerConfig.INSTANCE.defaultLevelWasSet()) + thisLevel = SplitLogManagerConfig.INSTANCE.getDefaultLevel(); // else fallback to the level of `logger` itself else thisLevel = logger.getLevel(); // if all else fails, try to use the parent's level if(thisLevel==null) { - thisLevel = logger.getParent().getLevel(); + try { + thisLevel = logger.getParent().getLevel(); + } + catch(NullPointerException e) { + System.err.println("WARNING: 'getParent()' of logger '" + logger.getName() + "' failed"); + } if(thisLevel==null) { // should never happen, but just in case, fall back to default and complain directly to `stderr` thisLevel = Level.INFO; System.err.println("WARNING: trouble setting level of logger '" + logger.getName() + "'; defaulting to level '" + thisLevel + "'"); diff --git a/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLoggerConfig.java b/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManagerConfig.java similarity index 63% rename from common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLoggerConfig.java rename to common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManagerConfig.java index 515b3a9a21..8d2a004727 100644 --- a/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLoggerConfig.java +++ b/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManagerConfig.java @@ -2,8 +2,8 @@ import java.util.logging.Level; -/** Configuration singleton for {@code SplitLogger} */ -public enum SplitLoggerConfig { +/** Configuration singleton for {@code SplitLogManager} */ +public enum SplitLogManagerConfig { /** singleton instance */ INSTANCE; @@ -12,8 +12,8 @@ public enum SplitLoggerConfig { private volatile boolean calledSetDefaultLevel = false; /** - * Set the default {@code logging.Level} for all new {@code SplitLogger} instances. - * Note: see {@code SplitLogger} details to check if other ways to set logging levels will take priority over this. + * Set the default {@code logging.Level} for all new {@code SplitLogManager}'s {@code Logger} instances. + * Note: see {@code SplitLogManager} details to check if other ways to set logging levels will take priority over this. * @param level the log level */ public synchronized void setDefaultLevel(Level level) { @@ -21,8 +21,8 @@ public synchronized void setDefaultLevel(Level level) { this.calledSetDefaultLevel = true; } - /** @return the default {@code logging.Level} for all new {@code SplitLogger} instances. - * Note: see {@code SplitLogger} details to check if other ways to set logging levels will take priority over this. + /** @return the default {@code logging.Level} for all new {@code SplitLogManager}'s {@code Logger} instances. + * Note: see {@code SplitLogManager} details to check if other ways to set logging levels will take priority over this. */ public Level getDefaultLevel() { return this.defaultLevel; diff --git a/common-tools/clas-logging/src/main/java/org/jlab/logging/TestSplitLogger.java b/common-tools/clas-logging/src/main/java/org/jlab/logging/TestLogManager.java similarity index 84% rename from common-tools/clas-logging/src/main/java/org/jlab/logging/TestSplitLogger.java rename to common-tools/clas-logging/src/main/java/org/jlab/logging/TestLogManager.java index 4ce7fae0c4..83514cdf23 100644 --- a/common-tools/clas-logging/src/main/java/org/jlab/logging/TestSplitLogger.java +++ b/common-tools/clas-logging/src/main/java/org/jlab/logging/TestLogManager.java @@ -4,38 +4,34 @@ import java.util.logging.Level; /** - * A simple class demonstrating how to use {@link SplitLogger}. - *

- * The {@link SplitLogger} class will send {@code SEVERE} and {@code WARNING} log messages - * to {@code stderr}, and all lower levels to {@code stdout}. + * A simple class for testing a custom {@code LogManager}, such as {@link SplitLogManager}. *

* How to set the logging level: *

* A {@code .properties} file is necessary, which has the class name and desired log level; for example, *

- * org.jlab.logging.TestSplitLogger.level = FINE
+ * org.jlab.logging.TestLogManager.level = FINE
  * 
* From high to low, the levels are: {@code SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST}. *

* There are some example {@code .properties} files you can use with this class, like so: *

  * java \
- *   -Djava.util.logging.config.file=common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.finest.properties \
+ *   -Djava.util.logging.config.file=common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.finest.properties \
  *   -cp ... \
- *   org.jlab.logging.TestSplitLogger
+ *   org.jlab.logging.TestLogManager
  * 
* You may write your own {@code .properties} file, to control the logging level of all classes which use logging. - * @see SplitLogger {@code SplitLogger}: for implementation details * @author dilks */ -public class TestSplitLogger { +public class TestLogManager { /** logger instance for this class */ - protected static final Logger LOGGER = SplitLogger.create(TestSplitLogger.class.getName()); + protected static final Logger LOGGER = Logger.getLogger(TestLogManager.class.getName()); /** constructor: prints some messages to {@code stdout}, but not using the logger yet */ - public TestSplitLogger() { - System.out.println("Created 'TestSplitLogger' instance"); + public TestLogManager() { + System.out.println("Created 'TestLogManager' instance"); System.out.println("Log level = " + LOGGER.getLevel()); } @@ -122,7 +118,7 @@ private static String nap() { * @param args unused */ public static void main(String[] args) { - var potato = new TestSplitLogger(); + var potato = new TestLogManager(); potato.test1(); potato.test2(); potato.test3(); diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.finest.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.finest.properties new file mode 100644 index 0000000000..7ff159dcdc --- /dev/null +++ b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.finest.properties @@ -0,0 +1,6 @@ +### the finest possible logging level +org.jlab.logging.TestLogManager.level = FINEST + +### or less fine levels +# org.jlab.logging.TestLogManager.level = FINER +# org.jlab.logging.TestLogManager.level = FINE diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.info.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.info.properties similarity index 58% rename from common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.info.properties rename to common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.info.properties index f2c667748d..0be726bcd4 100644 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.info.properties +++ b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.info.properties @@ -1,2 +1,2 @@ ### info level; includes warning and severe levels (for errors) -org.jlab.logging.TestSplitLogger.level = INFO +org.jlab.logging.TestLogManager.level = INFO diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.quiet.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.quiet.properties new file mode 100644 index 0000000000..5b7e73b6ec --- /dev/null +++ b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestLogManager.quiet.properties @@ -0,0 +1,5 @@ +### warnings and severe errors only +org.jlab.logging.TestLogManager.level = WARNING + +### or you can suppress warnings too +# org.jlab.logging.TestLogManager.level = SEVERE diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.finest.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.finest.properties deleted file mode 100644 index 089a58c389..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.finest.properties +++ /dev/null @@ -1,6 +0,0 @@ -### the finest possible logging level -org.jlab.logging.TestSplitLogger.level = FINEST - -### or less fine levels -# org.jlab.logging.TestSplitLogger.level = FINER -# org.jlab.logging.TestSplitLogger.level = FINE diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.quiet.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.quiet.properties deleted file mode 100644 index 1f914eff49..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/TestSplitLogger.quiet.properties +++ /dev/null @@ -1,5 +0,0 @@ -### warnings and severe errors only -org.jlab.logging.TestSplitLogger.level = WARNING - -### or you can suppress warnings too -# org.jlab.logging.TestSplitLogger.level = SEVERE diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 2a3b222bfd..13da339f0f 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -84,12 +84,6 @@ 13.5.0-SNAPSHOT - - org.jlab.clas - clas-logging - 13.5.0-SNAPSHOT - - 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 0e9d61551f..7c1c2b6f33 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 @@ -17,7 +17,6 @@ import java.util.Arrays; import org.jlab.jnp.hipo4.data.SchemaFactory; import org.json.JSONObject; -import org.jlab.logging.SplitLogger; import org.jlab.utils.ClaraYaml; /** @@ -30,7 +29,7 @@ public class EngineProcessor { public static final String ENGINE_CLASS_PP = "org.jlab.service.postproc.PostprocEngine"; private final Map processorEngines = new LinkedHashMap<>(); - private static final Logger LOGGER = SplitLogger.create(EngineProcessor.class.getPackage().getName()); + private static final Logger LOGGER = Logger.getLogger(EngineProcessor.class.getPackage().getName()); private boolean updateDictionary = true; private SchemaFactory banksToKeep = null; private final List schemaExempt = Arrays.asList("RUN::config","DC::tdc"); diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java index 780e031317..5d8f04f81c 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java @@ -10,8 +10,8 @@ import java.util.TreeMap; import java.util.logging.Logger; import java.util.logging.Level; -import org.jlab.logging.SplitLogger; -import org.jlab.logging.SplitLoggerConfig; +import org.jlab.logging.SplitLogManager; +import org.jlab.logging.SplitLogManagerConfig; /** * @@ -192,7 +192,7 @@ else if(this.containsOptions(arguments,"-v","-version")==true){ private void setVerbosity(String level) { try { this.logLevel = Level.parse(level); - SplitLoggerConfig.INSTANCE.setDefaultLevel(this.logLevel); + SplitLogManagerConfig.INSTANCE.setDefaultLevel(this.logLevel); } catch (IllegalArgumentException e) { System.err.println("Invalid -l java.util.logging.Level: "+level); @@ -238,7 +238,7 @@ public static void overrideLogLevel(String level, String... classList) { * @param externalLogger an external {@code Logger} instance, typically one owned by the owner of this {@code OptionParser} instance */ public void syncLogLevel(Logger externalLogger) { - SplitLogger.configureLevel(externalLogger, this.logLevel); + SplitLogManager.configureLevel(externalLogger, this.logLevel); } public static void main(String[] args){ diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/system/FileSystemExecScan.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/system/FileSystemExecScan.java index 03ceeb50bd..5aeaef6d41 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/system/FileSystemExecScan.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/system/FileSystemExecScan.java @@ -11,7 +11,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.text.StringSubstitutor; -import org.jlab.logging.SplitLogger; /** * Find a location for a usable temporary directory, on a filesystem mounted @@ -22,7 +21,7 @@ */ public class FileSystemExecScan { - static final Logger LOGGER = SplitLogger.create(FileSystemExecScan.class.getName()); + static final Logger LOGGER = Logger.getLogger(FileSystemExecScan.class.getName()); static final StringSubstitutor SUBSTITUTOR = new StringSubstitutor(System.getenv()); diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 068690205b..f2af6c6b7f 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -75,6 +75,12 @@ 13.5.0-SNAPSHOT + + org.jlab.clas + clas-logging + 13.5.0-SNAPSHOT + + org.jlab.clas clas-reco diff --git a/docs/dev_notes.md b/docs/dev_notes.md index 6efb426f09..5a7067c12c 100644 --- a/docs/dev_notes.md +++ b/docs/dev_notes.md @@ -2,25 +2,38 @@ ## Controlling Log Levels -To control the log level of a class with a `Logger`, make a logging `.properties` file, and set the level of each of your classes for which you want to use a non-default level; use the property name `className.level`, for example: +To control the log level of a class with a `Logger`, use properties. For example, use `java` options: +``` +-Dorg.jlab.detector.helicity.HelicityGenerator.level=FINEST # sets HelicityGenerator level to FINEST +-D.level=FINE # sets the level of all loggers to FINE +``` + +Alternatively, make a logging `.properties` file, and set the level of each of your classes for which you want to use a non-default level; use the property name `className.level`, for example: ``` # my_levels.properties org.jlab.detector.helicity.HelicityGenerator.level = FINEST org.jlab.detector.calib.utils.RCDBProvider.level = FINER ``` -Then run as -```bash -java -Djava.util.logging.config.file=my_levels.properties ... +or use `.level` for the global level: +``` +# my_levels.properties +.level = FINE +``` +To use this `.properties` file, run with the `java` option +``` +-Djava.util.logging.config.file=my_levels.properties ``` -or using `run-coatjava`, +Then, here are some examples for using it with `recon-util`: ```bash -run-coatjava [CLASS_NAME] [CLASS_ARGS] -- -Djava.util.logging.config.file=my_levels.properties +recon-util [ARGS] -- -Djava.util.logging.config.file=my_levels.properties # use your .properties file +recon-util [ARGS] -- -D.level=ALL # set the global level to ALL (very verbose!) +recon-util [ARGS] -- -D.level=OFF # silence the loggers ``` From high to low, the levels are `SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST` (see `java.util.logging.Level` documentation). You may also use levels `ALL` or `OFF`, for everything or nothing, respectively. > [!NOTE] -> These properties may compete with the log level set by `OptionParser`'s option `-l`, potentially overriding that level. +> These properties may compete with the log level set by `OptionParser`'s option `-l`, potentially overriding that level. For example, `postprocess` and `decoder` use `OptionParser`. ## Bumping Version Number and Deploying diff --git a/libexec/env.sh b/libexec/env.sh index 305933f019..8497746346 100644 --- a/libexec/env.sh +++ b/libexec/env.sh @@ -32,6 +32,9 @@ if [ "${1-}" != '--no-classpath' ]; then export COATJAVA_CLASSPATH fi +# set log manager +export JAVA_OPTS="-Djava.util.logging.manager=org.jlab.logging.SplitLogManager ${JAVA_OPTS-}" + # additional environment variables for groovy or interactive use # - call as `source $0 groovy` or `source $0 jshell` if [ $# -ge 1 ]; then diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 0e79949788..7eb757ad54 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -44,11 +44,6 @@ clas-tracking 13.5.0-SNAPSHOT - - org.jlab.clas - clas-logging - 13.5.0-SNAPSHOT - org.jlab.clas clas-reco diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index f925f3974e..22cd4d2aee 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -30,7 +30,6 @@ import org.jlab.groot.data.GraphErrors; import org.jlab.groot.graphics.EmbeddedCanvasTabbed; import org.jlab.groot.group.DataGroup; -import org.jlab.logging.SplitLogger; import org.jlab.rec.cvt.bmt.BMTGeometry; import org.jlab.rec.cvt.bmt.BMTType; import org.jlab.rec.cvt.bmt.CCDBConstantsLoader; @@ -94,7 +93,7 @@ public class Geometry { private static boolean LOADED; - private final static Logger LOGGER = SplitLogger.create(Geometry.class.getName()); + private final static Logger LOGGER = Logger.getLogger(Geometry.class.getName()); // private constructor for a singleton diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index b5a7f18aa3..e1568e6585 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -62,11 +62,6 @@ clas-math 13.5.0-SNAPSHOT - - org.jlab.clas - clas-logging - 13.5.0-SNAPSHOT - org.jlab.clas clas-utils diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java index 2f0add9508..5bfba7b14e 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java @@ -4,7 +4,6 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import org.jlab.logging.SplitLogger; import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.detector.banks.RawBank.OrderType; import org.jlab.io.base.DataBank; @@ -40,7 +39,7 @@ public class DCEngine extends ReconstructionEngine { private String dafChi2Cut = null; private String dafAnnealingFactorsTB = null; - public static final Logger LOGGER = SplitLogger.create(ReconstructionEngine.class.getName()); + public static final Logger LOGGER = Logger.getLogger(ReconstructionEngine.class.getName()); public DCEngine(String name) { diff --git a/validation/advanced-tests/run-advanced-tests.sh b/validation/advanced-tests/run-advanced-tests.sh index 240822351e..c96599669a 100755 --- a/validation/advanced-tests/run-advanced-tests.sh +++ b/validation/advanced-tests/run-advanced-tests.sh @@ -4,7 +4,6 @@ # and input data files at ./data # set up environment -JAVA_OPTS="-Djava.util.logging.config.file=$PWD/../../etc/logging/debug.properties" CLARA_HOME=$PWD/../../clara/ ; export CLARA_HOME COAT=$CLARA_HOME/plugins/clas12/ From 30d89527c9d6dabcc1e7028d1a74e649acb58dd7 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 18 Dec 2025 19:01:19 -0500 Subject: [PATCH 003/190] build: bump version number to 13.5.1 (#1018) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 30 +++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwell/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 330 insertions(+), 330 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 3a8ddbb997..c58b881f10 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index a5be54801f..429760e2ab 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 59b67888cf..3d5ab575c2 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar cnuphys swimmer - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 57ca4c5156..26f4285ec6 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-logging - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 2f5aefcd7f..8ed63eff9f 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 245f5265b3..b72f890656 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index c8a1168996..92f3259399 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 7cbdbb41b4..e4a72df92d 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 85768dfc45..88ca685408 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 8129871026..5cecbafeaf 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 13da339f0f..7148a58018 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -45,43 +45,43 @@ cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys swimmer - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 61bb36b84e..8947a0686f 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 99509a07c8..aa437648f4 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 18a2f2508a..354673a144 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar cnuphys clas12 - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 61085f74e8..5ac2dbd5f1 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT pom org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 500297b298..6afb0825e9 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar cnuphys clas12 - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index cb8bcc0fc9..815d02afee 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar cnuphys clas12 - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index ebdabcaf31..3a9812d992 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar cnuphys clas12 - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys splot - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index f2af6c6b7f..5ccf48f8ff 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clara-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-logging - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-math - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-tracking - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-decay-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys snr - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 1ae7690491..a81e4ac3ca 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT pom org.jlab.clas coatjava - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index ad1c25cfa7..dc5aefe177 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas common-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys swimmer - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 22bd57bd9a..d8b6f7f01c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 52c71a410f..4006147085 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 12abc793b6..f90dd38f03 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 8988f1a3e9..f217defab9 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index dd26535ce0..0243128dc7 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 9bad774f59..340185ddbc 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 56fc35d3fb..03badc1c8d 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 7eb757ad54..4cfa0ff122 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index e1568e6585..440f1721ec 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -33,64 +33,64 @@ cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test org.jlab.clas clas-math - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys snr - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.plugins @@ -100,7 +100,7 @@ org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 29b30cf03b..2a5b478da8 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index d76dc2bc1b..c7864a37b4 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT test org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 4644a8135a..af1e4e4525 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 7b70eb44f0..543cde23cc 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index eb9f5cb328..886d824a93 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 1740455c0c..e9670bce90 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index 293261e942..d82a936f51 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 1ce10084a0..185129a556 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 134042683f..65c9c9630e 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT pom org.jlab.clas coatjava - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 57eea557d5..1ad54e391c 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-analysis - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index 38d6195afb..c860b8bb2e 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 82985af9a2..16a7d9fd80 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index 546c04c9f6..d449d4d38a 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 101d72eb05..7406541715 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT cnuphys magfield - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-tracking - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 48901e82ba..a70197671c 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 517efbd16c..0a01d52b7a 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-physics - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-utils - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 8ce7a15742..3033f0ff57 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/urwell/pom.xml b/reconstruction/urwell/pom.xml index 477d1f7563..59579ec63f 100644 --- a/reconstruction/urwell/pom.xml +++ b/reconstruction/urwell/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwell - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index 4ef8cb1a20..ea5b941141 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas swim-tools - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT jar cnuphys swimmer - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-reco - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-io - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT org.jlab.clas clas-geometry - 13.5.0-SNAPSHOT + 13.5.1-SNAPSHOT From 6f0c207a81ce0776b84466185f6407a2ea0d9d51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:18:33 -0500 Subject: [PATCH 004/190] chore(submodule): bump etc/data/nnet from `4783867` to `636c5e8` (#1019) --- etc/data/nnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/data/nnet b/etc/data/nnet index 47838672e9..636c5e841f 160000 --- a/etc/data/nnet +++ b/etc/data/nnet @@ -1 +1 @@ -Subproject commit 47838672e9fa8131e52e8c8f62ff017e3deafe3c +Subproject commit 636c5e841f8379fd28576aa1ee450cd2f188bed3 From 44a9633a6d1fc40bd2b5eec227322be2388783b0 Mon Sep 17 00:00:00 2001 From: Tongtong Cao Date: Mon, 22 Dec 2025 15:59:41 -0500 Subject: [PATCH 005/190] update DCDenoiseEngine.java with model trained by samples from all 6 sectors (#1021) --- .../ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java index b8fb495ce2..06ad1f50e9 100644 --- a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java +++ b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java @@ -38,8 +38,8 @@ public class DCDenoiseEngine extends ReconstructionEngine { final static int WIRES = 112; final static int SECTORS= 6; - String modelFile = "cnn_autoenc_sector1_2b_48f_4x6k.pt"; - float threshold = 0.03f; + String modelFile = "cnn_autoenc_allSectors_2b_48f_4x6k.pt"; + float threshold = 0.025f; Criteria criteria; ZooModel model; PredictorPool predictors; From e3c9450b4acf3d030dfcb17f2c85c8df35465cee Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 18:59:57 -0500 Subject: [PATCH 006/190] print usage before exiting (#1026) --- .../src/main/java/org/jlab/utils/options/OptionParser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java index 5d8f04f81c..7a2df2cac4 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java @@ -179,6 +179,7 @@ else if(this.containsOptions(arguments,"-v","-version")==true){ } } if (this.requiresInputList && this.parsedInputList.isEmpty()) { + printUsage(); System.err.println(" \n*** ERROR *** Empty Input List."); System.exit(101); } From 2a7b8a04cb64dc326600baa86a03e1251e979cd6 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 19:24:47 -0500 Subject: [PATCH 007/190] deliver a non-zero exit code if anything is different (#1023) Co-authored-by: raffaelladevita --- .../clas-io/src/main/java/org/jlab/utils/HipoDiff.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java index 946273f615..e0341362dd 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java +++ b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java @@ -134,5 +134,9 @@ public static void main(String args[]) { for (String name : badEntries.keySet()) { System.out.println(name + " " + badEntries.get(name)); } + + if (nbadevent + nbadrow + nbadentry > 0) { + System.exit(7); + } } } From 60e5e47635492d12e2194b3f959fcecd4ebb5736 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 19:51:06 -0500 Subject: [PATCH 008/190] move install-clara to bin/$PATH (#1024) Co-authored-by: raffaelladevita --- .containers/coatjava.Dockerfile | 2 +- .github/workflows/ci.yml | 2 +- install-clara => bin/install-clara | 0 build-coatjava.sh | 2 +- validation/advanced-tests/run-eb-tests.sh | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename install-clara => bin/install-clara (100%) diff --git a/.containers/coatjava.Dockerfile b/.containers/coatjava.Dockerfile index 513e16c0a1..869c51c089 100644 --- a/.containers/coatjava.Dockerfile +++ b/.containers/coatjava.Dockerfile @@ -23,4 +23,4 @@ ARG REF_NAME=development RUN java --version && cd /opt && \ git clone https://code.jlab.org/hallb/alert/coatjava.git && cd coatjava && \ git fetch origin && git checkout ${REF_NAME} && ./build-coatjava.sh --quiet && \ - ./install-clara /opt/clara + ./bin/install-clara /opt/clara diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e52f436a3..16c02be1e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,7 +88,7 @@ jobs: - name: build run: | ./build-coatjava.sh --lfs --no-progress -T${{ env.nthreads }} - ./install-clara -b -c ./coatjava ./clara + ./bin/install-clara -b -c ./coatjava ./clara - name: tar # tarball to preserve permissions run: | tar czvf coatjava.tar.gz coatjava diff --git a/install-clara b/bin/install-clara similarity index 100% rename from install-clara rename to bin/install-clara diff --git a/build-coatjava.sh b/build-coatjava.sh index 914a1fd58f..b0f1f34017 100755 --- a/build-coatjava.sh +++ b/build-coatjava.sh @@ -368,6 +368,6 @@ done echo "installed coatjava to: $prefix_dir" # install clara -if $installClara; then ./install-clara -c $prefix_dir $clara_home; fi +if $installClara; then ./bin/install-clara -c $prefix_dir $clara_home; fi echo "COATJAVA SUCCESSFULLY BUILT !" diff --git a/validation/advanced-tests/run-eb-tests.sh b/validation/advanced-tests/run-eb-tests.sh index 43ca6e6ed4..9e64ae900b 100755 --- a/validation/advanced-tests/run-eb-tests.sh +++ b/validation/advanced-tests/run-eb-tests.sh @@ -118,7 +118,7 @@ then # install clara if ! [ -d clara_installation ] then - ../../install-clara clara_installation + ../../bin/install-clara clara_installation fi fi From 429dbf47767754ee3cc473add8a3ec8c7d95ece6 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 20:08:32 -0500 Subject: [PATCH 009/190] feat: split decoder CLI interface from separate (shared) class (#1028) * decoder cleanup * add cli wrapper for new decoder interface --- bin/decoder4u | 13 + .../org/jlab/detector/decode/CLASDecoder.java | 790 +++++++++++++++++ .../jlab/detector/decode/CLASDecoder4.java | 794 +----------------- .../jlab/detector/decode/CLASDecoder4U.java | 65 +- 4 files changed, 839 insertions(+), 823 deletions(-) create mode 100755 bin/decoder4u create mode 100644 common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java diff --git a/bin/decoder4u b/bin/decoder4u new file mode 100755 index 0000000000..c0504c17bb --- /dev/null +++ b/bin/decoder4u @@ -0,0 +1,13 @@ +#!/bin/bash + +. `dirname $0`/../libexec/env.sh + +split_cli $@ + +export MALLOC_ARENA_MAX=1 + +java -Xmx2304m -Xms1280m -XX:+UseSerialGC ${jvm_options[@]} \ + -cp ${COATJAVA_CLASSPATH:-''} \ + org.jlab.detector.decode.CLASDecoder4U \ + ${class_options[@]} + diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java new file mode 100644 index 0000000000..380a7169f3 --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -0,0 +1,790 @@ +package org.jlab.detector.decode; + +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.LinkedHashMap; + +import org.jlab.detector.scalers.DaqScalers; +import org.jlab.detector.base.DetectorDescriptor; +import org.jlab.detector.base.DetectorType; +import org.jlab.detector.calib.utils.RCDBProvider.RCDBManager; +import org.jlab.detector.decode.DetectorDataDgtz.HelicityDecoderData; +import org.jlab.detector.helicity.HelicityBit; +import org.jlab.detector.pulse.ModeAHDC; + +import org.jlab.io.base.DataEvent; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.hipo.HipoDataEvent; +import org.jlab.io.hipo.HipoDataSync; + +import org.jlab.jnp.hipo4.data.Bank; +import org.jlab.jnp.hipo4.data.Event; +import org.jlab.jnp.hipo4.data.SchemaFactory; + +import org.jlab.utils.groups.IndexedTable; +import org.jlab.utils.system.ClasUtilsFile; + +/** + * + * @author gavalian + */ +public class CLASDecoder { + + protected DetectorEventDecoder detectorDecoder = null; + protected SchemaFactory schemaFactory = new SchemaFactory(); + private CodaEventDecoder codaDecoder = null; + private List dataList = new ArrayList<>(); + private HipoDataSync writer = null; + private HipoDataEvent hipoEvent = null; + private boolean isRunNumberFixed = false; + private int decoderDebugMode = 0; + private ModeAHDC ahdcExtractor = new ModeAHDC(); + private RCDBManager rcdbManager = new RCDBManager(); + + public CLASDecoder(boolean development){ + codaDecoder = new CodaEventDecoder(); + detectorDecoder = new DetectorEventDecoder(development); + writer = new HipoDataSync(); + hipoEvent = (HipoDataEvent) writer.createEvent(); + String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); + schemaFactory.initFromDirectory(dir); + } + + public CLASDecoder(){ + codaDecoder = new CodaEventDecoder(); + detectorDecoder = new DetectorEventDecoder(); + writer = new HipoDataSync(); + hipoEvent = (HipoDataEvent) writer.createEvent(); + String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); + schemaFactory.initFromDirectory(dir); + } + + public SchemaFactory getSchemaFactory(){ + return schemaFactory; + } + + public void setVariation(String variation) { + detectorDecoder.setVariation(variation); + } + + public void setTimestamp(String timestamp) { + detectorDecoder.setTimestamp(timestamp); + } + + public void setDebugMode(int mode){ + this.decoderDebugMode = mode; + } + + public void setRunNumber(int run){ + if(this.isRunNumberFixed==false){ + this.detectorDecoder.setRunNumber(run); + } + } + + public void setRunNumber(int run, boolean fixed){ + this.isRunNumberFixed = fixed; + this.detectorDecoder.setRunNumber(run); + System.out.println(" SETTING RUN NUMBER TO " + run + " FIXED = " + this.isRunNumberFixed); + } + + public CodaEventDecoder getCodaEventDecoder() { + return codaDecoder; + } + + /** + * return list of digitized ADC values from internal list + * @param type detector type + * @return + */ + public List getEntriesADC(DetectorType type){ + return this.getEntriesADC(type, dataList); + } + /** + * returns ADC entries from decoded data for given detector TYPE + * @param type detector type + * @param entries digitized data list + * @return list of ADC's for detector type + */ + public List getEntriesADC(DetectorType type, + List entries){ + List adc = new ArrayList<>(); + for(DetectorDataDgtz entry : entries){ + if(entry.getDescriptor().getType()==type){ + if(entry.getADCSize()>0&&entry.getTDCSize()==0){ + adc.add(entry); + } + } + } + + return adc; + } + + public List getEntriesTDC(DetectorType type){ + return getEntriesTDC(type,dataList); + } + + /** + * returns TDC entries from decoded data for given detector type + * @param type detector type + * @param entries digitized data list + * @return list of ADC's for detector type + */ + public List getEntriesTDC(DetectorType type, + List entries){ + List tdc = new ArrayList<>(); + for(DetectorDataDgtz entry : entries){ + if(entry.getDescriptor().getType()==type){ + if(entry.getTDCSize()>0&&entry.getADCSize()==0){ + tdc.add(entry); + } + } + } + return tdc; + } + + public List getEntriesVTP(DetectorType type){ + return getEntriesVTP(type,dataList); + } + /** + * returns VTP entries from decoded data for given detector type + * @param type detector type + * @param entries digitized data list + * @return list of VTP's for detector type + */ + public List getEntriesVTP(DetectorType type, + List entries){ + List vtp = new ArrayList<>(); + for(DetectorDataDgtz entry : entries){ + if(entry.getDescriptor().getType()==type){ + if(entry.getVTPSize()>0){ + vtp.add(entry); + } + } + } + return vtp; + } + + public List getEntriesSCALER(DetectorType type){ + return getEntriesSCALER(type,dataList); + } + /** + * returns VTP entries from decoded data for given detector type + * @param type detector type + * @param entries digitized data list + * @return list of VTP's for detector type + */ + public List getEntriesSCALER(DetectorType type, + List entries){ + List scaler = new ArrayList<>(); + for(DetectorDataDgtz entry : entries){ + if(entry.getDescriptor().getType()==type){ + if(entry.getSCALERSize()>0){ + scaler.add(entry); + } + } + } + return scaler; + } + + public void extractPulses(Event event) { + ahdcExtractor.update(30, null, event, schemaFactory, "AHDC::wf", "AHDC::adc"); + } + + public Bank getDataBankWF(String name, DetectorType type) { + List a = this.getEntriesADC(type); + if (a.isEmpty()) return null; + Bank b = new Bank(schemaFactory.getSchema(name), a.size()); + for (int i=0; i adcDGTZ = this.getEntriesADC(type); + if (adcDGTZ.isEmpty()) return null; + + Bank adcBANK = new Bank(schemaFactory.getSchema(name), adcDGTZ.size()); + + for(int i = 0; i < adcDGTZ.size(); i++){ + adcBANK.putByte( 0, i, (byte) adcDGTZ.get(i).getDescriptor().getSector()); + adcBANK.putByte( 1, i, (byte) adcDGTZ.get(i).getDescriptor().getLayer()); + adcBANK.putShort(2, i, (short) adcDGTZ.get(i).getDescriptor().getComponent()); + adcBANK.putByte( 3, i, (byte) adcDGTZ.get(i).getDescriptor().getOrder()); + adcBANK.putInt( 4, i, adcDGTZ.get(i).getADCData(0).getADC()); + if (type == DetectorType.BMT || type == DetectorType.FMT || type == DetectorType.FTTRK) { + adcBANK.putInt( 4, i, adcDGTZ.get(i).getADCData(0).getHeight()); + adcBANK.putInt( 7, i, adcDGTZ.get(i).getADCData(0).getIntegral()); + adcBANK.putLong(8, i, adcDGTZ.get(i).getADCData(0).getTimeStamp()); + } + if(type == DetectorType.BAND) { + adcBANK.putInt( 5, i, adcDGTZ.get(i).getADCData(0).getHeight()); + adcBANK.putFloat(6, i, (float) adcDGTZ.get(i).getADCData(0).getTime()); + adcBANK.putShort(7, i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); + } + else { + adcBANK.putFloat(5, i, (float) adcDGTZ.get(i).getADCData(0).getTime()); + adcBANK.putShort(6, i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); + } + if(type == DetectorType.BST) adcBANK.putLong(7, i, adcDGTZ.get(i).getADCData(0).getTimeStamp()); + } + return adcBANK; + } + + + public Bank getDataBankTDC(String name, DetectorType type){ + + List tdcDGTZ = this.getEntriesTDC(type); + if (tdcDGTZ.isEmpty()) return null; + Bank tdcBANK = new Bank(schemaFactory.getSchema(name), tdcDGTZ.size()); + + for(int i = 0; i < tdcDGTZ.size(); i++){ + tdcBANK.putByte( 0, i, (byte) tdcDGTZ.get(i).getDescriptor().getSector()); + tdcBANK.putByte( 1, i, (byte) tdcDGTZ.get(i).getDescriptor().getLayer()); + tdcBANK.putShort(2, i, (short) tdcDGTZ.get(i).getDescriptor().getComponent()); + tdcBANK.putByte( 3, i, (byte) (tdcDGTZ.get(i).getDescriptor().getOrder()+tdcDGTZ.get(i).getTDCData(0).getType().getTypeId())); + tdcBANK.putInt( 4, i, tdcDGTZ.get(i).getTDCData(0).getTime()); + if(type == DetectorType.DC) + tdcBANK.putShort(5, i, (short) tdcDGTZ.get(i).getTDCData(0).getToT()); + } + return tdcBANK; + } + + public Bank getDataBankTDCPetiroc(String name, DetectorType type){ + + List tdcDGTZ = this.getEntriesTDC(type); + if (tdcDGTZ.isEmpty()) return null; + Bank tdcBANK = new Bank(schemaFactory.getSchema(name), tdcDGTZ.size()); + + for(int i = 0; i < tdcDGTZ.size(); i++){ + tdcBANK.putByte( 0, i, (byte) tdcDGTZ.get(i).getDescriptor().getSector()); + tdcBANK.putByte( 1, i, (byte) tdcDGTZ.get(i).getDescriptor().getLayer()); + tdcBANK.putShort(2, i, (short) tdcDGTZ.get(i).getDescriptor().getComponent()); + tdcBANK.putByte( 3, i, (byte) tdcDGTZ.get(i).getDescriptor().getOrder()); + tdcBANK.putInt( 4, i, tdcDGTZ.get(i).getTDCData(0).getTime()); + tdcBANK.putInt( 5, i, tdcDGTZ.get(i).getTDCData(0).getToT()); + tdcBANK.putLong( 6, i, tdcDGTZ.get(i).getTDCData(0).getTimeStamp()); + tdcBANK.putInt( 7, i, tdcDGTZ.get(i).getTrigger()); + } + return tdcBANK; + } + + + public Bank getDataBankTimeStamp(String name, DetectorType type) { + + List tdcDGTZ = this.getEntriesTDC(type); + if (tdcDGTZ.isEmpty()) return null; + Map tsMap = new LinkedHashMap<>(); + for(DetectorDataDgtz tdc : tdcDGTZ) { + DetectorDescriptor desc = tdc.getDescriptor(); + int hash = ((desc.getCrate()<<8)&0xFF00) | (desc.getSlot()&0x00FF); + if(tsMap.containsKey(hash)) { + if(tsMap.get(hash).getTimeStamp() != tdc.getTimeStamp()) + System.out.println("WARNING: inconsistent timestamp for DCRB crate/slot " + + desc.getCrate() + "/" + desc.getSlot()); + } + else { + tsMap.put(hash, tdc); + } + } + + Bank tsBANK = new Bank(schemaFactory.getSchema(name), tsMap.size()); + + int i=0; + for(DetectorDataDgtz tdc : tsMap.values()) { + tsBANK.putByte(0, i, (byte) tdc.getDescriptor().getCrate()); + tsBANK.putByte(1, i, (byte) tdc.getDescriptor().getSlot()); + tsBANK.putLong(2, i, tdc.getTimeStamp()); + i++; + } + return tsBANK; + } + + public Bank getDataBankUndecodedADC(String name, DetectorType type){ + List adcDGTZ = this.getEntriesADC(type); + if (adcDGTZ.isEmpty()) return null; + Bank adcBANK = new Bank(schemaFactory.getSchema(name), adcDGTZ.size()); + + for(int i = 0; i < adcDGTZ.size(); i++){ + adcBANK.putByte( 0, i, (byte) adcDGTZ.get(i).getDescriptor().getCrate()); + adcBANK.putByte( 1, i, (byte) adcDGTZ.get(i).getDescriptor().getSlot()); + adcBANK.putShort(2, i, (short) adcDGTZ.get(i).getDescriptor().getChannel()); + adcBANK.putInt( 3, i, adcDGTZ.get(i).getADCData(0).getADC()); + adcBANK.putFloat(4, i, (float) adcDGTZ.get(i).getADCData(0).getTime()); + adcBANK.putShort(5, i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); + } + return adcBANK; + } + + public Bank getDataBankUndecodedTDC(String name, DetectorType type){ + + List tdcDGTZ = this.getEntriesTDC(type); + if (tdcDGTZ.isEmpty()) return null; + + Bank tdcBANK = new Bank(schemaFactory.getSchema(name), tdcDGTZ.size()); + + for(int i = 0; i < tdcDGTZ.size(); i++){ + tdcBANK.putByte( 0, i, (byte) tdcDGTZ.get(i).getDescriptor().getCrate()); + tdcBANK.putByte( 1, i, (byte) tdcDGTZ.get(i).getDescriptor().getSlot()); + tdcBANK.putShort(2, i, (short) tdcDGTZ.get(i).getDescriptor().getChannel()); + tdcBANK.putInt( 3, i, tdcDGTZ.get(i).getTDCData(0).getTime()); + } + return tdcBANK; + } + + public Bank getDataBankUndecodedVTP(String name, DetectorType type){ + + List vtpDGTZ = this.getEntriesVTP(type); + if (vtpDGTZ.isEmpty()) return null; + + Bank vtpBANK = new Bank(schemaFactory.getSchema(name), vtpDGTZ.size()); + + for(int i = 0; i < vtpDGTZ.size(); i++){ + vtpBANK.putByte(0, i, (byte) vtpDGTZ.get(i).getDescriptor().getCrate()); + vtpBANK.putInt( 1, i, vtpDGTZ.get(i).getVTPData(0).getWord()); + } + return vtpBANK; + } + + public Bank getDataBankUndecodedSCALER(String name, DetectorType type){ + + List scalerDGTZ = this.getEntriesSCALER(type); + if (scalerDGTZ.isEmpty()) return null; + + Bank scalerBANK = new Bank(schemaFactory.getSchema(name), scalerDGTZ.size()); + + for(int i = 0; i < scalerDGTZ.size(); i++){ + scalerBANK.putByte( 0, i, (byte) scalerDGTZ.get(i).getDescriptor().getCrate()); + scalerBANK.putByte( 1, i, (byte) scalerDGTZ.get(i).getDescriptor().getSlot()); + scalerBANK.putShort(2, i, (short) scalerDGTZ.get(i).getDescriptor().getChannel()); + scalerBANK.putByte( 3, i, (byte) scalerDGTZ.get(i).getSCALERData(0).getHelicity()); + scalerBANK.putByte( 4, i, (byte) scalerDGTZ.get(i).getSCALERData(0).getQuartet()); + scalerBANK.putLong( 5, i, scalerDGTZ.get(i).getSCALERData(0).getValue()); + } + return scalerBANK; + } + + + public long getTriggerPhase() { + long timestamp = this.codaDecoder.getTimeStamp(); + int phase_offset = 1; + return ((timestamp%6)+phase_offset)%6; // TI derived phase correction due to TDC and FADC clock differences + } + + public Bank createHeaderBank( int nrun, int nevent, Double torus, Double solenoid){ + + Bank bank = new Bank(schemaFactory.getSchema("RUN::config"), 1); + + int localRun = this.codaDecoder.getRunNumber(); + int localEvent = this.codaDecoder.getEventNumber(); + int localTime = this.codaDecoder.getUnixTime(); + long timeStamp = this.codaDecoder.getTimeStamp(); + long triggerBits = this.codaDecoder.getTriggerBits(); + + if(nrun>0){ + localRun = nrun; + localEvent = nevent; + } + + bank.putInt( 0, 0, localRun); + bank.putInt( 1, 0, localEvent); + bank.putInt( 2, 0, localTime); + bank.putLong(3, 0, triggerBits); + bank.putLong(4, 0, timeStamp); + + if (torus != null) { + bank.putFloat(7, 0, torus.floatValue()); + } + else if (rcdbManager.getTorusScale(localRun) == null) { + if (localRun > 100) throw new RuntimeException("Error retrieving torus scale from RCDB."); + } + else { + bank.putFloat(7, 0, rcdbManager.getTorusScale(localRun).floatValue()); + } + if (solenoid != null) { + bank.putFloat(8, 0, solenoid.floatValue()); + } + else if (rcdbManager.getSolenoidScale(localRun) == null) { + if (localRun > 100) throw new RuntimeException("Error retrieving solenoid scale from RCDB."); + } + else { + bank.putFloat(8, 0, rcdbManager.getSolenoidScale(localRun).floatValue()); + } + + return bank; + } + + public Bank createOnlineHelicityBank() { + if (this.codaDecoder.getHelicityLevel3()==HelicityBit.DNE.value()) return null; + Bank bank = new Bank(schemaFactory.getSchema("HEL::online"), 1); + byte helicityL3 = this.codaDecoder.getHelicityLevel3(); + IndexedTable hwpTable = this.detectorDecoder.scalerManager. + getConstants(this.detectorDecoder.getRunNumber(),"/runcontrol/hwp"); + bank.putByte(0,0, helicityL3); + bank.putByte(1,0,(byte)(helicityL3*hwpTable.getIntValue("hwp",0,0,0))); + return bank; + } + + public Bank createTriggerBank(){ + Bank bank = new Bank(schemaFactory.getSchema("RUN::trigger"), this.codaDecoder.getTriggerWords().size()); + for(int i=0; i createReconScalerBanks(Event event){ + return DaqScalers.createBanks(detectorDecoder.getRunNumber(), + schemaFactory, event, detectorDecoder.scalerManager); + } + + public Bank createBonusBank(){ + List bonusData = this.getEntriesADC(DetectorType.RTPC); + int totalSize = 0; + for(int i = 0; i < bonusData.size(); i++){ + short[] pulse = bonusData.get(i).getADCData(0).getPulseArray(); + totalSize += pulse.length; + } + + if (bonusData.isEmpty()) return null; + + Bank bonusBank = new Bank(schemaFactory.getSchema("RTPC::adc"), totalSize); + int currentRow = 0; + for(int i = 0; i < bonusData.size(); i++){ + + DetectorDataDgtz bonus = bonusData.get(i); + + short[] pulses = bonus.getADCData(0).getPulseArray(); + long timestamp = bonus.getADCData(0).getTimeStamp(); + double time = bonus.getADCData(0).getTime(); + double coeff = time*120.0; + + double offset1 = 0.0; + double offset2 = (double) (8*(timestamp%8)); + + for(int k = 0; k < pulses.length; k++){ + + double pulseTime = coeff + offset1 + offset2 + k*120.0; + + bonusBank.putByte( 0, currentRow, (byte) bonus.getDescriptor().getSector()); + bonusBank.putByte( 1, currentRow, (byte) bonus.getDescriptor().getLayer()); + bonusBank.putShort(2, currentRow, (short) bonus.getDescriptor().getComponent()); + bonusBank.putByte( 3, currentRow, (byte) bonus.getDescriptor().getOrder()); + bonusBank.putInt( 4, currentRow, pulses[k]); + bonusBank.putFloat(5, currentRow, (float) pulseTime); + bonusBank.putShort(6, currentRow, (short) 0); + currentRow++; + } + } + return bonusBank; + } + + public Bank createHelicityDecoderBank(EvioDataEvent event) { + HelicityDecoderData data = this.codaDecoder.getDataEntries_HelicityDecoder(event); + if(data!=null) { + Bank bank = new Bank(schemaFactory.getSchema("HEL::decoder"), 1); + int i=0; + bank.putByte(i++, 0, data.getHelicityState().getHelicity().value()); + bank.putByte(i++, 0, data.getHelicityState().getPairSync().value()); + bank.putByte(i++, 0, data.getHelicityState().getPatternSync().value()); + bank.putByte(i++, 0, data.getTSettle().value()); + bank.putByte(i++, 0, data.getHelicityPattern().value()); + bank.putByte(i++, 0, data.getPolarity()); + bank.putByte(i++, 0, data.getPatternPhaseCount()); + bank.putLong(i++, 0, data.getTimestamp()); + bank.putInt(i++, 0, data.getHelicitySeed()); + bank.putInt(i++, 0, data.getNTStableRisingEdge()); + bank.putInt(i++, 0, data.getNTStableFallingEdge()); + bank.putInt(i++, 0, data.getNPattern()); + bank.putInt(i++, 0, data.getNPair()); + bank.putInt(i++, 0, data.getTStableStart()); + bank.putInt(i++, 0, data.getTStableEnd()); + bank.putInt(i++, 0, data.getTStableTime()); + bank.putInt(i++, 0, data.getTSettleTime()); + bank.putInt(i++, 0, data.getPatternWindows()); + bank.putInt(i++, 0, data.getPairWindows()); + bank.putInt(i++, 0, data.getHelicityWindows()); + bank.putInt(i++, 0, data.getHelicityPatternWindows()); + return bank; + } + else + return null; + } + + public static Event createTaggedEvent(Event e, Bank runConfig, Bank... banks) { + Event t = new Event(); + for (Bank b : banks) { + e.read(b); + if (b.getRows() > 0) t.write(b); + } + if (!t.isEmpty()) { + e.read(runConfig); + t.write(runConfig); + } + return t; + } + + public static Event createTaggedEvent(SchemaFactory sf, Event e, String... banks) { + Bank[] b = new Bank[banks.length]; + for (int i=0; i0){ + event.write(adcBank); + } + } + } + + for(int i = 0; i < Config.wfBankTypes.length; i++){ + Bank wfBank = getDataBankWF(Config.wfBankNames[i],Config.wfBankTypes[i]); + if(wfBank!=null && wfBank.getRows()>0){ + event.write(wfBank); + } + } + + for(int i = 0; i < Config.tdcBankTypes.length; i++){ + Bank tdcBank = getDataBankTDC(Config.tdcBankNames[i],Config.tdcBankTypes[i]); + if(tdcBank!=null){ + if(tdcBank.getRows()>0){ + event.write(tdcBank); + } + } + } + + try { + Bank tdcBank = getDataBankTDCPetiroc("ATOF::tdc",DetectorType.ATOF); + if(tdcBank!=null){ + if(tdcBank.getRows()>0){ + event.write(tdcBank); + } + } + } catch(Exception e) { + e.printStackTrace(); + } + + try { + Bank tsBank = getDataBankTimeStamp("DC::jitter", DetectorType.DC); + if(tsBank != null) { + if(tsBank.getRows()>0) { + event.write(tsBank); + } + } + } catch(Exception e) { + e.printStackTrace(); + } + + /** + * Adding un-decoded banks to the event + */ + try { + Bank adcBankUD = this.getDataBankUndecodedADC("RAW::adc", DetectorType.UNDEFINED); + if(adcBankUD!=null){ + if(adcBankUD.getRows()>0){ + event.write(adcBankUD); + } + } + } catch(Exception e) { + e.printStackTrace(); + } + + try { + Bank tdcBankUD = this.getDataBankUndecodedTDC("RAW::tdc", DetectorType.UNDEFINED); + if(tdcBankUD!=null){ + if(tdcBankUD.getRows()>0){ + event.write(tdcBankUD); + } + } else { + + } + } catch(Exception e) { + e.printStackTrace(); + } + + try { + Bank vtpBankUD = this.getDataBankUndecodedVTP("RAW::vtp", DetectorType.UNDEFINED); + if(vtpBankUD!=null){ + if(vtpBankUD.getRows()>0){ + event.write(vtpBankUD); + } + } else { + + } + } catch(Exception e) { + e.printStackTrace(); + } + + try { + Bank scalerBankUD = this.getDataBankUndecodedSCALER("RAW::scaler", DetectorType.UNDEFINED); + if(scalerBankUD!=null){ + if(scalerBankUD.getRows()>0){ + event.write(scalerBankUD); + } + } + } catch(Exception e) { + e.printStackTrace(); + } + + try { + Bank bonusBank = this.createBonusBank(); + if(bonusBank!=null){ + if(bonusBank.getRows()>0){ + event.write(bonusBank); + } + } + } catch(Exception e) { + e.printStackTrace(); + } + + return event; + } + + public void initEvent(DataEvent event){ + + if(event instanceof EvioDataEvent){ + EvioDataEvent evioEvent = (EvioDataEvent) event; + if(evioEvent.getHandler().getStructure()!=null){ + try { + + dataList = codaDecoder.getDataEntries( (EvioDataEvent) event); + + List fadcPacked = codaDecoder.getADCEntries((EvioDataEvent) event); + + if (fadcPacked != null) { + //----------------------------------------------------------------------------- + // This part reads the BITPACKED FADC data from tag=57638 Format (cmcms) + // Then unpacks into Detector Digigitized data, and appends to existing buffer + // Modified on 9/5/2018 + //----------------------------------------------------------------------------- + List fadcUnpacked = FADCData.convert(fadcPacked); + dataList.addAll(fadcUnpacked); + } + + if(this.decoderDebugMode>0){ + System.out.println("\n>>>>>>>>> RAW decoded data"); + for(DetectorDataDgtz data : dataList){ + System.out.println(data); + } + } + + int runNumberCoda = codaDecoder.getRunNumber(); + this.setRunNumber(runNumberCoda); + + detectorDecoder.translate(dataList); + detectorDecoder.fitPulses(dataList); + detectorDecoder.filterTDCs(dataList); + + if(this.decoderDebugMode>0){ + System.out.println("\n>>>>>>>>> TRANSLATED data"); + for(DetectorDataDgtz data : dataList){ + System.out.println(data); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + public Event getDecodedEvent(EvioDataEvent rawEvent, int run, int counter, Double torus, Double solenoid) { + + this.initEvent(rawEvent); + Event decodedEvent = this.getDataEvent(); + + Bank header = this.createHeaderBank(run, counter, torus, solenoid); + if(header!=null) decodedEvent.write(header); + + Bank trigger = this.createTriggerBank(); + if(trigger!=null) decodedEvent.write(trigger); + + Bank onlineHelicity = this.createOnlineHelicityBank(); + if(onlineHelicity!=null) decodedEvent.write(onlineHelicity); + + Bank decodedHelicity = this.createHelicityDecoderBank(rawEvent); + if (decodedHelicity!=null) decodedEvent.write(decodedHelicity); + + this.extractPulses(decodedEvent); + + Bank epics = createEpicsBank(); + if (epics != null) decodedEvent.write(epics); + + for (Bank b : createReconScalerBanks(decodedEvent)) + decodedEvent.write(b); + + return decodedEvent; + } +} diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java index 799b260188..12aa6bf5d7 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder4.java @@ -1,813 +1,23 @@ package org.jlab.detector.decode; -import org.jlab.detector.scalers.DaqScalers; -import java.util.ArrayList; import java.util.List; - -import java.util.LinkedHashMap; -import java.util.Map; import java.util.TreeSet; -import org.jlab.detector.base.DetectorDescriptor; -import org.jlab.detector.base.DetectorType; -import org.jlab.detector.calib.utils.RCDBProvider.RCDBManager; -import org.jlab.detector.decode.DetectorDataDgtz.HelicityDecoderData; -import org.jlab.detector.helicity.HelicityBit; import org.jlab.detector.helicity.HelicitySequence; import org.jlab.detector.helicity.HelicityState; -import org.jlab.detector.pulse.ModeAHDC; -import org.jlab.io.base.DataEvent; import org.jlab.io.evio.EvioDataEvent; import org.jlab.io.evio.EvioSource; -import org.jlab.io.hipo.HipoDataEvent; -import org.jlab.io.hipo.HipoDataSync; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; -import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.jnp.hipo4.io.HipoWriterSorted; import org.jlab.utils.benchmark.ProgressPrintout; -import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.options.OptionParser; import org.jlab.utils.system.ClasUtilsFile; -/** - * - * @author gavalian - */ -public class CLASDecoder4 { - - protected DetectorEventDecoder detectorDecoder = null; - protected SchemaFactory schemaFactory = new SchemaFactory(); - private CodaEventDecoder codaDecoder = null; - private List dataList = new ArrayList<>(); - private HipoDataSync writer = null; - private HipoDataEvent hipoEvent = null; - private boolean isRunNumberFixed = false; - private int decoderDebugMode = 0; - private ModeAHDC ahdcExtractor = new ModeAHDC(); - private RCDBManager rcdbManager = new RCDBManager(); - - public CLASDecoder4(boolean development){ - codaDecoder = new CodaEventDecoder(); - detectorDecoder = new DetectorEventDecoder(development); - writer = new HipoDataSync(); - hipoEvent = (HipoDataEvent) writer.createEvent(); - String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); - schemaFactory.initFromDirectory(dir); - } - - public CLASDecoder4(){ - codaDecoder = new CodaEventDecoder(); - detectorDecoder = new DetectorEventDecoder(); - writer = new HipoDataSync(); - hipoEvent = (HipoDataEvent) writer.createEvent(); - String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); - schemaFactory.initFromDirectory(dir); - } - - public SchemaFactory getSchemaFactory(){ - return schemaFactory; - } - - public void setVariation(String variation) { - detectorDecoder.setVariation(variation); - } - - public void setTimestamp(String timestamp) { - detectorDecoder.setTimestamp(timestamp); - } - - public void setDebugMode(int mode){ - this.decoderDebugMode = mode; - } - - public void setRunNumber(int run){ - if(this.isRunNumberFixed==false){ - this.detectorDecoder.setRunNumber(run); - } - } - - public void setRunNumber(int run, boolean fixed){ - this.isRunNumberFixed = fixed; - this.detectorDecoder.setRunNumber(run); - System.out.println(" SETTING RUN NUMBER TO " + run + " FIXED = " + this.isRunNumberFixed); - } - - public CodaEventDecoder getCodaEventDecoder() { - return codaDecoder; - } - - public void initEvent(DataEvent event){ - - if(event instanceof EvioDataEvent){ - EvioDataEvent evioEvent = (EvioDataEvent) event; - if(evioEvent.getHandler().getStructure()!=null){ - try { - - dataList = codaDecoder.getDataEntries( (EvioDataEvent) event); - - //----------------------------------------------------------------------------- - // This part reads the BITPACKED FADC data from tag=57638 Format (cmcms) - // Then unpacks into Detector Digigitized data, and appends to existing buffer - // Modified on 9/5/2018 - //----------------------------------------------------------------------------- - - List fadcPacked = codaDecoder.getADCEntries((EvioDataEvent) event); - - if(fadcPacked!=null){ - List fadcUnpacked = FADCData.convert(fadcPacked); - dataList.addAll(fadcUnpacked); - } - // END of Bitpacked section - //----------------------------------------------------------------------------- - - if(this.decoderDebugMode>0){ - System.out.println("\n>>>>>>>>> RAW decoded data"); - for(DetectorDataDgtz data : dataList){ - System.out.println(data); - } - } - int runNumberCoda = codaDecoder.getRunNumber(); - this.setRunNumber(runNumberCoda); - - detectorDecoder.translate(dataList); - detectorDecoder.fitPulses(dataList); - detectorDecoder.filterTDCs(dataList); - if(this.decoderDebugMode>0){ - System.out.println("\n>>>>>>>>> TRANSLATED data"); - for(DetectorDataDgtz data : dataList){ - System.out.println(data); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - } - /** - * return list of digitized ADC values from internal list - * @param type detector type - * @return - */ - public List getEntriesADC(DetectorType type){ - return this.getEntriesADC(type, dataList); - } - /** - * returns ADC entries from decoded data for given detector TYPE - * @param type detector type - * @param entries digitized data list - * @return list of ADC's for detector type - */ - public List getEntriesADC(DetectorType type, - List entries){ - List adc = new ArrayList<>(); - for(DetectorDataDgtz entry : entries){ - if(entry.getDescriptor().getType()==type){ - if(entry.getADCSize()>0&&entry.getTDCSize()==0){ - adc.add(entry); - } - } - } - - return adc; - } - - public List getEntriesTDC(DetectorType type){ - return getEntriesTDC(type,dataList); - } - - /** - * returns TDC entries from decoded data for given detector type - * @param type detector type - * @param entries digitized data list - * @return list of ADC's for detector type - */ - public List getEntriesTDC(DetectorType type, - List entries){ - List tdc = new ArrayList<>(); - for(DetectorDataDgtz entry : entries){ - if(entry.getDescriptor().getType()==type){ - if(entry.getTDCSize()>0&&entry.getADCSize()==0){ - tdc.add(entry); - } - } - } - return tdc; - } - - public List getEntriesVTP(DetectorType type){ - return getEntriesVTP(type,dataList); - } - /** - * returns VTP entries from decoded data for given detector type - * @param type detector type - * @param entries digitized data list - * @return list of VTP's for detector type - */ - public List getEntriesVTP(DetectorType type, - List entries){ - List vtp = new ArrayList<>(); - for(DetectorDataDgtz entry : entries){ - if(entry.getDescriptor().getType()==type){ - if(entry.getVTPSize()>0){ - vtp.add(entry); - } - } - } - return vtp; - } - - public List getEntriesSCALER(DetectorType type){ - return getEntriesSCALER(type,dataList); - } - /** - * returns VTP entries from decoded data for given detector type - * @param type detector type - * @param entries digitized data list - * @return list of VTP's for detector type - */ - public List getEntriesSCALER(DetectorType type, - List entries){ - List scaler = new ArrayList<>(); - for(DetectorDataDgtz entry : entries){ - if(entry.getDescriptor().getType()==type){ - if(entry.getSCALERSize()>0){ - scaler.add(entry); - } - } - } - return scaler; - } - - public void extractPulses(Event event) { - ahdcExtractor.update(30, null, event, schemaFactory, "AHDC::wf", "AHDC::adc"); - } - - public Bank getDataBankWF(String name, DetectorType type) { - List a = this.getEntriesADC(type); - Bank b = new Bank(schemaFactory.getSchema(name), a.size()); - for (int i=0; i adcDGTZ = this.getEntriesADC(type); - - if(schemaFactory.hasSchema(name)==false) return null; - - Bank adcBANK = new Bank(schemaFactory.getSchema(name), adcDGTZ.size()); - - for(int i = 0; i < adcDGTZ.size(); i++){ - adcBANK.putByte("sector", i, (byte) adcDGTZ.get(i).getDescriptor().getSector()); - adcBANK.putByte("layer", i, (byte) adcDGTZ.get(i).getDescriptor().getLayer()); - adcBANK.putShort("component", i, (short) adcDGTZ.get(i).getDescriptor().getComponent()); - adcBANK.putByte("order", i, (byte) adcDGTZ.get(i).getDescriptor().getOrder()); - adcBANK.putInt("ADC", i, adcDGTZ.get(i).getADCData(0).getADC()); - adcBANK.putFloat("time", i, (float) adcDGTZ.get(i).getADCData(0).getTime()); - adcBANK.putShort("ped", i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); - if(name == "BST::adc") adcBANK.putLong("timestamp", i, adcDGTZ.get(i).getADCData(0).getTimeStamp()); - if(name.equals("BMT::adc")||name.equals("FMT::adc")|| name.equals("FTTRK::adc")){ - adcBANK.putInt("ADC", i, adcDGTZ.get(i).getADCData(0).getHeight()); - adcBANK.putInt("integral", i, adcDGTZ.get(i).getADCData(0).getIntegral()); - adcBANK.putLong("timestamp", i, adcDGTZ.get(i).getADCData(0).getTimeStamp()); - } - if(name == "BAND::adc") adcBANK.putInt("amplitude", i, adcDGTZ.get(i).getADCData(0).getHeight()); - } - return adcBANK; - } - - - public Bank getDataBankTDC(String name, DetectorType type){ - - List tdcDGTZ = this.getEntriesTDC(type); - if(schemaFactory.hasSchema(name)==false) return null; - Bank tdcBANK = new Bank(schemaFactory.getSchema(name), tdcDGTZ.size()); - - if(tdcBANK==null) return null; - - for(int i = 0; i < tdcDGTZ.size(); i++){ - tdcBANK.putByte("sector", i, (byte) tdcDGTZ.get(i).getDescriptor().getSector()); - tdcBANK.putByte("layer", i, (byte) tdcDGTZ.get(i).getDescriptor().getLayer()); - tdcBANK.putShort("component", i, (short) tdcDGTZ.get(i).getDescriptor().getComponent()); - tdcBANK.putByte("order", i, (byte) (tdcDGTZ.get(i).getDescriptor().getOrder()+tdcDGTZ.get(i).getTDCData(0).getType().getTypeId())); - tdcBANK.putInt("TDC", i, tdcDGTZ.get(i).getTDCData(0).getTime()); - if(tdcBANK.getSchema().hasEntry("ToT")) - tdcBANK.putShort("ToT", i, (short) tdcDGTZ.get(i).getTDCData(0).getToT()); - } - return tdcBANK; - } - - public Bank getDataBankTDCPetiroc(String name, DetectorType type){ - - List tdcDGTZ = this.getEntriesTDC(type); - if(schemaFactory.hasSchema(name)==false){ - System.out.println("WARNING: No schema for TDC type : " + type); - return null; - } - Bank tdcBANK = new Bank(schemaFactory.getSchema(name), tdcDGTZ.size()); - - if(tdcBANK==null) return null; - - // Not sure why the schemea information isn't used here. - for(int i = 0; i < tdcDGTZ.size(); i++){ - tdcBANK.putByte("sector", i, (byte) tdcDGTZ.get(i).getDescriptor().getSector()); - tdcBANK.putByte("layer", i, (byte) tdcDGTZ.get(i).getDescriptor().getLayer()); - tdcBANK.putShort("component", i, (short) tdcDGTZ.get(i).getDescriptor().getComponent()); - tdcBANK.putByte("order", i, (byte) tdcDGTZ.get(i).getDescriptor().getOrder()); - tdcBANK.putInt("TDC", i, tdcDGTZ.get(i).getTDCData(0).getTime()); - tdcBANK.putInt("ToT", i, tdcDGTZ.get(i).getTDCData(0).getToT()); - tdcBANK.putLong("timestamp", i, tdcDGTZ.get(i).getTDCData(0).getTimeStamp()); - tdcBANK.putInt("trigger", i, tdcDGTZ.get(i).getTrigger()); - //System.err.println("event: " + tdcDGTZ.get(i).toString()); - } - return tdcBANK; - } - - - public Bank getDataBankTimeStamp(String name, DetectorType type) { - - List tdcDGTZ = this.getEntriesTDC(type); - if(schemaFactory.hasSchema(name)==false) return null; - Map tsMap = new LinkedHashMap<>(); - for(DetectorDataDgtz tdc : tdcDGTZ) { - DetectorDescriptor desc = tdc.getDescriptor(); - int hash = ((desc.getCrate()<<8)&0xFF00) | (desc.getSlot()&0x00FF); - if(tsMap.containsKey(hash)) { - if(tsMap.get(hash).getTimeStamp() != tdc.getTimeStamp()) - System.out.println("WARNING: inconsistent timestamp for DCRB crate/slot " - + desc.getCrate() + "/" + desc.getSlot()); - } - else { - tsMap.put(hash, tdc); - } - } - - Bank tsBANK = new Bank(schemaFactory.getSchema(name), tsMap.size()); - - if(tsBANK==null) return null; - - int i=0; - for(DetectorDataDgtz tdc : tsMap.values()) { - tsBANK.putByte("crate", i, (byte) tdc.getDescriptor().getCrate()); - tsBANK.putByte("slot", i, (byte) tdc.getDescriptor().getSlot()); - tsBANK.putLong("timestamp", i, tdc.getTimeStamp()); - i++; - } - return tsBANK; - } - - public Bank getDataBankUndecodedADC(String name, DetectorType type){ - List adcDGTZ = this.getEntriesADC(type); - Bank adcBANK = new Bank(schemaFactory.getSchema(name), adcDGTZ.size()); - - for(int i = 0; i < adcDGTZ.size(); i++){ - adcBANK.putByte("crate", i, (byte) adcDGTZ.get(i).getDescriptor().getCrate()); - adcBANK.putByte("slot", i, (byte) adcDGTZ.get(i).getDescriptor().getSlot()); - adcBANK.putShort("channel", i, (short) adcDGTZ.get(i).getDescriptor().getChannel()); - adcBANK.putInt("ADC", i, adcDGTZ.get(i).getADCData(0).getADC()); - adcBANK.putFloat("time", i, (float) adcDGTZ.get(i).getADCData(0).getTime()); - adcBANK.putShort("ped", i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); - } - return adcBANK; - } - - public Bank getDataBankUndecodedTDC(String name, DetectorType type){ - - List tdcDGTZ = this.getEntriesTDC(type); - - Bank tdcBANK = new Bank(schemaFactory.getSchema(name), tdcDGTZ.size()); - if(tdcBANK==null) return null; - - for(int i = 0; i < tdcDGTZ.size(); i++){ - tdcBANK.putByte("crate", i, (byte) tdcDGTZ.get(i).getDescriptor().getCrate()); - tdcBANK.putByte("slot", i, (byte) tdcDGTZ.get(i).getDescriptor().getSlot()); - tdcBANK.putShort("channel", i, (short) tdcDGTZ.get(i).getDescriptor().getChannel()); - tdcBANK.putInt("TDC", i, tdcDGTZ.get(i).getTDCData(0).getTime()); - } - return tdcBANK; - } - - public Bank getDataBankUndecodedVTP(String name, DetectorType type){ - - List vtpDGTZ = this.getEntriesVTP(type); - - Bank vtpBANK = new Bank(schemaFactory.getSchema(name), vtpDGTZ.size()); - if(vtpBANK==null) return null; - - for(int i = 0; i < vtpDGTZ.size(); i++){ - vtpBANK.putByte("crate", i, (byte) vtpDGTZ.get(i).getDescriptor().getCrate()); - vtpBANK.putInt("word", i, vtpDGTZ.get(i).getVTPData(0).getWord()); - } - return vtpBANK; - } - - public Bank getDataBankUndecodedSCALER(String name, DetectorType type){ - - List scalerDGTZ = this.getEntriesSCALER(type); - - Bank scalerBANK = new Bank(schemaFactory.getSchema(name), scalerDGTZ.size()); - if(scalerBANK==null) return null; - - for(int i = 0; i < scalerDGTZ.size(); i++){ - scalerBANK.putByte("crate", i, (byte) scalerDGTZ.get(i).getDescriptor().getCrate()); - scalerBANK.putByte("slot", i, (byte) scalerDGTZ.get(i).getDescriptor().getSlot()); - scalerBANK.putShort("channel", i, (short) scalerDGTZ.get(i).getDescriptor().getChannel()); - scalerBANK.putByte("helicity", i, (byte) scalerDGTZ.get(i).getSCALERData(0).getHelicity()); - scalerBANK.putByte("quartet", i, (byte) scalerDGTZ.get(i).getSCALERData(0).getQuartet()); - scalerBANK.putLong("value", i, scalerDGTZ.get(i).getSCALERData(0).getValue()); - } - return scalerBANK; - } - - public Event getDecodedEvent(EvioDataEvent rawEvent, int run, int counter, Double torus, Double solenoid) { - - Event decodedEvent = this.getDataEvent(rawEvent); - - Bank header = this.createHeaderBank(run, counter, torus, solenoid); - if(header!=null) decodedEvent.write(header); - - Bank trigger = this.createTriggerBank(); - if(trigger!=null) decodedEvent.write(trigger); - - Bank onlineHelicity = this.createOnlineHelicityBank(); - if(onlineHelicity!=null) decodedEvent.write(onlineHelicity); - - Bank decodedHelicity = this.createHelicityDecoderBank(rawEvent); - if (decodedHelicity!=null) decodedEvent.write(decodedHelicity); - - this.extractPulses(decodedEvent); - - Bank epics = createEpicsBank(); - if (epics != null) decodedEvent.write(epics); - - for (Bank b : createReconScalerBanks(decodedEvent)) - decodedEvent.write(b); - - return decodedEvent; - } - - public Event getDataEvent(DataEvent rawEvent){ - this.initEvent(rawEvent); - return getDataEvent(); - } - - public Event getDataEvent(){ - - Event event = new Event(); - - String[] wfBankNames = new String[]{"AHDC::wf"}; - DetectorType[] wfBankTypes = new DetectorType[]{DetectorType.AHDC}; - String[] adcBankNames = new String[]{"FTOF::adc","ECAL::adc","FTCAL::adc", - "FTHODO::adc", "FTTRK::adc", - "HTCC::adc","BST::adc","CTOF::adc", - "CND::adc","LTCC::adc","BMT::adc", - "FMT::adc","HEL::adc","RF::adc", - "BAND::adc","RASTER::adc"}; - DetectorType[] adcBankTypes = new DetectorType[]{DetectorType.FTOF,DetectorType.ECAL,DetectorType.FTCAL, - DetectorType.FTHODO,DetectorType.FTTRK, - DetectorType.HTCC,DetectorType.BST,DetectorType.CTOF, - DetectorType.CND,DetectorType.LTCC,DetectorType.BMT, - DetectorType.FMT,DetectorType.HEL,DetectorType.RF, - DetectorType.BAND, DetectorType.RASTER}; - - String[] tdcBankNames = new String[]{"FTOF::tdc","ECAL::tdc","DC::tot", - "HTCC::tdc","LTCC::tdc","CTOF::tdc", - "CND::tdc","RF::tdc","RICH::tdc", - "BAND::tdc"}; - DetectorType[] tdcBankTypes = new DetectorType[]{DetectorType.FTOF,DetectorType.ECAL, - DetectorType.DC,DetectorType.HTCC,DetectorType.LTCC, - DetectorType.CTOF,DetectorType.CND,DetectorType.RF, - DetectorType.RICH,DetectorType.BAND}; - - for(int i = 0; i < adcBankTypes.length; i++){ - Bank adcBank = getDataBankADC(adcBankNames[i],adcBankTypes[i]); - if(adcBank!=null){ - if(adcBank.getRows()>0){ - event.write(adcBank); - } - } - } - - for(int i = 0; i < wfBankTypes.length; i++){ - Bank wfBank = getDataBankWF(wfBankNames[i],wfBankTypes[i]); - if(wfBank!=null && wfBank.getRows()>0){ - event.write(wfBank); - } - } - - for(int i = 0; i < tdcBankTypes.length; i++){ - Bank tdcBank = getDataBankTDC(tdcBankNames[i],tdcBankTypes[i]); - if(tdcBank!=null){ - if(tdcBank.getRows()>0){ - event.write(tdcBank); - } - } - } - try { - // Do ATOF - Bank tdcBank = getDataBankTDCPetiroc("ATOF::tdc",DetectorType.ATOF); - if(tdcBank!=null){ - if(tdcBank.getRows()>0){ - event.write(tdcBank); - } - } - } catch(Exception e) { - e.printStackTrace(); - } - - - try { - Bank tsBank = getDataBankTimeStamp("DC::jitter", DetectorType.DC); - if(tsBank != null) { - if(tsBank.getRows()>0) { - event.write(tsBank); - } - } - } catch(Exception e) { - e.printStackTrace(); - } - - /** - * Adding un-decoded banks to the event - */ - try { - Bank adcBankUD = this.getDataBankUndecodedADC("RAW::adc", DetectorType.UNDEFINED); - if(adcBankUD!=null){ - if(adcBankUD.getRows()>0){ - event.write(adcBankUD); - } - } - } catch(Exception e) { - e.printStackTrace(); - } - - try { - Bank tdcBankUD = this.getDataBankUndecodedTDC("RAW::tdc", DetectorType.UNDEFINED); - if(tdcBankUD!=null){ - if(tdcBankUD.getRows()>0){ - event.write(tdcBankUD); - } - } else { - - } - } catch(Exception e) { - e.printStackTrace(); - } - - try { - Bank vtpBankUD = this.getDataBankUndecodedVTP("RAW::vtp", DetectorType.UNDEFINED); - if(vtpBankUD!=null){ - if(vtpBankUD.getRows()>0){ - event.write(vtpBankUD); - } - } else { - - } - } catch(Exception e) { - e.printStackTrace(); - } - - try { - Bank scalerBankUD = this.getDataBankUndecodedSCALER("RAW::scaler", DetectorType.UNDEFINED); - if(scalerBankUD!=null){ - if(scalerBankUD.getRows()>0){ - event.write(scalerBankUD); - } - } - } catch(Exception e) { - e.printStackTrace(); - } - //----------------------------------------------------- - // CREATING BONUS BANK -------------------------------- - //----------------------------------------------------- - try { - //System.out.println("creating bonus bank...."); - Bank bonusBank = this.createBonusBank(); - if(bonusBank!=null){ - if(bonusBank.getRows()>0){ - event.write(bonusBank); - } - } - } catch(Exception e) { - e.printStackTrace(); - } - return event; - } - - public long getTriggerPhase() { - long timestamp = this.codaDecoder.getTimeStamp(); - int phase_offset = 1; - return ((timestamp%6)+phase_offset)%6; // TI derived phase correction due to TDC and FADC clock differences - } - - public Bank createHeaderBank( int nrun, int nevent, Double torus, Double solenoid){ - - if(schemaFactory.hasSchema("RUN::config")==false) return null; - - Bank bank = new Bank(schemaFactory.getSchema("RUN::config"), 1); - - int localRun = this.codaDecoder.getRunNumber(); - int localEvent = this.codaDecoder.getEventNumber(); - int localTime = this.codaDecoder.getUnixTime(); - long timeStamp = this.codaDecoder.getTimeStamp(); - long triggerBits = this.codaDecoder.getTriggerBits(); - - if(nrun>0){ - localRun = nrun; - localEvent = nevent; - } - - bank.putInt("run", 0, localRun); - bank.putInt("event", 0, localEvent); - bank.putInt("unixtime", 0, localTime); - bank.putLong("trigger", 0, triggerBits); - bank.putLong("timestamp", 0, timeStamp); - - if (torus != null) { - bank.putFloat("torus", 0, torus.floatValue()); - } - else if (rcdbManager.getTorusScale(localRun) == null) { - if (localRun > 100) throw new RuntimeException("Error retrieving torus scale from RCDB."); - } - else { - bank.putFloat("torus", 0, rcdbManager.getTorusScale(localRun).floatValue()); - } - if (solenoid != null) { - bank.putFloat("solenoid", 0, solenoid.floatValue()); - } - else if (rcdbManager.getSolenoidScale(localRun) == null) { - if (localRun > 100) throw new RuntimeException("Error retrieving solenoid scale from RCDB."); - } - else { - bank.putFloat("solenoid", 0, rcdbManager.getSolenoidScale(localRun).floatValue()); - } - - return bank; - } - - public Bank createOnlineHelicityBank() { - if (schemaFactory.hasSchema("HEL::online")==false || - this.codaDecoder.getHelicityLevel3()==HelicityBit.DNE.value()) return null; - Bank bank = new Bank(schemaFactory.getSchema("HEL::online"), 1); - byte helicityL3 = this.codaDecoder.getHelicityLevel3(); - IndexedTable hwpTable = this.detectorDecoder.scalerManager. - getConstants(this.detectorDecoder.getRunNumber(),"/runcontrol/hwp"); - bank.putByte("helicityRaw",0, helicityL3); - bank.putByte("helicity",0,(byte)(helicityL3*hwpTable.getIntValue("hwp",0,0,0))); - return bank; - } - - public Bank createTriggerBank(){ - - if(schemaFactory.hasSchema("RUN::trigger")==false) return null; - - Bank bank = new Bank(schemaFactory.getSchema("RUN::trigger"), this.codaDecoder.getTriggerWords().size()); - - for(int i=0; i createReconScalerBanks(Event event){ - return DaqScalers.createBanks(detectorDecoder.getRunNumber(), - schemaFactory, event, detectorDecoder.scalerManager); - } - - public Bank createBonusBank(){ - if(schemaFactory.hasSchema("RTPC::adc")==false) return null; - List bonusData = this.getEntriesADC(DetectorType.RTPC); - int totalSize = 0; - for(int i = 0; i < bonusData.size(); i++){ - short[] pulse = bonusData.get(i).getADCData(0).getPulseArray(); - totalSize += pulse.length; - } - - Bank bonusBank = new Bank(schemaFactory.getSchema("RTPC::adc"), totalSize); - int currentRow = 0; - for(int i = 0; i < bonusData.size(); i++){ - - DetectorDataDgtz bonus = bonusData.get(i); - - short[] pulses = bonus.getADCData(0).getPulseArray(); - long timestamp = bonus.getADCData(0).getTimeStamp(); - double time = bonus.getADCData(0).getTime(); - double coeff = time*120.0; - - double offset1 = 0.0; - double offset2 = (double) (8*(timestamp%8)); - - for(int k = 0; k < pulses.length; k++){ - - double pulseTime = coeff + offset1 + offset2 + k*120.0; - - bonusBank.putByte("sector", currentRow, (byte) bonus.getDescriptor().getSector()); - bonusBank.putByte("layer" , currentRow, (byte) bonus.getDescriptor().getLayer()); - bonusBank.putShort("component", currentRow, (short) bonus.getDescriptor().getComponent()); - bonusBank.putByte("order", currentRow, (byte) bonus.getDescriptor().getOrder()); - bonusBank.putInt("ADC", currentRow, pulses[k]); - bonusBank.putFloat("time", currentRow, (float) pulseTime); - bonusBank.putShort("ped", currentRow, (short) 0); - currentRow++; - } - } - - return bonusBank; - } - - public Bank createHelicityDecoderBank(EvioDataEvent event) { - HelicityDecoderData data = this.codaDecoder.getDataEntries_HelicityDecoder(event); - if(data!=null) { - Bank bank = new Bank(schemaFactory.getSchema("HEL::decoder"), 1); - bank.putByte("helicity", 0, data.getHelicityState().getHelicity().value()); - bank.putByte("pair", 0, data.getHelicityState().getPairSync().value()); - bank.putByte("pattern", 0, data.getHelicityState().getPatternSync().value()); - bank.putByte("tSettle", 0, data.getTSettle().value()); - bank.putByte("helicityPattern", 0, data.getHelicityPattern().value()); - bank.putByte("polarity", 0, data.getPolarity()); - bank.putByte("phase", 0, data.getPatternPhaseCount()); - bank.putLong("timestamp", 0, data.getTimestamp()); - bank.putInt("helicitySeed", 0, data.getHelicitySeed()); - bank.putInt("nTStableRE", 0, data.getNTStableRisingEdge()); - bank.putInt("nTStableFE", 0, data.getNTStableFallingEdge()); - bank.putInt("nPattern", 0, data.getNPattern()); - bank.putInt("nPair", 0, data.getNPair()); - bank.putInt("tStableStart", 0, data.getTStableStart()); - bank.putInt("tStableEnd", 0, data.getTStableEnd()); - bank.putInt("tStableTime", 0, data.getTStableTime()); - bank.putInt("tSettleTime", 0, data.getTSettleTime()); - bank.putInt("patternArray", 0, data.getPatternWindows()); - bank.putInt("pairArray", 0, data.getPairWindows()); - bank.putInt("helicityArray", 0, data.getHelicityWindows()); - bank.putInt("helicityPArray", 0, data.getHelicityPatternWindows()); - return bank; - } - else - return null; - } - - public static Event createTaggedEvent(Event e, Bank runConfig, Bank... banks) { - Event t = new Event(); - for (Bank b : banks) { - e.read(b); - if (b.getRows() > 0) t.write(b); - } - if (!t.isEmpty()) { - e.read(runConfig); - t.write(runConfig); - } - return t; - } - - public static Event createTaggedEvent(SchemaFactory sf, Event e, String... banks) { - Bank[] b = new Bank[banks.length]; - for (int i=0; i Date: Mon, 22 Dec 2025 20:30:01 -0500 Subject: [PATCH 010/190] feat: add Clas12Reader clara IO service, for EVIO/HIPO (#1025) * add Clas12Reader * switch to Clas12Reader --- .../java/org/jlab/io/clara/Clas12Reader.java | 90 +++++++++++++++++++ .../java/org/jlab/io/clara/DecoderWriter.java | 2 +- .../org/jlab/io/clara/Clas12Reader.yaml | 11 +++ etc/services/rgd-clarode.yml | 4 +- 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java create mode 100644 common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java new file mode 100644 index 0000000000..7b10192c4b --- /dev/null +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java @@ -0,0 +1,90 @@ +package org.jlab.io.clara; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.file.Path; +import org.jlab.clara.engine.EngineDataType; +import org.jlab.clara.std.services.AbstractEventReaderService; +import org.jlab.clara.std.services.EventReaderException; +import org.jlab.coda.jevio.EvioException; +import org.jlab.detector.decode.CLASDecoder4; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.evio.EvioSource; +import org.jlab.jnp.hipo4.data.Event; +import org.jlab.jnp.hipo4.io.HipoReader; +import org.json.JSONObject; + +/** + * + * @author baltzell + */ +public class Clas12Reader extends AbstractEventReaderService { + + boolean evio; + CLASDecoder4 decoder; + private long maxEvents; + private Double torus; + private Double solenoid; + + @Override + protected Object createReader(Path path, JSONObject opts) throws EventReaderException { + if (path.toString().endsWith(".hipo")) { + evio = false; + HipoReader r = new HipoReader(); + r.open(path.toString()); + return r; + } + else { + evio = true; + EvioSource r = new EvioSource(); + r.open(path.toString()); + maxEvents = r.getEventCount(); + decoder = new CLASDecoder4(); + torus = opts.has("torus") ? opts.getDouble("torus") : null; + solenoid = opts.has("solenoid") ? opts.getDouble("solenoid") : null; + if (opts.has("variation")) decoder.setVariation(opts.getString("variation")); + if (opts.has("timestamp")) decoder.setTimestamp(opts.getString("timestamp")); + return r; + } + } + + @Override + protected void closeReader() { + if (evio) ((EvioSource)reader).close(); + else ((HipoReader)reader).close(); + } + + @Override + protected int readEventCount() throws EventReaderException { + if (evio) return ((EvioSource)reader).getEventCount(); + else return ((HipoReader)reader).getEventCount(); + } + + @Override + protected Object readEvent(int eventNumber) throws EventReaderException { + try { + if (evio) { + if (eventNumber++ >= maxEvents) return null; + ByteBuffer b = ((EvioSource)reader).getEventBuffer(eventNumber, true); + EvioDataEvent e = new EvioDataEvent(b.array(), readByteOrder()); + return decoder.getDecodedEvent(e, -1, eventNumber, torus, solenoid); + } + else { + return ((HipoReader)reader).getEvent(new Event(),eventNumber); + } + } catch (EvioException e) { + throw new EventReaderException(e); + } + } + + @Override + public ByteOrder readByteOrder() throws EventReaderException { + return ByteOrder.LITTLE_ENDIAN; + } + + @Override + protected EngineDataType getDataType() { + return Clas12Types.HIPO; + } + +} diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java index 9be013bece..6881bf1928 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java @@ -66,7 +66,7 @@ protected HipoWriterSorted createWriter(Path file, JSONObject opts) throws Event init(opts); HipoWriterSorted w = new HipoWriterSorted(); super.configure(w, opts); - w.open(file.toString()); + w.open(file.toString().endsWith(".hipo") ? file.toString() : file.toString()+".hipo"); return w; } catch (Exception e) { throw new EventWriterException(e); diff --git a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml new file mode 100644 index 0000000000..30c6e00495 --- /dev/null +++ b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml @@ -0,0 +1,11 @@ +--- +name: Clas12Reader +engine: org.jlab.io.clara.Clas12Reader +type: java + +author: Nathan Baltzell +email: baltzell@jlab.org + +version: 0.1 +description: + Reads EVIO or HIPO events from a file, converting to HIPO via "decoding" if EVIO. diff --git a/etc/services/rgd-clarode.yml b/etc/services/rgd-clarode.yml index b3612af29d..0fef0e2016 100644 --- a/etc/services/rgd-clarode.yml +++ b/etc/services/rgd-clarode.yml @@ -19,8 +19,8 @@ configuration: outputBankPrefix: "HB" io-services: reader: - class: org.jlab.io.clara.DecoderReader - name: DecoderReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: class: org.jlab.io.clara.DecoderWriter name: DecoderWriter From a4f6b79f87de1ad99654d4865cad02de85da75a3 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 20:38:51 -0500 Subject: [PATCH 011/190] add benchmark total (#1027) --- .../org/jlab/utils/benchmark/Benchmark.java | 8 ++--- .../jlab/utils/benchmark/BenchmarkTimer.java | 32 ++++++++----------- .../utils/benchmark/BenchmarkTimerTotal.java | 30 +++++++++++++++++ 3 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimerTotal.java diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/Benchmark.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/Benchmark.java index 4f6034413b..b17c1264f7 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/Benchmark.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/Benchmark.java @@ -25,10 +25,10 @@ public static Benchmark getInstance(){ public void printTimer(int seconds){ TimerTask timerTask = new TimerTask() { - @Override - public void run() { System.out.println(getInstance()); } + @Override + public void run() { System.out.println(benchmarkInstance); } }; - updateTimer = new Timer("Benchmark"); + updateTimer = new Timer("Benchmark", true); updateTimer.scheduleAtFixedRate(timerTask, 0, 1000*seconds); } @@ -62,7 +62,7 @@ public BenchmarkTimer getTimer(String name){ } public BenchmarkTimer getTotal(String name) { - BenchmarkTimer total = new BenchmarkTimer(name); + BenchmarkTimerTotal total = new BenchmarkTimerTotal(name); for (BenchmarkTimer b : timerStore.values()) total.add(b); return total; diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimer.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimer.java index 0f824ea6ba..d3f56a0743 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimer.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimer.java @@ -5,16 +5,17 @@ * @author gavalian */ public class BenchmarkTimer { - + private String timerName = "generic"; - private long totalTime = 0; - private long timeAtResume = 0; - private int numberOfCalls = 0; + private long timeAtResume = 0; private Boolean isPaused = true; - - public BenchmarkTimer(){} - - public BenchmarkTimer(String name){ + + protected int numberOfCalls = 0; + protected long totalTime = 0; + + public BenchmarkTimer() {} + + public BenchmarkTimer(String name) { timerName = name; } @@ -38,11 +39,6 @@ public void pause(){ } } - public void add(BenchmarkTimer b) { - totalTime += b.totalTime; - numberOfCalls += b.numberOfCalls; - } - public void reset(){ totalTime = 0; timeAtResume = 0; @@ -59,12 +55,10 @@ public double getSeconds(){ } @Override - public String toString(){ - StringBuilder str = new StringBuilder(); + public String toString() { double timePerCall = 0.0; - if(numberOfCalls!=0) timePerCall = this.getMiliseconds()/numberOfCalls; - str.append(String.format("TIMER (%-12s) : N Calls %12d, Total Time = %12.2f sec, Unit Time = %12.3f msec", - this.getName(),numberOfCalls,this.getSeconds(),timePerCall)); - return str.toString(); + if (numberOfCalls != 0) timePerCall = getMiliseconds() / numberOfCalls; + return String.format("TIMER (%-12s) : N Calls %12d, Total Time = %12.2f sec, Unit Time = %12.3f msec", + getName(), numberOfCalls, getSeconds(), timePerCall); } } diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimerTotal.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimerTotal.java new file mode 100644 index 0000000000..86d650f9e2 --- /dev/null +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/BenchmarkTimerTotal.java @@ -0,0 +1,30 @@ +package org.jlab.utils.benchmark; + +import java.util.ArrayList; + +/** + * + * @author baltzell + */ +public class BenchmarkTimerTotal extends BenchmarkTimer { + + ArrayList benchmarks = new ArrayList<>(); + + public BenchmarkTimerTotal(String name) { + super(name); + } + + @Override + public String toString() { + double timePerCall = 0.0; + if (numberOfCalls != 0) timePerCall = getMiliseconds() / numberOfCalls * benchmarks.size(); + return String.format("TIMER (%-12s) : N Calls %12d, Total Time = %12.2f sec, Unit Time = %12.3f msec", + getName(), numberOfCalls, getSeconds(), timePerCall); + } + + public void add(BenchmarkTimer b) { + benchmarks.add(b); + totalTime += b.totalTime; + numberOfCalls += b.numberOfCalls; + } +} From e8bc476f65da17e8e8a231b0c6b212ab1b368ebc Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 22 Dec 2025 21:54:13 -0500 Subject: [PATCH 012/190] feat: add indexing translation tables by detector type (#1029) * relax permissions * provide more access * add more hash-based accessors * remove checks from hash-based accessors, cleanup * add "translation table", with additional DetectorType index --- .../detector/decode/TranslationTable.java | 77 ++++++++++++++++++ .../org/jlab/utils/groups/IndexedTable.java | 78 ++++++++++--------- 2 files changed, 119 insertions(+), 36 deletions(-) create mode 100644 common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java new file mode 100644 index 0000000000..9958969083 --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java @@ -0,0 +1,77 @@ +package org.jlab.detector.decode; + +import org.jlab.detector.base.DetectorType; +import org.jlab.detector.calib.utils.ConstantsManager; +import org.jlab.utils.groups.IndexedTable; + +/** + * + * @author baltzell + */ +public class TranslationTable extends IndexedTable { + + public TranslationTable() { + super(3,new String[]{"sector/I","layer/I","component/I","order/I","type/I"}); + }; + + public void add(DetectorType dt, IndexedTable it) { + + for (Object key : it.getList().getMap().keySet()) { + + // get the indices: + long hash = (long)key; + int crate = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0); + int slot = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1); + int channel = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2); + + if (hasEntryByHash(hash)) { + System.err.print("TranslationTable: found CCDB overlap for "); + System.err.println(String.format("type %d/%s versus %s and c/s/c=%d/%d/%d", + getIntValueByHash("type",hash), + DetectorType.getType(getIntValueByHash("type",hash)), + dt,crate,slot,channel)); + } + else { + // add row to the new table: + addEntry(crate, slot, channel); + + // add each column's entry to the new row: + for (int column=0; column entryMap = new LinkedHashMap<>(); + protected Map entryTypes = new LinkedHashMap<>(); + private IndexedList entries = null; - private Map entryMap = new LinkedHashMap<>(); - private Map entryTypes = new LinkedHashMap<>(); private List entryNames = new ArrayList<>(); private List indexNames = new ArrayList<>(); private String precisionFormat = "%.6f"; @@ -119,7 +121,7 @@ public void setIntValue(Integer value, String item, int... index){ } } } - + public void setDoubleValue(Double value, String item, int... index){ if(this.entries.hasItem(index)==false){ if(DEBUG_MODE>0) System.out.println( "[IndexedTable] ---> error.. entry does not exist"); @@ -133,38 +135,6 @@ public void setDoubleValue(Double value, String item, int... index){ } } - public int getIntValueByHash(int index, long hash) { - if (this.entries.hasItemByHash(hash)) - return this.entries.getItemByHash(hash).getValue(index).intValue(); - return 0; - } - - public double getDoubleValueByHash(int index, long hash) { - if (this.entries.hasItemByHash(hash)) - return this.entries.getItemByHash(hash).getValue(index).doubleValue(); - return 0; - } - - public int getIntValueByHash(String item, long hash) { - if (this.entries.hasItemByHash(hash)) { - if (this.entryMap.containsKey(item)) { - int index = this.entryMap.get(item); - return this.entries.getItemByHash(hash).getValue(index).intValue(); - } - } - return 0; - } - - public double getDoubleValueByHash(String item, long hash) { - if (this.entries.hasItemByHash(hash)) { - if (this.entryMap.containsKey(item)) { - int index = this.entryMap.get(item); - return this.entries.getItemByHash(hash).getValue(index).doubleValue(); - } - } - return 0; - } - public int getIntValue(String item, int... index){ if(this.entries.hasItem(index)==false){ if(DEBUG_MODE>0) System.out.println( "[IndexedTable] ---> error.. entry does not exist"); @@ -193,6 +163,38 @@ public double getDoubleValue(String item, int... index){ return 0; } + public void setIntValueByHash(Integer value, int column, long hash) { + this.entries.getItemByHash(hash).setValue(column, value); + } + + public int getIntValueByHash(int index, long hash) { + return entries.getItemByHash(hash).getValue(index).intValue(); + } + + public double getDoubleValueByHash(int index, long hash) { + return entries.getItemByHash(hash).getValue(index).doubleValue(); + } + + public int getIntValueByHash(String item, long hash) { + return entries.getItemByHash(hash).getValue(entryMap.get(item)).intValue(); + } + + public double getDoubleValueByHash(String item, long hash) { + return entries.getItemByHash(hash).getValue(entryMap.get(item)).doubleValue(); + } + + public List getValuesByHash(long hash) { + return this.entries.getItemByHash(hash).entryValues; + } + + public List getIntegersByHash(long hash) { + return getValuesByHash(hash).stream().map(x -> x.intValue()).collect(Collectors.toList()); + } + + public List getDoublesByHash(long hash) { + return getValuesByHash(hash).stream().map(x -> x.doubleValue()).collect(Collectors.toList()); + } + public NamedEntry getNamedEntry(int... index) { return NamedEntry.create(entries.getItem(index), entryNames, index); } @@ -200,7 +202,11 @@ public NamedEntry getNamedEntry(int... index) { public IndexedList getList(){ return this.entries; } - + + public Map getEntryMap(){ + return this.entryMap; + } + private void parseFormat(String format){ String[] tokens = format.split(":"); entryMap.clear(); From 63625e7d9f969e34ccd015538d28a7d88c11bf2f Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Mon, 22 Dec 2025 22:05:11 -0500 Subject: [PATCH 013/190] fix: use `$JAVA_OPTS` in `decoder4u` (#1030) following #964 --- bin/decoder4u | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/decoder4u b/bin/decoder4u index c0504c17bb..84d808b8bf 100755 --- a/bin/decoder4u +++ b/bin/decoder4u @@ -6,7 +6,7 @@ split_cli $@ export MALLOC_ARENA_MAX=1 -java -Xmx2304m -Xms1280m -XX:+UseSerialGC ${jvm_options[@]} \ +java ${JAVA_OPTS-} -Xmx2304m -Xms1280m -XX:+UseSerialGC ${jvm_options[@]} \ -cp ${COATJAVA_CLASSPATH:-''} \ org.jlab.detector.decode.CLASDecoder4U \ ${class_options[@]} From 973b46c37eeae15d6ae54ee801738725f7d9a3ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:29:17 -0500 Subject: [PATCH 014/190] ci(deps): bump actions/cache from 4 to 5 (#1036) Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/cache dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16c02be1e1..b051baa3ea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: download_test_data: runs-on: ubuntu-latest steps: - - uses: actions/cache@v4 + - uses: actions/cache@v5 id: cache with: key: raw_test_data # fixed key will always hit; clear cache to trigger cache miss @@ -183,7 +183,7 @@ jobs: - uses: actions/download-artifact@v6 with: name: build_ubuntu-latest - - uses: actions/cache/restore@v4 + - uses: actions/cache/restore@v5 with: key: raw_test_data path: | @@ -215,7 +215,7 @@ jobs: - uses: actions/download-artifact@v6 with: name: build_ubuntu-latest - - uses: actions/cache/restore@v4 + - uses: actions/cache/restore@v5 with: key: raw_test_data path: | From bc2cdb884350f61eeb6726d86e998665e47e09f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:29:34 -0500 Subject: [PATCH 015/190] ci(deps): bump actions/upload-artifact from 5 to 6 (#1035) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b051baa3ea..985345613e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,7 +93,7 @@ jobs: run: | tar czvf coatjava.tar.gz coatjava tar czvf clara.tar.gz clara - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@v6 with: name: build_${{ matrix.runner }} retention-days: 1 @@ -138,7 +138,7 @@ jobs: run: validation/jacoco-aggregate.sh - name: publish jacoco report if: ${{ matrix.JAVA_VERSION == env.JAVA_VERSION }} - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: jacoco_report path: publish/ From 591f8e669eae45d20fd2ef08b9581e6fad5b7df8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:29:52 -0500 Subject: [PATCH 016/190] ci(deps): bump actions/download-artifact from 6 to 7 (#1034) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 985345613e..fd9950e9d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -158,7 +158,7 @@ jobs: - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: build_ubuntu-latest - name: untar build @@ -180,7 +180,7 @@ jobs: - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: build_ubuntu-latest - uses: actions/cache/restore@v5 @@ -212,7 +212,7 @@ jobs: uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: build_ubuntu-latest - uses: actions/cache/restore@v5 @@ -262,7 +262,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: build_${{ matrix.runner }} - uses: cvmfs-contrib/github-action-cvmfs@v5 @@ -295,7 +295,7 @@ jobs: uses: wtfjoke/setup-groovy@v3 with: groovy-version: ${{ env.groovy_version }} - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: build_ubuntu-latest - name: untar build @@ -314,7 +314,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: build_ubuntu-latest - name: untar build @@ -339,7 +339,7 @@ jobs: run: docs/mkdocs/generate.sh pages ### jacoco - name: download jacoco report artifact - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: jacoco_report path: pages/jacoco @@ -392,7 +392,7 @@ jobs: TAG_NAME: ${{ github.ref_name }} steps: - uses: actions/checkout@v6 - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: build_ubuntu-latest - name: rename artifact From 72a639512e774abd13dacd2ff097efb5c7f8d6dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:50:33 -0500 Subject: [PATCH 017/190] build(deps): bump org.json:json from 20250517 to 20251224 (#1037) Bumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20250517 to 20251224. - [Release notes](https://github.com/douglascrockford/JSON-java/releases) - [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md) - [Commits](https://github.com/douglascrockford/JSON-java/commits) --- updated-dependencies: - dependency-name: org.json:json dependency-version: '20251224' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d8b6f7f01c..c6d509a710 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ org.json json - 20250517 + 20251224 From b3195a95086d3a74da614362ae1eb11ab127f952 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 5 Jan 2026 18:34:40 -0500 Subject: [PATCH 018/190] cleanup docs (#1041) --- .../main/java/org/jlab/io/clara/Clas12Reader.java | 3 ++- .../main/java/org/jlab/io/clara/DecoderReader.java | 4 ++++ .../main/java/org/jlab/io/clara/DecoderWriter.java | 14 +++++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java index 7b10192c4b..cd1f39dc95 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java @@ -15,7 +15,8 @@ import org.json.JSONObject; /** - * + * Emulate DecoderReader for EVIO files, or HipoToHipoReader for HIPO files. + * * @author baltzell */ public class Clas12Reader extends AbstractEventReaderService { diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java index 868d5d94b1..e105739f17 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java @@ -16,6 +16,10 @@ /** * Combined with DecoderWriter, a port of the standard "decoder" to CLARA. * + * 1. Convert EVIO to HIPO + * 2. CCDB translation tables, c/s/c -> s/l/c/o + * 3. Pulse extraction, e.g., Mode-1 FADC250 + * * @author baltzell */ public class DecoderReader extends AbstractEventReaderService { diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java index 6881bf1928..127b29c0ab 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java @@ -22,11 +22,12 @@ /** * Combined with DecoderReader, a port of the standard "decoder" to CLARA. * - * 1. Converts EVIO to HIPO, translation tables, pulse extraction - * 2. Copies special banks on-the-fly to new tag-1 events - * 3. Caches helicity states and scaler readouts, for later use in post-processing. - * 4. Upon close, writes the helicity sequence to HEL::flip banks in new tag-1 events. - * + * 1. Copies certain banks on-the-fly to new tag-1 events + * 2. Caches helicity states and scaler readouts, for later use in post-processing + * 3. Writes the helicity sequence to HEL::flip banks in new tag-1 events + * 4. Adds .hipo to the output filename, if necessary + * 5. Runs post-processing, writing tag-1 information to all events + * * @author baltzell */ public class DecoderWriter extends HipoToHipoWriter { @@ -43,7 +44,6 @@ public class DecoderWriter extends HipoToHipoWriter { boolean postprocess; private void init(JSONObject opts) { - postprocess = false; fullSchema = new SchemaFactory(); fullSchema.initFromDirectory(FileUtils.getEnvironmentPath("CLAS12DIR","etc/bankdefs/hipo4")); runConfig = new Bank(fullSchema.getSchema("RUN::config")); @@ -52,7 +52,7 @@ private void init(JSONObject opts) { scalers = new DaqScalersSequence(fullSchema); conman = new ConstantsManager(); conman.init("/runcontrol/hwp","/runcontrol/helicity"); - if (opts.has("postprocess")) postprocess = opts.getBoolean("postprocess"); + postprocess = opts.optBoolean("postprocess", false); if (opts.has("variation")) conman.setVariation(opts.getString("variation")); if (opts.has("timestamp")) conman.setTimeStamp(opts.getString("timestamp")); tag1banks = new Bank[TAG1BANKS.length]; From b5e7938b0c7e0e9dae884afdb4e45020e7454f11 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 6 Jan 2026 09:09:06 -0500 Subject: [PATCH 019/190] Increase CI logging verbosity (#1042) --- .github/workflows/ci.yml | 2 +- .gitlab-ci.yml | 2 +- validation/advanced-tests/run-eb-tests.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd9950e9d7..f8d6ab22ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -193,7 +193,7 @@ jobs: - name: run test run: | ls -lhtr - ./coatjava/bin/decoder -n 10000 -o dog.hipo ./clas_018779.evio.00001 + ./coatjava/bin/decoder -l FINE -n 10000 -o dog.hipo ./clas_018779.evio.00001 test_clara: needs: [ build, download_test_data ] diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e70b65987..4ed41cf162 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -148,7 +148,7 @@ decoder: dependencies: [build,download] script: - tar -xzf clara.tar.gz - - decoder -n 1000 -o clas_018779_00001.hipo clas_018779.evio.00001 + - decoder -l FINE -n 1000 -o clas_018779_00001.hipo clas_018779.evio.00001 artifacts: when: always expire_in: 1 day diff --git a/validation/advanced-tests/run-eb-tests.sh b/validation/advanced-tests/run-eb-tests.sh index 9e64ae900b..02e8909afb 100755 --- a/validation/advanced-tests/run-eb-tests.sh +++ b/validation/advanced-tests/run-eb-tests.sh @@ -136,7 +136,7 @@ then then GEOMDBVAR=$geoDbVariation export GEOMDBVAR - ../../coatjava/bin/recon-util -i ${webDir}/${stub}.hipo -o out_${stub}.hipo -c 2 + ../../coatjava/bin/recon-util -l FINE -i ${webDir}/${stub}.hipo -o out_${stub}.hipo -c 2 else echo "set inputDir $PWD/" > cook.clara echo "set outputDir $PWD/" >> cook.clara From 67db92c8fe29911ec7d31f4d2e2d21ba9483d002 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Tue, 6 Jan 2026 11:34:19 -0500 Subject: [PATCH 020/190] feat: log level option `-l` is now case-insenstive (#1045) All of these will now set the log level to `FINE`, no more need to type in all-caps: ``` -l FINE -l fine -l FiNe ``` --- .../src/main/java/org/jlab/utils/options/OptionParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java index 7a2df2cac4..d0e1f26b9f 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java @@ -192,7 +192,7 @@ else if(this.containsOptions(arguments,"-v","-version")==true){ private void setVerbosity(String level) { try { - this.logLevel = Level.parse(level); + this.logLevel = Level.parse(level.toUpperCase()); SplitLogManagerConfig.INSTANCE.setDefaultLevel(this.logLevel); } catch (IllegalArgumentException e) { @@ -231,7 +231,7 @@ public Level getLogLevel() { */ public static void overrideLogLevel(String level, String... classList) { for(var className : classList) - System.setProperty(className + ".level", level); + System.setProperty(className + ".level", level.toUpperCase()); } /** From 8b232c1f44113b366a67714d38afb0055a6fe82e Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Tue, 6 Jan 2026 11:44:14 -0500 Subject: [PATCH 021/190] fix: doubled log messages when `SplitLogManager.configureHandlers` is called twice (#1043) Some classes call `SplitLogManager.configureHandlers` to make the prefix quieter, _e.g._, `DatabaseConstantProvider`; this was causing log messages to double. This PR fixes the issue, and adjusts the formatting a bit to be more consistent with the database classes' log messages. --- .../src/main/java/org/jlab/logging/SplitLogManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManager.java b/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManager.java index fb8e7047c2..8ade3eba96 100644 --- a/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManager.java +++ b/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLogManager.java @@ -45,13 +45,15 @@ public static void configureHandlers(Logger logger, boolean includePrefix) { // clear handlers logger.setUseParentHandlers(false); + for(var handler : logger.getHandlers()) + logger.removeHandler(handler); // log message formatting if(includePrefix) // "[source] level: message throwable_backtrace\n" System.setProperty( "java.util.logging.SimpleFormatter.format", - "[" + logger.getName().replaceAll(".*\\.","") + "] %4$s: %5$s%6$s%n"); + "%4$s: [" + logger.getName().replaceAll(".*\\.","") + "] %5$s%6$s%n"); else // "level: message throwable_backtrace\n" System.setProperty( From 533964f9a3c333cca62f1f7e477c8c8c1c23f2d1 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 6 Jan 2026 13:39:51 -0500 Subject: [PATCH 022/190] check for null (#1046) --- .../rec/dc/track/TrackCandListFinder.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java index c3d248a1bf..a9e1cd866c 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java @@ -926,11 +926,13 @@ private List findStraightTracks(CrossList crossList, DCGeant4Factory DcDe cand.set_Id(cands.size() + 1); cand.set_CovMat(kFZRef.finalStateVec.CM); - Point3D VTCS = cand.get(cand.size()-1).getCoordsInTiltedSector(cand.get_Vtx0().x(), cand.get_Vtx0().y(), cand.get_Vtx0().z()); - double deltaPathToVtx = kFZRef.getDeltaPathToVtx(cand.get(cand.size()-1).get_Sector(), VTCS.z()); + if (cand.get_Vtx0() != null) { + Point3D VTCS = cand.get(cand.size()-1).getCoordsInTiltedSector(cand.get_Vtx0().x(), cand.get_Vtx0().y(), cand.get_Vtx0().z()); + double deltaPathToVtx = kFZRef.getDeltaPathToVtx(cand.get(cand.size()-1).get_Sector(), VTCS.z()); - List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); - cand.setStateVecs(kfStateVecsAlongTrajectory); + List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); + cand.setStateVecs(kfStateVecsAlongTrajectory); + } // add candidate to list of tracks cands.add(cand); @@ -1103,12 +1105,14 @@ private List findCurvedTracks(CrossList crossList, DCGeant4Factory DcDete trjFind, fitStateVec, fitStateVec.getZ(), DcDetector, dcSwim); + + if (cand.get_Vtx0() != null) { + Point3D VTCS = cand.get(cand.size()-1).getCoordsInTiltedSector(cand.get_Vtx0().x(), cand.get_Vtx0().y(), cand.get_Vtx0().z()); + double deltaPathToVtx = kFZRef.getDeltaPathToVtx(cand.get(cand.size()-1).get_Sector(), VTCS.z()); - Point3D VTCS = cand.get(cand.size()-1).getCoordsInTiltedSector(cand.get_Vtx0().x(), cand.get_Vtx0().y(), cand.get_Vtx0().z()); - double deltaPathToVtx = kFZRef.getDeltaPathToVtx(cand.get(cand.size()-1).get_Sector(), VTCS.z()); - - List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); - cand.setStateVecs(kfStateVecsAlongTrajectory); + List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); + cand.setStateVecs(kfStateVecsAlongTrajectory); + } // add candidate to list of tracks if (cand.fit_Successful = true) { From 4dd7b02b7807e4daa3d7d23f1d233dd7cc64f8d2 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 6 Jan 2026 18:30:46 -0500 Subject: [PATCH 023/190] Restore thread-safety for AHDC pulse extraction (#1048) * fix track id bank variable name * reformat * restore thread safety * limit usage --- .../org/jlab/detector/pulse/ModeAHDC.java | 425 +++++++++--------- .../jlab/rec/alert/banks/RecoBankWriter.java | 2 +- .../org/jlab/service/ahdc/AHDCEngine.java | 3 - .../org/jlab/service/alert/ALERTEngine.java | 9 +- 4 files changed, 213 insertions(+), 226 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/ModeAHDC.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/ModeAHDC.java index 7cd68df1b1..a1beb05060 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/ModeAHDC.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/ModeAHDC.java @@ -10,23 +10,23 @@ /** * A new extraction method dedicated to the AHDC signal waveform - * + * * Some blocks of code are inspired by MVTFitter.java and Bonus12 (`createBonusBank()`) - * + * * To do list: * - read pedestal from the DB when a baseline cannot be computed * - change the definition of ADC to be the max of the peak? * - fit waveforms to define arrival time (and charge) - * + * * @author ftouchte, pilleux */ public class ModeAHDC extends HipoExtractor { - + //Parameters, to be read from DB? //Saturation threshold should be 4095 (2^12-1) //But in practice waveforms saturate below it - private final short ADC_LIMIT = 3500; + private final short ADC_LIMIT = 3500; //number of consecutive samples exceeding threshold to consider a saturation plateau private final int consecutiveSaturatingSamples = 3; //Sampling time in ns @@ -44,18 +44,7 @@ public class ModeAHDC extends HipoExtractor { private final float defaultBaseline = 300; // dream clock for fine timestamp correction private final float dream_clock = 8.0f; - - //Waveform and corresponding pulse - //This is the CURRENT pulse, it is initialized - //at every extraction. This is not the cleanest - //but it avoids feeding the same arguments to all methods - private short[] samples; - private Pulse pulse; - private long time_ZS; - private int binMax; - private int numberOfBins; - private int effectiveNumberOfBins; - + //Waveform types: //wfType 6 ⇒ too small (nsamples <= 10) //wfType 5 ⇒ decreasing baseline (or leadingEdgeTime fails) @@ -65,83 +54,91 @@ public class ModeAHDC extends HipoExtractor { //wfType 1 ⇒ saturing //wfType 0 ⇒ OK + private static class AHDCPulse extends Pulse { + private long time_ZS; + private int binMax; + private int numberOfBins; + private int effectiveNumberOfBins; + private short[] samples; + } + /** * */ - public void preProcess() { - assignValidType(0); - this.numberOfBins = samples.length; + public void preProcess(AHDCPulse p) { + assignValidType(0, p); + p.numberOfBins = p.samples.length; // check if the signal is too short int countNotZeros = 0; boolean FirstNonZeroFromTheTailReached = false; - for (int i = samples.length-1; i >= 0; i--) { - if (samples[i] > 0) { + for (int i = p.samples.length-1; i >= 0; i--) { + if (p.samples[i] > 0) { countNotZeros++; if (!FirstNonZeroFromTheTailReached) { FirstNonZeroFromTheTailReached = true; - this.effectiveNumberOfBins = i+1; // this value can be identified as the effective number of bins + p.effectiveNumberOfBins = i+1; // this value can be identified as the effective number of bins } } } - if (countNotZeros <= 10) assignInvalidType(); + if (countNotZeros <= 10) assignInvalidType(p); } /** - * This method computes the waveform baseline - * from the average of the first few samples - */ - public void baselineComputation() + * This method computes the waveform baseline + * from the average of the first few samples + */ + public void baselineComputation(AHDCPulse p) { //Default baseline float adcOffset = -99; - - //Check if the wf has sufficient length, if not it is invalid - if (numberOfBins >= this.nBaselineSamples+1){ + //Check if the wf has sufficient length, if not it is invalid + if (p.numberOfBins >= this.nBaselineSamples+1){ + //The baseline is the average of the first few samples for(int i=0; ithis.pulse.wftype) this.pulse.wftype = (short) type; + if(type>p.wftype) p.wftype = (short) type; } /** - * This method assigns an invalid type (-1) to the waveform - */ - public void assignInvalidType(){ - this.pulse.wftype = 6; + * This method assigns an invalid type (-1) to the waveform + */ + public void assignInvalidType(AHDCPulse p){ + p.wftype = 6; } /** - * This method subtracts the baseline, - * computes the max ADC and corresponding time - * and the integral of the wf - * - * @return an int for status - * - */ - public int waveformADCProcessing() + * This method subtracts the baseline, + * computes the max ADC and corresponding time + * and the integral of the wf + * + * @return an int for status + * + */ + public int waveformADCProcessing(AHDCPulse p) { - //int numberOfBins = this.samples.length; + //int numberOfBins = this.samples.length; //Initialize to dummy values - this.pulse.adcMax = -99; - this.binMax = -99; + p.adcMax = -99; + p.binMax = -99; //For invalid wf, dummy values kept //if(this.pulse.wftype == 6) return 0; @@ -154,20 +151,20 @@ public int waveformADCProcessing() int endPlateau = -99; //Looping through samples - for (int bin = 0; bin < numberOfBins; bin++){ + for (int bin = 0; bin < p.numberOfBins; bin++){ //Baseline subtraction - this.samples[bin] = (short) Math.max(this.samples[bin] - this.pulse.pedestal, 0); + p.samples[bin] = (short) Math.max(p.samples[bin] - p.pedestal, 0); //Look for maximum - if ((this.pulse.adcMax < this.samples[bin]) && (bin >= nBaselineSamples)) { // the max should not be in the baseline - this.pulse.adcMax = this.samples[bin]; - this.binMax = bin; + if ((p.adcMax < p.samples[bin]) && (bin >= nBaselineSamples)) { // the max should not be in the baseline + p.adcMax = p.samples[bin]; + p.binMax = bin; } //Integration - this.pulse.integral += this.samples[bin]; + p.integral += p.samples[bin]; //Check for saturation: if the sample exceeds the ths //and if it belongs to a group of saturating samples - if(this.samples[bin]>(this.ADC_LIMIT-this.pulse.pedestal)){ + if(p.samples[bin]>(this.ADC_LIMIT-p.pedestal)){ //if this is the first sample saturating, start a new plateau if(nsaturating==0) startPlateau = bin; //else continue the plateau @@ -176,83 +173,83 @@ public int waveformADCProcessing() //we store the maximum length of consecutive saturating samples if(nsaturating>maxNsaturating) maxNsaturating = nsaturating; } - else nsaturating = 0;//this sample is not in a row of saturating samples + else nsaturating = 0;//this sample is not in a row of saturating samples } - - //Saturating samples: if the number of consecutive saturating samples + + //Saturating samples: if the number of consecutive saturating samples //is greater than the limit, we consider the wf saturated if(maxNsaturating>=this.consecutiveSaturatingSamples){ - this.assignValidType(1); + this.assignValidType(1, p); //The time is taken as the middle of the plateau - this.binMax = (startPlateau + endPlateau)/2; + p.binMax = (startPlateau + endPlateau)/2; } - - //Define the pulse time as the peak time - this.pulse.time = (this.binMax + this.time_ZS)*this.samplingTime; + + //Define the pulse time as the peak time + p.time = (p.binMax + p.time_ZS)*this.samplingTime; //If there are 2*npts+1 points around the peak //(if the peak is not at an edge of the window) //Then the peak ADC value is revisited to be the average of these //TO DO: just use the adcmax??? int npts = 1; - if (this.pulse.adcMax == 0) { assignValidType(5);} // classification before the fit - if ((this.binMax - npts >= 0) && (this.binMax + npts <= numberOfBins - 1)){ - this.pulse.adcMax = 0; - for (int bin = this.binMax - npts; bin <= this.binMax + npts; bin++) this.pulse.adcMax += this.samples[bin]; - this.pulse.adcMax = this.pulse.adcMax/(2*npts+1); + if (p.adcMax == 0) { assignValidType(5, p);} // classification before the fit + if ((p.binMax - npts >= 0) && (p.binMax + npts <= p.numberOfBins - 1)){ + p.adcMax = 0; + for (int bin = p.binMax - npts; bin <= p.binMax + npts; bin++) p.adcMax += p.samples[bin]; + p.adcMax = p.adcMax/(2*npts+1); } return 0; - } + } /** - * This method computes the leading edge time - * and time over threshold - * over a constant fraction of the peak value - * - * @return an int for status - * - */ - public int waveformCFAprocessing(){ + * This method computes the leading edge time + * and time over threshold + * over a constant fraction of the peak value + * + * @return an int for status + * + */ + public int waveformCFAprocessing(AHDCPulse p){ - //Initialization - this.pulse.leadingEdgeTime = -9999; - this.pulse.trailingEdgeTime = -9999; - this.pulse.timeOverThreshold = -9999; + //Initialization + p.leadingEdgeTime = -9999; + p.trailingEdgeTime = -9999; + p.timeOverThreshold = -9999; //Set the CFA threshold - float threshold = this.amplitudeFractionCFA*this.pulse.adcMax; + float threshold = this.amplitudeFractionCFA*p.adcMax; //Crossing the threshold before the peak int binRise = -99; - for (int bin = 0; bin < binMax - 1; bin++){ - if (this.samples[bin] < threshold && this.samples[bin+1] >= threshold) + for (int bin = 0; bin < p.binMax - 1; bin++){ + if (p.samples[bin] < threshold && p.samples[bin+1] >= threshold) binRise = bin; //Here we keep only the last time the signal crosses the threshold } //If the waveform does not cross the ths before the peak //it was early or remant from a previous event and we cannot define a leading time //we set the time at zero - if(binRise==-99) { - this.assignValidType(5); - this.pulse.leadingEdgeTime = (0 + this.time_ZS)*this.samplingTime; + if(binRise==-99) { + this.assignValidType(5, p); + p.leadingEdgeTime = (0 + p.time_ZS)*this.samplingTime; } else { float slopeRise = 0; //linear interpolation //threshold = leadingtime*(ADC1-ADC0)+ADC0 - if (binRise + 1 <= numberOfBins-1) - slopeRise = this.samples[binRise+1] - this.samples[binRise]; - float fittedBinRise = (slopeRise == 0) ? binRise : binRise + (threshold - this.samples[binRise])/slopeRise; - this.pulse.leadingEdgeTime = (fittedBinRise + this.time_ZS)*this.samplingTime; + if (binRise + 1 <= p.numberOfBins-1) + slopeRise = p.samples[binRise+1] - p.samples[binRise]; + float fittedBinRise = (slopeRise == 0) ? binRise : binRise + (threshold - p.samples[binRise])/slopeRise; + p.leadingEdgeTime = (fittedBinRise + p.time_ZS)*this.samplingTime; } //Crossing the threshold back down after the peak int binFall = -99; - for (int bin = binMax; bin < numberOfBins-1; bin++){ - if (this.samples[bin] > threshold - && this.samples[bin+1] <= threshold - && this.samples[bin]>0 - && this.samples[bin+1]>0){ + for (int bin = p.binMax; bin < p.numberOfBins-1; bin++){ + if (p.samples[bin] > threshold + && p.samples[bin+1] <= threshold + && p.samples[bin]>0 + && p.samples[bin+1]>0){ binFall = bin+1; break; //We keep only the first time the signal crosses back the threshold } @@ -261,87 +258,85 @@ public int waveformCFAprocessing(){ //it was late and falling edge cannot be defined //the time correspond to the end of the signal if(binFall==-99) { - this.assignValidType(2); - this.pulse.trailingEdgeTime = (this.effectiveNumberOfBins -1 + this.time_ZS)*this.samplingTime; + this.assignValidType(2, p); + p.trailingEdgeTime = (p.effectiveNumberOfBins -1 + p.time_ZS)*this.samplingTime; } else { - float slopeFall = 0; - if (binFall - 1 >= 0) - slopeFall = this.samples[binFall] - this.samples[binFall-1]; - float fittedBinFall = (slopeFall == 0) ? binFall : binFall-1 + (threshold - this.samples[binFall-1])/slopeFall; - this.pulse.trailingEdgeTime = (fittedBinFall + this.time_ZS)*this.samplingTime; + float slopeFall = 0; + if (binFall - 1 >= 0) + slopeFall = p.samples[binFall] - p.samples[binFall-1]; + float fittedBinFall = (slopeFall == 0) ? binFall : binFall-1 + (threshold - p.samples[binFall-1])/slopeFall; + p.trailingEdgeTime = (fittedBinFall + p.time_ZS)*this.samplingTime; } - - this.pulse.timeOverThreshold = this.pulse.trailingEdgeTime - this.pulse.leadingEdgeTime; + + p.timeOverThreshold = p.trailingEdgeTime - p.leadingEdgeTime; //if ((this.pulse.timeOverThreshold < 300) || (this.pulse.timeOverThreshold > 750)) this.assignValidType(4); // bad tot - if (this.pulse.timeOverThreshold < 300) this.assignValidType(4); // tot too small + if (p.timeOverThreshold < 300) this.assignValidType(4, p); // tot too small return 0; - } + } - /** - * This methods extracts a time using the Constant Fraction Discriminator (CFD) algorithm - * as described in https://commons.wikimedia.org/wiki/File:CFD_Diagram1.jpg for example - * - * @return an int for status - * - */ - public int computeTimeUsingConstantFractionDiscriminator(){ - //Dummy values for hits for which the leading edge is not defined - this.pulse.constantFractionTime = -99; - if(this.pulse.wftype>=4) return 0; - - //int numberOfBins = this.samples.length; - float[] signal = new float[numberOfBins]; - - // signal generation - for (int bin = 0; bin < numberOfBins; bin++){ - signal[bin] = (1 - this.fractionCFD)*this.samples[bin]; // we fill it with a fraction of the original signal - if (bin < numberOfBins - this.binDelayCFD) - signal[bin] += -1*this.fractionCFD*this.samples[bin + this.binDelayCFD]; // we advance and invert a complementary fraction of the original signal and superimpose it to the previous signal - } - // determine the two humps - int binHumpSup = 0; - int binHumpInf = 0; - for (int bin = 0; bin < numberOfBins; bin++){ - if (signal[bin] > signal[binHumpSup]) - binHumpSup = bin; - } - for (int bin = 0; bin < binHumpSup; bin++){ // this loop has been added to be sure : binHumpInf < binHumpSup - if (signal[bin] < signal[binHumpInf]) - binHumpInf = bin; - } - // research for zero - int binZero = 0; - for (int bin = binHumpInf; bin <= binHumpSup; bin++){ - if (signal[bin] < 0) - binZero = bin; // last pass below zero - } // at this stage : binZero < constantFractionTime/samplingTime <= binZero + 1 // constantFractionTime is determined by assuming a linear fit between binZero and binZero + 1 - float slopeCFD = 0; - if (binZero + 1 <= numberOfBins) - slopeCFD = signal[binZero+1] - signal[binZero]; - float fittedBinZero = (slopeCFD == 0) ? binZero : binZero + (0 - signal[binZero])/slopeCFD; - this.pulse.constantFractionTime = (fittedBinZero + this.time_ZS)*this.samplingTime; - - return 0; + /** + * This methods extracts a time using the Constant Fraction Discriminator (CFD) algorithm + * as described in https://commons.wikimedia.org/wiki/File:CFD_Diagram1.jpg for example + * + * @return an int for status + * + */ + public int computeTimeUsingConstantFractionDiscriminator(AHDCPulse p){ + //Dummy values for hits for which the leading edge is not defined + p.constantFractionTime = -99; + if(p.wftype>=4) return 0; + + //int numberOfBins = this.samples.length; + float[] signal = new float[p.numberOfBins]; + + // signal generation + for (int bin = 0; bin < p.numberOfBins; bin++){ + signal[bin] = (1 - this.fractionCFD)*p.samples[bin]; // we fill it with a fraction of the original signal + if (bin < p.numberOfBins - this.binDelayCFD) + signal[bin] += -1*this.fractionCFD*p.samples[bin + this.binDelayCFD]; // we advance and invert a complementary fraction of the original signal and superimpose it to the previous signal } - - /** - * Apply fine timestamp correction - * - * adapted from decode/MVTFitter.java - * - * @param timestamp for fine time correction - * @param fineTimeStampResolution correspond to the dream clock (usually equals to 8; but to be checked!) - */ - - private void fineTimeStampCorrection(long timestamp, float fineTimeStampResolution) { - long fineTimeStamp = timestamp & 0x00000007; // keep and convert last 3 bits of binary timestamp - this.pulse.leadingEdgeTime += (double) ((fineTimeStamp+0.5) * fineTimeStampResolution); //fineTimeStampCorrection, only on the leadingEdgeTime for the moment (we don't use timeMax or constantFractionTime in the reconstruction yet) - } - - + // determine the two humps + int binHumpSup = 0; + int binHumpInf = 0; + for (int bin = 0; bin < p.numberOfBins; bin++){ + if (signal[bin] > signal[binHumpSup]) + binHumpSup = bin; + } + for (int bin = 0; bin < binHumpSup; bin++){ // this loop has been added to be sure : binHumpInf < binHumpSup + if (signal[bin] < signal[binHumpInf]) + binHumpInf = bin; + } + // research for zero + int binZero = 0; + for (int bin = binHumpInf; bin <= binHumpSup; bin++){ + if (signal[bin] < 0) + binZero = bin; // last pass below zero + } // at this stage : binZero < constantFractionTime/samplingTime <= binZero + 1 // constantFractionTime is determined by assuming a linear fit between binZero and binZero + 1 + float slopeCFD = 0; + if (binZero + 1 <= p.numberOfBins) + slopeCFD = signal[binZero+1] - signal[binZero]; + float fittedBinZero = (slopeCFD == 0) ? binZero : binZero + (0 - signal[binZero])/slopeCFD; + p.constantFractionTime = (fittedBinZero + p.time_ZS)*this.samplingTime; + + return 0; + } + + /** + * Apply fine timestamp correction + * + * adapted from decode/MVTFitter.java + * + * @param timestamp for fine time correction + * @param fineTimeStampResolution correspond to the dream clock (usually equals to 8; but to be checked!) + */ + + private void fineTimeStampCorrection(long timestamp, float fineTimeStampResolution, AHDCPulse p) { + long fineTimeStamp = timestamp & 0x00000007; // keep and convert last 3 bits of binary timestamp + p.leadingEdgeTime += (double) ((fineTimeStamp+0.5) * fineTimeStampResolution); //fineTimeStampCorrection, only on the leadingEdgeTime for the moment (we don't use timeMax or constantFractionTime in the reconstruction yet) + } /** * This method extracts relevant information from the waveform @@ -356,39 +351,39 @@ private void fineTimeStampCorrection(long timestamp, float fineTimeStampResoluti @Override public List extract(NamedEntry pars, int id, long timestamp, long time_ZS, short... samples){ - //Initialize everything each time a new wf is read + //Initialize everything each time a new wf is read //and new adc information is extracted. //This is messy but avoids feeding the same arguments to all methods - this.pulse = new Pulse(); - this.pulse.id = id; - this.pulse.timestamp = timestamp; - this.time_ZS = time_ZS; - this.samples = samples; - this.binMax = -99; + AHDCPulse pulse = new AHDCPulse(); + pulse.id = id; + pulse.timestamp = timestamp; + pulse.time_ZS = time_ZS; + pulse.samples = samples; + pulse.binMax = -99; - List output = new ArrayList<>(); - // Pre Process - this.preProcess(); + this.preProcess(pulse); + //Baseline computation - this.baselineComputation(); - + this.baselineComputation(pulse); + //Get the ADC information from the pulse (peak ADC and time, integral) - this.waveformADCProcessing(); + this.waveformADCProcessing(pulse); //Get the time overr threshold - this.waveformCFAprocessing(); + this.waveformCFAprocessing(pulse); //Get the CFD time - this.computeTimeUsingConstantFractionDiscriminator(); - - // Fine timestamp correction on leadingEdgeTime - this.fineTimeStampCorrection(timestamp, dream_clock); + this.computeTimeUsingConstantFractionDiscriminator(pulse); - output.add(this.pulse); + // Fine timestamp correction on leadingEdgeTime + this.fineTimeStampCorrection(timestamp, dream_clock, pulse); + + List output = new ArrayList<>(); + output.add(pulse); return output; } - + @Override public void update(int n, IndexedTable it, DataEvent event, String wfBankName, String adcBankName) { DataBank wf = event.getBank(wfBankName); @@ -412,26 +407,26 @@ public void update(int n, IndexedTable it, DataEvent event, String wfBankName, S } } } - + @Override protected void update(int n, IndexedTable it, Bank wfBank, Bank adcBank) { - if (wfBank.getRows() > 0) { - List pulses = getPulses(n, it, wfBank); - adcBank.reset(); - adcBank.setRows(pulses!=null ? pulses.size() : 0); - if (pulses!=null && !pulses.isEmpty()) { - for (int i=0; i 0) { + List pulses = getPulses(n, it, wfBank); + adcBank.reset(); + adcBank.setRows(pulses!=null ? pulses.size() : 0); + if (pulses!=null && !pulses.isEmpty()) { + for (int i=0; i pair = trackAIResults.get(i); - bank.setInt("track_id", i, pair.getKey()); + bank.setInt("trackid", i, pair.getKey()); bank.setInt("matched_atof_hit_id", i, pair.getValue()); } event.appendBank(bank); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index 4f8dda448f..b7cbb1b01c 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -6,7 +6,6 @@ import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; import org.jlab.io.hipo.HipoDataSync; -import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.rec.ahdc.AI.*; import org.jlab.rec.ahdc.Banks.RecoBankWriter; import org.jlab.rec.ahdc.Cluster.Cluster; @@ -15,7 +14,6 @@ import org.jlab.rec.ahdc.HelixFit.HelixFitJava; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.Hit.HitReader; -import org.jlab.rec.ahdc.Hit.TrueHit; import org.jlab.rec.ahdc.HoughTransform.HoughTransform; import org.jlab.rec.ahdc.KalmanFilter.KalmanFilter; import org.jlab.rec.ahdc.KalmanFilter.MaterialMap; @@ -24,7 +22,6 @@ import org.jlab.rec.ahdc.Track.Track; import org.jlab.rec.ahdc.ModeTrackFinding; import java.io.File; -import java.lang.reflect.Array; import java.util.*; import java.util.logging.Logger; diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index c4483be4eb..6a54552d89 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; import java.io.File; -import java.util.*; import org.jlab.detector.calib.utils.DatabaseConstantProvider; import org.jlab.geom.base.Detector; @@ -16,10 +15,6 @@ import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.clas.swimtools.Swim; -import org.jlab.rec.ahdc.AI.InterCluster; -import org.jlab.rec.ahdc.AI.PreClustering; -import org.jlab.rec.ahdc.Hit.Hit; -import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.alert.TrackMatchingAI.ModelTrackMatching; import org.jlab.rec.alert.banks.RecoBankWriter; @@ -153,12 +148,12 @@ public boolean processDataEvent(DataEvent event) { ArrayList> matched_ATOF_hit_id = new ArrayList<>(); for (int i = 0; i < bank_AHDCtracks.rows(); i++) { - int track_id = bank_AHDCtracks.getInt("track_id", i); + int track_id = bank_AHDCtracks.getInt("trackid", i); // Get all interclusters for this track ArrayList> interClusters = new ArrayList<>(); for (int j = 0; j < bank_AHDCInterclusters.rows(); j++) { - int intercluster_track_id = bank_AHDCInterclusters.getInt("track_id", j); + int intercluster_track_id = bank_AHDCInterclusters.getInt("trackid", j); if (intercluster_track_id == track_id) { float x = bank_AHDCInterclusters.getFloat("x", j); float y = bank_AHDCInterclusters.getFloat("y", j); From 87c12efbc709f799d661d5419022b18765139daf Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 6 Jan 2026 22:52:23 -0500 Subject: [PATCH 024/190] feat: add decoding to recon-util (#1016) * cleanup * breakout methods * prep for recon-util decoding * finish * fix * fix dependency analysis * cleanup --- common-tools/clas-reco/pom.xml | 5 + .../org/jlab/clas/reco/EngineProcessor.java | 111 +++++++++++------- .../jlab/clas/reco/ReconstructionEngine.java | 37 ------ 3 files changed, 73 insertions(+), 80 deletions(-) diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 7148a58018..9aec044326 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -31,6 +31,11 @@ jclara + + org.jlab.jnp + jnp-hipo + + org.jlab.jnp jnp-hipo4 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 7c1c2b6f33..e3cab74086 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 @@ -1,6 +1,8 @@ package org.jlab.clas.reco; import java.io.File; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.file.Files; import java.util.LinkedHashMap; import java.util.List; @@ -15,6 +17,12 @@ import org.jlab.clara.engine.EngineData; import org.jlab.clara.engine.EngineDataType; import java.util.Arrays; +import org.jlab.coda.jevio.EvioException; +import org.jlab.detector.decode.CLASDecoder4; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.evio.EvioSource; +import org.jlab.io.hipo.HipoDataEvent; +import org.jlab.jnp.hipo4.data.Event; import org.jlab.jnp.hipo4.data.SchemaFactory; import org.json.JSONObject; import org.jlab.utils.ClaraYaml; @@ -34,6 +42,8 @@ public class EngineProcessor { private SchemaFactory banksToKeep = null; private final List schemaExempt = Arrays.asList("RUN::config","DC::tdc"); + private CLASDecoder4 decoder = new CLASDecoder4(); + public EngineProcessor(){} private ReconstructionEngine findEngine(String clazz) { @@ -284,57 +294,72 @@ public void processFile(String file, String output){ this.processFile(file, output, -1, -1); } - /** + public void processEvent(DataEvent event, HipoDataSync writer) { + processEvent(event); + removeBanks(event); + writer.writeEvent(event); + } + + public void processFile(HipoDataSource reader, HipoDataSync writer, int skipEvents, int maxEvents) { + if (updateDictionary==true) updateDictionary(reader, writer); + ProgressPrintout progress = new ProgressPrintout(); + int eventsRead = 0; + while (reader.hasEvent()) { + DataEvent event = reader.getNextEvent(); + eventsRead++; + if (skipEvents <= 0 || eventsRead > skipEvents) processEvent(event, writer); + if (maxEvents > 0 && eventsRead > maxEvents+skipEvents) break; + progress.updateStatus(); + } + progress.showStatus(); + writer.close(); + } + + public void processFile(EvioSource reader, HipoDataSync writer, int skipEvents, int maxEvents) { + ProgressPrintout progress = new ProgressPrintout(); + int eventsRead = 0; + while (reader.hasEvent()) { + eventsRead++; + try { + ByteBuffer bb = reader.getEventBuffer(eventsRead, true); + if (skipEvents <= 0 || eventsRead > skipEvents) { + EvioDataEvent evio = new EvioDataEvent(bb.array(), ByteOrder.LITTLE_ENDIAN); + Event hipo = decoder.getDecodedEvent(evio, -1, eventsRead, null, null); + HipoDataEvent hipo2 = new HipoDataEvent(hipo, decoder.getSchemaFactory()); + processEvent(hipo2, writer); + } + if (maxEvents > 0 && eventsRead > maxEvents+skipEvents) break; + } catch (EvioException ex) { + System.getLogger(EngineProcessor.class.getName()).log(System.Logger.Level.ERROR, (String) null, ex); + } + progress.updateStatus(); + } + progress.showStatus(); + writer.close(); + } + + /**} * process entire file through engine chain. - * @param file input file name to process + * @param input input file name to process * @param output output filename * @param nskip number of events to skip * @param nevents number of events to process */ - public void processFile(String file, String output, int nskip, int nevents){ - if(file.endsWith(".hipo")==true||file.endsWith(".h5")==true - ||file.endsWith(".h4")==true){ + public void processFile(String input, String output, int nskip, int nevents) { + HipoDataSync writer = new HipoDataSync(); + writer.setCompressionType(2); + if (input.endsWith(".hipo") || input.endsWith(".h5") || input.endsWith(".h4")) { HipoDataSource reader = new HipoDataSource(); - reader.open(file); - - int eventCounter = 0; - HipoDataSync writer = new HipoDataSync(); - writer.setCompressionType(2); - - // this doesn't work (before or after "open"): - //if (this.banksToKeep != null) - // writer.getWriter().getSchemaFactory().reduce(banksToKeep.getSchemaKeys()); - + reader.open(input); writer.open(output); - - if(updateDictionary==true) - updateDictionary(reader, writer); - - if(nskip>0 && nevents>0) nevents += nskip; - - ProgressPrintout progress = new ProgressPrintout(); - while(reader.hasEvent()==true){ - DataEvent event = reader.getNextEvent(); - if(nskip<=0 || eventCounter>nskip) { - processEvent(event); - - // this works: - removeBanks(event); - - writer.writeEvent(event); - } - eventCounter++; - if(nevents>0){ - if(eventCounter>nevents) break; - } - progress.updateStatus(); - } - progress.showStatus(); - writer.close(); + processFile(reader, writer, nskip, nevents); } else { - LOGGER.info("\n\n>>>> error in file extension (use .hipo,.h4 or .h5)\n>>>> how is this not simple ?\n"); + LOGGER.info(() -> "No HIPO file extension found, assuming this is an EVIO file: "+input); + EvioSource reader = new EvioSource(); + reader.open(input); + writer.open(output); + processFile(reader, writer, nskip, nevents); } - } /** @@ -350,7 +375,7 @@ public void show(){ public static void main(String[] args){ OptionParser parser = new OptionParser("recon-util"); parser.addRequired("-o","output.hipo"); - parser.addRequired("-i","input.hipo"); + parser.addRequired("-i","input.evio/hipo"); parser.setRequiresInputList(false); parser.addOption("-c","0","use default configuration [0 - no, 1 - yes/default, 2 - all services] "); parser.addOption("-s","-1","number of events to skip"); 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 f39aa79a20..b729c1aec7 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 @@ -434,7 +434,6 @@ public EngineData execute(EngineData input) { try { this.processDataEvent(dataevent); ByteBuffer bbo = dataevent.getEventBuffer(); - //byte[] buffero = bbo.array(); output.setData(mt, bbo); } catch (Exception e) { String msg = String.format("Error processing input event%n%n%s", ClaraUtil.reportException(e)); @@ -446,42 +445,6 @@ public EngineData execute(EngineData input) { } return input; - /* - if (!mt.equalsIgnoreCase()) { - String msg = String.format("Wrong input type: %s", mt); - output.setStatus(EngineStatus.ERROR); - output.setDescription(msg); - return output; - }*/ - /* - EvioDataEvent dataevent = null; - - try { - ByteBuffer bb = (ByteBuffer) input.getData(); - byte[] buffer = bb.array(); - ByteOrder endianness = bb.order(); - dataevent = new EvioDataEvent(buffer, endianness, EvioFactory.getDictionary()); - } catch (Exception e) { - String msg = String.format("Error reading input event%n%n%s", ClaraUtil.reportException(e)); - output.setStatus(EngineStatus.ERROR); - output.setDescription(msg); - return output; - } - - try { - this.processDataEvent(dataevent); - ByteBuffer bbo = dataevent.getEventBuffer(); - //byte[] buffero = bbo.array(); - output.setData(mt, bbo); - } catch (Exception e) { - String msg = String.format("Error processing input event%n%n%s", ClaraUtil.reportException(e)); - output.setStatus(EngineStatus.ERROR); - output.setDescription(msg); - return output; - } - - return output; - */ } @Override From 4bad064c13cccc52e9f445503e358b6bba7c43a7 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Wed, 7 Jan 2026 13:06:13 -0500 Subject: [PATCH 025/190] fix(ConstantsManager): log tables at `INFO` level (#1052) --- .../java/org/jlab/detector/calib/utils/ConstantsManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java index 0283629167..224970c1f2 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/ConstantsManager.java @@ -130,7 +130,7 @@ else if (requests > 1) { } } - LOGGER.log(Level.FINE, "[ConstantsManager] ---> loading table for run = " + run); + LOGGER.log(Level.INFO, "[ConstantsManager] ---> loading table for run = " + run); DatabaseConstantsDescriptor desc = defaultDescriptor.getCopy(run); DatabaseConstantProvider provider = new DatabaseConstantProvider(run, this.databaseVariation, this.timeStamp); @@ -142,7 +142,8 @@ else if (requests > 1) { try { IndexedTable table = provider.readTable(tableName, desc.getTableIndices().get(i)); desc.getMap().put(tk.get(i), table); - LOGGER.log(Level.FINE, String.format("***** >>> adding : %14s / table = %s", tk.get(i), tableName)); + LOGGER.log(Level.INFO, "***** >>> add table = {0}", tableName); + LOGGER.log(Level.FINEST, " key = {0}", tk.get(i)); } catch (Exception e) { LOGGER.log(Level.SEVERE, e.getMessage()); LOGGER.log(Level.SEVERE, "[ConstantsManager] ---> error reading table : " + tableName); From 967394187b0445a61d2129943c818f6ad596a0c8 Mon Sep 17 00:00:00 2001 From: Tongtong Cao Date: Wed, 7 Jan 2026 14:24:48 -0500 Subject: [PATCH 026/190] Add an engine to apply new AI models for forward track finding (#1039) * add engine to apply a new AI model for DC cluster combo prediction * change deafult threshold * Switch to generic predictor pool (#1040) * add generic predictor pool * cleanup --------- Co-authored-by: Nathan Baltzell --- .../org/jlab/rec/ai/dcCluster/DCCluster.java | 39 ++ .../jlab/rec/ai/dcCluster/DCClusterCombo.java | 40 ++ .../org/jlab/service/ai/DCClsComboEngine.java | 540 ++++++++++++++++++ .../org/jlab/service/ai/DCDenoiseEngine.java | 20 - .../org/jlab/service/ai/PredictorPool.java | 39 ++ 5 files changed, 658 insertions(+), 20 deletions(-) create mode 100644 reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCCluster.java create mode 100644 reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCClusterCombo.java create mode 100644 reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java create mode 100644 reconstruction/ai/src/main/java/org/jlab/service/ai/PredictorPool.java diff --git a/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCCluster.java b/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCCluster.java new file mode 100644 index 0000000000..41553cc71d --- /dev/null +++ b/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCCluster.java @@ -0,0 +1,39 @@ +package org.jlab.rec.ai.dcCluster; + + +public class DCCluster{ + int id; + int sector; + int superlayer; + float avgWire; + float fitSlope; + + public DCCluster(int id, int sector, int superlayer, float avgWire, float fitSlope){ + this.id = id; + this.sector = sector; + this.superlayer = superlayer; + this.avgWire = avgWire; + this.fitSlope = fitSlope; + } + + public int getId(){ + return id; + } + + public int getSector(){ + return sector; + } + + public int getSuperlayer(){ + return superlayer; + } + + public float getAvgWire(){ + return avgWire; + } + + public float getFitSlope(){ + return fitSlope; + } + +} \ No newline at end of file diff --git a/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCClusterCombo.java b/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCClusterCombo.java new file mode 100644 index 0000000000..04ea8f6ad6 --- /dev/null +++ b/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcCluster/DCClusterCombo.java @@ -0,0 +1,40 @@ +package org.jlab.rec.ai.dcCluster; + +import java.util.List; +import java.util.ArrayList; + +public class DCClusterCombo extends ArrayList { + + private int id = -1; + private int missingSL = -1; + private float probability = -1; + + public DCClusterCombo(List clsList) { + super(clsList); + } + + public DCClusterCombo(List clsList, int missingSL) { + super(clsList); + this.missingSL = missingSL; + } + + public int getMissingSL() { + return missingSL; + } + + public void setProbability(float probability){ + this.probability = probability; + } + + public float getProbability(){ + return probability; + } + + public void setId(int id){ + this.id = id; + } + + public int getId(){ + return id; + } +} \ No newline at end of file diff --git a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java new file mode 100644 index 0000000000..deec994fb9 --- /dev/null +++ b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java @@ -0,0 +1,540 @@ +package org.jlab.service.ai; + +import java.util.Map; +import java.util.HashMap; +import java.util.TreeMap; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; + +import ai.djl.MalformedModelException; +import ai.djl.inference.Predictor; +import ai.djl.ndarray.NDArray; +import ai.djl.ndarray.NDList; +import ai.djl.ndarray.NDManager; +import ai.djl.repository.zoo.Criteria; +import ai.djl.repository.zoo.ModelNotFoundException; +import ai.djl.repository.zoo.ZooModel; +import ai.djl.training.util.ProgressBar; +import ai.djl.translate.Batchifier; +import ai.djl.translate.Translator; +import ai.djl.translate.TranslatorContext; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; +import org.jlab.utils.system.ClasUtilsFile; +import org.jlab.rec.ai.dcCluster.DCCluster; +import org.jlab.rec.ai.dcCluster.DCClusterCombo; + +public class DCClsComboEngine extends ReconstructionEngine { + final String inputBank = "HitBasedTrkg::Clusters"; + final String outputBank = "ai::tracks"; + + final static String CONF_THREADS = "threads"; + + final static String CONF_MODEL_FILE_6CLS = "modelFile6Cls"; + final static String CONF_THRESHOLD_6CLS = "threshold6Cls"; + String modelFile6Cls = "mlp_64h_4l_6cls.pt"; + float threshold6Cls = 0.95f; + Criteria criteria6Cls; + ZooModel model6Cls; + PredictorPool predictors6Cls; + + final static String CONF_MODEL_FILE_5CLS = "modelFile5Cls"; + final static String CONF_THRESHOLD_5CLS = "threshold5Cls"; + String modelFile5Cls = "mlp_64h_3l_5cls.pt"; + float threshold5Cls = 0.05f; + Criteria criteria5Cls; + ZooModel model5Cls; + PredictorPool predictors5Cls; + + final static int SUPERLAYERS = 6; + + public DCClsComboEngine() { + super("DCClsComboEngine","tongtong","1.0"); + } + + @Override + public boolean init() { + System.setProperty("ai.djl.pytorch.num_interop_threads", "1"); + System.setProperty("ai.djl.pytorch.num_threads", "1"); + System.setProperty("ai.djl.pytorch.graph_optimizer", "false"); + + int threads = Integer.parseInt(getEngineConfigString(CONF_THREADS,"64")); + + if (getEngineConfigString(CONF_THRESHOLD_6CLS) != null) + threshold6Cls = Float.parseFloat(getEngineConfigString(CONF_THRESHOLD_6CLS)); + if (getEngineConfigString(CONF_MODEL_FILE_6CLS) != null) + modelFile6Cls = getEngineConfigString(CONF_MODEL_FILE_6CLS); + + try { + String modelPath = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/data/nnet/clsCombo/" + modelFile6Cls); + + criteria6Cls = Criteria.builder() + .setTypes(float[][].class, float[].class) + .optModelPath(Paths.get(modelPath)) + .optEngine("PyTorch") + .optTranslator(DCClsComboEngine.getBatchTranslator6Cls()) + .optProgress(new ProgressBar()) + .build(); + + model6Cls = criteria6Cls.loadModel(); + predictors6Cls = new PredictorPool(threads, model6Cls); + } catch (NullPointerException | MalformedModelException | IOException | ModelNotFoundException ex) { + Logger.getLogger(DCClsComboEngine.class.getName()).log(Level.SEVERE, null, ex); + return false; + } + + if (getEngineConfigString(CONF_THRESHOLD_5CLS) != null) + threshold5Cls = Float.parseFloat(getEngineConfigString(CONF_THRESHOLD_5CLS)); + if (getEngineConfigString(CONF_MODEL_FILE_5CLS) != null) + modelFile5Cls = getEngineConfigString(CONF_MODEL_FILE_5CLS); + + try { + String modelPath = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/data/nnet/clsCombo/" + modelFile5Cls); + + criteria5Cls = Criteria.builder() + .setTypes(float[][].class, float[].class) + .optModelPath(Paths.get(modelPath)) + .optEngine("PyTorch") + .optTranslator(DCClsComboEngine.getBatchTranslator5Cls()) + .optProgress(new ProgressBar()) + .build(); + + model5Cls = criteria5Cls.loadModel(); + predictors5Cls = new PredictorPool(threads, model5Cls); + } catch (NullPointerException | MalformedModelException | IOException | ModelNotFoundException ex) { + Logger.getLogger(DCClsComboEngine.class.getName()).log(Level.SEVERE, null, ex); + return false; + } + + return true; + } + + @Override + public boolean processDataEvent(DataEvent event) { + + //// 6-cluster combo prediction + // load clusters from bank HitBasedTrkg::Clusters + if (!event.hasBank(inputBank)) return true; + DataBank bank = event.getBank(inputBank); + + List allClusterList = new ArrayList(); + Map>> map = new HashMap<>(); + int rows = bank.rows(); + for (int r = 0; r < rows; r++) { + + int id = bank.getInt("id", r); + int sector = bank.getByte("sector", r); + int superlayer = bank.getByte("superlayer", r); + float avgWire = bank.getFloat("avgWire", r); + float fitSlope = bank.getFloat("fitSlope", r); + + DCCluster cls = new DCCluster(id, sector, superlayer, avgWire, fitSlope); + allClusterList.add(cls); + map.computeIfAbsent(sector, s -> new HashMap<>()).computeIfAbsent(superlayer, sl -> new ArrayList<>()).add(cls); + } + + // Make 6-cluster combos + List all6ClsCombos = new ArrayList(); + for(Map> map_sl_clsList : map.values()){ + if(map_sl_clsList.size() == 6){ + Map> orderedMap = new TreeMap<>(map_sl_clsList); // Sorts entries by superlayer in ascending order + + List combos = new ArrayList(); + generate6ClsCombos(orderedMap, 1, new DCCluster[6], combos); + + all6ClsCombos.addAll(combos); + } + } + + // Batch prediction for 6-cluster combos + float[] outputs6Cls = null; + List predicted6ClsCombos = new ArrayList(); + try { + if(!all6ClsCombos.isEmpty()){ + List batchInputs6Cls = new ArrayList<>(); + for (DCClusterCombo clsCombo: all6ClsCombos) { + float[] input = new float[12]; + for (int i = 0; i < SUPERLAYERS; i++) { + input[i] = clsCombo.get(i).getAvgWire(); + input[i+6] = clsCombo.get(i).getFitSlope(); + } + batchInputs6Cls.add(input); + } + + float[][] batchArray6Cls = new float[batchInputs6Cls.size()][]; + for (int i = 0; i < batchInputs6Cls.size(); i++) { + batchArray6Cls[i] = batchInputs6Cls.get(i); + } + + Predictor predictor6Cls = predictors6Cls.take(); + try { + outputs6Cls = predictor6Cls.predict(batchArray6Cls); + } finally { + predictors6Cls.put(predictor6Cls); + } + } + } catch (Exception e) { + throw new RuntimeException("Batch prediction error in 6ClsComboClf", e); + } + + // Filter 6-cluster combos based on threshold + if(outputs6Cls!=null) { + for(int i = 0; i < outputs6Cls.length; i++){ + if(outputs6Cls[i] > threshold6Cls) { + all6ClsCombos.get(i).setProbability(outputs6Cls[i]); + predicted6ClsCombos.add(all6ClsCombos.get(i)); + } + } + } + + // Separate predicted 6-cluster combos into sectors + Map> map_sector_predicted6ClsComboList = new HashMap<>(); + for(DCClusterCombo clsCombo : predicted6ClsCombos){ + map_sector_predicted6ClsComboList.computeIfAbsent(clsCombo.get(0).getSector(), s -> new ArrayList<>()).add(clsCombo); + } + + // Resolve overlapping cluster combos, and get final 6-cluster combos + List final6ClsComboList = new ArrayList(); + for(List predicted6ClsComboList : map_sector_predicted6ClsComboList.values()){ + final6ClsComboList.addAll(resolveSharedClusterConflicts(predicted6ClsComboList)); + } + + + //// 5-cluster combo prediction with remaining clusters + // Remove clusters in final 6-cluster combos from orignal cluster list + for (DCClusterCombo combo : final6ClsComboList) { + for (DCCluster cls : combo) { + allClusterList.removeIf(c -> c.getId() == cls.getId()); + } + } + + // Separate clusters into sectors + map.clear(); + for (DCCluster cls : allClusterList) { + map.computeIfAbsent(cls.getSector(), s -> new HashMap<>()).computeIfAbsent(cls.getSuperlayer(), sl -> new ArrayList<>()).add(cls); + } + + // Make 5-cluster combos + List all5ClsCombos = new ArrayList<>(); + for (Map> map_sl_clsList : map.values()) { + if(map_sl_clsList.size() >= 5){ + Map> orderedMap = new TreeMap<>(map_sl_clsList); // Sorts entries by superlayer in ascending order + List combos = new ArrayList<>(); + generate5ClsCombos(orderedMap, combos); + all5ClsCombos.addAll(combos); + } + } + + // Batch prediction for 5-cluster combos + float[] outputs5Cls = null; + List predicted5ClsCombos = new ArrayList<>(); + + try { + if (!all5ClsCombos.isEmpty()) { + + // Build input batch + List batchInputs5 = new ArrayList<>(); + for (DCClusterCombo combo : all5ClsCombos) { + float[] input = new float[11]; + + // 5 avgWires + for (int i = 0; i < 5; i++) { + input[i] = combo.get(i).getAvgWire(); + } + + // 5 fitSlopes + for (int i = 0; i < 5; i++) { + input[i + 5] = combo.get(i).getFitSlope(); + } + + // missing superlayer (1–6) + input[10] = combo.getMissingSL(); + + batchInputs5.add(input); + } + + float[][] batchArray5 = batchInputs5.toArray(new float[0][]); + + Predictor predictor5Cls = predictors5Cls.take(); + try { + outputs5Cls = predictor5Cls.predict(batchArray5); + } finally { + predictors5Cls.put(predictor5Cls); + } + } + + } catch (Exception e) { + throw new RuntimeException("Batch prediction error in 5ClsComboClf", e); + } + + // Filter by threshold + if (outputs5Cls != null) { + for (int i = 0; i < outputs5Cls.length; i++) { + if (outputs5Cls[i] > threshold5Cls) { + all5ClsCombos.get(i).setProbability(outputs5Cls[i]); + predicted5ClsCombos.add(all5ClsCombos.get(i)); + } + } + } + + // Separate predicted 5-cluster combos into sectors + Map> map_sector_predicted5ClsComboList = new HashMap<>(); + for (DCClusterCombo combo : predicted5ClsCombos) { + int sector = combo.get(0).getSector(); + map_sector_predicted5ClsComboList.computeIfAbsent(sector, s -> new ArrayList<>()).add(combo); + } + + // Resolve overlapping cluster combos, and get final 5-cluster combos + List final5ClsComboList = new ArrayList<>(); + for (List lst : map_sector_predicted5ClsComboList.values()) { + final5ClsComboList.addAll(resolveSharedClusterConflicts(lst)); + } + + //// Write bank + List finalClsComboList = new ArrayList<>(); + finalClsComboList.addAll(final6ClsComboList); + finalClsComboList.addAll(final5ClsComboList); + + writeBank(event,finalClsComboList); + + return true; + } + + public void writeBank(DataEvent event, List clsComboList){ + DataBank bank = event.createBank(outputBank, clsComboList.size()); + for(int i = 0; i < clsComboList.size(); i++){ + bank.setByte("id", i, (byte) (i+1)); + bank.setByte("sector", i, (byte) clsComboList.get(i).get(0).getSector()); + bank.setFloat("prob", i, (float) clsComboList.get(i).getProbability()); + + int[] ids = new int[6]; + for(DCCluster cls : clsComboList.get(i)){ + ids[cls.getSuperlayer()-1] = cls.getId(); + } + + for(int c = 0; c < 6; c++){ + int order = c+1; + bank.setShort("c"+order, i, (short) ids[c]); + } + } + event.removeBank(outputBank); + event.appendBank(bank); + } + + /** + * Recursively generate all possible 6-cluster combinations from a map of clusters per superlayer. + * + * @param map a map from superlayer index (1-6) to a list of DCClusters in that superlayer + * @param sl the current superlayer being processed (1-based) + * @param current an array storing the current combination of clusters being built + * @param comboList the list to store all generated DCClusterCombo objects + */ + public void generate6ClsCombos(Map> map, int sl, DCCluster[] current, List comboList) { + + // Base case: if all superlayers have been processed (sl > 6) + // then we have a complete 6-cluster combination + if (sl > SUPERLAYERS) { + // Clone the current array and convert to a List + List list = new ArrayList<>(Arrays.asList(current.clone())); + // Wrap the list in a DCClusterCombo and add to output list + comboList.add(new DCClusterCombo(list)); + return; + } + + // Recursive case: iterate over all clusters in the current superlayer + for (DCCluster cls : map.get(sl)) { + // Set the current cluster for this superlayer in the combination array + current[sl-1] = cls; + // Recurse to the next superlayer + generate6ClsCombos(map, sl+1, current, comboList); + } + } + + /** + * Generate all possible 5-cluster combinations from clusters per superlayer. + * Each combination has one missing superlayer. + * + * @param mapSL a map from superlayer index (1-6) to a list of DCClusters + * @param outputList the list to store all generated DCClusterCombo objects + */ + public void generate5ClsCombos(Map> mapSL, + List outputList) { + + // Iterate over all possible missing superlayers (1 to 6) + for (int missingSL = 1; missingSL <= SUPERLAYERS; missingSL++) { + + // Check if clusters exist in the other 5 superlayers + boolean ok = true; + for (int sl = 1; sl <= SUPERLAYERS; sl++) { + if (sl == missingSL) continue; // skip the missing superlayer + if (!mapSL.containsKey(sl)) { // if any required superlayer is missing, skip + ok = false; + break; + } + } + if (!ok) continue; + + // Recursively generate all combinations for the remaining 5 superlayers + generate5ClsRecursive(mapSL, missingSL, 1, new DCCluster[5], 0, outputList); + } + } + + /** + * Recursive helper to generate 5-cluster combinations for a given missing superlayer. + * + * @param mapSL map of superlayer to list of clusters + * @param missingSL the superlayer index that should be missing in the combination + * @param sl the current superlayer being processed (1-based) + * @param current array storing the currently selected clusters + * @param idx index in the 'current' array for the next cluster + * @param outputList list to store generated DCClusterCombo objects + */ + private void generate5ClsRecursive(Map> mapSL, + int missingSL, + int sl, + DCCluster[] current, + int idx, + List outputList) { + + // Base case: all superlayers processed + if (sl > SUPERLAYERS) { + // Convert current array to list and wrap in DCClusterCombo + List list = Arrays.asList(current.clone()); + DCClusterCombo combo = new DCClusterCombo(new ArrayList<>(list), missingSL); + outputList.add(combo); + return; + } + + // If current superlayer is the missing one, skip it + if (sl == missingSL) { + generate5ClsRecursive(mapSL, missingSL, sl + 1, current, idx, outputList); + return; + } + + // Iterate over all clusters in the current superlayer + for (DCCluster cls : mapSL.get(sl)) { + current[idx] = cls; // add cluster to current combination + // Recurse to next superlayer, increment index in current array + generate5ClsRecursive(mapSL, missingSL, sl + 1, current, idx + 1, outputList); + } + } + + + /** + * Resolve conflicts among a list of DCClusterCombos by removing overlapping combos. + * Two combos are considered conflicting if they share any DCCluster (same ID). + * The combos with higher probability are prioritized. + * + * @param comboList the list of DCClusterCombo objects to process + * @return a list of DCClusterCombo objects with conflicts resolved + */ + public List resolveSharedClusterConflicts(List comboList) { + // Sort the combos in descending order of probability + comboList.sort((a, b) -> Float.compare(b.getProbability(), a.getProbability())); + + List selected = new ArrayList<>(); + for (DCClusterCombo combo : comboList) { + boolean conflict = false; + + for (DCClusterCombo kept : selected) { + if (shareCluster(combo, kept)) { + conflict = true; + break; + } + } + + if (!conflict) { + selected.add(combo); + } + } + + return selected; + } + + public boolean shareCluster(DCClusterCombo a, DCClusterCombo b) { + if(a.size() == 6 && b.size() == 6){ + for (int sl = 0; sl < 6; sl++) { + if (a.get(sl).getId() == b.get(sl).getId()) { + return true; + } + } + } + else{ + for (DCCluster ca : a) { + for (DCCluster cb : b) { + if (ca.getId() == cb.getId()) return true; + } + } + } + return false; + } + + // -------- Translator for 6-cluster combo-------- + public static Translator getBatchTranslator6Cls() { + return new Translator() { + @Override + public NDList processInput(TranslatorContext ctx, float[][] batchInput) { + NDManager manager = ctx.getNDManager(); + int batch = batchInput.length; + int dim = 12; + + float[][] normalized = new float[batch][dim]; + + // Normalize for each sample + for (int b = 0; b < batch; b++) { + for (int i = 0; i < 6; i++) normalized[b][i] = batchInput[b][i] / 112f; + for (int i = 6; i < 12; i++) normalized[b][i] = batchInput[b][i]; + } + + NDArray x = manager.create(normalized); // shape: (batch, 12) + return new NDList(x); + } + + @Override + public float[] processOutput(TranslatorContext ctx, NDList out) { + return out.get(0).toFloatArray(); + } + + @Override + public Batchifier getBatchifier() { return Batchifier.STACK; } + }; + } + + // -------- Translator for 5-cluster combo-------- + public static Translator getBatchTranslator5Cls() { + return new Translator() { + @Override + public NDList processInput(TranslatorContext ctx, float[][] batchInput) { + NDManager manager = ctx.getNDManager(); + int batch = batchInput.length; + int dim = 11; + + float[][] normalized = new float[batch][dim]; + + // Normalize for each sample + for (int b = 0; b < batch; b++) { + for (int i = 0; i < 5; i++) normalized[b][i] = batchInput[b][i] / 112f; + for (int i = 5; i < 10; i++) normalized[b][i] = batchInput[b][i]; + normalized[b][10] = batchInput[b][10]/6.0f; + } + + NDArray x = manager.create(normalized); // shape: (batch, 11) + return new NDList(x); + } + + @Override + public float[] processOutput(TranslatorContext ctx, NDList out) { + return out.get(0).toFloatArray(); + } + + @Override + public Batchifier getBatchifier() { return Batchifier.STACK; } + }; + } +} \ No newline at end of file diff --git a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java index 06ad1f50e9..cc58fea625 100644 --- a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java +++ b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java @@ -17,8 +17,6 @@ import ai.djl.translate.TranslateException; import java.io.IOException; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ArrayBlockingQueue; import java.util.logging.Level; import java.util.logging.Logger; @@ -44,24 +42,6 @@ public class DCDenoiseEngine extends ReconstructionEngine { ZooModel model; PredictorPool predictors; - // -------- Predictor Pool -------- - public static class PredictorPool { - final BlockingQueue> pool; - public PredictorPool(int size, ZooModel model) { - pool = new ArrayBlockingQueue<>(size); - for (int i=0; i take() throws InterruptedException { return pool.take(); } - public void put(Predictor p) throws InterruptedException { if (p!=null) pool.put(p); } - public void shutdownAll() { for (Predictor p: pool) { try { p.close(); } catch (Exception ignored) {} } } - } - public DCDenoiseEngine() { super("DenoiseEngine","lleztlab","1.0"); } diff --git a/reconstruction/ai/src/main/java/org/jlab/service/ai/PredictorPool.java b/reconstruction/ai/src/main/java/org/jlab/service/ai/PredictorPool.java new file mode 100644 index 0000000000..bb7d311199 --- /dev/null +++ b/reconstruction/ai/src/main/java/org/jlab/service/ai/PredictorPool.java @@ -0,0 +1,39 @@ +package org.jlab.service.ai; + +import ai.djl.inference.Predictor; +import ai.djl.repository.zoo.ZooModel; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class PredictorPool { + + final BlockingQueue> pool; + + public PredictorPool(int size, ZooModel model) { + pool = new ArrayBlockingQueue<>(size); + for (int i=0; i take() throws InterruptedException { + return pool.take(); + } + + public void put(Predictor p) throws InterruptedException { + if (p!=null) pool.put(p); + } + + public void shutdownAll() { + for (Predictor p: pool) { + try { p.close(); } + catch (Exception ignored) {} + } + } +} From 7b0987d37ab2278abccf3e6e94a4389355f22c22 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 7 Jan 2026 15:16:18 -0500 Subject: [PATCH 027/190] build: bump version number to 13.5.2 (#1053) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 30 +++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwell/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 330 insertions(+), 330 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index c58b881f10..e6769c8a71 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 429760e2ab..90be2afad1 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 3d5ab575c2..ca0da2fae9 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar cnuphys swimmer - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 26f4285ec6..1551d8ab36 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-logging - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 8ed63eff9f..cd4c89a2c8 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index b72f890656..a963a8ba6d 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 92f3259399..36c80154b5 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index e4a72df92d..0a56fa717a 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 88ca685408..7726f161db 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 5cecbafeaf..20fd5f462d 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 9aec044326..d4912c2cdb 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys swimmer - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 8947a0686f..7e482c8c4c 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index aa437648f4..9e6548aae6 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 354673a144..f43837e926 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar cnuphys clas12 - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 5ac2dbd5f1..26d11a876d 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT pom org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 6afb0825e9..141ce7dd45 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar cnuphys clas12 - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 815d02afee..2f68ec81b6 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar cnuphys clas12 - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 3a9812d992..c92cb8c1c1 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar cnuphys clas12 - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys splot - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 5ccf48f8ff..cc2049946d 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clara-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-logging - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-math - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-tracking - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-decay-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys snr - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index a81e4ac3ca..0d55c90c2c 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT pom org.jlab.clas coatjava - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index dc5aefe177..5dcbbe367c 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas common-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys swimmer - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index c6d509a710..897303f10f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 4006147085..2b4620a516 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index f90dd38f03..a3a2b309e4 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index f217defab9..0ee5c2080e 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 0243128dc7..7f48433e87 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 340185ddbc..9a85a3e7d9 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 03badc1c8d..0e27fd4d32 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 4cfa0ff122..fda1e77912 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 440f1721ec..d9e29d7704 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -33,64 +33,64 @@ cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test org.jlab.clas clas-math - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys snr - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.plugins @@ -100,7 +100,7 @@ org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 2a5b478da8..997693190e 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index c7864a37b4..5a9b3e198d 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT test org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index af1e4e4525..8be60e0143 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 543cde23cc..c645cb6177 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 886d824a93..ea3db100f0 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index e9670bce90..c96c92b8be 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index d82a936f51..bd37b2920a 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 185129a556..5cc396f2ea 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 65c9c9630e..6d34bb29a2 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT pom org.jlab.clas coatjava - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 1ad54e391c..cfd5eef9ca 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-analysis - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index c860b8bb2e..7fa4754333 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 16a7d9fd80..fb745bfe8e 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index d449d4d38a..d4ae0d1d86 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 7406541715..9ebcf3e323 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT cnuphys magfield - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-tracking - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index a70197671c..3bfdaf221b 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 0a01d52b7a..5cf8886ca1 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-physics - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-utils - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 3033f0ff57..4b1b8a38b9 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/urwell/pom.xml b/reconstruction/urwell/pom.xml index 59579ec63f..e0c2c0ce6f 100644 --- a/reconstruction/urwell/pom.xml +++ b/reconstruction/urwell/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwell - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index ea5b941141..1ed48aaf21 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas swim-tools - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT jar cnuphys swimmer - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-reco - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-io - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT org.jlab.clas clas-geometry - 13.5.1-SNAPSHOT + 13.5.2-SNAPSHOT From fa293608953514aa4c9826e4671546d62a70475a Mon Sep 17 00:00:00 2001 From: Mathieu Ouillon <67646911+mathieuouillon@users.noreply.github.com> Date: Thu, 8 Jan 2026 14:59:01 -0500 Subject: [PATCH 028/190] feat(ALERTEngine): initialize ATOF detector and check that there are 5 interclusters for the prediction (#1054) --- .../main/java/org/jlab/service/alert/ALERTEngine.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index 6a54552d89..a52bb33c25 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -46,6 +46,8 @@ public class ALERTEngine extends ReconstructionEngine { */ private RecoBankWriter rbc; + Detector ATOF; // ALERT ATOF detector + /** * Current run number being processed. * TODO: why atomic here and nowhere else? @@ -82,6 +84,10 @@ public boolean init() { modelTrackMatching = new ModelTrackMatching(); + AlertTOFFactory factory = new AlertTOFFactory(); + DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); + ATOF = factory.createDetectorCLAS(cp); + if(this.getEngineConfigString("Mode")!=null) { //if (Objects.equals(this.getEngineConfigString("Mode"), Mode.AI_Track_Finding.name())) // mode = Mode.AI_Track_Finding; @@ -160,11 +166,9 @@ public boolean processDataEvent(DataEvent event) { interClusters.add(new Pair<>(x, y)); } } + if (interClusters.size() != 5) continue; try { - AlertTOFFactory factory = new AlertTOFFactory(); - DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); - Detector ATOF = factory.createDetectorCLAS(cp); float[] pred = modelTrackMatching.prediction(interClusters); int sector_pred = (int) pred[0]; From db7091c813b6c1d599c586a39614cc38b13538f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 09:40:27 -0500 Subject: [PATCH 029/190] chore(submodule): bump etc/data/nnet from `636c5e8` to `f43cee9` (#1055) Bumps etc/data/nnet from `636c5e8` to `f43cee9`. --- updated-dependencies: - dependency-name: etc/data/nnet dependency-version: f43cee9e391eb1db30f61f125ecc7f7d3f3cf37e dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- etc/data/nnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/data/nnet b/etc/data/nnet index 636c5e841f..f43cee9e39 160000 --- a/etc/data/nnet +++ b/etc/data/nnet @@ -1 +1 @@ -Subproject commit 636c5e841f8379fd28576aa1ee450cd2f188bed3 +Subproject commit f43cee9e391eb1db30f61f125ecc7f7d3f3cf37e From d59c682dd319bc830f6f0963315e2eade3f6cccf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:19:00 +0000 Subject: [PATCH 030/190] build(deps): bump ai.djl:bom from 0.35.0 to 0.36.0 (#1022) Bumps [ai.djl:bom](https://github.com/deepjavalibrary/djl) from 0.35.0 to 0.36.0. - [Release notes](https://github.com/deepjavalibrary/djl/releases) - [Commits](https://github.com/deepjavalibrary/djl/compare/v0.35.0...v0.36.0) --- updated-dependencies: - dependency-name: ai.djl:bom dependency-version: 0.36.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 897303f10f..b1e3cc0a61 100644 --- a/pom.xml +++ b/pom.xml @@ -192,7 +192,7 @@ ai.djl bom - 0.35.0 + 0.36.0 pom import From 259b533245a11838b23912a689ab8cd8d35cb550 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 13 Jan 2026 18:08:01 -0500 Subject: [PATCH 031/190] feat: add all-banks and sorting options to hipo-diff (#1060) * hipo-diff: do all banks, add sorting * cleanup * cleanup * cleanup --- .../main/java/org/jlab/utils/HipoDiff.java | 277 +++++++++++------- 1 file changed, 176 insertions(+), 101 deletions(-) diff --git a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java index e0341362dd..52f82c4e2e 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java +++ b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java @@ -1,20 +1,75 @@ package org.jlab.utils; +import java.util.ArrayList; +import java.util.HashMap; import org.jlab.jnp.hipo4.io.HipoReader; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; import org.jlab.jnp.hipo4.data.Schema; -import java.util.HashMap; +import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.utils.options.OptionParser; public class HipoDiff { - public static void main(String args[]) { + /** + * Bank sortable by any integer columns. + */ + static class SortedBank extends Bank { + SortedBank(Schema s) { super(s); } + /** + * @param index the bank column indices to sort on + * @return the sorted row indices + */ + int[] getSorted(int... index) { + int[] rows = new int[getRows()]; + for (int row = 0; row < rows.length; row++) rows[row] = row; + // bubble sort: + for (int i = 0; i < rows.length - 1; i++) { + for (int j = 0; j < rows.length - i - 1; j++) { + for (int idx : index) { + if (idx >= this.getSchema().getElements()) break; + int x1 = getInt(idx, rows[j]); + int x2 = getInt(idx, rows[j + 1]); + if (x1 > x2) { + int tmp = rows[j]; + rows[j] = rows[j + 1]; + rows[j + 1] = tmp; + break; + } + else if (x1 < x2) break; + } + } + } + return rows; + } + } + + static int nrow = 0; + static int nevent = -1; + static int nentry = 0; + static int nbadevent = 0; + static int nbadrow = 0; + static int nbadentry = 0; + static int[] sortIndex = null; + + static int nmax; + static double tolerance; + static boolean verboseMode; + static boolean quietMode; + static Bank runConfigBank; + + static ArrayList banksA = new ArrayList<>(); + static ArrayList banksB = new ArrayList<>(); + static HashMap> badEntries = new HashMap<>(); + public static void main(String args[]) { OptionParser op = new OptionParser("hipo-diff"); op.addOption("-t", "0.00001", "absolute tolerance for comparisons"); op.addOption("-n", "-1", "number of events"); - op.addRequired("-b", "name of bank to diff"); + op.addOption("-q", null, "quiet mode"); + op.addOption("-Q", null, "verbose mode"); + op.addOption("-b", null, "name of bank to diff"); + op.addOption("-s", null, "sort on column index"); op.setRequiresInputList(true); op.parse(args); if (op.getInputList().size() != 2) { @@ -22,111 +77,45 @@ public static void main(String args[]) { System.out.println("ERROR: Exactly 2 input files are required."); System.exit(1); } - - final String bankName = op.getOption("-b").stringValue(); - final double tolerance = op.getOption("-t").doubleValue(); - final int nmax = op.getOption("-n").intValue(); + if (op.getOption("-s").stringValue() != null) { + String[] stmp = op.getOption("-s").stringValue().split(","); + sortIndex = new int[stmp.length]; + for (int i = 0; i < stmp.length; i++) sortIndex[i] = Integer.parseInt(stmp[i]); + } + verboseMode = op.getOption("-Q").stringValue() != null; + quietMode = op.getOption("-q").stringValue() != null; + nmax = op.getOption("-n").intValue(); + tolerance = op.getOption("-t").doubleValue(); HipoReader readerA = new HipoReader(); HipoReader readerB = new HipoReader(); readerA.open(op.getInputList().get(0)); readerB.open(op.getInputList().get(1)); + SchemaFactory sf = readerA.getSchemaFactory(); + runConfigBank = new Bank(sf.getSchema("RUN::config")); - Schema schema = readerA.getSchemaFactory().getSchema(bankName); - Bank bankA = new Bank(schema); - Bank bankB = new Bank(schema); - - Bank runConfigBank = new Bank(readerA.getSchemaFactory().getSchema("RUN::config")); - Event event = new Event(); - - int nevent = -1; - int nrow = 0; - int nentry = 0; - int nbadevent = 0; - int nbadrow = 0; - int nbadentry = 0; - HashMap badEntries = new HashMap<>(); - - while (readerA.hasNext() && readerB.hasNext() && (nmax<1 || nevent tolerance) { - element = j; - values += bankA.getFloat(name, i) + "/" + bankB.getFloat(name, i); - } - break; - } - if (element >= 0) { - System.out.println("mismatch at event " + runConfigBank.getInt("event", 0) - + " in row " + i - + " for variable " + name - + " with values " + values); - mismatch = true; - nbadentry++; - if (badEntries.containsKey(schema.getElementName(element))) { - int nbad = badEntries.get(schema.getElementName(element)) + 1; - badEntries.replace(schema.getElementName(element), nbad); - } else { - badEntries.put(schema.getElementName(element), 1); - } - } - } - if (mismatch) { - nbadrow++; - } - } - } + public static void compare(HipoReader a, HipoReader b) { + Event eventA = new Event(); + Event eventB = new Event(); + while (a.hasNext() && b.hasNext() && (nmax < 1 || nevent < nmax)) { + if (++nevent % 5000 == 0) System.out.println("Analyzed " + nevent + " events"); + a.nextEvent(eventA); + b.nextEvent(eventB); + eventA.read(runConfigBank); + compare(eventA, eventB); } System.out.println("\n Analyzed " + nevent + " with " + nbadevent + " bad banks"); System.out.println(nbadrow + "/" + nrow + " mismatched rows"); @@ -134,9 +123,95 @@ public static void main(String args[]) { for (String name : badEntries.keySet()) { System.out.println(name + " " + badEntries.get(name)); } + System.exit(nbadevent + nbadrow + nbadentry); + } + + public static void compare(Event a, Event b) { + for (int i = 0; i < banksA.size(); i++) { + a.read(banksA.get(i)); + b.read(banksB.get(i)); + compare(banksA.get(i), banksB.get(i)); + } + } - if (nbadevent + nbadrow + nbadentry > 0) { - System.exit(7); + public static void compare(SortedBank a, SortedBank b) { + if (a.getRows() != b.getRows()) { + System.out.println("========================= Different number of rows:"); + runConfigBank.show(); + a.show(); + b.show(); + nbadevent++; + System.out.println("========================="); + return; + } + int[] rowsA = sortIndex == null ? null : a.getSorted(sortIndex); + int[] rowsB = sortIndex == null ? null : b.getSorted(sortIndex); + for (int row = 0; row < a.getRows(); row++) { + boolean mismatch = false; + nrow++; + int rowA = sortIndex == null ? row : rowsA[row]; + int rowB = sortIndex == null ? row : rowsB[row]; + for (int j = 0; j < a.getSchema().getElements(); j++) { + final int type = a.getSchema().getType(j); + final String name = a.getSchema().getElementName(j); + int element = -1; + String values = ""; + nentry++; + switch (type) { + case 1: + if (a.getByte(name, rowA) != b.getByte(name, rowB)) { + element = j; + values += a.getByte(name, rowA) + "/" + b.getByte(name, rowB); + } + break; + case 2: + if (a.getShort(name, rowA) != b.getShort(name, rowB)) { + element = j; + values += a.getShort(name, rowA) + "/" + b.getShort(name, rowB); + } + break; + case 3: + if (a.getInt(name, rowA) != b.getInt(name, rowB)) { + element = j; + values += a.getInt(name, rowA) + "/" + b.getInt(name, rowB); + } + break; + case 4: + if ((!Double.isNaN(a.getFloat(name, rowA)) || !Double.isNaN(b.getFloat(name, rowB))) + && (!Double.isInfinite(a.getFloat(name, rowA)) || !Double.isInfinite(b.getFloat(name, rowB))) + && Math.abs(a.getFloat(name, rowA) - b.getFloat(name, rowB)) > tolerance) { + element = j; + values += a.getFloat(name, rowA) + "/" + b.getFloat(name, rowB); + } + break; + } + if (element >= 0) { + if (verboseMode) { + System.out.println("Bank.show " + a.getSchema().getName()); + a.show(); + b.show(); + } + if (!quietMode) { + System.out.println(a.getSchema().getName() + " mismatch at event " + runConfigBank.getInt("event", 0) + + " in row " + row + " for variable " + name + " with values " + values); + } + mismatch = true; + nbadentry++; + String bankName = a.getSchema().getName(); + String elementName = a.getSchema().getElementName(element); + if (!badEntries.containsKey(bankName)) { + badEntries.put(bankName, new HashMap<>()); + } + HashMap m = badEntries.get(bankName); + if (!m.containsKey(elementName)) { + m.put(elementName, 0); + } + m.put(elementName, m.get(elementName) + 1); + } + } + if (mismatch) { + nbadrow++; + } } } } From 3b5f06752e6a9d7b125a99614aaf60f4dfbfe0ab Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 13 Jan 2026 18:18:07 -0500 Subject: [PATCH 032/190] add convenience methods (#1061) --- .../detector/base/DetectorDescriptor.java | 63 +++++++++++-------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorDescriptor.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorDescriptor.java index 6cb753f016..f060362f99 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorDescriptor.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorDescriptor.java @@ -6,38 +6,36 @@ */ public class DetectorDescriptor implements Comparable { - private DetectorType detectorType = DetectorType.UNDEFINED; + private DetectorType detectorType = DetectorType.UNDEFINED; private Integer hw_CRATE = 0; private Integer hw_SLOT = 0; private Integer hw_CHANNEL = 0; - + private Integer dt_SECTOR = 0; private Integer dt_LAYER = 0; private Integer dt_COMPONENT = 0; - - private Integer dt_ORDER = 0; // This is the order in the bank - // defines ADCL,ADCR,TDCL,TDCR (1,2,3,4) - - public DetectorDescriptor(){ - - } - + + // FIXME: Is this correct? + // This order in the bank defines ADCL,ADCR,TDCL,TDCR (1,2,3,4): + private Integer dt_ORDER = 0; + + public DetectorDescriptor() {} + public DetectorDescriptor(DetectorType type){ this.detectorType = type; } - + public DetectorDescriptor(String name){ this.detectorType = DetectorType.getType(name); } - + public DetectorDescriptor getCopy(){ DetectorDescriptor newDesc = new DetectorDescriptor(this.detectorType); newDesc.setCrateSlotChannel(this.getCrate(), this.getSlot(), this.getChannel()); newDesc.setSectorLayerComponent(this.getSector(), this.getLayer(), this.getComponent()); - return newDesc; } - + public int getCrate(){ return this.hw_CRATE;} public int getChannel() { return this.hw_CHANNEL;} public int getComponent(){ return this.dt_COMPONENT;} @@ -49,7 +47,7 @@ public DetectorDescriptor getCopy(){ public void setSector(int sector){ this.dt_SECTOR=sector; } - + public void setOrder(int order){ this.dt_ORDER = order; if(this.dt_ORDER<0||this.dt_ORDER>3){ @@ -57,7 +55,7 @@ public void setOrder(int order){ this.dt_ORDER = 0; } } - + public int[] getCSC() { return new int[]{hw_CRATE,hw_SLOT,hw_CHANNEL}; } @@ -65,9 +63,9 @@ public int[] getCSC() { public int[] getSLCO() { return new int[]{dt_SECTOR,dt_LAYER,dt_COMPONENT,dt_ORDER}; } - + public DetectorType getType(){ return this.detectorType;} - + public final void setType(DetectorType type){ this.detectorType = type; } @@ -88,19 +86,33 @@ public final void setSectorLayerComponent(int sector, int layer, int comp){ this.dt_COMPONENT = comp; } + public final void setSectorLayerComponentOrder(int sector, int layer, int comp, int order) { + this.dt_SECTOR = sector; + this.dt_LAYER = layer; + this.dt_COMPONENT = comp; + this.dt_ORDER = order; + } + + public final void setSectorLayerComponentOrderType(int sector, int layer, int comp, int order, int type) { + this.dt_SECTOR = sector; + this.dt_LAYER = layer; + this.dt_COMPONENT = comp; + this.dt_ORDER = order; + this.detectorType = DetectorType.getType(type); + } + public static int generateHashCode(int s, int l, int c){ return ((s<<24)&0xFF000000)| ((l<<16)&0x00FF0000)|(c&0x0000FFFF); } - + public int getHashCode(){ int hash = ((this.dt_SECTOR<<24)&0xFF000000)| ((this.dt_LAYER<<16)&0x00FF0000)| ((this.dt_ORDER<<12) & 0x0000F000) | (this.dt_COMPONENT&0x00000FFF); return hash; } - - + public void copy(DetectorDescriptor desc){ this.hw_SLOT = desc.hw_SLOT; this.hw_CRATE = desc.hw_CRATE; @@ -110,7 +122,7 @@ public void copy(DetectorDescriptor desc){ this.dt_LAYER = desc.dt_LAYER; this.dt_COMPONENT = desc.dt_COMPONENT; } - + public boolean compare(DetectorDescriptor desc){ if(this.detectorType.equals(desc.detectorType)&& this.dt_SECTOR.equals(desc.dt_SECTOR)&& @@ -118,8 +130,7 @@ public boolean compare(DetectorDescriptor desc){ this.dt_COMPONENT.equals(desc.dt_COMPONENT)) return true; return false; } - - + public static String getName(String base, int... ids){ StringBuilder str = new StringBuilder(); str.append(base); @@ -128,7 +139,7 @@ public static String getName(String base, int... ids){ if(ids.length>2) str.append(String.format("_C_%d", ids[2])); return str.toString(); } - + public static String getTitle(String base, int... ids){ StringBuilder str = new StringBuilder(); if(ids.length>0) str.append(String.format(" SECTOR %d", ids[0])); @@ -136,7 +147,7 @@ public static String getTitle(String base, int... ids){ if(ids.length>2) str.append(String.format(" UNIT %d", ids[2])); return str.toString(); } - + @Override public String toString(){ return String.format("D [%6s ] C/S/C [%4d %4d %4d ] S/L/C [%4d %4d %4d ] ORDER = %2d", From 74cf5e759c6763d4ccc86c5da080e8280215bc26 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 13 Jan 2026 19:40:56 -0500 Subject: [PATCH 033/190] fix old command-line changes (#1067) --- libexec/scaling | 4 ++-- libexec/scaling.gpl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libexec/scaling b/libexec/scaling index 0de022937d..a2fd8a072d 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -38,11 +38,11 @@ def benchmark(cfg, threads): exiting,benchmarks = False,collections.OrderedDict() cmd = ['run-clara', '-c',cfg.c, - '-n',str(cfg.e*threads), + '-n',str(cfg.e*int(threads)), '-t',str(threads), '-y',cfg.y, '-o',f'tmp-scaling-{threads}', - cfg.input] + cfg.i] for line in run(cmd): cols = line.split() print(line) diff --git a/libexec/scaling.gpl b/libexec/scaling.gpl index 14db409d70..c858a734ce 100644 --- a/libexec/scaling.gpl +++ b/libexec/scaling.gpl @@ -1,5 +1,5 @@ -set terminal qt size 1000,700 +set terminal svg size 1000,700 set multiplot layout 2,2 set datafile columnheaders From 2519bea41f9f20a33096cc54678e5f62e74c1a66 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 13 Jan 2026 20:08:51 -0500 Subject: [PATCH 034/190] feat: add full TranslationTable printout, cleanup (#1062) * add hash-based accessor * add debugging --- .../detector/decode/TranslationTable.java | 22 ++++++++++++++----- .../org/jlab/utils/groups/IndexedList.java | 14 +++++++++++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java index 9958969083..da1c3512b4 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java @@ -1,8 +1,9 @@ package org.jlab.detector.decode; +import java.util.stream.Collectors; +import org.jlab.utils.groups.IndexedTable; import org.jlab.detector.base.DetectorType; import org.jlab.detector.calib.utils.ConstantsManager; -import org.jlab.utils.groups.IndexedTable; /** * @@ -24,6 +25,7 @@ public void add(DetectorType dt, IndexedTable it) { int slot = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1); int channel = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2); + // first one wins, print error message for loser: if (hasEntryByHash(hash)) { System.err.print("TranslationTable: found CCDB overlap for "); System.err.println(String.format("type %d/%s versus %s and c/s/c=%d/%d/%d", @@ -36,10 +38,8 @@ public void add(DetectorType dt, IndexedTable it) { addEntry(crate, slot, channel); // add each column's entry to the new row: - for (int column=0; column> this.byteShifts[order]) & mask); } + /** + * Retrieves an array of the requested indices. + * + * @param indices + * @return + */ + public int[] getIndices(long hashcode, int... indices) { + int[] ret = new int[indices.length]; + for (int i=0; i Date: Wed, 14 Jan 2026 10:56:05 -0500 Subject: [PATCH 035/190] replace string with index access (#1063) --- .../jlab/detector/pulse/HipoExtractor.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/HipoExtractor.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/HipoExtractor.java index 9ae25420cf..e0e77c4063 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/HipoExtractor.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/pulse/HipoExtractor.java @@ -92,35 +92,35 @@ protected void update(int n, IndexedTable it, Bank wfBank, Bank adcBank) { } protected static void copyIndices(Bank src, Bank dest, int isrc, int idest) { - dest.putByte("sector", idest, src.getByte("sector",isrc)); - dest.putByte("layer", idest, src.getByte("layer",isrc)); - dest.putShort("component", idest, src.getShort("component",isrc)); - dest.putByte("order", idest, src.getByte("order",isrc)); + dest.putByte(0, idest, src.getByte(0,isrc)); + dest.putByte(1, idest, src.getByte(1,isrc)); + dest.putShort(2, idest, src.getShort(2,isrc)); + dest.putByte(3, idest, src.getByte(3,isrc)); dest.putShort("windex", idest, (short)isrc); } protected static void copyIndices(DataBank src, DataBank dest, int isrc, int idest) { - dest.setByte("sector", idest, src.getByte("sector",isrc)); - dest.setByte("layer", idest, src.getByte("layer",isrc)); - dest.setShort("component", idest, src.getShort("component",isrc)); - dest.setByte("order", idest, src.getByte("order",isrc)); + dest.setByte(0, idest, src.getByte(0,isrc)); + dest.setByte(1, idest, src.getByte(1,isrc)); + dest.setShort(2, idest, src.getShort(2,isrc)); + dest.setByte(3, idest, src.getByte(3,isrc)); dest.setShort("windex", idest, (short)isrc); } protected static int[] getIndices(Bank bank, int row) { return new int[] { - bank.getShort("sector", row), - bank.getShort("layer", row), - bank.getShort("component", row), - bank.getShort("order", row)}; + bank.getShort(0, row), + bank.getShort(1, row), + bank.getShort(2, row), + bank.getShort(3, row)}; } protected static int[] getIndices(DataBank bank, int row) { return new int[] { - bank.getShort("sector", row), - bank.getShort("layer", row), - bank.getShort("component", row), - bank.getShort("order", row)}; + bank.getShort(0, row), + bank.getShort(1, row), + bank.getShort(2, row), + bank.getShort(3, row)}; } protected List getPulses(int n, IndexedTable it, DataBank wfBank) { From 27b6c1df2350a5bb20563158ed0478ccc620c47c Mon Sep 17 00:00:00 2001 From: Tongtong Cao Date: Wed, 14 Jan 2026 11:37:06 -0500 Subject: [PATCH 036/190] apply AI model for HB tracking (#1057) * apply AI model for HB tracking * change some member variables from public to private in org.jlab.clas.tracking.kalmanfilter.zReference.KFitter --- .../kalmanfilter/zReference/KFitter.java | 12 +- .../dcHBTrackState/HBTrackStateEstimator.java | 150 ++++++++ reconstruction/dc/pom.xml | 5 + .../rec/dc/track/TrackCandListFinder.java | 102 +++++ .../java/org/jlab/service/dc/DCEngine.java | 12 + .../org/jlab/service/dc/DCHBTrackingAI.java | 362 ++++++++++++++++++ 6 files changed, 641 insertions(+), 2 deletions(-) create mode 100644 reconstruction/ai/src/main/java/org/jlab/rec/ai/dcHBTrackState/HBTrackStateEstimator.java create mode 100644 reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java index a92cc020d7..8b2f038c10 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java @@ -60,7 +60,7 @@ public class KFitter extends AKFitter { Matrix result = new Matrix(); Matrix result_inv = new Matrix(); Matrix adj = new Matrix(); - + public KFitter(boolean filter, int iterations, int dir, Swim swim, double Z[], Libr mo) { super(filter, iterations, dir, swim, mo); this.Z = Z; @@ -861,7 +861,7 @@ private void calcFinalChisq(int sector) { // Since no vertex inforamtion, the starting point for path length is the final point at the last layer. // After vertex information is obtained, transition for the starting point from the final point to vertex will be taken. - private void calcFinalChisq(int sector, boolean nofilter) { + public void calcFinalChisq(int sector, boolean nofilter) { int k = svzLength - 1; this.chi2 = 0; double path = 0; @@ -1157,6 +1157,14 @@ public StateVecs getStateVecs() { public double getNDFDAF(){ return ndfDAF; } + + public void setSvzLength(int svzlength){ + this.svzLength = svzlength; + } + + public int getSvzLength(){ + return svzLength; + } public void printlnMeasVecs() { for (int i = 0; i < mv.measurements.size(); i++) { diff --git a/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcHBTrackState/HBTrackStateEstimator.java b/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcHBTrackState/HBTrackStateEstimator.java new file mode 100644 index 0000000000..f0818b9c3b --- /dev/null +++ b/reconstruction/ai/src/main/java/org/jlab/rec/ai/dcHBTrackState/HBTrackStateEstimator.java @@ -0,0 +1,150 @@ +package org.jlab.rec.ai.dcHBTrackState; + +import ai.djl.MalformedModelException; +import ai.djl.ModelException; +import ai.djl.inference.Predictor; +import ai.djl.ndarray.*; +import ai.djl.ndarray.types.Shape; +import ai.djl.repository.zoo.*; +import ai.djl.training.util.ProgressBar; +import ai.djl.translate.*; + +import java.io.IOException; +import java.nio.file.Paths; +import java.util.concurrent.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.io.base.*; +import org.jlab.utils.system.ClasUtilsFile; +import org.jlab.service.ai.PredictorPool; + + +public class HBTrackStateEstimator{ + // ---------------- Configuration ---------------- + private String modelFile; + + ZooModel model; + PredictorPool predictors; + + // ---------------- Statistics for normalization of inputs and outputs of training samples ---------------- + //// Note: Statistics of hits and track states depends on training samples, so need to be renewed when training samples change!!! + // Statistics of hits: doca, xm, xr, yr, z + private float[] HIT_MEAN; + private float[] HIT_STD; + + // Statistics of track state: x, y, tx, ty, Q at z = 229 cm in the tilted sector frame + private float[] STATE_MEAN; + private float[] STATE_STD; + + public HBTrackStateEstimator(String modelFile){ + this.modelFile = modelFile; + + if(modelFile.contains("inbending")){ + HIT_MEAN = new float[]{0.52949071f, -45.771999f, -45.744694f, 57.336819f, 373.046356f}; + HIT_STD = new float[]{0.40272677f, 47.928203f, 48.379021f, 32.645191f, 111.54994f}; + STATE_MEAN = new float[]{-33.564308f, 0.010787425f, -0.15567796f, 0.0017755219f, 0.317530721f}; + STATE_STD = new float[]{28.667490f, 17.761129f, 0.11940812f, 0.074460238f, 0.74185127f}; + } + else if(modelFile.contains("outbending")){ + HIT_MEAN = new float[]{0.53385729f, -59.236504f, -59.200584f, 50.136387f, 372.057922f}; + HIT_STD = new float[]{0.40085429f, 51.385536f, 51.840462f, 31.498201f, 111.50029f}; + STATE_MEAN = new float[]{-39.446106f, 0.17583229f, -0.18047817f, 0.0014163271f, -0.082320645f}; + STATE_STD = new float[]{33.733425f, 17.226780f, 0.14071095f, 0.072449364f, 0.72273886f}; + } + else{ + Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Name of model file does not include inbending or outbending"); + } + + System.setProperty("ai.djl.pytorch.num_interop_threads", "1"); + System.setProperty("ai.djl.pytorch.num_threads", "1"); + System.setProperty("ai.djl.pytorch.graph_optimizer", "false"); + try { + String modelPath = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/data/nnet/hbTSE/" + modelFile); + + Criteria criteria = Criteria.builder() + .setTypes(float[][].class, float[].class) + .optModelPath(Paths.get(modelPath)) + .optEngine("PyTorch") + .optTranslator(getTranslator()) + .optProgress(new ProgressBar()) + .build(); + + model = criteria.loadModel(); + + int threads = 64; + predictors = new PredictorPool(threads, model); + + + } catch (IOException | ModelException e) { + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e); + } + } + + // ---------------- Translator ---------------- + private Translator getTranslator() { + return new Translator() { + + @Override + public NDList processInput(TranslatorContext ctx, float[][] hits) { + NDManager manager = ctx.getNDManager(); + int n = hits.length; + + float[][] norm = new float[n][5]; + for (int i = 0; i < n; i++) + for (int j = 0; j < 5; j++) + norm[i][j] = (hits[i][j] - HIT_MEAN[j]) / HIT_STD[j]; + + NDArray x = manager.create(norm); + x = x.reshape(1, n, 5); + return new NDList(x); + } + + @Override + public float[] processOutput(TranslatorContext ctx, NDList list) { + NDArray out = list.get(0); // [1,5] + float[] y = out.toFloatArray(); + + for (int i = 0; i < 5; i++) + y[i] = y[i] * STATE_STD[i] + STATE_MEAN[i]; + + return y; + } + + @Override + public Batchifier getBatchifier() { + return null; + } + }; + } + + + public float[] predict(float[][] hits) { + if (hits == null) return null; + + if (hits.length == 0) { + throw new IllegalArgumentException("HBInitialStateEstimator: empty hits"); + } + + for (int i = 0; i < hits.length; i++) { + if (hits[i].length != 5) { + throw new IllegalArgumentException( + "Expect 5 features per hit, got " + hits[i].length + ); + } + } + + try { + Predictor predictor = predictors.take(); + try { + return predictor.predict(hits); + } finally { + predictors.put(predictor); + } + } catch (TranslateException | InterruptedException e) { + throw new RuntimeException(e); + } + } +} + diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index d9e29d7704..9c718f77f7 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -41,6 +41,11 @@ clas-tracking 13.5.2-SNAPSHOT + + org.jlab.clas12.detector + clas12detector-ai + 13.5.2-SNAPSHOT + org.jlab.clas clas-jcsg diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java index a9e1cd866c..6f68d554ab 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java @@ -34,6 +34,8 @@ import org.jlab.clas.tracking.utilities.MatrixOps.Libr; import org.jlab.clas.tracking.utilities.RungeKuttaDoca; +import org.jlab.rec.ai.dcHBTrackState.HBTrackStateEstimator; + /** * A class with a method implementing an algorithm that finds lists of track * candidates in the DC @@ -204,6 +206,106 @@ private int calcInitTrkQ(double a, double TORSCALE) { return q; } + + public List getTrackCandsAI(CrossList crossList, DCGeant4Factory DcDetector, Swim dcSwim, HBTrackStateEstimator hbTSEstimator){ + List cands = new ArrayList(); + + for (List aCrossList : crossList) { + Track cand = new Track(); + + if (aCrossList.size() == 3 && this.PassNSuperlayerTracking(aCrossList, cand)) { + cand.addAll(aCrossList); + cand.setSector(aCrossList.get(0).get_Sector()); + int sector = cand.getSector(); + + List measSurfaces = getMeasSurfaces(cand, DcDetector); + + int numHits = 0; + for(Surface surf : measSurfaces){ + numHits += surf.nMeas; + } + float[][] hits = new float[numHits][5]; + int indexHit = 0; + for(int i = 0; i < measSurfaces.size(); i++){ + hits[indexHit][0] = (float)measSurfaces.get(i).doca[0]; + hits[indexHit][1] = (float)measSurfaces.get(i).wireLine[0].origin().x(); + hits[indexHit][2] = (float)measSurfaces.get(i).wireLine[0].end().x(); + hits[indexHit][3] = (float)measSurfaces.get(i).wireLine[0].end().y(); + hits[indexHit][4] = (float)measSurfaces.get(i).wireLine[0].end().z(); + + indexHit++; + + if(measSurfaces.get(i).nMeas == 2){ + hits[indexHit][0] = (float)measSurfaces.get(i).doca[1]; + hits[indexHit][1] = (float)measSurfaces.get(i).wireLine[1].origin().x(); + hits[indexHit][2] = (float)measSurfaces.get(i).wireLine[1].end().x(); + hits[indexHit][3] = (float)measSurfaces.get(i).wireLine[1].end().y(); + hits[indexHit][4] = (float)measSurfaces.get(i).wireLine[1].end().z(); + + indexHit++; + } + } + + float[] estSV = hbTSEstimator.predict(hits); + StateVecs svs = new StateVecs(); + org.jlab.clas.tracking.kalmanfilter.AStateVecs.StateVec initSV = svs.new StateVec(0); + initSV.x = estSV[0]; + initSV.y = estSV[1]; + initSV.z = 229.; // State vector at z = 229 for AI training samples + initSV.tx = estSV[2]; + initSV.ty = estSV[3]; + initSV.Q = estSV[4]; + + RungeKuttaDoca rk = new RungeKuttaDoca(); + rk.SwimToZ(sector, initSV, dcSwim, measSurfaces.get(0).wireLine[0].end().z(), new float[3]); + + KFitter kFZRef = new KFitter(true, 1, 1, dcSwim, Constants.getInstance().Z, Libr.JNP); + Matrix initCMatrix = new Matrix(); + initSV.CM = new Matrix(); + kFZRef.init(measSurfaces, initSV); + + org.jlab.clas.tracking.kalmanfilter.AStateVecs.StateVec finalSV = svs.new StateVec(initSV); + rk.SwimToZ(sector, finalSV, dcSwim, measSurfaces.get(measSurfaces.size()-1).wireLine[0].end().z(), new float[3]); + kFZRef.getStateVecs().transported(true).put(measSurfaces.size()-1, finalSV); + + kFZRef.setSvzLength(measSurfaces.size()); + kFZRef.calcFinalChisq(sector, true); + + StateVec stateVec = new StateVec(finalSV.x, + finalSV.y, finalSV.tx, finalSV.ty); + int q = (int) Math.signum(finalSV.Q); + double p = 1. / Math.abs(finalSV.Q); + stateVec.setZ(finalSV.z); + + //set the track parameters + cand.set_P(p); + cand.set_Q(q); + + // candidate parameters + cand.set_FitChi2(kFZRef.chi2); + cand.set_FitNDF(kFZRef.NDF); + + cand.setFinalStateVec(stateVec); + cand.set_Id(cands.size() + 1); + this.setTrackPars(cand, null, + null, stateVec, + stateVec.getZ(), + DcDetector, dcSwim); + + if(cand.get_Vtx0() != null){ + Point3D VTCS = cand.get(cand.size()-1).getCoordsInTiltedSector(cand.get_Vtx0().x(), cand.get_Vtx0().y(), cand.get_Vtx0().z()); + double deltaPathToVtx = kFZRef.getDeltaPathToVtx(sector, VTCS.z()); + + List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); + cand.setStateVecs(kfStateVecsAlongTrajectory); + } + + if (kFZRef.chi2 < Constants.MAXCHI2) cands.add(cand); + } + } + + return cands; + } /** * @param crossList the input list of crosses diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java index 5bfba7b14e..156493cd30 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java @@ -12,6 +12,7 @@ import org.jlab.rec.dc.banks.Banks; import org.jlab.clas.tracking.kalmanfilter.zReference.KFitter; import org.jlab.clas.tracking.kalmanfilter.zReference.DAFilter; +import org.jlab.rec.ai.dcHBTrackState.HBTrackStateEstimator; public class DCEngine extends ReconstructionEngine { @@ -39,6 +40,9 @@ public class DCEngine extends ReconstructionEngine { private String dafChi2Cut = null; private String dafAnnealingFactorsTB = null; + protected String hbTSEModelFileInbending = "transformer_32d_4h_3l_inbending.pt"; // AI model file for HB track state estimator for inbending runs + protected String hbTSEModelFileOutbending = "transformer_32d_4h_3l_outbending.pt"; // AI model file for HB track state estimator for outbending runs + public static final Logger LOGGER = Logger.getLogger(ReconstructionEngine.class.getName()); @@ -127,6 +131,14 @@ else if(this.getEngineConfigString("dcT2DFunc").equalsIgnoreCase("Polynomial")) dafAnnealingFactorsTB=this.getEngineConfigString("dafAnnealingFactorsTB"); KFitter.setDafAnnealingFactorsTB(dafAnnealingFactorsTB); } + + if (getEngineConfigString("hbTSEModelFileInbending") != null){ + hbTSEModelFileInbending = getEngineConfigString("hbTSEModelFileInbending"); + } + + if (getEngineConfigString("hbTSEModelFileOutbending") != null){ + hbTSEModelFileOutbending = getEngineConfigString("hbTSEModelFileOutbending"); + } // Set geometry shifts for alignment code if(this.getEngineConfigString("alignmentShifts")!=null) { diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java new file mode 100644 index 0000000000..b51d8c054c --- /dev/null +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java @@ -0,0 +1,362 @@ +package org.jlab.service.dc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jlab.clas.swimtools.Swim; +import org.jlab.clas.swimtools.Swimmer; +import org.jlab.io.base.DataEvent; +import org.jlab.rec.dc.Constants; +import org.jlab.rec.dc.banks.HitReader; +import org.jlab.rec.dc.banks.RecoBankWriter; +import org.jlab.rec.dc.cluster.FittedCluster; +import org.jlab.rec.dc.cross.Cross; +import org.jlab.rec.dc.cross.CrossList; +import org.jlab.rec.dc.cross.CrossListFinder; +import org.jlab.rec.dc.hit.FittedHit; +import org.jlab.rec.dc.hit.Hit; +import org.jlab.rec.dc.nn.PatternRec; +import org.jlab.rec.dc.segment.Segment; +import org.jlab.rec.dc.track.Track; +import org.jlab.rec.dc.track.TrackCandListFinder; +import org.jlab.rec.dc.cluster.ClusterFinder; +import org.jlab.rec.dc.cluster.ClusterFitter; +import org.jlab.rec.dc.segment.SegmentFinder; +import org.jlab.rec.dc.cross.CrossMaker; +import org.jlab.rec.dc.trajectory.Road; +import org.jlab.rec.dc.trajectory.RoadFinder; +import static org.jlab.service.dc.DCEngine.LOGGER; +import org.jlab.rec.ai.dcHBTrackState.HBTrackStateEstimator; + +/** + * + * @author tongtong + */ +public class DCHBTrackingAI extends DCEngine { + private HBTrackStateEstimator hbTSEstimatorInbending = null; + private HBTrackStateEstimator hbTSEstimatorOutbending = null; + + public DCHBTrackingAI() { + super("DCHTAI"); + this.getBanks().init("HitBasedTrkg", "", "AI"); + hbTSEstimatorInbending = new HBTrackStateEstimator(hbTSEModelFileInbending); + hbTSEstimatorOutbending = new HBTrackStateEstimator(hbTSEModelFileOutbending); + } + + public DCHBTrackingAI(String outputBankPrefix) { + super("DCHTAI"); + this.getBanks().init("HitBasedTrkg", "", outputBankPrefix); + hbTSEstimatorInbending = new HBTrackStateEstimator(hbTSEModelFileInbending); + hbTSEstimatorOutbending = new HBTrackStateEstimator(hbTSEModelFileOutbending); + } + + @Override + public void setDropBanks() { + super.registerOutputBank(this.getBanks().getHitsBank()); + super.registerOutputBank(this.getBanks().getClustersBank()); + super.registerOutputBank(this.getBanks().getSegmentsBank()); + super.registerOutputBank(this.getBanks().getCrossesBank()); + super.registerOutputBank(this.getBanks().getTracksBank()); + super.registerOutputBank(this.getBanks().getIdsBank()); + } + + @Override + public boolean processDataEvent(DataEvent event) { + + int run = this.getRun(event); + if(run==0) { + LOGGER.log(Level.INFO, "RUN=0: Skipping event"); + return true; + } + + HBTrackStateEstimator hbTSEstimator = null; + if(Swimmer.getTorScale() < 0) + hbTSEstimator = hbTSEstimatorInbending; + else if(Swimmer.getTorScale() > 0) + hbTSEstimator = hbTSEstimatorOutbending; + else{ + Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Torus scale = 0"); + return true; + } + + ////// AI-assisted tracking + /* IO */ + HitReader reader = new HitReader(this.getBanks(), Constants.getInstance().dcDetector); + reader.initialize(event); + RecoBankWriter writer = new RecoBankWriter(this.getBanks()); + // get Field + Swim dcSwim = new Swim(); + LOGGER.log(Level.FINEST, "HB AI process event"); + + //AI + List trkcands = null; + List crosses = null; + List clusters = new ArrayList<>(); + List segments = null; + List fhits = null; + + reader.read_NNHits(event); + + //I) get the lists + List hits = reader.get_DCHits(); + fhits = new ArrayList<>(); + //II) process the hits + // Exit if hit list is empty + if (hits.isEmpty()) { + return true; + } + PatternRec pr = new PatternRec(); + segments = pr.RecomposeSegments(hits, Constants.getInstance().dcDetector); + Collections.sort(segments); + + if (segments.isEmpty()) { + return true; + } + //crossList + CrossList crosslist = pr.RecomposeCrossList(segments, Constants.getInstance().dcDetector); + crosses = new ArrayList<>(); + + LOGGER.log(Level.FINEST, "num cands = "+crosslist.size()); + for (List clist : crosslist) { + crosses.addAll(clist); + for(Cross c : clist) + LOGGER.log(Level.FINEST, "Pass Cross"+c.printInfo()); + } + if (crosses.isEmpty()) { + for(Segment seg : segments) { + clusters.add(seg.get_fittedCluster()); + } + event.appendBanks( + writer.fillHBHitsBank(event, fhits), + writer.fillHBClustersBank(event, clusters), + writer.fillHBSegmentsBank(event, segments)); + return true; + } + // update B field + CrossListFinder crossLister = new CrossListFinder(); + for(Cross cr : crosses) { + crossLister.updateBFittedHits(event, cr, null, Constants.getInstance().dcDetector, null, dcSwim); + } + //find the list of track candidates + TrackCandListFinder trkcandFinder = new TrackCandListFinder(Constants.HITBASE); + trkcands = trkcandFinder.getTrackCandsAI(crosslist, + Constants.getInstance().dcDetector, + dcSwim, hbTSEstimator); + + // track found + int trkId = 1; + if (trkcands.size() > 0) { + // remove overlaps + trkcandFinder.removeOverlappingTracks(trkcands); + for (Track trk : trkcands) { + trk.setIsAITrack(true); + + for (Cross c : trk) { + clusters.add(c.get_Segment1().get_fittedCluster()); + clusters.add(c.get_Segment2().get_fittedCluster()); + } + + // reset the id + trk.set_Id(trkId); + trkcandFinder.matchHits(trk.getStateVecs(), + trk, + Constants.getInstance().dcDetector, + dcSwim); + trkId++; + } + } + + ////// Find tracks by rest of clusters using conventional tracking + List clustersConv = null; + List segmentsConv = null; + List crossesConv = null; + List trkcandsConv = null; + + //1) read hits from the banks + Map> hitsConv = reader.read_Hits(event); + + //2) find clusters from these hits + ClusterFinder clusFinder = new ClusterFinder(); + ClusterFitter cf = new ClusterFitter(); + clustersConv = clusFinder.RecomposeClusters(hitsConv, Constants.getInstance().dcDetector, cf); + + //3) remove clusters which are on tracks + List removedClustersConv = new ArrayList(); + for(FittedCluster cls : clustersConv){ + boolean flag = false; + for(Track trk : trkcands){ + if(flag) break; + for(Cross crs : trk){ + if(cls.get_Id() == crs.get_Segment1().get_Id() || cls.get_Id() == crs.get_Segment2().get_Id()) { + removedClustersConv.add(cls); + flag = true; + break; + } + } + } + } + clustersConv.removeAll(removedClustersConv); + clusters.addAll(clustersConv); + + //4) find segments from clusters + SegmentFinder segFinder = new SegmentFinder(); + segmentsConv = segFinder.get_Segments(clustersConv, + event, + Constants.getInstance().dcDetector, false); + List rmSegsConv = new ArrayList<>(); + // clean up hit-based segments + double trkDocOverCellSize; + for (Segment se : segmentsConv) { + trkDocOverCellSize = 0; + for (FittedHit fh : se.get_fittedCluster()) { + trkDocOverCellSize += fh.get_ClusFitDoca() / fh.get_CellSize(); + } + if (trkDocOverCellSize / se.size() > 1.1) { + rmSegsConv.add(se); + } + } + segmentsConv.removeAll(rmSegsConv); + segments.addAll(segmentsConv); + + //5) find crosses from segments + CrossMaker crossMake = new CrossMaker(); + crossesConv = crossMake.find_Crosses(segmentsConv, Constants.getInstance().dcDetector); + crosses.addAll(crossesConv); + + //6) find cross lists from crosses + CrossList crosslistConv = crossLister.candCrossLists(event, crossesConv, + false, + null, + Constants.getInstance().dcDetector, + null, + dcSwim, false); + + //7) find track candidates with 5 or 6 clusters + // track candidates with 6 clusters + trkcandsConv = trkcandFinder.getTrackCandsAI(crosslistConv, + Constants.getInstance().dcDetector, + dcSwim, hbTSEstimator); + + // track candidates with 5 clusters + RoadFinder rf = new RoadFinder(); + List allRoadsConv = rf.findRoads(segmentsConv, Constants.getInstance().dcDetector); + List Segs2RoadConv = new ArrayList<>(); + List psegmentsConv = new ArrayList<>(); + for (Road r : allRoadsConv) { + Segs2RoadConv.clear(); + int missingSL = -1; + for (int ri = 0; ri < 3; ri++) { + if (r.get(ri).associatedCrossId == -1) { + if (r.get(ri).get_Superlayer() % 2 == 1) { + missingSL = r.get(ri).get_Superlayer() + 1; + } else { + missingSL = r.get(ri).get_Superlayer() - 1; + } + } + } + if(missingSL==-1) + continue; + for (int ri = 0; ri < 3; ri++) { + for (Segment s : segmentsConv) { + if (s.get_Sector() == r.get(ri).get_Sector() && + s.get_Region() == r.get(ri).get_Region() && + s.associatedCrossId == r.get(ri).associatedCrossId && + r.get(ri).associatedCrossId != -1) { + if (s.get_Superlayer() % 2 == missingSL % 2){ + Segs2RoadConv.add(s); + break; + } + } + } + } + if (Segs2RoadConv.size() == 2) { + Segment pSegmentConv = rf.findRoadMissingSegment(Segs2RoadConv, + Constants.getInstance().dcDetector, + r.a); + if (pSegmentConv != null) + psegmentsConv.add(pSegmentConv); + } + } + + segmentsConv.addAll(psegmentsConv); + List pcrossesConv = crossMake.find_Crosses(segmentsConv, Constants.getInstance().dcDetector); + List fullPseudoCrossesConv = new ArrayList(); // Cross by two pseudo segments + for(Cross crs : pcrossesConv){ + if(crs.get_Segment1().get_Id() == -1 && crs.get_Segment2().get_Id() == -1) fullPseudoCrossesConv.add(crs); + } + pcrossesConv.removeAll(fullPseudoCrossesConv); + CrossList pcrosslistConv = crossLister.candCrossLists(event, pcrossesConv, + false, + null, + Constants.getInstance().dcDetector, + null, + dcSwim, true); + List mistrkcandsConv = trkcandFinder.getTrackCandsAI(pcrosslistConv, + Constants.getInstance().dcDetector, + dcSwim, hbTSEstimator); + + //8) Select overlapping tracks from all track candidates with 5 or 6 clusters, and update hits in tracks + trkcandsConv.addAll(mistrkcandsConv); + if (!trkcandsConv.isEmpty()) { + // remove overlaps + trkcandFinder.removeOverlappingTracks(trkcandsConv); + for (Track trk : trkcandsConv) { + // reset the id + trk.set_Id(trkId); + trkcandFinder.matchHits(trk.getStateVecs(), + trk, + Constants.getInstance().dcDetector, + dcSwim); + trkId++; + } + } + + //////gather all the hits for pointer bank creation + trkcands.addAll(trkcandsConv); + trkId=1; + for (Track trk : trkcands) { + trk.calcTrajectory(trk.getId(), dcSwim, trk.get_Vtx0(), trk.get_pAtOrig(), trk.get_Q()); + for (Cross c : trk) { + c.set_CrossDirIntersSegWires(); + trkcandFinder.setHitDoubletsInfo(c.get_Segment1()); + trkcandFinder.setHitDoubletsInfo(c.get_Segment2()); + for (FittedHit h1 : c.get_Segment1()) { + h1.set_AssociatedHBTrackID(trkId); + //if(h1.get_AssociatedHBTrackID()>0) + fhits.add(h1); + } + for (FittedHit h2 : c.get_Segment2()) { + h2.set_AssociatedHBTrackID(trkId); + //if(h2.get_AssociatedHBTrackID()>0) + fhits.add(h2); + } + } + trkId++; + } + + // no candidate found, stop here and save the hits, + // the clusters, the segments, the crosses + if (trkcands.isEmpty()) { + event.appendBanks( + writer.fillHBHitsBank(event, fhits), + writer.fillHBClustersBank(event, clusters), + writer.fillHBSegmentsBank(event, segments), + writer.fillHBCrossesBank(event, crosses)); + } + else { + event.appendBanks( + writer.fillHBHitsBank(event, fhits), + writer.fillHBClustersBank(event, clusters), + writer.fillHBSegmentsBank(event, segments), + writer.fillHBCrossesBank(event, crosses), + writer.fillHBTracksBank(event, trkcands), + writer.fillHBHitsTrkIdBank(event, fhits), + writer.fillHBTrajectoryBank(event, trkcands)); + } + return true; + } + +} From 38079f707562bb4e5ef348c56dd38c45d34ef54b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 16 Jan 2026 18:04:58 -0500 Subject: [PATCH 037/190] adjust run-clara memory calculation (#1070) --- bin/run-clara | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/bin/run-clara b/bin/run-clara index fff8e9cb28..23368264cf 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -52,14 +52,9 @@ shift $((OPTIND-1)) inputs=$@ # Configure JVM memory settings (overridedable via $JAVA_OPTS): -if [ -z ${large+x} ] -then - gb_max=$((threads<3?threads+2:threads+2-threads/4)) - gb_init=$((threads<3?threads:threads-threads/3)) -else - gb_max=$((threads<3?threads+2:threads+2-threads/8)) - gb_init=$((threads<3?threads:threads-threads/6)) -fi +gb_init=$((threads)) +gb_max=$((threads+2)) +[ $threads -gt 1 ] && ! [ -z ${large+x} ] && gb_max=$((threads*2)) java_opts="-Xms${gb_init}g -Xmx${gb_max}g" # Check configuration: From 8988c393053324b37ef8402bbaeb8a43d60b852a Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Tue, 20 Jan 2026 13:06:34 -0500 Subject: [PATCH 038/190] feat(ci): trigger `orca` (#1071) --- .github/workflows/orca.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/orca.yml diff --git a/.github/workflows/orca.yml b/.github/workflows/orca.yml new file mode 100644 index 0000000000..515d1afcdb --- /dev/null +++ b/.github/workflows/orca.yml @@ -0,0 +1,28 @@ +name: orca + +on: + pull_request: + push: + branches: [ development ] + tags: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + orca: + # do not run on forks or dependabot PRs + if: | + github.event_name == 'push' || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name == github.repository && + github.actor != 'dependabot[bot]') + uses: JeffersonLab/acro/.github/workflows/orca.yml@main + with: + ref_var: REF_COATJAVA # controls which git ref variable gets set to the triggering ref + pipeline_timeout: 3600 # maximum time to allow the pipeline to run (seconds) + secrets: + orca_project_id: ${{ secrets.ORCA_PROJECT_ID }} + orca_project_token: ${{ secrets.ORCA_PROJECT_TOKEN }} + orca_trigger_token: ${{ secrets.ORCA_TRIGGER_TOKEN }} From 2e24914b119270417cecdcaa4fae129ff76f6b08 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 20 Jan 2026 19:00:00 -0500 Subject: [PATCH 039/190] feat: beautify scaling plot (#1072) * improve scaling script * separate plotting from clara * restore uber option * bugfix, try harder to find run-clara * cleanup image * adjust run-clara memory calculation * beautify scaling plot * fix label --- libexec/scaling | 106 ++++++---------------------- libexec/scaling.gpl | 166 ++++++++++++++++++++++++++++++++------------ libexec/taskset | 2 + 3 files changed, 148 insertions(+), 126 deletions(-) create mode 100755 libexec/taskset diff --git a/libexec/scaling b/libexec/scaling index a2fd8a072d..41c2a06a43 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -3,20 +3,14 @@ def cli(): import os,sys,argparse cli = argparse.ArgumentParser(description='CLARA scaling test') - cli.add_argument('-P',help='plot only',action="iframe.php?url=https%3A%2F%2Fgithub.com%2Fstore_true") - cli.add_argument('-y',help='YAML file',default=None) + cli.add_argument('-y',help='YAML file',required=True) cli.add_argument('-c',help='CLARA_HOME path',default=os.getenv('CLARA_HOME',None)) cli.add_argument('-t',help='threads (default=4,8)',default='4,8') cli.add_argument('-e',help='events per thread',default=100,type=int) - cli.add_argument('-i',help='input data file',default=None) + cli.add_argument('-i',help='input data file',required=True) cfg = cli.parse_args() cfg.t = cfg.t.split(',') - if cfg.P: - cfg.i = 'scaling.txt' - else: - if cfg.y is None: sys.exit('-y YAML is required w/o -P') - if cfg.c is None: sys.exit('-c or $CLARA_HOME is required w/o -P') - if cfg.i is None: sys.exit('-i is required') + if cfg.c is None: sys.exit('-c or $CLARA_HOME is required.') return cfg def run(cmd): @@ -31,21 +25,26 @@ def run(cmd): if p.returncode != 0: pass -def benchmark(cfg, threads): - import sys,shutil,collections - if not shutil.which('run-clara'): - sys.exit('run-clara is not in $PATH') +def benchmark(cfg, threads, log): + import os,sys,shutil,collections + run_clara = shutil.which('run-clara') + if not run_clara: + run_clara = cfg.c + '/plugins/clas12/bin/run-clara' + if not os.path.exists(run_clara): + sys.exit('run-clara is not in $PATH') exiting,benchmarks = False,collections.OrderedDict() - cmd = ['run-clara', + cmd = [run_clara, '-c',cfg.c, '-n',str(cfg.e*int(threads)), '-t',str(threads), + '-l', '-y',cfg.y, '-o',f'tmp-scaling-{threads}', cfg.i] for line in run(cmd): cols = line.split() print(line) + log.write(line+'\n') try: if line.find('Benchmark results:') >= 0: exiting = True @@ -75,14 +74,14 @@ def table(benchmarks): table = [] header = [ 'Threads' ] b = benchmarks[0][1] - header.extend([x for x in b if x != 'Services']) + header.extend([x for x in b if x != 'Services' and x != 'Event']) if 'Services' in b: header.extend(b['Services'].keys()) table.append(header) for b in benchmarks: threads,benchmark = b[0],b[1] row = [threads] - for k in ['Event','Avg','Total','Orch','Services']: + for k in ['Avg','Total','Orch','Services']: if k in benchmark: if k == 'Services': row.extend(benchmark[k].values()) @@ -100,73 +99,14 @@ def save(benchmarks): for row in table(benchmarks): f.write(' '.join([str(x) for x in row])+'\n') -gnuplot=''' -set terminal qt size 1000,700 - -set multiplot layout 2,2 -set datafile columnheaders -set title font 'sans,14' -set key box -set xlabel 'Threads' -set ylabel 'Event Time [ms]' -set yrange [0:] - -set title 'I/O' -set key outside right width 2 -plot 'scaling.txt' \ - using 1:(($2*$1)) pt 7 with points title columnhead(2) ,\ - '' using 1:((column($#))) pt 7 with points title 'Total' ,\ - '' using 1:($6) pt 7 with points title 'Reader' ,\ - '' using 1:((column($#-1))) pt 7 with points title 'Writer' ,\ - '' using 1:(($6*$1)) pt 7 with points title 'IOver' ,\ - -set title 'Engines' - -# data-ai-uber.yml: -#plot 'scaling.txt' \ -# using 1:($7) pt 7 with points title columnhead(7) ,\ -# '' using 1:($8) pt 7 with points title columnhead(8) ,\ -# '' using 1:($9) pt 7 with points title columnhead(9) ,\ -# '' using 1:($10) pt 7 with points title columnhead(10) ,\ -# '' using 1:($11) pt 7 with points title columnhead(11) ,\ -# '' using 1:($12) pt 7 with points title columnhead(12) ,\ - -# rgd-clarode.yml: -plot 'scaling.txt' \ - using 1:($7) pt 7 with points title columnhead(7) ,\ - '' using 1:($14) pt 7 with points title columnhead(14) ,\ - '' using 1:($15) pt 7 with points title columnhead(15) ,\ - '' using 1:($16) pt 7 with points title columnhead(16) ,\ - '' using 1:($26) pt 9 with points title columnhead(26) ,\ - '' using 1:($19) pt 7 with points title columnhead(19) ,\ - '' using 1:($28) pt 9 with points title columnhead(28) ,\ - '' using 1:($33) pt 9 with points title columnhead(33) ,\ - -set title 'Throughput' -set ylabel 'Rate [Hz]' -set size 0.7,0.5 -set origin 0.12,0 -unset key -f(x) = m*x -fit [0:24] f(x) 'scaling.txt' using 1:(1/$2*1e3) via m -plot 'scaling.txt' using 1:(1/$2*1e3) pt 7, f(x) -''' - -def plot(): - import tempfile - with tempfile.NamedTemporaryFile(mode='w') as f: - f.write(gnuplot) - f.flush() - list(run(['gnuplot','-p',f.name])) - input() - if __name__ == '__main__': cfg = cli() - if not cfg.P: - benchmarks = [] - for threads in cfg.t: - benchmarks.append([threads, benchmark(cfg, threads)]) - show(benchmarks) - save(benchmarks) - plot() + import os + benchmarks = [] + for threads in cfg.t: + os.makedirs('tmp-scaling-'+threads) + with open(f'tmp-scaling-{threads}/run-clara.log','w') as log: + benchmarks.append([threads, benchmark(cfg, threads, log)]) + show(benchmarks) + save(benchmarks) diff --git a/libexec/scaling.gpl b/libexec/scaling.gpl index c858a734ce..1589761971 100644 --- a/libexec/scaling.gpl +++ b/libexec/scaling.gpl @@ -1,51 +1,131 @@ +set terminal svg size 1000,700 enhanced font 'Verdana, 14' +set palette maxcolors 8 +set palette defined ( \ + 0 '#A6CEE3',\ + 1 '#1F78B4',\ + 2 '#B2DF8A',\ + 3 '#33A02C',\ + 4 '#FB9A99',\ + 5 '#E31A1C',\ + 6 '#FDBF6F',\ + 7 '#FF7F00' ) +set style line 1 pt 7 lt 1 lc rgb '#A6CEE3' # light blue +set style line 2 pt 7 lt 1 lc rgb '#1F78B4' # dark blue +set style line 3 pt 7 lt 1 lc rgb '#B2DF8A' # light green +set style line 4 pt 7 lt 1 lc rgb '#33A02C' # dark green +set style line 5 pt 7 lt 1 lc rgb '#FB9A99' # light red +set style line 6 pt 7 lt 1 lc rgb '#E31A1C' # dark red +set style line 7 pt 7 lt 1 lc rgb '#FDBF6F' # light orange +set style line 8 pt 7 lt 1 lc rgb '#FF7F00' # dark orange +set style line 11 pt 11 lt 1 lc rgb '#A6CEE3' # light blue +set style line 12 pt 11 lt 1 lc rgb '#1F78B4' # dark blue +set style line 13 pt 11 lt 1 lc rgb '#B2DF8A' # light green +set style line 14 pt 11 lt 1 lc rgb '#33A02C' # dark green +set style line 15 pt 11 lt 1 lc rgb '#FB9A99' # light red +set style line 16 pt 11 lt 1 lc rgb '#E31A1C' # dark red +set style line 17 pt 11 lt 1 lc rgb '#FDBF6F' # light orange +set style line 18 pt 11 lt 1 lc rgb '#FF7F00' # dark orange +set style line 21 pt 8 lt 1 lc rgb '#A6CEE3' # light blue +set style line 22 pt 8 lt 1 lc rgb '#1F78B4' # dark blue +set style line 23 pt 8 lt 1 lc rgb '#B2DF8A' # light green +set style line 24 pt 8 lt 1 lc rgb '#33A02C' # dark green +set style line 25 pt 8 lt 1 lc rgb '#FB9A99' # light red +set style line 26 pt 8 lt 1 lc rgb '#E31A1C' # dark red +set style line 27 pt 8 lt 1 lc rgb '#FDBF6F' # light orange +set style line 28 pt 8 lt 1 lc rgb '#FF7F00' # dark orange +set style line 31 pt 6 lt 1 lc rgb '#A6CEE3' # light blue +set style line 32 pt 6 lt 1 lc rgb '#1F78B4' # dark blue +set style line 33 pt 6 lt 1 lc rgb '#B2DF8A' # light green +set style line 34 pt 6 lt 1 lc rgb '#33A02C' # dark green +set style line 35 pt 6 lt 1 lc rgb '#FB9A99' # light red +set style line 36 pt 6 lt 1 lc rgb '#E31A1C' # dark red +set style line 37 pt 6 lt 1 lc rgb '#FDBF6F' # light orange +set style line 38 pt 6 lt 1 lc rgb '#FF7F00' # dark orange -set terminal svg size 1000,700 +# parse command line arguments: +datafile = 'scaling.txt' +if (ARGC > 0) { + if (ARGV[1] eq "-u") { + uberMode = 1 + if (ARGC > 1) { + datafile = ARGV[ARGC] + } + } else { + datafile = ARGV[ARGC] + } +} set multiplot layout 2,2 set datafile columnheaders -set title font 'sans,14' -set key box -set xlabel 'Threads' -set ylabel 'Event Time [ms]' set yrange [0:] -set title 'I/O' -set key outside right width 2 -plot 'scaling.txt' \ - using 1:(($2*$1)) pt 7 with points title columnhead(2) ,\ - '' using 1:((column($#))) pt 7 with points title 'Total' ,\ - '' using 1:($6) pt 7 with points title 'Reader' ,\ - '' using 1:((column($#-1))) pt 7 with points title 'Writer' ,\ - '' using 1:(($6*$1)) pt 7 with points title 'IOver' ,\ - -set title 'Engines' - -# data-ai-uber.yml: -#plot 'scaling.txt' \ -# using 1:($7) pt 7 with points title columnhead(7) ,\ -# '' using 1:($8) pt 7 with points title columnhead(8) ,\ -# '' using 1:($9) pt 7 with points title columnhead(9) ,\ -# '' using 1:($10) pt 7 with points title columnhead(10) ,\ -# '' using 1:($11) pt 7 with points title columnhead(11) ,\ -# '' using 1:($12) pt 7 with points title columnhead(12) ,\ - -# rgd-clarode.yml: -plot 'scaling.txt' \ - using 1:($7) pt 7 with points title columnhead(7) ,\ - '' using 1:($14) pt 7 with points title columnhead(14) ,\ - '' using 1:($15) pt 7 with points title columnhead(15) ,\ - '' using 1:($16) pt 7 with points title columnhead(16) ,\ - '' using 1:($26) pt 9 with points title columnhead(26) ,\ - '' using 1:($19) pt 7 with points title columnhead(19) ,\ - '' using 1:($28) pt 9 with points title columnhead(28) ,\ - '' using 1:($33) pt 9 with points title columnhead(33) ,\ - -set title 'Throughput' -set ylabel 'Rate [Hz]' -set size 0.7,0.5 -set origin 0.12,0 -unset key +set xlabel 'Threads' +set ylabel 'Event Rate [Hz]' +set size 0.4,0.45 +set origin 0.0,0.55 +set key nobox inside top left f(x) = m*x -fit [0:24] f(x) 'scaling.txt' using 1:(1/$2*1e3) via m -plot 'scaling.txt' using 1:(1/$2*1e3) pt 7, f(x) +m = 2 + +fit [0:24] f(x) datafile using 1:(1/$2*1e3) via m +rate = sprintf('%.1f Hz/CPU',m) +plot datafile using 1:(1/$2*1e3) pt 7 notitle, f(x) title rate + +set xlabel 'Threads' +set ylabel 'Event Time [ms]' +set key nobox outside top center horizontal +set size 0.4,0.55 +set origin 0.0,0.0 + +plot datafile \ + using 1:((column($#))) pt 7 with points title 'Total' ,\ + '' using 1:(($5*$1)) pt 7 with points title 'N-Readers' ,\ + '' using 1:($5) pt 9 with points title 'Reader' ,\ + '' using 1:((column($#-1))) pt 11 with points title 'Writer' ,\ + +#set logscale y +set size 0.6,1.0 +set origin 0.4,0.0 +set key outside right vertical + +if (exists("uberMode")) { + plot datafile \ + using 1:($6) pt 7 with points title columnhead(6) ,\ + '' using 1:($7) pt 7 with points title columnhead(7) ,\ + '' using 1:($8) pt 7 with points title columnhead(8) ,\ + '' using 1:($9) pt 7 with points title columnhead(9) ,\ + '' using 1:($10) pt 7 with points title columnhead(10) ,\ + '' using 1:($11) pt 7 with points title columnhead(11) ,\ + '' using 1:($12) pt 7 with points title columnhead(12) ,\ +} else { + plot datafile \ + using 1:($6) ls 1 with points title columnhead(6) ,\ + '' using 1:($7) ls 2 with points title columnhead(7) ,\ + '' using 1:($8) ls 3 with points title columnhead(8) ,\ + '' using 1:($9) ls 4 with points title columnhead(9) ,\ + '' using 1:($10) ls 5 with points title columnhead(10) ,\ + '' using 1:($11) ls 6 with points title columnhead(11) ,\ + '' using 1:($12) ls 7 with points title columnhead(12) ,\ + '' using 1:($13) ls 8 with points title columnhead(13) ,\ + '' using 1:($14) ls 11 with points title columnhead(14) ,\ + '' using 1:($15) ls 12 with points title columnhead(15) ,\ + '' using 1:($16) ls 13 with points title columnhead(16) ,\ + '' using 1:($17) ls 14 with points title columnhead(17) ,\ + '' using 1:($18) ls 15 with points title columnhead(18) ,\ + '' using 1:($19) ls 16 with points title columnhead(19) ,\ + '' using 1:($20) ls 17 with points title columnhead(20) ,\ + '' using 1:($21) ls 18 with points title columnhead(21) ,\ + '' using 1:($22) ls 21 with points title columnhead(22) ,\ + '' using 1:($23) ls 22 with points title columnhead(23) ,\ + '' using 1:($24) ls 23 with points title columnhead(24) ,\ + '' using 1:($25) ls 24 with points title columnhead(25) ,\ + '' using 1:($26) ls 25 with points title columnhead(26) ,\ + '' using 1:($27) ls 26 with points title columnhead(27) ,\ + '' using 1:($28) ls 27 with points title columnhead(28) ,\ + '' using 1:($29) ls 28 with points title columnhead(29) ,\ + '' using 1:($30) ls 31 with points title columnhead(30) ,\ + '' using 1:($31) ls 32 with points title columnhead(31) ,\ + '' using 1:($32) ls 33 with points title columnhead(32) ,\ + '' using 1:($33) ls 34 with points title columnhead(33) ,\ +} diff --git a/libexec/taskset b/libexec/taskset new file mode 100755 index 0000000000..e93ce6931d --- /dev/null +++ b/libexec/taskset @@ -0,0 +1,2 @@ +#!/bin/bash +echo $(numactl -H | grep "^node $1 cpus:" | awk '{for(i=4;i<=NF;++i)print$i}') | sed 's/ /,/g' From f9027cfe0cd1b7f59cf1689b29dcfbcee2541fd7 Mon Sep 17 00:00:00 2001 From: N-Plx <66355299+N-Plx@users.noreply.github.com> Date: Wed, 21 Jan 2026 11:08:35 -0600 Subject: [PATCH 040/190] Updating how time offsets are applied, dealing with different start times (#1074) --- .../java/org/jlab/rec/atof/hit/ATOFHit.java | 35 +++++----------- .../java/org/jlab/rec/atof/hit/BarHit.java | 40 +++++++++++-------- .../java/org/jlab/rec/atof/hit/HitFinder.java | 3 +- .../org/jlab/service/alert/ALERTEngine.java | 7 +--- .../org/jlab/service/atof/ATOFEngine.java | 5 +-- 5 files changed, 38 insertions(+), 52 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java index 95a4d52584..81f1d6dc17 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java @@ -21,12 +21,11 @@ public class ATOFHit { private int sector, layer, component, order; private int tdc, tot; - private float startTime; + private Float startTime; private double time, energy, x, y, z; private String type; private boolean isInACluster; private int associatedClusterIndex; - private double meanTimeAligned; int idTDC; @@ -82,13 +81,9 @@ public double getTime() { return time; } - public double getStartTime() { + public Float getStartTime() { return this.startTime; } - - public double getMeanTimeAligned(){ - return this.meanTimeAligned; - } public void setTime(double time) { this.time = time; @@ -195,27 +190,18 @@ public final String makeType() { * unsupported. */ public final int convertTdcToTime() { - //Converting tdc to ns, event start time correction - this.time = Parameters.TDC2TIME*this.tdc - this.startTime; + this.time = Parameters.TDC2TIME*this.tdc; + //If the startTime has been defined, remove it + if(this.startTime!= null) this.time -= this.startTime; //TODO: When table structure evolves, pay attention to order. //Key for the current channel int key = this.sector*10000 + this.layer*1000 + this.component*10 + 0;//this.order; - //Key for the reference channel over which all the others sharing the same z are aligned - int referenceModuleKey = this.component*10; //Time offsets double[] timeOffsets = CalibrationConstantsLoader.ATOF_TIME_OFFSETS.get(key); - double[] timeOffsetsRef = CalibrationConstantsLoader.ATOF_TIME_OFFSETS.get(referenceModuleKey); - this.meanTimeAligned = timeOffsetsRef[0]; - //The names below correspond to the CCDB entries - //They will most probably evolve - //For now let's say t0 is used to store the bar-to-bar and wedge-to-wedge alignments double t0 = timeOffsets[0]; - double tChannelToChannelPhiAlignment = (t0 - this.meanTimeAligned); - if(this.type=="bar up" || this.type=="bar down") //bar alignment is done with the sum of the two times - tChannelToChannelPhiAlignment=tChannelToChannelPhiAlignment/2.; //tud is used to store the bar up - bar down alignment double tud = timeOffsets[1]; @@ -237,8 +223,6 @@ public final int convertTdcToTime() { double dtw3 = timeWalks[7]; double chi2ndf = timeWalks[8];*/ - //Veff corrections TO BE IMPLEMENTED - double veff, distance_to_sipm, timeOffset; if (null == this.type) { LOGGER.finest("Null hit type, cannot convert tdc to time."); @@ -249,19 +233,20 @@ public final int convertTdcToTime() { veff = Parameters.VEFF; //Wedge hits are placed at the center of wedges and sipm at their top distance_to_sipm = Parameters.WEDGE_THICKNESS / 2.; - timeOffset = - tChannelToChannelPhiAlignment; + timeOffset = - t0; } case "bar up" -> { veff = Parameters.VEFF; //The distance will be computed at barhit level when z information is available distance_to_sipm = 0; - timeOffset = - tud/2. - tChannelToChannelPhiAlignment; + //t0 for bars is the sum of up+down channels->need 1/2 + timeOffset = - tud/2. - t0/2; } case "bar down" -> { veff = Parameters.VEFF; //The distance will be computed at barhit level when z information is available distance_to_sipm = 0; - timeOffset = + tud/2. - tChannelToChannelPhiAlignment; + timeOffset = + tud/2. - t0/2; } case "bar" -> { LOGGER.finest("Bar hit type, cannot convert tdc to time."); @@ -418,7 +403,7 @@ public double getPhi() { * @param atof Detector object representing the atof, used to calculate * spatial coordinates. */ - public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot, float startTime, Detector atof) { + public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot, Float startTime, Detector atof) { this.sector = sector; this.layer = layer; this.component = component; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java index 39bc582078..eba7640c4b 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java @@ -1,5 +1,7 @@ package org.jlab.rec.atof.hit; +import org.jlab.io.base.DataEvent; +import org.jlab.io.hipo.HipoDataSource; import org.jlab.rec.atof.constants.Parameters; import org.jlab.rec.alert.constants.CalibrationConstantsLoader; @@ -30,15 +32,19 @@ public ATOFHit getHitUp() { * */ public boolean isInTime() { + //Undefined start time is when useStartTime option is false in the yaml + //for example for usage with simulations + //-> we keep all the hits + if(this.hitUp.getStartTime() == null) return true; double timeShift = 0; + //TO DO: make this more robust //For FT electron for which the startTime is set at -1000 //We need to shift where the cut is applied + //2180 = 2*1090 = 1000+90 for FD start time around 90ns + //if the data start time is not around 90, this will be a problem if(this.hitUp.getStartTime()<0) timeShift = 2180; - if(Math.abs( - this.hitUp.getTime()+this.hitDown.getTime() - -timeShift - -this.hitUp.getMeanTimeAligned()) - <40) + if(Math.abs(this.hitUp.getTime()+this.hitDown.getTime() + -timeShift)<40) return true; return false; } @@ -70,17 +76,19 @@ public final void computeZ() { * */ public final void computeTime() { - //We pick the most energetic signal as the timing signal - double time_at_sipm, distance_to_sipm; - if(this.hitDown.getEnergy() > this.hitUp.getEnergy()) { - time_at_sipm = this.hitDown.getTime(); - distance_to_sipm = Parameters.LENGTH_ATOF/2. - this.getZ(); - } - else { - time_at_sipm = this.hitUp.getTime(); - distance_to_sipm = Parameters.LENGTH_ATOF/2. + this.getZ(); - } - this.setTime(time_at_sipm - distance_to_sipm/this.vEff); + //Select the most energetic hit as the timing reference + final boolean useDownstream = hitDown.getEnergy() > hitUp.getEnergy(); + final double sipmTime = useDownstream ? hitDown.getTime() : hitUp.getTime(); + //veff correction + //t0 has already been removed. + //distance to SiPM is L/2+-z, part of it is absorbed into the t0 as: + //t0 = 2*offset+L/veff + //t_hit = t_u/d - 2*offset/2 -/+ tud/2 - 1/veff(L/2 -/+ z) + //t_hit = t_u/d - (t0)/2 -/+ tud/2 +/- z/veff + //Only the z part remains + final double zDirection = useDownstream ? +this.getZ() : -this.getZ(); + final double correctedTime = sipmTime + zDirection / vEff; + this.setTime(correctedTime); } /** diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java index a4db3aa43e..1f7c04e901 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java @@ -5,7 +5,6 @@ import org.jlab.geom.base.Detector; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; -import org.jlab.rec.alert.constants.CalibrationConstantsLoader; /** * The {@code HitFinder} class finds hits in the atof. @@ -64,7 +63,7 @@ public void setWedgeHits(ArrayList wedge_hits) { * @param atof the {@link Detector} representing the atof geometry to match * the sector/layer/component to x/y/z. */ - public void findHits(DataEvent event, Detector atof, float startTime) { + public void findHits(DataEvent event, Detector atof, Float startTime) { //For each event a list of bar hits and a list of wedge hits are filled this.barHits.clear(); this.wedgeHits.clear(); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index a52bb33c25..b0c2a4992a 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -175,7 +175,7 @@ public boolean processDataEvent(DataEvent event) { int layer_pred = (int) pred[1]; int wedge_pred = (int) pred[2]; - ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0, ATOF); + ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0f, ATOF); double pred_x = hit_pred.getX(); double pred_y = hit_pred.getY(); double pred_z = hit_pred.getZ(); @@ -193,7 +193,7 @@ public boolean processDataEvent(DataEvent event) { int sector = bank.getInt("sector", k); int layer = bank.getInt("layer", k); - ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0, ATOF); + ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0f, ATOF); double dx = pred_x - hit.getX(); double dy = pred_y - hit.getY(); @@ -212,9 +212,6 @@ public boolean processDataEvent(DataEvent event) { } catch (Exception ex) { System.out.println("Exception in ALERTEngine processDataEvent: " + ex); // TODO: proper logging } - - - } return true; } diff --git a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java index 7f66d442ef..4b847ff069 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java @@ -60,7 +60,7 @@ public boolean processDataEvent(DataEvent event) { if (!event.hasBank("RUN::config")) { return true; } - float startTime = 0; + Float startTime = null; if(useStartTime) { //This assumes the FD reconstruction produced an event with good startTime @@ -101,14 +101,11 @@ public boolean processDataEvent(DataEvent event) { //projector.projectTracks(event); //rbc.appendMatchBanks(event, projector.getProjections()); - // Why do we have to "find" hits? //Hit finder init HitFinder hitfinder = new HitFinder(); hitfinder.findHits(event, ATOF, startTime); - ArrayList WedgeHits = hitfinder.getWedgeHits(); ArrayList BarHits = hitfinder.getBarHits(); - //Exit if hit lists are empty if (WedgeHits.isEmpty() && BarHits.isEmpty()) { // System.out.println("No hits : "); From 4a3f6481a47d698db99eab99924eb2f4b7b88212 Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Thu, 22 Jan 2026 18:59:54 +0100 Subject: [PATCH 041/190] Implement the electron vertex for AHDC (#1077) * implement electron vertex for ahdc * convert vz_constraint to mm * test alignement for clas and ahdc * restore alignement at 0 * fix alert engine for ai track and atof matching * fix alignement sign * do not apply vertex shift for simulation * add ahdc geometry verification in the test * make the error on the ahdc distance dependent on adc and time * correct the error formula * correct the chi2 calculation * fix chi2 computation * remove redundancy --- .../main/java/org/jlab/rec/ahdc/Hit/Hit.java | 34 ++++++++++++++- .../jlab/rec/ahdc/KalmanFilter/KFitter.java | 24 ++++++----- .../rec/ahdc/KalmanFilter/KalmanFilter.java | 41 +++++++++++++++---- .../org/jlab/service/alert/ALERTEngine.java | 7 ++-- 4 files changed, 83 insertions(+), 23 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java index 4a04862c2d..008e892104 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java @@ -179,7 +179,13 @@ public RealVector get_Vector() { } public RealMatrix get_MeasurementNoise() { - return new Array2DRowRealMatrix(new double[][]{{0.09}}); + double mean_error = 0.471; // mm (no difference between adc and time) + double error_on_adc = (1.15146*raw_adc + 437.63)/(3.21187*raw_adc + 878.855); // mm + double error_on_time = (0.4423*time + 13.7215)/(0.846038*time + 31.9867); // mm + double error = error_on_adc*error_on_time/mean_error; // mm + + return new Array2DRowRealMatrix(new double[][]{{Math.pow(error, 2)}}); // mm^2 + //return new Array2DRowRealMatrix(new double[][]{{0.09}}); } // a signature for KalmanFilter.Hit_beam @@ -206,6 +212,32 @@ public static void main(String[] args) { System.out.println("h1 compare to h2 : " + h1.compareTo(h2)); System.out.println("h2 compare to h1 : " + h2.compareTo(h1)); System.out.println("h1 compare to h3 : " + h1.compareTo(h3)); + + System.out.println("/////////////////////////"); + System.out.println("Test AHDC geometry"); + System.out.println(""); + System.out.println("s : sector"); + System.out.println("sl : super layer"); + System.out.println("l : layer"); + System.out.println("c : component"); + System.out.println("/////////////////////////"); + System.out.println("------------------------------------------------------------------------------"); + System.out.println(" | origin | end"); + System.out.println("------------------------------------------------------------------------------"); + System.out.println("s sl l c | x y z | x y z"); + System.out.println("------------------------------------------------------------------------------"); + for (int s = 1; s <= factory.getNumSectors(); s++) { + for (int sl = 1; sl <= factory.getSector(s).getNumSuperlayers(); sl++) { + for (int l = 1; l <= factory.getSector(s).getSuperlayer(sl).getNumLayers(); l++) { + for (int c = 1; c <= factory.getSector(s).getSuperlayer(sl).getLayer(l).getNumComponents(); c++) { + Line3D line = factory.getSector(s).getSuperlayer(sl).getLayer(l).getComponent(c).getLine(); + Point3D end = line.end(); + Point3D origin = line.origin(); + System.out.printf("%2d %2d %2d %2d | %7.3f %7.3f %7.3f | %7.3f %7.3f %7.3f\n", s, sl, l, c, origin.x(), origin.y(), origin.z(), end.x(), end.y(), end.z()); + } + } + } + } } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java index 3f19dc0305..7263d6638f 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java @@ -29,7 +29,7 @@ public class KFitter { // masses/energies in MeV private final double electron_mass_c2 = PhysicsConstants.massElectron() * 1000; private final double proton_mass_c2 = PhysicsConstants.massProton() * 1000; - private boolean isvertexdefined = false; + private double[] vertex_resolutions = {0.09,1e10}; // default values // dr^2 and dz^2 in mm^2 public KFitter(final RealVector initialStateEstimate, final RealMatrix initialErrorCovariance, final Stepper stepper, final Propagator propagator, final HashMap materialHashMap) { this.stateEstimation = initialStateEstimate; @@ -93,15 +93,14 @@ public void correct(Hit hit) { RealVector h; // check if the hit is the beamline if (hit.getRadius() < 1) { - double z_beam_res_sq = 1.e10;//in mm - if(isvertexdefined)z_beam_res_sq = 4.0;//assuming 2. mm resolution + // the diagonal elements are the squared errors in r, phi, z measurementNoise = - new Array2DRowRealMatrix( - new double[][]{ - {0.09, 0.0000, 0.0000}, - {0.00, 1e10, 0.0000}, - {0.00, 0.0000, z_beam_res_sq} - });//3x3 + new Array2DRowRealMatrix( + new double[][]{ + {vertex_resolutions[0], 0.0000, 0.0000}, + {0.00, 1e10, 0.0000}, + {0.00, 0.0000, vertex_resolutions[1]} + });//3x3 measurementMatrix = H_beam(stateEstimation);//6x3 h = h_beam(stateEstimation);//3x1 z = hit.get_Vector_beam();//0! @@ -274,7 +273,10 @@ public RealVector getStateEstimationVector() { public RealMatrix getErrorCovarianceMatrix() { return errorCovariance.copy(); } - - public void setVertexDefined(boolean isvtxdef) {isvertexdefined = isvtxdef;} + + public void setVertexResolution(double[] res) { + vertex_resolutions[0] = res[0]; + vertex_resolutions[1] = res[1]; + } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java index 805a736558..4d2840ee73 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java @@ -11,6 +11,7 @@ import org.jlab.clas.pdg.PDGDatabase; import org.jlab.clas.pdg.PDGParticle; import org.jlab.clas.tracking.kalmanfilter.Material; +import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.Track.Track; @@ -32,6 +33,9 @@ public class KalmanFilter { private final int Niter = 40; // number of iterations for the Kalman Filter private boolean IsVtxDefined = false; // implemented but not used yet + private double[] vertex_resolutions = {0.09, 1e10}; // {error in r squared in mm^2, error in z squared in mm^2} + // mm, CLAS and AHDC don't necessary have the same alignement (ZERO), this parameter may be subject to calibration + private double clas_alignement = -54; private void propagation(ArrayList tracks, DataEvent event, final double magfield, boolean IsMC) { @@ -44,6 +48,30 @@ private void propagation(ArrayList tracks, DataEvent event, final double final double tesla = 0.001; final double[] B = {0.0, 0.0, magfield / 10 * tesla}; HashMap materialHashMap = MaterialMap.generateMaterials(); + // Recover the vertex of the electron + if (event.hasBank("REC::Particle")) { + DataBank recBank = event.getBank("REC::Particle"); + int row = 0; + while ((!IsVtxDefined) && row < recBank.rows()) { + if (recBank.getInt("pid", row) == 11) { + IsVtxDefined = true; + vz_constraint = 10*recBank.getFloat("vz",row) - (IsMC ? 0 : clas_alignement); // mm + //////////////////////////////////////// + /// compute electron resolution here + /// it depends en p and theta + /// the fine tuning will be done later + /// //////////////////////////////////// + //double px = recBank.getFloat("px",row); + //double py = recBank.getFloat("py",row); + //double pz = recBank.getFloat("pz",row); + //double p = Math.sqrt(px*px+py*py+pz*pz); + //double theta = Math.acos(pz/p); + vertex_resolutions[0] = 0.09; + vertex_resolutions[1] = 64;//4 + 1e10*theta + 1e10*p; + } + row++; + } + } // Loop over tracks int trackId = 0; @@ -53,7 +81,7 @@ private void propagation(ArrayList tracks, DataEvent event, final double // Initialize state vector double x0 = 0.0; double y0 = 0.0; - double z0 = track.get_Z0(); + double z0 = IsVtxDefined ? vz_constraint : track.get_Z0(); double px0 = track.get_px(); double py0 = track.get_py(); double pz0 = track.get_pz(); @@ -62,9 +90,6 @@ private void propagation(ArrayList tracks, DataEvent event, final double // Read list of hits ArrayList AHDC_hits = track.getHits(); Collections.sort(AHDC_hits); // sorted following the compareTo() method in Hit.java - - double zbeam = 0; - if(IsVtxDefined)zbeam = vz_constraint; // Start propagation Stepper stepper = new Stepper(y); @@ -76,7 +101,7 @@ private void propagation(ArrayList tracks, DataEvent event, final double RealVector initialStateEstimate = new ArrayRealVector(stepper.y); RealMatrix initialErrorCovariance = MatrixUtils.createRealMatrix(new double[][]{{50.0, 0.0, 0.0, 0.0, 0.0, 0.0}, {0.0, 50.0, 0.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 900.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 100.00, 0.0, 0.0}, {0.0, 0.0, 0.0, 0.0, 100.00, 0.0}, {0.0, 0.0, 0.0, 0.0, 0.0, 900.0}}); KFitter TrackFitter = new KFitter(initialStateEstimate, initialErrorCovariance, stepper, propagator, materialHashMap); - TrackFitter.setVertexDefined(IsVtxDefined); + if (IsVtxDefined) TrackFitter.setVertexResolution(vertex_resolutions); // Loop over number of iterations for (int k = 0; k < Niter; k++) { @@ -94,7 +119,7 @@ private void propagation(ArrayList tracks, DataEvent event, final double } // Backward propagation (first layer to beamline) { - Hit hit = new Hit_beam(0, 0, zbeam); + Hit hit = new Hit_beam(0, 0, vz_constraint); TrackFitter.predict(hit, false); TrackFitter.correct(hit); } @@ -136,11 +161,11 @@ private void propagation(ArrayList tracks, DataEvent event, final double hit.setTrackId(trackId); sum_adc += hit.getADC(); sum_residuals += hit.getResidual(); - chi2 += Math.pow(hit.getResidual(),2.0); + chi2 += Math.pow(hit.getResidual(),2)/hit.get_MeasurementNoise().getEntry(0,0); } track.set_sum_adc(sum_adc); track.set_sum_residuals(sum_residuals); - track.set_chi2(chi2); + track.set_chi2(chi2/(AHDC_hits.size()-3)); track.set_p_drift_kf(p_drift); track.set_dEdx_kf(sum_adc/s); track.set_path_kf(s); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index b0c2a4992a..a5cdc2518e 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -187,11 +187,11 @@ public boolean processDataEvent(DataEvent event) { int matchHitId = -1; for (int k = 0; k < bank_ATOFHits.rows(); k++) { - int component = bank.getInt("component", k); + int component = bank_ATOFHits.getInt("component", k); if (component == 10) continue; - int sector = bank.getInt("sector", k); - int layer = bank.getInt("layer", k); + int sector = bank_ATOFHits.getInt("sector", k); + int layer = bank_ATOFHits.getInt("layer", k); ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0f, ATOF); @@ -213,6 +213,7 @@ public boolean processDataEvent(DataEvent event) { System.out.println("Exception in ALERTEngine processDataEvent: " + ex); // TODO: proper logging } } + rbc.appendTrackMatchingAIBank(event, matched_ATOF_hit_id); return true; } From 735ef42c69780d2b5f19660aff444d5f7d92885c Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Thu, 22 Jan 2026 20:00:54 -0500 Subject: [PATCH 042/190] fix: run-clara doesn't work on macos (#1080) fixes #1079 --- bin/run-clara | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/run-clara b/bin/run-clara index 23368264cf..798ffd6544 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -95,9 +95,10 @@ JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jlab.logging.SplitLogManag if $java_quiet; then JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.config.file=$CLAS12DIR/etc/logging/logging.properties" else - case ${java_log_level^^} in + java_log_level_upcase=$(echo $java_log_level | tr '[:lower:]' '[:upper:]') + case ${java_log_level_upcase} in SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST|ALL|OFF) - JAVA_OPTS="$JAVA_OPTS -D.level=${java_log_level^^}" + JAVA_OPTS="$JAVA_OPTS -D.level=${java_log_level_upcase}" ;; *) error "unknown Java log level '$java_log_level'" From 90028e8890f38d6b7a62261c4418ec33741af364 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 29 Jan 2026 11:17:02 -0500 Subject: [PATCH 043/190] build: bump version number to 13.5.3 (#1083) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwell/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 331 insertions(+), 331 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index e6769c8a71..ba09291e49 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 90be2afad1..9391cdd38e 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index ca0da2fae9..1626eb4413 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar cnuphys swimmer - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 1551d8ab36..396cab8e49 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-logging - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index cd4c89a2c8..d55d88619b 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index a963a8ba6d..e7bc993b8e 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 36c80154b5..2d62e97284 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 0a56fa717a..660cdda1b0 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 7726f161db..75c3a2c849 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 20fd5f462d..9831867578 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index d4912c2cdb..235bf5b6eb 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys swimmer - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 7e482c8c4c..cc6248b46f 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 9e6548aae6..23dffcd5ee 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index f43837e926..f11d33b823 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar cnuphys clas12 - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 26d11a876d..e7a9f5b965 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT pom org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 141ce7dd45..c2a62f9a52 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar cnuphys clas12 - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 2f68ec81b6..6da57ebcc3 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar cnuphys clas12 - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index c92cb8c1c1..1c64054c99 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar cnuphys clas12 - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys splot - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index cc2049946d..1c36dba665 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clara-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-logging - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-math - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-tracking - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-decay-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys snr - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 0d55c90c2c..fc54e828ad 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT pom org.jlab.clas coatjava - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index 5dcbbe367c..89e2f994ef 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas common-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys swimmer - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/pom.xml b/pom.xml index b1e3cc0a61..d9a02410e8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 2b4620a516..cd36f8534a 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index a3a2b309e4..5e082c7e28 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 0ee5c2080e..7aaaa4956c 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 7f48433e87..63075ed523 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 9a85a3e7d9..5d84511219 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 0e27fd4d32..b1f3c8a858 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index fda1e77912..9d7a84c16e 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 9c718f77f7..c4890659e0 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test org.jlab.clas clas-math - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys snr - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 997693190e..1b1ae164fb 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 5a9b3e198d..f52c7d11f9 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT test org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 8be60e0143..0be9a026e3 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index c645cb6177..981c1f4efd 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index ea3db100f0..778ddbb424 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index c96c92b8be..9f53f9def5 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index bd37b2920a..8eb44322a5 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 5cc396f2ea..332be90581 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 6d34bb29a2..ac020ed939 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT pom org.jlab.clas coatjava - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index cfd5eef9ca..2252c2edd9 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-analysis - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index 7fa4754333..a3f8506192 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index fb745bfe8e..f70786cd4f 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index d4ae0d1d86..1636c061a7 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 9ebcf3e323..78bdd16ece 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT cnuphys magfield - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-tracking - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 3bfdaf221b..a283672276 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 5cf8886ca1..53469201fc 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-physics - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-utils - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 4b1b8a38b9..9f2c49a0c5 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/urwell/pom.xml b/reconstruction/urwell/pom.xml index e0c2c0ce6f..be05321802 100644 --- a/reconstruction/urwell/pom.xml +++ b/reconstruction/urwell/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwell - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index 1ed48aaf21..4f0b0a490a 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas swim-tools - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT jar cnuphys swimmer - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-reco - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-io - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT org.jlab.clas clas-geometry - 13.5.2-SNAPSHOT + 13.5.3-SNAPSHOT From d81d84ae8c13be6b1044d3cfb6b7b83d88df75f4 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 30 Jan 2026 18:45:16 -0500 Subject: [PATCH 044/190] fix RAW::tdc.TDC column index (#1084) * bufix, RAW::tdc has order * same problem in RAW::adc --- .../main/java/org/jlab/detector/decode/CLASDecoder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java index 380a7169f3..0ee5a319a6 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -319,9 +319,9 @@ public Bank getDataBankUndecodedADC(String name, DetectorType type){ adcBANK.putByte( 0, i, (byte) adcDGTZ.get(i).getDescriptor().getCrate()); adcBANK.putByte( 1, i, (byte) adcDGTZ.get(i).getDescriptor().getSlot()); adcBANK.putShort(2, i, (short) adcDGTZ.get(i).getDescriptor().getChannel()); - adcBANK.putInt( 3, i, adcDGTZ.get(i).getADCData(0).getADC()); - adcBANK.putFloat(4, i, (float) adcDGTZ.get(i).getADCData(0).getTime()); - adcBANK.putShort(5, i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); + adcBANK.putInt( 4, i, adcDGTZ.get(i).getADCData(0).getADC()); + adcBANK.putFloat(5, i, (float) adcDGTZ.get(i).getADCData(0).getTime()); + adcBANK.putShort(6, i, (short) adcDGTZ.get(i).getADCData(0).getPedestal()); } return adcBANK; } @@ -337,7 +337,7 @@ public Bank getDataBankUndecodedTDC(String name, DetectorType type){ tdcBANK.putByte( 0, i, (byte) tdcDGTZ.get(i).getDescriptor().getCrate()); tdcBANK.putByte( 1, i, (byte) tdcDGTZ.get(i).getDescriptor().getSlot()); tdcBANK.putShort(2, i, (short) tdcDGTZ.get(i).getDescriptor().getChannel()); - tdcBANK.putInt( 3, i, tdcDGTZ.get(i).getTDCData(0).getTime()); + tdcBANK.putInt( 4, i, tdcDGTZ.get(i).getTDCData(0).getTime()); } return tdcBANK; } From 1b46533de64e4041c17fedd6682b0e79073bfce4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:15:01 -0500 Subject: [PATCH 045/190] build(deps): bump org.apache.maven.plugins:maven-compiler-plugin (#1086) Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.14.1 to 3.15.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.14.1...maven-compiler-plugin-3.15.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-version: 3.15.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d9a02410e8..f74c155e85 100644 --- a/pom.xml +++ b/pom.xml @@ -283,7 +283,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.1 + 3.15.0 21 UTF-8 From c4e9bc01f8c77beb7c461c8edc7f15b3653840ff Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Tue, 3 Feb 2026 21:30:10 +0100 Subject: [PATCH 046/190] update ahdc geometry (#1089) --- .../detector/alert/AHDC/AlertDCFactory.java | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java index 7b9bd1ad90..3cc32878cd 100644 --- a/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java +++ b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java @@ -85,15 +85,16 @@ public AlertDCLayer createLayer(ConstantProvider cp, int sectorId, int superlaye double numWires; double R_layer = 32.0d; double DR_layer = 4.0d; + double thster; // stereo angle in deg, will be convert to radian later - double zoff1 = -150.0d; - double zoff2 = 150.0d; - Point3D p1 = new Point3D(R_layer, 0, zoff1); + double z_origin = -188.0d; + double z_end = +162.5d; + Point3D p1 = new Point3D(R_layer, 0, z_origin); Vector3D n1 = new Vector3D(0, 0, 1); Plane3D lPlane = new Plane3D(p1, n1); - Point3D p2 = new Point3D(R_layer, 0, zoff2); + Point3D p2 = new Point3D(R_layer, 0, z_end); Vector3D n2 = new Vector3D(0, 0, 1); Plane3D rPlane = new Plane3D(p2, n2); @@ -105,18 +106,23 @@ public AlertDCLayer createLayer(ConstantProvider cp, int sectorId, int superlaye if (superlayerId == 0) { numWires = 47.0d; //47 R_layer = 32.0d; + thster = -19.1489d; } else if (superlayerId == 1) { numWires = 56.0d; //56 R_layer = 38.0d; + thster = -19.2857d; } else if (superlayerId == 2) { numWires = 72.0d; //72 R_layer = 48.0d; + thster = -20.0d; } else if (superlayerId == 3) { numWires = 87.0d; R_layer = 58.0d; + thster = -20.6897d; } else { numWires = 99.0d; R_layer = 68.0d; + thster = -20.0d; } // Calculate the radius for the layers of sense wires @@ -124,19 +130,20 @@ public AlertDCLayer createLayer(ConstantProvider cp, int sectorId, int superlaye double alphaW_layer = Math.toRadians(round / (numWires)); - // shift the wire end point +-20deg in XY plan - double thster = Math.toRadians(-20.0d); - double zl = 300.0d; + // shift the wire end point by almost +-20deg in XY plan + // convert stereo angle from degrees to radians + thster = Math.toRadians(thster); + // Create AHDC sense wires for (int wireId = 0; wireId < numWires; wireId++) { - // start at phi=0 - // in each layer the first wire is the first at phi>=0, i.e. - // 0.5 0 0.5 0 0.5 0.5 0 0.5 for layer 1 to 8 - double wirePhiIndex = wireId + 0.5*(numWires%2) + 0.5*layerId*(1-2*(numWires%2)); + // start at phi=0 + // in each layer the first wire is the first at phi>=0, i.e. + // 0.5 0 0.5 0 0.5 0.5 0 0.5 for layer 1 to 8 + double wirePhiIndex = wireId + 0.5*(numWires%2) + 0.5*layerId*(1-2*(numWires%2)); - // The point given by (wx, wy, wz) is the origin of the current wire. + // The point given by (wx, wy, wz) is the origin of the current wire. double wx = R_layer * Math.cos(alphaW_layer * wirePhiIndex); double wy = R_layer * Math.sin(alphaW_layer * wirePhiIndex); @@ -144,7 +151,7 @@ public AlertDCLayer createLayer(ConstantProvider cp, int sectorId, int superlaye // planes by construciting a long line that passes through the midpoint double wx_end = R_layer * Math.cos(alphaW_layer * wirePhiIndex + thster * (Math.pow(-1, superlayerId))); double wy_end = R_layer * Math.sin(alphaW_layer * wirePhiIndex + thster * (Math.pow(-1, superlayerId))); - Line3D line = new Line3D(wx, wy, -zl/2, wx_end, wy_end, zl/2); + Line3D line = new Line3D(wx, wy, z_origin, wx_end, wy_end, z_end); Point3D lPoint = new Point3D(); Point3D rPoint = new Point3D(); @@ -185,19 +192,19 @@ public AlertDCLayer createLayer(ConstantProvider cp, int sectorId, int superlaye List firstF = new ArrayList<>(); List secondF = new ArrayList<>(); // first Face - Point3D p_0 = new Point3D(px_0, py_0, -zl/2); - Point3D p_1 = new Point3D(px_1, py_1, -zl/2); - Point3D p_2 = new Point3D(px_2, py_2, -zl/2); - Point3D p_3 = new Point3D(px_3, py_3, -zl/2); - Point3D p_4 = new Point3D(px_4, py_4, -zl/2); - Point3D p_5 = new Point3D(px_5, py_5, -zl/2); + Point3D p_0 = new Point3D(px_0, py_0, z_origin); + Point3D p_1 = new Point3D(px_1, py_1, z_origin); + Point3D p_2 = new Point3D(px_2, py_2, z_origin); + Point3D p_3 = new Point3D(px_3, py_3, z_origin); + Point3D p_4 = new Point3D(px_4, py_4, z_origin); + Point3D p_5 = new Point3D(px_5, py_5, z_origin); // second Face - Point3D p_6 = new Point3D(px_6, py_6, zl/2); - Point3D p_7 = new Point3D(px_7, py_7, zl/2); - Point3D p_8 = new Point3D(px_8, py_8, zl/2); - Point3D p_9 = new Point3D(px_9, py_9, zl/2); - Point3D p_10 = new Point3D(px_10, py_10, zl/2); - Point3D p_11 = new Point3D(px_11, py_11, zl/2); + Point3D p_6 = new Point3D(px_6, py_6, z_end); + Point3D p_7 = new Point3D(px_7, py_7, z_end); + Point3D p_8 = new Point3D(px_8, py_8, z_end); + Point3D p_9 = new Point3D(px_9, py_9, z_end); + Point3D p_10 = new Point3D(px_10, py_10, z_end); + Point3D p_11 = new Point3D(px_11, py_11, z_end); // defining a cell around a wireLine, must be counter-clockwise! firstF.add(p_0); firstF.add(p_5); From 3f87e385e6b4b5fbc60e5e5b214ca5f90f0136a6 Mon Sep 17 00:00:00 2001 From: Tongtong Cao Date: Tue, 3 Feb 2026 18:12:14 -0500 Subject: [PATCH 047/190] add a yaml file to apply new DC engines for new AI models (#1091) --- etc/services/data-ai-2026.yaml | 87 ++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 etc/services/data-ai-2026.yaml diff --git a/etc/services/data-ai-2026.yaml b/etc/services/data-ai-2026.yaml new file mode 100644 index 0000000000..2b1bf55a40 --- /dev/null +++ b/etc/services/data-ai-2026.yaml @@ -0,0 +1,87 @@ +io-services: + reader: + class: org.jlab.io.clara.HipoToHipoReader + name: HipoToHipoReader + writer: + class: org.jlab.io.clara.HipoToHipoWriter + name: HipoToHipoWriter +services: + - class: org.jlab.clas.swimtools.MagFieldsEngine + name: MAGFIELDS + - class: org.jlab.rec.ft.cal.FTCALEngine + name: FTCAL + - class: org.jlab.rec.ft.hodo.FTHODOEngine + name: FTHODO + - class: org.jlab.rec.ft.trk.FTTRKEngine + name: FTTRK + - class: org.jlab.rec.ft.FTEBEngine + name: FTEB + - class: org.jlab.service.raster.RasterEngine + name: RASTER +# DC denoising + - class: org.jlab.service.ai.DCDenoiseEngine + name: DCDN +# DC clustering: nominal algoritm, filled the cluster bank for ai and conventional tracking + - class: org.jlab.service.dc.DCHBClustering + name: DCCR +# This is where the AI plugin would go. THe AI code reads the HB clusters. + - class: org.jlab.service.ai.DCClsComboEngine + name: DCCC +# DC using clustering on AI hits: NN assisted HB tracking + - class: org.jlab.service.dc.DCHBTrackingAI + name: DCHTAI + - class: org.jlab.service.ftof.FTOFHBEngine + name: FTOFHB + - class: org.jlab.service.ec.ECEngine + name: EC + - class: org.jlab.rec.cvt.services.CVTEngine + name: CVTFP + - class: org.jlab.service.ctof.CTOFEngine + name: CTOF + - class: org.jlab.service.cnd.CNDCalibrationEngine + name: CND + - class: org.jlab.service.band.BANDEngine + name: BAND + - class: org.jlab.service.htcc.HTCCReconstructionService + name: HTCC + - class: org.jlab.service.ltcc.LTCCEngine + name: LTCC + - class: org.jlab.service.eb.EBHBEngine + name: EBHB + - class: org.jlab.service.dc.DCTBEngine + name: DCTB + - class: org.jlab.service.fmt.FMTEngine + name: FMT + - class: org.jlab.rec.cvt.services.CVTSecondPassEngine + name: CVTSP + - class: org.jlab.service.ftof.FTOFTBEngine + name: FTOFTB + - class: org.jlab.service.eb.EBTBEngine + name: EBTB + - class: org.jlab.rec.rich.RICHEBEngine + name: RICH + - class: org.jlab.service.rtpc.RTPCEngine + name: RTPC + - class: org.jlab.rec.service.vtx.VTXEngine + name: VTX + - class: org.jlab.calibration.service.CalibBanksEngine + name: CALIB +configuration: + global: + variation: rgb_spring2019 +# timestamp: 12/31/2020-00:00:00 +## uncomment the following two lines for compatibility with alignments before the DC fixes +# dcMinistagger: "NOTONREFWIRE" +# dcFeedthroughs: "OFF" + io-services: + writer: + schema_dir: dst + services: + MAGFIELDS: + magfieldSolenoidMap: Symm_solenoid_r601_phi1_z1201_13June2018.dat + magfieldTorusMap: Full_torus_r251_phi181_z251_25Jan2021.dat + DCHTAI: + outputBankPrefix: "HB" + +mime-types: + - binary/data-hipo From 33a1ba70b690dc83f719e3d8516266592798f12a Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 4 Feb 2026 17:00:08 -0500 Subject: [PATCH 048/190] build: bump version number to 13.6.0 (#1092) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwell/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 331 insertions(+), 331 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index ba09291e49..518ba74fa8 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 9391cdd38e..9fa50903d7 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 1626eb4413..4905aae57a 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar cnuphys swimmer - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 396cab8e49..4dd9ae43ad 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-logging - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index d55d88619b..3054579699 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index e7bc993b8e..ae16a50a80 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 2d62e97284..9c8781f805 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 660cdda1b0..d28d4b5ea8 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 75c3a2c849..d8d24f8ad7 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 9831867578..380fcdf677 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 235bf5b6eb..e3f480a7f7 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys swimmer - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index cc6248b46f..7f8058382e 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 23dffcd5ee..5cfba500f8 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index f11d33b823..bbd72f1cb8 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar cnuphys clas12 - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index e7a9f5b965..31b79f659a 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT pom org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index c2a62f9a52..dbcb9f6855 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar cnuphys clas12 - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 6da57ebcc3..26260d3f96 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar cnuphys clas12 - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 1c64054c99..5154cf3e77 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar cnuphys clas12 - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys splot - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 1c36dba665..7ca06c9261 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clara-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-logging - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-math - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-tracking - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-decay-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys snr - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index fc54e828ad..79ef4ba95c 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT pom org.jlab.clas coatjava - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index 89e2f994ef..cfcf003ea7 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas common-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys swimmer - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/pom.xml b/pom.xml index f74c155e85..33e3d0dfe2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index cd36f8534a..459e98bd5f 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 5e082c7e28..5321d83885 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 7aaaa4956c..69d58032d5 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 63075ed523..6bf57553ed 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 5d84511219..354a71aafa 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index b1f3c8a858..23afd9471c 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 9d7a84c16e..b5d823706a 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index c4890659e0..d5fb20a40d 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test org.jlab.clas clas-math - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys snr - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 1b1ae164fb..fe59a67b71 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index f52c7d11f9..ef9f5a74e1 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT test org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 0be9a026e3..37879bffd8 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 981c1f4efd..8b45585f48 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 778ddbb424..88da655d1c 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 9f53f9def5..9e7e005f55 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index 8eb44322a5..cf2c5ef50d 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 332be90581..2a6f1a3bde 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index ac020ed939..2e22821013 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT pom org.jlab.clas coatjava - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 2252c2edd9..e271b83750 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-analysis - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index a3f8506192..942902b427 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index f70786cd4f..d727eebc9c 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index 1636c061a7..de429aaf1e 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 78bdd16ece..c1cac41e0a 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT cnuphys magfield - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-tracking - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index a283672276..b68cec7045 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 53469201fc..351efd92ef 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-physics - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-utils - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 9f2c49a0c5..4a058946ca 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/urwell/pom.xml b/reconstruction/urwell/pom.xml index be05321802..492d409652 100644 --- a/reconstruction/urwell/pom.xml +++ b/reconstruction/urwell/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwell - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index 4f0b0a490a..a75c9fc9f1 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas swim-tools - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT jar cnuphys swimmer - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-reco - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-io - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT org.jlab.clas clas-geometry - 13.5.3-SNAPSHOT + 13.6.0-SNAPSHOT From 24e2dba6a97d38ac0bb0e3e7c0ab08e9cd1a7362 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Thu, 5 Feb 2026 15:55:42 -0500 Subject: [PATCH 049/190] feat: Incorporate HipoDiffBank functionality into HipoDiff (#1093) * [Draft] Adds: hipo diff writer from banks in 2 hipo files * switch to return values * add writer * extract and use a diff bank method * rename SortedBank to DiffBank * remove string-based bank access * cleanup * close the writer * actually write the diff event * refactor!: rm `bin/hipo-diffBanks` and `HipoDiffBanks.java` --------- Co-authored-by: sbhawani Co-authored-by: Nathan Baltzell Co-authored-by: Nathan Baltzell --- .../main/java/org/jlab/utils/HipoDiff.java | 89 ++++++++++++++++--- 1 file changed, 75 insertions(+), 14 deletions(-) diff --git a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java index 52f82c4e2e..8a06d076bd 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java +++ b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java @@ -7,6 +7,7 @@ import org.jlab.jnp.hipo4.data.Event; import org.jlab.jnp.hipo4.data.Schema; import org.jlab.jnp.hipo4.data.SchemaFactory; +import org.jlab.jnp.hipo4.io.HipoWriter; import org.jlab.utils.options.OptionParser; public class HipoDiff { @@ -14,8 +15,8 @@ public class HipoDiff { /** * Bank sortable by any integer columns. */ - static class SortedBank extends Bank { - SortedBank(Schema s) { super(s); } + static class DiffBank extends Bank { + DiffBank(Schema s) { super(s); } /** * @param index the bank column indices to sort on * @return the sorted row indices @@ -42,6 +43,43 @@ int[] getSorted(int... index) { } return rows; } + /** + * @param b the bank to compare with + * @return the resulting diff bank + */ + public Bank getDiff(Bank b) { + Bank diff = new Bank(getSchema()); + int rows = Math.min(getRows(), b.getRows()); + int ncols = getSchema().getElements(); + for (int row = 0; row < rows; row++) { + for (int col = 0; col < ncols; col++) { + switch (getSchema().getType(col)) { + case 1: // byte + diff.putByte(col, row, (byte)(b.getByte(col,row) - getByte(col,row))); + break; + case 2: // short + diff.putShort(col, row, (short)(b.getShort(col,row) - getShort(col,row))); + break; + case 3: // int + diff.putInt(col, row, b.getInt(col,row) - getInt(col,row)); + break; + case 4: // float + diff.putFloat(col, row, b.getFloat(col,row) - getFloat(col,row)); + break; + case 5: // double + diff.putDouble(col, row, b.getDouble(col,row) - getDouble(col,row)); + break; + case 6: // long + diff.putLong(col, row, b.getLong(col,row) - getLong(col,row)); + break; + default: + // unhandled type (arrays, etc.) + break; + } + } + } + return diff; + } } static int nrow = 0; @@ -57,9 +95,11 @@ int[] getSorted(int... index) { static boolean verboseMode; static boolean quietMode; static Bank runConfigBank; + static HipoWriter writer; + static Event event; - static ArrayList banksA = new ArrayList<>(); - static ArrayList banksB = new ArrayList<>(); + static ArrayList banksA = new ArrayList<>(); + static ArrayList banksB = new ArrayList<>(); static HashMap> badEntries = new HashMap<>(); public static void main(String args[]) { @@ -70,6 +110,7 @@ public static void main(String args[]) { op.addOption("-Q", null, "verbose mode"); op.addOption("-b", null, "name of bank to diff"); op.addOption("-s", null, "sort on column index"); + op.addOption("-o", null, "output HIPO diff file"); op.setRequiresInputList(true); op.parse(args); if (op.getInputList().size() != 2) { @@ -96,18 +137,27 @@ public static void main(String args[]) { if (op.getOption("-b").stringValue() == null) { for (Schema s : sf.getSchemaList()) { - banksA.add(new SortedBank(s)); - banksB.add(new SortedBank(s)); + banksA.add(new DiffBank(s)); + banksB.add(new DiffBank(s)); } } else { - banksA.add(new SortedBank(sf.getSchema(op.getOption("-b").stringValue()))); - banksB.add(new SortedBank(sf.getSchema(op.getOption("-b").stringValue()))); + banksA.add(new DiffBank(sf.getSchema(op.getOption("-b").stringValue()))); + banksB.add(new DiffBank(sf.getSchema(op.getOption("-b").stringValue()))); + } + + if (op.getOption("-o").stringValue() != null) { + writer = new HipoWriter(); + writer.getSchemaFactory().copy(readerA.getSchemaFactory()); + writer.open(op.getOption("-o").stringValue()); } compare(readerA, readerB); + + if (writer != null) writer.close(); } - public static void compare(HipoReader a, HipoReader b) { + public static int compare(HipoReader a, HipoReader b) { + int ret=0; Event eventA = new Event(); Event eventB = new Event(); while (a.hasNext() && b.hasNext() && (nmax < 1 || nevent < nmax)) { @@ -115,7 +165,7 @@ public static void compare(HipoReader a, HipoReader b) { a.nextEvent(eventA); b.nextEvent(eventB); eventA.read(runConfigBank); - compare(eventA, eventB); + ret += compare(eventA, eventB); } System.out.println("\n Analyzed " + nevent + " with " + nbadevent + " bad banks"); System.out.println(nbadrow + "/" + nrow + " mismatched rows"); @@ -124,17 +174,26 @@ public static void compare(HipoReader a, HipoReader b) { System.out.println(name + " " + badEntries.get(name)); } System.exit(nbadevent + nbadrow + nbadentry); + return ret; } - public static void compare(Event a, Event b) { + public static int compare(Event a, Event b) { + int ret = 0; for (int i = 0; i < banksA.size(); i++) { a.read(banksA.get(i)); b.read(banksB.get(i)); - compare(banksA.get(i), banksB.get(i)); + if (writer != null) { + event.reset(); + event.write(banksA.get(i).getDiff(banksB.get(i))); + writer.addEvent(event); + } + ret += compare(banksA.get(i), banksB.get(i)); } + return ret; } - public static void compare(SortedBank a, SortedBank b) { + public static int compare(DiffBank a, DiffBank b) { + int ret=0; if (a.getRows() != b.getRows()) { System.out.println("========================= Different number of rows:"); runConfigBank.show(); @@ -142,7 +201,7 @@ public static void compare(SortedBank a, SortedBank b) { b.show(); nbadevent++; System.out.println("========================="); - return; + return ++ret; } int[] rowsA = sortIndex == null ? null : a.getSorted(sortIndex); int[] rowsB = sortIndex == null ? null : b.getSorted(sortIndex); @@ -207,11 +266,13 @@ public static void compare(SortedBank a, SortedBank b) { m.put(elementName, 0); } m.put(elementName, m.get(elementName) + 1); + ret++; } } if (mismatch) { nbadrow++; } } + return 0; } } From 6ab288d3a2efe1425450a7b5034877f600d10701 Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Fri, 6 Feb 2026 10:07:36 -0500 Subject: [PATCH 050/190] integrate urwell geometry (#1095) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * new MUVT and URWT geometry * propating changes through common tools, reconstruction, and schemas * some refactoring * some refactoring * some refactoring * code cleanup and simplification --------- Co-authored-by: Mariangela Bondí --- CODEOWNERS | 2 +- .../eventmerger/EventMergerConstants.java | 2 +- .../org/jlab/detector/base/DetectorType.java | 2 +- .../geant4/v2/MPGD/MUVT/MUVTConstants.java | 32 + .../v2/MPGD/MUVT/MUVTGeant4Factory.java | 60 ++ .../geant4/v2/MPGD/MUVT/MUVTStripFactory.java | 101 +++ .../geant4/v2/MPGD/URWT/URWTConstants.java | 32 + .../v2/MPGD/URWT/URWTGeant4Factory.java | 88 +++ .../geant4/v2/MPGD/URWT/URWTStripFactory.java | 103 +++ .../trapezoid/MPGDTrapezoidConstants.java | 224 ++++++ .../trapezoid/MPGDTrapezoidGeant4Factory.java | 343 +++++++++ .../trapezoid/MPGDTrapezoidStripFactory.java | 673 ++++++++++++++++++ .../geant4/v2/URWELL/URWellConstants.java | 132 ---- .../geant4/v2/URWELL/URWellGeant4Factory.java | 428 ----------- .../geant4/v2/URWELL/URWellStripFactory.java | 456 ------------ .../org/jlab/clas/reco/EngineProcessor.java | 4 +- etc/bankdefs/hipo4/data.json | 4 +- etc/bankdefs/hipo4/urwell.json | 24 +- reconstruction/pom.xml | 2 +- reconstruction/{urwell => urwt}/pom.xml | 6 +- .../org/jlab/service/urwt/URWRStrip.java} | 42 +- .../org/jlab/service/urwt/URWTCluster.java} | 40 +- .../org/jlab/service/urwt/URWTConstants.java} | 4 +- .../org/jlab/service/urwt/URWTCross.java} | 26 +- .../org/jlab/service/urwt/URWTEngine.java} | 68 +- 25 files changed, 1769 insertions(+), 1129 deletions(-) create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTConstants.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTGeant4Factory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java delete mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellConstants.java delete mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellGeant4Factory.java delete mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellStripFactory.java rename reconstruction/{urwell => urwt}/pom.xml (93%) rename reconstruction/{urwell/src/main/java/org/jlab/service/urwell/URWellStrip.java => urwt/src/main/java/org/jlab/service/urwt/URWRStrip.java} (79%) rename reconstruction/{urwell/src/main/java/org/jlab/service/urwell/URWellCluster.java => urwt/src/main/java/org/jlab/service/urwt/URWTCluster.java} (83%) rename reconstruction/{urwell/src/main/java/org/jlab/service/urwell/URWellConstants.java => urwt/src/main/java/org/jlab/service/urwt/URWTConstants.java} (93%) rename reconstruction/{urwell/src/main/java/org/jlab/service/urwell/URWellCross.java => urwt/src/main/java/org/jlab/service/urwt/URWTCross.java} (72%) rename reconstruction/{urwell/src/main/java/org/jlab/service/urwell/URWellEngine.java => urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java} (80%) diff --git a/CODEOWNERS b/CODEOWNERS index 0469d696f7..ea7190a46e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -88,7 +88,7 @@ reconstruction/rtpc/ @mathieuouillon @Hattawy reconstruction/swaps/ @baltzell @raffaelladevita reconstruction/tof/ @zieglerv @raffaelladevita reconstruction/uber/ @baltzell @raffaelladevita -reconstruction/urwell/ @raffaelladevita @tongtongcao +reconstruction/urwt/ @raffaelladevita @tongtongcao reconstruction/vtx/ @zieglerv # etc diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMergerConstants.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMergerConstants.java index f32d5a9de6..e0311bf64f 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMergerConstants.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMergerConstants.java @@ -36,7 +36,7 @@ public class EventMergerConstants { public static final String[] TDCBANKTYPES = {"tot","tdc"}; public static final String[] ADCDETECTORS = {"BAND","BMT", "BST","CND","CTOF","ECAL","FMT","FTCAL", - "FTHODO","FTOF","FTTRK","HTCC","LTCC","URWELL"}; + "FTHODO","FTOF","FTTRK","HTCC","LTCC","URWT"}; public static final String[] TDCDETECTORS = {"BAND","CND","CTOF","DC","ECAL","FTOF"}; diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java index ff90cc4a11..388fa0619a 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java @@ -30,7 +30,7 @@ public enum DetectorType { HEL (20, "HEL"), BAND (21, "BAND"), RASTER (22, "RASTER"), - URWELL (23, "URWELL"), + URWT (23, "URWT"), AHDC (24, "AHDC"), ATOF (25, "ATOF"), RECOIL (26, "RECOIL"), diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTConstants.java new file mode 100644 index 0000000000..17fe3eed46 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTConstants.java @@ -0,0 +1,32 @@ +package org.jlab.detector.geant4.v2.MPGD.MUVT; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidConstants; + +/** + * MUVT-specific constants. + */ +public final class MUVTConstants extends MPGDTrapezoidConstants { + + private MUVTConstants() { + super( + "/test/muvt/", // CCDB base path + "muvt_global", // global table name + "muvt_material", // material table name + "muvt" // detector nams + ); + } + + public MUVTConstants(int run, String variation) { + this(); + DatabaseConstantProvider cp = new DatabaseConstantProvider(run, variation); + this.load(cp); + cp.disconnect(); + } + + public MUVTConstants(DatabaseConstantProvider cp) { + this(); + this.load(cp); + } + +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTGeant4Factory.java new file mode 100644 index 0000000000..7753288cd8 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTGeant4Factory.java @@ -0,0 +1,60 @@ +package org.jlab.detector.geant4.v2.MPGD.MUVT; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidGeant4Factory; + +/** + * Geant4 factory for the muCLAS Forward Vertex Tracker (muVT). + * + * This class specializes the generic + * {@link MPGDTrapezoidGeant4Factory} by: + * - passing the MUVT-specific constants + * - using "MUVT" as detector name in volume names + * + * All the geometry construction (sectors, regions, material stack) + * is implemented in the base class. + */ +public final class MUVTGeant4Factory extends MPGDTrapezoidGeant4Factory { + + private final String variation; + + + public MUVTGeant4Factory(DatabaseConstantProvider cp, String variation) { + super(new MUVTConstants(cp)); + this.variation = variation; + } + + public MUVTGeant4Factory(int run, String variation) { + super(new MUVTConstants(run, variation)); + this.variation = variation; + } + + + public static void main(String[] args) { + + int run = 11; + String variation = "default"; + + if (args.length > 0) { + try { + run = Integer.parseInt(args[0]); + } catch (NumberFormatException e) { + System.err.println("Invalid run number \"" + args[0] + "\", using default 11."); + } + } + if (args.length > 1) { + variation = args[1]; + } + + MUVTGeant4Factory factory = new MUVTGeant4Factory(run, variation); + + System.out.println("MUVT geometry for run " + run + " (variation=\"" + variation + "\")"); + System.out.println("Total volumes: " + factory.getAllVolumes().size()); + + factory.getAllVolumes().forEach(volume -> { + System.out.println(volume.gemcString()); + }); + } +} + + diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java new file mode 100644 index 0000000000..59bc9230eb --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java @@ -0,0 +1,101 @@ +package org.jlab.detector.geant4.v2.MPGD.MUVT; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidStripFactory; +import org.jlab.detector.volume.Geant4Basic; + +import java.util.HashMap; +import java.util.Map; + +/** + * MUVT strip factory. + * + * It relies entirely on AbstractMPGDTrapezoidStripFactory for: + * - strip building (component IDs, endpoints) + * - surfaces + * - planes + * + * The ONLY detector-specific thing here is the mapping "volume name -> Geant4Basic", + * used by the abstract class to find the sensitive volume (Sensitivity==1) and its transform. + */ +public final class MUVTStripFactory extends MPGDTrapezoidStripFactory { + + private final Map volumeByName = new HashMap<>(); + + /** + * Build using an already-configured DatabaseConstantProvider. + */ + public MUVTStripFactory(DatabaseConstantProvider cp, String variation) { + super(new MUVTConstants(cp)); + + + for (Geant4Basic v : geo.getAllVolumes()) { + if (v.getName() != null) { + volumeByName.put(v.getName(), v); + } + } + + buildAll(); + } + + + /** + * Convenience constructor: internally creates a DatabaseConstantProvider. + * @param run + * @param variation + */ + public MUVTStripFactory(int run, String variation) { + super(new MUVTConstants(run, variation)); + + for (Geant4Basic v : geo.getAllVolumes()) { + if (v.getName() != null) { + volumeByName.put(v.getName(), v); + } + } + + buildAll(); + } + + @Override + protected Geant4Basic getVolumeByName(String name) { + return volumeByName.get(name); + } + + + @Override + protected boolean is2DReadout() { + // change to true if your MUVT readout is truly 2D + return true; + } + + /** + * Small test / debug. + */ + public static void main(String[] args) { + + int run = 11; + String variation = "default"; + + if (args.length > 0) { + try { run = Integer.parseInt(args[0]); } catch (Exception ignored) {} + } + if (args.length > 1) variation = args[1]; + + MUVTStripFactory sf = new MUVTStripFactory(run, variation); + + int sector = 2; + int layer = 12; + + System.out.println("MUVT strips: sector=" + sector + " layer=" + layer + + " nComponents=" + sf.getNComponents(sector, layer)); + + // print first strip global/local/tilted + int comp = 10; + System.out.println("Global strip(1): " + sf.getStrip(sector, layer, comp)); + System.out.println("Local strip(1): " + sf.getStripLocal(sector, layer, comp)); + System.out.println("Tilted strip(1): " + sf.getStripTilted(sector, layer, comp)); + + System.out.println("Plane: " + sf.getPlane(sector, layer)); + System.out.println("Surface: " + sf.getSurface(sector, layer)); + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java new file mode 100644 index 0000000000..b8a271b257 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java @@ -0,0 +1,32 @@ +package org.jlab.detector.geant4.v2.MPGD.URWT; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidConstants; + +/** + * URWT-specific constants. + */ +public final class URWTConstants extends MPGDTrapezoidConstants { + + private URWTConstants() { + super( + "/test/urwt/", // CCDB base path + "urwt_global", // global table name + "urwt_material", // material table name + "urwt" // detector nams + ); + } + + public URWTConstants(int run, String variation) { + this(); + DatabaseConstantProvider cp = new DatabaseConstantProvider(run, variation); + this.load(cp); + cp.disconnect(); + } + + public URWTConstants(DatabaseConstantProvider cp) { + this(); + this.load(cp); + } + +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java new file mode 100644 index 0000000000..31a0a13d32 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java @@ -0,0 +1,88 @@ +package org.jlab.detector.geant4.v2.MPGD.URWT; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidGeant4Factory; + +/** + * Geant4 factory for the uRWell Tracker (URWT). + * + * This class specializes the generic {@link MPGDTrapezoidGeant4Factory} + * by: - passing the URWT-specific constants - using "uRWT" as detector name in + * volume names + * + * All the geometry construction (sectors, regions, material stack) is + * implemented in the base class. + */ +public final class URWTGeant4Factory extends MPGDTrapezoidGeant4Factory { + + private final String variation; + + public URWTGeant4Factory(DatabaseConstantProvider cp, String variation) { + super(new URWTConstants(cp)); + this.variation = variation; + } + + public URWTGeant4Factory(int run, String variation) { + super(new URWTConstants(run, variation)); + this.variation = variation; + } + + /** + * + * @param region + * @return + */ + @Override + public SectorDimensions getSectorActiveVolumeDimensions(int region) { + + if (variation != null && variation.toLowerCase().contains("proto")) { + + double halfThickness = this.getSectorThickness() / 2.0; + double tiltRad = Math.toRadians(C.THTILT); + + // da vertici (mm) + double halfLargeBase = 72.71785; + double halfSmallBase = 50.44350; + double halfHeight = 24.74554; + + return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, tiltRad); + } + + return super.getSectorActiveVolumeDimensions(region); + } + + /** + * Standalone test: builds the URWT geometry and prints all volumes in GEMC + * format. + * + * Usage: java org.jlab.detector.geant4.v2.URWT.URWTGeant4Factory [run] + * [variation] + * + * Defaults: run = 11 variation = "default" + */ + public static void main(String[] args) { + + int run = 11; + String variation = "default"; + + if (args.length > 0) { + try { + run = Integer.parseInt(args[0]); + } catch (NumberFormatException e) { + System.err.println("Invalid run number \"" + args[0] + "\", using default 11."); + } + } + if (args.length > 1) { + variation = args[1]; + } + + URWTGeant4Factory factory = new URWTGeant4Factory(run, variation); + + System.out.println("uRWT geometry for run " + run + " (variation=\"" + variation + "\")"); + System.out.println("Total volumes: " + factory.getAllVolumes().size()); + + factory.getAllVolumes().forEach(volume -> { + System.out.println(volume.gemcString()); + }); + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java new file mode 100644 index 0000000000..2c2a735388 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java @@ -0,0 +1,103 @@ +package org.jlab.detector.geant4.v2.MPGD.URWT; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidStripFactory; +import org.jlab.detector.volume.Geant4Basic; + +import java.util.HashMap; +import java.util.Map; + +/** + * URWT strip factory. + * + * It relies entirely on AbstractMPGDTrapezoidStripFactory for: + * - strip building (component IDs, endpoints) + * - surfaces + * - planes + * + * The ONLY detector-specific thing here is the mapping "volume name -> Geant4Basic", + * used by the abstract class to find the sensitive volume (Sensitivity==1) and its transform. + */ +public final class URWTStripFactory extends MPGDTrapezoidStripFactory { + + private final Map volumeByName = new HashMap<>(); + + /** + * Build using an already-configured DatabaseConstantProvider. + * @param cp + */ + public URWTStripFactory(DatabaseConstantProvider cp) { + super(new URWTConstants(cp)); + + for (Geant4Basic v : geo.getAllVolumes()) { + if (v.getName() != null) { + volumeByName.put(v.getName(), v); + } + } + + buildAll(); + } + + /** + * Convenience constructor: internally creates a DatabaseConstantProvider. + * @param run + * @param variation + */ + public URWTStripFactory(int run, String variation) { + super(new URWTConstants(run, variation)); + + for (Geant4Basic v : geo.getAllVolumes()) { + if (v.getName() != null) { + volumeByName.put(v.getName(), v); + } + } + + buildAll(); + } + + @Override + protected Geant4Basic getVolumeByName(String name) { + return volumeByName.get(name); + } + + /** + * If URWT uses 2D readout (same readout Z for both layers), enable this. + * Otherwise leave it false (default 1D: z = +/- zHalf). + */ + @Override + protected boolean is2DReadout() { + // change to true if your URWT readout is truly 2D + return false; + } + + /** + * Small test / debug. + */ + public static void main(String[] args) { + + int run = 11; + String variation = "urwt1"; + + if (args.length > 0) { + try { run = Integer.parseInt(args[0]); } catch (Exception ignored) {} + } + if (args.length > 1) variation = args[1]; + + URWTStripFactory sf = new URWTStripFactory(run, variation); + + int sector = 1; + int layer = 4; + + System.out.println("URWT strips: sector=" + sector + " layer=" + layer + + " nComponents=" + sf.getNComponents(sector, layer)); + + // print first strip global/local/tilted + int comp = 10; + System.out.println("Global strip(1): " + sf.getStrip(sector, layer, comp)); + System.out.println("Local strip(1): " + sf.getStripLocal(sector, layer, comp)); + System.out.println("Tilted strip(1): " + sf.getStripTilted(sector, layer, comp)); + + System.out.println("Plane: " + sf.getPlane(sector, layer)); + System.out.println("Surface: " + sf.getSurface(sector, layer)); + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java new file mode 100644 index 0000000000..2857345d8a --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java @@ -0,0 +1,224 @@ +package org.jlab.detector.geant4.v2.MPGD.trapezoid; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.logging.Logger; + +/** + * Generic constants for trapezoidal MPGD-like trackers loaded from CCDB. + * Concrete detectors (e.g. URWT) should extend this class and provide: - CCDB + * base path - global table name - material table name + */ +public class MPGDTrapezoidConstants { + + // ------------------------------------------------------------------------ + // Logging / verbosity + // ------------------------------------------------------------------------ + public static final Logger LOGGER + = Logger.getLogger(MPGDTrapezoidConstants.class.getName()); + + public static boolean VERBOSE = false; + + // ------------------------------------------------------------------------ + // CCDB configuration + // ------------------------------------------------------------------------ + /** + * Base CCDB path (e.g. "/test/urwt/"). + */ + protected final String ccdbPath; + + /** + * Name of the global geometry table (e.g. "urwt_global"). + */ + protected final String globalTableName; + + /** + * Name of the material table (e.g. "urwt_material_geo"). + */ + protected final String materialTableName; + + /** + * Short detector name used in volume names (e.g. "uRWT"). + */ + public final String detectorName; + + // ------------------------------------------------------------------------ + // Geometry parameters (from global table) + // ------------------------------------------------------------------------ + public int NSECTORS; // number of sectors + public int NLAYERS; // number of layers (readout planes) + public int NCOMPONENTS; // number of components (e.g. strips) per layer + + public double THOPEN; // opening angle between endplate planes (deg) + public double THTILT; // tilt angle (deg) + public double THMIN; // minimum polar angle (deg) + public double THMAX; // maximum polar angle (deg) + public double TGTDET; // distance from target to first plane (cm) + public double DZ; // spacing between regions (cm) + public double TWIDTH; // Trapezoid width: distance from a corner to the oblique (non-parallel) side (cm) + + public double PITCH; // strip pitch (mm) + public double WIDTH; // strip width (mm) + public double STEREOANGLE; // strip stereo angle (deg) + + // ------------------------------------------------------------------------ + // Geometry enlargement (used when building volumes) + // ------------------------------------------------------------------------ + public static final double XENLARGEMENT = 0.15; // cm + public static final double YENLARGEMENT = 0.15; // cm + public static final double ZENLARGEMENT = 0.02; // cm + + // ------------------------------------------------------------------------ + // Material description: (layer, component) -> parameters + // ------------------------------------------------------------------------ + /** + * Simple container for material parameters associated to (layer, + * component). thickness : material thickness (mm) sensitivity: flag or ID + * for sensitivity (as defined in CCDB) + */ + public static class LayerComponentInfo { + + public final double thickness; + public final int sensitivity; + + public LayerComponentInfo(double thickness, int sensitivity) { + this.thickness = thickness; + this.sensitivity = sensitivity; + } + } + + /** + * Material structure: outer key = layer index (from CCDB column "Layer") + * inner key = component index (from CCDB column "Component") value = + * material parameters (thickness, sensitivity) + */ + protected final Map> detectorStructure + = new LinkedHashMap<>(); + + /** + * @param ccdbPath base CCDB path (e.g. "/test/urwt/") + * @param globalTableName name of the global table (e.g. "urwt_global") + * @param materialTableName name of the material table (e.g. + * "urwt_material_geo") + */ + protected MPGDTrapezoidConstants(String ccdbPath, + String globalTableName, + String materialTableName, + String detectorName) { + this.ccdbPath = ccdbPath.endsWith("/") ? ccdbPath : ccdbPath + "/"; + this.globalTableName = globalTableName; + this.materialTableName = materialTableName; + this.detectorName = detectorName; + } + + /** + * Read-only access to the material structure. + * + * @return + */ + public Map> getDetectorStructure() { + return detectorStructure; + } + + // ------------------------------------------------------------------------ + // CCDB loading API + // ------------------------------------------------------------------------ + /** + * Loads the relevant CCDB tables into the given provider and fills this + * object's fields. + * + * @param cp + * @return + */ + public DatabaseConstantProvider load(DatabaseConstantProvider cp) { + cp.loadTable(ccdbPath + globalTableName); + cp.loadTable(ccdbPath + materialTableName); + getConstants(cp); + return cp; + } + + /** + * Reads the already-loaded CCDB tables from the provider and fills geometry + * and material parameters.This method assumes: - global table has at least + * one row - material table has at least one row + * + * @param cp + */ + public synchronized void getConstants(DatabaseConstantProvider cp) { + + // --------------------------- Global table --------------------------- + String globalBase = ccdbPath + globalTableName; + + int nGlobalRows = cp.length(globalBase + "/Nsectors"); + if (nGlobalRows <= 0) { + throw new IllegalStateException("Table " + globalBase + " has no rows in CCDB"); + } + + int row = 0; // global table is expected to have a single row + + NSECTORS = cp.getInteger(globalBase + "/Nsectors", row); + NLAYERS = cp.getInteger(globalBase + "/NLayers", row); + NCOMPONENTS = cp.getInteger(globalBase + "/NComponents", row); + THOPEN = cp.getDouble(globalBase + "/Thopen", row); + THTILT = cp.getDouble(globalBase + "/Thtilt", row); + THMIN = cp.getDouble(globalBase + "/Thmin", row); + THMAX = cp.getDouble(globalBase + "/Thmax", row); + TGTDET = cp.getDouble(globalBase + "/Tgt", row); + DZ = cp.getDouble(globalBase + "/Dz", row); + TWIDTH = cp.getDouble(globalBase + "/TWidth", row); + PITCH = cp.getDouble(globalBase + "/Pitch", row); + WIDTH = cp.getDouble(globalBase + "/Width", row); + STEREOANGLE = cp.getDouble(globalBase + "/StereoAngle", row); + + if (VERBOSE) { + System.out.printf( + "%s global: Nsectors=%d Nlayers=%d Ncomponents=%d Thopen=%.3f Thtilt=%.3f " + + "Thmin=%.3f Thmax=%.3f Tgt=%.3f Dz=%.3f TWidth=%.3f Pitch=%.3f Width=%.3f StereoAngle=%.3f%n", + globalTableName, + NSECTORS, NLAYERS, NCOMPONENTS, + THOPEN, THTILT, THMIN, THMAX, + TGTDET, DZ, TWIDTH, PITCH, WIDTH, STEREOANGLE + ); + } + + // --------------------------- Material table ------------------------ + String matBase = ccdbPath + materialTableName; + + // Use a numeric column (e.g. Layer) to get the number of rows + int nRows = cp.length(matBase + "/Layer"); + + if (VERBOSE) { + System.out.printf("%s material table rows=%d%n", materialTableName, nRows); + } + + detectorStructure.clear(); + + // Expected schema (all numeric): + // Layer (int) + // Component (int) + // thickness (double) mm + // sensitivity (int) + for (int i = 0; i < nRows; i++) { + + int layer = cp.getInteger(matBase + "/Layer", i); + int component = cp.getInteger(matBase + "/Component", i); + double thickness = (cp.getDouble(matBase + "/Thickness", i)) * 0.1; // convert in cm + int sensitivity = cp.getInteger(matBase + "/Sensitivity", i); + + if (VERBOSE) { + System.out.printf( + "%s row %d: layer=%d comp=%d thick=%.5f sens=%d%n", + materialTableName, i, layer, component, thickness, sensitivity + ); + } + + LayerComponentInfo info = new LayerComponentInfo(thickness, sensitivity); + + detectorStructure + .computeIfAbsent(layer, l -> new LinkedHashMap<>()) + .put(component, info); + } + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java new file mode 100644 index 0000000000..82904ccb61 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java @@ -0,0 +1,343 @@ +package org.jlab.detector.geant4.v2.MPGD.trapezoid; + +import eu.mihosoft.vrl.v3d.Vector3d; +import org.jlab.detector.geant4.v2.Geant4Factory; +import org.jlab.detector.volume.G4Trap; +import org.jlab.detector.volume.G4World; +import org.jlab.detector.volume.Geant4Basic; + +import java.util.Map; + +/** + * Generic Geant4 factory for trapezoidal MPGD-like trackers. + * + * It builds: - a world volume - NREGIONS = NLAYERS/2 (by convention) - NSECTORS + * per region + * + * The exact geometry parameters and material stack are taken from an + * {@link MPGDTrapezoidConstants} instance. + * + * Concrete detectors should: - extend this class - pass the appropriate + * constants + detector name in the constructor + */ +public class MPGDTrapezoidGeant4Factory extends Geant4Factory { + + /** + * Detector constants (geometry + materials from CCDB). + */ + protected final MPGDTrapezoidConstants C; + + public static record SectorDimensions( + double halfThickness, + double halfHeight, + double halfLargeBase, + double halfSmallBase, + double tiltRad + ) { + + } + + /** + * @param constants detector constants (already configured with CCDB + * paths/table names) + */ + protected MPGDTrapezoidGeant4Factory(MPGDTrapezoidConstants constants) { + this.C = constants; + this.init(); + } + + // ------------------------------------------------------------------------ + // Top-level geometry construction + // ------------------------------------------------------------------------ + /** + * Initializes the world volume and constructs all regions and sectors. + * + * This must be called after the constants have been loaded from CCDB. + */ + protected final void init() { + + // World volume for this detector + motherVolume = new G4World("root"); + + int NREGIONS = (int) Math.round(C.NLAYERS / 2.0); + for (int iregion = 0; iregion < NREGIONS; iregion++) { + for (int isector = 0; isector < C.NSECTORS; isector++) { + Geant4Basic sectorVolume = createSector(isector, iregion); + sectorVolume.setMother(motherVolume); + } + } + } + + // ------------------------------------------------------------------------ + // Sector geometry helpers + // ------------------------------------------------------------------------ + /** + * Computes the total thickness (mm) of a sector by summing the thickness of + * all material volumes. + * + * @return + */ + public double getSectorThickness() { + return C.getDetectorStructure().values() + .stream() + .flatMap(componentMap -> componentMap.values().stream()) + .mapToDouble(info -> info.thickness) + .sum(); + } + + /** + * + * @param region + * @return + */ + public SectorDimensions getSectorActiveVolumeDimensions(int region) { + + double baseDistance = C.TGTDET + region * C.DZ; + + double sectorHeight = baseDistance + * (Math.tan(Math.toRadians(C.THMAX - C.THTILT)) + + Math.tan(Math.toRadians(C.THTILT - C.THMIN))); + + double halfThickness = this.getSectorThickness() / 2.0; + double halfHeight = sectorHeight / 2.0; + + // Distance from target to the bottom base along the tilted axis + double W2TGT = (C.TGTDET + region * C.DZ) + / Math.cos(Math.toRadians(C.THTILT - C.THMIN)); + + double YMIN = W2TGT * Math.sin(Math.toRadians(C.THMIN)); // distance from beamline (Y) + double h = sectorHeight * Math.cos(Math.toRadians(C.THTILT)); + double halfSmallBase = 0.5 * (YMIN * Math.tan(Math.toRadians(C.THOPEN) / 2)); + + double halfLargeBase = halfSmallBase + sectorHeight * Math.tan(Math.toRadians(C.THOPEN / 2.0)); + + double tiltRad = Math.toRadians(C.THTILT); + + double twidth_Check = 2 * halfLargeBase * Math.sin(Math.toRadians(C.THOPEN)); + + if (MPGDTrapezoidConstants.VERBOSE) { + System.out.printf("C.TWIDT=%.3f vs %.3f", C.TWIDTH, twidth_Check); + + System.out.printf("YMIN=%.3f", YMIN); + + System.out.printf( + "SectorDimensionsPhysical [%s] region=%d : height=%.3f | halfT=%.3f halfH=%.3f " + + "halfLarge=%.3f halfSmall=%.3f tilt(deg)=%.3f%n", + C.detectorName, region, sectorHeight, + halfThickness, halfHeight, + halfLargeBase, halfSmallBase, + C.THTILT + ); + } + + return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, tiltRad); + } + + /** + * + * @param region + * @return + */ + public SectorDimensions getSectorContainerDimensions(int region) { + + SectorDimensions phys = getSectorActiveVolumeDimensions(region); + + double halfThickness = phys.halfThickness() + MPGDTrapezoidConstants.ZENLARGEMENT; + double halfHeight = phys.halfHeight() + MPGDTrapezoidConstants.YENLARGEMENT; + double halfLargeBase = phys.halfLargeBase() + MPGDTrapezoidConstants.XENLARGEMENT; + double halfSmallBase = phys.halfSmallBase() + MPGDTrapezoidConstants.XENLARGEMENT; + + return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, phys.tiltRad()); + } + + /** + * Computes the sector height (longitudinal extension in the RZ plane) for a + * given region. + * + * @param region + * @return + */ + public double getSectorHeight(int region) { + + double baseDistance = C.TGTDET + region * C.DZ; + + double sectorHeight = baseDistance + * (Math.tan(Math.toRadians(C.THMAX - C.THTILT)) + + Math.tan(Math.toRadians(C.THTILT - C.THMIN))); + + if (MPGDTrapezoidConstants.VERBOSE) { + System.out.printf( + "SectorHeight [%s] region=%d : baseDistance=%.3f THMIN=%.3f THMAX=%.3f THTILT=%.3f -> height=%.3f%n", + C.detectorName, + region, + baseDistance, + C.THMIN, C.THMAX, C.THTILT, + sectorHeight + ); + } + + return sectorHeight; + } + + /** + * Computes the barycenter coordinates of a given sector/region in the + * CLAS12 coordinate system. + * + * @param isector + * @param iregion + * @return + */ + public Vector3d getCenterCoordinate(int isector, int iregion) { + + Vector3d vCenter = new Vector3d(0, 0, 0); + + // Distance from target to the bottom base along the tilted axis + double W2TGT = (C.TGTDET + iregion * C.DZ) + / Math.cos(Math.toRadians(C.THTILT - C.THMIN)); + + double YMIN = W2TGT * Math.sin(Math.toRadians(C.THMIN)); // distance from beamline (Y) + double ZMIN = W2TGT * Math.cos(Math.toRadians(C.THMIN)); // Z of the bottom base + + SectorDimensions dimCont = this.getSectorContainerDimensions(iregion); + double sectorHeight = 2 * dimCont.halfHeight(); + + vCenter.x = 0.0; + vCenter.y = (sectorHeight / 2.0) * Math.cos(Math.toRadians(C.THTILT)) + YMIN; + vCenter.z = -(sectorHeight / 2.0) * Math.sin(Math.toRadians(C.THTILT)) + ZMIN; + + // Rotate to the correct sector around Z (assumes 6 sectors, 60° apart) + vCenter.rotateZ(-Math.toRadians(90.0 - isector * 60.0)); + + return vCenter; + } + + // ------------------------------------------------------------------------ + // Sector + material volume construction + // ------------------------------------------------------------------------ + /** + * Builds a single sector for a given region and returns its volume. + * + * @param isector + * @param iregion + * @return + */ + public Geant4Basic createSector(int isector, int iregion) { + + SectorDimensions dimPhys = this.getSectorActiveVolumeDimensions(iregion); + SectorDimensions dimCont = this.getSectorContainerDimensions(iregion); + + Geant4Basic sectorVolume = createSectorVolume(isector, iregion, dimCont); + populateSectorWithDetectorStructure(sectorVolume, isector, iregion, dimPhys); + + return sectorVolume; + } + + /** + * Creates the main trapezoidal sector volume and places it in the world. + * + * @param isector + * @param iregion + * @param dimSect + * @return + */ + protected Geant4Basic createSectorVolume(int isector, + int iregion, + SectorDimensions dimSect) { + + double sectorDZ = dimSect.halfThickness(); + double sectorDY = dimSect.halfHeight(); + double sectorDX1 = dimSect.halfLargeBase(); + double sectorDX0 = dimSect.halfSmallBase(); + double sectorTtilt = dimSect.tiltRad(); + + Vector3d vCenter = this.getCenterCoordinate(isector, iregion); + + Geant4Basic sectorVolume = new G4Trap( + "region_" + C.detectorName + "_" + (iregion + 1) + "_s" + (isector + 1), + sectorDZ, -sectorTtilt, Math.toRadians(90.0), + sectorDY, sectorDX0, sectorDX1, 0.0, + sectorDY, sectorDX0, sectorDX1, 0.0 + ); + + sectorVolume.rotate("yxz", 0.0, sectorTtilt, Math.toRadians(90.0 - isector * 60.0)); + sectorVolume.translate(vCenter.x, vCenter.y, vCenter.z); + sectorVolume.setId(isector + 1, iregion + 1, 0, 0); + + return sectorVolume; + } + + /** + * Fills the given sector volume with material sub-volumes according to the + * CCDB material structure (layer/component stack).Stacking is done along + * the local Z direction (thickness). + * + * @param sectorVolume + * @param isector + * @param iregion + * @param dimSect + */ + protected void populateSectorWithDetectorStructure(Geant4Basic sectorVolume, + int isector, + int iregion, + SectorDimensions dimSect) { + + double halfThickness = dimSect.halfThickness(); + double halfHeight = dimSect.halfHeight(); + double halfLargeBase = dimSect.halfLargeBase(); + double halfSmallBase = dimSect.halfSmallBase(); + double tiltRad = dimSect.tiltRad(); + + double totalThickness = 2.0 * halfThickness; + double accumulatedThickness = 0.0; + + for (Map.Entry> layerEntry + : C.getDetectorStructure().entrySet()) { + + int LayerId = layerEntry.getKey(); + Map componentMap + = layerEntry.getValue(); + + for (Map.Entry componentEntry + : componentMap.entrySet()) { + + int materialComponentId = componentEntry.getKey(); + MPGDTrapezoidConstants.LayerComponentInfo info = componentEntry.getValue(); + + double thick = info.thickness; + + // Protect against zero or negative thickness: skip such entries + if (thick <= 0.0) { + System.err.printf( + "WARNING: skipping material volume with non-positive thickness: " + + "layer=%d comp=%d thick=%f%n", + LayerId, materialComponentId, thick + ); + continue; + } + + // place from "front" to "back" along local Z + double localZ = -totalThickness / 2.0 + accumulatedThickness + thick / 2.0; + double localY = -localZ * Math.tan(Math.toRadians(C.THTILT)); + + Geant4Basic matVolume = new G4Trap( + "matVolume", + thick / 2.0, -tiltRad, Math.toRadians(90.0), + halfHeight, halfSmallBase, halfLargeBase, 0.0, + halfHeight, halfSmallBase, halfLargeBase, 0.0 + ); + + matVolume.setName( + "rg_" + C.detectorName + "_" + (iregion + 1) + + "_s" + (isector + 1) + + "_l" + (LayerId + iregion * 2) + + "_matC" + materialComponentId + ); + + matVolume.setMother(sectorVolume); + matVolume.setPosition(0.0, localY, localZ); + + accumulatedThickness += thick; + } + } + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java new file mode 100644 index 0000000000..283adf2b21 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java @@ -0,0 +1,673 @@ +package org.jlab.detector.geant4.v2.MPGD.trapezoid; + +import eu.mihosoft.vrl.v3d.Vector3d; +import org.jlab.detector.volume.Geant4Basic; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Plane3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Trap3D; +import org.jlab.geom.prim.Vector3D; +import org.jlab.utils.groups.IndexedList; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * Base class implementing strip/surface/plane geometry for trapezoidal MPGD + * detectors. + */ +public abstract class MPGDTrapezoidStripFactory { + + // ------------------------------------------------------------------------ + // Inputs + // ------------------------------------------------------------------------ + protected final MPGDTrapezoidConstants C; + protected final MPGDTrapezoidGeant4Factory geo; + + protected MPGDTrapezoidStripFactory(MPGDTrapezoidConstants constants) { + this.C = constants; + this.geo = new MPGDTrapezoidGeant4Factory(constants); + } + + /** + * Detector-specific hook: Must return the volume object given its + * name.Typically implemented by indexing geo.getAllVolumes() into a + * Map. + * + * @param name + * @return + */ + protected abstract Geant4Basic getVolumeByName(String name); + + // ------------------------------------------------------------------------ + // Cached geometry (CLAS12 indices) + // ------------------------------------------------------------------------ + protected final IndexedList globalStrips = new IndexedList<>(3); // (sector, layer, component) + protected final IndexedList localStrips = new IndexedList<>(3); // (sector, layer, component) sensitive-local + protected final IndexedList tiltedStrips = new IndexedList<>(3); // (sector, layer, component) + protected final IndexedList planes = new IndexedList<>(2); // (sector, layer) + protected final IndexedList surfaceLayers = new IndexedList<>(2); // (sector, layer) + protected final IndexedList nComponents = new IndexedList<>(2); // (sector, layer) + + // ------------------------------------------------------------------------ + // Internal geometry containers (mirror the C++ digitizer) + // ------------------------------------------------------------------------ + protected static class StripConstants { + + public double xHalfSmall; // cm + public double xHalfLarge; // cm + public double yHalf; // cm + public double zReadoutLocal; // cm (in sensitive-local) + public double pitch; // cm + public double width; // cm + public double stereoAngle; // rad + } + + protected static class Trap2D { + + Vector3d bl, br, tl, tr; + + static Trap2D fromConstants(StripConstants c) { + Trap2D t = new Trap2D(); + double z = c.zReadoutLocal; + t.bl = new Vector3d(-c.xHalfSmall, -c.yHalf, z); + t.br = new Vector3d(c.xHalfSmall, -c.yHalf, z); + t.tl = new Vector3d(-c.xHalfLarge, c.yHalf, z); + t.tr = new Vector3d(c.xHalfLarge, c.yHalf, z); + return t; + } + + List edges() { + List e = new ArrayList<>(4); + e.add(new Vector3d[]{bl, br}); + e.add(new Vector3d[]{br, tr}); + e.add(new Vector3d[]{tr, tl}); + e.add(new Vector3d[]{tl, bl}); + return e; + } + } + + protected static class StripGeom { + + int internalIndex; + int component; + Vector3d p1Local, p2Local; // endpoints in sensitive-local + double orderXLocal; // local midpoint X ordering key + } + + // ------------------------------------------------------------------------ + // Options / defaults + // ------------------------------------------------------------------------ + /** + * If true: readout is 2D => same zReadoutLocal for both layers.Override in + * detector. + * + * @return + */ + protected boolean is2DReadout() { + return false; + } + + protected int baseLayerForCCDB(int layer) { + if (is2DReadout()) { + return 1; + } + return (layer % 2 == 0) ? 2 : 1; + } + + /** + * Pitch in cm (CCDB stored in mm). Override if detector is different. + */ + protected double defaultPitchCm() { + return C.PITCH * 0.1; + } + + /** + * Width in cm (CCDB stored in mm). Override if detector is different. + */ + protected double defaultWidthCm() { + return C.WIDTH * 0.1; + } + + /** + * Stereo angle in rad (CCDB stored in deg). Override if detector is + * layer-dependent. + */ + protected double defaultStereoAngleRad() { + return Math.toRadians(C.STEREOANGLE); + } + + // ------------------------------------------------------------------------ + // Sensitive volume discovery (Sensitivity==1) + // ------------------------------------------------------------------------ + /** + * Return the CCDB "Component" index (matC) whose Sensitivity==1 for a given + * layer. + * + * @param layer + * @return + */ + protected int getSensitiveMatComponentId(int layer) { + int baseLayer = baseLayerForCCDB(layer); + var layerMap = C.getDetectorStructure().get(baseLayer); + if (layerMap == null) { + throw new IllegalStateException("No detectorStructure entry for layer=" + layer); + } + for (var e : layerMap.entrySet()) { + int matC = e.getKey(); + var info = e.getValue(); + if (info.sensitivity == 1) { + return matC; + } + } + throw new IllegalStateException("No Sensitivity==1 found for layer=" + layer); + } + + /** + * Compute the sensitive half thickness (cm) from CCDB (Sensitivity==1). + * + * @param layer + * @return + */ + protected double getSensitiveHalfThicknessCm(int layer) { + int baseLayer = baseLayerForCCDB(layer); + var layerMap = C.getDetectorStructure().get(baseLayer); + if (layerMap == null) { + throw new IllegalStateException("No detectorStructure entry for layer=" + layer); + } + for (var e : layerMap.entrySet()) { + var info = e.getValue(); + if (info.sensitivity == 1) { + return info.thickness / 2.0; // thickness already cm in your loader + } + } + throw new IllegalStateException("No sensitive thickness (Sensitivity==1) for layerInRegion=" + layer); + } + + /** + * Readout plane z in sensitive-local.Convention: - 1D: even layerInRegion + * => +zHalf, odd => -zHalf - 2D: always +zHalf + * + * @param layer + * @return + */ + protected double findReadoutZLocal(int layer) { + double zHalf = getSensitiveHalfThicknessCm(layer); + if (is2DReadout()) { + return +zHalf; + } + return (layer % 2 == 0) ? (+zHalf) : (-zHalf); + } + + /** + * Build expected sensitive-volume name using the naming convention from + * AbstractMPGDTrapezoidGeant4Factory.populateSectorWithDetectorStructure(): + * + * rg{region}_s{sector}_l{layerGlobal0Based}_matC{matC} + * + * where: - region is 1-based in the name - sector is 1-based in the name - + * matC is the CCDB material "Component" id for Sensitivity==1 + * + * @param region + * @param sector + * @param layer + * @return + */ + protected String getSensitiveVolumeName(int region, int sector, int layer) { + int matC = getSensitiveMatComponentId(layer); + if (is2DReadout()) { + if (layer % 2 == 0) { // layer pari + layer = layer - 1; + } +} + + return "rg_" + C.detectorName + "_" + region + + "_s" + sector + + "_l" + layer + + "_matC" + matC; + } + + /** + * Transform a point from sensitive-local -> global using the sensitive + * volume transform. + * + * @param region + * @param sector + * @param layer + * @param local + * @return + */ + protected Vector3d toGlobalSensitive(int region, int sector, int layer, Vector3d local) { + String name = getSensitiveVolumeName(region, sector, layer); + Geant4Basic v = getVolumeByName(name); + if (v == null) { + throw new IllegalStateException("Sensitive volume not found: " + name); + } + + return v.getGlobalTransform().transform(local); + } + + // ------------------------------------------------------------------------ + // Strip constants builder (GENERAL: uses geo physical dims + CCDB thickness) + // ------------------------------------------------------------------------ + /** + * Build StripConstants using: - XY trapezoid from + * geo.getSectorDimensionsPhysical(region) (NOT enlarged) - zReadoutLocal + * from CCDB sensitive thickness (findReadoutZLocal) - pitch/width/stereo + * from CCDB + * + * @param region + * @param layer + * @return + */ + protected StripConstants buildStripConstants(int region, int layer) { + + MPGDTrapezoidGeant4Factory.SectorDimensions phys + = geo.getSectorActiveVolumeDimensions(region - 1); + + StripConstants sc = new StripConstants(); + sc.yHalf = phys.halfHeight(); + sc.xHalfSmall = phys.halfSmallBase(); + sc.xHalfLarge = phys.halfLargeBase(); + + // sc.zReadoutLocal = findReadoutZLocal(layer); + sc.zReadoutLocal = 0.0; + sc.pitch = defaultPitchCm(); + sc.width = defaultWidthCm(); + if (layer % 2 == 0) { + // layer pari + sc.stereoAngle = -defaultStereoAngleRad(); + } else { + // layer dispari + sc.stereoAngle = defaultStereoAngleRad(); + } + + + return sc; + } + + // ------------------------------------------------------------------------ + // Strip-frame transforms (IDENTICAL to C++) + // ------------------------------------------------------------------------ + protected static double[] toStripFrameXY(double x, double y, StripConstants c) { + double sa = Math.sin(c.stereoAngle); + double ca = Math.cos(c.stereoAngle); + double xs = sa * x + ca * y; + double ys = ca * x - sa * y; + return new double[]{xs, ys}; + } + + // ------------------------------------------------------------------------ + // Line / edge intersection (normal form) + // ------------------------------------------------------------------------ + protected static boolean intersectEdgeWithLineNormal( + Vector3d A, Vector3d B, + Vector3d nXY, double rhs, + Vector3d out + ) { + double nA = nXY.x * A.x + nXY.y * A.y; + double nB = nXY.x * B.x + nXY.y * B.y; + double denom = nB - nA; + + if (Math.abs(denom) < 1e-12) { + return false; + } + + double t = (rhs - nA) / denom; + if (t < 0.0 || t > 1.0) { + return false; + } + + out.x = A.x + t * (B.x - A.x); + out.y = A.y + t * (B.y - A.y); + out.z = A.z + t * (B.z - A.z); + return true; + } + + protected static boolean buildStripSegment(int internalIndex, StripConstants c, Vector3d out1, Vector3d out2) { + + Trap2D tr = Trap2D.fromConstants(c); + + double sa = Math.sin(c.stereoAngle); + double ca = Math.cos(c.stereoAngle); + + // line: ca*x - sa*y = rhs + Vector3d nXY = new Vector3d(ca, -sa, 0.0); + double rhs = (internalIndex + 0.5) * c.pitch; + + List inters = new ArrayList<>(4); + + for (Vector3d[] e : tr.edges()) { + Vector3d P = new Vector3d(0, 0, 0); + if (intersectEdgeWithLineNormal(e[0], e[1], nXY, rhs, P)) { + inters.add(new Vector3d(P.x, P.y, P.z)); + } + } + + if (inters.size() < 2) { + return false; + } + + // choose farthest pair (robust at vertices) + double best = -1; + Vector3d a = null, b = null; + for (int i = 0; i < inters.size(); i++) { + for (int j = i + 1; j < inters.size(); j++) { + double dx = inters.get(i).x - inters.get(j).x; + double dy = inters.get(i).y - inters.get(j).y; + double d2 = dx * dx + dy * dy; + if (d2 > best) { + best = d2; + a = inters.get(i); + b = inters.get(j); + } + } + } + + out1.set(a.x, a.y, a.z); + out2.set(b.x, b.y, b.z); + return true; + } + + /** + * Build full strip list (LOCAL) and assign CLAS12 component IDs by sorting + * on local X midpoint. + * + * @param c + * @return + */ + protected List buildStripCache(StripConstants c) { + + Trap2D tr = Trap2D.fromConstants(c); + + double ys1 = toStripFrameXY(tr.bl.x, tr.bl.y, c)[1]; + double ys2 = toStripFrameXY(tr.br.x, tr.br.y, c)[1]; + double ys3 = toStripFrameXY(tr.tl.x, tr.tl.y, c)[1]; + double ys4 = toStripFrameXY(tr.tr.x, tr.tr.y, c)[1]; + + double ysMin = Math.min(Math.min(ys1, ys2), Math.min(ys3, ys4)); + double ysMax = Math.max(Math.max(ys1, ys2), Math.max(ys3, ys4)); + + int iMin = (int) Math.floor(ysMin / c.pitch) - 2; + int iMax = (int) Math.ceil(ysMax / c.pitch) + 2; + + List tmp = new ArrayList<>(); + + for (int idx = iMin; idx <= iMax; idx++) { + + Vector3d p1 = new Vector3d(0, 0, 0); + Vector3d p2 = new Vector3d(0, 0, 0); + + if (!buildStripSegment(idx, c, p1, p2)) { + continue; + } + + StripGeom s = new StripGeom(); + s.internalIndex = idx; + s.p1Local = p1; + s.p2Local = p2; + + Vector3d mid = new Vector3d( + 0.5 * (p1.x + p2.x), + 0.5 * (p1.y + p2.y), + 0.5 * (p1.z + p2.z) + ); + s.orderXLocal = mid.x; + + tmp.add(s); + } + + tmp.sort(Comparator + .comparingDouble((StripGeom s) -> s.orderXLocal) + .thenComparingInt(s -> s.internalIndex)); + + int comp = 1; + for (StripGeom s : tmp) { + s.component = comp++; + } + + return tmp; + } + + // ------------------------------------------------------------------------ + // Tilted frame + // ------------------------------------------------------------------------ + /** + * + * @param sector + * @param global + * @return + */ + protected Line3D toTilted(int sector, Line3D global) { + Line3D tilted = new Line3D(); + tilted.copy(global); + + double dPhi = 360.0 / C.NSECTORS; + double phi = -Math.toRadians(dPhi * (sector - 1)); + + tilted.rotateZ(phi); + tilted.rotateY(Math.toRadians(-C.THTILT)); + + return tilted; + } + + // ------------------------------------------------------------------------ + // Surface + Plane builders (GLOBAL) + // ------------------------------------------------------------------------ + /** + * + * @param sector + * @param layer + * @return + */ + protected Trap3D createSurface(int sector, int layer) { + + int region = (layer + 1) / 2; + + StripConstants c = buildStripConstants(region, layer); + + Vector3d blL = new Vector3d(-c.xHalfSmall, -c.yHalf, c.zReadoutLocal); + Vector3d brL = new Vector3d(c.xHalfSmall, -c.yHalf, c.zReadoutLocal); + Vector3d tlL = new Vector3d(-c.xHalfLarge, c.yHalf, c.zReadoutLocal); + Vector3d trL = new Vector3d(c.xHalfLarge, c.yHalf, c.zReadoutLocal); + + Vector3d blG = toGlobalSensitive(region, sector, layer, blL); + Vector3d brG = toGlobalSensitive(region, sector, layer, brL); + Vector3d tlG = toGlobalSensitive(region, sector, layer, tlL); + Vector3d trG = toGlobalSensitive(region, sector, layer, trL); + + return new Trap3D( + blG.x, blG.y, blG.z, + brG.x, brG.y, brG.z, + tlG.x, tlG.y, tlG.z, + trG.x, trG.y, trG.z + ); + } + + /** + * + * @param sector + * @param layer + * @return + */ + protected Plane3D createPlane(int sector, int layer) { + + int region = (layer + 1) / 2; + + StripConstants c = buildStripConstants(region, layer); + + // 3 points on the readout plane in sensitive-local + Vector3d p1L = new Vector3d(-c.xHalfSmall, -c.yHalf, c.zReadoutLocal); + Vector3d p2L = new Vector3d(c.xHalfSmall, -c.yHalf, c.zReadoutLocal); + Vector3d p3L = new Vector3d(-c.xHalfLarge, c.yHalf, c.zReadoutLocal); + + // transform to global + Vector3d p1G = toGlobalSensitive(region, sector, layer, p1L); + Vector3d p2G = toGlobalSensitive(region, sector, layer, p2L); + Vector3d p3G = toGlobalSensitive(region, sector, layer, p3L); + + Point3D P1 = new Point3D(p1G.x, p1G.y, p1G.z); + Point3D P2 = new Point3D(p2G.x, p2G.y, p2G.z); + Point3D P3 = new Point3D(p3G.x, p3G.y, p3G.z); + + // normal = (P1->P2) x (P1->P3) + Vector3D v1 = P1.vectorTo(P2); + Vector3D v2 = P1.vectorTo(P3); + Vector3D n = v1.cross(v2); + n.unit(); + + // If you want a stable sign convention, uncomment: + // if (n.z() < 0) n.setXYZ(-n.x(), -n.y(), -n.z()); + return new Plane3D(P1, n); + } + + // ------------------------------------------------------------------------ + // Build orchestration + // ------------------------------------------------------------------------ + public final void buildAll() { + clearCaches(); + fillStripLists(); + fillSurfaceLists(); + fillPlaneLists(); + } + + protected void clearCaches() { + globalStrips.clear(); + localStrips.clear(); + tiltedStrips.clear(); + planes.clear(); + surfaceLayers.clear(); + nComponents.clear(); + } + + protected void fillStripLists() { + + for (int sector = 1; sector <= C.NSECTORS; sector++) { + for (int layer = 1; layer <= C.NLAYERS; layer++) { + + int region = (layer + 1) / 2; + + StripConstants sc = buildStripConstants(region, layer); + List strips = buildStripCache(sc); + + nComponents.add(strips.size(), sector, layer); + + for (StripGeom s : strips) { + + // local line (sensitive-local) + Line3D local = new Line3D( + s.p1Local.x, s.p1Local.y, s.p1Local.z, + s.p2Local.x, s.p2Local.y, s.p2Local.z + ); + + // global endpoints + Vector3d g1 = toGlobalSensitive(region, sector, layer, s.p1Local); + + Vector3d g2 = toGlobalSensitive(region, sector, layer, s.p2Local); + + Line3D global = new Line3D( + g1.x, g1.y, g1.z, + g2.x, g2.y, g2.z + ); + + Line3D tilted = toTilted(sector, global); + + // cache with CLAS12 indices: (sector, layer, component) + localStrips.add(local, sector, layer, s.component); + globalStrips.add(global, sector, layer, s.component); + tiltedStrips.add(tilted, sector, layer, s.component); + } + } + } + } + + protected void fillSurfaceLists() { + for (int sector = 1; sector <= C.NSECTORS; sector++) { + for (int layer = 1; layer <= C.NLAYERS; layer++) { + surfaceLayers.add(createSurface(sector, layer), sector, layer); + } + } + } + + protected void fillPlaneLists() { + for (int sector = 1; sector <= C.NSECTORS; sector++) { + for (int layer = 1; layer <= C.NLAYERS; layer++) { + planes.add(createPlane(sector, layer), sector, layer); + } + } + } + + // ------------------------------------------------------------------------ + // Public API (cached getters) + // ------------------------------------------------------------------------ + /** + * Global strip line in CLAS12 frame. + * + * @param sector + * @param layer + * @param component + * @return + */ + public Line3D getStrip(int sector, int layer, int component) { + return globalStrips.getItem(sector, layer, component); + } + + /** + * Strip line in sensitive-volume local frame. + * + * @param sector + * @param layer + * @param component + * @return + */ + public Line3D getStripLocal(int sector, int layer, int component) { + return localStrips.getItem(sector, layer, component); + } + + /** + * Strip line in legacy tilted frame (debug/plot). + * + * @param sector + * @param layer + * @param component + * @return + */ + public Line3D getStripTilted(int sector, int layer, int component) { + return tiltedStrips.getItem(sector, layer, component); + } + + /** + * Readout plane in global frame. + * + * @param sector + * @param layer + * @return + */ + public Plane3D getPlane(int sector, int layer) { + return planes.getItem(sector, layer); + } + + /** + * Readout trapezoid surface in global frame. + * + * @param sector + * @param layer + * @return + */ + public Trap3D getSurface(int sector, int layer) { + return surfaceLayers.getItem(sector, layer); + } + + /** + * Number of components (strips) for this (sector, layer). + * + * @param sector + * @param layer + * @return + */ + public int getNComponents(int sector, int layer) { + Integer n = nComponents.getItem(sector, layer); + return (n == null) ? 0 : n; + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellConstants.java deleted file mode 100644 index 81b08bf569..0000000000 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellConstants.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.jlab.detector.geant4.v2.URWELL; - - -import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.geom.prim.Point3D; - - -public class URWellConstants { - - private final static String CCDBPATH = "/geometry/urwell/"; - - public final static int NMAXREGIONS = 2; //max number of regions - public final static int NREGIONS = 1; //number of regions - public final static int NSECTORS = 6; //number of sectors - public final static int NLAYERS = 2; //number of layers - public final static int NCHAMBERS = 3; //number of chambers in a sector - - public final static double XENLARGEMENT = 0.5; // cm - public final static double YENLARGEMENT = 1.; // cm - public final static double ZENLARGEMENT = 0.1; // cm - - // Sector geometrical parameters - public final static double THOPEN = 54.; // opening angle between endplate planes (deg) - public final static double THTILT = 25; // theta tilt (deg) - public final static double THMIN = 4.694; // polar angle to the base of first chamber (deg) - public final static double SECTORHEIGHT = 146.21; //height of each sector (cm) - public final static double DX0CHAMBER0 = 5.197; // halfbase of chamber 1 (cm) - - // Chamber volumes and materials (units are cm) - public final static double[] CHAMBERVOLUMESTHICKNESS = {0.0025, 0.0005,0.3, // window - 0.0025, 0.0005,0.4, // cathode - 0.0005, 0.005, 0.0005, // uRWell + DlC - 0.0005, 0.005, 0.0005, // Capacitive sharing layer1 - 0.0005, 0.005, 0.0005, // Capacitive sharing layer2 - 0.005, 0.0005,0.005, 0.005, 0.0005,0.005, 0.005, // Readout - 0.0127, 0.3, 0.0125}; // support - public final static String[] CHAMBERVOLUMESNAME = {"window_kapton", "window_Al", "window_gas", - "cathode_kapton", "cathode_Al", "cathode_gas", - "muRwell_Cu", "muRwell_kapton", "muRwell_dlc", - "capa_sharing_layer1_glue","capa_sharing_layer1_Cr","capa_sharing_layer1_kapton", - "capa_sharing_layer2_glue","capa_sharing_layer2_Cr","capa_sharing_layer2_kapton", - "readout1_glue", "readout1_Cu", "readout1_kapton", "readout2_glue", "readout2_Cu", "readout2_kapton", "readout3_glue", - "support_skin1_g10", "support_honeycomb_nomex", "support_skin2_g10"}; - - // URWELL position in the CLAS12 frame - public final static double TGT2DC0 = 228.078; // cm - // public final static double URWELL2DC0 = 2; // cm - public final static double URWELL2DC0[] = new double[NMAXREGIONS]; - public final static double DIST2TGT[] = new double[NMAXREGIONS]; - public final static double W2TGT[] = new double[NMAXREGIONS];; - public final static double YMIN[] = new double[NMAXREGIONS]; - public final static double ZMIN[] = new double[NMAXREGIONS]; - - // public final static double DIST2TGT = (TGT2DC0-URWELL2DC0); - // public final static double W2TGT = DIST2TGT/Math.cos(Math.toRadians(THTILT-THMIN)); - // public final static double YMIN = W2TGT*Math.sin(Math.toRadians(THMIN)); // distance from the base chamber1 and beamline - // public final static double ZMIN = W2TGT*Math.cos(Math.toRadians(THMIN)); - public final static double PITCH = 0.1 ; // cm - public final static double STEREOANGLE = 10; // deg - - - - // URWELL - PROTO information // - /* - public final static double DX0_PROTO = 101.2; //cm - public final static double DX1_PROTO = 146.2; //cm - public final static double HEIGHT_PROTO = 50; //cm - */ - // public final static int THILT_PROTO; // theta tilt (deg) - public final static int NREGIONS_PROTO = 1; //number of regions - public final static int NSECTORS_PROTO = 1; //number of sectors - public final static int NCHAMBERS_PROTO = 1; //number of chambers in a sector - - - // URWELL-PROTO position in CLAS12 frame - - // 4 URWELL-PROTO vertex - sensitive plane - public static Point3D Apoint = new Point3D(22.9545, -337.005, 465.9); // {X,Y,Z} - public static Point3D Bpoint = new Point3D(148.906, -264.288, 465.9); // {X,Y,Z} - public static Point3D Cpoint = new Point3D(152.047, -314.276, 445.0); // {X,Y,Z} - public static Point3D Dpoint = new Point3D(64.676, -364.719, 445.0); // {X,Y,Z} - - /* - * @return String a path to a directory in CCDB of the format {@code "/geometry/detector/"} - */ - public static String getCcdbPath() - { - return CCDBPATH; - } - - - - /** - * Loads the the necessary tables for the URWELL geometry for a given DatabaseConstantProvider. - * - * @return DatabaseConstantProvider the same thing - */ - public static DatabaseConstantProvider connect( DatabaseConstantProvider cp ) - { - // cp.loadTable( CCDBPATH +"RWELL"); - - load(cp ); - return cp; - } - - /** - * Reads all the necessary constants from CCDB into static variables. - * Please use a DatabaseConstantProvider to access CCDB and load the following tables: - * @param cp a ConstantProvider that has loaded the necessary tables - */ - - public static synchronized void load( DatabaseConstantProvider cp ) - { - // read constants from svt table -// NREGIONS = cp.getInteger( CCDBPATH+"svt/nRegions", 0 ); - - for (int i=0; i (volume.getName().contains(volumeName))) - .findAny() - .orElse(null); - } - - /** - * Returns the sector volume for the given sector number - * - * @param sector (1-6) - * @return the sector volume - */ - public Geant4Basic getSectorVolume(int region, int sector) { - - int r = region; - int s = sector; - - String volName = "region_uRwell_" + r + "_s" + s; - return this.getAllVolumes().stream() - .filter(volume -> (volume.getName().contains(volName))) - .findAny() - .orElse(null); - } - - - - - - public static void main(String[] args) { - DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); - - URWellConstants.connect(cp); - - URWellGeant4Factory factory = new URWellGeant4Factory(cp, false, 2); - - factory.getAllVolumes().forEach(volume -> { - System.out.println(volume.gemcString()); - }); - - - - } - -} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellStripFactory.java deleted file mode 100644 index a7ec2edb5f..0000000000 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/URWELL/URWellStripFactory.java +++ /dev/null @@ -1,456 +0,0 @@ -package org.jlab.detector.geant4.v2.URWELL; - - -import eu.mihosoft.vrl.v3d.Vector3d; -import java.util.List; -import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.detector.hits.DetHit; -import org.jlab.detector.volume.Geant4Basic; -import org.jlab.geom.prim.Line3D; -import org.jlab.geom.prim.Plane3D; -import org.jlab.geom.prim.Point3D; -import org.jlab.geom.prim.Vector3D; -import org.jlab.geometry.prim.Line3d; -import org.jlab.geometry.prim.Straight; -import org.jlab.utils.groups.IndexedList; - -/** - * Creates and handles the URWELL detector strips as 3D lines - * - * @author bondi - */ -public final class URWellStripFactory { - - private URWellGeant4Factory factory; - private IndexedList globalStrips = new IndexedList(3); - private IndexedList localStrips = new IndexedList(3); - private IndexedList planeStrips = new IndexedList(3); - private int nRegions; - private int nSectors; - private int nChambers; - private int nLayers; - private boolean isProto; - - public URWellStripFactory() { - } - - /** - * Create the strip factory based on constants from CCDB. - * Currently constants are defined in the URWellConstants class. - * They will be moved to CCDB when finalized). - * @param cp database provide - */ - public URWellStripFactory(DatabaseConstantProvider cp) { - this.init(cp); - } - - /** - * Initialize the factory by the strip maps - * @param cp - */ - public void init(DatabaseConstantProvider cp) { - this.init(cp, false, 1); - } - - /** - * Create the strip factory based on constants from CCDB. - * Currently constants are defined in the URWellConstants class. - * They will be moved to CCDB when finalized). - * @param cp database provide - * @param prototype - * @param regions - */ - public URWellStripFactory(DatabaseConstantProvider cp, boolean prototype, int regions) { - this.init(cp, prototype, regions); - } - - /** - * Initialize the factory by the strip maps - * @param cp - * @param prototype - * @param regions - */ - public void init(DatabaseConstantProvider cp, boolean prototype, int regions) { - factory = new URWellGeant4Factory(cp, prototype, regions); - isProto = prototype; - if(!isProto){ - nRegions = Math.min(URWellConstants.NMAXREGIONS, regions); - nSectors = URWellConstants.NSECTORS; - nChambers = URWellConstants.NCHAMBERS; - nLayers = URWellConstants.NLAYERS; - } - else { - nRegions = URWellConstants.NREGIONS_PROTO; - nSectors = URWellConstants.NSECTORS_PROTO; - nChambers = URWellConstants.NCHAMBERS_PROTO; - nLayers = URWellConstants.NLAYERS; - } - this.fillStripLists(); - this.fillPlaneLists(); - } - - /** - * Calculates the total number of strips in a sector - * - * @return the strip number - */ - public int getNStripSector() { - int nStrips = 0; - for (int i = 0; i < nChambers; i++) { - nStrips += getNStripChamber(i); - } - return nStrips; - } - - /** - * Calculates the number of strips in the given chamber - * - * @param ichamber (0, 1, 2) - * @return the strip number (1-N) - */ - public int getNStripChamber(int ichamber) { - - double[] dim = factory.getChamber_daughter_Dimensions(ichamber); - - double yHalf = dim[0]; - double xHalfSmallBase = dim[1]; - double xHalfLargeBase = dim[2]; - - // C-------------D // - // ------------- // - // ----------- // - // A-------B // - /** - * * number of strip in AB** - */ - int nAB = (int) (2 * xHalfSmallBase / (URWellConstants.PITCH - / Math.sin(Math.toRadians(URWellConstants.STEREOANGLE)))); - - double AC = Math.sqrt((Math.pow((xHalfSmallBase - xHalfLargeBase), 2) + Math.pow((2 * yHalf), 2))); - double theta = Math.acos(2 * yHalf / AC); - int nAC = (int) (AC / (URWellConstants.PITCH - / Math.cos(theta - Math.toRadians(URWellConstants.STEREOANGLE)))); - - int nStrips = nAB + nAC +1 ; - - return nStrips; - } - - /** - * Provides the index of the chamber containing the strip with the given ID - * - * @param strip (1 to N) - * @return the chamber index (0, 1, 2) - */ - public int getChamberIndex(int strip) { - int nStripTotal = 0; - - for(int i=0; i strip ID chamber (from 1 to getNStripChamber) - int nStripTotal = 0; - if (chamberIndex > 0) { - for (int i = 0; i < chamberIndex; i++) { - nStripTotal += this.getNStripChamber(i); - } - } - - //Strip ID: from 1 to getNStripChamber - int cStrip = strip - nStripTotal; - - return cStrip; - } - - /** - * Builds the given strip line in the CLAS12 frame - * @param sector (1-6) - * @param layer (1-2) - * @param strip (1-N) - * @return the 3D strip line as a Line3d - */ - private Line3d createStrip(int sector, int layer, int strip) { - - int chamberIndex = getChamberIndex(strip); - - int cStrip = this.getLocalStripId(strip); - - - // CHAMBER reference frame - // new numeration with stri ID_strip=0 crossing (0,0,0) of chamber - double[] dim = factory.getChamber_daughter_Dimensions(chamberIndex); - - double yHalf = dim[0]; - double xHalfSmallBase = dim[1]; - double xHalfLargeBase = dim[2]; - - - - // Y coordinate of the intersection point between the x=0 and the strip line crossing for B - - double DY = -yHalf - Math.tan(Math.toRadians(URWellConstants.STEREOANGLE)) *xHalfSmallBase; - - // ID of the strip - int nS = (int) (DY * Math.cos(Math.toRadians(URWellConstants.STEREOANGLE)) / URWellConstants.PITCH); - int nCStrip = nS + (cStrip - 1); - - //strip straight line chamber reference frame -> y = mx +c; - double stereoAngle = URWellConstants.STEREOANGLE; - if (layer % 2 != 0) { - stereoAngle = -URWellConstants.STEREOANGLE; - } - double m = Math.tan(Math.toRadians(stereoAngle)); - double c = nCStrip * URWellConstants.PITCH / Math.cos(Math.toRadians(stereoAngle)); - - // Take 2 points in the strip straight line. They needs to define Line object - double oX = -xHalfLargeBase; - double oY = -xHalfLargeBase * m + c; - double oZ = 0; - Vector3d origin = new Vector3d(oX, oY, oZ); - - double eX = xHalfLargeBase; - double eY = xHalfLargeBase * m + c; - double eZ = 0; - Vector3d end = new Vector3d(eX, eY, eZ); - - // Get Chamber Volume - Geant4Basic chamberVolume = factory.getChamberVolume(sector, chamberIndex+1, layer, isProto); - - // 2 point defined before wrt the GLOBAL frame - Vector3d globalOrigin = chamberVolume.getGlobalTransform().transform(origin); - - Vector3d globalEnd = chamberVolume.getGlobalTransform().transform(end); - - - Straight line = new Line3d(globalOrigin, globalEnd); - - // CHECK intersections between line and volume - chamberVolume.makeSensitive(); - List Hits = chamberVolume.getIntersections(line); - - if (Hits.size() >= 1) { - - Vector3d TestOrigin = Hits.get(0).origin(); - Vector3d TestEnd = Hits.get(0).end(); - - return new Line3d(Hits.get(0).origin(), Hits.get(0).end()); - - } else { - return null; - } - } - - /** - * Provides the given strip line in the Chamber local frame - * @param region (1-2) - * @param sector (1-6) - * @param layer (1-4) - * @param strip (1-N) - * @return the 3D strip line as a Line3d - */ - - private Line3d getChamberStrip(int region, int sector, int chamber, int layer, int strip) { - - - Line3d globalStrip = createStrip(sector, layer, strip); - Geant4Basic chamberVolume = factory.getChamberVolume(sector, chamber, layer, isProto); - - Vector3d origin = chamberVolume.getGlobalTransform().invert().transform(globalStrip.origin()); - Vector3d end = chamberVolume.getGlobalTransform().invert().transform(globalStrip.end()); - - Line3d localStrip = new Line3d(origin, end); - - - return localStrip; - } - - - - /** - * Provides the given strip line in the sector local frame - * @param sector (1-6) - * @param layer (1-2) - * @param strip (1-N) - * @return the 3D strip line as a Line3d - */ - private Line3d getLocalStrip(int region, int sector, int layer, int strip) { - - Line3d globalStrip = createStrip(sector, layer, strip); - Geant4Basic sVolume = factory.getSectorVolume(region, sector); - - Vector3d origin = sVolume.getGlobalTransform().invert().transform(globalStrip.origin()); - Vector3d end = sVolume.getGlobalTransform().invert().transform(globalStrip.end()); - - Line3d localStrip = new Line3d(origin, end); - - return localStrip; - } - - - private void fillStripLists() { - - for(int ir=0; irswaps raster vtx - urwell + urwt alert bg postproc diff --git a/reconstruction/urwell/pom.xml b/reconstruction/urwt/pom.xml similarity index 93% rename from reconstruction/urwell/pom.xml rename to reconstruction/urwt/pom.xml index 492d409652..6baba51d51 100644 --- a/reconstruction/urwell/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.jlab.clas12.detector - clas12detector-urwell + clas12detector-urwt 13.6.0-SNAPSHOT jar @@ -44,5 +44,5 @@ 13.6.0-SNAPSHOT - - + clas12detector-urwt + diff --git a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellStrip.java b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWRStrip.java similarity index 79% rename from reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellStrip.java rename to reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWRStrip.java index cbfbfdf4fb..64f5c7c614 100644 --- a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellStrip.java +++ b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWRStrip.java @@ -1,4 +1,4 @@ -package org.jlab.service.urwell; +package org.jlab.service.urwt; import java.util.ArrayList; import java.util.List; @@ -6,21 +6,21 @@ import org.jlab.detector.base.DetectorDescriptor; import org.jlab.detector.base.DetectorType; import org.jlab.detector.calib.utils.ConstantsManager; -import org.jlab.detector.geant4.v2.URWELL.URWellStripFactory; +import org.jlab.detector.geant4.v2.MPGD.URWT.URWTStripFactory; import org.jlab.geom.prim.Line3D; import org.jlab.io.base.DataEvent; /** - * URWell strip, defined based on ADC bank information and 3D line provided + * URWT strip, defined based on ADC bank information and 3D line provided * by the geometry service * * @author bondi, devita */ -public class URWellStrip implements Comparable { +public class URWRStrip implements Comparable { - private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.URWELL); + private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.URWT); private int chamber = 0; @@ -36,11 +36,11 @@ public class URWellStrip implements Comparable { private double time = 0; - public URWellStrip(int sector, int layer, int component){ + public URWRStrip(int sector, int layer, int component){ this.desc.setSectorLayerComponent(sector, layer, component); } - public URWellStrip(int sector, int layer, int component, int ADC, int TDC){ + public URWRStrip(int sector, int layer, int component, int ADC, int TDC){ this.desc.setSectorLayerComponent(sector, layer, component); this.ADC = ADC; this.TDC = TDC; @@ -135,7 +135,7 @@ public void setStatus(int status) { this.status = status; } - public boolean isNeighbour(URWellStrip strip){ + public boolean isNeighbour(URWRStrip strip){ if(strip.getDescriptor().getSector()==this.desc.getSector()&& strip.getDescriptor().getLayer()==this.desc.getLayer()){ int s1 = strip.getDescriptor().getComponent(); @@ -145,13 +145,13 @@ public boolean isNeighbour(URWellStrip strip){ return false; } - public boolean isInTime(URWellStrip strip) { - return Math.abs(this.getTime() - strip.getTime()) < URWellConstants.COINCTIME; + public boolean isInTime(URWRStrip strip) { + return Math.abs(this.getTime() - strip.getTime()) < URWTConstants.COINCTIME; } @Override public int compareTo(Object o) { - URWellStrip ob = (URWellStrip) o; + URWRStrip ob = (URWRStrip) o; if(ob.getDescriptor().getSector() < this.desc.getSector()) return 1; if(ob.getDescriptor().getSector() > this.desc.getSector()) return -1; if(ob.getDescriptor().getLayer() < this.desc.getLayer()) return 1; @@ -161,14 +161,14 @@ public int compareTo(Object o) { return -1; } - public static List getStrips(DataEvent event, URWellStripFactory factory, ConstantsManager ccdb) { + public static List getStrips(DataEvent event, URWTStripFactory factory, ConstantsManager ccdb) { - List strips = new ArrayList<>(); + List strips = new ArrayList<>(); - if(event.hasBank("URWELL::adc")){ - RawDataBank bank = new RawDataBank("URWELL::adc"); + if(event.hasBank("URWT::adc")){ + RawDataBank bank = new RawDataBank("URWT::adc"); bank.read(event); - //DataBank bank = event.getBank("URWELL::adc"); + //DataBank bank = event.getBank("URWT::adc"); for(int i = 0; i < bank.rows(); i++){ int sector = bank.getByte("sector", i); int layer = bank.getByte("layer", i); @@ -176,19 +176,19 @@ public static List getStrips(DataEvent event, URWellStripFactory fa int adc = bank.getInt("ADC", i); double time = bank.getFloat("time", i); - URWellStrip strip = new URWellStrip(sector, layer, comp); + URWRStrip strip = new URWRStrip(sector, layer, comp); // strip.setTriggerPhase(triggerPhase); strip.setId(bank.trueIndex(i)+1); strip.setADC(adc); strip.setTDC((int) time); - strip.setEnergy(strip.ADC*URWellConstants.ADCTOENERGY); - strip.setTime(strip.TDC*URWellConstants.TDCTOTIME); + strip.setEnergy(strip.ADC*URWTConstants.ADCTOENERGY); + strip.setTime(strip.TDC*URWTConstants.TDCTOTIME); strip.setLine(factory.getStrip(sector, layer, comp)); - strip.setChamber(factory.getChamberIndex(comp)+1); +// strip.setChamber(factory.getChamberIndex(comp)+1); strip.setStatus(0); - if(strip.getEnergy()>URWellConstants.THRESHOLD) strips.add(strip); + if(strip.getEnergy()>URWTConstants.THRESHOLD) strips.add(strip); } } diff --git a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellCluster.java b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTCluster.java similarity index 83% rename from reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellCluster.java rename to reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTCluster.java index 8f5987754f..683d8bd2a7 100644 --- a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellCluster.java +++ b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTCluster.java @@ -1,4 +1,4 @@ -package org.jlab.service.urwell; +package org.jlab.service.urwt; import java.util.ArrayList; import java.util.List; @@ -8,20 +8,20 @@ import org.jlab.geom.prim.Point3D; /** - * URWell in-layer cluster + * URWT in-layer cluster * * @author bondi, devita */ -public class URWellCluster extends ArrayList { +public class URWTCluster extends ArrayList { - private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.URWELL); + private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.URWT); private int id; private Line3D clusterLine = new Line3D(); public int indexMaxStrip = -1; private byte clusterStatus = 1; - public URWellCluster(URWellStrip strip){ + public URWTCluster(URWRStrip strip){ this.desc.setSectorLayerComponent(strip.getDescriptor().getSector(), strip.getDescriptor().getLayer(), 0); this.add(strip); @@ -53,7 +53,7 @@ public int getChamber() { public double getEnergy(){ double energy = 0.0; - for(URWellStrip strip : this){ + for(URWRStrip strip : this){ energy += strip.getEnergy(); } return energy; @@ -61,7 +61,7 @@ public double getEnergy(){ public double getTime(){ double time = 0.0; - for(URWellStrip strip : this){ + for(URWRStrip strip : this){ time += strip.getTime()*strip.getEnergy(); } time /= this.getEnergy(); @@ -75,7 +75,7 @@ public double getSeedTime(){ return 0.0; } - public URWellStrip getSeedStrip() { + public URWRStrip getSeedStrip() { return this.get(this.indexMaxStrip); } @@ -83,8 +83,8 @@ public int getMaxStrip(){ return this.get(this.indexMaxStrip).getDescriptor().getComponent(); } - public boolean addStrip(URWellStrip strip){ - for(URWellStrip s : this){ + public boolean addStrip(URWRStrip strip){ + for(URWRStrip s : this){ if(s.isNeighbour(strip)){ this.add(strip); if(strip.getEnergy()>this.get(indexMaxStrip).getEnergy()){ @@ -99,7 +99,7 @@ public boolean addStrip(URWellStrip strip){ public int getADC(){ int adc = 0; - for(URWellStrip s : this){ + for(URWRStrip s : this){ adc+= s.getADC(); } return adc; @@ -111,7 +111,7 @@ public int getADC(){ public void setClusterId(int id){ this.id = id; - for(URWellStrip strip : this){ + for(URWRStrip strip : this){ strip.setClusterId(id); } } @@ -155,20 +155,20 @@ public void redoClusterLine(){ } - public static List createClusters(List stripList){ + public static List createClusters(List stripList){ - List clusterList = new ArrayList<>(); + List clusterList = new ArrayList<>(); if(!stripList.isEmpty()){ for(int loop = 0; loop < stripList.size(); loop++){ //Loop over all strips boolean stripAdded = false; - for(URWellCluster cluster : clusterList) { + for(URWTCluster cluster : clusterList) { if(cluster.addStrip(stripList.get(loop))){ //Add adjacent strip to newly seeded peak stripAdded = true; } } if(!stripAdded){ - URWellCluster newPeak = new URWellCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak + URWTCluster newPeak = new URWTCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak clusterList.add(newPeak); } } @@ -180,9 +180,9 @@ public static List createClusters(List stripList){ return clusterList; } - public static List getClusters(List clusters, int sector, int layer) { - List selectedClusters = new ArrayList<>(); - for(URWellCluster cluster : clusters) { + public static List getClusters(List clusters, int sector, int layer) { + List selectedClusters = new ArrayList<>(); + for(URWTCluster cluster : clusters) { if(cluster.getSector()==sector && cluster.getLayer()==layer) selectedClusters.add(cluster); } @@ -196,7 +196,7 @@ public String toString(){ this.desc.getSector(),this.desc.getLayer(), this.getEnergy())); str.append(this.clusterLine.toString()); str.append("\n"); - for(URWellStrip strip : this){ + for(URWRStrip strip : this){ str.append("\t\t"); str.append(strip.toString()); str.append("\n"); diff --git a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellConstants.java b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTConstants.java similarity index 93% rename from reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellConstants.java rename to reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTConstants.java index a825418809..09d657ab75 100644 --- a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellConstants.java +++ b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTConstants.java @@ -1,10 +1,10 @@ -package org.jlab.service.urwell; +package org.jlab.service.urwt; /** * * @author bondi, devita */ -public class URWellConstants { +public class URWTConstants { // geometry diff --git a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellCross.java b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTCross.java similarity index 72% rename from reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellCross.java rename to reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTCross.java index 90fa1d2c4f..758c83ca03 100644 --- a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellCross.java +++ b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTCross.java @@ -1,4 +1,4 @@ -package org.jlab.service.urwell; +package org.jlab.service.urwt; import java.util.ArrayList; import java.util.List; @@ -10,7 +10,7 @@ * URWell V-W clusters * @author devita */ -public class URWellCross { +public class URWTCross { private int id; @@ -28,7 +28,7 @@ public class URWellCross { - public URWellCross(URWellCluster c1, URWellCluster c2) { + public URWTCross(URWTCluster c1, URWTCluster c2) { Vector3D dir = c1.getLine().direction().cross(c2.getLine().direction()); Plane3D plane = new Plane3D(c1.getLine().origin(), c1.getLine().direction().cross(dir)); @@ -36,7 +36,7 @@ public URWellCross(URWellCluster c1, URWellCluster c2) { int nint = plane.intersectionSegment(c2.getLine(), point); if(nint==1) { this.sector = c1.getSector(); - this.region = (c1.getLayer()-1)/(URWellConstants.NLAYER/URWellConstants.NREGION)+1; + this.region = (c1.getLayer()-1)/(URWTConstants.NLAYER/URWTConstants.NREGION)+1; this.cross = point; this.energy = c1.getEnergy() + c2.getEnergy(); this.time = (c1.getTime() + c2.getTime())/2; @@ -89,20 +89,20 @@ public int getStatus() { return status; } - public static List createCrosses(List clusters) { + public static List createCrosses(List clusters) { - List crosses = new ArrayList<>(); + List crosses = new ArrayList<>(); - for(int is=0; is clustersV = URWellCluster.getClusters(clusters, is+1, (URWellConstants.NLAYER/URWellConstants.NREGION)*ir+1); - List clustersW = URWellCluster.getClusters(clusters, is+1, (URWellConstants.NLAYER/URWellConstants.NREGION)*ir+2); + for(int is=0; is clustersV = URWTCluster.getClusters(clusters, is+1, (URWTConstants.NLAYER/URWTConstants.NREGION)*ir+1); + List clustersW = URWTCluster.getClusters(clusters, is+1, (URWTConstants.NLAYER/URWTConstants.NREGION)*ir+2); - for(URWellCluster v : clustersV) { - for(URWellCluster w : clustersW) { + for(URWTCluster v : clustersV) { + for(URWTCluster w : clustersW) { if(v.getChamber()==w.getChamber()) { - URWellCross cross = new URWellCross(v, w); + URWTCross cross = new URWTCross(v, w); if(cross.point()!=null) crosses.add(cross); cross.setId(crosses.size()); } diff --git a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellEngine.java b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java similarity index 80% rename from reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellEngine.java rename to reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java index fcb53c5ad1..de555dbf26 100644 --- a/reconstruction/urwell/src/main/java/org/jlab/service/urwell/URWellEngine.java +++ b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java @@ -1,4 +1,4 @@ -package org.jlab.service.urwell; +package org.jlab.service.urwt; import java.util.List; import java.util.Optional; @@ -8,7 +8,7 @@ import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.detector.base.DetectorType; import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.detector.geant4.v2.URWELL.URWellStripFactory; +import org.jlab.detector.geant4.v2.MPGD.URWT.URWTStripFactory; import org.jlab.geom.prim.Point3D; import org.jlab.groot.data.H1F; import org.jlab.groot.fitter.DataFitter; @@ -21,18 +21,18 @@ /** * - * URWell reconstruction engine + * URWT reconstruction engine * * @author bondi, devita */ -public class URWellEngine extends ReconstructionEngine { +public class URWTEngine extends ReconstructionEngine { - public static Logger LOGGER = Logger.getLogger(URWellEngine.class.getName()); + public static Logger LOGGER = Logger.getLogger(URWTEngine.class.getName()); - public static URWellStripFactory factory = new URWellStripFactory(); + public URWTStripFactory factory = null; - public URWellEngine() { - super("URWell","bondi","1.0"); + public URWTEngine() { + super("URWT","bondi","1.0"); } @Override @@ -40,14 +40,14 @@ public boolean init() { // init ConstantsManager to read constants from CCDB String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); - DatabaseConstantProvider cp = new DatabaseConstantProvider(11, variationName); - factory.init(cp, false, URWellConstants.NREGION); + + factory = new URWTStripFactory(11, variationName); // register output banks for drop option - this.registerOutputBank("URWELL::hits"); - this.registerOutputBank("URWELL::clusters"); - this.registerOutputBank("URWELL::crosses"); + this.registerOutputBank("URWT::hits"); + this.registerOutputBank("URWT::clusters"); + this.registerOutputBank("URWT::crosses"); - LOGGER.log(Level.INFO, "--> URWells are ready..."); + LOGGER.log(Level.INFO, "--> URWTs are ready..."); return true; } @@ -57,9 +57,9 @@ public boolean init() { @Override public boolean processDataEvent(DataEvent event) { - List strips = URWellStrip.getStrips(event, factory, this.getConstantsManager()); - List clusters = URWellCluster.createClusters(strips); - List crosses = URWellCross.createCrosses(clusters); + List strips = URWRStrip.getStrips(event, factory, this.getConstantsManager()); + List clusters = URWTCluster.createClusters(strips); + List crosses = URWTCross.createCrosses(clusters); this.writeHipoBanks(event, strips, clusters, crosses); @@ -68,11 +68,11 @@ public boolean processDataEvent(DataEvent event) { private void writeHipoBanks(DataEvent de, - List strips, - List clusters, - List crosses){ + List strips, + List clusters, + List crosses){ - DataBank bankS = de.createBank("URWELL::hits", strips.size()); + DataBank bankS = de.createBank("URWT::hits", strips.size()); for(int h = 0; h < strips.size(); h++){ bankS.setShort("id", h, (short) strips.get(h).getId()); bankS.setByte("sector", h, (byte) strips.get(h).getDescriptor().getSector()); @@ -84,7 +84,7 @@ private void writeHipoBanks(DataEvent de, bankS.setShort("clusterId", h, (short) strips.get(h).getClusterId()); } - DataBank bankC = de.createBank("URWELL::clusters", clusters.size()); + DataBank bankC = de.createBank("URWT::clusters", clusters.size()); for(int c = 0; c < clusters.size(); c++){ bankC.setShort("id", c, (short) clusters.get(c).getId()); bankC.setByte("sector", c, (byte) clusters.get(c).get(0).getDescriptor().getSector()); @@ -102,7 +102,7 @@ private void writeHipoBanks(DataEvent de, bankC.setShort("status", c, (short) clusters.get(c).getStatus()); } - DataBank bankX = de.createBank("URWELL::crosses", crosses.size()); + DataBank bankX = de.createBank("URWT::crosses", crosses.size()); for(int c = 0; c < crosses.size(); c++){ bankX.setShort("id", c, (short) crosses.get(c).getId()); bankX.setByte("sector", c, (byte) crosses.get(c).getSector()); @@ -154,14 +154,14 @@ public static void fitGauss(H1F histo) { public static void main (String arg[]) { - URWellEngine engine = new URWellEngine(); + URWTEngine engine = new URWTEngine(); engine.init(); String input = "/Users/devita/urwell3d.hipo"; DataGroup dg = new DataGroup(3, 2); String[] axes = {"x", "y"}; - for(int il=0; il Date: Fri, 6 Feb 2026 10:55:24 -0500 Subject: [PATCH 051/190] use schema directory in dst-maker (#1094) * cleanup * upgrade dst-maker --- bin/dst-maker | 36 +++--------- .../main/java/org/jlab/io/utils/DstMaker.java | 58 +++++++++++++++++++ .../org/jlab/clas/reco/EngineProcessor.java | 3 +- 3 files changed, 66 insertions(+), 31 deletions(-) create mode 100644 common-tools/clas-io/src/main/java/org/jlab/io/utils/DstMaker.java diff --git a/bin/dst-maker b/bin/dst-maker index 81aca6fac8..5727ba619b 100755 --- a/bin/dst-maker +++ b/bin/dst-maker @@ -1,32 +1,10 @@ -#!/bin/sh +#!/bin/bash -usage="\nUsage: dst-maker -o outputfile inputfile [inputfile [...]]\n" +. `dirname $0`/../libexec/env.sh -if [ "$#" -lt 3 ]; then - echo -e $usage - exit -elif [ "$1" != "-o" ]; then - echo -e $usage - exit -elif [ -e $2 ]; then - echo -e $usage - echo File already exists: $2 - exit -else - for x in ${@:3} - do - if ! [ -e $x ]; then - echo -e $usage - echo File does not exist: $x - exit - fi - done -fi - -hipo-utils \ - -filter \ - -b 'RUN::*,RAW::epics,RAW::scaler,HEL::flip,HEL::online,REC::*,RECFT::*,MC::*' \ - -merge \ - -o $2 \ - ${@:3} +export MALLOC_ARENA_MAX=1 +java ${JAVA_OPTS-} -Xmx1280m -Xms768m -XX:+UseSerialGC \ + -cp ${COATJAVA_CLASSPATH:-''} \ + org.jlab.io.utils.DstMaker \ + $* diff --git a/common-tools/clas-io/src/main/java/org/jlab/io/utils/DstMaker.java b/common-tools/clas-io/src/main/java/org/jlab/io/utils/DstMaker.java new file mode 100644 index 0000000000..59bf88f052 --- /dev/null +++ b/common-tools/clas-io/src/main/java/org/jlab/io/utils/DstMaker.java @@ -0,0 +1,58 @@ +package org.jlab.io.utils; + +import java.io.File; +import java.nio.file.Files; +import org.jlab.io.base.DataEvent; +import org.jlab.io.hipo.HipoDataSource; +import org.jlab.io.hipo.HipoDataSync; +import org.jlab.jnp.hipo4.data.SchemaFactory; +import org.jlab.utils.options.OptionParser; +import org.jlab.utils.system.ClasUtilsFile; + +public class DstMaker { + + public static void main(String args[]) { + + OptionParser opt = new OptionParser("dst-maker"); + opt.addOption("-s","dst","schema path, or stock schema name (default=dst)"); + opt.addRequired("-o","output file"); + opt.setRequiresInputList(true); + opt.parse(args); + + HipoDataSync w = new HipoDataSync(); + w.setCompressionType(2); + + SchemaFactory schema = new SchemaFactory(); + String stock = ClasUtilsFile.getResourceDir("CLAS12DIR","etc/bankdefs/hipo4/singles"); + String user = opt.getOption("-s").stringValue(); + if (Files.isDirectory((new File(stock+"/"+user)).toPath())) { + System.out.println("Assuming -s is a stock schema: "+user); + schema.initFromDirectory(stock+"/"+user); + } + else if (Files.isDirectory((new File(user)).toPath())) { + System.out.println("Assuming -s is a schema path: "+user); + schema.initFromDirectory(user); + } + else { + System.err.println("Unable to initialize schema from -s "+user); + System.exit(2); + } + w.open(opt.getOption("-o").stringValue()); + + for (String input : opt.getInputList()) { + HipoDataSource r = new HipoDataSource(); + r.open(input); + while (r.hasEvent()) { + DataEvent e = r.getNextEvent(); + for (String name : e.getBankList()) { + if (!schema.hasSchema(name)) { + e.removeBank(name); + } + } + w.writeEvent(e); + } + r.close(); + } + w.close(); + } +} 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 57b60fb0b4..a389302475 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 @@ -312,7 +312,6 @@ public void processFile(HipoDataSource reader, HipoDataSync writer, int skipEven progress.updateStatus(); } progress.showStatus(); - writer.close(); } public void processFile(EvioSource reader, HipoDataSync writer, int skipEvents, int maxEvents) { @@ -335,7 +334,6 @@ public void processFile(EvioSource reader, HipoDataSync writer, int skipEvents, progress.updateStatus(); } progress.showStatus(); - writer.close(); } /**} @@ -360,6 +358,7 @@ public void processFile(String input, String output, int nskip, int nevents) { writer.open(output); processFile(reader, writer, nskip, nevents); } + writer.close(); } /** From d6557f8f2b31136df3a183ad43f773a99883c02f Mon Sep 17 00:00:00 2001 From: Tongtong Cao Date: Fri, 6 Feb 2026 12:45:40 -0500 Subject: [PATCH 052/190] fix: transform DC covariance matrix for TB tracks at vertex from local to global (#1059) * transformation for covaraince matrix of DC TB tracks from local to global * modify banks TimeBasedTrkg::TBCovMat and TimeBasedTrkg::AICovMat to store CM in the lab frame in replacement of CM in the tilted sector frame * adapt eb to 6-dimensional covariance matrix * dsts assume symmetric covariance matrix --------- Co-authored-by: Nathan Baltzell --- .../org/jlab/clas/detector/DetectorData.java | 11 +-- .../org/jlab/clas/detector/DetectorTrack.java | 2 +- .../clas/tracking/utilities/MatrixOps.java | 2 +- etc/bankdefs/hipo4/dc.json | 65 +++++++------ etc/bankdefs/hipo4/dcnn.json | 65 +++++++------ etc/bankdefs/hipo4/event-ai.json | 36 +++++--- etc/bankdefs/hipo4/event.json | 36 +++++--- .../java/org/jlab/rec/dc/banks/Banks.java | 2 +- .../org/jlab/rec/dc/banks/RecoBankWriter.java | 79 ++++++++++------ .../java/org/jlab/rec/dc/track/Track.java | 91 +++++++++++++++++++ .../java/org/jlab/service/dc/DCTBEngine.java | 12 ++- 11 files changed, 272 insertions(+), 129 deletions(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorData.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorData.java index e86250b8cd..d0228a11c2 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorData.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorData.java @@ -521,12 +521,9 @@ public static DataBank getCovMatrixBank(List particles, DataEv } bank.setShort("index", row, (short) p.getTrackIndex()); bank.setShort("pindex", row, (short) i); - for (int ii = 0; ii < 5; ii++) { - for (int jj = 0; jj < 5; jj++) { + for (int ii = 0; ii < 6; ii++) { + for (int jj = ii; jj < 6; jj++) { String varName = String.format("C%d%d", ii + 1, jj + 1); - if (bank.getDescriptor().hasEntry(varName) != true) { - continue; - } bank.setFloat(varName, row, p.getCovMatrix(ii, jj)); } } @@ -595,13 +592,13 @@ public static List readDetectorTracks(DataEvent event, String ban } } if (covBank != null) { - final int dimCovMat = 5; + final int dimCovMat = 6; for (int ii = 0; ii < covBank.rows(); ii++) { if (covBank.getInt("id", ii) != trkId) { continue; } for (int jj = 1; jj <= dimCovMat; jj++) { - for (int kk = 1; kk <= dimCovMat; kk++) { + for (int kk = jj; kk <= dimCovMat; kk++) { float ele = covBank.getFloat(String.format("C%d%d", jj, kk), ii); track.setCovMatrix(jj - 1, kk - 1, ele); } diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorTrack.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorTrack.java index 8de565b98a..75da99294b 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorTrack.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorTrack.java @@ -134,7 +134,7 @@ public int size() { private Vector3 trackP = new Vector3(); private Vector3 trackVertex = new Vector3(); - private float[][] covMatrix = new float[5][5]; + private float[][] covMatrix = new float[6][6]; private List trackCrosses = new ArrayList<>(); private Trajectory trajectory=new Trajectory(); diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/utilities/MatrixOps.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/utilities/MatrixOps.java index c1ce8072ab..afdf17834d 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/utilities/MatrixOps.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/utilities/MatrixOps.java @@ -128,7 +128,7 @@ public double[][] MatrixTranspose(Object obj1) { for(int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { - result[i][j] = arr1[j][i]; + result[j][i] = arr1[i][j]; } } arr1 = null; diff --git a/etc/bankdefs/hipo4/dc.json b/etc/bankdefs/hipo4/dc.json index 4558300006..54ce6acbb6 100644 --- a/etc/bankdefs/hipo4/dc.json +++ b/etc/bankdefs/hipo4/dc.json @@ -529,36 +529,47 @@ "name": "TimeBasedTrkg::TBCovMat", "group": 20600, "item" : 37, - "info": "reconstructed track covariance matrix", + "info": "reconstructed track covariance matrix in lab frame", "entries": [ {"name":"id", "type":"S", "info":"id of the track"}, - {"name":"C11", "type":"F", "info":"C11 covariance matrix element at last superlayer used in the fit"}, - {"name":"C12", "type":"F", "info":"C12 covariance matrix element at last superlayer used in the fit"}, - {"name":"C13", "type":"F", "info":"C13 covariance matrix element at last superlayer used in the fit"}, - {"name":"C14", "type":"F", "info":"C14 covariance matrix element at last superlayer used in the fit"}, - {"name":"C15", "type":"F", "info":"C15 covariance matrix element at last superlayer used in the fit"}, - {"name":"C21", "type":"F", "info":"C21 covariance matrix element at last superlayer used in the fit"}, - {"name":"C22", "type":"F", "info":"C22 covariance matrix element at last superlayer used in the fit"}, - {"name":"C23", "type":"F", "info":"C23 covariance matrix element at last superlayer used in the fit"}, - {"name":"C24", "type":"F", "info":"C24 covariance matrix element at last superlayer used in the fit"}, - {"name":"C25", "type":"F", "info":"C25 covariance matrix element at last superlayer used in the fit"}, - {"name":"C31", "type":"F", "info":"C31 covariance matrix element at last superlayer used in the fit"}, - {"name":"C32", "type":"F", "info":"C32 covariance matrix element at last superlayer used in the fit"}, - {"name":"C33", "type":"F", "info":"C33 covariance matrix element at last superlayer used in the fit"}, - {"name":"C34", "type":"F", "info":"C34 covariance matrix element at last superlayer used in the fit"}, - {"name":"C35", "type":"F", "info":"C35 covariance matrix element at last superlayer used in the fit"}, - {"name":"C41", "type":"F", "info":"C41 covariance matrix element at last superlayer used in the fit"}, - {"name":"C42", "type":"F", "info":"C42 covariance matrix element at last superlayer used in the fit"}, - {"name":"C43", "type":"F", "info":"C43 covariance matrix element at last superlayer used in the fit"}, - {"name":"C44", "type":"F", "info":"C44 covariance matrix element at last superlayer used in the fit"}, - {"name":"C45", "type":"F", "info":"C45 covariance matrix element at last superlayer used in the fit"}, - {"name":"C51", "type":"F", "info":"C51 covariance matrix element at last superlayer used in the fit"}, - {"name":"C52", "type":"F", "info":"C52 covariance matrix element at last superlayer used in the fit"}, - {"name":"C53", "type":"F", "info":"C53 covariance matrix element at last superlayer used in the fit"}, - {"name":"C54", "type":"F", "info":"C54 covariance matrix element at last superlayer used in the fit"}, - {"name":"C55", "type":"F", "info":"C55 covariance matrix element at last superlayer used in the fit"} + {"name":"C11", "type":"F", "info":"var(x) at vertex in lab frame"}, + {"name":"C12", "type":"F", "info":"cov(x, y) at vertex in lab frame"}, + {"name":"C13", "type":"F", "info":"cov(x, z) at vertex in lab frame"}, + {"name":"C14", "type":"F", "info":"cov(x, p_theta) at vertex in lab frame"}, + {"name":"C15", "type":"F", "info":"cov(x, p_phi) at vertex in lab frame"}, + {"name":"C16", "type":"F", "info":"cov(x, p) at vertex in lab frame"}, + {"name":"C21", "type":"F", "info":"cov(y, x) at vertex in lab frame"}, + {"name":"C22", "type":"F", "info":"var(y) at vertex in lab frame"}, + {"name":"C23", "type":"F", "info":"cov(y, z) at vertex in lab frame"}, + {"name":"C24", "type":"F", "info":"cov(y, p_theta) at vertex in lab frame"}, + {"name":"C25", "type":"F", "info":"cov(y, p_phi) at vertex in lab frame"}, + {"name":"C26", "type":"F", "info":"cov(y, p) at vertex in lab frame"}, + {"name":"C31", "type":"F", "info":"cov(z, x) at vertex in lab frame"}, + {"name":"C32", "type":"F", "info":"cov(z, y) at vertex in lab frame"}, + {"name":"C33", "type":"F", "info":"var(z) at vertex in lab frame"}, + {"name":"C34", "type":"F", "info":"cov(z, p_theta) at vertex in lab frame"}, + {"name":"C35", "type":"F", "info":"cov(z, p_phi) at vertex in lab frame"}, + {"name":"C36", "type":"F", "info":"cov(z, p) at vertex in lab frame"}, + {"name":"C41", "type":"F", "info":"cov(p_theta, x) at vertex in lab frame"}, + {"name":"C42", "type":"F", "info":"cov(p_theta, y) at vertex in lab frame"}, + {"name":"C43", "type":"F", "info":"cov(p_theta, z) at vertex in lab frame"}, + {"name":"C44", "type":"F", "info":"var(p_theta) at vertex in lab frame"}, + {"name":"C45", "type":"F", "info":"cov(p_theta, p_phi) at vertex in lab frame"}, + {"name":"C46", "type":"F", "info":"cov(p_theta, p) at vertex in lab frame"}, + {"name":"C51", "type":"F", "info":"cov(p_phi, x) at vertex in lab frame"}, + {"name":"C52", "type":"F", "info":"cov(p_phi, y) at vertex in lab frame"}, + {"name":"C53", "type":"F", "info":"cov(p_phi, z) at vertex in lab frame"}, + {"name":"C54", "type":"F", "info":"cov(p_phi, p_theta) at vertex in lab frame"}, + {"name":"C55", "type":"F", "info":"var(p_phi) at vertex in lab frame"}, + {"name":"C56", "type":"F", "info":"cov(p_phi, p) at vertex in lab frame"}, + {"name":"C61", "type":"F", "info":"cov(p, x) at vertex in lab frame"}, + {"name":"C62", "type":"F", "info":"cov(p, y) at vertex in lab frame"}, + {"name":"C63", "type":"F", "info":"cov(p, z) at vertex in lab frame"}, + {"name":"C64", "type":"F", "info":"cov(p, p_theta) at vertex in lab frame"}, + {"name":"C65", "type":"F", "info":"cov(p, p_phi) at vertex in lab frame"}, + {"name":"C66", "type":"F", "info":"var(p) at vertex in lab frame"} ] - }, + }, { "name": "TimeBasedTrkg::Trajectory", "group": 20600, diff --git a/etc/bankdefs/hipo4/dcnn.json b/etc/bankdefs/hipo4/dcnn.json index 74276a745d..145f3cba6b 100644 --- a/etc/bankdefs/hipo4/dcnn.json +++ b/etc/bankdefs/hipo4/dcnn.json @@ -390,36 +390,47 @@ "name": "TimeBasedTrkg::AICovMat", "group": 20600, "item" : 77, - "info": "reconstructed track covariance matrix", + "info": "reconstructed track covariance matrix in lab frame", "entries": [ {"name":"id", "type":"S", "info":"id of the track"}, - {"name":"C11", "type":"F", "info":"C11 covariance matrix element at last superlayer used in the fit"}, - {"name":"C12", "type":"F", "info":"C12 covariance matrix element at last superlayer used in the fit"}, - {"name":"C13", "type":"F", "info":"C13 covariance matrix element at last superlayer used in the fit"}, - {"name":"C14", "type":"F", "info":"C14 covariance matrix element at last superlayer used in the fit"}, - {"name":"C15", "type":"F", "info":"C15 covariance matrix element at last superlayer used in the fit"}, - {"name":"C21", "type":"F", "info":"C21 covariance matrix element at last superlayer used in the fit"}, - {"name":"C22", "type":"F", "info":"C22 covariance matrix element at last superlayer used in the fit"}, - {"name":"C23", "type":"F", "info":"C23 covariance matrix element at last superlayer used in the fit"}, - {"name":"C24", "type":"F", "info":"C24 covariance matrix element at last superlayer used in the fit"}, - {"name":"C25", "type":"F", "info":"C25 covariance matrix element at last superlayer used in the fit"}, - {"name":"C31", "type":"F", "info":"C31 covariance matrix element at last superlayer used in the fit"}, - {"name":"C32", "type":"F", "info":"C32 covariance matrix element at last superlayer used in the fit"}, - {"name":"C33", "type":"F", "info":"C33 covariance matrix element at last superlayer used in the fit"}, - {"name":"C34", "type":"F", "info":"C34 covariance matrix element at last superlayer used in the fit"}, - {"name":"C35", "type":"F", "info":"C35 covariance matrix element at last superlayer used in the fit"}, - {"name":"C41", "type":"F", "info":"C41 covariance matrix element at last superlayer used in the fit"}, - {"name":"C42", "type":"F", "info":"C42 covariance matrix element at last superlayer used in the fit"}, - {"name":"C43", "type":"F", "info":"C43 covariance matrix element at last superlayer used in the fit"}, - {"name":"C44", "type":"F", "info":"C44 covariance matrix element at last superlayer used in the fit"}, - {"name":"C45", "type":"F", "info":"C45 covariance matrix element at last superlayer used in the fit"}, - {"name":"C51", "type":"F", "info":"C51 covariance matrix element at last superlayer used in the fit"}, - {"name":"C52", "type":"F", "info":"C52 covariance matrix element at last superlayer used in the fit"}, - {"name":"C53", "type":"F", "info":"C53 covariance matrix element at last superlayer used in the fit"}, - {"name":"C54", "type":"F", "info":"C54 covariance matrix element at last superlayer used in the fit"}, - {"name":"C55", "type":"F", "info":"C55 covariance matrix element at last superlayer used in the fit"} + {"name":"C11", "type":"F", "info":"var(x) at vertex in lab frame"}, + {"name":"C12", "type":"F", "info":"cov(x, y) at vertex in lab frame"}, + {"name":"C13", "type":"F", "info":"cov(x, z) at vertex in lab frame"}, + {"name":"C14", "type":"F", "info":"cov(x, p_theta) at vertex in lab frame"}, + {"name":"C15", "type":"F", "info":"cov(x, p_phi) at vertex in lab frame"}, + {"name":"C16", "type":"F", "info":"cov(x, p) at vertex in lab frame"}, + {"name":"C21", "type":"F", "info":"cov(y, x) at vertex in lab frame"}, + {"name":"C22", "type":"F", "info":"var(y) at vertex in lab frame"}, + {"name":"C23", "type":"F", "info":"cov(y, z) at vertex in lab frame"}, + {"name":"C24", "type":"F", "info":"cov(y, p_theta) at vertex in lab frame"}, + {"name":"C25", "type":"F", "info":"cov(y, p_phi) at vertex in lab frame"}, + {"name":"C26", "type":"F", "info":"cov(y, p) at vertex in lab frame"}, + {"name":"C31", "type":"F", "info":"cov(z, x) at vertex in lab frame"}, + {"name":"C32", "type":"F", "info":"cov(z, y) at vertex in lab frame"}, + {"name":"C33", "type":"F", "info":"var(z) at vertex in lab frame"}, + {"name":"C34", "type":"F", "info":"cov(z, p_theta) at vertex in lab frame"}, + {"name":"C35", "type":"F", "info":"cov(z, p_phi) at vertex in lab frame"}, + {"name":"C36", "type":"F", "info":"cov(z, p) at vertex in lab frame"}, + {"name":"C41", "type":"F", "info":"cov(p_theta, x) at vertex in lab frame"}, + {"name":"C42", "type":"F", "info":"cov(p_theta, y) at vertex in lab frame"}, + {"name":"C43", "type":"F", "info":"cov(p_theta, z) at vertex in lab frame"}, + {"name":"C44", "type":"F", "info":"var(p_theta) at vertex in lab frame"}, + {"name":"C45", "type":"F", "info":"cov(p_theta, p_phi) at vertex in lab frame"}, + {"name":"C46", "type":"F", "info":"cov(p_theta, p) at vertex in lab frame"}, + {"name":"C51", "type":"F", "info":"cov(p_phi, x) at vertex in lab frame"}, + {"name":"C52", "type":"F", "info":"cov(p_phi, y) at vertex in lab frame"}, + {"name":"C53", "type":"F", "info":"cov(p_phi, z) at vertex in lab frame"}, + {"name":"C54", "type":"F", "info":"cov(p_phi, p_theta) at vertex in lab frame"}, + {"name":"C55", "type":"F", "info":"var(p_phi) at vertex in lab frame"}, + {"name":"C56", "type":"F", "info":"cov(p_phi, p) at vertex in lab frame"}, + {"name":"C61", "type":"F", "info":"cov(p, x) at vertex in lab frame"}, + {"name":"C62", "type":"F", "info":"cov(p, y) at vertex in lab frame"}, + {"name":"C63", "type":"F", "info":"cov(p, z) at vertex in lab frame"}, + {"name":"C64", "type":"F", "info":"cov(p, p_theta) at vertex in lab frame"}, + {"name":"C65", "type":"F", "info":"cov(p, p_phi) at vertex in lab frame"}, + {"name":"C66", "type":"F", "info":"var(p) at vertex in lab frame"} ] - }, + }, { "name": "TimeBasedTrkg::AITrajectory", "group": 20600, diff --git a/etc/bankdefs/hipo4/event-ai.json b/etc/bankdefs/hipo4/event-ai.json index b5902b3667..79a32a5f38 100644 --- a/etc/bankdefs/hipo4/event-ai.json +++ b/etc/bankdefs/hipo4/event-ai.json @@ -545,21 +545,27 @@ "entries": [ {"name":"index", "type":"S", "info":"index of the track in Tracks bank"}, {"name":"pindex", "type":"S", "info":"row number in the particle bank hit is associated with"}, - {"name":"C11", "type":"F", "info":"C11 covariance matrix element at last superlayer used in the fit"}, - {"name":"C12", "type":"F", "info":"C12 covariance matrix element at last superlayer used in the fit"}, - {"name":"C13", "type":"F", "info":"C13 covariance matrix element at last superlayer used in the fit"}, - {"name":"C14", "type":"F", "info":"C14 covariance matrix element at last superlayer used in the fit"}, - {"name":"C15", "type":"F", "info":"C15 covariance matrix element at last superlayer used in the fit"}, - {"name":"C22", "type":"F", "info":"C22 covariance matrix element at last superlayer used in the fit"}, - {"name":"C23", "type":"F", "info":"C23 covariance matrix element at last superlayer used in the fit"}, - {"name":"C24", "type":"F", "info":"C24 covariance matrix element at last superlayer used in the fit"}, - {"name":"C25", "type":"F", "info":"C25 covariance matrix element at last superlayer used in the fit"}, - {"name":"C33", "type":"F", "info":"C33 covariance matrix element at last superlayer used in the fit"}, - {"name":"C34", "type":"F", "info":"C34 covariance matrix element at last superlayer used in the fit"}, - {"name":"C35", "type":"F", "info":"C35 covariance matrix element at last superlayer used in the fit"}, - {"name":"C44", "type":"F", "info":"C44 covariance matrix element at last superlayer used in the fit"}, - {"name":"C45", "type":"F", "info":"C45 covariance matrix element at last superlayer used in the fit"}, - {"name":"C55", "type":"F", "info":"C55 covariance matrix element at last superlayer used in the fit"} + {"name":"C11", "type":"F", "info":"var(x) (cm^2)"}, + {"name":"C12", "type":"F", "info":"cov(x,y)"}, + {"name":"C13", "type":"F", "info":"cov(x,z)"}, + {"name":"C14", "type":"F", "info":"cov(x,theta)"}, + {"name":"C15", "type":"F", "info":"cov(x,phi)"}, + {"name":"C16", "type":"F", "info":"cov(x,p)"}, + {"name":"C22", "type":"F", "info":"var(y) (cm^2)"}, + {"name":"C23", "type":"F", "info":"cov(y,z)"}, + {"name":"C24", "type":"F", "info":"cov(y,theta)"}, + {"name":"C25", "type":"F", "info":"cov(y,phi)"}, + {"name":"C26", "type":"F", "info":"cov(y,p)"}, + {"name":"C33", "type":"F", "info":"var(z) (cm^2)"}, + {"name":"C34", "type":"F", "info":"cov(z,theta)"}, + {"name":"C35", "type":"F", "info":"cov(z,phi)"}, + {"name":"C36", "type":"F", "info":"cov(z,p)"}, + {"name":"C44", "type":"F", "info":"var(theta) (rad^2)"}, + {"name":"C45", "type":"F", "info":"cov(theta,phi)"}, + {"name":"C46", "type":"F", "info":"cov(theta,p)"}, + {"name":"C55", "type":"F", "info":"var(phi) (rad^2)"}, + {"name":"C56", "type":"F", "info":"cov(phi,p)"}, + {"name":"C66", "type":"F", "info":"var(p) (GeV^2)"} ] }, { diff --git a/etc/bankdefs/hipo4/event.json b/etc/bankdefs/hipo4/event.json index 5f87be6520..e0e9d57fbf 100644 --- a/etc/bankdefs/hipo4/event.json +++ b/etc/bankdefs/hipo4/event.json @@ -550,21 +550,27 @@ "entries": [ {"name":"index", "type":"S", "info":"index of the track in Tracks bank"}, {"name":"pindex", "type":"S", "info":"row number in the particle bank hit is associated with"}, - {"name":"C11", "type":"F", "info":"C11 covariance matrix element at last superlayer used in the fit"}, - {"name":"C12", "type":"F", "info":"C12 covariance matrix element at last superlayer used in the fit"}, - {"name":"C13", "type":"F", "info":"C13 covariance matrix element at last superlayer used in the fit"}, - {"name":"C14", "type":"F", "info":"C14 covariance matrix element at last superlayer used in the fit"}, - {"name":"C15", "type":"F", "info":"C15 covariance matrix element at last superlayer used in the fit"}, - {"name":"C22", "type":"F", "info":"C22 covariance matrix element at last superlayer used in the fit"}, - {"name":"C23", "type":"F", "info":"C23 covariance matrix element at last superlayer used in the fit"}, - {"name":"C24", "type":"F", "info":"C24 covariance matrix element at last superlayer used in the fit"}, - {"name":"C25", "type":"F", "info":"C25 covariance matrix element at last superlayer used in the fit"}, - {"name":"C33", "type":"F", "info":"C33 covariance matrix element at last superlayer used in the fit"}, - {"name":"C34", "type":"F", "info":"C34 covariance matrix element at last superlayer used in the fit"}, - {"name":"C35", "type":"F", "info":"C35 covariance matrix element at last superlayer used in the fit"}, - {"name":"C44", "type":"F", "info":"C44 covariance matrix element at last superlayer used in the fit"}, - {"name":"C45", "type":"F", "info":"C45 covariance matrix element at last superlayer used in the fit"}, - {"name":"C55", "type":"F", "info":"C55 covariance matrix element at last superlayer used in the fit"} + {"name":"C11", "type":"F", "info":"var(x) (cm^2)"}, + {"name":"C12", "type":"F", "info":"cov(x,y)"}, + {"name":"C13", "type":"F", "info":"cov(x,z)"}, + {"name":"C14", "type":"F", "info":"cov(x,theta)"}, + {"name":"C15", "type":"F", "info":"cov(x,phi)"}, + {"name":"C16", "type":"F", "info":"cov(x,p)"}, + {"name":"C22", "type":"F", "info":"var(y) (cm^2)"}, + {"name":"C23", "type":"F", "info":"cov(y,z)"}, + {"name":"C24", "type":"F", "info":"cov(y,theta)"}, + {"name":"C25", "type":"F", "info":"cov(y,phi)"}, + {"name":"C26", "type":"F", "info":"cov(y,p)"}, + {"name":"C33", "type":"F", "info":"var(z) (cm^2)"}, + {"name":"C34", "type":"F", "info":"cov(z,theta)"}, + {"name":"C35", "type":"F", "info":"cov(z,phi)"}, + {"name":"C36", "type":"F", "info":"cov(z,p)"}, + {"name":"C44", "type":"F", "info":"var(theta) (rad^2)"}, + {"name":"C45", "type":"F", "info":"cov(theta,phi)"}, + {"name":"C46", "type":"F", "info":"cov(theta,p)"}, + {"name":"C55", "type":"F", "info":"var(phi) (rad^2)"}, + {"name":"C56", "type":"F", "info":"cov(phi,p)"}, + {"name":"C66", "type":"F", "info":"var(p) (GeV^2)"} ] }, { diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/Banks.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/Banks.java index aac1368be3..b677dd8f90 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/Banks.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/Banks.java @@ -136,7 +136,7 @@ public String getTrajBank() { public String getCovmatBank() { return this.getOutputBank("CovMat"); - } + } public String getRecEventBank() { return this.getRecBank("Event"); diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java index 529be90740..01e734df15 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java @@ -446,50 +446,69 @@ public DataBank fillHBTracksBank(DataEvent event, List candlist) { public DataBank fillHBTrajectoryBank(DataEvent event, List candlist) { return this.fillTrajectoryBank(event, candlist); } - + /** * * @param event hipo event * @param candlist tracks - * @return covariance matrix from HB fits to be used for starting TB tracking + * @return covariance matrix for momentum and vertex in lab frame */ - private DataBank fillTrackCovMatBank(DataEvent event, List candlist) { + private DataBank fillTrackCovMatLabBank(DataEvent event, List candlist) { DataBank bank = event.createBank(bankNames.getCovmatBank(), candlist.size()); for (int i = 0; i < candlist.size(); i++) { bank.setShort("id", i, (short) candlist.get(i).get_Id()); - if(candlist.get(i).get_CovMat()!=null) { - bank.setFloat("C11", i, (float) candlist.get(i).get_CovMat().get(0, 0)); - bank.setFloat("C12", i, (float) candlist.get(i).get_CovMat().get(0, 1)); - bank.setFloat("C13", i, (float) candlist.get(i).get_CovMat().get(0, 2)); - bank.setFloat("C14", i, (float) candlist.get(i).get_CovMat().get(0, 3)); - bank.setFloat("C15", i, (float) candlist.get(i).get_CovMat().get(0, 4)); - bank.setFloat("C21", i, (float) candlist.get(i).get_CovMat().get(1, 0)); - bank.setFloat("C22", i, (float) candlist.get(i).get_CovMat().get(1, 1)); - bank.setFloat("C23", i, (float) candlist.get(i).get_CovMat().get(1, 2)); - bank.setFloat("C24", i, (float) candlist.get(i).get_CovMat().get(1, 3)); - bank.setFloat("C25", i, (float) candlist.get(i).get_CovMat().get(1, 4)); - bank.setFloat("C31", i, (float) candlist.get(i).get_CovMat().get(2, 0)); - bank.setFloat("C32", i, (float) candlist.get(i).get_CovMat().get(2, 1)); - bank.setFloat("C33", i, (float) candlist.get(i).get_CovMat().get(2, 2)); - bank.setFloat("C34", i, (float) candlist.get(i).get_CovMat().get(2, 3)); - bank.setFloat("C35", i, (float) candlist.get(i).get_CovMat().get(2, 4)); - bank.setFloat("C41", i, (float) candlist.get(i).get_CovMat().get(3, 0)); - bank.setFloat("C42", i, (float) candlist.get(i).get_CovMat().get(3, 1)); - bank.setFloat("C43", i, (float) candlist.get(i).get_CovMat().get(3, 2)); - bank.setFloat("C44", i, (float) candlist.get(i).get_CovMat().get(3, 3)); - bank.setFloat("C45", i, (float) candlist.get(i).get_CovMat().get(3, 4)); - bank.setFloat("C51", i, (float) candlist.get(i).get_CovMat().get(4, 0)); - bank.setFloat("C52", i, (float) candlist.get(i).get_CovMat().get(4, 1)); - bank.setFloat("C53", i, (float) candlist.get(i).get_CovMat().get(4, 2)); - bank.setFloat("C54", i, (float) candlist.get(i).get_CovMat().get(4, 3)); - bank.setFloat("C55", i, (float) candlist.get(i).get_CovMat().get(4, 4)); + if(candlist.get(i).get_CMInLab()!=null) { + double[][] CM = candlist.get(i).get_CMInLab(); + bank.setFloat("C11", i, (float) CM[0][0]); + bank.setFloat("C12", i, (float) CM[0][1]); + bank.setFloat("C13", i, (float) CM[0][2]); + bank.setFloat("C14", i, (float) CM[0][3]); + bank.setFloat("C15", i, (float) CM[0][4]); + bank.setFloat("C16", i, (float) CM[0][5]); + + bank.setFloat("C21", i, (float) CM[1][0]); + bank.setFloat("C22", i, (float) CM[1][1]); + bank.setFloat("C23", i, (float) CM[1][2]); + bank.setFloat("C24", i, (float) CM[1][3]); + bank.setFloat("C25", i, (float) CM[1][4]); + bank.setFloat("C26", i, (float) CM[1][5]); + + bank.setFloat("C31", i, (float) CM[2][0]); + bank.setFloat("C32", i, (float) CM[2][1]); + bank.setFloat("C33", i, (float) CM[2][2]); + bank.setFloat("C34", i, (float) CM[2][3]); + bank.setFloat("C35", i, (float) CM[2][4]); + bank.setFloat("C36", i, (float) CM[2][5]); + + bank.setFloat("C41", i, (float) CM[3][0]); + bank.setFloat("C42", i, (float) CM[3][1]); + bank.setFloat("C43", i, (float) CM[3][2]); + bank.setFloat("C44", i, (float) CM[3][3]); + bank.setFloat("C45", i, (float) CM[3][4]); + bank.setFloat("C46", i, (float) CM[3][5]); + + bank.setFloat("C51", i, (float) CM[4][0]); + bank.setFloat("C52", i, (float) CM[4][1]); + bank.setFloat("C53", i, (float) CM[4][2]); + bank.setFloat("C54", i, (float) CM[4][3]); + bank.setFloat("C55", i, (float) CM[4][4]); + bank.setFloat("C56", i, (float) CM[4][5]); + + bank.setFloat("C61", i, (float) CM[5][0]); + bank.setFloat("C62", i, (float) CM[5][1]); + bank.setFloat("C63", i, (float) CM[5][2]); + bank.setFloat("C64", i, (float) CM[5][3]); + bank.setFloat("C65", i, (float) CM[5][4]); + bank.setFloat("C66", i, (float) CM[5][5]); + } } //bank.show(); return bank; } + /** * * @param event the EvioEvent @@ -939,7 +958,7 @@ public void fillAllTBBanks(DataEvent event, List fhits, List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); @@ -306,9 +307,10 @@ public boolean processDataEvent(DataEvent event) { continue; } - // get CovMat at vertex - Point3D VTCS = crosses.get(0).getCoordsInTiltedSector(TrackArray1.get_Vtx0().x(), TrackArray1.get_Vtx0().y(), TrackArray1.get_Vtx0().z()); - TrackArray1.set_CovMat(kFZRef.propagateToVtx(crosses.get(0).get_Sector(), VTCS.z())); + // get CovMat at vertex + Point3D VTCS = TrackArray1.get(TrackArray1.size()-1).getCoordsInTiltedSector(TrackArray1.get_Vtx0().x(), TrackArray1.get_Vtx0().y(), TrackArray1.get_Vtx0().z()); + TrackArray1.set_CovMat(kFZRef.propagateToVtx(TrackArray1.get(TrackArray1.size()-1).get_Sector(), VTCS.z())); + TrackArray1.transCMToGlobal(); double deltaPathToVtx = kFZRef.getDeltaPathToVtx(TrackArray1.get(TrackArray1.size()-1).get_Sector(), VTCS.z()); List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); From d4799581018c1e9c31298c29d0040ae0c15e225b Mon Sep 17 00:00:00 2001 From: Veronique Ziegler Date: Fri, 6 Feb 2026 16:54:04 -0500 Subject: [PATCH 053/190] BMT HV cut off (#1097) Co-authored-by: ziegler --- .../cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java index 46bed5aa18..ce9554514f 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java @@ -71,7 +71,7 @@ public void setDocacutsum(double docacutsum) { private boolean elossPrecorrection = true; private boolean svtSeeding = true; private boolean timeCuts = true; - private boolean hvCuts = true; + private boolean hvCuts = false; public boolean useSVTTimingCuts = false; public boolean removeOverlappingSeeds = true; public boolean flagSeeds = true; From 09b42a50b08c4eb5f4f083c201822949be67798f Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 6 Feb 2026 18:29:47 -0500 Subject: [PATCH 054/190] build: bump version number to 13.7.0 (#1098) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 331 insertions(+), 331 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 518ba74fa8..0d1ad3ccb8 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 9fa50903d7..4452570f9a 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 4905aae57a..3853916231 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar cnuphys swimmer - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 4dd9ae43ad..21484e9ecf 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-logging - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 3054579699..0f4e6d7022 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index ae16a50a80..70b41a6b4a 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 9c8781f805..6247bb4f9f 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index d28d4b5ea8..3bac5a595c 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index d8d24f8ad7..3d0019dc74 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 380fcdf677..7dd79bd5c1 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index e3f480a7f7..30e803cdef 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys swimmer - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 7f8058382e..5634bffc0d 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 5cfba500f8..b7f80ec74f 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index bbd72f1cb8..8d494872b6 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar cnuphys clas12 - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 31b79f659a..13e80db741 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT pom org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index dbcb9f6855..248cb77c51 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar cnuphys clas12 - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 26260d3f96..ac70bd5373 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar cnuphys clas12 - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 5154cf3e77..3f93373dda 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar cnuphys clas12 - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys splot - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 7ca06c9261..e677ce799b 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clara-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-logging - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-math - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-tracking - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-decay-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys snr - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 79ef4ba95c..e840983921 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT pom org.jlab.clas coatjava - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index cfcf003ea7..ad267d7634 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas common-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys swimmer - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/pom.xml b/pom.xml index 33e3d0dfe2..75403d19eb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 459e98bd5f..15bc439eae 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 5321d83885..da37a38210 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 69d58032d5..5f0d743bd6 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 6bf57553ed..b003f52081 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 354a71aafa..45f08aad8d 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 23afd9471c..8f0f0784f3 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index b5d823706a..848d1be668 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index d5fb20a40d..ce6e005afb 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test org.jlab.clas clas-math - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys snr - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index fe59a67b71..19bb016cd3 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index ef9f5a74e1..092b1e64c2 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT test org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 37879bffd8..0c2767ca6e 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 8b45585f48..11170a70bd 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 88da655d1c..58c26d7795 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 9e7e005f55..16c903e9b1 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index cf2c5ef50d..bdc70318f1 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 2a6f1a3bde..8c230111a3 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 8f9c443280..392e2b1c7d 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT pom org.jlab.clas coatjava - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index e271b83750..226316fc99 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-analysis - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index 942902b427..d6d68befea 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index d727eebc9c..000728e92f 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index de429aaf1e..eeedba524f 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index c1cac41e0a..6afcc4de59 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT cnuphys magfield - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-tracking - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index b68cec7045..299f7d38ba 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 351efd92ef..a256be6056 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-physics - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-utils - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 4a058946ca..8e82e5d469 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index 6baba51d51..bdbd74fdfb 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index a75c9fc9f1..0eaedb8d42 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas swim-tools - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT jar cnuphys swimmer - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-reco - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-io - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT org.jlab.clas clas-geometry - 13.6.0-SNAPSHOT + 13.7.0-SNAPSHOT From 9825f60d6e6fef86166e73fe9f1f02f6ea6e07d4 Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Mon, 9 Feb 2026 21:16:09 +0100 Subject: [PATCH 055/190] Move Kalman Filter in ALERT engine (#1100) * set trackid before the kalman filter * define Niter and the particle type as attributes of the Kalman Filter, make propagation public * remove redundant attributes with _kf extension * move the Kalman Filter in ALERTEngine * add method to set Niter and the particle type * update the AHDC::hits bank, fill residuals * cleaning * uncomment atof part --- .../jlab/rec/ahdc/Banks/RecoBankWriter.java | 19 ++-- .../rec/ahdc/KalmanFilter/KalmanFilter.java | 25 +++-- .../java/org/jlab/rec/ahdc/Track/Track.java | 57 +---------- .../org/jlab/service/ahdc/AHDCEngine.java | 19 +--- .../org/jlab/service/alert/ALERTEngine.java | 97 +++++++++++++++++-- 5 files changed, 121 insertions(+), 96 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java index 6adf5a1ce4..5c32ecf73b 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java @@ -120,6 +120,7 @@ public DataBank fillAHDCTrackBank(DataEvent event, ArrayList tracks) { return bank; } + /// Here the relavant informations of the tracks are filled in the Kalman Filter public DataBank fillAHDCKFTrackBank(DataEvent event, ArrayList tracks) { DataBank bank = event.createBank("AHDC::kftrack", tracks.size()); @@ -128,12 +129,12 @@ public DataBank fillAHDCKFTrackBank(DataEvent event, ArrayList tracks) { for (Track track : tracks) { if (track == null) continue; - double x = track.getX0_kf(); - double y = track.getY0_kf(); - double z = track.getZ0_kf(); - double px = track.getPx0_kf(); - double py = track.getPy0_kf(); - double pz = track.getPz0_kf(); + double x = track.get_X0(); + double y = track.get_Y0(); + double z = track.get_Z0(); + double px = track.get_px(); + double py = track.get_py(); + double pz = track.get_pz(); bank.setInt("trackid", row, (int) track.get_trackId()); bank.setFloat("x", row, (float) x); @@ -144,9 +145,9 @@ public DataBank fillAHDCKFTrackBank(DataEvent event, ArrayList tracks) { bank.setFloat("pz", row, (float) pz); bank.setInt("n_hits", row, (int) track.get_n_hits()); bank.setInt("sum_adc", row, (int) track.get_sum_adc()); - bank.setFloat("path", row, (float) track.get_path_kf()); - bank.setFloat("dEdx", row, (float) track.get_dEdx_kf()); - bank.setFloat("p_drift", row, (float) track.get_p_drift_kf()); + bank.setFloat("path", row, (float) track.get_path()); + bank.setFloat("dEdx", row, (float) track.get_dEdx()); + bank.setFloat("p_drift", row, (float) track.get_p_drift()); bank.setFloat("chi2", row, (float) track.get_chi2()); bank.setFloat("sum_residuals", row, (float) track.get_sum_residuals()); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java index 4d2840ee73..272857efbd 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java @@ -29,21 +29,23 @@ */ public class KalmanFilter { + public KalmanFilter(PDGParticle particle, int Niter) {this.particle = particle; this.Niter = Niter;} + public KalmanFilter(ArrayList tracks, DataEvent event, final double magfield, boolean IsMC) {propagation(tracks, event, magfield, IsMC);} - private final int Niter = 40; // number of iterations for the Kalman Filter + private PDGParticle particle; + private int Niter = 40; // number of iterations for the Kalman Filter private boolean IsVtxDefined = false; // implemented but not used yet private double[] vertex_resolutions = {0.09, 1e10}; // {error in r squared in mm^2, error in z squared in mm^2} // mm, CLAS and AHDC don't necessary have the same alignement (ZERO), this parameter may be subject to calibration private double clas_alignement = -54; - private void propagation(ArrayList tracks, DataEvent event, final double magfield, boolean IsMC) { + public void propagation(ArrayList tracks, DataEvent event, final double magfield, boolean IsMC) { try { double vz_constraint = 0; // to be linked to the electron vertex // Initialization --------------------------------------------------------------------- - final PDGParticle proton = PDGDatabase.getParticleById(2212); final int numberOfVariables = 6; final double tesla = 0.001; final double[] B = {0.0, 0.0, magfield / 10 * tesla}; @@ -74,10 +76,7 @@ private void propagation(ArrayList tracks, DataEvent event, final double } // Loop over tracks - int trackId = 0; for (Track track : tracks) { - trackId++; - track.set_trackId(trackId); // Initialize state vector double x0 = 0.0; double y0 = 0.0; @@ -93,7 +92,7 @@ private void propagation(ArrayList tracks, DataEvent event, final double // Start propagation Stepper stepper = new Stepper(y); - RungeKutta4 RK4 = new RungeKutta4(proton, numberOfVariables, B); + RungeKutta4 RK4 = new RungeKutta4(particle, numberOfVariables, B); Propagator propagator = new Propagator(RK4); // Initialization of the Kalman Fitter @@ -139,7 +138,7 @@ private void propagation(ArrayList tracks, DataEvent event, final double RealVector x_out = TrackFitter.getStateEstimationVector(); - track.setPositionAndMomentumForKF(x_out); + track.setPositionAndMomentumVec(x_out.toArray()); // Post fit propagation (no correction) to set the residuals KFitter PostFitPropagator = new KFitter(TrackFitter.getStateEstimationVector(), initialErrorCovariance, new Stepper(TrackFitter.getStateEstimationVector().toArray()), new Propagator(RK4), materialHashMap); @@ -158,7 +157,6 @@ private void propagation(ArrayList tracks, DataEvent event, final double double sum_residuals = 0; double chi2 = 0; for (Hit hit : AHDC_hits) { - hit.setTrackId(trackId); sum_adc += hit.getADC(); sum_residuals += hit.getResidual(); chi2 += Math.pow(hit.getResidual(),2)/hit.get_MeasurementNoise().getEntry(0,0); @@ -166,9 +164,9 @@ private void propagation(ArrayList tracks, DataEvent event, final double track.set_sum_adc(sum_adc); track.set_sum_residuals(sum_residuals); track.set_chi2(chi2/(AHDC_hits.size()-3)); - track.set_p_drift_kf(p_drift); - track.set_dEdx_kf(sum_adc/s); - track.set_path_kf(s); + track.set_p_drift(p_drift); + track.set_dEdx(sum_adc/s); + track.set_path(s); track.set_n_hits(AHDC_hits.size()); }//end of loop on track candidates } catch (Exception e) { @@ -176,5 +174,6 @@ private void propagation(ArrayList tracks, DataEvent event, final double //System.out.println("======> Kalman Filter Error"); } } - + void set_Niter(int Niter) {this.Niter = Niter;} + void set_particle(PDGParticle particle) {this.particle = particle;} } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java index 5d140c3c45..e9944b7846 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java @@ -35,16 +35,7 @@ public class Track { private double dEdx = 0; ///< deposited energy per path length (adc/mm) private double p_drift = 0; ///< momentum in the drift region (MeV) private double path = 0; ///< length of the track (mm) - // AHDC::kftrack - private double x0_kf = 0; - private double y0_kf = 0; - private double z0_kf = 0; - private double px0_kf = 0; - private double py0_kf = 0; - private double pz0_kf = 0; - private double dEdx_kf = 0; ///< deposited energy per path length (adc/mm) - private double p_drift_kf = 0; ///< momentum in the drift region (MeV) - private double path_kf = 0; ///< length of the track (mm) + // AHDC::aiprediction private int predicted_ATOF_sector = -1; private int predicted_ATOF_layer = -1; @@ -93,15 +84,6 @@ public void setPositionAndMomentumVec(double[] x) { this.pz0 = x[5]; } - public void setPositionAndMomentumForKF(RealVector x) { - this.x0_kf = x.getEntry(0); - this.y0_kf = x.getEntry(1); - this.z0_kf = x.getEntry(2); - this.px0_kf = x.getEntry(3); - this.py0_kf = x.getEntry(4); - this.pz0_kf = x.getEntry(5); - } - private void generateHitList() { for (Cluster cluster : _Clusters) { for (PreCluster preCluster : cluster.get_PreClusters_list()) { @@ -174,31 +156,6 @@ public double get_pz() { return pz0; } - public double getX0_kf() { - return x0_kf; - } - - public double getY0_kf() { - return y0_kf; - } - - public double getZ0_kf() { - return z0_kf; - } - - public double getPx0_kf() { - return px0_kf; - } - - public double getPy0_kf() { - return py0_kf; - } - - public double getPz0_kf() { - return pz0_kf; - } - - // Same for Track and KFTrack public void set_trackId(int _trackId) { trackId = _trackId; // set trackId for clusters @@ -209,6 +166,10 @@ public void set_trackId(int _trackId) { for(InterCluster interCluster : this._InterClusters) { interCluster.setTrackId(_trackId); } + // set trackId for hits + for (Hit hit : this.hits) { + hit.setTrackId(_trackId); + } } public void set_n_hits(int _n_hits) { n_hits = _n_hits;} public void set_sum_adc(int _sum_adc) { sum_adc = _sum_adc;} @@ -226,14 +187,6 @@ public void set_trackId(int _trackId) { public double get_dEdx() {return dEdx;} public double get_p_drift() {return p_drift;} public double get_path() {return path;} - - // AHDC::kftrack - public void set_dEdx_kf(double _dEdx_kf) { dEdx_kf = _dEdx_kf;} - public void set_p_drift_kf(double _p_drift_kf) { p_drift_kf = _p_drift_kf;} - public void set_path_kf(double _path_kf) { path_kf = _path_kf;} - public double get_dEdx_kf() {return dEdx_kf;} - public double get_p_drift_kf() {return p_drift_kf;} - public double get_path_kf() {return path_kf;} // AHDC::aiprediction public void set_predicted_ATOF_sector(int s) {predicted_ATOF_sector = s;} diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index b7cbb1b01c..6e55b25c88 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -15,7 +15,6 @@ import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.Hit.HitReader; import org.jlab.rec.ahdc.HoughTransform.HoughTransform; -import org.jlab.rec.ahdc.KalmanFilter.KalmanFilter; import org.jlab.rec.ahdc.KalmanFilter.MaterialMap; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; @@ -100,7 +99,7 @@ else if (Objects.equals(this.getEngineConfigString("Mode"), ModeTrackFinding.CV_ this.getConstantsManager().setVariation("default"); - this.registerOutputBank("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::kftrack","AHDC::mc","AHDC::ai:prediction"); + this.registerOutputBank("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::mc","AHDC::ai:prediction"); return true; } @@ -110,8 +109,6 @@ else if (Objects.equals(this.getEngineConfigString("Mode"), ModeTrackFinding.CV_ @Override public boolean processDataEvent(DataEvent event) { - double magfield = 50.0; // what is this? The full magnetic field strength in kGauss (factor * 50kGauss) - if(event.hasBank("MC::Particle")) simulation = true; ahdcExtractor.update(30, null, event, "AHDC::wf", "AHDC::adc"); @@ -119,7 +116,6 @@ public boolean processDataEvent(DataEvent event) { if (event.hasBank("RUN::config")) { DataBank bank = event.getBank("RUN::config"); int newRun = bank.getInt("run", 0); - float magfieldfactor = bank.getFloat("solenoid", 0); if (newRun <= 0) { LOGGER.warning("AHDCEngine: got run <= 0 in RUN::config, skipping event."); return false; @@ -130,10 +126,6 @@ public boolean processDataEvent(DataEvent event) { CalibrationConstantsLoader.Load(newRun, this.getConstantsManager()); Run = newRun; } - - /// What is this? The field value in the RUN::config bank is a scaling factor (between -1 and 1) of the full field - /// The kalman filter use the field in kG not Tesla - magfield = 50 * magfieldfactor; } @@ -222,7 +214,10 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { //AHDC_Tracks.add(new Track(AHDC_Hits)); // V) Global fit + int trackid = 0; for (Track track : AHDC_Tracks) { + trackid++; + track.set_trackId(trackid); int nbOfPoints = track.get_Clusters().size(); double[][] szPos = new double[nbOfPoints][3]; @@ -239,9 +234,6 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { track.setPositionAndMomentum(h.HelixFit(nbOfPoints, szPos, 1)); } - // VI) Kalman Filter - KalmanFilter kalmanFitter = new KalmanFilter(AHDC_Tracks, event, magfield, simulation); - // VII) Write bank RecoBankWriter writer = new RecoBankWriter(); @@ -253,7 +245,6 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { } DataBank recoClusterBank = writer.fillClustersBank(event, AHDC_Clusters); DataBank recoTracksBank = writer.fillAHDCTrackBank(event, AHDC_Tracks); - DataBank recoKFTracksBank = writer.fillAHDCKFTrackBank(event, AHDC_Tracks); ArrayList all_interclusters = new ArrayList<>(); for (Track track : AHDC_Tracks) { @@ -262,11 +253,11 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { DataBank recoInterClusterBank = writer.fillInterClusterBank(event, all_interclusters); // DataBank AIPredictionBanks = writer.fillAIPrediction(event, predictions); + //event.removeBanks("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::kftrack","AHDC::mc","AHDC::ai:prediction"); event.appendBank(recoHitsBank); event.appendBank(recoPreClusterBank); event.appendBank(recoClusterBank); event.appendBank(recoTracksBank); - event.appendBank(recoKFTracksBank); event.appendBank(recoInterClusterBank); // event.appendBank(AIPredictionBanks); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index a5cdc2518e..caeeba638f 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -1,9 +1,11 @@ package org.jlab.service.alert; +import java.io.File; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; -import java.io.File; +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.clas.swimtools.Swim; import org.jlab.detector.calib.utils.DatabaseConstantProvider; import org.jlab.geom.base.Detector; import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; @@ -11,15 +13,19 @@ import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; import org.jlab.io.hipo.HipoDataSync; - -import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.clas.swimtools.Swim; - import org.jlab.rec.alert.TrackMatchingAI.ModelTrackMatching; - import org.jlab.rec.alert.banks.RecoBankWriter; import org.jlab.rec.alert.projections.TrackProjector; import org.jlab.rec.atof.hit.ATOFHit; +import org.jlab.rec.ahdc.KalmanFilter.KalmanFilter; +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.geom.detector.alert.AHDC.AlertDCDetector; +import org.jlab.geom.detector.alert.AHDC.AlertDCFactory; +import org.jlab.rec.ahdc.Track.Track; +import org.jlab.clas.pdg.PDGDatabase; +import org.jlab.clas.pdg.PDGParticle; + + import ai.djl.util.Pair; @@ -47,6 +53,7 @@ public class ALERTEngine extends ReconstructionEngine { private RecoBankWriter rbc; Detector ATOF; // ALERT ATOF detector + private AlertDCDetector AHDC; // ALERT AHDC detector /** * Current run number being processed. @@ -87,6 +94,7 @@ public boolean init() { AlertTOFFactory factory = new AlertTOFFactory(); DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); ATOF = factory.createDetectorCLAS(cp); + AHDC = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider()); if(this.getEngineConfigString("Mode")!=null) { //if (Objects.equals(this.getEngineConfigString("Mode"), Mode.AI_Track_Finding.name())) @@ -116,9 +124,9 @@ public boolean processDataEvent(DataEvent event) { return true; } - DataBank bank = event.getBank("RUN::config"); + DataBank runBank = event.getBank("RUN::config"); - int newRun = bank.getInt("run", 0); + int newRun = runBank.getInt("run", 0); if (newRun == 0) { return true; } @@ -214,6 +222,79 @@ public boolean processDataEvent(DataEvent event) { } } rbc.appendTrackMatchingAIBank(event, matched_ATOF_hit_id); + + /////////////////////////////////////////// + /// Kalmam Filter + /// /////////////////////////////////////// + + // read the list of tracks/hits from the banks AHDC::track and AHDC::hits + if (!event.hasBank("AHDC::track")) {return false;} + DataBank trackBank = event.getBank("AHDC::track"); + DataBank hitBank = event.getBank("AHDC::hits"); + ArrayList AHDC_tracks = new ArrayList<>(); + for (int row = 0; row < trackBank.rows(); row++) { + int trackid = trackBank.getInt("trackid", row); + ArrayList AHDC_hits = new ArrayList<>(); + for (int hit_row = 0; hit_row < hitBank.rows(); hit_row++) { + if(trackid == hitBank.getInt("trackid", hit_row)) { + int id = hitBank.getShort("id", hit_row); + int superlayer = hitBank.getByte("superlayer", hit_row); + int layer = hitBank.getByte("layer", hit_row); + int wire = hitBank.getInt("wire", hit_row); + int adc = hitBank.getInt("adc", hit_row); + double doca = hitBank.getDouble("doca", hit_row); + double time = hitBank.getDouble("time", hit_row); + double tot = hitBank.getDouble("timeOverThreshold", hit_row); + // warning : adc is the calibrated one, we need the adc for the Kalman filter + Hit hit = new Hit(id, superlayer, layer, wire, doca, adc, time); + hit.setWirePosition(AHDC); + hit.setTrackId(trackid); + hit.setADC(adc); + hit.setToT(tot); + AHDC_hits.add(hit); + } + } + AHDC_tracks.add(new Track(AHDC_hits)); + // Initialise the position and the momentum using the information of the AHDC::track + // position : mm + // momentum : MeV + double x = trackBank.getFloat("x", row); + double y = trackBank.getFloat("y", row); + double z = trackBank.getFloat("z", row); + double px = trackBank.getFloat("px", row); + double py = trackBank.getFloat("py", row); + double pz = trackBank.getFloat("pz", row); + double[] vec = {x, y, z, px, py, pz}; + AHDC_tracks.get(row).setPositionAndMomentumVec(vec); + AHDC_tracks.get(row).set_trackId(trackid); + } + // intialise the Kalman Filter + double magfieldfactor = runBank.getFloat("solenoid", 0); + double magfield = 50*magfieldfactor; + boolean IsMC = event.hasBank("MC::Particle"); + PDGParticle proton = PDGDatabase.getParticleById(2212); + int Niter = 40; + KalmanFilter KF = new KalmanFilter(proton, Niter); + /////////////////////////////////////////////////////// + // first propagation : each AHDC_tracks will be fitted + /////////////////////////////////////////////////////// + KF.propagation(AHDC_tracks, event, magfield, IsMC); + ///////////////////////////////////////////// + // write the AHDC::kftrack bank in the event + ///////////////////////////////////////////// + org.jlab.rec.ahdc.Banks.RecoBankWriter ahdc_writer = new org.jlab.rec.ahdc.Banks.RecoBankWriter(); + DataBank recoKFTracksBank = ahdc_writer.fillAHDCKFTrackBank(event, AHDC_tracks); + event.appendBank(recoKFTracksBank); + // update the AHDC::hits bank : fill the residuals + event.removeBank("AHDC::hits"); + ArrayList AHDC_hits = new ArrayList<>(); + for (Track track : AHDC_tracks) { + AHDC_hits.addAll(track.getHits()); + } + DataBank recoKFHitsBank = ahdc_writer.fillAHDCHitsBank(event, AHDC_hits); + event.appendBank(recoKFHitsBank); // remark: only hits assocuated to a track are saved + + return true; } From bfca180fb951fbba61c17c0447ea4f3f66012dd6 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Mon, 9 Feb 2026 15:46:17 -0500 Subject: [PATCH 056/190] build: automate dependency analysis (#1101) --- .github/workflows/ci.yml | 22 --------------------- .gitlab-ci.yml | 7 ------- build-coatjava.sh | 16 +++++----------- common-tools/coat-libs/pom.xml | 9 +++++++++ libexec/dependency-analysis.sh | 5 ----- libexec/dependency-tree.sh | 4 ---- pom.xml | 35 +++++++++++++++++++++++++++++++++- reconstruction/alert/pom.xml | 11 +---------- 8 files changed, 49 insertions(+), 60 deletions(-) delete mode 100755 libexec/dependency-analysis.sh delete mode 100755 libexec/dependency-tree.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f8d6ab22ac..5c46dbf34e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -303,27 +303,6 @@ jobs: - name: test run-groovy run: coatjava/bin/run-groovy validation/advanced-tests/test-run-groovy.groovy - dependency_analysis: - needs: [ build ] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - name: Set up JDK - uses: actions/setup-java@v5 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: ${{ env.java_distribution }} - cache: maven - - uses: actions/download-artifact@v7 - with: - name: build_ubuntu-latest - - name: untar build - run: tar xzvf coatjava.tar.gz - - name: print dependency tree - run: libexec/dependency-tree.sh - - name: dependency analysis - run: libexec/dependency-analysis.sh - # documentation ############################################################################# @@ -413,7 +392,6 @@ jobs: final: needs: - test_coatjava - - dependency_analysis - test_run-groovy - generate_documentation runs-on: ubuntu-latest diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4ed41cf162..b4cae92810 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -60,13 +60,6 @@ build: - coatjava.tar.gz - clara.tar.gz -.depana: - allow_failure: true - stage: build - script: - - libexec/dependency-tree.sh - - libexec/dependency-analysis.sh - download: stage: build script: diff --git a/build-coatjava.sh b/build-coatjava.sh index b0f1f34017..be368ab0d7 100755 --- a/build-coatjava.sh +++ b/build-coatjava.sh @@ -10,7 +10,6 @@ set -o pipefail ################################################################################ cleanBuild=false -anaDepends=false runSpotBugs=false downloadMaps=true downloadNets=true @@ -46,7 +45,6 @@ DATA RETRIEVAL OPTIONS TESTING OPTIONS --spotbugs also run spotbugs plugin --unittests also run unit tests - --depana run dependency analysis (only) --data download test data (requires option `--lfs`) MAVEN OPTIONS @@ -70,7 +68,10 @@ do --nonets) downloadNets=false ;; --unittests) runUnitTests=true ;; --clean) cleanBuild=true ;; - --depana) anaDepends=true ;; + --depana) + echo "ERROR: option \`$xx\` has been removed; dependency tree printout and analysis now happen automatically in the Maven build lifecycle" >&2 + exit 1 + ;; --quiet) mvnArgs+=(--quiet --batch-mode) wgetArgs+=(--quiet) @@ -86,7 +87,7 @@ do --clara) installClara=true ;; --data) downloadData=true ;; --xrootd) - echo "ERROR: option \`$xx\` is deprecated; use \`--help\` for guidance" >&2 + echo "ERROR: option \`$xx\` has been removed; use \`--help\` for guidance" >&2 exit 1 ;; -h|--help) @@ -149,13 +150,6 @@ if $cleanBuild || [ "$dataRetrieval" = "wipe" ]; then exit fi -# run dependency analysis and exit -if $anaDepends; then - libexec/dependency-analysis.sh - libexec/dependency-tree.sh - exit 0 -fi - ################################################################################ # download field maps, NN models, etc. diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index e677ce799b..a326c0575f 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -257,6 +257,15 @@ maven-deploy-plugin + + + org.apache.maven.plugins + maven-dependency-plugin + + true + + + diff --git a/libexec/dependency-analysis.sh b/libexec/dependency-analysis.sh deleted file mode 100755 index 9330057e2a..0000000000 --- a/libexec/dependency-analysis.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -# analyze maven dependencies -# NOTE: skips `coat-libs`, since shaded JAR dependencies are "unused" according to `dependency:analyze` -set -euo pipefail -mvn dependency:analyze -DfailOnWarning=true -pl '!org.jlab.coat:coat-libs' --no-transfer-progress diff --git a/libexec/dependency-tree.sh b/libexec/dependency-tree.sh deleted file mode 100755 index 056976afdb..0000000000 --- a/libexec/dependency-tree.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -# print the maven dependency tree -set -euo pipefail -mvn dependency:tree -Ddetail=true --no-transfer-progress diff --git a/pom.xml b/pom.xml index 75403d19eb..62c2a0aa3d 100644 --- a/pom.xml +++ b/pom.xml @@ -251,6 +251,7 @@ + com.github.spotbugs spotbugs-maven-plugin @@ -260,6 +261,7 @@ + org.apache.maven.plugins maven-javadoc-plugin @@ -280,6 +282,7 @@ + org.apache.maven.plugins maven-compiler-plugin @@ -289,7 +292,6 @@ UTF-8 - org.apache.maven.plugins maven-resources-plugin @@ -299,6 +301,7 @@ + org.apache.maven.plugins maven-jar-plugin @@ -323,6 +326,35 @@ + + + org.apache.maven.plugins + maven-dependency-plugin + 3.10.0 + + + analyze + verify + + tree + analyze-only + + + true + + + ai.djl:model-zoo + ai.djl.pytorch:pytorch-model-zoo + ai.djl.pytorch:pytorch-engine + ai.djl.pytorch:pytorch-native-cpu + ai.djl.pytorch:pytorch-jni + + + + + + + org.apache.maven.plugins maven-enforcer-plugin @@ -347,6 +379,7 @@ + org.jacoco jacoco-maven-plugin diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index da37a38210..81068d3819 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -127,7 +127,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.9.0 + 3.10.0 copy-dependencies @@ -141,15 +141,6 @@ - - - ai.djl:model-zoo - ai.djl.pytorch:pytorch-model-zoo - ai.djl.pytorch:pytorch-engine - ai.djl.pytorch:pytorch-native-cpu - ai.djl.pytorch:pytorch-jni - - From 1857d7938d01eb3d8776e26e8c8fd59295db71e0 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Tue, 10 Feb 2026 11:14:24 -0500 Subject: [PATCH 057/190] build: skip unit tests by default (#1102) --- build-coatjava.sh | 4 ++-- pom.xml | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/build-coatjava.sh b/build-coatjava.sh index be368ab0d7..dcb6bdf617 100755 --- a/build-coatjava.sh +++ b/build-coatjava.sh @@ -318,9 +318,9 @@ cp external-dependencies/jclara-4.3-SNAPSHOT.jar $prefix_dir/lib/utils # build (and test) unset CLAS12DIR if $runUnitTests; then - $mvn install # also runs unit tests + $mvn install -DskipTests=false else - $mvn install -DskipTests + $mvn install fi # run spotbugs diff --git a/pom.xml b/pom.xml index 62c2a0aa3d..f6fca6969c 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,18 @@ + + + skip-tests + + true + + + true + + + + From 2cdc6e07e3c55a73b896fe48d7030b672f3b278e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 10 Feb 2026 11:23:58 -0500 Subject: [PATCH 058/190] add convenience method (#1103) --- .../src/main/java/org/jlab/utils/options/OptionValue.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java index b354151844..5ffcac4963 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java @@ -53,4 +53,8 @@ public boolean parse(List arguments){ arguments.remove(index); return true; } + + public boolean isDefault() { + return this.optionValue.equals(this.optionDefault); + } } From d87c5592e6d57d9a01b86c7a8fb0f9898b0644d7 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 13 Feb 2026 18:21:58 -0500 Subject: [PATCH 059/190] fix cvmfs github CI issues with 5.4 (#1109) * try 5.4 * missed one ... * disable validation tests --- .github/workflows/ci.yml | 12 ++++++------ .../{validation.yml => validation.yml-DISABLED} | 0 2 files changed, 6 insertions(+), 6 deletions(-) rename .github/workflows/{validation.yml => validation.yml-DISABLED} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c46dbf34e..9ad94e776c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,7 +77,7 @@ jobs: distribution: ${{ env.java_distribution }} cache: maven - name: setup cvmfs - uses: cvmfs-contrib/github-action-cvmfs@v5 + uses: cvmfs-contrib/github-action-cvmfs@v5.4 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: cvmfs @@ -128,7 +128,7 @@ jobs: java-version: ${{ matrix.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: cvmfs-contrib/github-action-cvmfs@v5 + - uses: cvmfs-contrib/github-action-cvmfs@v5.4 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: unit tests @@ -155,7 +155,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: cvmfs-contrib/github-action-cvmfs@v5 + - uses: cvmfs-contrib/github-action-cvmfs@v5.4 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - uses: actions/download-artifact@v7 @@ -177,7 +177,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: cvmfs-contrib/github-action-cvmfs@v5 + - uses: cvmfs-contrib/github-action-cvmfs@v5.4 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - uses: actions/download-artifact@v7 @@ -209,7 +209,7 @@ jobs: distribution: ${{ env.java_distribution }} cache: maven - name: setup cvmfs - uses: cvmfs-contrib/github-action-cvmfs@v5 + uses: cvmfs-contrib/github-action-cvmfs@v5.4 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - uses: actions/download-artifact@v7 @@ -265,7 +265,7 @@ jobs: - uses: actions/download-artifact@v7 with: name: build_${{ matrix.runner }} - - uses: cvmfs-contrib/github-action-cvmfs@v5 + - uses: cvmfs-contrib/github-action-cvmfs@v5.4 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: untar build diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml-DISABLED similarity index 100% rename from .github/workflows/validation.yml rename to .github/workflows/validation.yml-DISABLED From 0453f3c73470602fb0ef66ea93d94ef16484caa8 Mon Sep 17 00:00:00 2001 From: Zeyu Zhang Date: Tue, 17 Feb 2026 01:00:04 +0800 Subject: [PATCH 060/190] add programs to use doca to refine positions of clusters, then use them in helixfitting. (#1105) Co-authored-by: Zeyu Zhang Co-authored-by: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> --- etc/bankdefs/hipo4/alert.json | 16 +- .../jlab/rec/ahdc/Banks/RecoBankWriter.java | 20 + .../rec/ahdc/DocaCluster/DocaCluster.java | 59 ++ .../ahdc/DocaCluster/DocaClusterRefiner.java | 884 ++++++++++++++++++ .../jlab/rec/ahdc/HelixFit/HelixFitJava.java | 358 +++++++ .../org/jlab/service/ahdc/AHDCEngine.java | 24 +- 6 files changed, 1348 insertions(+), 13 deletions(-) create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java diff --git a/etc/bankdefs/hipo4/alert.json b/etc/bankdefs/hipo4/alert.json index 8400034b57..3867406bdb 100644 --- a/etc/bankdefs/hipo4/alert.json +++ b/etc/bankdefs/hipo4/alert.json @@ -200,7 +200,7 @@ "name": "time", "type": "D", "info": "calibrated time (ns)" - }, { + }, { "name": "adc", "type": "I", "info": "calibrated ADC" @@ -440,5 +440,19 @@ {"name": "x", "type": "F", "info": "x info (mm)"}, {"name": "y", "type": "F", "info": "y info (mm)"} ] + }, + { + "name": "AHDC::docaclusters", + "group": 23000, + "item": 126, + "info": "Doca-refined cluster space points", + "entries": [ + {"name": "x", "type": "F", "info": "refined x (mm)"}, + {"name": "y", "type": "F", "info": "refined y (mm)"}, + {"name": "z", "type": "F", "info": "refined z (mm)"}, + {"name": "weight", "type": "F", "info": "refined point weight"}, + {"name": "pattern", "type": "I", "info": "hit pattern: 11,12,21,22"}, + {"name": "idx", "type": "I", "info": "index of original AHDC::clusters row"} + ] } ] diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java index 5c32ecf73b..0218dec350 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java @@ -5,11 +5,13 @@ import org.jlab.rec.ahdc.AI.InterCluster; import org.jlab.rec.ahdc.AI.TrackPrediction; import org.jlab.rec.ahdc.Cluster.Cluster; +import org.jlab.rec.ahdc.Cluster.DocaCluster; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.ahdc.Track.Track; import java.util.ArrayList; +import java.util.List; public class RecoBankWriter { @@ -198,4 +200,22 @@ public DataBank fillInterClusterBank(DataEvent event, ArrayList in return bank; } + + public DataBank fillAHDCDocaClustersBank(DataEvent event, ArrayList docaclusters) { + + if (docaclusters == null || docaclusters.size() == 0) return null; + + DataBank bank = event.createBank("AHDC::docaclusters", docaclusters.size()); + + for (int i = 0; i < docaclusters.size(); i++) { + bank.setFloat("x", i, (float) docaclusters.get(i).get_X()); + bank.setFloat("y", i, (float) docaclusters.get(i).get_Y()); + bank.setFloat("z", i, (float) docaclusters.get(i).get_Z()); + bank.setFloat("weight", i, (float) docaclusters.get(i).get_Weight()); + bank.setInt("pattern", i, (int) docaclusters.get(i).get_Pattern()); + bank.setInt("idx", i, (int) docaclusters.get(i).get_ClusterIndex()); + } + + return bank; + } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java new file mode 100644 index 0000000000..b9d0f1fd91 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java @@ -0,0 +1,59 @@ +package org.jlab.rec.ahdc.Cluster; + +/** + * DocaCluster is a "refined" cluster space point built from + * the DOCA information of hits in the two PreClusters that + * compose a standard Cluster. + * + * One original Cluster can produce one or several DocaCluster + * objects, each with its own (x, y, z, weight). + */ +public class DocaCluster { + + // Refined space point + private double _X; + private double _Y; + private double _Z; + + // Weight for helix fit (relative weight of this point) + private double _Weight = 1.0; + + // Pattern of hit multiplicity: 11, 12, 21, 22, or 0 for "others" + private int _Pattern = 0; + + // Index of the original Cluster in the AHDC_Clusters list + private int _ClusterIndex = -1; + + public DocaCluster(double x, double y, double z, + double weight, int pattern, int clusterIndex) { + this._X = x; + this._Y = y; + this._Z = z; + this._Weight = weight; + this._Pattern = pattern; + this._ClusterIndex = clusterIndex; + } + + public double get_X() { return _X; } + public double get_Y() { return _Y; } + public double get_Z() { return _Z; } + public double get_Weight() { return _Weight; } + + public int get_Pattern() { return _Pattern; } + public int get_ClusterIndex() { return _ClusterIndex; } + + public void set_X(double x) { this._X = x; } + public void set_Y(double y) { this._Y = y; } + public void set_Z(double z) { this._Z = z; } + public void set_Weight(double weight) { this._Weight = weight; } + public void set_Pattern(int pattern) { this._Pattern = pattern; } + public void set_ClusterIndex(int idx) { this._ClusterIndex = idx; } + + @Override + public String toString() { + return String.format( + "DocaCluster{X=%.3f, Y=%.3f, Z=%.3f, w=%.3f, pattern=%d, idx=%d}", + _X, _Y, _Z, _Weight, _Pattern, _ClusterIndex + ); + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java new file mode 100644 index 0000000000..8961ffed1b --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java @@ -0,0 +1,884 @@ +package org.jlab.rec.ahdc.Cluster; + +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.ahdc.PreCluster.PreCluster; + +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; + +import java.util.ArrayList; +import java.util.List; +import java.util.Collections; + +/** + * Build refined cluster space points using DOCA circles. + * + * For each original Cluster (2 PreClusters with stereo angle), + * if the hit multiplicity is (1,1), (1,2)/(2,1) or (2,2), we + * construct new space points from circle-circle tangents. + * Otherwise we fall back to the original (x,y,z) with weight 1. + */ +public class DocaClusterRefiner { + + // --- internal small 2D helpers ------------------------------------------------ + + private static class Vec2 { + double x; + double y; + Vec2(double x, double y) { this.x = x; this.y = y; } + + Vec2 add(Vec2 o) { return new Vec2(this.x + o.x, this.y + o.y); } + Vec2 sub(Vec2 o) { return new Vec2(this.x - o.x, this.y - o.y); } + Vec2 scale(double s){ return new Vec2(this.x * s, this.y * s); } + } + + private static class Vec3 { + double x, y, z; + + Vec3(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + //plus + Vec3 add(Vec3 o) { + return new Vec3(this.x + o.x, this.y + o.y, this.z + o.z); + } + //minus + Vec3 sub(Vec3 o) { + return new Vec3(this.x - o.x, this.y - o.y, this.z - o.z); + } + //scale + Vec3 scale(double s) { + return new Vec3(this.x * s, this.y * s, this.z * s); + } + //Dot Product + double dot(Vec3 o) { + return this.x * o.x + this.y * o.y + this.z * o.z; + } + //Cross Product + Vec3 cross(Vec3 o) { + return new Vec3( + this.y * o.z - this.z * o.y, + this.z * o.x - this.x * o.z, + this.x * o.y - this.y * o.x + ); + } + @Override + public String toString() { + return String.format("Vec3(%.2f, %.2f, %.2f)", x, y, z); + } + } + + // line: n·x + c = 0, n is unit normal + private static class Line { + Vec2 n; + double c; + Line(Vec2 n, double c) { this.n = n; this.c = c; } + } + + // Given a common tangent line to two circles (c1,r1) and (c2,r2), + // compute the two tangent points on each circle. + private static Vec2[] tangentSegmentPoints(Vec2 c1, double r1, + Vec2 c2, double r2, + Line line) { + Vec2 n = line.n; + double c = line.c; + + // signed distance from centers to line + double d1 = n.x * c1.x + n.y * c1.y + c; + double d2 = n.x * c2.x + n.y * c2.y + c; + + // projection of centers onto the line (tangent points) + Vec2 t1 = new Vec2(c1.x - n.x * d1, c1.y - n.y * d1); + Vec2 t2 = new Vec2(c2.x - n.x * d2, c2.y - n.y * d2); + + return new Vec2[]{t1, t2}; + } + // Tangent lines + private static class Tangents { + Line[] internalLines = new Line[2]; + Line[] externalLines = new Line[2]; + boolean hasInternal = false; + boolean hasExternal = false; + } + //To see whether a point is on one side of a line or the other + private static double side_ql(Vec2 q, Line l) { + return l.n.x * q.x + l.n.y * q.y + l.c; + } + + /** + * Project the 3D DOCA of a hit onto the transverse (x,y) plane, + * by multiplying DOCA with cos(angle between wire direction and beamline). + * Beamline is assumed to be along the z-axis. + */ + private static double getProjectedDocaXY(Hit h) { + double doca = Math.abs(h.getDoca()); + Line3D wire = h.getLine(); + + // If the wire line is not available, fall back to full DOCA + if (wire == null) { + return doca; + } + + Point3D o = wire.origin(); + Point3D e = wire.end(); + + double dx = e.x() - o.x(); + double dy = e.y() - o.y(); + double dz = e.z() - o.z(); + + double len = Math.sqrt(dx * dx + dy * dy + dz * dz); + if (len < 1e-6) { + // degenerate line, also fall back + return doca; + } + + // unit vector along wire + double ux = dx / len; + double uy = dy / len; + double uz = dz / len; + + // beamline direction = (0,0,1), so cos(angle) = |uz| + double cosAlpha = Math.abs(uz); + + // projected DOCA radius in XY plane + return doca / cosAlpha; + } + + private static Vec3 getDirection(Hit h) { + Line3D wire = h.getLine(); + + Point3D o = wire.origin(); + Point3D e = wire.end(); + + double dx = e.x() - o.x(); + double dy = e.y() - o.y(); + double dz = e.z() - o.z(); + + double len = Math.sqrt(dx * dx + dy * dy + dz * dz); + + // unit vector along wire + double ux = dx / len; + double uy = dy / len; + double uz = dz / len; + + // beamline direction = (0,0,1), so cos(angle) = |uz| + double cosAlpha = Math.abs(uz); + + Vec3 u = new Vec3(ux, uy, uz); + + // projected DOCA radius in XY plane + return u; + } + + // Select up to maxN hits with the largest ADC from a hit list. + // This does NOT modify the original list in PreCluster. + private static ArrayList selectTopHitsByADC(ArrayList hits, int maxN) { + ArrayList result = new ArrayList<>(); + if (hits == null || hits.isEmpty() || maxN <= 0) { + return result; + } + + ArrayList copy = new ArrayList<>(hits); + + Collections.sort(copy, (h1, h2) -> Double.compare(h2.getADC(), h1.getADC())); + + int n = Math.min(maxN, copy.size()); + for (int i = 0; i < n; i++) { + result.add(copy.get(i)); + } + + return result; + } + + /** + * Build a 3D line by shifting the original wire line in the (x,y) plane + * so that its origin passes through the given tangent point (tx, ty), + * while keeping the same direction and z-coordinate at the origin. + */ + private static Line3D buildShiftedWireLine(Hit h, Vec2 tangentXY) { + Line3D wire = h.getLine(); + + Point3D o = wire.origin(); + Point3D e = wire.end(); + + double dx = e.x() - o.x(); + double dy = e.y() - o.y(); + double dz = e.z() - o.z(); + + // New origin: (tangent.x, tangent.y, original_z) + Point3D oShift = new Point3D(tangentXY.x, tangentXY.y, o.z()); + Point3D eShift = new Point3D(oShift.x() + dx, oShift.y() + dy, oShift.z() + dz); + + return new Line3D(oShift, eShift); + } + + /** + * Compute the midpoint of the shortest segment between two 3D lines. + * Returns null if the lines are (almost) parallel. + */ + private static Point3D midpointOfCommonPerpendicular(Line3D L1, Line3D L2) { + Point3D p1 = L1.origin(); + Point3D p2 = L2.origin(); + + double v1x = L1.end().x() - p1.x(); + double v1y = L1.end().y() - p1.y(); + double v1z = L1.end().z() - p1.z(); + + double v2x = L2.end().x() - p2.x(); + double v2y = L2.end().y() - p2.y(); + double v2z = L2.end().z() - p2.z(); + + // Normalize directions + double len1 = Math.sqrt(v1x*v1x + v1y*v1y + v1z*v1z); + double len2 = Math.sqrt(v2x*v2x + v2y*v2y + v2z*v2z); + if (len1 < 1e-6 || len2 < 1e-6) { + return null; + } + v1x /= len1; v1y /= len1; v1z /= len1; + v2x /= len2; v2y /= len2; v2z /= len2; + + // Solve for s,t that minimize |(p1 + s v1) - (p2 + t v2)|^2 + double w0x = p1.x() - p2.x(); + double w0y = p1.y() - p2.y(); + double w0z = p1.z() - p2.z(); + + double a = v1x*v1x + v1y*v1y + v1z*v1z; + double b = v1x*v2x + v1y*v2y + v1z*v2z; + double c = v2x*v2x + v2y*v2y + v2z*v2z; + double d = v1x*w0x + v1y*w0y + v1z*w0z; + double e = v2x*w0x + v2y*w0y + v2z*w0z; + + double denom = a*c - b*b; + if (Math.abs(denom) < 1e-6) { + // Lines nearly parallel, no stable unique common perpendicular + return null; + } + + double s = (b*e - c*d) / denom; + double t = (a*e - b*d) / denom; + + double q1x = p1.x() + s*v1x; + double q1y = p1.y() + s*v1y; + double q1z = p1.z() + s*v1z; + + double q2x = p2.x() + t*v2x; + double q2y = p2.y() + t*v2y; + double q2z = p2.z() + t*v2z; + + // Midpoint of the shortest segment + return new Point3D(0.5*(q1x + q2x), + 0.5*(q1y + q2y), + 0.5*(q1z + q2z)); + } + + private static final double STEREO_ANGLE_DEG = 20.0; + private static final double DELTA_Z = 300.0; + private static final double Z_OFFSET = 150.0; + + // ===================================================================== + // public API + // ===================================================================== + + /** + * Build a list of DocaCluster objects from the original list of Cluster. + * Each Cluster may generate multiple DocaCluster points. + */ + + public static ArrayList buildRefinedClusters(List clusters) { + + ArrayList out = new ArrayList<>(); + + if (clusters == null) return out; + + for (int idx = 0; idx < clusters.size(); idx++) { + Cluster cl = clusters.get(idx); + + ArrayList pcs = cl.get_PreClusters_list(); + if (pcs == null || pcs.size() != 2) { + // Fallback: one degenerate DocaCluster at original position + out.add(new DocaCluster(cl.get_X(), cl.get_Y(), cl.get_Z(), + 1.0, 0, idx)); + continue; + } + + PreCluster pc1 = pcs.get(0); + PreCluster pc2 = pcs.get(1); + + ArrayList hits1 = pc1.get_hits_list(); + ArrayList hits2 = pc2.get_hits_list(); + + // ----------------------------------------------------------------- + // NEW: reduce each precluster to at most 2 hits by keeping only + // the hits with the largest ADC. + // ----------------------------------------------------------------- + ArrayList effHits1 = selectTopHitsByADC(hits1, 2); + ArrayList effHits2 = selectTopHitsByADC(hits2, 2); + + int n1 = effHits1.size(); + int n2 = effHits2.size(); + + // Now we only need to handle (1,1), (1,2)/(2,1), (2,2). + // Any case with 0 hits falls back to the original cluster. + if (n1 == 1 && n2 == 1) { + + out.addAll(refine11(cl, + pc1, effHits1.get(0), + pc2, effHits2.get(0), + idx)); + + } else if (n1 == 1 && n2 == 2) { + + out.addAll(refine12(cl, + pc1, effHits1, + pc2, effHits2, + true, // pc1 is the single-hit side + idx)); + + } else if (n1 == 2 && n2 == 1) { + + out.addAll(refine12(cl, + pc2, effHits2, + pc1, effHits1, + false, // pc2 is the single-hit side + idx)); + + } else if (n1 == 2 && n2 == 2) { + + out.addAll(refine22(cl, + pc1, effHits1, + pc2, effHits2, + idx)); + + } else { + // At least one precluster ended up with 0 hits after selection: + // fall back to a single DocaCluster at the original position. + out.add(new DocaCluster(cl.get_X(), cl.get_Y(), cl.get_Z(), + 1.0, 0, idx)); + } + } + + return out; + } + // ===================================================================== + // (1,1) case + // ===================================================================== + + private static List refine11(Cluster oldCluster, + PreCluster pc1, Hit h1, + PreCluster pc2, Hit h2, + int clusterIndex) { + + List out = new ArrayList<>(); + //double Proj = Math.cos(Math.toRadians(10)); //project to xy plane + // Centers of the two DOCA circles from the two single hits + Vec2 c1 = new Vec2(h1.getX(), h1.getY()); + Vec2 c2 = new Vec2(h2.getX(), h2.getY()); + //double r1 = Math.abs(h1.getDoca()*Proj); + //double r2 = Math.abs(h2.getDoca()*Proj); + double r1 = getProjectedDocaXY(h1); + double r2 = getProjectedDocaXY(h2); + + // Compute internal and external tangents between the two circles + Tangents tans = computeTangents(c1, r1, c2, r2); + + // If we cannot build both internal and external tangents, + // fall back to a single midpoint with the original cluster Z + if (!tans.hasInternal || !tans.hasExternal) { + Vec2 mid = c1.add(c2).scale(0.5); + out.add(new DocaCluster(mid.x, mid.y, oldCluster.get_Z(), + 1.0, 11, clusterIndex)); + return out; + } + + // Collect the four tangent lines: 2 internal + 2 external + Line[] lines = new Line[]{ + tans.internalLines[0], + tans.internalLines[1], + tans.externalLines[0], + tans.externalLines[1] + }; + + // For each tangent line: + // - compute the two tangent points on the two circles; + // - take their midpoint as the DocaCluster (X,Y); + // - compute phi1, phi2 from the two tangent points and use + // computeZ(pc1,pc2,phi1,phi2) for Z; + // - assign weight 0.25 (we will renormalize if fewer than 4). + for (Line L : lines) { + if (L == null) continue; + + Vec2[] tpts = tangentSegmentPoints(c1, r1, c2, r2, L); + Vec2 t_on_pc1 = tpts[0]; + Vec2 t_on_pc2 = tpts[1]; + + // midpoint of the two tangent points -> DocaCluster position + //Vec2 mid = t_on_pc1.add(t_on_pc2).scale(0.5); + + // Build shifted 3D wires + Line3D wire1 = buildShiftedWireLine(h1, t_on_pc1); + Line3D wire2 = buildShiftedWireLine(h2, t_on_pc2); + + Point3D mid3D = midpointOfCommonPerpendicular(wire1, wire2); + if (mid3D == null) { + // If the lines are almost parallel, fall back to 2D midpoint + Vec2 mid2D = t_on_pc1.add(t_on_pc2).scale(0.5); + out.add(new DocaCluster(mid2D.x, mid2D.y, oldCluster.get_Z(), + 1.0, 11, clusterIndex)); + } else { + out.add(new DocaCluster(mid3D.x(), mid3D.y(), mid3D.z(), + 1.0, 11, clusterIndex)); + } + + // compute z using the phi of the two tangent points + //double phi1 = computePhiFromXY(t_on_pc1.x, t_on_pc1.y); + //double phi2 = computePhiFromXY(t_on_pc2.x, t_on_pc2.y); + //double z = computeZ(pc1, pc2, phi1, phi2); + + //out.add(new DocaCluster(mid.x, mid.y, z, + // 0.25, 11, clusterIndex)); + } + + // Safety: if some tangents failed and we ended up with 0 points, + // fall back to a single midpoint with original Z. + if (out.isEmpty()) { + Vec2 mid = c1.add(c2).scale(0.5); + out.add(new DocaCluster(mid.x, mid.y, oldCluster.get_Z(), + 1.0, 11, clusterIndex)); + return out; + } + + return out; + } + + // ===================================================================== + // (1,2) or (2,1) case + // ===================================================================== + + /** + * One precluster has 1 hit (singlePc, singleHits), the other has 2 hits (doublePc, doubleHits). + * singleIsFirst indicates whether in the original Cluster list ordering we had: + * - true : (pc1, pc2) = (singlePc, doublePc) + * - false : (pc1, pc2) = (doublePc, singlePc) + */ + private static List refine12(Cluster oldCluster, + PreCluster singlePc, ArrayList singleHits, + PreCluster doublePc, ArrayList doubleHits, + boolean singleIsFirst, + int clusterIndex) { + + List out = new ArrayList<>(); + //double Proj = Math.cos(Math.toRadians(10)); + if (singleHits.size() != 1 || doubleHits.size() != 2) { + return out; + } + + Hit hs = singleHits.get(0); + Hit h2a = doubleHits.get(0); + Hit h2b = doubleHits.get(1); + + Vec2 cs = new Vec2(hs.getX(), hs.getY()); + //double rs = Math.abs(hs.getDoca()*Proj); + double rs = getProjectedDocaXY(hs); + + + Vec2 c2a = new Vec2(h2a.getX(), h2a.getY()); + Vec2 c2b = new Vec2(h2b.getX(), h2b.getY()); + double costheta = Math.abs(getDirection(h2a).z); + Vec2 c2bp = new Vec2((h2b.getX()-h2a.getX())*costheta+h2a.getX(), (h2b.getY()-h2a.getY())*costheta+h2a.getY()); + double r2a = Math.abs(h2a.getDoca()); + double r2b = Math.abs(h2b.getDoca()); + //double r2a = getProjectedDocaXY(h2a); + //double r2b = getProjectedDocaXY(h2b); + + // 1) internal tangents intersection for the 2-hit precluster + Tangents tans2 = computeTangents(c2a, r2a, c2bp, r2b); + if (!tans2.hasInternal) { + // Fallback: use the average of all three centers + Vec2 avg = cs.add(c2a).add(c2b).scale(1.0 / 3.0); + out.add(new DocaCluster(avg.x, avg.y, oldCluster.get_Z(), + 1.0, singleIsFirst ? 12 : 21, clusterIndex)); + return out; + } + + Vec2 p2p = intersectLines(tans2.internalLines[0], tans2.internalLines[1]); + if (p2p == null) { + Vec2 avg = cs.add(c2a).add(c2b).scale(1.0 / 3.0); + out.add(new DocaCluster(avg.x, avg.y, oldCluster.get_Z(), + 1.0, singleIsFirst ? 12 : 21, clusterIndex)); + return out; + } + Vec2 p2 = new Vec2((p2p.x-h2a.getX())/costheta+h2a.getX(), (p2p.y-h2a.getY())/costheta+h2a.getY()); + + // 2) from p2 draw two tangents to the single-hit doca circle + List tangPoints = tangentPointsFromPointToCircle(p2, cs, rs); + if (tangPoints == null || tangPoints.size() < 2) { + // No tangents: fallback to p2 only + out.add(new DocaCluster(p2.x, p2.y, oldCluster.get_Z(), + 1.0, singleIsFirst ? 12 : 21, clusterIndex)); + return out; + } + Line line_cs_p2 = lineThroughPoints(cs, p2); + + Vec2 t1, t2;//tangPoints.get(0) & c2a on the same side + if (side_ql(tangPoints.get(0), line_cs_p2)*side_ql(c2a, line_cs_p2)>0){ + t1 = tangPoints.get(0); + t2 = tangPoints.get(1); + } + else { + t1 = tangPoints.get(1); + t2 = tangPoints.get(0); + } + + //Vec2 m1 = t1.add(p2).scale(0.5); // midpoint on the single-hit doca circle + //Vec2 m2 = t2.add(p2).scale(0.5); + + // 3) compute z using p2 (double precluster) and m (single precluster) + // with correct ordering of preclusters + //PreCluster pc1, pc2; + //Vec2 p1Geo, p2Geo; + //Vec2 p1Geo2; + //Vec2 p2Geo2; + //if (singleIsFirst) { + // original order: (pc1, pc2) = (singlePc, doublePc) + // pc1 = singlePc; + // pc2 = doublePc; + // p1Geo = t1; // single + // p2Geo = p2; // double + // p1Geo2 = t2; + // p2Geo2 = p2; + + //} else { + // original order: (pc1, pc2) = (doublePc, singlePc) + // pc1 = doublePc; + // pc2 = singlePc; + // p1Geo = p2; // double + // p2Geo = t1; // single + // p2Geo2 = t2; + // p1Geo2 = p2; + + //} + + //double phi1 = computePhiFromXY(p1Geo.x, p1Geo.y); + //double phi2 = computePhiFromXY(p2Geo.x, p2Geo.y); + //double phi1r = computePhiFromXY(p1Geo2.x, p1Geo2.y); + //double phi2r = computePhiFromXY(p2Geo2.x, p2Geo2.y); + //double zRef1 = computeZ(pc1, pc2, phi1, phi2); + //double zRef2 = computeZ(pc1, pc2, phi1r, phi2r); + + // 4) compute weights via distance to the two tangent lines + + Line L1 = tans2.internalLines[0]; + Line L2 = tans2.internalLines[1]; + double d1, d2; + if (side_ql(cs, L1)*side_ql(c2a, L1)<0){ + d1 = distancePointToLine(cs, L1); + d2 = distancePointToLine(cs, L2); + } + else { + d1 = distancePointToLine(cs, L2); + d2 = distancePointToLine(cs, L1); + } + + double r1 = Math.abs(d1 - rs); + double r2 = Math.abs(d2 - rs); + + double w1, w2; + if (r1 + r2 > 1e-9) { + // weight for p2, m + w1 = r2 / (r1 + r2); + w2 = r1 / (r1 + r2); + } else { + w1 = 0.5; + w2 = 0.5; + } + + int pattern = singleIsFirst ? 12 : 21; + + Line3D wires1 = buildShiftedWireLine(hs, t1); + Line3D wires2 = buildShiftedWireLine(hs, t2); + Line3D wired = buildShiftedWireLine(h2a, p2); + + Point3D mid3D1 = midpointOfCommonPerpendicular(wires1, wired); + if (mid3D1 == null) { + // If the lines are almost parallel, fall back to 2D midpoint + Vec2 mid2D1 = t1.add(p2).scale(0.5); + out.add(new DocaCluster(mid2D1.x, mid2D1.y, oldCluster.get_Z(), + 1.0, pattern, clusterIndex)); + } else { + out.add(new DocaCluster(mid3D1.x(), mid3D1.y(), mid3D1.z(), + 1.0, pattern, clusterIndex)); + } + + Point3D mid3D2 = midpointOfCommonPerpendicular(wires2, wired); + if (mid3D2 == null) { + // If the lines are almost parallel, fall back to 2D midpoint + Vec2 mid2D2 = t2.add(p2).scale(0.5); + out.add(new DocaCluster(mid2D2.x, mid2D2.y, oldCluster.get_Z(), + 1.0, pattern, clusterIndex)); + } else { + out.add(new DocaCluster(mid3D2.x(), mid3D2.y(), mid3D2.z(), + 1.0, pattern, clusterIndex)); + } + + // Two DocaCluster points: p2 and m + //out.add(new DocaCluster(m1.x, m1.y, zRef1, + // w1, pattern, clusterIndex)); + //out.add(new DocaCluster(m2.x, m2.y, zRef2, + // w2, pattern, clusterIndex)); + + return out; + } + + // ===================================================================== + // (2,2) case + // ===================================================================== + + private static List refine22(Cluster oldCluster, + PreCluster pc1, ArrayList hits1, + PreCluster pc2, ArrayList hits2, + int clusterIndex) { + + List out = new ArrayList<>(); + //double Proj = Math.cos(Math.toRadians(10)); + if (hits1.size() != 2 || hits2.size() != 2) return out; + + // precluster 1 + Hit h1a = hits1.get(0); + Hit h1b = hits1.get(1); + Vec2 c1a = new Vec2(h1a.getX(), h1a.getY()); + Vec2 c1b = new Vec2(h1b.getX(), h1b.getY()); + double costheta1 = Math.abs(getDirection(h1a).z); + Vec2 c1bp = new Vec2((h1b.getX()-h1a.getX())*costheta1+h1a.getX(), (h1b.getY()-h1a.getY())*costheta1+h1a.getY()); + double r1a = Math.abs(h1a.getDoca()); + double r1b = Math.abs(h1b.getDoca()); + //double r1a = Math.abs(h1a.getDoca()); + //double r1b = Math.abs(h1b.getDoca()); + + // precluster 2 + Hit h2a = hits2.get(0); + Hit h2b = hits2.get(1); + Vec2 c2a = new Vec2(h2a.getX(), h2a.getY()); + Vec2 c2b = new Vec2(h2b.getX(), h2b.getY()); + double costheta2 = Math.abs(getDirection(h2a).z); + Vec2 c2bp = new Vec2((h2b.getX()-h2a.getX())*costheta2+h2a.getX(), (h2b.getY()-h2a.getY())*costheta2+h2a.getY()); + double r2a = Math.abs(h2a.getDoca()); + double r2b = Math.abs(h2b.getDoca()); + //double r2a = getProjectedDocaXY(h2a); + //double r2b = getProjectedDocaXY(h2b); + + Tangents t1 = computeTangents(c1a, r1a, c1bp, r1b); + Tangents t2 = computeTangents(c2a, r2a, c2bp, r2b); + + if (!t1.hasInternal || !t2.hasInternal) { + // Fallback: average of hit centers + Vec2 avg = c1a.add(c1b).add(c2a).add(c2b).scale(0.25); + out.add(new DocaCluster(avg.x, avg.y, oldCluster.get_Z(), + 1.0, 22, clusterIndex)); + return out; + } + + Vec2 p1p = intersectLines(t1.internalLines[0], t1.internalLines[1]); + Vec2 p2p = intersectLines(t2.internalLines[0], t2.internalLines[1]); + if (p1p == null || p2p == null) { + Vec2 avg = c1a.add(c1b).add(c2a).add(c2b).scale(0.25); + out.add(new DocaCluster(avg.x, avg.y, oldCluster.get_Z(), + 1.0, 22, clusterIndex)); + return out; + } + Vec2 p1 = new Vec2((p1p.x-h1a.getX())/costheta1+h1a.getX(), (p1p.y-h1a.getY())/costheta1+h1a.getY()); + Vec2 p2 = new Vec2((p2p.x-h2a.getX())/costheta2+h2a.getX(), (p2p.y-h2a.getY())/costheta2+h2a.getY()); + + Line3D wire1 = buildShiftedWireLine(h1a, p1); + Line3D wire2 = buildShiftedWireLine(h2a, p2); + + Point3D mid3D = midpointOfCommonPerpendicular(wire1, wire2); + if (mid3D == null) { + // If the lines are almost parallel, fall back to 2D midpoint + Vec2 mid2D = p1.add(p2).scale(0.5); + out.add(new DocaCluster(mid2D.x, mid2D.y, oldCluster.get_Z(), + 1.0, 22, clusterIndex)); + } else { + out.add(new DocaCluster(mid3D.x(), mid3D.y(), mid3D.z(), + 1.0, 22, clusterIndex)); + } + + return out; + } + + // ===================================================================== + // geometry helpers + // ===================================================================== + + /** Compute internal and external tangents between two circles. */ + private static Tangents computeTangents(Vec2 c1, double r1, Vec2 c2, double r2) { + Tangents result = new Tangents(); + + Vec2 dc = c2.sub(c1); + double d2 = dc.x * dc.x + dc.y * dc.y; + double d = Math.sqrt(d2); + if (d < 1e-6) { + return result; // concentric: no real tangents + } + + Vec2 ex = new Vec2(dc.x / d, dc.y / d); + Vec2 ey = new Vec2(-ex.y, ex.x); + + // ---- external tangents (same side) ---- + double rExt = (r2 - r1) / d; + if (Math.abs(rExt) <= 1.0 - 1e-9) { + double hExt = Math.sqrt(1.0 - rExt * rExt); + + Vec2 n1_loc = new Vec2(rExt, +hExt); + Vec2 n2_loc = new Vec2(rExt, -hExt); + // normal vector component + Vec2 n1 = new Vec2( + ex.x * n1_loc.x + ey.x * n1_loc.y, + ex.y * n1_loc.x + ey.y * n1_loc.y + ); + Vec2 n2 = new Vec2( + ex.x * n2_loc.x + ey.x * n2_loc.y, + ex.y * n2_loc.x + ey.y * n2_loc.y + ); + //distance between c1 and tangent lines == r1 + double cLoc = r1; + double c1Line = cLoc - (n1.x * c1.x + n1.y * c1.y); + double c2Line = cLoc - (n2.x * c1.x + n2.y * c1.y); + + result.externalLines[0] = new Line(n1, c1Line); + result.externalLines[1] = new Line(n2, c2Line); + result.hasExternal = true; + } + + // ---- internal tangents (opposite side) ---- + double rIntEff = (-r2 - r1) / d; + if (Math.abs(rIntEff) <= 1.0 - 1e-9) { + double hInt = Math.sqrt(1.0 - rIntEff * rIntEff); + + Vec2 n3_loc = new Vec2(rIntEff, +hInt); + Vec2 n4_loc = new Vec2(rIntEff, -hInt); + + Vec2 n3 = new Vec2( + ex.x * n3_loc.x + ey.x * n3_loc.y, + ex.y * n3_loc.x + ey.y * n3_loc.y + ); + Vec2 n4 = new Vec2( + ex.x * n4_loc.x + ey.x * n4_loc.y, + ex.y * n4_loc.x + ey.y * n4_loc.y + ); + + double cLoc = r1; + double c3 = cLoc - (n3.x * c1.x + n3.y * c1.y); + double c4 = cLoc - (n4.x * c1.x + n4.y * c1.y); + + result.internalLines[0] = new Line(n3, c3); + result.internalLines[1] = new Line(n4, c4); + result.hasInternal = true; + } + + return result; + } + + /** Intersection of two lines n1·x + c1 = 0 and n2·x + c2 = 0. */ + private static Vec2 intersectLines(Line l1, Line l2) { + Vec2 n1 = l1.n; + Vec2 n2 = l2.n; + double c1 = l1.c; + double c2 = l2.c; + + double det = n1.x * n2.y - n1.y * n2.x; + if (Math.abs(det) < 1e-9) return null; + + double x = (c2 * n1.y - c1 * n2.y) / det; + double y = (n2.x * c1 - n1.x * c2) / det; + return new Vec2(x, y); + } + + /** Midpoint of the tangent segment between two circles for a given tangent line. */ + private static Vec2 midpointOfTangentSegment(Vec2 c1, double r1, + Vec2 c2, double r2, + Line line) { + Vec2 n = line.n; + double c = line.c; + + double d1 = n.x * c1.x + n.y * c1.y + c; + double d2 = n.x * c2.x + n.y * c2.y + c; + + Vec2 t1 = new Vec2(c1.x - n.x * d1, c1.y - n.y * d1); + Vec2 t2 = new Vec2(c2.x - n.x * d2, c2.y - n.y * d2); + + return t1.add(t2).scale(0.5); + } + + /** Tangent points from point p to circle (center c, radius r). */ + private static List tangentPointsFromPointToCircle(Vec2 p, Vec2 c, double r) { + Vec2 pc = p.sub(c); + double d2 = pc.x * pc.x + pc.y * pc.y; + double d = Math.sqrt(d2); + if (d < r + 1e-9) { + // p inside the circle, no real tangents + return null; + } + + // unit vector from center to point + Vec2 u = new Vec2(pc.x / d, pc.y / d); + + // decomposition: CT along u and perpendicular w + double l = r * r / d; + double h = r * Math.sqrt(1.0 - (r * r) / d2); + + Vec2 w1 = new Vec2(-u.y, u.x); + Vec2 w2 = new Vec2(u.y, -u.x); + + Vec2 t1 = c.add(u.scale(l)).add(w1.scale(h)); + Vec2 t2 = c.add(u.scale(l)).add(w2.scale(h)); + + List res = new ArrayList<>(2); + res.add(t1); + res.add(t2); + return res; + } + + private static Line lineThroughPoints(Vec2 p1, Vec2 p2) { + Vec2 v = p2.sub(p1); + double len = Math.sqrt(v.x * v.x + v.y * v.y); + if (len < 1e-9) { + return new Line(new Vec2(1.0, 0.0), -p1.x); + } + Vec2 n = new Vec2(-v.y / len, v.x / len); + double c = -(n.x * p1.x + n.y * p1.y); + return new Line(n, c); + } + + private static double distancePointToLine(Vec2 p, Line line) { + return Math.abs(line.n.x * p.x + line.n.y * p.y + line.c); + } + + /** Same φ definition as PreCluster: φ = mod(-π/2 - atan2(y,x), 2π). */ + private static double computePhiFromXY(double x, double y) { + double phi = -Math.PI / 2.0 - Math.atan2(y, x); + return mod(phi, 2.0 * Math.PI); + } + + private static double mod(double a, double b) { + return a - b * Math.floor(a / b); + } + + /** Compute Z using the same relation as Cluster constructor but with new φ values. */ + private static double computeZ(PreCluster pre1, PreCluster pre2, + double phi1, double phi2) { + + double theta = Math.toRadians(STEREO_ANGLE_DEG); + double term1 = theta * Math.pow(-1.0, pre1.get_Super_layer() - 1); + double term2 = theta * Math.pow(-1.0, pre2.get_Super_layer() - 1); + double denom = term1 - term2; + + if (Math.abs(denom) < 1e-9) { + // Should not happen with a valid stereo geometry + return 0.0; + } + + return ((phi2 - phi1) / denom) * DELTA_Z - Z_OFFSET; + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java index 1b29535d51..1bd83fe934 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java @@ -1,8 +1,15 @@ package org.jlab.rec.ahdc.HelixFit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import org.jlab.rec.ahdc.Cluster.DocaCluster; + /** Helix Fit. * * This appears to be some code translation. @@ -14,6 +21,51 @@ public class HelixFitJava { /** \todo What does this method do * \what does its name even mean? */ + + private static class CircleParams { + double xc; + double yc; + double R; + boolean ok; + + CircleParams(boolean ok) { + this.ok = ok; + } + + CircleParams(double xc, double yc, double R) { + this.xc = xc; + this.yc = yc; + this.R = R; + this.ok = true; + } + } + + // circle through origin (0,0), p1, p2 + private static CircleParams circleThroughOrigin(double x1, double y1, + double x2, double y2) { + double det = x1 * y2 - x2 * y1; + if (Math.abs(det) < 1e-6) { + // points are colinear with origin, no unique circle + return new CircleParams(false); + } + double rhs1 = 0.5 * (x1 * x1 + y1 * y1); + double rhs2 = 0.5 * (x2 * x2 + y2 * y2); + + double xc = ( rhs1 * y2 - rhs2 * y1) / det; + double yc = (-rhs1 * x2 + rhs2 * x1) / det; + double R = Math.sqrt(xc * xc + yc * yc); + + if (R < 1e-3) return new CircleParams(false); + return new CircleParams(xc, yc, R); + } + + // wrap angle into [-pi, pi] + private static double wrapPi(double a) { + while (a > Math.PI) a -= 2.0 * Math.PI; + while (a < -Math.PI) a += 2.0 * Math.PI; + return a; + } + void rwsmav(double r[], double a[], double v[], int n) { // Author: Martin Poppe. r[n] = a[n,n]*v[n] @@ -828,6 +880,96 @@ C TAN(LAMBDA) {=DZ/DS}TAN(ANGLE TO X,Y PLANE) } + private HelixFitObject helix_fit_weighted(int PointNum, double[][] szPos, + double[] weights, int fit_track_to_beamline) + { + double Rho, A, B, Phi, Theta, X0, Y0, Z0, DCA, Chi2; + int kMaxHit = 200; + double PI = Math.acos(0.0)*2.0; + + int jj; + double my_phi; + double[] rf = new double[kMaxHit]; + double[] pf = new double[kMaxHit]; + double[] wfi = new double[kMaxHit]; + double[] zf = new double[kMaxHit]; + double[] wzf = new double[kMaxHit]; + + int iopt; + int npt; + double[] vv0 = new double[5]; + double[] ee0 = new double[15]; + double ch2ph = 0.0; + double ch2z = 0.0; + double[] del = new double[kMaxHit]; + double[] delz = new double[kMaxHit]; + + double phi0; + + if (PointNum >= kMaxHit) PointNum = kMaxHit - 1; + npt = PointNum; + + for (jj = 0; jj < npt; jj++) { + // r,phi,z coordinate + rf[jj] = Math.sqrt(szPos[jj][0]*szPos[jj][0] + szPos[jj][1]*szPos[jj][1]); + pf[jj] = Math.atan(szPos[jj][1]/szPos[jj][0]); //phi angle + + if (szPos[jj][1] > 0 && szPos[jj][0] < 0) pf[jj] += PI; + if (szPos[jj][1] < 0 && szPos[jj][0] < 0) pf[jj] += PI; + if (szPos[jj][1] < 0 && szPos[jj][0] > 0) pf[jj] += 2*PI; + if (pf[jj] > 2*PI) pf[jj] -= 2*PI; + + zf[jj] = szPos[jj][2]; + + double w = 1.0; + if (weights != null && jj < weights.length && weights[jj] > 0.0) { + w = weights[jj]; + } + // wfi, wzf are treated as 1/sigma^2; for now we directly use w. + wfi[jj] = w; + wzf[jj] = w; + } + + if (fit_track_to_beamline == 1) { + rf[npt] = 0.0001; + pf[npt] = 0.0; + zf[npt] = 0.0; + wfi[npt] = 1.0; + wzf[npt] = 0.0; // do not constrain z at the beamline point + npt++; + } + + iopt = 1; + rwfthc(npt, rf, pf, wfi, zf, wzf, iopt, vv0, ee0, ch2ph, ch2z, del, delz); + + // --- same reconstruction as original helix_fit --- + Rho = 1.0 / vv0[0]; + phi0 = vv0[2]; + + my_phi = phi0 + PI; + if (vv0[0] < 0.0) my_phi += PI; + if (my_phi > PI) my_phi -= 2.0*PI; + if (my_phi < -PI) my_phi += 2.0*PI; + + A = -Math.sin(my_phi)*(-vv0[3] + Math.abs(1.0/vv0[0])); + B = Math.cos(my_phi)*(-vv0[3] + Math.abs(1.0/vv0[0])); + + Phi = vv0[2]; + if (Phi > PI) Phi -= 2*PI; + if (Phi < -PI) Phi += 2*PI; + + Theta = PI/2.0 - Math.atan(vv0[1]); + + X0 = -Math.sin(my_phi)*(-vv0[3]); + Y0 = Math.cos(my_phi)*(-vv0[3]); + Z0 = vv0[4]; + + DCA = Math.abs(vv0[3]); + Chi2 = (npt > 5) ? (ch2ph + ch2z/(npt - 5)) : 9999.9; + + return new HelixFitObject(Rho, A, B, Phi, Theta, X0, Y0, Z0, DCA, Chi2); + } + /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ public HelixFitObject HelixFit(int PointNum, double szPos[][], int fit_track_to_beamline)// double R, double A, double B, //double Phi_deg, double Theta_deg, double Z0, int fit_track_to_beamline ) @@ -855,4 +997,220 @@ public HelixFitObject HelixFit(int PointNum, double szPos[][], int fit_track_to_ return h; } +// Public weighted wrapper (similar to the original HelixFit) + public HelixFitObject HelixFitWeighted(int PointNum, double[][] szPos, + double[] weights, int fit_track_to_beamline) { + + double PI = Math.acos(0.0)*2.0; + + HelixFitObject h = helix_fit_weighted(PointNum, szPos, weights, fit_track_to_beamline); + + double Phi_deg = Math.toDegrees(h.get_Phi()); + if (Phi_deg >= 180) Phi_deg -= 360; + if (Phi_deg < -180) Phi_deg += 360; + + double Theta_deg = Math.toDegrees(h.get_Theta()); + + h.set_Phi(Phi_deg); + h.set_Theta(Theta_deg); + + return h; + } + + public HelixFitObject helix_fit_with_doca_selection(List docaClusters, + int fit_track_to_beamline) { + + HelixFitObject badFit = new HelixFitObject(0,0,0,0,0,0,0,0,0,9999.9); + + if (docaClusters == null || docaClusters.isEmpty()) { + return badFit; + } + + // ---------------------- Set clusterIndex layers ---------------------- + Map> layerMap = new HashMap<>(); + for (DocaCluster dc : docaClusters) { + int layer = dc.get_ClusterIndex(); + layerMap.computeIfAbsent(layer, k -> new ArrayList<>()).add(dc); + } + + if (layerMap.size() < 2) { + // Not enough layers to do inner/outer selection + // fall back to a simple unweighted helix fit with all docaClusters + int n = docaClusters.size(); + double[][] szPos = new double[n][3]; + for (int i = 0; i < n; i++) { + DocaCluster dc = docaClusters.get(i); + szPos[i][0] = dc.get_X(); + szPos[i][1] = dc.get_Y(); + szPos[i][2] = dc.get_Z(); + } + return helix_fit_weighted(n, szPos, null, fit_track_to_beamline); + } + + // sort layers to get inner/outer and in-between + List layers = new ArrayList<>(layerMap.keySet()); + Collections.sort(layers); + int innerLayer = layers.get(0); + int outerLayer = layers.get(layers.size() - 1); + + List innerList = layerMap.get(innerLayer); + List outerList = layerMap.get(outerLayer); + + if (innerList.isEmpty() || outerList.isEmpty()) { + // fall back + int n = docaClusters.size(); + double[][] szPos = new double[n][3]; + for (int i = 0; i < n; i++) { + DocaCluster dc = docaClusters.get(i); + szPos[i][0] = dc.get_X(); + szPos[i][1] = dc.get_Y(); + szPos[i][2] = dc.get_Z(); + } + return helix_fit_weighted(n, szPos, null, fit_track_to_beamline); + } + + // ---------------------- scan all (inner, outer) combinations ---------------------- + double bestChi2 = Double.POSITIVE_INFINITY; + Map bestChoiceByLayer = null; + + for (DocaCluster dcIn : innerList) { + double x1 = dcIn.get_X(); + double y1 = dcIn.get_Y(); + double z1 = dcIn.get_Z(); + + for (DocaCluster dcOut : outerList) { + double x2 = dcOut.get_X(); + double y2 = dcOut.get_Y(); + double z2 = dcOut.get_Z(); + + // circle through origin and the two docaClusters + CircleParams circ = circleThroughOrigin(x1, y1, x2, y2); + if (!circ.ok) continue; + + double xc = circ.xc; + double yc = circ.yc; + double R = circ.R; + + // angles around circle center for the two endpoints + double phi1 = Math.atan2(y1 - yc, x1 - xc); + double phi2 = Math.atan2(y2 - yc, x2 - xc); + double dphi21 = wrapPi(phi2 - phi1); + if (Math.abs(dphi21) < 1e-4) continue; + + // For this trial helix, compute chi2: + // for each layer choose the docaCluster with minimal weighted 3D residual. + double chi2 = 0.0; + Map choiceThisPair = new HashMap<>(); + + for (int layer : layers) { + List candList = layerMap.get(layer); + if (candList == null || candList.isEmpty()) { + chi2 = Double.POSITIVE_INFINITY; + break; + } + + double bestLayerValue = Double.POSITIVE_INFINITY; + DocaCluster bestLayerDc = null; + + for (DocaCluster dc : candList) { + double x = dc.get_X(); + double y = dc.get_Y(); + double z = dc.get_Z(); + + double phi = Math.atan2(y - yc, x - xc); + double dphi = wrapPi(phi - phi1); + double frac = dphi / dphi21; // s / s_total + + // predicted point on circle (same phi) + double xPred = xc + R * Math.cos(phi); + double yPred = yc + R * Math.sin(phi); + // linear z(s) + double zPred = z1 + (z2 - z1) * frac; + + double dx = x - xPred; + double dy = y - yPred; + double dz = z - zPred; + double res2 = dx * dx + dy * dy + dz * dz; + + double w = dc.get_Weight(); + if (w <= 0) w = 1.0; + + double value = w * res2; + + if (value < bestLayerValue) { + bestLayerValue = value; + bestLayerDc = dc; + } + } + + if (bestLayerDc == null) { + chi2 = Double.POSITIVE_INFINITY; + break; + } + + chi2 += bestLayerValue; + choiceThisPair.put(layer, bestLayerDc); + } + + if (chi2 < bestChi2) { + bestChi2 = chi2; + bestChoiceByLayer = choiceThisPair; + } + } + } + + // ---------------------- if no reasonable combination,return ---------------------- + if (bestChoiceByLayer == null || bestChoiceByLayer.isEmpty()) { + int n = docaClusters.size(); + double[][] szPos = new double[n][3]; + for (int i = 0; i < n; i++) { + DocaCluster dc = docaClusters.get(i); + szPos[i][0] = dc.get_X(); + szPos[i][1] = dc.get_Y(); + szPos[i][2] = dc.get_Z(); + } + return helix_fit_weighted(n, szPos, null, fit_track_to_beamline); + } + + // ---------------------- 4 points from best combination,then use original helix_fit ---------------------- + List bestLayers = new ArrayList<>(bestChoiceByLayer.keySet()); + Collections.sort(bestLayers); + + int nPoints = bestLayers.size(); + double[][] szPosSel = new double[nPoints][3]; + + for (int i = 0; i < nPoints; i++) { + int layer = bestLayers.get(i); + DocaCluster dc = bestChoiceByLayer.get(layer); + szPosSel[i][0] = dc.get_X(); + szPosSel[i][1] = dc.get_Y(); + szPosSel[i][2] = dc.get_Z(); + } + + // weights = null => all weights = 1.0 inside helix_fit_weighted + + double PI=Math.acos(0.0)*2; + //double Rho=0,Phi=0,Theta=0,X0=0,Y0=0,DCA=0,Chi2=0; + double Phi_deg; + double Theta_deg; + + HelixFitObject h = helix_fit_weighted(nPoints, szPosSel, null, fit_track_to_beamline);; + + Phi_deg=Math.toDegrees(h.get_Phi()); + if(Phi_deg >= 180){ + Phi_deg -= 360; + } + if(Phi_deg < -180){ + Phi_deg += 360; + } + Theta_deg=Math.toDegrees(h.get_Theta()); + h.set_Phi(Phi_deg); + h.set_Theta(Theta_deg); + + return h; + + } + } + + diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index 6e55b25c88..2ecda96c28 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -10,6 +10,8 @@ import org.jlab.rec.ahdc.Banks.RecoBankWriter; import org.jlab.rec.ahdc.Cluster.Cluster; import org.jlab.rec.ahdc.Cluster.ClusterFinder; +import org.jlab.rec.ahdc.Cluster.DocaClusterRefiner; +import org.jlab.rec.ahdc.Cluster.DocaCluster; import org.jlab.rec.ahdc.Distance.Distance; import org.jlab.rec.ahdc.HelixFit.HelixFitJava; import org.jlab.rec.ahdc.Hit.Hit; @@ -215,23 +217,19 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { // V) Global fit int trackid = 0; + ArrayList all_docaClusters = new ArrayList<>(); for (Track track : AHDC_Tracks) { trackid++; track.set_trackId(trackid); - int nbOfPoints = track.get_Clusters().size(); - - double[][] szPos = new double[nbOfPoints][3]; - - int j = 0; - for (Cluster cluster : track.get_Clusters()) { - szPos[j][0] = cluster.get_X(); - szPos[j][1] = cluster.get_Y(); - szPos[j][2] = cluster.get_Z(); - j++; + List originalClusters = track.get_Clusters(); + ArrayList docaClusters = DocaClusterRefiner.buildRefinedClusters(originalClusters); + all_docaClusters.addAll(docaClusters); + if (docaClusters == null || docaClusters.size() < 3) { + // not enough points, skip helix fit + continue; } - HelixFitJava h = new HelixFitJava(); - track.setPositionAndMomentum(h.HelixFit(nbOfPoints, szPos, 1)); + track.setPositionAndMomentum(h.helix_fit_with_doca_selection(docaClusters, 1)); } // VII) Write bank @@ -245,6 +243,7 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { } DataBank recoClusterBank = writer.fillClustersBank(event, AHDC_Clusters); DataBank recoTracksBank = writer.fillAHDCTrackBank(event, AHDC_Tracks); + DataBank clustersDocaBank = writer.fillAHDCDocaClustersBank(event, all_docaClusters); ArrayList all_interclusters = new ArrayList<>(); for (Track track : AHDC_Tracks) { @@ -259,6 +258,7 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { event.appendBank(recoClusterBank); event.appendBank(recoTracksBank); event.appendBank(recoInterClusterBank); + event.appendBank(clustersDocaBank); // event.appendBank(AIPredictionBanks); if (simulation) { From 73e801ce3c8a09b52b3b53ea060faddf7aa77241 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Tue, 17 Feb 2026 15:35:23 -0500 Subject: [PATCH 061/190] Revert "fix cvmfs github CI issues with 5.4 (#1109)" (#1110) --- .github/workflows/ci.yml | 12 ++++++------ .../{validation.yml-DISABLED => validation.yml} | 0 2 files changed, 6 insertions(+), 6 deletions(-) rename .github/workflows/{validation.yml-DISABLED => validation.yml} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ad94e776c..5c46dbf34e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,7 +77,7 @@ jobs: distribution: ${{ env.java_distribution }} cache: maven - name: setup cvmfs - uses: cvmfs-contrib/github-action-cvmfs@v5.4 + uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: cvmfs @@ -128,7 +128,7 @@ jobs: java-version: ${{ matrix.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: cvmfs-contrib/github-action-cvmfs@v5.4 + - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: unit tests @@ -155,7 +155,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: cvmfs-contrib/github-action-cvmfs@v5.4 + - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - uses: actions/download-artifact@v7 @@ -177,7 +177,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: cvmfs-contrib/github-action-cvmfs@v5.4 + - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - uses: actions/download-artifact@v7 @@ -209,7 +209,7 @@ jobs: distribution: ${{ env.java_distribution }} cache: maven - name: setup cvmfs - uses: cvmfs-contrib/github-action-cvmfs@v5.4 + uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - uses: actions/download-artifact@v7 @@ -265,7 +265,7 @@ jobs: - uses: actions/download-artifact@v7 with: name: build_${{ matrix.runner }} - - uses: cvmfs-contrib/github-action-cvmfs@v5.4 + - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: untar build diff --git a/.github/workflows/validation.yml-DISABLED b/.github/workflows/validation.yml similarity index 100% rename from .github/workflows/validation.yml-DISABLED rename to .github/workflows/validation.yml From 75902b8d6f1b374d5a04a4afe58a5da83a9596be Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 18 Feb 2026 09:30:42 -0500 Subject: [PATCH 062/190] feat: honor/preserve user's option order (#1106) * options should preserve creation order * remove noise * remove extra lines --- .../java/org/jlab/utils/options/OptionParser.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java index d0e1f26b9f..9b6f34f68d 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.TreeMap; +import java.util.LinkedHashMap; import java.util.logging.Logger; import java.util.logging.Level; import org.jlab.logging.SplitLogManager; @@ -19,9 +19,9 @@ */ public class OptionParser { - private Map optionsDescriptors = new TreeMap<>(); - private Map requiredOptions = new TreeMap<>(); - private Map parsedOptions = new TreeMap<>(); + private Map optionsDescriptors = new LinkedHashMap<>(); + private Map requiredOptions = new LinkedHashMap<>(); + private Map parsedOptions = new LinkedHashMap<>(); private Set overridenOptions = new HashSet<>(); private List parsedInputList = new ArrayList<>(); private String program = "undefined"; @@ -129,13 +129,7 @@ public String getUsageString(){ } public void printUsage(){ - System.out.println("\n\n"); - System.out.println("*******************************************"); - System.out.println("* PROGRAM USAGE : by OptionParser *"); - System.out.println("*******************************************"); - System.out.println("\n\n"); System.out.println(this.getUsageString()); - System.out.println("\n\n"); } public void parse(String... args) { From 718b719b8970535fc097a459505f90fa372f8d89 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Wed, 18 Feb 2026 10:33:35 -0500 Subject: [PATCH 063/190] ci!: remove `clas12-validation` trigger, in favor of `orca` (#1111) [`orca`](https://code.jlab.org/hallb/clas12/orca) is now running more smoothly, and is meant to replace [`clas12-validation`](https://github.com/JeffersonLab/clas12-validation). We've been running both for some time, now it's time to disable our `clas12-validation` trigger. --- .github/workflows/validation.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .github/workflows/validation.yml diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml deleted file mode 100644 index 6c42d6d924..0000000000 --- a/.github/workflows/validation.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Validation - -on: - pull_request: - push: - branches: [ development ] - tags: [ '*' ] - workflow_dispatch: - -jobs: - validation: - uses: JeffersonLab/clas12-validation/.github/workflows/ci.yml@main - with: - matrix_evgen: >- - [ - "e_p", - "e_n", - "e_g", - "e_pC", - "eFT_K", - "e_gFT" - ] - matrix_config: >- - [ - "rgb_fall2019" - ] From 5d5095989b7890a16ba957570ce905997c32612f Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Thu, 19 Feb 2026 22:07:17 -0500 Subject: [PATCH 064/190] doc: replace CI badge `validation` -> `orca` (#1114) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 41938c803b..90891ffd1b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # COATJAVA [![Build Status](https://github.com/jeffersonlab/coatjava/workflows/Coatjava-CI/badge.svg)](https://github.com/jeffersonlab/coatjava/actions) -[![Validation Status](https://github.com/JeffersonLab/coatjava/actions/workflows/validation.yml/badge.svg)](https://github.com/JeffersonLab/coatjava/actions/workflows/validation.yml) +[![ORCA](https://github.com/JeffersonLab/coatjava/actions/workflows/orca.yml/badge.svg)](https://github.com/JeffersonLab/coatjava/actions/workflows/orca.yml) [![Coverage](https://badgen.net/static/JaCoCo/coverage/purple)](https://jeffersonlab.github.io/coatjava/jacoco) | Table of Contents | | From 82a493644df647f6b48e2c950fee451f133bb623 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Feb 2026 16:39:52 +0000 Subject: [PATCH 065/190] chore(submodule): bump etc/data/nnet from `f43cee9` to `efa89e4` (#1118) Bumps etc/data/nnet from `f43cee9` to `efa89e4`. --- updated-dependencies: - dependency-name: etc/data/nnet dependency-version: efa89e44d0c68e2107105cc39096b41d98bba590 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- etc/data/nnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/data/nnet b/etc/data/nnet index f43cee9e39..efa89e44d0 160000 --- a/etc/data/nnet +++ b/etc/data/nnet @@ -1 +1 @@ -Subproject commit f43cee9e391eb1db30f61f125ecc7f7d3f3cf37e +Subproject commit efa89e44d0c68e2107105cc39096b41d98bba590 From 1184e97825d37126b4a5869a85f1bf1d4fd60f4e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 20 Feb 2026 12:05:49 -0500 Subject: [PATCH 066/190] use maven enforcer plugin for Java version (#1113) Added Maven Enforcer Plugin to enforce Java version. --- pom.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pom.xml b/pom.xml index f6fca6969c..41959dfef5 100644 --- a/pom.xml +++ b/pom.xml @@ -263,6 +263,28 @@ + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.6.2 + + + enforce-java + + enforce + + + + + [21,) + + + + + + + com.github.spotbugs From 06e3e4db4b88d1ba984fc69d5684f59ba44de5f9 Mon Sep 17 00:00:00 2001 From: Uditha Weerasinghe <92590276+skuditha@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:26:56 -0500 Subject: [PATCH 067/190] feat: ALERT AI Pre PID (#1112) * modified recobankwriter with dummy functions * added a call for AI PID --currently in testing mode * commented lines out for testing * commented lines out for testing * modified to include PrePID similar to TrackMatching * modified to include PrePID similar to TrackMatching * created PrePIDResult.java * created ModelPrePID.java * added ALERT PID bank to bankdefs * added ALERT PrePID bank to bankdefs * cleaning up * cleaning up * fix: added probabilities for prepid * fixed a typo in alert.json * fix: changed all prints to logger + minor cleanup * fix: added info to alert.json for AI PID bank * major change: switched from ATOF::clusters to ATOF::hits --------- Co-authored-by: Uditha Weerasinghe --- etc/bankdefs/hipo4/alert.json | 32 ++++++ .../org/jlab/rec/alert/AIPID/ModelPrePID.java | 104 ++++++++++++++++++ .../jlab/rec/alert/AIPID/PrePIDResult.java | 19 ++++ .../jlab/rec/alert/banks/RecoBankWriter.java | 27 +++++ .../org/jlab/service/alert/ALERTEngine.java | 94 +++++++++++++++- 5 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/ModelPrePID.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/PrePIDResult.java diff --git a/etc/bankdefs/hipo4/alert.json b/etc/bankdefs/hipo4/alert.json index 3867406bdb..64d4faeec1 100644 --- a/etc/bankdefs/hipo4/alert.json +++ b/etc/bankdefs/hipo4/alert.json @@ -65,6 +65,38 @@ {"name": "trackid", "type": "I", "info": "track id"}, {"name": "matched_atof_hit_id", "type": "I", "info": "id of the matched ATOF hit, -1 if no hit was matched"} ] + }, + { + "name": "ALERT::ai:prepid", + "group": 23000, + "item": 33, + "info": "ALERT AI-assisted PrePID to be used for Kalman Filter", + "entries": [ + {"name":"trackid", "type":"I", "info":"AHDC trackid"}, + {"name":"clusterid", "type":"I", "info":"ATOF cluster id"}, + {"name":"prepid", "type":"I", "info":"argmax PID"}, + {"name":"p2212", "type":"F", "info":"P(pid=2212)"}, + {"name":"p45", "type":"F", "info":"P(pid=45)"}, + {"name":"p46", "type":"F", "info":"P(pid=46)"}, + {"name":"p47", "type":"F", "info":"P(pid=47)"}, + {"name":"p49", "type":"F", "info":"P(pid=49)"} + ] + }, + { + "name": "ALERT::ai:pid", + "group": 23000, + "item": 34, + "info": "AI-assisted PID for ALERT", + "entries": [ + {"name":"trackid", "type":"I", "info":"AHDC trackid"}, + {"name":"clusterid", "type":"I", "info":"ATOF cluster id"}, + {"name":"pid", "type":"I", "info":"argmax PID"}, + {"name":"prob_2212", "type":"F", "info":"P(pid=2212)"}, + {"name":"prob_45", "type":"F", "info":"P(pid=45)"}, + {"name":"prob_46", "type":"F", "info":"P(pid=46)"}, + {"name":"prob_47", "type":"F", "info":"P(pid=47)"}, + {"name":"prob_49", "type":"F", "info":"P(pid=49)"} + ] }, { "name": "ATOF::hits", diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/ModelPrePID.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/ModelPrePID.java new file mode 100644 index 0000000000..4f91f4deed --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/ModelPrePID.java @@ -0,0 +1,104 @@ +package org.jlab.rec.alert.AIPID; + +import ai.djl.MalformedModelException; +import ai.djl.inference.Predictor; +import ai.djl.ndarray.NDArray; +import ai.djl.ndarray.NDList; +import ai.djl.ndarray.NDManager; +import ai.djl.ndarray.types.Shape; +import ai.djl.repository.zoo.Criteria; +import ai.djl.repository.zoo.ModelNotFoundException; +import ai.djl.repository.zoo.ZooModel; +import ai.djl.training.util.ProgressBar; +import ai.djl.translate.TranslateException; +import ai.djl.translate.Translator; +import ai.djl.translate.TranslatorContext; + +import org.jlab.utils.CLASResources; + +import java.io.IOException; +import java.nio.file.Paths; +import java.util.logging.Logger; + +public class ModelPrePID { + + static final Logger LOGGER = Logger.getLogger(ModelPrePID.class.getName()); + // Must match training class order + private static final int[] CLASS_IDS = new int[]{2212, 45, 46, 47, 49}; + + private final ZooModel model; + + public ModelPrePID() { + + Translator my_translator = new Translator<>() { + + @Override + public NDList processInput(TranslatorContext ctx, float[] floats) { + NDManager manager = ctx.getNDManager(); + + // IMPORTANT: model expects (batch, 23). Provide (1, 23). + NDArray x = manager.create(floats, new Shape(1, 23)); + return new NDList(x); + } + + @Override + public float[] processOutput(TranslatorContext ctx, NDList ndList) { + NDArray logits = ndList.get(0); // (1,5) + NDArray probs = logits.softmax(1); // (1,5) + + float[] p = probs.toFloatArray(); // length 5 (row-major) + + // argmax + int bestIdx = 0; + float best = p[0]; + for (int k = 1; k < 5; k++) { + if (p[k] > best) { best = p[k]; bestIdx = k; } + } + int prepid = CLASS_IDS[bestIdx]; + + // Return: prepid + probabilities in fixed class order + return new float[]{ + (float) prepid, + p[0], p[1], p[2], p[3], p[4] + }; + } + }; + + System.setProperty("ai.djl.pytorch.num_interop_threads", "1"); + System.setProperty("ai.djl.pytorch.num_threads", "1"); + System.setProperty("ai.djl.pytorch.graph_optimizer", "false"); + + String path = CLASResources.getResourcePath("etc/data/nnet/rg-l/model_PrePID/"); + + Criteria criteria = Criteria.builder() + .setTypes(float[].class, float[].class) + .optModelPath(Paths.get(path)) + .optEngine("PyTorch") + .optTranslator(my_translator) + .optProgress(new ProgressBar()) + .build(); + + try { + model = criteria.loadModel(); + } catch (IOException | ModelNotFoundException | MalformedModelException e) { + throw new RuntimeException(e); + } + } + + public ZooModel getModel() { + return model; + } + + /** Returns float[]{prepid} where prepid in {2212,45,46,47,49}. + * @param features23 + * @return + * @throws ai.djl.translate.TranslateException */ + public float[] prediction(float[] features23) throws TranslateException { + if (features23 == null || features23.length != 23) { + LOGGER.warning("PrePID input must be float[23]"); + return null; + } + Predictor predictor = model.newPredictor(); + return predictor.predict(features23); + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/PrePIDResult.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/PrePIDResult.java new file mode 100644 index 0000000000..cf50e4d665 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AIPID/PrePIDResult.java @@ -0,0 +1,19 @@ +package org.jlab.rec.alert.AIPID; + +public class PrePIDResult { + public final int trackid; + public final int clusterid; + public final int prepid; + public final float p2212, p45, p46, p47, p49; + + public PrePIDResult(int trackid, int clusterid, int prepid, float p2212, float p45, float p46, float p47, float p49) { + this.trackid = trackid; + this.clusterid = clusterid; + this.prepid = prepid; + this.p2212 = p2212; + this.p45 = p45; + this.p46 = p46; + this.p47 = p47; + this.p49 = p49; + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/banks/RecoBankWriter.java index 3d654b7433..a6c8c756b5 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/alert/banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/banks/RecoBankWriter.java @@ -1,9 +1,11 @@ package org.jlab.rec.alert.banks; import java.util.ArrayList; +import java.util.List; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.rec.alert.projections.TrackProjection; +//import org.jlab.rec.alert.AIpid.PIDResult; import ai.djl.util.Pair; @@ -89,6 +91,31 @@ public int appendTrackMatchingAIBank(DataEvent event, ArrayList results) { + + DataBank bank = event.createBank("ALERT::ai:prepid", results.size()); + if (bank == null) { + System.err.println("COULD NOT CREATE A ALERT::ai:prepid BANK!!!!!!"); + return 1; + } + + for (int i = 0; i < results.size(); i++) { + org.jlab.rec.alert.AIPID.PrePIDResult r = results.get(i); + bank.setInt("trackid", i, r.trackid); + bank.setInt("clusterid", i, r.clusterid); + bank.setInt("prepid", i, r.prepid); + bank.setFloat("p2212", i, r.p2212); + bank.setFloat("p45", i, r.p45); + bank.setFloat("p46", i, r.p46); + bank.setFloat("p47", i, r.p47); + bank.setFloat("p49", i, r.p49); + } + + event.appendBank(bank); + return 0; + } + /** * @param args the command line arguments diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index caeeba638f..5465ec29d8 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -1,5 +1,7 @@ package org.jlab.service.alert; +import ai.djl.repository.zoo.ZooModel; +import ai.djl.translate.TranslateException; import java.io.File; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; @@ -14,6 +16,7 @@ import org.jlab.io.hipo.HipoDataSource; import org.jlab.io.hipo.HipoDataSync; import org.jlab.rec.alert.TrackMatchingAI.ModelTrackMatching; +import org.jlab.rec.alert.AIPID.ModelPrePID; import org.jlab.rec.alert.banks.RecoBankWriter; import org.jlab.rec.alert.projections.TrackProjector; import org.jlab.rec.atof.hit.ATOFHit; @@ -24,10 +27,12 @@ import org.jlab.rec.ahdc.Track.Track; import org.jlab.clas.pdg.PDGDatabase; import org.jlab.clas.pdg.PDGParticle; +import java.util.logging.Logger; import ai.djl.util.Pair; +import org.jlab.rec.alert.AIPID.PrePIDResult; /** @@ -51,7 +56,7 @@ public class ALERTEngine extends ReconstructionEngine { * */ private RecoBankWriter rbc; - + static final Logger LOGGER = Logger.getLogger(ModelPrePID.class.getName()); Detector ATOF; // ALERT ATOF detector private AlertDCDetector AHDC; // ALERT AHDC detector @@ -64,6 +69,7 @@ public class ALERTEngine extends ReconstructionEngine { private double b; //Magnetic field private ModelTrackMatching modelTrackMatching; + private ModelPrePID modelPrePID; public void setB(double B) { this.b = B; @@ -90,6 +96,7 @@ public boolean init() { rbc = new RecoBankWriter(); modelTrackMatching = new ModelTrackMatching(); + modelPrePID = new ModelPrePID(); AlertTOFFactory factory = new AlertTOFFactory(); DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); @@ -222,7 +229,92 @@ public boolean processDataEvent(DataEvent event) { } } rbc.appendTrackMatchingAIBank(event, matched_ATOF_hit_id); + + // --------------------------------------------------------------------------------------- + // PrePID using AI (AHDC::track + ATOF::clusters matched via ALERT::ai:projections) + // --------------------------------------------------------------------------------------- + if (event.hasBank("ALERT::ai:projections") && event.hasBank("AHDC::track") && event.hasBank("ATOF::hits")) { + + DataBank bankProj = event.getBank("ALERT::ai:projections"); + DataBank bankTrk = event.getBank("AHDC::track"); + DataBank bankHit = event.getBank("ATOF::hits"); + + ArrayList prepid_results = new ArrayList<>(); + + for (int i = 0; i < bankProj.rows(); i++) { + + int trackid = bankProj.getInt("trackid", i); + int hitid = bankProj.getInt("matched_atof_hit_id", i); // TODO: Fix to hit_id instead of clusterid + + // TODO: refactor this to replace this with single line + int trkRow = -1; + for (int r = 0; r < bankTrk.rows(); r++) { + if (bankTrk.getInt("trackid", r) == trackid) { trkRow = r; break; } + } + if (trkRow < 0) continue; + int hitRow = -1; + for (int r = 0; r < bankHit.rows(); r++) { + if (bankHit.getInt("id", r) == hitid) { hitRow = r; break; } + } + if (hitRow < 0) continue; + + // Build feature vector float[23] in the exact training order + float[] x = new float[23]; + + // AHDC::track (13) + x[0] = bankTrk.getFloat("x", trkRow); + x[1] = bankTrk.getFloat("y", trkRow); + x[2] = bankTrk.getFloat("z", trkRow); + x[3] = bankTrk.getFloat("px", trkRow); + x[4] = bankTrk.getFloat("py", trkRow); + x[5] = bankTrk.getFloat("pz", trkRow); + x[6] = bankTrk.getInt("n_hits", trkRow); + x[7] = bankTrk.getInt("sum_adc", trkRow); + x[8] = bankTrk.getFloat("path", trkRow); + x[9] = bankTrk.getFloat("dEdx", trkRow); + x[10] = bankTrk.getFloat("p_drift", trkRow); + x[11] = bankTrk.getFloat("chi2", trkRow); + x[12] = bankTrk.getFloat("sum_residuals", trkRow); + + /*// ATOF::clusters (10) + x[13] = bankClu.getInt("n_bar", cluRow); + x[14] = bankClu.getInt("n_wedge", cluRow); + x[15] = bankClu.getFloat("time", cluRow); + x[16] = bankClu.getFloat("x", cluRow); + x[17] = bankClu.getFloat("y", cluRow); + x[18] = bankClu.getFloat("z", cluRow); + x[19] = bankClu.getFloat("energy", cluRow); + x[20] = bankClu.getFloat("pathlength", cluRow); + x[21] = bankClu.getFloat("inpathlength", cluRow); + x[22] = bankClu.getInt("projID", cluRow);*/ + + // ATOF::Hits (Temporarily updating to the same 10 slots as ATOF Clusters would have if it worked) + x[13] = 0f; + x[14] = 0f; + x[15] = bankHit.getFloat("time", hitRow); + x[16] = bankHit.getFloat("x", hitRow); + x[17] = bankHit.getFloat("y", hitRow); + x[18] = bankHit.getFloat("z", hitRow); + x[19] = bankHit.getFloat("energy", hitRow); + x[20] = 0f; + x[21] = 0f; + x[22] = 0f; + + try { + float[] pred = modelPrePID.prediction(x); + int prepid = (int) pred[0]; + prepid_results.add(new PrePIDResult(trackid, hitid, prepid, pred[1], pred[2], pred[3], pred[4], pred[5])); + } catch (TranslateException ex) { + LOGGER.warning(() -> "Exception in ALERTEngine PrePID: " + ex); + } + } + + rbc.appendPrePIDBank(event, prepid_results); + } + + + /////////////////////////////////////////// /// Kalmam Filter /// /////////////////////////////////////// From 57de464972dca8a34c04d959b70b88b23237477e Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Mon, 23 Feb 2026 10:45:24 -0500 Subject: [PATCH 068/190] fixing issue with urwell protype dimensions not being set before creation of geant4 volumes (#1122) --- .../geant4/v2/MPGD/MUVT/MUVTStripFactory.java | 3 +- .../geant4/v2/MPGD/URWT/URWTConstants.java | 36 +++- .../v2/MPGD/URWT/URWTGeant4Factory.java | 29 +--- .../geant4/v2/MPGD/URWT/URWTStripFactory.java | 5 +- .../trapezoid/MPGDTrapezoidConstants.java | 156 +++++++++++++++++ .../trapezoid/MPGDTrapezoidGeant4Factory.java | 160 +----------------- .../trapezoid/MPGDTrapezoidStripFactory.java | 7 +- 7 files changed, 202 insertions(+), 194 deletions(-) diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java index 59bc9230eb..1466e29c5b 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/MUVT/MUVTStripFactory.java @@ -24,8 +24,9 @@ public final class MUVTStripFactory extends MPGDTrapezoidStripFactory { /** * Build using an already-configured DatabaseConstantProvider. + * @param cp */ - public MUVTStripFactory(DatabaseConstantProvider cp, String variation) { + public MUVTStripFactory(DatabaseConstantProvider cp) { super(new MUVTConstants(cp)); diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java index b8a271b257..4a5152aee1 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTConstants.java @@ -8,25 +8,53 @@ */ public final class URWTConstants extends MPGDTrapezoidConstants { - private URWTConstants() { + private final String variation; + + private URWTConstants(String variation) { super( "/test/urwt/", // CCDB base path "urwt_global", // global table name "urwt_material", // material table name "urwt" // detector nams ); + this.variation = variation; } public URWTConstants(int run, String variation) { - this(); + this(variation); DatabaseConstantProvider cp = new DatabaseConstantProvider(run, variation); this.load(cp); cp.disconnect(); } - public URWTConstants(DatabaseConstantProvider cp) { - this(); + public URWTConstants(DatabaseConstantProvider cp, String variation) { + this(variation); this.load(cp); } + + /** + * + * @param region + * @return + */ + @Override + public SectorDimensions getSectorActiveVolumeDimensions(int region) { + + if (variation != null && variation.toLowerCase().contains("proto")) { + + double halfThickness = this.getSectorThickness() / 2.0; + double tiltRad = Math.toRadians(THTILT); + + // da vertici (mm) + double halfLargeBase = 72.71785; + double halfSmallBase = 50.44350; + double halfHeight = 24.74554; + + return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, tiltRad); + } + + return super.getSectorActiveVolumeDimensions(region); + } + } diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java index 31a0a13d32..e77db56138 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTGeant4Factory.java @@ -15,40 +15,13 @@ */ public final class URWTGeant4Factory extends MPGDTrapezoidGeant4Factory { - private final String variation; public URWTGeant4Factory(DatabaseConstantProvider cp, String variation) { - super(new URWTConstants(cp)); - this.variation = variation; + super(new URWTConstants(cp, variation)); } public URWTGeant4Factory(int run, String variation) { super(new URWTConstants(run, variation)); - this.variation = variation; - } - - /** - * - * @param region - * @return - */ - @Override - public SectorDimensions getSectorActiveVolumeDimensions(int region) { - - if (variation != null && variation.toLowerCase().contains("proto")) { - - double halfThickness = this.getSectorThickness() / 2.0; - double tiltRad = Math.toRadians(C.THTILT); - - // da vertici (mm) - double halfLargeBase = 72.71785; - double halfSmallBase = 50.44350; - double halfHeight = 24.74554; - - return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, tiltRad); - } - - return super.getSectorActiveVolumeDimensions(region); } /** diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java index 2c2a735388..9d634258e6 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/URWT/URWTStripFactory.java @@ -25,9 +25,10 @@ public final class URWTStripFactory extends MPGDTrapezoidStripFactory { /** * Build using an already-configured DatabaseConstantProvider. * @param cp + * @param variation */ - public URWTStripFactory(DatabaseConstantProvider cp) { - super(new URWTConstants(cp)); + public URWTStripFactory(DatabaseConstantProvider cp, String variation) { + super(new URWTConstants(cp, variation)); for (Geant4Basic v : geo.getAllVolumes()) { if (v.getName() != null) { diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java index 2857345d8a..8d039282b7 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidConstants.java @@ -1,5 +1,6 @@ package org.jlab.detector.geant4.v2.MPGD.trapezoid; +import eu.mihosoft.vrl.v3d.Vector3d; import org.jlab.detector.calib.utils.DatabaseConstantProvider; import java.util.LinkedHashMap; @@ -70,6 +71,17 @@ public class MPGDTrapezoidConstants { public static final double YENLARGEMENT = 0.15; // cm public static final double ZENLARGEMENT = 0.02; // cm + + + public static record SectorDimensions( + double halfThickness, + double halfHeight, + double halfLargeBase, + double halfSmallBase, + double tiltRad + ) { + } + // ------------------------------------------------------------------------ // Material description: (layer, component) -> parameters // ------------------------------------------------------------------------ @@ -221,4 +233,148 @@ public synchronized void getConstants(DatabaseConstantProvider cp) { .put(component, info); } } + + // ------------------------------------------------------------------------ + // Sector geometry helpers + // ------------------------------------------------------------------------ + /** + * Computes the total thickness (mm) of a sector by summing the thickness of + * all material volumes. + * + * @return + */ + public double getSectorThickness() { + return detectorStructure.values() + .stream() + .flatMap(componentMap -> componentMap.values().stream()) + .mapToDouble(info -> info.thickness) + .sum(); + } + + /** + * + * @param region + * @return + */ + public SectorDimensions getSectorActiveVolumeDimensions(int region) { + + double baseDistance = this.TGTDET + region * this.DZ; + + double sectorHeight = baseDistance + * (Math.tan(Math.toRadians(this.THMAX - this.THTILT)) + + Math.tan(Math.toRadians(this.THTILT - this.THMIN))); + + double halfThickness = this.getSectorThickness() / 2.0; + double halfHeight = sectorHeight / 2.0; + + // Distance from target to the bottom base along the tilted axis + double W2TGT = (this.TGTDET + region * this.DZ) + / Math.cos(Math.toRadians(this.THTILT - this.THMIN)); + + double YMIN = W2TGT * Math.sin(Math.toRadians(this.THMIN)); // distance from beamline (Y) + double h = sectorHeight * Math.cos(Math.toRadians(this.THTILT)); + double halfSmallBase = 0.5 * (YMIN * Math.tan(Math.toRadians(this.THOPEN) / 2)); + + double halfLargeBase = halfSmallBase + sectorHeight * Math.tan(Math.toRadians(this.THOPEN / 2.0)); + + double tiltRad = Math.toRadians(this.THTILT); + + double twidth_Check = 2 * halfLargeBase * Math.sin(Math.toRadians(this.THOPEN)); + + if (MPGDTrapezoidConstants.VERBOSE) { + System.out.printf("this.TWIDT=%.3f vs %.3f", this.TWIDTH, twidth_Check); + + System.out.printf("YMIN=%.3f", YMIN); + + System.out.printf( + "SectorDimensionsPhysical [%s] region=%d : height=%.3f | halfT=%.3f halfH=%.3f " + + "halfLarge=%.3f halfSmall=%.3f tilt(deg)=%.3f%n", + this.detectorName, region, sectorHeight, + halfThickness, halfHeight, + halfLargeBase, halfSmallBase, + this.THTILT + ); + } + + return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, tiltRad); + } + + /** + * + * @param region + * @return + */ + public SectorDimensions getSectorContainerDimensions(int region) { + + SectorDimensions phys = getSectorActiveVolumeDimensions(region); + + double halfThickness = phys.halfThickness() + MPGDTrapezoidConstants.ZENLARGEMENT; + double halfHeight = phys.halfHeight() + MPGDTrapezoidConstants.YENLARGEMENT; + double halfLargeBase = phys.halfLargeBase() + MPGDTrapezoidConstants.XENLARGEMENT; + double halfSmallBase = phys.halfSmallBase() + MPGDTrapezoidConstants.XENLARGEMENT; + + return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, phys.tiltRad()); + } + + /** + * Computes the sector height (longitudinal extension in the RZ plane) for a + * given region. + * + * @param region + * @return + */ + public double getSectorHeight(int region) { + + double baseDistance = this.TGTDET + region * this.DZ; + + double sectorHeight = baseDistance + * (Math.tan(Math.toRadians(this.THMAX - this.THTILT)) + + Math.tan(Math.toRadians(this.THTILT - this.THMIN))); + + if (MPGDTrapezoidConstants.VERBOSE) { + System.out.printf( + "SectorHeight [%s] region=%d : baseDistance=%.3f THMIN=%.3f THMAX=%.3f THTILT=%.3f -> height=%.3f%n", + this.detectorName, + region, + baseDistance, + this.THMIN, this.THMAX, this.THTILT, + sectorHeight + ); + } + + return sectorHeight; + } + + /** + * Computes the barycenter coordinates of a given sector/region in the + * CLAS12 coordinate system. + * + * @param isector + * @param iregion + * @return + */ + public Vector3d getCenterCoordinate(int isector, int iregion) { + + Vector3d vCenter = new Vector3d(0, 0, 0); + + // Distance from target to the bottom base along the tilted axis + double W2TGT = (this.TGTDET + iregion * this.DZ) + / Math.cos(Math.toRadians(this.THTILT - this.THMIN)); + + double YMIN = W2TGT * Math.sin(Math.toRadians(this.THMIN)); // distance from beamline (Y) + double ZMIN = W2TGT * Math.cos(Math.toRadians(this.THMIN)); // Z of the bottom base + + SectorDimensions dimCont = this.getSectorContainerDimensions(iregion); + double sectorHeight = 2 * dimCont.halfHeight(); + + vCenter.x = 0.0; + vCenter.y = (sectorHeight / 2.0) * Math.cos(Math.toRadians(this.THTILT)) + YMIN; + vCenter.z = -(sectorHeight / 2.0) * Math.sin(Math.toRadians(this.THTILT)) + ZMIN; + + // Rotate to the correct sector around Z (assumes 6 sectors, 60° apart) + vCenter.rotateZ(-Math.toRadians(90.0 - isector * 60.0)); + + return vCenter; + } + } diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java index 82904ccb61..592e6910f6 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidGeant4Factory.java @@ -5,6 +5,7 @@ import org.jlab.detector.volume.G4Trap; import org.jlab.detector.volume.G4World; import org.jlab.detector.volume.Geant4Basic; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidConstants.SectorDimensions; import java.util.Map; @@ -27,16 +28,6 @@ public class MPGDTrapezoidGeant4Factory extends Geant4Factory { */ protected final MPGDTrapezoidConstants C; - public static record SectorDimensions( - double halfThickness, - double halfHeight, - double halfLargeBase, - double halfSmallBase, - double tiltRad - ) { - - } - /** * @param constants detector constants (already configured with CCDB * paths/table names) @@ -68,149 +59,6 @@ protected final void init() { } } - // ------------------------------------------------------------------------ - // Sector geometry helpers - // ------------------------------------------------------------------------ - /** - * Computes the total thickness (mm) of a sector by summing the thickness of - * all material volumes. - * - * @return - */ - public double getSectorThickness() { - return C.getDetectorStructure().values() - .stream() - .flatMap(componentMap -> componentMap.values().stream()) - .mapToDouble(info -> info.thickness) - .sum(); - } - - /** - * - * @param region - * @return - */ - public SectorDimensions getSectorActiveVolumeDimensions(int region) { - - double baseDistance = C.TGTDET + region * C.DZ; - - double sectorHeight = baseDistance - * (Math.tan(Math.toRadians(C.THMAX - C.THTILT)) - + Math.tan(Math.toRadians(C.THTILT - C.THMIN))); - - double halfThickness = this.getSectorThickness() / 2.0; - double halfHeight = sectorHeight / 2.0; - - // Distance from target to the bottom base along the tilted axis - double W2TGT = (C.TGTDET + region * C.DZ) - / Math.cos(Math.toRadians(C.THTILT - C.THMIN)); - - double YMIN = W2TGT * Math.sin(Math.toRadians(C.THMIN)); // distance from beamline (Y) - double h = sectorHeight * Math.cos(Math.toRadians(C.THTILT)); - double halfSmallBase = 0.5 * (YMIN * Math.tan(Math.toRadians(C.THOPEN) / 2)); - - double halfLargeBase = halfSmallBase + sectorHeight * Math.tan(Math.toRadians(C.THOPEN / 2.0)); - - double tiltRad = Math.toRadians(C.THTILT); - - double twidth_Check = 2 * halfLargeBase * Math.sin(Math.toRadians(C.THOPEN)); - - if (MPGDTrapezoidConstants.VERBOSE) { - System.out.printf("C.TWIDT=%.3f vs %.3f", C.TWIDTH, twidth_Check); - - System.out.printf("YMIN=%.3f", YMIN); - - System.out.printf( - "SectorDimensionsPhysical [%s] region=%d : height=%.3f | halfT=%.3f halfH=%.3f " - + "halfLarge=%.3f halfSmall=%.3f tilt(deg)=%.3f%n", - C.detectorName, region, sectorHeight, - halfThickness, halfHeight, - halfLargeBase, halfSmallBase, - C.THTILT - ); - } - - return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, tiltRad); - } - - /** - * - * @param region - * @return - */ - public SectorDimensions getSectorContainerDimensions(int region) { - - SectorDimensions phys = getSectorActiveVolumeDimensions(region); - - double halfThickness = phys.halfThickness() + MPGDTrapezoidConstants.ZENLARGEMENT; - double halfHeight = phys.halfHeight() + MPGDTrapezoidConstants.YENLARGEMENT; - double halfLargeBase = phys.halfLargeBase() + MPGDTrapezoidConstants.XENLARGEMENT; - double halfSmallBase = phys.halfSmallBase() + MPGDTrapezoidConstants.XENLARGEMENT; - - return new SectorDimensions(halfThickness, halfHeight, halfLargeBase, halfSmallBase, phys.tiltRad()); - } - - /** - * Computes the sector height (longitudinal extension in the RZ plane) for a - * given region. - * - * @param region - * @return - */ - public double getSectorHeight(int region) { - - double baseDistance = C.TGTDET + region * C.DZ; - - double sectorHeight = baseDistance - * (Math.tan(Math.toRadians(C.THMAX - C.THTILT)) - + Math.tan(Math.toRadians(C.THTILT - C.THMIN))); - - if (MPGDTrapezoidConstants.VERBOSE) { - System.out.printf( - "SectorHeight [%s] region=%d : baseDistance=%.3f THMIN=%.3f THMAX=%.3f THTILT=%.3f -> height=%.3f%n", - C.detectorName, - region, - baseDistance, - C.THMIN, C.THMAX, C.THTILT, - sectorHeight - ); - } - - return sectorHeight; - } - - /** - * Computes the barycenter coordinates of a given sector/region in the - * CLAS12 coordinate system. - * - * @param isector - * @param iregion - * @return - */ - public Vector3d getCenterCoordinate(int isector, int iregion) { - - Vector3d vCenter = new Vector3d(0, 0, 0); - - // Distance from target to the bottom base along the tilted axis - double W2TGT = (C.TGTDET + iregion * C.DZ) - / Math.cos(Math.toRadians(C.THTILT - C.THMIN)); - - double YMIN = W2TGT * Math.sin(Math.toRadians(C.THMIN)); // distance from beamline (Y) - double ZMIN = W2TGT * Math.cos(Math.toRadians(C.THMIN)); // Z of the bottom base - - SectorDimensions dimCont = this.getSectorContainerDimensions(iregion); - double sectorHeight = 2 * dimCont.halfHeight(); - - vCenter.x = 0.0; - vCenter.y = (sectorHeight / 2.0) * Math.cos(Math.toRadians(C.THTILT)) + YMIN; - vCenter.z = -(sectorHeight / 2.0) * Math.sin(Math.toRadians(C.THTILT)) + ZMIN; - - // Rotate to the correct sector around Z (assumes 6 sectors, 60° apart) - vCenter.rotateZ(-Math.toRadians(90.0 - isector * 60.0)); - - return vCenter; - } - // ------------------------------------------------------------------------ // Sector + material volume construction // ------------------------------------------------------------------------ @@ -223,8 +71,8 @@ public Vector3d getCenterCoordinate(int isector, int iregion) { */ public Geant4Basic createSector(int isector, int iregion) { - SectorDimensions dimPhys = this.getSectorActiveVolumeDimensions(iregion); - SectorDimensions dimCont = this.getSectorContainerDimensions(iregion); + SectorDimensions dimPhys = C.getSectorActiveVolumeDimensions(iregion); + SectorDimensions dimCont = C.getSectorContainerDimensions(iregion); Geant4Basic sectorVolume = createSectorVolume(isector, iregion, dimCont); populateSectorWithDetectorStructure(sectorVolume, isector, iregion, dimPhys); @@ -250,7 +98,7 @@ protected Geant4Basic createSectorVolume(int isector, double sectorDX0 = dimSect.halfSmallBase(); double sectorTtilt = dimSect.tiltRad(); - Vector3d vCenter = this.getCenterCoordinate(isector, iregion); + Vector3d vCenter = C.getCenterCoordinate(isector, iregion); Geant4Basic sectorVolume = new G4Trap( "region_" + C.detectorName + "_" + (iregion + 1) + "_s" + (isector + 1), diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java index 283adf2b21..e8adb34945 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import org.jlab.detector.geant4.v2.MPGD.trapezoid.MPGDTrapezoidConstants.SectorDimensions; /** * Base class implementing strip/surface/plane geometry for trapezoidal MPGD @@ -253,7 +254,7 @@ protected Vector3d toGlobalSensitive(int region, int sector, int layer, Vector3d // ------------------------------------------------------------------------ /** * Build StripConstants using: - XY trapezoid from - * geo.getSectorDimensionsPhysical(region) (NOT enlarged) - zReadoutLocal + * C.getSectorActiveVolumeDimensions(region) (NOT enlarged) - zReadoutLocal * from CCDB sensitive thickness (findReadoutZLocal) - pitch/width/stereo * from CCDB * @@ -263,8 +264,8 @@ protected Vector3d toGlobalSensitive(int region, int sector, int layer, Vector3d */ protected StripConstants buildStripConstants(int region, int layer) { - MPGDTrapezoidGeant4Factory.SectorDimensions phys - = geo.getSectorActiveVolumeDimensions(region - 1); + SectorDimensions phys + = C.getSectorActiveVolumeDimensions(region - 1); StripConstants sc = new StripConstants(); sc.yHalf = phys.halfHeight(); From c57bec3b2f7546c1b7caaa52697bba7d16313ae5 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 23 Feb 2026 18:37:46 -0500 Subject: [PATCH 069/190] truncate-ahdc-waveforms (#1127) --- .../src/main/java/org/jlab/detector/decode/CLASDecoder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java index 0ee5a319a6..50b5c8f209 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -30,6 +30,9 @@ * @author gavalian */ public class CLASDecoder { + + // truncate EVIO waveforms longer than this: + final static int MAX_BANK_WF_LENGTH = 30; protected DetectorEventDecoder detectorDecoder = null; protected SchemaFactory schemaFactory = new SchemaFactory(); @@ -203,7 +206,7 @@ public Bank getDataBankWF(String name, DetectorType type) { b.putLong( 4, i, a.get(i).getADCData(0).getTimeStamp()); b.putInt("time", i, (int)a.get(i).getADCData(0).getTime()); DetectorDataDgtz.ADCData xxx = a.get(i).getADCData(0); - for (int j=0; j Date: Mon, 23 Feb 2026 18:47:17 -0500 Subject: [PATCH 070/190] build: bump version number to 13.7.1 (#1126) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 331 insertions(+), 331 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 0d1ad3ccb8..9dcb63bf36 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 4452570f9a..7142fc283c 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 3853916231..33b067df2c 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar cnuphys swimmer - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 21484e9ecf..58d4a7f573 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-logging - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 0f4e6d7022..9a9958dac4 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 70b41a6b4a..a2fef9a137 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 6247bb4f9f..7f1095ccde 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 3bac5a595c..d42153a52b 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 3d0019dc74..1ba26e2200 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 7dd79bd5c1..bbbd60ed91 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 30e803cdef..7f8b211a89 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys swimmer - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 5634bffc0d..835e1ea5a8 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index b7f80ec74f..fca61f16d2 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 8d494872b6..843e28760d 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar cnuphys clas12 - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 13e80db741..5d3c0d47da 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT pom org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 248cb77c51..3331057b14 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar cnuphys clas12 - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index ac70bd5373..843b3084d1 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar cnuphys clas12 - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 3f93373dda..c84ab05e7d 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar cnuphys clas12 - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys splot - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index a326c0575f..f0dc712f96 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clara-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-logging - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-math - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-tracking - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-decay-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys snr - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index e840983921..42e9a842f2 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT pom org.jlab.clas coatjava - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index ad267d7634..f18005dde5 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas common-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys swimmer - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 41959dfef5..8e488499bf 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 15bc439eae..fc8fbefa32 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 81068d3819..7eca04c76c 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 5f0d743bd6..7a6d067ff2 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index b003f52081..e9f8e32378 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 45f08aad8d..231af02812 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 8f0f0784f3..e939fc56ad 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 848d1be668..4107935e26 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index ce6e005afb..bef1dde4f5 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test org.jlab.clas clas-math - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys snr - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 19bb016cd3..47e4bd700b 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 092b1e64c2..3103548b4a 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT test org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 0c2767ca6e..7b647a7402 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 11170a70bd..c94d5d83fd 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 58c26d7795..f0af19be03 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 16c903e9b1..5fe165c2f0 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index bdc70318f1..57edc41a65 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 8c230111a3..c539c483e5 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 392e2b1c7d..8482f1f3e1 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT pom org.jlab.clas coatjava - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 226316fc99..025e1d347c 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-analysis - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index d6d68befea..fbcc88b349 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 000728e92f..f72b408df4 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index eeedba524f..fd921d577a 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 6afcc4de59..533f56cf85 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT cnuphys magfield - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-tracking - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT compile org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 299f7d38ba..c0fe6cce72 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index a256be6056..97028718e9 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-physics - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-utils - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 8e82e5d469..9b6755564a 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index bdbd74fdfb..6368af7deb 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index 0eaedb8d42..06840daf40 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas swim-tools - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT jar cnuphys swimmer - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-reco - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-io - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT org.jlab.clas clas-geometry - 13.7.0-SNAPSHOT + 13.7.1-SNAPSHOT From 93dffd94702838a15e21dd7284ac1e4d66123c94 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 24 Feb 2026 10:22:44 -0500 Subject: [PATCH 071/190] feat: generalize asprof wrapper script (#1123) * check for recon-util in $PATH * add flexibility * cleanup help printout * cleanup --- libexec/profile | 52 +++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/libexec/profile b/libexec/profile index fefe609977..19da5dbd5c 100755 --- a/libexec/profile +++ b/libexec/profile @@ -1,33 +1,42 @@ #!/bin/bash -set -e - -# configure: -event=cpu #nativemem +event=cpu format=flat -nevents=1000 seconds=12 -yaml=etc/services/data-ai-uber.yml -while getopts y:n:f:e:s:h opt +usage1="Usage: profile [-h] [-s seconds] [-w seconds] [-e event] [-f format] [--] executable args" +usage2="Usage: profile [options] executable args\nOptions:\n\t[-h] [-s seconds] [-w seconds]\n\t[-e cpu|alloc|nativemem|lock|cache-misses]\n\t[-f flat|traces|collapsed|flamegraph|tree|jfr|otlp]" + +while getopts s:f:e:o:w:h opt do case $opt in s) seconds=$OPTARG ;; - y) yaml=$OPTARG ;; - n) nevents=$OPTARG ;; f) format=$OPTARG ;; e) event=$OPTARG ;; - h) echo "\nUsage: profile [-y YAML] [-n #] [-e EVENT] datafile" && exit 0 ;; + o) stub=$OPTARG ;; + w) warmup=$OPTARG ;; + h) echo -e $usage2 && exit 0 ;; + --) break ;; + \?) echo $usage1 && exit 1 ;; +# :) echo $usage1 && exit 2 ;; esac done + shift $((OPTIND-1)) -data=$1 -stub=$(basename $data) -stub=${stub%%.*} +executable=$1 +arguments=${@:2} which asprof >& /dev/null -[ "$?" -ne 0 ] && echo 'ERROR: asprof is not in $PATH.' && exit 9 +[ "$?" -ne 0 ] && echo 'ERROR: asprof is not in $PATH.' && echo -e $usage2 && exit 3 + +which $executable >& /dev/null +[ "$?" -ne 0 ] && echo "ERROR: $executable is not in \$PATH." && echo -e $usage2 && exit 4 + +echo "Running asprof on '$executable $arguments' ..." + +set -e + +$executable $arguments >& asprof_$stub.log -recon-util -y $yaml -n $nevents -o pro_$stub.hipo -i $data >& pro_$stub.log & pid_bash=$! echo PID1=$pid_bash @@ -38,14 +47,15 @@ echo PID2=$pid_java ps waux && ps -p $pid_java -echo "Waiting for 60 seconds of CoatJava warmup ..." -for x in $(seq 60); do let y=60-$x && echo -e -n "\r$y ..." && sleep 1; done +echo "Waiting for $warmup seconds of warmup ..." +for x in $(seq $warmup); do let y=$warmup-$x && echo -e -n "\r$y ..." && sleep 1; done -tail -n 42 pro_$stub.log +# This 42 is probably for recon-util: +tail -n 42 asprof_$stub.log -asprof --title "Coatjava - asprof - $event" -e $event \ - -d $seconds -o $format -f pro_${format}_${event}_$stub $pid_java +asprof --title "Coatjava:asprof:$executable:$event" -e $event \ + -d $seconds -o $format -f asprof_${format}_${event}_$stub $pid_java kill -9 $pid_java -rm -f pro_$stub.hipo +rm -f asprof_$stub.hipo From c1298bcb3953e75203d8e110fde15a614c90ed5c Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:00:44 +0100 Subject: [PATCH 072/190] fix fully qualified name (#1125) --- .../src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java | 2 +- .../main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java | 2 +- .../org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java | 3 ++- .../main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java | 2 +- .../alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java index 0218dec350..0884ab547f 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java @@ -5,7 +5,7 @@ import org.jlab.rec.ahdc.AI.InterCluster; import org.jlab.rec.ahdc.AI.TrackPrediction; import org.jlab.rec.ahdc.Cluster.Cluster; -import org.jlab.rec.ahdc.Cluster.DocaCluster; +import org.jlab.rec.ahdc.DocaCluster.DocaCluster; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.ahdc.Track.Track; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java index b9d0f1fd91..a46cdee757 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaCluster.java @@ -1,4 +1,4 @@ -package org.jlab.rec.ahdc.Cluster; +package org.jlab.rec.ahdc.DocaCluster; /** * DocaCluster is a "refined" cluster space point built from diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java index 8961ffed1b..504d41572f 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java @@ -1,7 +1,8 @@ -package org.jlab.rec.ahdc.Cluster; +package org.jlab.rec.ahdc.DocaCluster; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; +import org.jlab.rec.ahdc.Cluster.Cluster; import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java index 1bd83fe934..0e0ac9226e 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java @@ -8,7 +8,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -import org.jlab.rec.ahdc.Cluster.DocaCluster; +import org.jlab.rec.ahdc.DocaCluster.DocaCluster; /** Helix Fit. * diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index 2ecda96c28..b6c703bfc1 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -10,8 +10,8 @@ import org.jlab.rec.ahdc.Banks.RecoBankWriter; import org.jlab.rec.ahdc.Cluster.Cluster; import org.jlab.rec.ahdc.Cluster.ClusterFinder; -import org.jlab.rec.ahdc.Cluster.DocaClusterRefiner; -import org.jlab.rec.ahdc.Cluster.DocaCluster; +import org.jlab.rec.ahdc.DocaCluster.DocaClusterRefiner; +import org.jlab.rec.ahdc.DocaCluster.DocaCluster; import org.jlab.rec.ahdc.Distance.Distance; import org.jlab.rec.ahdc.HelixFit.HelixFitJava; import org.jlab.rec.ahdc.Hit.Hit; From 691fec84a95de48f00eb4decf4c87307aec8b1a3 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 26 Feb 2026 15:30:27 -0500 Subject: [PATCH 073/190] add optional efficiency check (#1131) * add optional efficiency check * cleanup doc --- .../org/jlab/analysis/efficiency/Truth.java | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java index 51a9cf559b..f585d38ccb 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.TreeMap; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -15,8 +16,7 @@ /** * Efficiency matrix calculator based solely on the MC::GenMatch truth-matching - * bank (which is purely hit-based), and a pid assignment match in MC::Particle - * and REC::Particle. + * bank, and a pid assignment match in MC::Particle and REC::Particle. * * @author baltzell */ @@ -188,17 +188,62 @@ public String toMarkdown() { return s.toString(); } + private static Map parseEfficiencyString(String arg) { + TreeMap m = new TreeMap<>(); + if (arg.contains(",")) { + for (String s : arg.split(",")) + m.putAll(parseEfficiencyString(s)); + } + else if (arg.contains(":")) { + String[] x = arg.split(":"); + try { + if (x.length == 2) m.put(Integer.valueOf(x[0]), Float.valueOf(x[1])); + else throw new RuntimeException("Invalid pid specification: "+arg); + } + catch (NumberFormatException e) { + throw new RuntimeException("Invalid pid specification: "+arg); + } + } + return m; + } + + private boolean checkEfficiencies(Map pids) { + boolean good = true; + for (int pid : pids.keySet()) { + if (get(pid, pid) < pids.get(pid)) { + System.err.println(String.format( + ">>> trutheff: pid %d efficiency is %f, below %f limit", + pid, get(pid,pid), pids.get(pid))); + good = false; + } + } + return good; + } + + /** + * Efficiency cut values specificed as pid1:eff1[pid2:eff2[...]] + * For example, 2212:0.9,11:0.95 is 90% for proton and 95% for electron. + * @param arg + * @return whether all efficiency cuts pass + */ + public boolean checkEfficiencies(String arg) { + return checkEfficiencies(parseEfficiencyString(arg)); + } + public static void main(String[] args) { OptionParser o = new OptionParser("trutheff"); + o.addOption("-e", "", "efficiency requirement (e.g. 321:0.9,11:0.95"); o.setRequiresInputList(true); o.parse(args); + Map pids = parseEfficiencyString(o.getOption("-e").stringValue()); HipoReader r = new HipoReader(); r.open(o.getInputList().get(0)); Truth t = new Truth(r.getSchemaFactory()); t.add(o.getInputList()); - System.out.println(t.toTable()); - System.out.println(t.toJson()); System.out.println(t.toMarkdown()); + System.out.println(t.toJson()); + System.out.println(t.toTable()); + if (!t.checkEfficiencies(pids)) System.exit(7); } } \ No newline at end of file From 121268cfcd56ff12f0fe87cc511721a9135c9a96 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 26 Feb 2026 18:54:52 -0500 Subject: [PATCH 074/190] draft: add convenience scripts for diffing gold runs (#1124) * add convenience scripts for diffing gold runs * Increase hipo-diff limit from 1000 to 10000 --- libexec/git-lfs-wget | 24 ++++++++++++++++++++++++ libexec/gold-diff | 16 ++++++++++++++++ libexec/gold-run | 27 +++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100755 libexec/git-lfs-wget create mode 100755 libexec/gold-diff create mode 100755 libexec/gold-run diff --git a/libexec/git-lfs-wget b/libexec/git-lfs-wget new file mode 100755 index 0000000000..84646d2f91 --- /dev/null +++ b/libexec/git-lfs-wget @@ -0,0 +1,24 @@ +#!/bin/bash + +[ "$#" -ne 2 ] && echo 'Usage: git-lfs-wget URI subpath' && exit 1 + +subdir=$(echo $1 | awk -F/ '{print$NF}' | awk -F. '{print$1}') + +if [ -d $subdir ] +then + if ! [ -e $subdir/.git ] + then + echo "ERROR: $subdir already exists but is not a git repo." + exit 1 + fi +else + GIT_LFS_SKIP_SMUDGE=1 git clone $1 + git lfs install --skip-smudge +fi + +cd $subdir + +git config lfs.fetchinclude "$2" + +git lfs pull + diff --git a/libexec/gold-diff b/libexec/gold-diff new file mode 100755 index 0000000000..8e2903ae0a --- /dev/null +++ b/libexec/gold-diff @@ -0,0 +1,16 @@ +#!/bin/bash + +[ "$#" -ne 2 ] && echo 'Usage: gold-diff dir1 dir2' && exit 1 + +a=$1 +b=$2 + +for x in $a/*.hipo +do + y=$b/$(basename $x) + stub=$(basename $x) + stub=${stub%%.*} + hipo-diff -q 1 -s 0,1,2 -n 10000 $x $y >& $stub.log & +done + +wait diff --git a/libexec/gold-run b/libexec/gold-run new file mode 100755 index 0000000000..9a1fe66339 --- /dev/null +++ b/libexec/gold-run @@ -0,0 +1,27 @@ +#!/bin/bash + +exe='decoder4u -n 10000' +csv=gold.csv +cache=pin-gold.txt + +if ! [ -f $csv ] || ! [ -f $cache ] +then + echo "ERROR: This requires the gold text files from the 'raw-data' repository" + echo "to be in your current working directory. The easiest way to get them:" + echo "GIT_LFS_SKIP_SMUDGE=1 git clone https://code.jlab.org/hallb/clas12/raw-data.git" + exit 1 +fi + +IFS=$'\n' + +for x in $(tail -n +2 $csv) +do + x=${x//[[:space:]]/} + run=${x##*,} + period=${x%%,*} + stub=${period}_${run} + data=$(grep ${run} $cache | grep 1$) + $exe -o $stub.hipo $data >& $stub.log & +done + +wait From 614a837324830aac4ef46fdebaacdcb644fed0dd Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 26 Feb 2026 20:17:00 -0500 Subject: [PATCH 075/190] update grapes version (#1129) --- bin/install-clara | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/install-clara b/bin/install-clara index ec5d65f5f0..89566e505a 100755 --- a/bin/install-clara +++ b/bin/install-clara @@ -3,7 +3,7 @@ set -e # Default versions: -grapes=2.20 +grapes=2.21 clara=5.0.2 function error() { From d1eaa84ba9411636eb0b5b8e1917749d4449dbfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 09:51:34 -0500 Subject: [PATCH 076/190] build(deps): bump org.yaml:snakeyaml from 2.5 to 2.6 (#1133) Bumps [org.yaml:snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 2.5 to 2.6. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-2.6..snakeyaml-2.5) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-version: '2.6' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8e488499bf..899ed10c90 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ org.yaml snakeyaml - 2.5 + 2.6 From 4a1f948d6d0d6d0bdb4b4ddf4151d11a3491d89c Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Thu, 5 Mar 2026 20:10:00 -0500 Subject: [PATCH 077/190] fix strip numbering and orientation (#1135) --- .../trapezoid/MPGDTrapezoidStripFactory.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java index e8adb34945..2902e80b14 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/MPGD/trapezoid/MPGDTrapezoidStripFactory.java @@ -337,7 +337,7 @@ protected static boolean buildStripSegment(int internalIndex, StripConstants c, Vector3d nXY = new Vector3d(ca, -sa, 0.0); double rhs = (internalIndex + 0.5) * c.pitch; - List inters = new ArrayList<>(4); + List inters = new ArrayList<>(); for (Vector3d[] e : tr.edges()) { Vector3d P = new Vector3d(0, 0, 0); @@ -360,8 +360,14 @@ protected static boolean buildStripSegment(int internalIndex, StripConstants c, double d2 = dx * dx + dy * dy; if (d2 > best) { best = d2; - a = inters.get(i); - b = inters.get(j); + if(dy>0) { + a = inters.get(i); + b = inters.get(j); + } + else { + a = inters.get(j); + b = inters.get(i); + } } } } @@ -419,9 +425,9 @@ protected List buildStripCache(StripConstants c) { tmp.add(s); } - tmp.sort(Comparator - .comparingDouble((StripGeom s) -> s.orderXLocal) - .thenComparingInt(s -> s.internalIndex)); +// tmp.sort(Comparator +// .comparingDouble((StripGeom s) -> s.orderXLocal) +// .thenComparingInt(s -> s.internalIndex)); int comp = 1; for (StripGeom s : tmp) { From c67ad7135d4c6bdb1f3ae309b6f27f585f0105ab Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Fri, 6 Mar 2026 21:50:00 +0100 Subject: [PATCH 078/190] Include the charge in the energy loss computation (#1138) * include the charge in the energy loss computation * add java doc --- .../clas/tracking/kalmanfilter/Material.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java index 12b6a19d94..a58e6e893e 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java @@ -59,7 +59,14 @@ public Material clone(double newThickness) { return new Material(this.name, newThickness, this.density, this.ZoverA, this.X0, this.IeV, this.units); } // RDV make units a property of the material - public double getEloss(double p, double mass) { + /** + * Compute the energy loss. + * + * @param p momentum of the particle crossing the material volume + * @param mass mass of the particle crossing the material volume + * @param charge charge (in unit of e) of the particle crossing the material volume + */ + public double getEloss(double p, double mass, int charge) { if(mass==0) return 0; double beta = p / Math.sqrt(p * p + mass * mass); double s = PhysicsConstants.massElectron() / mass; @@ -69,11 +76,21 @@ public double getEloss(double p, double mass) { double K = 0.000307075 * units.value() * units.value(); // GeV mol-1 cm2 double I = this.IeV * 1E-9; double logterm = 2. * PhysicsConstants.massElectron() * beta * beta * gamma * gamma * Wmax / (I * I); - double dE = this.thickness * this.density * K * this.ZoverA + double dE = this.thickness * this.density * K * charge * charge *this.ZoverA * (0.5 * Math.log(logterm) - beta * beta) / beta / beta; //in GeV return dE; } + /** + * Compute the energy loss assuming the charge is 1. See {@link Material#getEloss(double, double, int)}. + * + * @param p momentum of the particle crossing the material volume + * @param mass mass of the particle crossing the material volume + */ + public double getEloss(double p, double mass) { + return getEloss(p, mass, 1); + } + @Override public String toString() { String s = "Material: "; From bd8fe01fe29fd043863c1bc53df2defcdcf82db3 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 6 Mar 2026 19:10:53 -0500 Subject: [PATCH 079/190] feat: improve event building for zero-torus data (#1085) * add solenoid/torus * remove sampling fraction from trigger electron id for zero torus * different electron pid for zero-torus * add 500 MeV ECAL requirement * latest rgl yaml from Mathieu * reassign electron momentum from sampling fraction * call it * remove copy/paste mistake * use EBHB reassigned electron momentum to initialize TB tracking for straigth tracks * ignore HB/TB type for zero-field * restore rgl yaml --------- Co-authored-by: Raffaella De Vita --- .../jlab/clas/detector/DetectorHeader.java | 8 +++++++ .../java/org/jlab/service/dc/DCTBEngine.java | 19 ++++++++++++++++ .../src/main/java/org/jlab/rec/eb/EBUtil.java | 22 +++++++++++++++++++ .../java/org/jlab/service/eb/EBAnalyzer.java | 20 ++++++++++++++--- .../java/org/jlab/service/eb/EBEngine.java | 5 ++++- .../main/java/org/jlab/service/eb/EBio.java | 2 ++ .../org/jlab/service/eb/EventBuilder.java | 17 +++++++++----- 7 files changed, 83 insertions(+), 10 deletions(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorHeader.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorHeader.java index cec0514b22..9cae002bb5 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorHeader.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorHeader.java @@ -18,6 +18,8 @@ public class DetectorHeader { private float livetime = -1; private short eventCategory = 0; private short eventCategoryFT = 0; + private float torus = 0.0f; + private float solenoid = 0.0f; public DetectorHeader() { } @@ -113,4 +115,10 @@ public void setLiveTime(float livetime) { public void setEventCategory(short evcat) { this.eventCategory = evcat; } + + public void setTorus(float t) { torus = t; } + public void setSolenoid(float s) {solenoid = s; } + public float getTorus() { return torus; } + public float getSolenoid() { return solenoid; } + } diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java index 6a09909377..a08543e28d 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java @@ -43,6 +43,7 @@ import org.jlab.clas.tracking.kalmanfilter.zReference.StateVecs; import org.jlab.clas.tracking.utilities.MatrixOps.Libr; import org.jlab.clas.tracking.utilities.RungeKuttaDoca; +import org.jlab.detector.base.DetectorType; public class DCTBEngine extends DCEngine { @@ -200,6 +201,24 @@ public boolean processDataEvent(DataEvent event) { if(TrackArray==null) { return true; // HB tracks not saved correctly } + if(Math.abs(Swimmer.getTorScale()) < 0.001 && + event.hasBank(this.getBanks().getRecPartBank()) && + event.hasBank(this.getBanks().getRecTrackBank())){ + DataBank trackBank = event.getBank(this.getBanks().getRecTrackBank()); + DataBank partBank = event.getBank(this.getBanks().getRecPartBank()); + for (int i = 0; i < trackBank.rows(); i++) { + if (trackBank.getByte("detector", i) == DetectorType.DC.getDetectorId()) { + int pindex = trackBank.getShort("pindex", i); + if(partBank.getInt("pid", i) == 11) { + Track HBtrk = TrackArray[trackBank.getShort("index", i)]; + HBtrk.set_pAtOrig(new Vector3D(partBank.getFloat("px", pindex), + partBank.getFloat("py", pindex), + partBank.getFloat("pz", pindex))); + HBtrk.set_P(HBtrk.get_pAtOrig().mag()); + } + } + } + } for(Segment seg : segments) { if(seg.get(0).get_AssociatedHBTrackID()>0) { TrackArray[seg.get(0).get_AssociatedHBTrackID()-1].get_ListOfHBSegments().add(seg); diff --git a/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBUtil.java b/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBUtil.java index e6330ee504..07acb1c556 100644 --- a/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBUtil.java +++ b/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBUtil.java @@ -99,6 +99,28 @@ public static boolean isSimpleElectron(DetectorParticle p,EBCCDBConstants ccdb) return true; } + + /** + * Perform a basic true/false identification for electrons. + */ + public static boolean isZeroFieldElectron(DetectorParticle p,EBCCDBConstants ccdb) { + + // require ECAL: + final int sector = p.getSector(DetectorType.ECAL); + if (sector<1) return false; + + // requre HTCC photoelectrons: + final double nphe = p.getNphe(DetectorType.HTCC); + if (nphe < ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT)) return false; + + // require PCAL minimum energy: + final double minPcalEnergy = ccdb.getSectorDouble(EBCCDBEnum.ELEC_PCAL_min_energy,sector); + final double pcalEnergy = p.getEnergy(DetectorType.ECAL,DetectorLayer.PCAL); + if (pcalEnergy < minPcalEnergy) return false; + + // require PCAL+ECAL minimum energy 500 MeV: + return p.getEnergy(DetectorType.ECAL) > 0.5; + } /** * Calculate timing resolution from EventBuilder constants: diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBAnalyzer.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBAnalyzer.java index 5ddd542fc5..86dea6d0f2 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBAnalyzer.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBAnalyzer.java @@ -307,6 +307,17 @@ else if (p.hasHit(DetectorType.CND) || p.hasHit(DetectorType.CTOF) || p.hasHit(D } } + public void assignElectronMomenta(DetectorEvent de) { + final int np = de.getParticles().size(); + for (int ii=0; ii0; - final boolean isElectron = EBUtil.isSimpleElectron(p,ccdb); + final boolean isElectron = Math.abs(torus)>1e-8 ? + EBUtil.isSimpleElectron(p,ccdb) : + EBUtil.isZeroFieldElectron(p, ccdb); final boolean htccSignalCheck = p.getNphe(DetectorType.HTCC)>ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT); final boolean ltccSignalCheck = p.getNphe(DetectorType.LTCC)>ccdb.getDouble(EBCCDBEnum.LTCC_NPHE_CUT); diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java index e6b974ec95..3aa1380c28 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java @@ -1,6 +1,5 @@ package org.jlab.service.eb; -import java.util.Collections; import java.util.List; import java.util.logging.Logger; @@ -171,6 +170,10 @@ public boolean processDataEvent(DataEvent de,EBScalers ebs) { EBAnalyzer analyzer = new EBAnalyzer(ccdb,rf); analyzer.processEvent(eb.getEvent()); + // Overwrite electron momentum for zero-field: + if (Math.abs(head.getTorus()) < 1e-8) + analyzer.assignElectronMomenta(eb.getEvent()); + // Add Forward Tagger particles: eb.processForwardTagger(de); diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBio.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBio.java index 916d966e78..a6bc117a44 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBio.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBio.java @@ -32,6 +32,8 @@ public static DetectorHeader readHeader(DataEvent event, EBScalers ebs, EBCCDBCo dHeader.setRun(bank.getInt("run", 0)); dHeader.setEvent(bank.getInt("event", 0)); dHeader.setTrigger(bank.getLong("trigger", 0)); + dHeader.setTorus(bank.getFloat("torus", 0)); + dHeader.setSolenoid(bank.getFloat("solenoid", 0)); } // helicity: diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EventBuilder.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EventBuilder.java index c076589b9e..d36fbc6912 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EventBuilder.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EventBuilder.java @@ -467,7 +467,7 @@ public void setCharge(int ch) { this.charge = ch; } - public int getSoftwareTriggerScore(DetectorParticle p,EBCCDBConstants ccdb) { + public int getSoftwareTriggerScore(DetectorParticle p,EBCCDBConstants ccdb,float torus) { int score = 0; @@ -475,14 +475,19 @@ public int getSoftwareTriggerScore(DetectorParticle p,EBCCDBConstants ccdb) { if(p.getNphe(DetectorType.HTCC) > npheCut){ score += 10; } - + final int sector = p.getSector(DetectorType.ECAL); if (sector > 0) { final double nSigmaCut = ccdb.getSectorDouble(EBCCDBEnum.ELEC_SF_nsigma,sector); - final double sfNSigma = SamplingFractions.getNSigma(11,p,ccdb); + final double nsigma = SamplingFractions.getNSigma(11,p,ccdb); final double minPcalEnergy = ccdb.getSectorDouble(EBCCDBEnum.ELEC_PCAL_min_energy,sector); - if(abs(sfNSigma) < nSigmaCut && - p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy) { + if (Math.abs(torus) <1e-8) { + if (p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy && + p.getEnergy(DetectorType.ECAL) > 0.5) { + score += 100; + } + } + else if (abs(nsigma) < nSigmaCut && p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy) { score += 100; } } @@ -503,7 +508,7 @@ public boolean assignSoftwareTrigger(DetectorEvent event,EBCCDBConstants ccdb) { int maxScore = 0; for (int i=0; i= this.score_requirement) { if (this.charge==p.getCharge()) { p.setPid(this.id); From fd4f9d9ac1061b53384d269b3d92851ba8619545 Mon Sep 17 00:00:00 2001 From: Zeyu Zhang Date: Tue, 10 Mar 2026 17:26:47 +0800 Subject: [PATCH 080/190] Fix Nhits issue & fill track bank (#1137) Co-authored-by: Zeyu Zhang Co-authored-by: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> --- .../jlab/rec/ahdc/HelixFit/HelixFitJava.java | 87 +++++++++++++++++-- .../rec/ahdc/HelixFit/HelixFitObject.java | 14 ++- .../java/org/jlab/rec/ahdc/Track/Track.java | 35 +++++++- .../org/jlab/service/ahdc/AHDCEngine.java | 5 +- 4 files changed, 127 insertions(+), 14 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java index 0e0ac9226e..a82914b892 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitJava.java @@ -997,7 +997,81 @@ public HelixFitObject HelixFit(int PointNum, double szPos[][], int fit_track_to_ return h; } -// Public weighted wrapper (similar to the original HelixFit) + // Compute the path length along the helix described by h, + // for the portion where the radial distance to the beamline + // (sqrt(x^2 + y^2)) is between rMin and rMax [mm]. + private double computePathFromHelix(HelixFitObject h, double rMin, double rMax) { + + // Helix parameters from the fit + double A = h.get_A(); // circle center X in XY-plane + double B = h.get_B(); // circle center Y in XY-plane + double X0 = h.get_X0(); // point of closest approach in XY + double Y0 = h.get_Y0(); + double thDeg = h.get_Theta(); // already stored in degrees in the wrapper + double theta = Math.toRadians(thDeg); // convert to radians for sin() + + // Circle radius in XY-plane + double R = Math.sqrt((X0 - A)*(X0 - A) + (Y0 - B)*(Y0 - B)); + if (R < 1e-6) { + // Degenerate circle + return 0.0; + } + + // Distance from origin to circle center + double C = Math.sqrt(A*A + B*B); + + // Minimal / maximal distance from the circle to the origin + double Dmin = Math.abs(C - R); + double Dmax = C + R; + + // If there is no overlap between [rMin, rMax] and [Dmin, Dmax], path = 0 + if (rMax <= Dmin || rMin >= Dmax) { + return 0.0; + } + + // Clip the requested radial window to what the circle actually covers + double rIn = Math.max(rMin, Dmin); + double rOut = Math.min(rMax, Dmax); + if (rOut <= rIn) { + return 0.0; + } + + // Helper constants for r^2(psi) = C0 + 2 R C cos(psi) + double C0 = A*A + B*B + R*R; + + // Helper to compute psi(r) in [0,π] from r: + // cos(psi) = (r^2 - C0)/(2 R C) + java.util.function.DoubleFunction psiOfR = (double r) -> { + double num = r*r - C0; + double den = 2.0 * R * C; + if (Math.abs(den) < 1e-12) { + return 0.0; + } + double u = num / den; + // Clamp to [-1,1] to avoid NaN from acos + if (u > 1.0) u = 1.0; + if (u < -1.0) u = -1.0; + return Math.acos(u); // in [0, π] + }; + + double psiIn = psiOfR.apply(rIn); + double psiOut = psiOfR.apply(rOut); + + double dPsi = Math.abs(psiOut - psiIn); + + // ds/dpsi = R / sin(theta) + double sinTheta = Math.sin(theta); + if (Math.abs(sinTheta) < 1e-6) { + // Track almost parallel to the beam; this formula is ill-defined. + // Return 0 for safety or some large sentinel. + return 0.0; + } + + double path = (R / sinTheta) * dPsi; + + return path; + } + // Public weighted wrapper (similar to the original HelixFit) public HelixFitObject HelixFitWeighted(int PointNum, double[][] szPos, double[] weights, int fit_track_to_beamline) { @@ -1188,14 +1262,17 @@ public HelixFitObject helix_fit_with_doca_selection(List docaCluste } // weights = null => all weights = 1.0 inside helix_fit_weighted + // Use the DOCa-based bestChi2 as helix chi2 double PI=Math.acos(0.0)*2; //double Rho=0,Phi=0,Theta=0,X0=0,Y0=0,DCA=0,Chi2=0; double Phi_deg; double Theta_deg; - HelixFitObject h = helix_fit_weighted(nPoints, szPosSel, null, fit_track_to_beamline);; - + HelixFitObject h = helix_fit_weighted(nPoints, szPosSel, null, fit_track_to_beamline); + h.set_Chi2(bestChi2); + double path = computePathFromHelix(h, 30.0, 70.0); + h.set_path(path); Phi_deg=Math.toDegrees(h.get_Phi()); if(Phi_deg >= 180){ Phi_deg -= 360; @@ -1211,6 +1288,4 @@ public HelixFitObject helix_fit_with_doca_selection(List docaCluste } -} - - +} \ No newline at end of file diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitObject.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitObject.java index 3e8591a13b..cee8ad91d2 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitObject.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HelixFit/HelixFitObject.java @@ -16,7 +16,8 @@ public class HelixFitObject { private double _DCA; private double _Chi2; private double _magfield; - + private double _path; + public HelixFitObject(){ //default constructor } @@ -33,6 +34,7 @@ public HelixFitObject(double Rho, double A, double B, double Phi, double Theta, _DCA = DCA; _Chi2 = Chi2; _magfield = 50; + _path = 0; } public double get_Rho(){ return _Rho; @@ -82,6 +84,9 @@ public double get_DCA(){ public double get_Chi2(){ return _Chi2; } + public void set_Chi2(double Chi2){ + _Chi2 = Chi2; + } public double get_Mom(){ return 0.3*_magfield*Math.abs(_Rho)/(10*Math.sin(Math.toRadians(_Theta))); } @@ -103,5 +108,10 @@ public double get_dEdx(){ public void set_magfield(double magfield){ _magfield = magfield; } - + public double get_path(){ + return _path; + } + public void set_path(double path){ + _path = path; + } } \ No newline at end of file diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java index e9944b7846..7efc0cc37e 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java @@ -73,6 +73,8 @@ public void setPositionAndMomentum(HelixFitObject helixFitObject) { this.px0 = helixFitObject.get_px(); this.py0 = helixFitObject.get_py(); this.pz0 = helixFitObject.get_pz(); + this.chi2 = helixFitObject.get_Chi2(); + this.path = helixFitObject.get_path(); } public void setPositionAndMomentumVec(double[] x) { @@ -176,15 +178,40 @@ public void set_trackId(int _trackId) { public void set_chi2(double _chi2) { chi2 = _chi2;} public void set_sum_residuals(double _sum_residuals) { sum_residuals = _sum_residuals;} public int get_trackId() {return trackId;} - public int get_n_hits() {return n_hits;} - public int get_sum_adc() {return sum_adc;} + public int get_n_hits() { + if (hits == null) { + return 0; + } + return hits.size(); + } + public int get_sum_adc() { + if (hits == null || hits.isEmpty()) { + return 0; + } + int sum = 0; + for (Hit h : hits) { + sum += (int) Math.round(h.getADC()); + } + return sum; + } public double get_chi2() {return chi2;} public double get_sum_residuals() {return sum_residuals;} // AHDC::track public void set_dEdx(double _dEdx) { dEdx = _dEdx;} public void set_p_drift(double _p_drift) { p_drift = _p_drift;} public void set_path(double _path) { path = _path;} - public double get_dEdx() {return dEdx;} + public double get_dEdx() { + if (path <= 0) { + dEdx = 0; + }else { + int sum = 0; + for (Hit h : hits) { + sum += (int) Math.round(h.getADC()); + } + dEdx = sum/path; + } + return dEdx; + } public double get_p_drift() {return p_drift;} public double get_path() {return path;} @@ -196,4 +223,4 @@ public void set_trackId(int _trackId) { public int get_predicted_ATOF_layer() {return predicted_ATOF_layer;} public int get_predicted_ATOF_wedge() {return predicted_ATOF_wedge;} -} +} \ No newline at end of file diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index b6c703bfc1..eb3dbdca24 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -218,13 +218,14 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { // V) Global fit int trackid = 0; ArrayList all_docaClusters = new ArrayList<>(); + AHDC_Tracks.removeIf(track -> track.get_Clusters().size() < 3); for (Track track : AHDC_Tracks) { trackid++; track.set_trackId(trackid); List originalClusters = track.get_Clusters(); ArrayList docaClusters = DocaClusterRefiner.buildRefinedClusters(originalClusters); all_docaClusters.addAll(docaClusters); - if (docaClusters == null || docaClusters.size() < 3) { + if (docaClusters == null || docaClusters.size() < 3 || originalClusters == null || originalClusters.size() < 3) { // not enough points, skip helix fit continue; } @@ -314,4 +315,4 @@ public static void main(String[] args) { System.out.println("finished " + (System.nanoTime() - starttime) * Math.pow(10, -9)); } -} +} \ No newline at end of file From d4c864742fbba1f8856bc058c624a8f69ed060d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 14:08:46 +0000 Subject: [PATCH 081/190] build(deps): bump org.apache.maven.plugins:maven-shade-plugin (#1141) Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.6.1 to 3.6.2. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.6.1...maven-shade-plugin-3.6.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-version: 3.6.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- common-tools/coat-libs/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index f0dc712f96..a7dafd7878 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -189,7 +189,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.6.1 + 3.6.2 package From 78f7b5dd8c21c62604462c3a6ec1ce133eb31194 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 11:41:26 -0400 Subject: [PATCH 082/190] build(deps): bump org.apache.maven.plugins:maven-resources-plugin (#1142) Bumps [org.apache.maven.plugins:maven-resources-plugin](https://github.com/apache/maven-resources-plugin) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-resources-plugin/releases) - [Commits](https://github.com/apache/maven-resources-plugin/compare/v3.4.0...maven-resources-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-resources-plugin dependency-version: 3.5.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 899ed10c90..78f8f8a96d 100644 --- a/pom.xml +++ b/pom.xml @@ -329,7 +329,7 @@ org.apache.maven.plugins maven-resources-plugin - 3.4.0 + 3.5.0 UTF-8 From 4ad7e9885f5c7960b208fbac439ab7c9cb3da14e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 13:09:31 -0400 Subject: [PATCH 083/190] chore(submodule): bump etc/data/nnet from `efa89e4` to `800f8f3` (#1144) Bumps etc/data/nnet from `efa89e4` to `800f8f3`. --- updated-dependencies: - dependency-name: etc/data/nnet dependency-version: 800f8f38dba46fef729ee228590f4f2d66e7fbaf dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- etc/data/nnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/data/nnet b/etc/data/nnet index efa89e44d0..800f8f38db 160000 --- a/etc/data/nnet +++ b/etc/data/nnet @@ -1 +1 @@ -Subproject commit efa89e44d0c68e2107105cc39096b41d98bba590 +Subproject commit 800f8f38dba46fef729ee228590f4f2d66e7fbaf From c4eec2e0d3c5c721d3c2ffc0a1a9543d7c24a03d Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 13 Mar 2026 18:52:46 -0400 Subject: [PATCH 084/190] fix: replace loops with global /daq/tt translation table in decoding (#1064) * use global /daq/tt translation table * require nonzero run number --- .../org/jlab/detector/decode/CLASDecoder.java | 10 ++-- .../detector/decode/DetectorEventDecoder.java | 52 +++++++------------ 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java index 50b5c8f209..3eb66b58a9 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -745,10 +745,12 @@ public void initEvent(DataEvent event){ int runNumberCoda = codaDecoder.getRunNumber(); this.setRunNumber(runNumberCoda); - - detectorDecoder.translate(dataList); - detectorDecoder.fitPulses(dataList); - detectorDecoder.filterTDCs(dataList); + + if (runNumberCoda > 0) { + detectorDecoder.translate(dataList); + detectorDecoder.fitPulses(dataList); + detectorDecoder.filterTDCs(dataList); + } if(this.decoderDebugMode>0){ System.out.println("\n>>>>>>>>> TRANSLATED data"); diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java index 4f726283a8..d718ab9367 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java @@ -34,6 +34,8 @@ public class DetectorEventDecoder { private ExtendedFADCFitter extendedFitter = new ExtendedFADCFitter(); private MVTFitter mvtFitter = new MVTFitter(); + private TranslationTable translator = new TranslationTable(); + public DetectorEventDecoder(boolean development){ if(development==true){ this.initDecoderDev(); @@ -55,6 +57,11 @@ public void setVariation(String variation) { } public void setRunNumber(int run){ + if (run != this.runNumber) { + translator = new TranslationTable(); + for (int i=0; i detectorData){ - // Preload CCDB tables: - ArrayList tables = new ArrayList<>(); - for (String name : tablesTrans) { - tables.add(translationManager.getConstants(runNumber, name)); - } + for (DetectorDataDgtz d : detectorData) { - for (DetectorDataDgtz data : detectorData) { + // Get the hardware indexing for this detector data object: + long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(d.getDescriptor().getCrate(), + d.getDescriptor().getSlot(), d.getDescriptor().getChannel()); - // Get the hardware indexing for this detector hit: - int crate = data.getDescriptor().getCrate(); - int slot = data.getDescriptor().getSlot(); - int channel = data.getDescriptor().getChannel(); - long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(crate,slot,channel); - - // Try to find it in the translation tables: - for (int j=0; j x = translator.getIntegersByHash(hash); - data.getDescriptor().setSectorLayerComponent(sector, layer, component); - data.getDescriptor().setOrder(order); - data.getDescriptor().setType(keysTrans.get(j)); - - for(int i = 0; i < data.getADCSize(); i++) data.getADCData(i).setOrder(order); - for(int i = 0; i < data.getTDCSize(); i++) data.getTDCData(i).setOrder(order); - - // Assume there's only one instance of this crate/slot/channel - // in all translation tables, and we found it, so stop: - break; - } + // Set the translated detector indexing: + d.getDescriptor().setSectorLayerComponentOrderType(x.get(0),x.get(1),x.get(2),x.get(3),x.get(4)); + for (int i=0; i Date: Fri, 13 Mar 2026 19:04:07 -0400 Subject: [PATCH 085/190] cache evio branches, cleanup (#1065) --- .../jlab/detector/decode/CodaDecoders.java | 922 +++++++++++ .../detector/decode/CodaEventDecoder.java | 1430 +++-------------- 2 files changed, 1158 insertions(+), 1194 deletions(-) create mode 100644 common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java new file mode 100644 index 0000000000..9a46c55844 --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java @@ -0,0 +1,922 @@ +package org.jlab.detector.decode; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jlab.coda.jevio.CompositeData; +import org.jlab.coda.jevio.DataType; +import org.jlab.coda.jevio.EvioException; +import org.jlab.coda.jevio.EvioNode; +import org.jlab.detector.decode.DetectorDataDgtz.ADCData; +import org.jlab.detector.decode.DetectorDataDgtz.TDCData; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.evio.EvioTreeBranch; +import org.jlab.utils.data.DataUtils; + +/** + * All static methods from CodaEventDecoder. + * + * @author baltzell + */ +public class CodaDecoders { + + /** + * Returns an array of the branches in the event. + * @param event + * @return + */ + public static List getEventBranches(EvioDataEvent event){ + ArrayList branches = new ArrayList<>(); + try { + List eventNodes = event.getStructureHandler().getNodes(); + if (eventNodes==null) { + return branches; + } + for (EvioNode node : eventNodes){ + EvioTreeBranch eBranch = new EvioTreeBranch(node.getTag(),node.getNum()); + List childNodes = node.getChildNodes(); + if (childNodes!=null){ + for (EvioNode child : childNodes){ + eBranch.addNode(child); + } + branches.add(eBranch); + } + } + } catch (EvioException ex) { + Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); + } + return branches; + } + + public static void printByteBuffer(ByteBuffer buffer, int max, int columns){ + int n = max; + if(buffer.capacity() + * + * c "slot number" + * m "number of channels fired" + * c "channel number" + * m "number of shorts in packed array" + * s "packed fadc data" + * + * + */ + public static void decodeComposite(ByteBuffer buffer, int offset, List ctypes, List citems){ + int position = offset; + int length = buffer.capacity(); + try { + while(position<(length-3)){ + Short slot = (short) (0x00FF&(buffer.get(position))); + position++; + citems.add(slot); + ctypes.add(DataType.SHORT16); + Short counter = (short) (0x00FF&(buffer.get(position))); + citems.add(counter); + ctypes.add(DataType.NVALUE); + position++; + + for(int i = 0; i < counter; i++){ + Short channel = (short) (0x00FF&(buffer.get(position))); + position++; + citems.add(channel); + ctypes.add(DataType.SHORT16); + Short ndata = (short) (0x00FF&(buffer.get(position))); + position++; + citems.add(ndata); + ctypes.add(DataType.NVALUE); + for(int b = 0; b < ndata; b++){ + Short data = buffer.getShort(position); + position+=2; + citems.add(data); + ctypes.add(DataType.SHORT16); + } + } + } + } catch (Exception e){ + System.out.println("Exception : Length = " + length + " position = " + position); + } + } + + /** + * SVT decoding + * @param crate + * @param node + * @param event + * @return + */ + public static ArrayList getDataEntries_57617(Integer crate, EvioNode node, EvioDataEvent event){ + + ArrayList rawdata = new ArrayList<>(); + + if(node.getTag()==57617){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + List cdataitems = compData.getItems(); + int totalSize = cdataitems.size(); + int position = 0; + while( (position + 4) < totalSize){ + Byte slot = (Byte) cdataitems.get(position); + //Integer trig = (Integer) cdataitems.get(position+1); + Long time = (Long) cdataitems.get(position+2); + Integer nchannels = (Integer) cdataitems.get(position+3); + int counter = 0; + position = position + 4; + while(counter ERROR DECODING COMPOSITE DATA FOR ONE EVENT"); + } + } + return rawdata; + } + + /** + * Bank TAG=57657 used for ATOF PETIROC TDC values + * @param crate + * @param node + * @param event + * @return + * + * + * + * c "slot number" + * i "trigger number" + * l "time stamp" + * N "number of channels fired" + * c "channel number" + * i "tdc value" + * i "width value" + * + * + */ + public static List getDataEntries_57657(Integer crate, EvioNode node, EvioDataEvent event) { + + ArrayList entries = new ArrayList<>(); + + if(node.getTag()==57657){ + try { + //System.err.println("Decoding ATOF PETIROC event!"); + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + if(cdatatypes.get(3) != DataType.NVALUE){ + System.err.println("[EvioRawDataSource] ** error ** corrupted " + + " bank. tag = " + node.getTag() + " num = " + node.getNum()); + return null; + } + + int position = 0; + while(position -> "bank" DetectorDataDgtz -> "tdc" TDCData + // there is a redundancy in timestamp: the same value is stored in TDCData and the DetectorDataDgz + // + bank.setTimeStamp(time_stamp); + bank.setTrigger(trig_num);; + TDCData tdc_data = new TDCData(tdc, tot); + tdc_data.setTimeStamp(time_stamp).setOrder(counter); + bank.addTDC(tdc_data); + entries.add(bank); + position += 3; // channel,tdc,tot + counter++; + //System.err.println("event: " + bank.toString()); + } + } + + return entries; + } catch (EvioException ex) { + Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); + } + } + return entries; + } + + /** + * Bank TAG=57636 used for RICH TDC values + * @param crate + * @param node + * @param event + * @return + */ + public static List getDataEntries_57636(Integer crate, EvioNode node, EvioDataEvent event){ + + ArrayList entries = new ArrayList<>(); + + if(node.getTag()==57636){ + try { + + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + if(cdatatypes.get(3) != DataType.NVALUE){ + System.err.println("[EvioRawDataSource] ** error ** corrupted " + + " bank. tag = " + node.getTag() + " num = " + node.getNum()); + return null; + } + + int position = 0; + while(position>15)&0x1; + int tdc = rawtdc&0x7FFF; + + DetectorDataDgtz bank = new DetectorDataDgtz(crate,slot.intValue(),2*(fiber*192+channel)+edge); + bank.addTDC(new TDCData(tdc)); + + entries.add(bank); + position += 3; + counter++; + } + } + + return entries; + } catch (EvioException ex) { + Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); + } + } + return entries; + } + + /** + * Bank TAG=57648 used for DC (Drift Chambers) TDC and ToT values. + * @param crate + * @param node + * @param event + * @return + */ + public static List getDataEntries_57648(Integer crate, EvioNode node, EvioDataEvent event){ + List entries = new ArrayList<>(); + if(node.getTag()==57648){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + //List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + int totalSize = cdataitems.size(); + int position = 0; + while( (position + 4) < totalSize){ + Byte slot = (Byte) cdataitems.get(position); + //Integer trig = (Integer) cdataitems.get(position+1); + Long time = (Long) cdataitems.get(position+2); + Integer nchannels = (Integer) cdataitems.get(position+3); + int counter = 0; + position = position + 4; + while(counter getDataEntries_57622(Integer crate, EvioNode node, EvioDataEvent event){ + List entries = new ArrayList<>(); + if(node.getTag()==57622){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + //List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + int totalSize = cdataitems.size(); + int position = 0; + while( (position + 4) < totalSize){ + Byte slot = (Byte) cdataitems.get(position); + //Integer trig = (Integer) cdataitems.get(position+1); + Long time = (Long) cdataitems.get(position+2); + Integer nchannels = (Integer) cdataitems.get(position+3); + int counter = 0; + position = position + 4; + while(counter +//             +//                  c     "slot number" (8bit) +//                  i     "trigger number" (32bit) +//                  l     "time stamp" (64bit) +//                  N     "number of channels fired" (32bit) +//                  c     "channel number" (8bit) +//                  N     "number of pulses" (32bit) +//                  s     "tdc value" (16bit) +//                  i     "adc value" (32bit) +//             +//       + public static List getDataEntries_57603(Integer crate, EvioNode node, EvioDataEvent event){ + List entries = new ArrayList<>(); + if(node.getTag()==57603){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + if(cdatatypes.get(3) != DataType.NVALUE){ + System.err.println("[EvioRawDataSource] ** error ** corrupted " + + " bank. tag = " + node.getTag() + " num = " + node.getNum()); + return null; + } + + int position = 0; + while((position+4) getDataEntries_57602(Integer crate, EvioNode node, EvioDataEvent event){ + List entries = new ArrayList<>(); + if(node.getTag()==57602){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + if(cdatatypes.get(3) != DataType.NVALUE){ + System.err.println("[EvioRawDataSource] ** error ** corrupted " + + " bank. tag = " + node.getTag() + " num = " + node.getNum()); + return null; + } + + int position = 0; + while((position+4) getDataEntries_57641(Integer crate, EvioNode node, EvioDataEvent event){ + // Micromegas packed data + // ---------------------- + + ArrayList entries = new ArrayList<>(); + if(node.getTag()==57641){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + int jdata = 0; // item counter + for( int i = 0 ; i < cdatatypes.size(); ) { // loop over data types + + Byte SLOT = (Byte)cdataitems.get( jdata++ ); i++; + Integer EV_ID = (Integer)cdataitems.get( jdata++ ); i++; + Long TIMESTAMP = (Long)cdataitems.get( jdata++ ); i++; + Short nChannels = (Short)cdataitems.get( jdata++ ); i++; + + for( int ch=0; ch>4)<<8; + } + } + i++; + + ADCData adcData = new ADCData(); + adcData.setTimeStamp(TIMESTAMP); + adcData.setPulse(samples); + adcData.setTime(firstChannel); + bank.addADC(adcData); + + entries.add(bank); + } + } // end loop on channels + } // end loop on data types + return entries; + + } catch (EvioException ex) { + Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); + } + } + return entries; + } + + /** + * Decoding MicroMegas Packed Data + * @param crate + * @param node + * @param event + * @return + */ + public static List getDataEntries_57640(Integer crate, EvioNode node, EvioDataEvent event){ + // Micromegas packed data + // ---------------------- + + ArrayList entries = new ArrayList<>(); + if(node.getTag()==57640){ + try { + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + int jdata = 0; // item counter + for( int i = 0 ; i < cdatatypes.size(); ) { // loop over data types + + Byte CRATE = (Byte)cdataitems.get( jdata++ ); i++; + Integer EV_ID = (Integer)cdataitems.get( jdata++ ); i++; + Long TIMESTAMP = (Long)cdataitems.get( jdata++ ); i++; + Short nChannels = (Short)cdataitems.get( jdata++ ); i++; + + for( int ch=0; ch>4)<<8; + } + + } + i++; + + ADCData adcData = new ADCData(); + adcData.setTimeStamp(TIMESTAMP); + adcData.setPulse(samples); + bank.addADC(adcData); + entries.add(bank); + } // end loop on channels + } // end loop on data types + return entries; + + } catch (EvioException ex) { + Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); + } + } + return entries; + } + + public static List getDataEntries_57627(Integer crate, EvioNode node, EvioDataEvent event){ + + ArrayList entries = new ArrayList<>(); + + if(node.getTag()==57627){ + try { + + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + if(cdatatypes.get(3) != DataType.NVALUE){ + System.err.println("[EvioRawDataSource] ** error ** corrupted " + + " bank. tag = " + node.getTag() + " num = " + node.getNum()); + return null; + } + + int position = 0; + + while(position getDataEntries_57638(Integer crate, EvioNode node, EvioDataEvent event){ + List entries = new ArrayList<>(); + if(node.getTag()==57638){ + ByteBuffer compBuffer = node.getByteData(true); + List cdatatypes = new ArrayList<>(); + List cdataitems = new ArrayList<>(); + decodeComposite(compBuffer, 24, cdatatypes, cdataitems); + + int position = 0; + + while(position18) entries.add(data); + } + } + } + return entries; + } + + /** + * decoding bank in Mode 1 - full ADC pulse. + * @param crate + * @param node + * @param event + * @return + */ + public static List getDataEntries_57601(Integer crate, EvioNode node, EvioDataEvent event){ + + ArrayList entries = new ArrayList<>(); + + if(node.getTag()==57601){ + try { + + ByteBuffer compBuffer = node.getByteData(true); + CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); + + List cdatatypes = compData.getTypes(); + List cdataitems = compData.getItems(); + + if(cdatatypes.get(3) != DataType.NVALUE){ + System.err.println("[EvioRawDataSource] ** error ** corrupted " + + " bank. tag = " + node.getTag() + " num = " + node.getNum()); + return null; + } + + int position = 0; + + while(position>>> EVENT SIZE EXCEEDS 600 kB"); - // return new ArrayList(); - //} - - // zero out the trigger bits, but let the others properties inherit - // from the previous event, in the case where there's no HEAD bank: - this.setTriggerBits(0); - List rawEntries = new ArrayList<>(); - List branches = this.getEventBranches(event); - this.setTimeStamp(event); - for(EvioTreeBranch branch : branches){ - List list = this.getDataEntries(event,branch.getTag()); - if(list != null){ - rawEntries.addAll(list); - } - } - List tdcEntries = this.getDataEntries_TDC(event); - rawEntries.addAll(tdcEntries); - List vtpEntries = this.getDataEntries_VTP(event); - rawEntries.addAll(vtpEntries); - List scalerEntries = this.getDataEntries_Scalers(event); - rawEntries.addAll(scalerEntries); - - this.getDataEntries_EPICS(event); - - return rawEntries; - } + public CodaEventDecoder(){} public JsonObject getEpicsData(){ return this.epicsData; @@ -97,17 +50,6 @@ public List getTriggerWords(){ return this.triggerWords; } - private void printByteBuffer(ByteBuffer buffer, int max, int columns){ - int n = max; - if(buffer.capacity() tiEntries = this.getDataEntries_TI(event); - - if(tiEntries.size()==1) { - ts = tiEntries.get(0).getTimeStamp(); - } - else if(tiEntries.size()>1) { - // check sychronization - boolean tiSync=true; - int i0 = -1; - // set reference timestamp from first entry which is not the tiMaster nor PCIE: - for(int i=0; ideltaTS) { - tiSync=false; - if(this.timeStampErrors<100) { - System.err.println("WARNING: mismatch in TI time stamps: crate " - + tiEntries.get(i).getDescriptor().getCrate() + " reports " - + tiEntries.get(i).getTimeStamp() + " instead of the " + tiEntries.get(i0).getTimeStamp() - + " from crate " + tiEntries.get(i0).getDescriptor().getCrate()); - } - else if(this.timeStampErrors==100) { - System.err.println("WARNING: reached the maximum number of timeStamp errors (100), supressing future warnings."); - } - this.timeStampErrors++; - } - } - if(tiSync) ts = tiEntries.get(i0).getTimeStamp(); - } - this.timeStamp = ts ; - } - - public long getTriggerBits() { - return triggerBits; - } - - public void setTriggerBits(long triggerBits) { - this.triggerBits = triggerBits; - } - - public List getADCEntries(EvioDataEvent event){ - List entries = new ArrayList<>(); - List branches = this.getEventBranches(event); - for(EvioTreeBranch branch : branches){ - List list = this.getADCEntries(event,branch.getTag()); - if(list != null){ - entries.addAll(list); - } - } - return entries; - } - - public List getADCEntries(EvioDataEvent event, int crate){ - List entries = new ArrayList<>(); - - List branches = this.getEventBranches(event); - EvioTreeBranch cbranch = this.getEventBranch(branches, crate); - - if(cbranch == null ) return null; - - for(EvioNode node : cbranch.getNodes()){ - if(node.getTag()==57638){ - return this.getDataEntries_57638(crate, node, event); - } - } - - return entries; - } - - public List getADCEntries(EvioDataEvent event, int crate, int tagid){ - - List adc = new ArrayList<>(); - List branches = this.getEventBranches(event); - - EvioTreeBranch cbranch = this.getEventBranch(branches, crate); - if(cbranch == null ) return null; - - for(EvioNode node : cbranch.getNodes()){ - if(node.getTag()==tagid){ - // This is regular integrated pulse mode, used for FTOF - // FTCAL and EC/PCAL - return this.getADCEntries_Tag(crate, node, event,tagid); - } - } - return adc; - } - - /** - * returns list of decoded data in the event for given crate. - * @param event - * @param crate - * @return - */ - public List getDataEntries(EvioDataEvent event, int crate){ - - List branches = this.getEventBranches(event); - List bankEntries = new ArrayList<>(); - - EvioTreeBranch cbranch = this.getEventBranch(branches, crate); - if(cbranch == null ) return null; - - for (EvioNode node : cbranch.getNodes()) { - if (node.getTag() == 57615) { - // This is regular integrated pulse mode, used for FTOF - // FTCAL and EC/PCAL - this.tiMaster = crate; - this.readHeaderBank(crate, node, event); - } - } - for(EvioNode node : cbranch.getNodes()){ - - if(node.getTag()==57617){ - // This is regular integrated pulse mode, used for FTOF - // FTCAL and EC/PCAL - return this.getDataEntries_57617(crate, node, event); - } - else if(node.getTag()==57603){ - // This is regular integrated pulse mode, used for streaming - return this.getDataEntries_57603(crate, node, event); - } - else if(node.getTag()==57602){ - // This is regular integrated pulse mode, used for FTOF - // FTCAL and EC/PCAL - return this.getDataEntries_57602(crate, node, event); - } - else if(node.getTag()==57601){ - // This is regular integrated pulse mode, used for FTOF - // FTCAL and EC/PCAL - return this.getDataEntries_57601(crate, node, event); - } - else if(node.getTag()==57627){ - // This is regular integrated pulse mode, used for MM - return this.getDataEntries_57627(crate, node, event); - } - else if(node.getTag()==57640){ - // This is bit-packed pulse mode, used for MM - return this.getDataEntries_57640(crate, node, event); - } - else if(node.getTag()==57622){ - // This is regular DCRB bank with TDCs only - return this.getDataEntries_57622(crate, node, event); - } - else if(node.getTag()==57648){ - // This is DCRB bank with TDCs and widths - return this.getDataEntries_57648(crate, node, event); - } - else if(node.getTag()==57636){ - // RICH TDC data - return this.getDataEntries_57636(crate, node, event); - } else if (node.getTag() == 57657) { - // ATOF Petiroc TDC data - return this.getDataEntries_57657(crate, node, event); - } else if (node.getTag() == 57641) { - // RTPC data decoding - return this.getDataEntries_57641(crate, node, event); - } - } - return bankEntries; - } - - /** - * Returns an array of the branches in the event. - * @param event - * @return - */ - public List getEventBranches(EvioDataEvent event){ - ArrayList branches = new ArrayList<>(); - try { - - List eventNodes = event.getStructureHandler().getNodes(); - if(eventNodes==null){ - return branches; - } - - for(EvioNode node : eventNodes){ - EvioTreeBranch eBranch = new EvioTreeBranch(node.getTag(),node.getNum()); - List childNodes = node.getChildNodes(); - if(childNodes!=null){ - for(EvioNode child : childNodes){ - eBranch.addNode(child); - } - branches.add(eBranch); - } - } - - } catch (EvioException ex) { - Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); - } - return branches; - } - /** - * returns branch with with given tag - * @param branches - * @param tag - * @return - */ - public EvioTreeBranch getEventBranch(List branches, int tag){ - for(EvioTreeBranch branch : branches){ - if(branch.getTag()==tag) return branch; - } - return null; - } - - public void readHeaderBank(Integer crate, EvioNode node, EvioDataEvent event){ - - if(node.getDataTypeObj()==DataType.INT32||node.getDataTypeObj()==DataType.UINT32){ - try { - int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); - this.runNumber = intData[3]; - this.eventNumber = intData[4]; - if(intData[5]!=0) this.unixTime = intData[5]; - this.helicityLevel3=HelicityBit.DNE.value(); - if(intData.length>7) { - if ( (intData[7] & 0x1) == 0) { - this.helicityLevel3=HelicityBit.UDF.value(); - } - else if ((intData[7]>>1 & 0x1) == 0) { - this.helicityLevel3=HelicityBit.MINUS.value(); - } - else { - this.helicityLevel3=HelicityBit.PLUS.value(); - } - } - } catch (Exception e) { - this.runNumber = 10; - this.eventNumber = 1; - } - } else { - System.out.println("[error] can not read header bank"); - } - } - - /** - * SVT decoding - * @param crate - * @param node - * @param event - * @return - */ - public ArrayList getDataEntries_57617(Integer crate, EvioNode node, EvioDataEvent event){ - - ArrayList rawdata = new ArrayList<>(); - - if(node.getTag()==57617){ - try { - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - List cdataitems = compData.getItems(); - int totalSize = cdataitems.size(); - int position = 0; - while( (position + 4) < totalSize){ - Byte slot = (Byte) cdataitems.get(position); - //Integer trig = (Integer) cdataitems.get(position+1); - Long time = (Long) cdataitems.get(position+2); - Integer nchannels = (Integer) cdataitems.get(position+3); - int counter = 0; - position = position + 4; - while(counter ERROR DECODING COMPOSITE DATA FOR ONE EVENT"); - } - } - return rawdata; - } - - public List getADCEntries_Tag(Integer crate, EvioNode node, EvioDataEvent event, int tagid){ - List entries = new ArrayList<>(); - if(node.getTag()==tagid){ - try { - - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - - List cdatatypes = compData.getTypes(); - List cdataitems = compData.getItems(); - - if(cdatatypes.get(3) != DataType.NVALUE){ - System.err.println("[EvioRawDataSource] ** error ** corrupted " - + " bank. tag = " + node.getTag() + " num = " + node.getNum()); - return null; - } - - int position = 0; - - while(position - * - * c "slot number" - * m "number of channels fired" - * c "channel number" - * m "number of shorts in packed array" - * s "packed fadc data" - * - * - */ - public void decodeComposite(ByteBuffer buffer, int offset, List ctypes, List citems){ - int position = offset; - int length = buffer.capacity(); - try { - while(position<(length-3)){ - Short slot = (short) (0x00FF&(buffer.get(position))); - position++; - citems.add(slot); - ctypes.add(DataType.SHORT16); - Short counter = (short) (0x00FF&(buffer.get(position))); - citems.add(counter); - ctypes.add(DataType.NVALUE); - position++; - - for(int i = 0; i < counter; i++){ - Short channel = (short) (0x00FF&(buffer.get(position))); - position++; - citems.add(channel); - ctypes.add(DataType.SHORT16); - Short ndata = (short) (0x00FF&(buffer.get(position))); - position++; - citems.add(ndata); - ctypes.add(DataType.NVALUE); - for(int b = 0; b < ndata; b++){ - Short data = buffer.getShort(position); - position+=2; - citems.add(data); - ctypes.add(DataType.SHORT16); - } - } - } - } catch (Exception e){ - System.out.println("Exception : Length = " + length + " position = " + position); - } - } - - public List getDataEntries_57638(Integer crate, EvioNode node, EvioDataEvent event){ - List entries = new ArrayList<>(); - if(node.getTag()==57638){ - ByteBuffer compBuffer = node.getByteData(true); - List cdatatypes = new ArrayList<>(); - List cdataitems = new ArrayList<>(); - this.decodeComposite(compBuffer, 24, cdatatypes, cdataitems); - - int position = 0; - - while(position18) entries.add(data); - } - } - } - return entries; - } - - /** - * decoding bank in Mode 1 - full ADC pulse. - * @param crate - * @param node - * @param event - * @return - */ - public List getDataEntries_57601(Integer crate, EvioNode node, EvioDataEvent event){ - - ArrayList entries = new ArrayList<>(); - - if(node.getTag()==57601){ - try { - - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - - List cdatatypes = compData.getTypes(); - List cdataitems = compData.getItems(); - - if(cdatatypes.get(3) != DataType.NVALUE){ - System.err.println("[EvioRawDataSource] ** error ** corrupted " - + " bank. tag = " + node.getTag() + " num = " + node.getNum()); - return null; - } - - int position = 0; - - while(position -//             -//                  c     "slot number" (8bit) -//                  i     "trigger number" (32bit) -//                  l     "time stamp" (64bit) -//                  N     "number of channels fired" (32bit) -//                  c     "channel number" (8bit) -//                  N     "number of pulses" (32bit) -//                  s     "tdc value" (16bit) -//                  i     "adc value" (32bit) -//             -//       - public List getDataEntries_57603(Integer crate, EvioNode node, EvioDataEvent event){ - List entries = new ArrayList<>(); - if(node.getTag()==57603){ - try { - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - - List cdatatypes = compData.getTypes(); - List cdataitems = compData.getItems(); - - if(cdatatypes.get(3) != DataType.NVALUE){ - System.err.println("[EvioRawDataSource] ** error ** corrupted " - + " bank. tag = " + node.getTag() + " num = " + node.getNum()); - return null; - } - - int position = 0; - while((position+4) getDataEntries_57622(Integer crate, EvioNode node, EvioDataEvent event){ - List entries = new ArrayList<>(); - if(node.getTag()==57622){ - try { - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - //List cdatatypes = compData.getTypes(); - List cdataitems = compData.getItems(); - - int totalSize = cdataitems.size(); - int position = 0; - while( (position + 4) < totalSize){ - Byte slot = (Byte) cdataitems.get(position); - //Integer trig = (Integer) cdataitems.get(position+1); - Long time = (Long) cdataitems.get(position+2); - Integer nchannels = (Integer) cdataitems.get(position+3); - int counter = 0; - position = position + 4; - while(counter(); + for (EvioTreeBranch branch : CodaDecoders.getEventBranches(event)) + if (!branchMap.containsKey(branch.getTag())) + branchMap.put(branch.getTag(), branch); } /** - * Bank TAG=57648 used for DC (Drift Chambers) TDC and ToT values. - * @param crate - * @param node + * returns detector digitized data entries from the event. + * all branches are analyzed and different types of digitized data + * is created for each type of ADC and TDC data. * @param event * @return */ - public List getDataEntries_57648(Integer crate, EvioNode node, EvioDataEvent event){ - List entries = new ArrayList<>(); - if(node.getTag()==57648){ - try { - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - //List cdatatypes = compData.getTypes(); - List cdataitems = compData.getItems(); + public List getDataEntries(EvioDataEvent event){ - int totalSize = cdataitems.size(); - int position = 0; - while( (position + 4) < totalSize){ - Byte slot = (Byte) cdataitems.get(position); - //Integer trig = (Integer) cdataitems.get(position+1); - Long time = (Long) cdataitems.get(position+2); - Integer nchannels = (Integer) cdataitems.get(position+3); - int counter = 0; - position = position + 4; - while(counter600*1024){ + // System.out.println("error: >>>> EVENT SIZE EXCEEDS 600 kB"); + // return new ArrayList(); + //} + + // zero out the trigger bits, but let the others properties inherit + // from the previous event, in the case where there's no HEAD bank: + this.setTriggerBits(0); + List rawEntries = new ArrayList<>(); + this.setTimeStamp(event); + for(EvioTreeBranch branch : branchMap.values()){ + List list = this.getDataEntries(event,branch.getTag()); + if(list != null){ + rawEntries.addAll(list); } - } - return entries; + List tdcEntries = this.getDataEntries_TDC(event); + rawEntries.addAll(tdcEntries); + List vtpEntries = this.getDataEntries_VTP(event); + rawEntries.addAll(vtpEntries); + List scalerEntries = this.getDataEntries_Scalers(event); + rawEntries.addAll(scalerEntries); + + this.getDataEntries_EPICS(event); + + return rawEntries; } /** - * Bank TAG=57636 used for RICH TDC values - * @param crate - * @param node + * returns list of decoded data in the event for given crate. * @param event + * @param crate * @return */ - public List getDataEntries_57636(Integer crate, EvioNode node, EvioDataEvent event){ - - ArrayList entries = new ArrayList<>(); - - if(node.getTag()==57636){ - try { - - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - - List cdatatypes = compData.getTypes(); - List cdataitems = compData.getItems(); - - if(cdatatypes.get(3) != DataType.NVALUE){ - System.err.println("[EvioRawDataSource] ** error ** corrupted " - + " bank. tag = " + node.getTag() + " num = " + node.getNum()); - return null; - } - - int position = 0; - while(position getDataEntries(EvioDataEvent event, int crate){ + List bankEntries = new ArrayList<>(); + EvioTreeBranch cbranch = branchMap.getOrDefault(crate, null); + if(cbranch == null ) return null; + for (EvioNode node : cbranch.getNodes()) { + if (node.getTag() == 57615) { + this.tiMaster = crate; + this.readHeaderBank(crate, node, event); + } + } + for(EvioNode node : cbranch.getNodes()){ + switch (node.getTag()) { + case 57617: + // This is regular integrated pulse mode, used for FTOF/FTCAL/ECAL + return CodaDecoders.getDataEntries_57617(crate, node, event); + case 57603: + // This is regular integrated pulse mode, used for streaming + return CodaDecoders.getDataEntries_57603(crate, node, event); + case 57602: + // This is regular integrated pulse mode, used for FTOF/FTCAL/ECAL + return CodaDecoders.getDataEntries_57602(crate, node, event); + case 57601: + // This is regular integrated pulse mode, used for FTOF/FTCAL/ECAL + return CodaDecoders.getDataEntries_57601(crate, node, event); + case 57627: + // This is regular integrated pulse mode, used for MM + return CodaDecoders.getDataEntries_57627(crate, node, event); + case 57640: + // This is bit-packed pulse mode, used for MM + return CodaDecoders.getDataEntries_57640(crate, node, event); + case 57622: + // This is regular DCRB bank with TDCs only + return CodaDecoders.getDataEntries_57622(crate, node, event); + case 57648: + // This is DCRB bank with TDCs and widths + return CodaDecoders.getDataEntries_57648(crate, node, event); + case 57636: + // RICH TDC data + return CodaDecoders.getDataEntries_57636(crate, node, event); + case 57657: + // ATOF Petiroc TDC data + return CodaDecoders.getDataEntries_57657(crate, node, event); + case 57641: + // RTPC data decoding + return CodaDecoders.getDataEntries_57641(crate, node, event); + default: + break; + } + } + return bankEntries; + } - while(counter>15)&0x1; - int tdc = rawtdc&0x7FFF; + private void setTimeStamp(EvioDataEvent event) { - DetectorDataDgtz bank = new DetectorDataDgtz(crate,slot.intValue(),2*(fiber*192+channel)+edge); - bank.addTDC(new TDCData(tdc)); + long ts = -1; - entries.add(bank); - position += 3; - counter++; + List tiEntries = this.getDataEntries_TI(event); + + if(tiEntries.size()==1) { + ts = tiEntries.get(0).getTimeStamp(); + } + else if(tiEntries.size()>1) { + // check sychronization + boolean tiSync=true; + int i0 = -1; + // set reference timestamp from first entry which is not the tiMaster nor PCIE: + for(int i=0; ideltaTS) { + tiSync=false; + if(this.timeStampErrors<100) { + System.err.println("WARNING: mismatch in TI time stamps: crate " + + tiEntries.get(i).getDescriptor().getCrate() + " reports " + + tiEntries.get(i).getTimeStamp() + " instead of the " + tiEntries.get(i0).getTimeStamp() + + " from crate " + tiEntries.get(i0).getDescriptor().getCrate()); } + else if(this.timeStampErrors==100) { + System.err.println("WARNING: reached the maximum number of timeStamp errors (100), supressing future warnings."); + } + this.timeStampErrors++; } - - return entries; - } catch (EvioException ex) { - Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); } + if(tiSync) ts = tiEntries.get(i0).getTimeStamp(); } - return entries; + this.timeStamp = ts ; } - /** - * Bank TAG=57657 used for ATOF PETIROC TDC values - * @param crate - * @param node - * @param event - * @return - * - * - * - * c "slot number" - * i "trigger number" - * l "time stamp" - * N "number of channels fired" - * c "channel number" - * i "tdc value" - * i "width value" - * - * - */ - public List getDataEntries_57657(Integer crate, EvioNode node, EvioDataEvent event){ + private void readHeaderBank(Integer crate, EvioNode node, EvioDataEvent event){ - ArrayList entries = new ArrayList<>(); - - if(node.getTag()==57657){ + if(node.getDataTypeObj()==DataType.INT32||node.getDataTypeObj()==DataType.UINT32){ try { - //System.err.println("Decoding ATOF PETIROC event!"); - ByteBuffer compBuffer = node.getByteData(true); - CompositeData compData = new CompositeData(compBuffer.array(),event.getByteOrder()); - - List cdatatypes = compData.getTypes(); - List cdataitems = compData.getItems(); - - if(cdatatypes.get(3) != DataType.NVALUE){ - System.err.println("[EvioRawDataSource] ** error ** corrupted " - + " bank. tag = " + node.getTag() + " num = " + node.getNum()); - return null; - } - - int position = 0; - while(position -> "bank" DetectorDataDgtz -> "tdc" TDCData - // there is a redundancy in timestamp: the same value is stored in TDCData and the DetectorDataDgz - // - bank.setTimeStamp(time_stamp); - bank.setTrigger(trig_num);; - TDCData tdc_data = new TDCData(tdc, tot); - tdc_data.setTimeStamp(time_stamp).setOrder(counter); - bank.addTDC(tdc_data); - entries.add(bank); - position += 3; // channel,tdc,tot - counter++; - //System.err.println("event: " + bank.toString()); + int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); + this.runNumber = intData[3]; + this.eventNumber = intData[4]; + if(intData[5]!=0) this.unixTime = intData[5]; + this.helicityLevel3=HelicityBit.DNE.value(); + if(intData.length>7) { + if ( (intData[7] & 0x1) == 0) { + this.helicityLevel3=HelicityBit.UDF.value(); + } + else if ((intData[7]>>1 & 0x1) == 0) { + this.helicityLevel3=HelicityBit.MINUS.value(); + } + else { + this.helicityLevel3=HelicityBit.PLUS.value(); } } - - return entries; - } catch (EvioException ex) { - Logger.getLogger(CodaEventDecoder.class.getName()).log(Level.SEVERE, null, ex); + } catch (Exception e) { + this.runNumber = 10; + this.eventNumber = 1; } + } else { + System.out.println("[error] can not read header bank"); } - return entries; } - - - public void getDataEntries_EPICS(EvioDataEvent event){ + private void getDataEntries_EPICS(EvioDataEvent event){ epicsData = new JsonObject(); - List branches = this.getEventBranches(event); - for(EvioTreeBranch branch : branches){ + for(EvioTreeBranch branch : branchMap.values()){ for(EvioNode node : branch.getNodes()){ if(node.getTag()==57620) { byte[] stringData = ByteDataTransformer.toByteArray(node.getStructureBuffer(true)); @@ -1260,8 +295,7 @@ public void getDataEntries_EPICS(EvioDataEvent event){ public HelicityDecoderData getDataEntries_HelicityDecoder(EvioDataEvent event){ HelicityDecoderData data = null; - List branches = this.getEventBranches(event); - for(EvioTreeBranch branch : branches){ + for(EvioTreeBranch branch : branchMap.values()){ for(EvioNode node : branch.getNodes()){ if(node.getTag()==57651) { @@ -1338,13 +372,11 @@ public HelicityDecoderData getDataEntries_HelicityDecoder(EvioDataEvent event){ return data; } - public List getDataEntries_Scalers(EvioDataEvent event){ + private List getDataEntries_Scalers(EvioDataEvent event){ List scalerEntries = new ArrayList<>(); - List branches = this.getEventBranches(event); - for(EvioTreeBranch branch : branches){ - int crate = branch.getTag(); - for(EvioNode node : branch.getNodes()){ + for(int crate : branchMap.keySet()) { + for(EvioNode node : branchMap.get(crate).getNodes()){ if(node.getTag()==57637 || node.getTag()==57621){ int num = node.getNum(); int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); @@ -1418,13 +450,53 @@ else if(node.getTag()==57621 && loop>=5) { return scalerEntries; } - public List getDataEntries_VTP(EvioDataEvent event){ + /** + * decoding bank that contains TI time stamp. + * @param event + * @return + */ + private List getDataEntries_TI(EvioDataEvent event){ + + List tiEntries = new ArrayList<>(); + for(int crate : branchMap.keySet()) { + for(EvioNode node : branchMap.get(crate).getNodes()){ + if(node.getTag()==57610){ + long[] longData = ByteDataTransformer.toLongArray(node.getStructureBuffer(true)); + int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); + long tStamp = longData[2]&0x0000ffffffffffffL; + + // Below is endian swap if needed + //long ntStamp = (((long)(intData[5]&0x0000ffffL))<<32) | (intData[4]&0xffffffffL); + //System.out.println(longData[2]+" "+tStamp+" "+crate+" "+node.getDataLength()); + + DetectorDataDgtz entry = new DetectorDataDgtz(crate,0,0); + entry.setTimeStamp(tStamp); + if(node.getDataLength()==4) tiEntries.add(entry); + else if(node.getDataLength()==5) { // trigger supervisor crate + this.setTriggerBits(intData[6]); + } + else if(node.getDataLength()==6) { // New format Dec 1 2017 (run 1701) + this.setTriggerBits(intData[6]<<16|intData[7]); + } + else if(node.getDataLength()==7) { // New format Dec 1 2017 (run 1701) + long word = (( (long) intData[7])<<32) | (intData[6]&0xffffffffL); + this.setTriggerBits(word); + this.triggerWords.clear(); + for(int i=6; i<=8; i++) { + this.triggerWords.add(intData[i]); + } + } + } + } + } + + return tiEntries; + } + private List getDataEntries_VTP(EvioDataEvent event){ List vtpEntries = new ArrayList<>(); - List branches = this.getEventBranches(event); - for(EvioTreeBranch branch : branches){ - int crate = branch.getTag(); - for(EvioNode node : branch.getNodes()){ + for(int crate : branchMap.keySet()) { + for(EvioNode node : branchMap.get(crate).getNodes()){ if(node.getTag()==57634){ int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); for(int loop = 0; loop < intData.length; loop++){ @@ -1438,21 +510,17 @@ public List getDataEntries_VTP(EvioDataEvent event){ } return vtpEntries; } + /** * reads the TDC values from the bank with tag = 57607, decodes * them and returns a list of digitized detector object. * @param event * @return */ - public List getDataEntries_TDC(EvioDataEvent event){ - + private List getDataEntries_TDC(EvioDataEvent event){ List tdcEntries = new ArrayList<>(); - List branches = this.getEventBranches(event); - - for(EvioTreeBranch branch : branches){ - int crate = branch.getTag(); - EvioTreeBranch cbranch = this.getEventBranch(branches, branch.getTag()); - for(EvioNode node : cbranch.getNodes()){ + for(int crate : branchMap.keySet()) { + for(EvioNode node : branchMap.get(crate).getNodes()){ if(node.getTag()==57607){ int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); for(int loop = 2; loop < intData.length; loop++){ @@ -1470,51 +538,25 @@ public List getDataEntries_TDC(EvioDataEvent event){ return tdcEntries; } + public List getADCEntries(EvioDataEvent event){ + List entries = new ArrayList<>(); + for(EvioTreeBranch branch : branchMap.values()){ + List list = this.getADCEntries(event,branch.getTag()); + if (list != null) entries.addAll(list); + } + return entries; + } - /** - * decoding bank that contains TI time stamp. - * @param event - * @return - */ - public List getDataEntries_TI(EvioDataEvent event){ - - List tiEntries = new ArrayList<>(); - List branches = this.getEventBranches(event); - for(EvioTreeBranch branch : branches){ - int crate = branch.getTag(); - EvioTreeBranch cbranch = this.getEventBranch(branches, branch.getTag()); - for(EvioNode node : cbranch.getNodes()){ - if(node.getTag()==57610){ - long[] longData = ByteDataTransformer.toLongArray(node.getStructureBuffer(true)); - int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); - long tStamp = longData[2]&0x0000ffffffffffffL; - - // Below is endian swap if needed - //long ntStamp = (((long)(intData[5]&0x0000ffffL))<<32) | (intData[4]&0xffffffffL); - //System.out.println(longData[2]+" "+tStamp+" "+crate+" "+node.getDataLength()); - - DetectorDataDgtz entry = new DetectorDataDgtz(crate,0,0); - entry.setTimeStamp(tStamp); - if(node.getDataLength()==4) tiEntries.add(entry); - else if(node.getDataLength()==5) { // trigger supervisor crate - this.setTriggerBits(intData[6]); - } - else if(node.getDataLength()==6) { // New format Dec 1 2017 (run 1701) - this.setTriggerBits(intData[6]<<16|intData[7]); - } - else if(node.getDataLength()==7) { // New format Dec 1 2017 (run 1701) - long word = (( (long) intData[7])<<32) | (intData[6]&0xffffffffL); - this.setTriggerBits(word); - this.triggerWords.clear(); - for(int i=6; i<=8; i++) { - this.triggerWords.add(intData[i]); - } - } - } + private List getADCEntries(EvioDataEvent event, int crate){ + List entries = new ArrayList<>(); + EvioTreeBranch cbranch = branchMap.getOrDefault(crate, null); + if(cbranch == null ) return null; + for(EvioNode node : cbranch.getNodes()){ + if(node.getTag()==57638){ + return CodaDecoders.getDataEntries_57638(crate, node, event); } } - - return tiEntries; + return entries; } public static void main(String[] args){ From 4006e8bb9580012ad2bad13a18f6135c651eb0c5 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 13 Mar 2026 19:17:13 -0400 Subject: [PATCH 086/190] reduce string comparisons, cleanup (#1066) --- .../detector/decode/DetectorEventDecoder.java | 83 +++++++++---------- 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java index d718ab9367..84ec0a6cf4 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java @@ -28,6 +28,7 @@ public class DetectorEventDecoder { List keysTrans = null; List keysFitter = null; List keysFilter = null; + List keysMicromega= null; private int runNumber = 10; @@ -128,7 +129,9 @@ public final void initDecoder(){ scalerManager.init(Arrays.asList(new String[]{"/runcontrol/fcup","/runcontrol/slm","/runcontrol/hwp", "/runcontrol/helicity","/daq/config/scalers/dsc1"})); - + + keysMicromega = Arrays.asList(new DetectorType[]{DetectorType.BMT,DetectorType.FMT,DetectorType.FTTRK}); + checkTables(); } @@ -175,70 +178,64 @@ public void fitPulses(List detectorData){ } for(DetectorDataDgtz data : detectorData){ + if (data.getADCSize() == 0) continue; int crate = data.getDescriptor().getCrate(); int slot = data.getDescriptor().getSlot(); int channel = data.getDescriptor().getChannel(); long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(crate,slot,channel); long hash0 = IndexedTable.DEFAULT_GENERATOR.hashCode(0,0,0); + boolean ismm = keysMicromega.contains(data.getDescriptor().getType()); + for (int j=0; j 0) { - ADCData adc = data.getADCData(0); - mvtFitter.fit(adcOffset, fineTimeStampResolution, samplingTime, adc.getPulseArray(), adc.getTimeStamp(), sparseSample); - adc.setHeight((short) (mvtFitter.adcMax)); - adc.setTime((int) (mvtFitter.timeMax)); - adc.setIntegral((int) (mvtFitter.integral)); - adc.setTimeStamp(mvtFitter.timestamp); + ADCData adc = data.getADCData(0); + mvtFitter.fit(adcOffset, fineTimeStampResolution, samplingTime, adc.getPulseArray(), adc.getTimeStamp(), sparseSample); + adc.setHeight((short) (mvtFitter.adcMax)); + adc.setTime((int) (mvtFitter.timeMax)); + adc.setIntegral((int) (mvtFitter.integral)); + adc.setTimeStamp(mvtFitter.timestamp); + // first one wins: + break; + } + else if(daq.hasEntryByHash(hash)==true){ + int nsa = daq.getIntValueByHash("nsa", hash); + int nsb = daq.getIntValueByHash("nsb", hash); + int tet = daq.getIntValueByHash("tet", hash); + int ped = 0; + if(data.getDescriptor().getType() == DetectorType.RF && type == DetectorType.RF) { + ped = daq.getIntValueByHash("pedestal", hash); } - } else { - if(daq.hasEntryByHash(hash)==true){ - int nsa = daq.getIntValueByHash("nsa", hash); - int nsb = daq.getIntValueByHash("nsb", hash); - int tet = daq.getIntValueByHash("tet", hash); - int ped = 0; - if(type == DetectorType.RF&&data.getDescriptor().getType().getName().equals("RF")) { - ped = daq.getIntValueByHash("pedestal", hash); - } - if(data.getADCSize()>0){ - for(int i = 0; i < data.getADCSize(); i++){ - ADCData adc = data.getADCData(i); - if(adc.getPulseSize()>0){ - try { - extendedFitter.fit(nsa, nsb, tet, ped, adc.getPulseArray()); - } catch (Exception e) { - System.out.println(">>>> error : fitting pulse " - + crate + " / " + slot + " / " + channel); - } - int adc_corrected = extendedFitter.adc + extendedFitter.ped*(nsa+nsb); - adc.setHeight((short) this.extendedFitter.pulsePeakValue); - adc.setIntegral(adc_corrected); - adc.setTimeWord(this.extendedFitter.t0); - adc.setPedestal((short) this.extendedFitter.ped); - } - } - } - if(data.getADCSize()>0){ - for(int i = 0; i < data.getADCSize(); i++){ - data.getADCData(i).setADC(nsa, nsb); + for(int i = 0; i < data.getADCSize(); i++){ + ADCData adc = data.getADCData(i); + if(adc.getPulseSize()>0){ + try { + extendedFitter.fit(nsa, nsb, tet, ped, adc.getPulseArray()); + } catch (Exception e) { + System.out.println(">>>> error : fitting pulse " + + crate + " / " + slot + " / " + channel); } + int adc_corrected = extendedFitter.adc + extendedFitter.ped*(nsa+nsb); + adc.setHeight((short) this.extendedFitter.pulsePeakValue); + adc.setIntegral(adc_corrected); + adc.setTimeWord(this.extendedFitter.t0); + adc.setPedestal((short) this.extendedFitter.ped); } + data.getADCData(i).setADC(nsa, nsb); } + // first one wins: + break; } } } } - public void filterTDCs(List detectorData){ int maxMultiplicity = 1; for(DetectorType type : keysFilter){ From 26eb9a77ba63c0d7af525b634422f9eca1190b10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:21:56 -0400 Subject: [PATCH 087/190] ci(deps): bump actions/upload-artifact from 6 to 7 (#1147) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c46dbf34e..3cb609762c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,7 +93,7 @@ jobs: run: | tar czvf coatjava.tar.gz coatjava tar czvf clara.tar.gz clara - - uses: actions/upload-artifact@v6 + - uses: actions/upload-artifact@v7 with: name: build_${{ matrix.runner }} retention-days: 1 @@ -138,7 +138,7 @@ jobs: run: validation/jacoco-aggregate.sh - name: publish jacoco report if: ${{ matrix.JAVA_VERSION == env.JAVA_VERSION }} - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: jacoco_report path: publish/ From 1ccf10abda9f41899da3e8b16a5c9749a15197fd Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 16 Mar 2026 09:38:02 -0400 Subject: [PATCH 088/190] add ignore-bank option (#1145) --- .../clas-io/src/main/java/org/jlab/utils/HipoDiff.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java index 8a06d076bd..8826afff82 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java +++ b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java @@ -1,7 +1,9 @@ package org.jlab.utils; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import org.jlab.jnp.hipo4.io.HipoReader; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -109,6 +111,7 @@ public static void main(String args[]) { op.addOption("-q", null, "quiet mode"); op.addOption("-Q", null, "verbose mode"); op.addOption("-b", null, "name of bank to diff"); + op.addOption("-B", "", "names of banks to ignore (comma separated)"); op.addOption("-s", null, "sort on column index"); op.addOption("-o", null, "output HIPO diff file"); op.setRequiresInputList(true); @@ -135,10 +138,13 @@ public static void main(String args[]) { SchemaFactory sf = readerA.getSchemaFactory(); runConfigBank = new Bank(sf.getSchema("RUN::config")); + List ignoreBanks = Arrays.asList(op.getOption("-B").stringValue().split(",")); if (op.getOption("-b").stringValue() == null) { for (Schema s : sf.getSchemaList()) { - banksA.add(new DiffBank(s)); - banksB.add(new DiffBank(s)); + if (!ignoreBanks.contains(s.getName())) { + banksA.add(new DiffBank(s)); + banksB.add(new DiffBank(s)); + } } } else { banksA.add(new DiffBank(sf.getSchema(op.getOption("-b").stringValue()))); From dbe2b4f923ab7b443fd3dbf7116707d6c4f8329d Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 19 Mar 2026 11:30:39 -0400 Subject: [PATCH 089/190] cleanup rg-l test yaml (#1132) --- etc/services/rgl-clarode.yml | 39 ++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/etc/services/rgl-clarode.yml b/etc/services/rgl-clarode.yml index ae762980a7..b6b417c4da 100644 --- a/etc/services/rgl-clarode.yml +++ b/etc/services/rgl-clarode.yml @@ -1,26 +1,11 @@ -mime-types: - - binary/data-hipo -configuration: - global: - variation: rge_spring2024 - timestamp: 10/08/2025-17:00:00 - io-services: - writer: - schema_dir: full - services: - MAGFIELDS: - magfieldSolenoidMap: Symm_solenoid_r601_phi1_z1201_13June2018.dat - magfieldTorusMap: Full_torus_r251_phi181_z251_25Jan2021.dat io-services: reader: - class: org.jlab.io.clara.DecoderReader - name: DecoderReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: class: org.jlab.io.clara.DecoderWriter name: DecoderWriter services: - - class: org.jlab.service.ai.DCDenoiseEngine - name: DCDN - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine @@ -29,6 +14,8 @@ services: name: FTHODO - class: org.jlab.rec.ft.FTEBEngine name: FTEB + - class: org.jlab.service.ai.DCDenoiseEngine + name: DCDN - class: org.jlab.service.dc.DCHBClustering name: DCCR - class: org.jlab.service.dc.DCHBPostClusterConv @@ -57,3 +44,21 @@ services: name: EBTB - class: org.jlab.rec.rich.RICHEBEngine name: RICH + - class: org.jlab.service.atof.ATOFEngine + name: ATOF + - class: org.jlab.service.ahdc.AHDCEngine + name: AHDC +configuration: + global: + variation: rgl_spring2025 + io-services: + writer: + schema_dir: dst + services: + MAGFIELDS: + magfieldSolenoidMap: Symm_solenoid_r601_phi1_z1201_13June2018.dat + magfieldTorusMap: Full_torus_r251_phi181_z251_25Jan2021.dat + AHDC: + Mode: "AI_Track_Finding" +mime-types: + - binary/data-hipo From b25681ffcbb2e2898bcf06579258c1dd27cf3bf7 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 20 Mar 2026 10:26:49 -0400 Subject: [PATCH 090/190] automatically fix scaling tests to a NUMA socket (#1151) * auto-detect NUMA socket * cleanup * cleanupt * cleanup * cleanup --- libexec/scaling | 66 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/libexec/scaling b/libexec/scaling index 41c2a06a43..b5fb0c9412 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -1,18 +1,42 @@ #!/usr/bin/env python3 def cli(): - import os,sys,argparse + import os,shutil,argparse cli = argparse.ArgumentParser(description='CLARA scaling test') - cli.add_argument('-y',help='YAML file',required=True) - cli.add_argument('-c',help='CLARA_HOME path',default=os.getenv('CLARA_HOME',None)) - cli.add_argument('-t',help='threads (default=4,8)',default='4,8') - cli.add_argument('-e',help='events per thread',default=100,type=int) - cli.add_argument('-i',help='input data file',required=True) + cli.add_argument('-y','--yaml', metavar='YAML',help='path to YAML file',required=True) + cli.add_argument('-c','--clara', metavar='DIR',help='CLARA_HOME path (default=$CLARA_HOME)',default=os.getenv('CLARA_HOME',None)) + cli.add_argument('-t','--threads',metavar='#',help='threads (default=4,8)',default='4,8') + cli.add_argument('-e','--events', metavar='#',help='events per thread (default=555)',default=555,type=int) + cli.add_argument('-N','--numa', metavar='#',help='NUMA socket (default=None, choices=[0,1])',default=None,type=int,choices=[0,1]) + cli.add_argument('datafile', help='input EVIO/HIPO data file') cfg = cli.parse_args() - cfg.t = cfg.t.split(',') - if cfg.c is None: sys.exit('-c or $CLARA_HOME is required.') + cfg.threads = cfg.threads.split(',') + if not cfg.clara: + cli.error('cannot find CLARA installation via -c or $CLARA_HOME') + cfg.run_clara = find_run_clara(cfg.clara) + if not cfg.run_clara: + cli.error('cannot find run-clara in $PATH or CLARA installation') + if cfg.numa is not None: + if not shutil.which('numactl'): + cli.error('numactl is not in $PATH, --numa option not supported') + if len(list(get_numa_cpus(cfg.numa))) == 0: + cli.error('invalid --numa node: {cfg.numa}') + cfg.numa = ','.join(list(get_numa_cpus(cfg.numa))) return cfg +def find_run_clara(clara_home): + import os,shutil + if shutil.which('run-clara'): + return shutil.which('run-clara') + elif os.path.exists(clara_home + '/plugins/clas12/bin/run-clara'): + return clara_home + '/plugins/clas12/bin/run-clara' + +def get_numa_cpus(node): + for line in run(['numactl','-H']): + if line.startswith(f'node {node} cpus:'): + for col in line.strip().split()[3:]: + yield col + def run(cmd): import subprocess print('run >>> '+' '.join(cmd)) @@ -26,21 +50,21 @@ def run(cmd): pass def benchmark(cfg, threads, log): - import os,sys,shutil,collections - run_clara = shutil.which('run-clara') - if not run_clara: - run_clara = cfg.c + '/plugins/clas12/bin/run-clara' - if not os.path.exists(run_clara): - sys.exit('run-clara is not in $PATH') - exiting,benchmarks = False,collections.OrderedDict() - cmd = [run_clara, - '-c',cfg.c, - '-n',str(cfg.e*int(threads)), + import collections + cmd = [] + # use taskset: + if cfg.numa is not None: + cmd.extend(['taskset','-c',cfg.numa]) + # add the run-clara command: + cmd.extend([cfg.run_clara, + '-c',cfg.clara, + '-n',str(cfg.events*int(threads)), '-t',str(threads), '-l', - '-y',cfg.y, + '-y',cfg.yaml, '-o',f'tmp-scaling-{threads}', - cfg.i] + cfg.datafile]) + exiting,benchmarks = False,collections.OrderedDict() for line in run(cmd): cols = line.split() print(line) @@ -103,7 +127,7 @@ if __name__ == '__main__': cfg = cli() import os benchmarks = [] - for threads in cfg.t: + for threads in cfg.threads: os.makedirs('tmp-scaling-'+threads) with open(f'tmp-scaling-{threads}/run-clara.log','w') as log: benchmarks.append([threads, benchmark(cfg, threads, log)]) From bac9b6972bf32d207414c2f61b86e2fab610a178 Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Fri, 20 Mar 2026 14:37:06 -0400 Subject: [PATCH 091/190] adding mu reconstruction package for muCLAS12 setup (#1015) * imported muCLAS12/ddvcs reconstruction from ddvcs branch creating new dedicated mu package * fix version number in mu pom, and adding missing MUHD reconstruction package * fix dependency in mu pom * fix dependency in mu pom * addressing spotbugs findings * updatedmu pom and MUVT fixes * added MUVT trajectory points * bug fixes * removing printout * bug fix * added muCLAS12 banks to dst schema * reverted changes to implement DC frames: will do a separate PR --- .../org/jlab/detector/base/DetectorType.java | 4 + etc/bankdefs/hipo4/data.json | 60 +++ etc/bankdefs/hipo4/mu.json | 176 ++++++ etc/bankdefs/util/bankSplit.py | 3 +- .../java/org/jlab/rec/ft/cal/FTCALEngine.java | 72 +++ reconstruction/mu/pom.xml | 67 +++ .../java/org/jlab/rec/mucal/MUCALCluster.java | 234 ++++++++ .../org/jlab/rec/mucal/MUCALConstants.java | 21 + .../java/org/jlab/rec/mucal/MUCALEngine.java | 164 ++++++ .../java/org/jlab/rec/mucal/MUCALHit.java | 238 ++++++++ .../jlab/rec/mucal/MUCALReconstruction.java | 198 +++++++ .../java/org/jlab/rec/muhd/MUHDCluster.java | 235 ++++++++ .../java/org/jlab/rec/muhd/MUHDConstants.java | 22 + .../java/org/jlab/rec/muhd/MUHDEngine.java | 137 +++++ .../main/java/org/jlab/rec/muhd/MUHDHit.java | 259 +++++++++ .../org/jlab/rec/muhd/MUHDReconstruction.java | 166 ++++++ .../java/org/jlab/rec/muvt/MUVTCluster.java | 221 ++++++++ .../java/org/jlab/rec/muvt/MUVTConstants.java | 118 ++++ .../java/org/jlab/rec/muvt/MUVTCross.java | 129 +++++ .../java/org/jlab/rec/muvt/MUVTEngine.java | 282 ++++++++++ .../java/org/jlab/rec/muvt/MUVTStrip.java | 205 +++++++ .../java/org/jlab/rec/muvt/MUVTTrack.java | 483 +++++++++++++++++ .../org/jlab/rec/muvt/MUVTTrajectory.java | 89 +++ .../org/jlab/rec/muvt/track/fit/KFitter.java | 211 ++++++++ .../org/jlab/rec/muvt/track/fit/MeasVecs.java | 129 +++++ .../jlab/rec/muvt/track/fit/RungeKutta.java | 497 +++++++++++++++++ .../jlab/rec/muvt/track/fit/StateVecs.java | 508 ++++++++++++++++++ reconstruction/pom.xml | 1 + 28 files changed, 4928 insertions(+), 1 deletion(-) create mode 100644 etc/bankdefs/hipo4/mu.json create mode 100644 reconstruction/mu/pom.xml create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALCluster.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALConstants.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALHit.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALReconstruction.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDCluster.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDConstants.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDEngine.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDHit.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDReconstruction.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCluster.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTConstants.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCross.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTStrip.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTTrack.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTTrajectory.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/KFitter.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/MeasVecs.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/RungeKutta.java create mode 100644 reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/StateVecs.java diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java index 388fa0619a..4ee7c44cf8 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java @@ -34,6 +34,10 @@ public enum DetectorType { AHDC (24, "AHDC"), ATOF (25, "ATOF"), RECOIL (26, "RECOIL"), + MUCAL (28, "MUCAL"), + MUVT (29, "MUVT"), + MURT (30, "MURT"), + MURH (31, "MURH"), TARGET (100, "TARGET"), MAGNETS (101, "MAGNETS"); diff --git a/etc/bankdefs/hipo4/data.json b/etc/bankdefs/hipo4/data.json index fb5190d725..d95c6ba84d 100644 --- a/etc/bankdefs/hipo4/data.json +++ b/etc/bankdefs/hipo4/data.json @@ -396,6 +396,66 @@ { "name":"TDC" , "type":"I", "info":"TDC value"} ] }, + { + "name" : "MUCAL::adc", + "group": 22800, + "item" : 11, + "info": "ADC bank for the muCLAS12 Electromagnetic Calorimeter", + "entries":[ + { "name":"sector" , "type":"B", "info":"sector (=1)"}, + { "name":"layer" , "type":"B", "info":"layer (1-6)"}, + { "name":"component" , "type":"S", "info":"strip"}, + { "name":"order" , "type":"B", "info":"order: 0 - ADCL , 1 - ADCR"}, + { "name":"ADC" , "type":"I", "info":"ADC maximum"}, + { "name":"time" , "type":"F", "info":"time from pulse fit"}, + { "name":"ped" , "type":"S", "info":"pedestal from pulse analysis"} + ] + }, + { + "name" : "MUVT::adc", + "group": 22900, + "item" : 11, + "info": "ADC bank for the muCLAS12 Vertex Tracker", + "entries":[ + {"name":"sector" , "type":"B", "info":"sector (=1)"}, + {"name":"layer" , "type":"B", "info":"layer (=1)"}, + {"name":"component" , "type":"S", "info":"crystal id"}, + { "name":"order" , "type":"B", "info":"order: 0 - ADCL , 1 - ADCR"}, + { "name":"ADC" , "type":"I", "info":"ADC integral from pulse fit"}, + { "name":"time" , "type":"F", "info":"time from pulse fit"}, + { "name":"ped" , "type":"S", "info":"pedestal from pulse analysis"} + ] + }, + { + "name" : "MURT::adc", + "group": 23000, + "item" : 11, + "info": "ADC bank for the muCLAS12 Recoil Tracker", + "entries":[ + {"name":"sector" , "type":"B", "info":"sector (=1)"}, + {"name":"layer" , "type":"B", "info":"layer (=1)"}, + {"name":"component" , "type":"S", "info":"crystal id"}, + { "name":"order" , "type":"B", "info":"order: 0 - ADCL , 1 - ADCR"}, + { "name":"ADC" , "type":"I", "info":"ADC integral from pulse fit"}, + { "name":"time" , "type":"F", "info":"time from pulse fit"}, + { "name":"ped" , "type":"S", "info":"pedestal from pulse analysis"} + ] + }, + { + "name" : "MURH::adc", + "group": 23100, + "item" : 11, + "info": "ADC bank for the muCLAS12 Recoil Hodoscope", + "entries":[ + {"name":"sector" , "type":"B", "info":"sector (1-8)"}, + {"name":"layer" , "type":"B", "info":"layer (1-2)"}, + {"name":"component" , "type":"S", "info":"tile id"}, + { "name":"order" , "type":"B", "info":"order: 0 - ADCL , 1 - ADCR"}, + { "name":"ADC" , "type":"I", "info":"ADC integral from pulse fit"}, + { "name":"time" , "type":"F", "info":"time from pulse fit"}, + { "name":"ped" , "type":"S", "info":"pedestal from pulse analysis"} + ] + }, { "name" : "RF::adc", "group": 21700, diff --git a/etc/bankdefs/hipo4/mu.json b/etc/bankdefs/hipo4/mu.json new file mode 100644 index 0000000000..6d171f0207 --- /dev/null +++ b/etc/bankdefs/hipo4/mu.json @@ -0,0 +1,176 @@ +[ + { + "name": "MUCAL::hits", + "group": 22800, + "item" : 21, + "info": "Reconstructed Hits in muCLAS12 calorimeter", + "entries": [ + {"name":"idx", "type":"B", "info":"x id of grid"}, + {"name":"idy", "type":"B", "info":"y id of grid"}, + {"name":"x", "type":"F", "info":"Hit X position (cm)" }, + {"name":"y", "type":"F", "info":"Hit Y position (cm)" }, + {"name":"z", "type":"F", "info":"Hit Z position (cm)" }, + {"name":"energy", "type":"F", "info":"Hit Energy" }, + {"name":"time", "type":"F", "info":"Hit Time" }, + {"name":"hitID", "type":"S", "info":"Hit Pointer to ADC bank"}, + {"name":"clusterID", "type":"S", "info":"Hit Pointer to Cluster Bank"} + ] + }, + { + "name": "MUCAL::clusters", + "group": 22800, + "item" : 22, + "info": "Reconstructed Clusters in muCLAS12 calorimeter", + "entries": [ + {"name":"size", "type":"S", "info":"Cluster size" }, + {"name":"id", "type":"S", "info":"Cluster ID" }, + {"name":"x", "type":"F", "info":"Cluster centroid X moment (cm)" }, + {"name":"y", "type":"F", "info":"Cluster centroid Y moment (cm)" }, + {"name":"z", "type":"F", "info":"Cluster centroid Z moment (cm)" }, + {"name":"widthX", "type":"F", "info":"Cluster width in x (cm)" }, + {"name":"widthY", "type":"F", "info":"Cluster width in y (cm)" }, + {"name":"radius", "type":"F", "info":"Cluster radius (cm)" }, + {"name":"time", "type":"F", "info":"Cluster timing information" }, + {"name":"energy", "type":"F", "info":"Cluster total energy" }, + {"name":"maxEnergy", "type":"F", "info":"Cluster maximum energy" }, + {"name":"recEnergy", "type":"F", "info":"Cluster reconstructed energy" } + ] + }, + { + "name": "MUVT::hits", + "group": 22900, + "item" : 21, + "info": "MUVT hits", + "entries": [ + {"name":"id", "type":"S", "info":"id of the hit"}, + {"name":"sector", "type":"B", "info":"sector number"}, + {"name":"layer", "type":"B", "info":"layer number"}, + {"name":"strip", "type":"S", "info":"strip number"}, + {"name":"energy", "type":"F", "info":"energy of the hit (eV)"}, + {"name":"time", "type":"F", "info":"time of the hit (ns)"}, + {"name":"clusterId", "type":"S", "info":"id of the cluster the hit belongs to"}, + {"name":"status", "type":"S", "info":"status of the hit"} + ] + }, + { + "name": "MUVT::clusters", + "group": 22900, + "item" : 22, + "info": "reconstructed clusters from MUVT", + "entries": [ + {"name":"id", "type":"S", "info":"id of the cluster"}, + {"name":"sector", "type":"B", "info":"sector"}, + {"name":"layer", "type":"B", "info":"layer"}, + {"name":"strip", "type":"S", "info":"seed strip"}, + {"name":"energy", "type":"F", "info":"energy of the cluster (eV)"}, + {"name":"time", "type":"F", "info":"time of the cluster (ns)"}, + {"name":"xo", "type":"F", "info":"strip origin X coordinate (cm)"}, + {"name":"yo", "type":"F", "info":"strip origin Y coordinate (cm)"}, + {"name":"zo", "type":"F", "info":"strip origin Z coordinate (cm)"}, + {"name":"xe", "type":"F", "info":"strip end X coordinate (cm)"}, + {"name":"ye", "type":"F", "info":"strip end Y coordinate (cm)"}, + {"name":"ze", "type":"F", "info":"strip end Z coordinate (cm)"}, + {"name":"size", "type":"S", "info":"size of the cluster"}, + {"name":"status", "type":"S", "info":"status of the cluster"} + ] + }, + { + "name": "MUVT::crosses", + "group": 22900, + "item" : 23, + "info": "reconstructed crosses from MUVT", + "entries": [ + {"name":"id", "type":"S", "info":"id of the cross"}, + {"name":"sector", "type":"B", "info":"sector"}, + {"name":"region", "type":"B", "info":"region"}, + {"name":"energy", "type":"F", "info":"energy of the cross (eV)"}, + {"name":"time", "type":"F", "info":"time of the cross (ns)"}, + {"name":"x", "type":"F", "info":"x coordinate (cm)"}, + {"name":"y", "type":"F", "info":"y coordinate (cm)"}, + {"name":"z", "type":"F", "info":"z coordinate (cm)"}, + {"name":"cluster1", "type":"S", "info":"id of the cluster in the V layer"}, + {"name":"cluster2", "type":"S", "info":"id of the cluster in the W layer"}, + {"name":"status", "type":"S", "info":"status of the cluster"} + ] + }, + { + "name": "MUVT::tracks", + "group": 22900, + "item" : 36, + "info": "reconstructed tracks using MUVT information", + "entries": [ + {"name":"index", "type":"S", "info":"index of the track in the DC bank"}, + {"name":"status", "type":"B", "info":"status of the track (0: refitted using FMT, 1: original DC track)"}, + {"name":"sector", "type":"B", "info":"sector of the track in DC"}, + {"name":"vx", "type":"F", "info":"Vertex x-position of the swam track to the DOCA to the beamline (in cm)"}, + {"name":"vy", "type":"F", "info":"Vertex y-position of the swam track to the DOCA to the beamline (in cm)"}, + {"name":"vz", "type":"F", "info":"Vertex z-position of the swam track to the DOCA to the beamline (in cm)"}, + {"name":"px", "type":"F", "info":"3-momentum x-coordinate of the swam track to the DOCA to the beamline (in GeV)"}, + {"name":"py", "type":"F", "info":"3-momentum y-coordinate of the swam track to the DOCA to the beamline (in GeV)"}, + {"name":"pz", "type":"F", "info":"3-momentum z-coordinate of the swam track to the DOCA to the beamline (in GeV)"}, + {"name":"charge", "type":"B", "info":"charge of the track"}, + {"name":"chi2", "type":"F", "info":"chi^2 of the fit"}, + {"name":"NDF", "type":"B", "info":"number of degrees of freedom of the fit"} + ] + }, + { + "name": "MUVT::trajectory", + "group": 22900, + "item" : 37, + "info": "MUVT tracks trajectory bank", + "entries": [ + {"name":"index", "type":"S", "info":"index of the track in the DC bank"}, + {"name":"detector", "type":"B", "info":"id of the detector"}, + {"name":"layer", "type":"B", "info":"id of the layer"}, + {"name":"x", "type":"F", "info":"track x position at detector surface (cm)"}, + {"name":"y", "type":"F", "info":"track y position at detector surface (cm)"}, + {"name":"z", "type":"F", "info":"track z position at detector surface (cm)"}, + {"name":"tx", "type":"F", "info":"track unit direction vector x component at detector surface"}, + {"name":"ty", "type":"F", "info":"track unit direction vector y component at detector surface"}, + {"name":"tz", "type":"F", "info":"track unit direction vector z component at detector surface"}, + {"name":"lx", "type":"F", "info":"track x position in local coordinates (cm)"}, + {"name":"ly", "type":"F", "info":"track y position in local coordinates (cm)"}, + {"name":"lz", "type":"F", "info":"track z position in local coordinates (cm)"}, + {"name":"dx", "type":"F", "info":"DC track x position in local coordinates (cm)"}, + {"name":"dy", "type":"F", "info":"DC track y position in local coordinates (cm)"}, + {"name":"dz", "type":"F", "info":"DC track z position in local coordinates (cm)"}, + {"name":"path", "type":"F", "info":"pathlength of the track from the track vertex to the detector surface (cm)"} + ] + }, + { + "name": "MURH::hits", + "group": 23100, + "item" : 21, + "info": "Reconstructed Hits in muCLAS12 hodoscope", + "entries": [ + {"name":"sector", "type":"B", "info":"sector number"}, + {"name":"layer", "type":"B", "info":"layer number"}, + {"name":"component", "type":"S", "info":"component number"}, + {"name":"x", "type":"F", "info":"Hit X position (cm)" }, + {"name":"y", "type":"F", "info":"Hit Y position (cm)" }, + {"name":"z", "type":"F", "info":"Hit Z position (cm)" }, + {"name":"energy", "type":"F", "info":"Hit Energy" }, + {"name":"time", "type":"F", "info":"Hit Time" }, + {"name":"hitID", "type":"S", "info":"Hit Pointer to ADC bank"}, + {"name":"clusterID", "type":"S", "info":"Hit Pointer to Cluster Bank"} + ] + }, + { + "name": "MURH::clusters", + "group": 23100, + "item" : 22, + "info": "Reconstructed clusters in muCLAS12 hodoscope", + "entries": [ + {"name":"size", "type":"S", "info":"Cluster size" }, + {"name":"id", "type":"S", "info":"Cluster ID" }, + {"name":"x", "type":"F", "info":"Cluster centroid X moment (cm)" }, + {"name":"y", "type":"F", "info":"Cluster centroid Y moment (cm)" }, + {"name":"z", "type":"F", "info":"Cluster centroid Z moment (cm)" }, + {"name":"widthX", "type":"F", "info":"Cluster width in x (cm)" }, + {"name":"widthY", "type":"F", "info":"Cluster width in y (cm)" }, + {"name":"radius", "type":"F", "info":"Cluster radius (cm)" }, + {"name":"time", "type":"F", "info":"Cluster timing information" }, + {"name":"energy", "type":"F", "info":"Cluster total energy" } + ] + } +] diff --git a/etc/bankdefs/util/bankSplit.py b/etc/bankdefs/util/bankSplit.py index 485ba80772..63385a9bc3 100755 --- a/etc/bankdefs/util/bankSplit.py +++ b/etc/bankdefs/util/bankSplit.py @@ -66,7 +66,8 @@ def create(dirname, banklist): rich = ["RICH::tdc","RICH::Ring","RICH::Particle"] rtpc = ["RTPC::hits","RTPC::tracks","RTPC::KFtracks"] alert = ["AHDC::track", "AHDC::mc", "AHDC::hits", "AHDC::preclusters", "AHDC::clusters", "AHDC::kftrack", "AHDC::ai:prediction"] -dets = band + raster + rich + rtpc + alert +muclas = ["MUCAL::clusters", "MUVT::tracks"] +dets = band + raster + rich + rtpc + alert + muclas # additions for the calibration schema: calib = ["BAND::adc","BAND::laser","BAND::tdc","BAND::hits","BAND::rawhits","CND::adc","CND::hits","CND::tdc","CTOF::calib","CVTRec::Tracks","CVTRec::UTracks","DC::calib","ECAL::adc","ECAL::calib","ECAL::clusters","ECAL::peaks","ECAL::tdc","FMT::Hits","FMT::Clusters","FMT::Tracks","FMT::Trajectory","FT::particles","FTCAL::adc","FTCAL::clusters","FTCAL::hits","FTHODO::adc","FTHODO::clusters","FTHODO::hits","FTTRK::clusters","FTTRK::hits","FTTRK::crosses","FTOF::adc","FTOF::calib","HTCC::adc","HTCC::rec","LTCC::adc","LTCC::clusters","RASTER::adc","RF::adc","RF::tdc","RICH::calib","RTPC::adc","RTPC::hits","RTPC::tracks","RUN::rf","RUN::trigger","TimeBasedTrkg::TBTracks"] diff --git a/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java b/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java index eb9bc1cdfa..454fc11b83 100644 --- a/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java +++ b/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java @@ -6,6 +6,7 @@ import javax.swing.JFrame; import org.jlab.clas.detector.DetectorData; import org.jlab.clas.detector.DetectorEvent; +import org.jlab.clas.physics.PhysicsEvent; import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.geom.prim.Vector3D; import org.jlab.groot.data.H1F; @@ -89,4 +90,75 @@ public int setRunConditionsParameters(DataEvent event) { return run; } + + + public static void main (String arg[]) { + FTCALEngine cal = new FTCALEngine(); + cal.init(); + // String input = "/Users/devita/Work/clas12/simulations/clas12Tags/4.4.0/out.hipo"; +// String input = "/home/filippi/clas/ForwardTracker/DATA/out_realGeo_noMagField.data"; +// String input = "/home/filippi/clas/gemc/electronGun/gemc.hipo"; + String input = "/home/filippi/clas12/fttrkDev/clas12-offline-software-6.5.13-fttrkDev/ft_005038.evio.01231.hipo"; + HipoDataSource reader = new HipoDataSource(); +// String input = "/Users/devita/Work/clas12/simulations/tests/detectors/clas12/ft/out_header.ev"; +// EvioSource reader = new EvioSource(); + reader.open(input); + + // initialize histos + H1F h1 = new H1F("Cluster Energy",100, 0.,5.); + h1.setOptStat(Integer.parseInt("1111")); h1.setTitleX("Cluster Energy (GeV)"); + H1F h2 = new H1F("Energy Resolution",100, -1, 1); + h2.setOptStat(Integer.parseInt("1111")); h2.setTitleX("Energy Resolution(GeV)"); + H1F h3 = new H1F("Theta Resolution",100, -2, 2); + h3.setOptStat(Integer.parseInt("1111")); h3.setTitleX("Theta Resolution(deg)"); + H1F h4 = new H1F("Phi Resolution",100, -10, 10); + h4.setOptStat(Integer.parseInt("1111")); h4.setTitleX("Phi Resolution(deg)"); +// H1F h5 = new H1F("Time Resolution",100, -10, 10); + H1F h5 = new H1F("Time Resolution",100, -100, 300); + h5.setOptStat(Integer.parseInt("1111")); h5.setTitleX("Time Resolution(ns)"); + H2F h6 = new H2F("cluster xy", 100, -15., 15., 100, -15., 15.); + h6.setTitleX("cluster x"); h6.setTitleY("cluster y"); + + while(reader.hasEvent()){ +// for(int nev=0; nev<2; nev++){ + DataEvent event = (DataEvent) reader.getNextEvent(); + cal.processDataEvent(event); + + DetectorEvent detectorEvent = DetectorData.readDetectorEvent(event); + PhysicsEvent gen = detectorEvent.getGeneratedEvent(); + if(event.hasBank("FTCAL::clusters")) { + DataBank bank = event.getBank("FTCAL::clusters"); + int nrows = bank.rows(); + for(int i=0; i + + 4.0.0 + + org.jlab.clas12.detector + clas12detector-mu + 13.7.1-SNAPSHOT + jar + + + org.jlab.clas12 + reconstruction + 13.7.1-SNAPSHOT + + + + + org.jlab.jnp + jnp-hipo + + + org.jlab + groot + + + org.jlab.clas + swim-tools + 13.7.1-SNAPSHOT + + + org.jlab.clas + clas-reco + 13.7.1-SNAPSHOT + + + org.jlab.clas + clas-utils + 13.7.1-SNAPSHOT + + + org.jlab.clas + clas-detector + 13.7.1-SNAPSHOT + + + org.jlab.clas + clas-io + 13.7.1-SNAPSHOT + + + org.jlab.clas + clas-physics + 13.7.1-SNAPSHOT + + + org.jlab.clas + clas-geometry + 13.7.1-SNAPSHOT + + + org.jlab.clas + clas-jcsg + 13.7.1-SNAPSHOT + + + + diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALCluster.java b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALCluster.java new file mode 100644 index 0000000000..2741127d21 --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALCluster.java @@ -0,0 +1,234 @@ +package org.jlab.rec.mucal; + +import java.util.ArrayList; +import org.jlab.geom.prim.Point3D; +import org.jlab.utils.groups.IndexedTable; + + + +public class MUCALCluster extends ArrayList { + + /** + * A cluster in the calorimeter consists of an array of crystals that are grouped together according to + * the algorithm of the CalClusterFinder class + */ + private static final long serialVersionUID = 1L; + + private int _clusID; // cluster ID + private boolean _clusStat=true; // cluster status flag (true==good, false==bad) + + // constructor + public MUCALCluster(int cid) { + this.setID(cid); + } + + public int getID() { + return _clusID; + } + + public void setID(int _clusID) { + this._clusID = _clusID; + } + + public int getSize() { + // return number of crystals in cluster + return this.size(); + } + + public double getEnergy() { + // return measured energy + double clusterEnergy = 0; + for(int i=0; i clusterTable.getDoubleValue("cluster_min_size", 1,1,0) && + this.getEnergy()> clusterTable.getDoubleValue("cluster_min_energy", 1,1,0)/1000) { + this._clusStat=true; + } + else { + this._clusStat=false; + } + } + + public boolean getStatus() { + return this._clusStat; + } + + private double weight(MUCALHit hit, double clusEnergy) { + return Math.max(0., (3.45+Math.log(hit.get_Edep()/clusEnergy))); + } + + public boolean containsHit(MUCALHit hit, IndexedTable thresholds, IndexedTable clusterTable) { + boolean addFlag = false; + if(hit.get_Edep()>thresholds.getDoubleValue("thresholdCluster",1,1,MUCALHit.REFCOMPONENT)) { + for(int j = 0; j< this.size(); j++) { + double tDiff = Math.abs(hit.get_Time() - this.get(j).get_Time()); + double xDiff = Math.abs(hit.get_IDX() - this.get(j).get_IDX()); + double yDiff = Math.abs(hit.get_IDY() - this.get(j).get_IDY()); + if(tDiff <= clusterTable.getDoubleValue("time_window", 1,1,0) && xDiff <= 1 && yDiff <= 1 && (xDiff + yDiff) >0) addFlag = true; + } + } + return addFlag; + } + + @Override + public String toString(){ + StringBuilder str = new StringBuilder(); + + str.append(String.format("Cluster: %4d\n", this.getID())); + str.append(String.format("\tStatus: %b", this.getStatus())); + str.append(String.format("\tSize: %4d", this.getSize())); + str.append(String.format("\tE: %7.3f", this.getEnergy())); + str.append(String.format("\tTime: %7.3f", this.getTime())); + str.append(String.format("\tTheta: %7.3f", this.getTheta())); + str.append(String.format("\tPhi: %7.3f\n", this.getPhi())); + for(int j = 0; j< this.size(); j++) { + str.append(String.format("\thit #%d\t%d\t%d\t%7.3f\n", j, this.get(j).get_IDX(), this.get(j).get_IDY(), this.get(j).get_Edep())); + } + return str.toString(); + } + + public void show() { + System.out.println(this.toString()); + } +} + + + diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALConstants.java b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALConstants.java new file mode 100644 index 0000000000..5917c9770b --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALConstants.java @@ -0,0 +1,21 @@ +package org.jlab.rec.mucal; + +public class MUCALConstants { + + public MUCALConstants() { + } + + public static int DEBUGMODE = 0; + + // RECONSTRUCTION CONSTANTS + public static final double TIMECONVFAC = 100./4.; // conversion factor from TDC channel to time (ns^-1) + public static final double VEFF = 150.; // speed of light in the scintillator mm/ns + + // energy threshold in GeV + // GEOMETRY PARAMETERS + public static double CRYS_DELTA = 11.5; + public static double CRYS_WIDTH = 15.3; // crystal width in mm + public static double CRYS_LENGTH = 200.; // crystal length in mm + public static double CRYS_ZPOS = 1898.; // position of the crystal front face + +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java new file mode 100644 index 0000000000..0d9dc58efb --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java @@ -0,0 +1,164 @@ +package org.jlab.rec.mucal; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.swing.JFrame; +import org.jlab.clas.detector.DetectorData; +import org.jlab.clas.detector.DetectorEvent; +import org.jlab.clas.physics.PhysicsEvent; +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.geom.prim.Vector3D; +import org.jlab.groot.data.H1F; +import org.jlab.groot.data.H2F; +import org.jlab.groot.graphics.EmbeddedCanvas; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; +import org.jlab.io.evio.EvioDataBank; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.hipo.HipoDataSource; + + +public class MUCALEngine extends ReconstructionEngine { + + public MUCALEngine() { + super("MUCAL", "devita", "3.0"); + } + + MUCALReconstruction reco; + + @Override + public boolean init() { + reco = new MUCALReconstruction(); + reco.debugMode=0; + + String[] tables = new String[]{ + "/calibration/ft/ftcal/charge_to_energy", + "/calibration/ft/ftcal/time_offsets", + "/calibration/ft/ftcal/time_walk", + "/calibration/ft/ftcal/status", + "/calibration/ft/ftcal/thresholds", + "/calibration/ft/ftcal/cluster", + "/calibration/ft/ftcal/energycorr" + }; + requireConstants(Arrays.asList(tables)); + this.getConstantsManager().setVariation("default"); + + this.registerOutputBank("MUCAL::hits","MUCAL::clusters"); + + return true; + } + + @Override + public boolean processDataEvent(DataEvent event) { + List allHits = new ArrayList(); + List selectedHits = new ArrayList(); + List clusters = new ArrayList(); + + // update calibration constants based on run number if changed + int run = setRunConditionsParameters(event); + + if(run>=0) { + // get hits fron banks + allHits = reco.initMUCAL(event,this.getConstantsManager(), run); + // select good hits and order them by energy + selectedHits = reco.selectHits(allHits,this.getConstantsManager(), run); + // create clusters + clusters = reco.findClusters(selectedHits, this.getConstantsManager(), run); + // set cluster status + reco.selectClusters(clusters, this.getConstantsManager(), run); + // write output banks + reco.writeBanks(event, selectedHits, clusters, this.getConstantsManager(), run); + } + return true; + } + + public int setRunConditionsParameters(DataEvent event) { + int run = -1; + if(event.hasBank("RUN::config")==false) { + System.out.println("RUN CONDITIONS NOT READ!"); + } + + if(event instanceof EvioDataEvent) { + EvioDataBank bank = (EvioDataBank) event.getBank("RUN::config"); + run = bank.getInt("Run",0); + } + else { + DataBank bank = event.getBank("RUN::config"); + run = bank.getInt("run",0); + } + + return run; + } + + + public static void main (String arg[]) { + MUCALEngine cal = new MUCALEngine(); + cal.init(); + // String input = "/Users/devita/Work/clas12/simulations/clas12Tags/4.4.0/out.hipo"; +// String input = "/home/filippi/clas/ForwardTracker/DATA/out_realGeo_noMagField.data"; +// String input = "/home/filippi/clas/gemc/electronGun/gemc.hipo"; + String input = "/home/filippi/clas12/fttrkDev/clas12-offline-software-6.5.13-fttrkDev/ft_005038.evio.01231.hipo"; + HipoDataSource reader = new HipoDataSource(); +// String input = "/Users/devita/Work/clas12/simulations/tests/detectors/clas12/ft/out_header.ev"; +// EvioSource reader = new EvioSource(); + reader.open(input); + + // initialize histos + H1F h1 = new H1F("Cluster Energy",100, 0.,5.); + h1.setOptStat(Integer.parseInt("1111")); h1.setTitleX("Cluster Energy (GeV)"); + H1F h2 = new H1F("Energy Resolution",100, -1, 1); + h2.setOptStat(Integer.parseInt("1111")); h2.setTitleX("Energy Resolution(GeV)"); + H1F h3 = new H1F("Theta Resolution",100, -2, 2); + h3.setOptStat(Integer.parseInt("1111")); h3.setTitleX("Theta Resolution(deg)"); + H1F h4 = new H1F("Phi Resolution",100, -10, 10); + h4.setOptStat(Integer.parseInt("1111")); h4.setTitleX("Phi Resolution(deg)"); +// H1F h5 = new H1F("Time Resolution",100, -10, 10); + H1F h5 = new H1F("Time Resolution",100, -100, 300); + h5.setOptStat(Integer.parseInt("1111")); h5.setTitleX("Time Resolution(ns)"); + H2F h6 = new H2F("cluster xy", 100, -15., 15., 100, -15., 15.); + h6.setTitleX("cluster x"); h6.setTitleY("cluster y"); + + while(reader.hasEvent()){ +// for(int nev=0; nev<2; nev++){ + DataEvent event = (DataEvent) reader.getNextEvent(); + cal.processDataEvent(event); + + DetectorEvent detectorEvent = DetectorData.readDetectorEvent(event); + PhysicsEvent gen = detectorEvent.getGeneratedEvent(); + if(event.hasBank("MUCAL::clusters")) { + DataBank bank = event.getBank("MUCAL::clusters"); + int nrows = bank.rows(); + for(int i=0; i{ + // class implements Comparable interface to allow for sorting a collection of hits by Edep values + public static final int REFCOMPONENT =245; + + // constructor + public MUCALHit(int i, int ICOMPONENT, int ADC, int TDC, IndexedTable charge2Energy, IndexedTable timeOffsets, IndexedTable timeWalk, IndexedTable cluster) { + this._COMPONENT = ICOMPONENT; + this._IDY = ((int) ICOMPONENT/44) + 1; + this._IDX = ICOMPONENT + 1 - (this._IDY-1)*44; + this._ADC = ADC; + this._TDC = TDC; + + this._Charge = ((double) this._ADC)*charge2Energy.getDoubleValue("fadc_to_charge", 1,1,REFCOMPONENT); + this.set_Edep(this._Charge*charge2Energy.getDoubleValue("mips_energy", 1,1,REFCOMPONENT) + /charge2Energy.getDoubleValue("mips_charge", 1,1,REFCOMPONENT)/1000.); + double twCorr=0; + if(this._Charge>0) { + twCorr = timeWalk.getDoubleValue("amplitude", 1,1,REFCOMPONENT)*Math.exp(-this._Charge*timeWalk.getDoubleValue("lambda", 1,1,REFCOMPONENT)); + } + this.set_Time(((double) this._TDC)/MUCALConstants.TIMECONVFAC + -(MUCALConstants.CRYS_LENGTH-cluster.getDoubleValue("depth_z", 1,1,0))/MUCALConstants.VEFF + -timeOffsets.getDoubleValue("time_offset", 1,1,REFCOMPONENT)-twCorr); +// if(this.get_Edep()>0.1) System.out.println(ICOMPONENT + " " + this._TDC + " " + +// MUCALConstantsLoader.TIMECONVFAC + " " + MUCALConstantsLoader.time_offset[0][0][ICOMPONENT-1] + " " + +// this.get_Time()); + this.set_Dx( (this._IDX-MUCALConstants.CRYS_DELTA )* MUCALConstants.CRYS_WIDTH); + this.set_Dy( (this._IDY-MUCALConstants.CRYS_DELTA )* MUCALConstants.CRYS_WIDTH); + this.set_Dz(MUCALConstants.CRYS_ZPOS+cluster.getDoubleValue("depth_z", 1,1,0)); + this.set_DGTZIndex(i); + this.set_ClusID(0); + } + + public MUCALHit(int i, int ICOMPONENT, int ADC, float time, IndexedTable charge2Energy, IndexedTable timeOffsets, IndexedTable timeWalk, IndexedTable cluster) { + this._COMPONENT = ICOMPONENT; + this._IDY = ((int) ICOMPONENT/44) + 1; + this._IDX = ICOMPONENT + 1 - (this._IDY-1)*44; + this._ADC = ADC; + + this._Charge = ((double) this._ADC)*charge2Energy.getDoubleValue("fadc_to_charge", 1,1,REFCOMPONENT); + this.set_Edep(this._Charge*charge2Energy.getDoubleValue("mips_energy", 1,1,REFCOMPONENT) + /charge2Energy.getDoubleValue("mips_charge", 1,1,REFCOMPONENT)/1000.); + + double twCorr=0; + if(this._Charge>0) { + twCorr = timeWalk.getDoubleValue("amplitude", 1,1,REFCOMPONENT)*Math.exp(-this._Charge*timeWalk.getDoubleValue("lambda", 1,1,REFCOMPONENT)); + } + + this.set_Time(time -(MUCALConstants.CRYS_LENGTH-cluster.getDoubleValue("depth_z", 1,1,0))/MUCALConstants.VEFF + -timeOffsets.getDoubleValue("time_offset", 1,1,REFCOMPONENT)-twCorr); +// if(this.get_Edep()>0.1) System.out.println(ICOMPONENT + " " + this._TDC + " " + +// MUCALConstantsLoader.TIMECONVFAC + " " + MUCALConstantsLoader.time_offset[0][0][ICOMPONENT-1] + " " + +// this.get_Time()); + this.set_Dx( (this._IDX-MUCALConstants.CRYS_DELTA )* MUCALConstants.CRYS_WIDTH); + this.set_Dy( (this._IDY-MUCALConstants.CRYS_DELTA )* MUCALConstants.CRYS_WIDTH); + this.set_Dz(MUCALConstants.CRYS_ZPOS+cluster.getDoubleValue("depth_z", 1,1,0)); + this.set_DGTZIndex(i); + this.set_ClusID(0); + } + + private int _COMPONENT; // Component number + private int _IDX; // Crystal ID: X + private int _IDY; // Crystal ID: Y + private int _ADC; // ADC + private int _TDC; // TDC + + private double _Charge; // Reconstructed energy deposited by the hit in the crystal + private double _Edep; // Reconstructed energy deposited by the hit in the crystal + private double _Time; // Reconstructed time, for now it is the gemc time + private double _Dx; + private double _Dy; + private double _Dz; + private int _DGTZIndex; // Pointer to cluster + private int _ClusIndex; // Pointer to cluster + + + public int get_COMPONENT() { + return _COMPONENT; + } + + + + public void set_COMPONENT(int COMPONENT) { + this._COMPONENT = COMPONENT; + } + + + public int get_IDX() { + return _IDX; + } + + + + public void set_IDX(int IDX) { + this._IDX = IDX; + } + + + + public int get_IDY() { + return _IDY; + } + + + + public void set_IDY(int IDY) { + this._IDY = IDY; + } + + + + public int get_ADC() { + return _ADC; + } + + + + public void set_ADC(int ADC) { + this._ADC = ADC; + } + + + + public int get_TDC() { + return _TDC; + } + + + + public void set_TDC(int TDC) { + this._TDC = TDC; + } + + + public double get_Edep() { + return _Edep; + } + + + public final void set_Edep(double edep) { + this._Edep = edep; + } + + + + public double get_Time() { + return _Time; + } + + + public final void set_Time(double Time) { + this._Time = Time; + } + + + public double get_Dx() { + return _Dx; + } + + + public final void set_Dx(double Dx) { + this._Dx = Dx; + } + + + public double get_Dy() { + return _Dy; + } + + + public final void set_Dy(double Dy) { + this._Dy = Dy; + } + + + public double get_Dz() { + return _Dz; + } + + + public final void set_Dz(double Dz) { + this._Dz = Dz; + } + + + public int get_DGTZIndex() { + return _DGTZIndex; + } + + + public final void set_DGTZIndex(int _DGTZIndex) { + this._DGTZIndex = _DGTZIndex; + } + + + public int get_ClusID() { + return _ClusIndex; + } + + + public final void set_ClusID(int _ClusIndex) { + this._ClusIndex = _ClusIndex; + } + + public static boolean passHitSelection(MUCALHit hit, IndexedTable thresholds) { + // a selection cut to pass the hit. + if(hit.get_Edep() > thresholds.getDoubleValue("thresholdHit", 1,1,REFCOMPONENT)) { + return true; + } else { + return false; + } + } + + @Override + public int compareTo(MUCALHit arg0) { + if(this.get_Edep() initMUCAL(DataEvent event, ConstantsManager manager, int run) { + + IndexedTable charge2Energy = manager.getConstants(run, "/calibration/ft/ftcal/charge_to_energy"); + IndexedTable timeOffsets = manager.getConstants(run, "/calibration/ft/ftcal/time_offsets"); + IndexedTable timeWalk = manager.getConstants(run, "/calibration/ft/ftcal/time_walk"); + IndexedTable cluster = manager.getConstants(run, "/calibration/ft/ftcal/cluster"); + IndexedTable status = manager.getConstants(run, "/calibration/ft/ftcal/status"); + + if(this.debugMode>=1) System.out.println("\nAnalyzing new event"); + + List allhits = this.readRawHits(event,charge2Energy,timeOffsets,timeWalk,cluster,status); + + if(debugMode>=1) { + System.out.println("Found " + allhits.size() + " hits"); + for(int i = 0; i < allhits.size(); i++) { + System.out.print(i + "\t"); + allhits.get(i).show(); + } + } + return allhits; + } + + public List selectHits(List allhits, ConstantsManager manager, int run) { + + if(debugMode>=1) System.out.println("\nSelecting hits"); + ArrayList hits = new ArrayList<>(); + + IndexedTable thresholds = manager.getConstants(run, "/calibration/ft/ftcal/thresholds"); + + for(int i = 0; i < allhits.size(); i++) + { + if(MUCALHit.passHitSelection(allhits.get(i), thresholds)) { + hits.add(allhits.get(i)); + } + } + Collections.sort(hits); + if(debugMode>=1) { + System.out.println("List of selected hits"); + for(int i = 0; i < hits.size(); i++) + { + System.out.print(i + "\t"); + hits.get(i).show(); + } + } + return hits; + } + + public List findClusters(List hits, ConstantsManager manager, int run) { + + List clusters = new ArrayList(); + + IndexedTable thresholds = manager.getConstants(run, "/calibration/ft/ftcal/thresholds"); + IndexedTable clusterTable = manager.getConstants(run, "/calibration/ft/ftcal/cluster"); + + if(debugMode>=1) System.out.println("\nBuilding clusters"); + for(int ihit=0; ihit=1) System.out.println("Attaching hit " + ihit + " to cluster " + cluster.getID()); + break; + } + } + } + if(hit.get_ClusID()==0) { // new cluster found + MUCALCluster cluster = new MUCALCluster(clusters.size()+1); + hit.set_ClusID(cluster.getID()); + cluster.add(hit); + clusters.add(cluster); + if(debugMode>=1) System.out.println("Creating new cluster with ID " + cluster.getID()); + } + } + return clusters; + } + + public void selectClusters(List clusters, ConstantsManager manager, int run) { + + IndexedTable clusterTable = manager.getConstants(run, "/calibration/ft/ftcal/cluster"); + + for(int i=0; i=1) System.out.println("Setting status for cluster " + i + " " + clusters.get(i).toString()); + } + } + + + public void writeBanks(DataEvent event, List hits, List clusters, ConstantsManager manager, int run){ + + IndexedTable energyTable = manager.getConstants(run, "/calibration/ft/ftcal/energycorr"); + + // hits banks + if(!hits.isEmpty()) { + DataBank bankHits = event.createBank("MUCAL::hits", hits.size()); + if(bankHits==null){ + System.out.println("ERROR CREATING BANK : MUCAL::hits"); + return; + } + for(int i = 0; i < hits.size(); i++){ + bankHits.setByte("idx",i,(byte) hits.get(i).get_IDX()); + bankHits.setByte("idy",i,(byte) hits.get(i).get_IDY()); + bankHits.setFloat("x",i,(float) (hits.get(i).get_Dx()/10.0)); + bankHits.setFloat("y",i,(float) (hits.get(i).get_Dy()/10.0)); + bankHits.setFloat("z",i,(float) (hits.get(i).get_Dz()/10.0)); + bankHits.setFloat("energy",i,(float) hits.get(i).get_Edep()); + bankHits.setFloat("time",i,(float) hits.get(i).get_Time()); + bankHits.setShort("hitID",i,(short) hits.get(i).get_DGTZIndex()); + if(!clusters.isEmpty() && clusters.get(hits.get(i).get_ClusID()-1).getStatus()) { + bankHits.setShort("clusterID",i,(short) hits.get(i).get_ClusID()); + } + else { + bankHits.setShort("clusterID",i,(short) 0); + } + } + if(debugMode>=1) bankHits.show(); + event.appendBanks(bankHits); + } + // cluster bank + if(!clusters.isEmpty()) { + List selectedClusters = new ArrayList(); + for(int i =0; i< clusters.size(); i++) { + if(clusters.get(i).getStatus()) selectedClusters.add(clusters.get(i)); + } + if(!selectedClusters.isEmpty()) { + DataBank bankCluster = event.createBank("MUCAL::clusters", selectedClusters.size()); + if(bankCluster==null){ + System.out.println("ERROR CREATING BANK : MUCAL::clusters"); + return; + } + for(int i = 0; i < selectedClusters.size(); i++){ + bankCluster.setShort("id", i,(short) selectedClusters.get(i).getID()); + bankCluster.setShort("size", i,(short) selectedClusters.get(i).getSize()); + bankCluster.setFloat("x",i,(float) (selectedClusters.get(i).getX()/10.0)); + bankCluster.setFloat("y",i, (float) (selectedClusters.get(i).getY()/10.0)); + bankCluster.setFloat("z",i, (float) (selectedClusters.get(i).getZ()/10.0)); + bankCluster.setFloat("widthX",i, (float) (selectedClusters.get(i).getWidthX()/10.0)); + bankCluster.setFloat("widthY",i, (float) (selectedClusters.get(i).getWidthY()/10.0)); + bankCluster.setFloat("radius",i, (float) (selectedClusters.get(i).getRadius()/10.0)); + bankCluster.setFloat("time",i, (float) selectedClusters.get(i).getTime()); + bankCluster.setFloat("energy",i, (float) selectedClusters.get(i).getFullEnergy(energyTable)); + bankCluster.setFloat("recEnergy",i, (float) selectedClusters.get(i).getEnergy()); + bankCluster.setFloat("maxEnergy",i, (float) selectedClusters.get(i).getSeedEnergy()); + } + if(debugMode>=1) bankCluster.show(); + event.appendBanks(bankCluster); + } + } + } + + public List readRawHits(DataEvent event, IndexedTable charge2Energy, IndexedTable timeOffsets, IndexedTable timeWalk, IndexedTable cluster, IndexedTable status) { + // getting raw data bank + if(debugMode>=1) System.out.println("Getting raw hits from MUCAL:adc bank"); + + List hits = new ArrayList<>(); + if(event.hasBank("MUCAL::adc")==true) { + RawDataBank bankDGTZ = new RawDataBank("MUCAL::adc"); + bankDGTZ.read(event); + int nrows = bankDGTZ.rows(); + for(int row = 0; row < nrows; row++){ + int isector = bankDGTZ.getByte("sector",row); + int ilayer = bankDGTZ.getByte("layer",row); + int icomponent = bankDGTZ.getShort("component",row); + int adc = bankDGTZ.getInt("ADC",row); + float time = bankDGTZ.getFloat("time",row); + if(ilayer==0) ilayer=1; // fix for wrong layer in TT + if(adc!=-1 && time!=-1 && status.getIntValue("status", isector, ilayer, MUCALHit.REFCOMPONENT)==0){ + MUCALHit hit = new MUCALHit(bankDGTZ.trueIndex(row),icomponent, adc, time, charge2Energy, timeOffsets, timeWalk, cluster); + hits.add(hit); + } + } + } + return hits; + } + +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDCluster.java b/reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDCluster.java new file mode 100644 index 0000000000..4abc165684 --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDCluster.java @@ -0,0 +1,235 @@ +package org.jlab.rec.muhd; + + +import java.util.ArrayList; +import org.jlab.geom.prim.Point3D; + +import org.jlab.io.evio.EvioDataBank; + + + +public class MUHDCluster extends ArrayList { + + /** + * A signal in the hodoscope is a pair of hits above threshold in the two layers. + * The hit pair is define according o the algorithm in HodoSignalFinder + */ + private static final long serialVersionUID = 1L; + + private int _clusID; // signal ID + + + // constructor + public MUHDCluster(int cid) { + this.setID(cid); + } + + public int getID() { + return _clusID; + } + + public void setID(int _clusterID) { + this._clusID = _clusterID; + } + + public int getSize() { + return this.size(); + } + + public double getEnergy() { + // return measured energy + double clusterEnergy = 0; + for(int i=0; i MUHDConstants.CLUSTER_MIN_SIZE && + this.getEnergy()> MUHDConstants.CLUSTER_MIN_ENERGY && + this.getLayerMultiplicity(1)>0 && this.getLayerMultiplicity(2)>0) { + return true; + } + else { + return false; + } + } + + public boolean containsHit(MUHDHit hit) { + boolean addFlag = false; + for(int j = 0; j< this.size(); j++) { + double tDiff = Math.abs(hit.get_Time() - this.get(j).get_Time()); + double xDiff = Math.abs(hit.get_Dx() - this.get(j).get_Dx()); + double yDiff = Math.abs(hit.get_Dy() - this.get(j).get_Dy()); +// System.out.println("DT: " + tDiff + "(" + MUHDConstantsLoader.time_window +// + ")\t DX: " + xDiff + "(" + MUHDConstantsLoader.hit_distance +// + ")\t DY: " + yDiff + "(" + MUHDConstantsLoader.hit_distance + ")"); + if(tDiff <= MUHDConstants.TIME_WINDOW && + xDiff <= MUHDConstants.HIT_DISTANCE && + yDiff <= MUHDConstants.HIT_DISTANCE) addFlag = true; + } + return addFlag; + } + + public void showCluster() { + System.out.println("\nCluster = " + this._clusID); + System.out.println("Size = " + this.getSize() + + "\tE = " + this.getEnergy() + + "\tTime = " + this.getTime() + + "\tTheta = " + this.getTheta() + + "\tPhi = " + this.getPhi()); + for(int j = 0; j< this.size(); j++) { + System.out.println("hit # " + j + "\t" + this.get(j).get_Layer() + "\t" + this.get(j).get_Sector() + "\t" + this.get(j).get_ID() + "\t" + this.get(j).get_Edep()); + } + } + + + public static ArrayList getSignals(EvioDataBank bank) { + + int[] signalID = bank.getInt("signalID"); + int[] signalSize = bank.getInt("signalSize"); + double[] signalX = bank.getDouble("signalX"); + double[] signalY = bank.getDouble("signalY"); + double[] signalDX = bank.getDouble("signalDX"); + double[] signalDY = bank.getDouble("signalDY"); + double[] signalTime = bank.getDouble("signalTime"); + double[] signalEnergy = bank.getDouble("signalEnergy"); + double[] signalTheta = bank.getDouble("signalTheta"); + double[] signalPhi = bank.getDouble("signalPhi"); + + + int size = signalID.length; + ArrayList signals = new ArrayList(); + +// for(int i = 0; i=0) { + // get hits fron banks + List allHits = reco.initMUHD(event,this.getConstantsManager(), run); + // select good hits and order them by energy + List selectedHits = reco.selectHits(allHits); + // create clusters + List clusters = reco.findClusters(selectedHits); + // write output banks + reco.writeBanks(event, selectedHits, clusters); + } + return true; + } + + public int setRunConditionsParameters(DataEvent event) { + int run = -1; + if(event.hasBank("RUN::config")==false) { + System.out.println("RUN CONDITIONS NOT READ!"); + } + + if(event instanceof EvioDataEvent) { + EvioDataBank bank = (EvioDataBank) event.getBank("RUN::config"); + run = bank.getInt("Run",0); + } + else { + DataBank bank = event.getBank("RUN::config"); + run = bank.getInt("run",0); + } + return run; + } + + + public static void main (String arg[]) { + MUHDEngine cal = new MUHDEngine(); + cal.init(); +// String input = "/Users/devita/data/out_clasdispr.00.e11.000.emn0.75tmn.09.xs65.61nb.dis.1.V5.hipo"; +// HipoDataSource reader = new HipoDataSource(); + String input = "/Users/devita/test4.hipo"; + HipoDataSource reader = new HipoDataSource(); + reader.open(input); + + // initialize histos + H1F h1 = new H1F("Cluster Energy",100, 0.,5.); + h1.setOptStat(Integer.parseInt("1111")); h1.setTitleX("Cluster Energy (GeV)"); + H1F h2 = new H1F("Energy Resolution",100, -1, 1); + h2.setOptStat(Integer.parseInt("1111")); h2.setTitleX("Energy Resolution(GeV)"); + H1F h3 = new H1F("Theta Resolution",100, -2, 2); + h3.setOptStat(Integer.parseInt("1111")); h3.setTitleX("Theta Resolution(deg)"); + H1F h4 = new H1F("Phi Resolution",100, -10, 10); + h4.setOptStat(Integer.parseInt("1111")); h4.setTitleX("Phi Resolution(deg)"); + H1F h5 = new H1F("Time Resolution",100, -10, 10); + h5.setOptStat(Integer.parseInt("1111")); h5.setTitleX("Time Resolution(ns)"); + + while(reader.hasEvent()){ + DataEvent event = (DataEvent) reader.getNextEvent(); + cal.processDataEvent(event); + + DetectorEvent detectorEvent = DetectorData.readDetectorEvent(event); + PhysicsEvent gen = detectorEvent.getGeneratedEvent(); + if(event.hasBank("MUHD::clusters")) { + DataBank bank = event.getBank("MUHD::clusters"); + int nrows = bank.rows(); + for(int i=0; i{ + // class implements Comparable interface to allow for sorting a collection of hits by Edep values + + // constructor + public MUHDHit(int i, int Sector, int Layer, int ID, int ADC, int TDC, IndexedTable charge2Energy, IndexedTable timeOffsets, IndexedTable geometry) { + this._Sector = Sector; + this._Layer = Layer; + this._ID = ID; + this._ADC = ADC; + this._TDC = TDC; + + this.set_Edep(((double) this._ADC)*MUHDConstants.FADC_TO_CHARGE + *charge2Energy.getDoubleValue("mips_energy", Sector, Layer, ID) + /charge2Energy.getDoubleValue("mips_charge", Sector, Layer, ID)); + this.set_Time(((double) this._TDC)/MUHDConstants.TIMECONVFAC + -timeOffsets.getDoubleValue("time_offset", Sector, Layer, ID)); // Time set to gemc value + this.set_Dx(geometry.getDoubleValue("x", Sector, Layer, ID)); + this.set_Dy(geometry.getDoubleValue("y", Sector, Layer, ID)); + this.set_Dz(geometry.getDoubleValue("z", Sector, Layer, ID)); + this.set_DGTZIndex(i); + this.set_ClusterIndex(0); +// System.out.println(this._Dx + " " + this._Dy); + } + + public MUHDHit(int i, int Sector, int Layer, int ID, int ADC, float time, IndexedTable charge2Energy, IndexedTable timeOffsets, IndexedTable geometry) { + this._Sector = Sector; + this._Layer = Layer; + this._ID = ID; + this._ADC = ADC; + + this.set_Edep(((double) this._ADC)*MUHDConstants.FADC_TO_CHARGE + *charge2Energy.getDoubleValue("mips_energy", Sector, Layer, ID) + /charge2Energy.getDoubleValue("mips_charge", Sector, Layer, ID)); + this.set_Time(time-timeOffsets.getDoubleValue("time_offset", Sector, Layer, ID)); // Time set to gemc value + this.set_Dx(geometry.getDoubleValue("x", Sector, Layer, ID)); + this.set_Dy(geometry.getDoubleValue("y", Sector, Layer, ID)); + this.set_Dz(geometry.getDoubleValue("z", Sector, Layer, ID)); + this.set_DGTZIndex(i); + this.set_ClusterIndex(0); +// System.out.println(this._Dx + " " + this._Dy); + } + + + private int _ID; // ID + private int _Sector; // Sector + private int _Layer; // Layer + private int _ADC; // ADC + private int _TDC; // TDC + + private double _Edep; // Reconstructed energy deposited by the hit in the tile + private double _Time; // Reconstructed time, for now it is the gemc time + private double _Dx; // X position (corresponds to tile centroid) + private double _Dy; // Y position (corresponds to tile centroid) + private double _Dz; // Z position (corresponds to tile centroid) + private int _DGTZIndex; // Pointer to cluster + private int _ClusterIndex; // Pointer to cluster + + + + public int get_ID() { + return _ID; + } + + + + public void set_ID(int ID) { + this._ID = ID; + } + + + + public int get_Sector() { + return _Sector; + } + + + + public void set_Sector(int Sector) { + this._Sector = Sector; + } + + + + public int get_Layer() { + return _Layer; + } + + + + public void set_Layer(int Layer) { + this._Layer = Layer; + } + + + + public int get_ADC() { + return _ADC; + } + + + + public void set_ADC(int ADC) { + this._ADC = ADC; + } + + + + public int get_TDC() { + return _TDC; + } + + + + public void set_TDC(int TDC) { + this._TDC = TDC; + } + + + public double get_Edep() { + return _Edep; + } + + + public void set_Edep(double edep) { + this._Edep = edep; + } + + + + public double get_Time() { + return _Time; + } + + + public void set_Time(double Time) { + this._Time = Time; + } + + + public double get_Dx() { + return _Dx; + } + + + + public void set_Dx(double Dx) { + this._Dx = Dx; + } + + + + public double get_Dy() { + return _Dy; + } + + + + public void set_Dy(double Dy) { + this._Dy = Dy; + } + + + public double get_Dz() { + return _Dz; + } + + + + public void set_Dz(double Dz) { + this._Dz = Dz; + } + + + public int get_DGTZIndex() { + return _DGTZIndex; + } + + + + public void set_DGTZIndex(int _DGTZIndex) { + this._DGTZIndex = _DGTZIndex; + } + + + + public int get_ClusterIndex() { + return _ClusterIndex; + } + + + + public void set_ClusterIndex(int _SignalIndex) { + this._ClusterIndex = _SignalIndex; + } + + + +// public static ArrayList getRawHits(EvioDataBank bank) { +// +// int[] id = bank.getInt("component"); +// int[] sector = bank.getInt("sector"); +// int[] layer = bank.getInt("layer"); +// int[] adc = bank.getInt("ADC"); +// int[] tdc = bank.getInt("TDC"); +// +// int size = id.length; +// +// ArrayList hits = new ArrayList(); +// +// for(int i = 0; i MUHDConstants.EN_THRES) { + return true; + } else { + return false; + } + } + + + + @Override + public int compareTo(MUHDHit arg0) { + if(this.get_Edep() initMUHD(DataEvent event, ConstantsManager manager, int run) { + + IndexedTable charge2Energy = manager.getConstants(run, "/calibration/ft/fthodo/charge_to_energy"); + IndexedTable timeOffsets = manager.getConstants(run, "/calibration/ft/fthodo/time_offsets"); + IndexedTable status = manager.getConstants(run, "/calibration/ft/fthodo/status"); + IndexedTable geometry = manager.getConstants(run, "/geometry/ft/fthodo"); + + if(debugMode>=1) System.out.println("\nAnalyzing new event"); + List allhits = null; + + if(event instanceof HipoDataEvent) { + allhits = this.readRawHits(event,charge2Energy,timeOffsets,status,geometry); + } + if(debugMode>=1) { + System.out.println("Found " + allhits.size() + " hits"); + for(int i = 0; i < allhits.size(); i++) { + System.out.print(i + "\t"); + allhits.get(i).showHit(); + } + } + return allhits; + } + + public List selectHits(List allhits) { + + if(debugMode>=1) System.out.println("\nSelecting hits"); + ArrayList hits = new ArrayList<>(); + + for(int i = 0; i < allhits.size(); i++) + { + if(MUHDHit.passHitSelection(allhits.get(i))) { + hits.add(allhits.get(i)); + } + } + Collections.sort(hits); + if(debugMode>=1) { + System.out.println("List of selected hits"); + for(int i = 0; i < hits.size(); i++) + { + System.out.print(i + "\t"); + hits.get(i).showHit(); + } + } + return hits; + } + + public List findClusters(List hits) { + + List clusters = new ArrayList(); + + if(debugMode>=1) System.out.println("\nBuilding clusters"); + for(int ihit=0; ihit=1) System.out.println("Attaching hit " + ihit + " to cluster " + cluster.getID()); + } + } + } + if(hit.get_ClusterIndex()==0) { // new cluster found + MUHDCluster cluster = new MUHDCluster(clusters.size()+1); + hit.set_ClusterIndex(cluster.getID()); + cluster.add(hit); + clusters.add(cluster); + if(debugMode>=1) System.out.println("Creating new cluster with ID " + cluster.getID()); + } + } + return clusters; + } + + public void writeBanks(DataEvent event, List hits, List clusters){ + // hits banks + if(!hits.isEmpty()) { + DataBank bankHits = event.createBank("MUHD::hits", hits.size()); + if(bankHits==null){ + System.out.println("ERROR CREATING BANK : MUHD::hits"); + return; + } + for(int i = 0; i < hits.size(); i++){ + bankHits.setByte("sector",i,(byte) hits.get(i).get_Sector()); + bankHits.setByte("layer",i,(byte) hits.get(i).get_Layer()); + bankHits.setShort("component",i,(short) hits.get(i).get_ID()); + bankHits.setFloat("x",i,(float) (hits.get(i).get_Dx()/10.0)); + bankHits.setFloat("y",i,(float) (hits.get(i).get_Dy()/10.0)); + bankHits.setFloat("z",i,(float) (hits.get(i).get_Dz()/10.0)); + bankHits.setFloat("energy",i,(float) hits.get(i).get_Edep()); + bankHits.setFloat("time",i,(float) hits.get(i).get_Time()); + bankHits.setShort("hitID",i,(short) hits.get(i).get_DGTZIndex()); + bankHits.setShort("clusterID",i,(short) hits.get(i).get_ClusterIndex()); + } + event.appendBanks(bankHits); + } + // cluster bank + if(!clusters.isEmpty()){ + DataBank bankCluster = event.createBank("MUHD::clusters", clusters.size()); + if(bankCluster==null){ + System.out.println("ERROR CREATING BANK : MUHD::clusters"); + return; + } + for(int i = 0; i < clusters.size(); i++){ + bankCluster.setShort("id", i,(short) clusters.get(i).getID()); + bankCluster.setShort("size", i,(short) clusters.get(i).getSize()); + bankCluster.setFloat("x",i,(float) (clusters.get(i).getX()/10.0)); + bankCluster.setFloat("y",i,(float) (clusters.get(i).getY()/10.0)); + bankCluster.setFloat("z",i,(float) (clusters.get(i).getZ()/10.0)); + bankCluster.setFloat("widthX",i,(float) (clusters.get(i).getWidthX()/10.0)); + bankCluster.setFloat("widthY",i,(float) (clusters.get(i).getWidthY()/10.0)); + bankCluster.setFloat("radius",i,(float) (clusters.get(i).getRadius()/10.0)); + bankCluster.setFloat("time",i,(float) clusters.get(i).getTime()); + bankCluster.setFloat("energy",i,(float) clusters.get(i).getEnergy()); + } + event.appendBanks(bankCluster); + } + } + + public List readRawHits(DataEvent event, IndexedTable charge2Energy, IndexedTable timeOffsets, IndexedTable status, IndexedTable geometry) { + // getting raw data bank + if(debugMode>=1) System.out.println("Getting raw hits from MUHD:adc bank"); + + List hits = new ArrayList<>(); + if(event.hasBank("MUHD::adc")==true) { + RawDataBank bankDGTZ = new RawDataBank("MUHD::adc"); + bankDGTZ.read(event); + int nrows = bankDGTZ.rows(); + for(int row = 0; row < nrows; row++){ + int isector = bankDGTZ.getByte("sector",row); + int ilayer = bankDGTZ.getByte("layer",row); + int icomponent = bankDGTZ.getShort("component",row); + int adc = bankDGTZ.getInt("ADC",row); + float time = bankDGTZ.getFloat("time",row); + if(adc!=-1 && time!=-1 && status.getIntValue("status", isector, ilayer, icomponent)==0){ + MUHDHit hit = new MUHDHit(bankDGTZ.trueIndex(row),isector,ilayer,icomponent, adc, time, charge2Energy,timeOffsets,geometry); + hits.add(hit); + } + } + } + return hits; + } +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCluster.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCluster.java new file mode 100644 index 0000000000..36df92ca51 --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCluster.java @@ -0,0 +1,221 @@ +package org.jlab.rec.muvt; + +import java.util.ArrayList; +import java.util.List; +import org.jlab.detector.base.DetectorDescriptor; +import org.jlab.detector.base.DetectorType; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; + +/** + * MUVT in-layer cluster + * + * @author bondi, devita, caot + */ +public class MUVTCluster extends ArrayList { + + + private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.MUVT); + private int id; + private Line3D clusterLine = null; + private Line3D clusterLineTS = null; + public int indexMaxStrip = -1; + private byte clusterStatus = 1; + + public MUVTCluster(MUVTStrip strip){ + this.desc.setSectorLayerComponent(strip.getDescriptor().getSector(), + strip.getDescriptor().getLayer(), 0); + this.add(strip); + this.clusterLine = new Line3D(strip.getLine()); + this.clusterLineTS = MUVTConstants.toTiltedSectorFrame(this.desc.getSector(), clusterLine); + this.indexMaxStrip = 0; + } + + public int getId() { + return id; + } + + public DetectorDescriptor getDescriptor(){ + return this.desc; + } + + public int getSector() { + return this.desc.getSector(); + } + + public int getLayer() { + return this.desc.getLayer(); + } + + public int getChamber() { + return this.get(0).getChamber(); + } + + public Line3D getLine() { + return this.clusterLine; + } + + public Line3D getLineTS() { + return this.clusterLineTS; + } + + public double getEnergy(){ + double energy = 0.0; + for(MUVTStrip strip : this){ + energy += strip.getEnergy(); + } + return energy; + } + + public double getTime(){ + double time = 0.0; + for(MUVTStrip strip : this){ + time += strip.getTime()*strip.getEnergy(); + } + time /= this.getEnergy(); + return time; + } + + public double getSeedTime(){ + if(this.indexMaxStrip >= 0 && this.indexMaxStrip < this.size()){ + return this.get(indexMaxStrip).getTime(); + } + return 0.0; + } + + public MUVTStrip getSeedStrip() { + return this.get(this.indexMaxStrip); + } + + public int getMaxStrip(){ + return this.get(this.indexMaxStrip).getDescriptor().getComponent(); + } + + public boolean addStrip(MUVTStrip strip){ + for(MUVTStrip s : this){ + if(s.isNeighbour(strip)){ + this.add(strip); + if(strip.getEnergy()>this.get(indexMaxStrip).getEnergy()){ + this.indexMaxStrip = this.size()-1; + this.clusterLine.copy(strip.getLine()); + } + return true; + } + } + return false; + } + + public int getADC(){ + int adc = 0; + for(MUVTStrip s : this){ + adc+= s.getADC(); + } + return adc; + } + + public void setStatus(int val) {this.clusterStatus+=val;} + + public byte getStatus() {return clusterStatus;} + + public void setClusterId(int id){ + this.id = id; + for(MUVTStrip strip : this){ + strip.setClusterId(id); + } + } + + public void redoClusterLine(){ + + Point3D pointOrigin = new Point3D(0.0,0.0,0.0); + Point3D pointEnd = new Point3D(0.0,0.0,0.0); + + double logSumm = 0.0; + double summE = 0.0; + + for(int i = 0; i < this.size(); i++){ + Line3D line = this.get(i).getLine(); + + double energy = this.get(i).getEnergy(); + double energymev = energy*1000.0; + double le = Math.log(energymev); + + pointOrigin.setX(pointOrigin.x()+line.origin().x()*le); + pointOrigin.setY(pointOrigin.y()+line.origin().y()*le); + pointOrigin.setZ(pointOrigin.z()+line.origin().z()*le); + + pointEnd.setX(pointEnd.x()+line.end().x()*le); + pointEnd.setY(pointEnd.y()+line.end().y()*le); + pointEnd.setZ(pointEnd.z()+line.end().z()*le); + + logSumm += le; + + summE += energy; + } + + this.clusterLine.set( + pointOrigin.x()/logSumm, + pointOrigin.y()/logSumm, + pointOrigin.z()/logSumm, + pointEnd.x()/logSumm, + pointEnd.y()/logSumm, + pointEnd.z()/logSumm + ); + this.clusterLineTS = MUVTConstants.toTiltedSectorFrame(this.desc.getSector(), clusterLine); + } + + + public static List createClusters(List stripList){ + + List clusterList = new ArrayList<>(); + + if(!stripList.isEmpty()){ + for(int loop = 0; loop < stripList.size(); loop++){ //Loop over all strips + boolean stripAdded = false; + for(MUVTCluster cluster : clusterList) { + if(cluster.addStrip(stripList.get(loop))){ //Add adjacent strip to newly seeded peak + stripAdded = true; + } + } + if(!stripAdded){ + MUVTCluster newPeak = new MUVTCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak + clusterList.add(newPeak); + } + } + } + for(int loop = 0; loop < clusterList.size(); loop++){ + clusterList.get(loop).setClusterId(loop+1); + clusterList.get(loop).redoClusterLine(); + } + return clusterList; + } + + public static List getClusters(List clusters, int sector, int layer) { + List selectedClusters = new ArrayList<>(); + for(MUVTCluster cluster : clusters) { + if(cluster.getSector()==sector && cluster.getLayer()==layer) + selectedClusters.add(cluster); + } + return selectedClusters; + } + + @Override + public String toString(){ + StringBuilder str = new StringBuilder(); + str.append(String.format("----> cluster ( %3d %3d ) ENERGY = %12.5f\n", + this.desc.getSector(),this.desc.getLayer(), this.getEnergy())); + str.append(this.clusterLine.toString()); + str.append("\n"); + for(MUVTStrip strip : this){ + str.append("\t\t"); + str.append(strip.toString()); + str.append("\n"); + } + + return str.toString(); + } + + + + + +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTConstants.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTConstants.java new file mode 100644 index 0000000000..2a3dee118f --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTConstants.java @@ -0,0 +1,118 @@ +package org.jlab.rec.muvt; + +import org.jlab.geom.base.Detector; +import org.jlab.geom.detector.fmt.FMTLayer; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Transformation3D; +import org.jlab.geom.prim.Vector3D; + +/** + * + * @author devita + */ +public class MUVTConstants { + + public final static int NSECTOR = 6; + public final static int NLAYER = 12; + public final static int NREGION = 6; + public final static int NCHAMBER = 1; + public final static double PITCH = 0.5; // mm + public final static double TILT = 25; // deg + public final static double[] STEREO = { 10.0, 10.0 }; + + // strips + public final static double THRESHOLD = 0; + public final static double ADCTOENERGY = 25/1E4; // in eV, values from gemc ADC = (uRwellC.gain*1e6*tInfos.eTot/uRwellC.w_i); with gain = 10^4 and w_i = 25 eV + public final static double TDCTOTIME = 1; + + // cluster + public final static double COINCTIME = 100; + + // rMax difference between cross's clusters energy + public static double CROSSDELTAE = 2000; + + // DC-tracks to FMT-clusters matching parameter + public static double CIRCLECONFUSION = 12; // cm + + // min path for final swimming to beamline to reject failed swimming + public static double MIN_SWIM_PATH = 0.2; + + // small distance (cm) for derivatives calculations + public static double EPSILON = 1e-4; + + public static int MAX_NB_CROSSES = 30; + +// private static Detector fmtDetector = null; + + + +// public static void setDetector(Detector detector) { +// MUVTConstants.fmtDetector = detector; +// } + +// public static Vector3D getDerivatives(int layer, double x, double y, double z) { +// Vector3D p0 = new Vector3D(x,y,z); +// Vector3D p1 = new Vector3D(x,y+MUVTConstants.EPSILON,z); +// MUVTConstants.getInverseTransform(layer).apply(p0); +// MUVTConstants.getInverseTransform(layer).apply(p1); +// return p1.sub(p0).divide(MUVTConstants.EPSILON); +// } + +// public static FMTLayer getLayer(int layer) { +// if(layer<1 || layer>NLAYER) +// throw new IllegalArgumentException("Error: invalid layer="+layer); +// return (FMTLayer) MUVTConstants.fmtDetector.getSector(0).getSuperlayer(0).getLayer(layer-1); +// } +// +// public static double getPitch() { +// return MUVTConstants.getLayer(1).getComponent(0).getWidth(); +// } +// +// public static Line3D getStrip(int layer, int strip) { +// if(strip<1 || strip>MUVTConstants.getLayer(layer).getNumComponents()) +// throw new IllegalArgumentException("Error: invalid strip="+strip); +// return MUVTConstants.getLayer(layer).getComponent(strip-1).getLine(); +// } + +// public static Line3D getLocalStrip(int layer, int strip) { +// Line3D local = new Line3D(MUVTConstants.getStrip(layer, strip)); +// MUVTConstants.getInverseTransform(layer).apply(local); +// return local; +// } +// +// public static double getThickness() { +// return MUVTConstants.getLayer(1).getComponent(0).getThickness(); +// } + + public static Transformation3D toTiltedSectorFrame(int sector) { + Transformation3D t = new Transformation3D(); + t.rotateZ(Math.toRadians(-60 * (sector-1))); + t.rotateY(Math.toRadians(-TILT)); + return t; + } + + public static Transformation3D toLab(int sector) { + Transformation3D inverse = new Transformation3D(MUVTConstants.toTiltedSectorFrame(sector)); + return inverse.inverse(); + } + + public static Point3D toTiltedSectorFrame(int sector, Point3D p) { + Point3D local = new Point3D(p); + MUVTConstants.toTiltedSectorFrame(sector).apply(local); + return local; + } + + public static Point3D toTiltedSectorFrame(int sector, double x, double y, double z) { + Point3D local = new Point3D(x,y,z); + MUVTConstants.toTiltedSectorFrame(sector).apply(local); + return local; + } + + public static Line3D toTiltedSectorFrame(int sector, Line3D l) { + Line3D local = new Line3D(l); + MUVTConstants.toTiltedSectorFrame(sector).apply(local); + return local; + } + +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCross.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCross.java new file mode 100644 index 0000000000..4fde7af6b2 --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTCross.java @@ -0,0 +1,129 @@ +package org.jlab.rec.muvt; + +import java.util.ArrayList; +import java.util.List; +import org.jlab.geom.prim.Plane3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; + +/** + * MUVT V-W clusters + * @author devita + */ +public class MUVTCross { + + private int id; + + private int sector; + private int region; + private int chamber; + + private int cluster1; + private int cluster2; + + private Point3D cross; + private double energy; + private double deltaE; + private double time; + private int status; + + + + public MUVTCross(MUVTCluster c1, MUVTCluster c2) { + + Vector3D dir = c1.getLine().direction().cross(c2.getLine().direction()); + Plane3D plane = new Plane3D(c1.getLine().origin(), c1.getLine().direction().cross(dir)); + Point3D point = new Point3D(); + int nint = plane.intersectionSegment(c2.getLine(), point); + if(nint==1) { + this.sector = c1.getSector(); + this.region = (c1.getLayer()-1)/(MUVTConstants.NLAYER/MUVTConstants.NREGION)+1; + this.cross = point; + this.energy = c1.getEnergy() + c2.getEnergy(); + this.deltaE = c1.getEnergy() - c2.getEnergy(); + this.time = (c1.getTime() + c2.getTime())/2; + this.cluster1 = c1.getId(); + this.cluster2 = c2.getId(); + } + } + + public void setId(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public int getSector() { + return this.sector; + } + + public int getRegion() { + return this.region; + } + + public int getChamber() { + return this.chamber; + } + + public int getCluster1() { + return cluster1; + } + + public int getCluster2() { + return cluster2; + } + + public Point3D point() { + return cross; + } + + public double getEnergy() { + return energy; + } + + public double getDeltaEnergy() { + return deltaE; + } + + public double getTime() { + return time; + } + + public int getStatus() { + return status; + } + + public static List createCrosses(List clusters) { + + List crosses = new ArrayList<>(); + + for(int is=0; is clustersV = MUVTCluster.getClusters(clusters, is+1, (MUVTConstants.NLAYER/MUVTConstants.NREGION)*ir+1); + List clustersW = MUVTCluster.getClusters(clusters, is+1, (MUVTConstants.NLAYER/MUVTConstants.NREGION)*ir+2); + + for(MUVTCluster v : clustersV) { + for(MUVTCluster w : clustersW) { + + if(v.getChamber()==w.getChamber()) { + MUVTCross cross = new MUVTCross(v, w); + if(cross.point()!=null) crosses.add(cross); + cross.setId(crosses.size()); + } + } + } + } + } + return crosses; + } + + @Override + public String toString(){ + StringBuilder str = new StringBuilder(); + str.append(String.format("----> cross ( %3d %3d )\n", this.getSector(),this)); + str.append(this.point().toString()); + return str.toString(); + } +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java new file mode 100644 index 0000000000..33025f6e72 --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java @@ -0,0 +1,282 @@ +package org.jlab.rec.muvt; + +import java.util.Arrays; +import java.util.List; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Optional; + +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.clas.swimtools.Swim; +import org.jlab.detector.geant4.v2.MPGD.MUVT.MUVTStripFactory; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.utils.groups.IndexedTable; +import org.jlab.io.base.*; + +import org.jlab.rec.muvt.track.fit.KFitter; +import org.jlab.rec.muvt.track.fit.StateVecs.StateVec; + +/** + * Service to return reconstructed track candidates - the output is in hipo format + * + * @author ziegler, benkel, devita + */ +public class MUVTEngine extends ReconstructionEngine { + + boolean debug = false; + + public MUVTStripFactory factory = null; + + public MUVTEngine() { + super("MUVT", "ziegler", "5.0"); + } + + @Override + public boolean init() { + + String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); + + factory = new MUVTStripFactory(11, variationName); + + String[] tables = new String[]{ + "/geometry/beam/position" + }; + requireConstants(Arrays.asList(tables)); + this.getConstantsManager().setVariation(variationName); + // Register output banks + super.registerOutputBank("MUVT::hits"); + super.registerOutputBank("MUVT::clusters"); + super.registerOutputBank("MUVT::crosses"); + super.registerOutputBank("MUVT::tracks"); + super.registerOutputBank("MUVT::trajectory"); + + return true; + } + + @Override + public boolean processDataEvent(DataEvent event) { + // Initial setup. + if(debug) System.out.println("\nNew event"); + + // Set run number. + DataBank runConfig = event.getBank("RUN::config"); + if (runConfig == null || runConfig.rows() == 0) return true; + int run = runConfig.getInt("run", 0); + + // Set swimmer. + Swim swimmer = new Swim(); + + // Set beam shift. NOTE: Set to zero for the time being, when beam alignment is done + // uncomment this code. + IndexedTable beamOffset = this.getConstantsManager().getConstants(run, "/geometry/beam/position"); + double xB = beamOffset.getDoubleValue("x_offset", 0,0,0); + double yB = beamOffset.getDoubleValue("y_offset", 0,0,0); + + + // === from STRIPS to CROSSES ============================================================= + List strips = MUVTStrip.getStrips(event, factory, this.getConstantsManager()); + List clusters = MUVTCluster.createClusters(strips); + List crosses = MUVTCross.createCrosses(clusters); + + //System.out.println(clusters.size()); + //for (int i = 0; i < clusters.size(); i++) System.out.println(clusters.get(i).toString()); + + // === DC TRACKS =========================================================================== + MUVTTrack trk = new MUVTTrack(); + List tracks = trk.getDCTracks(event, swimmer, factory); + if(tracks.isEmpty()) return true; + + // === SEEDS ============================================================================= + Point3D target = new Point3D(0,0,0); + for(int i=0; i[] trackCrosses = new ArrayList[MUVTConstants.NLAYER/2]; + for(int j=0; j(); + for(int j=0; j> segments = new ArrayList<>(); + List end = new ArrayList<>(); + for(int r=6; r>3; r--) + end.addAll(trackCrosses[r-1]); + for(MUVTCross ce : end) { + Line3D ve = new Line3D(ce.point(),target); + for(int ro=1; ro segment = new ArrayList(); + segment.add(ce); + for(int r=co.getRegion()+1; r=4) + segments.add(segment); + } + } + } + } +// System.out.print(segments.size()); + if(!segments.isEmpty()) { + segments.sort(Comparator.comparingInt(List::size).reversed()); + for(MUVTCross cross : segments.get(0)) { + track.addCluster(clusters.get(cross.getCluster1()-1)); + track.addCluster(clusters.get(cross.getCluster2()-1)); + } + } + } + + List filtedTracks = new ArrayList(); + for(MUVTTrack track : tracks){ + if (track.getClusters().size() > 4) filtedTracks.add(track); + } + + + // === TRACKS ============================================================================== + KFitter kf = null; + + // Iterate on list to run the fit. + for(int i=0; i trackClusters = track.getClusters(); + + kf = new KFitter(track, swimmer, 0); + + kf.runFitter(track.getSector()); + + + // Do one last KF pass with filtering off to get the final Chi^2. + kf.totNumIter = 1; + kf.filterOn = false; + kf.runFitter(track.getSector()); + + if (kf.finalStateVec != null) { + StateVec sv = kf.finalStateVec; + + // swim to beamline to get vertex parameters + int charge = (int)Math.signum(sv.Q); + + Point3D posGlobal = track.transLocaltoGlobal(track.getSector(), sv.x, sv.y, sv.z); + Point3D momGlobal = track.transLocaltoGlobal(track.getSector(), sv.getPx()/sv.getP()*track.getP(), sv.getPy()/sv.getP()*track.getP(), sv.getPz()/sv.getP()*track.getP()); + + swimmer.SetSwimParameters(posGlobal.x(),posGlobal.y(),posGlobal.z(), -momGlobal.x(),-momGlobal.y(),-momGlobal.z(),-charge); + double[] Vt = swimmer.SwimToBeamLine(xB, yB); + + // if successful, save track parameters + if(Vt == null) continue; + track.setStatus(0); + track.setNDF(trackClusters.size()); + track.setQ(charge); + track.setChi2(kf.chi2); + track.setX(Vt[0]); + track.setY(Vt[1]); + track.setZ(Vt[2]); + track.setPx(-Vt[3]); + track.setPy(-Vt[4]); + track.setPz(-Vt[5]); + } + } + + this.writeHipoBanks(event, strips, clusters, crosses, tracks); + return true; + } + + + + private void writeHipoBanks(DataEvent de, + List strips, + List clusters, + List crosses, + List tracks){ + + DataBank bankS = de.createBank("MUVT::hits", strips.size()); + for(int h = 0; h < strips.size(); h++){ + bankS.setShort("id", h, (short) strips.get(h).getId()); + bankS.setByte("sector", h, (byte) strips.get(h).getDescriptor().getSector()); + bankS.setByte("layer", h, (byte) strips.get(h).getDescriptor().getLayer()); + bankS.setShort("strip", h, (short) strips.get(h).getDescriptor().getComponent()); + bankS.setFloat("energy", h, (float) strips.get(h).getEnergy()); + bankS.setFloat("time", h, (float) strips.get(h).getTime()); + bankS.setShort("status", h, (short) strips.get(h).getStatus()); + bankS.setShort("clusterId", h, (short) strips.get(h).getClusterId()); + } + + DataBank bankC = de.createBank("MUVT::clusters", clusters.size()); + for(int c = 0; c < clusters.size(); c++){ + bankC.setShort("id", c, (short) clusters.get(c).getId()); + bankC.setByte("sector", c, (byte) clusters.get(c).get(0).getDescriptor().getSector()); + bankC.setByte("layer", c, (byte) clusters.get(c).get(0).getDescriptor().getLayer()); + bankC.setShort("strip", c, (short) clusters.get(c).getMaxStrip()); + bankC.setFloat("energy", c, (float) clusters.get(c).getEnergy()); + bankC.setFloat("time", c, (float) clusters.get(c).getTime()); + bankC.setFloat("xo", c, (float) clusters.get(c).getLine().origin().x()); + bankC.setFloat("yo", c, (float) clusters.get(c).getLine().origin().y()); + bankC.setFloat("zo", c, (float) clusters.get(c).getLine().origin().z()); + bankC.setFloat("xe", c, (float) clusters.get(c).getLine().end().x()); + bankC.setFloat("ye", c, (float) clusters.get(c).getLine().end().y()); + bankC.setFloat("ze", c, (float) clusters.get(c).getLine().end().z()); + bankC.setShort("size", c, (short) clusters.get(c).size()); + bankC.setShort("status", c, (short) clusters.get(c).getStatus()); + } + + DataBank bankX = de.createBank("MUVT::crosses", crosses.size()); + for(int c = 0; c < crosses.size(); c++){ + bankX.setShort("id", c, (short) crosses.get(c).getId()); + bankX.setByte("sector", c, (byte) crosses.get(c).getSector()); + bankX.setByte("region", c, (byte) crosses.get(c).getRegion()); + bankX.setFloat("energy", c, (float) crosses.get(c).getEnergy()); + bankX.setFloat("time", c, (float) crosses.get(c).getTime()); + bankX.setFloat("x", c, (float) crosses.get(c).point().x()); + bankX.setFloat("y", c, (float) crosses.get(c).point().y()); + bankX.setFloat("z", c, (float) crosses.get(c).point().z()); + bankX.setShort("cluster1", c, (short) crosses.get(c).getCluster1()); + bankX.setShort("cluster2", c, (short) crosses.get(c).getCluster2()); + bankX.setShort("status", c, (short) crosses.get(c).getStatus()); + } + + + DataBank bankT = de.createBank("MUVT::tracks", tracks.size()); + for (int i=0; i this.desc.getSector()) return -1; + if(ob.getDescriptor().getLayer() < this.desc.getLayer()) return 1; + if(ob.getDescriptor().getLayer() > this.desc.getLayer()) return -1; + if(ob.getDescriptor().getComponent() < this.desc.getComponent()) return 1; + if(ob.getDescriptor().getComponent() == this.desc.getComponent()) return 0; + return -1; + } + + public static List getStrips(DataEvent event, MUVTStripFactory factory, ConstantsManager ccdb) { + + List strips = new ArrayList<>(); + + if(event.hasBank("MUVT::adc")){ + RawDataBank bank = new RawDataBank("MUVT::adc"); + bank.read(event); + for(int i = 0; i < bank.rows(); i++){ + int sector = bank.getByte("sector", i); + int layer = bank.getByte("layer", i); + int comp = bank.getShort("component", i); + int adc = bank.getInt("ADC", i); + double time = bank.getFloat("time", i); + + MUVTStrip strip = new MUVTStrip(sector, layer, comp); + +// strip.setTriggerPhase(triggerPhase); + strip.setId(bank.trueIndex(i)+1); + strip.setADC(adc); + strip.setTDC((int) time); + strip.setEnergy(strip.ADC*MUVTConstants.ADCTOENERGY); + strip.setTime(strip.TDC*MUVTConstants.TDCTOTIME); + strip.setLine(factory.getStrip(sector, layer, comp)); + strip.setChamber(1); + strip.setStatus(0); + + if(strip.getEnergy()>MUVTConstants.THRESHOLD) strips.add(strip); + + } + } + return strips; + } + + @Override + public String toString(){ + StringBuilder str = new StringBuilder(); + str.append(String.format("----> strip (%3d %3d %3d) ADC/TDC %5d %5d ENERGY = %8.5f TIME = %8.5f ", + this.desc.getSector(),this.desc.getLayer(),this.desc.getComponent(), + this.ADC,this.TDC,this.getEnergy(),this.getTime())); + return str.toString(); + } +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTTrack.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTTrack.java new file mode 100644 index 0000000000..8c857be74a --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTTrack.java @@ -0,0 +1,483 @@ +package org.jlab.rec.muvt; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import org.jlab.clas.swimtools.Swim; +import org.jlab.detector.base.DetectorType; +import org.jlab.detector.geant4.v2.MPGD.MUVT.MUVTStripFactory; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Plane3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; + + +/** + * + * @author ziegler + * @author devita + */ +public class MUVTTrack { + + /** + * The status variable explains the number of tracks and the quality of the reconstruction. + * + * Its last digit is the number of FMT layers used in FVT tracking, so it can be any number + * from 0 to 3. If it's 0, it means that no FMT layers were used and the FVT track should be + * the same as the DC track. + * + * If there was an error in swimming due to an odd track shape or anything, a 100 is added to + * the variable to denote that. + */ + private int status; + private int _id; + private int _index; + private int _sector; + private int _q; + private double _chi2; + private double _x; + private double _y; + private double _z; + private double _px; + private double _py; + private double _pz; + private int _NDF; + + private final MUVTTrajectory[] _DCtrajs = new MUVTTrajectory[MUVTConstants.NLAYER]; + private final List[] _clusters = new ArrayList[MUVTConstants.NLAYER]; + private final MUVTTrajectory[] _FMTtrajs = new MUVTTrajectory[MUVTConstants.NLAYER]; + + public MUVTTrack() { + } + + + public MUVTTrack(int _index, int _sector, int _q, double _x, double _y, double _z, + double _px, double _py, double _pz, List clusters) { + this._index = _index; + this._sector = _sector; + this._q = _q; + this._x = _x; + this._y = _y; + this._z = _z; + this._px = _px; + this._py = _py; + this._pz = _pz; + for(MUVTCluster cluster : clusters) this.addCluster(cluster); + } + + + + /** + * @param layer + * @return the _traj + */ + public MUVTTrajectory getDCTraj(int layer) { + if(layer<=0 || layer>MUVTConstants.NLAYER) return null; + else return _DCtrajs[layer-1]; + } + + /** + * @param trj + */ + public void setDCTraj(MUVTTrajectory trj) { + this._DCtrajs[trj.getLayer()-1] = trj; + } + + public List getClusters() { + List clusters = new ArrayList<>(); + for(int i=0; i getClusters(int layer) { + if(layer<=0 || layer>MUVTConstants.NLAYER) return null; + else return _clusters[layer-1]; + } + + public MUVTCluster getCluster(int layer) { + if(layer<=0 || layer>MUVTConstants.NLAYER) return null; + else if(_clusters[layer-1]== null || _clusters[layer-1].size()==0) return null; + else return _clusters[layer-1].get(0); + } + + public int getClusterLayers() { + int n = 0; + for(int i=0; i(); + this._clusters[cluster.getLayer()-1].add(cluster); + } + + public void clearClusters(int layer) { + this._clusters[layer-1].clear(); + } + + public MUVTTrajectory getFMTTraj(int layer) { + if(layer<=0 || layer>MUVTConstants.NLAYER) return null; + return _FMTtrajs[layer-1]; + } + + public void setFMTtraj(MUVTTrajectory trj) { + this._FMTtrajs[trj.getLayer()-1] = trj; + } + + public int getId() { + return _id; + } + + public void setId(int _id) { + this._id = _id; + } + + /** + * @return the _id + */ + public int getIndex() { + return _index; + } + + /** + * @param _id the _id to set + */ + public void setIndex(int _id) { + this._index = _id; + } + + /** + * @return the sector + */ + public int getSector() { + return _sector; + } + + /** + * @param _sector the sector to set + */ + public void setSector(int _sector) { + this._sector = _sector; + } + + /** + * @return the _q + */ + public int getQ() { + return _q; + } + + /** + * @param _q the _q to set + */ + public void setQ(int _q) { + this._q = _q; + } + + /** + * @return the _chi^2. + */ + public double getChi2() { + return _chi2; + } + + /** + * @param _chi2 the _chi2 to set + */ + public void setChi2(double _chi2) { + this._chi2 = _chi2; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getNDF() { + return _NDF; + } + + public void setNDF(int _NDF) { + this._NDF = _NDF; + } + + /** + * @return the _x + */ + public double getX() { + return _x; + } + + /** + * @param _x the _x to set + */ + public void setX(double _x) { + this._x = _x; + } + + /** + * @return the _y + */ + public double getY() { + return _y; + } + + /** + * @param _y the _y to set + */ + public void setY(double _y) { + this._y = _y; + } + + /** + * @return the _z + */ + public double getZ() { + return _z; + } + + /** + * @param _z the _z to set + */ + public void setZ(double _z) { + this._z = _z; + } + + /** + * @return the the tracke momentum + */ + public double getP() { + return Math.sqrt(_px*_px+_py*_py+_pz*_pz); + } + + /** + * @return the _px + */ + public double getPx() { + return _px; + } + + /** + * @param _px the _px to set + */ + public void setPx(double _px) { + this._px = _px; + } + + /** + * @return the _py + */ + public double getPy() { + return _py; + } + + /** + * @param _py the _py to set + */ + public void setPy(double _py) { + this._py = _py; + } + + /** + * @return the _pz + */ + public double getPz() { + return _pz; + } + + /** + * @param _pz the _pz to set + */ + public void setPz(double _pz) { + this._pz = _pz; + } + +// // FIXME: THIS METHOD SHOULD BE GENERALIZED +// public double getSeedQuality() { +// double quality=99; +// if(this.getClusterLayer(1)>0 && this.getClusterLayer(2)>0 && this.getClusterLayer(3)>0) { +// Line3D seg1 = this.getClusters(1).get(0).getGlobalSegment(); +// Line3D seg2 = this.getClusters(2).get(0).getGlobalSegment(); +// Line3D seg3 = this.getClusters(3).get(0).getGlobalSegment(); +// quality = seg1.distanceSegments(seg3).distanceSegments(seg2).length(); +// } +// return quality; +// } + + +// // FIXME: THIS METHOD SHOULD BE GENERALIZED +// public void filterClusters(int mode) { +// +// double dref = Double.POSITIVE_INFINITY; +// +// int[] ibest = new int[Constants.NLAYERS]; +// for(int i=0; i0 && this.getClusterLayer(2)>0 && this.getClusterLayer(3)>0) { +// for(int i1=0; i1=0) { +// List cls = new ArrayList<>(); +// cls.add(_clusters[i].get(ibest[i])); +// _clusters[i] = cls; +// } +// } +// } + + public List getDCTracks(DataEvent event, Swim swimmer, MUVTStripFactory factory) { + + Map trackmap = new LinkedHashMap<>(); + + DataBank trackBank = null; + DataBank trajBank = null; + if(event.hasBank("TimeBasedTrkg::TBTracks")) trackBank = event.getBank("TimeBasedTrkg::TBTracks"); + if(event.hasBank("TimeBasedTrkg::Trajectory")) trajBank = event.getBank("TimeBasedTrkg::Trajectory"); + if (trackBank!=null) { + + for (int i = 0; i < trackBank.rows(); i++) { + MUVTTrack trk = new MUVTTrack(); + int id = trackBank.getShort("id", i); + trk.setId(id); + trk.setIndex(i); + trk.setSector(trackBank.getByte("sector", i)); + trk.setQ(trackBank.getByte("q", i)); + + double vx = trackBank.getFloat("Vtx0_x", i); + double vy = trackBank.getFloat("Vtx0_y", i); + double vz = trackBank.getFloat("Vtx0_z", i); + + double px = trackBank.getFloat("p0_x", i); + double py = trackBank.getFloat("p0_y", i); + double pz = trackBank.getFloat("p0_z", i); + + + Point3D vertexLocal = transGlobaltoLocal(trk.getSector(), vx, vy, vz); + + Point3D momLocal = transGlobaltoLocal(trk.getSector(), px, py, pz); + + trk.setX(vertexLocal.x()); + trk.setY(vertexLocal.y()); + trk.setZ(vertexLocal.z()); + trk.setPx(momLocal.x()); + trk.setPy(momLocal.y()); + trk.setPz(momLocal.z()); + trk.setStatus(1); + trackmap.put(id,trk); + + Line3D vertexToPlane = new Line3D(); + factory.getPlane(trk.getSector(), 1).distance(new Point3D(vx, vy, vz), vertexToPlane); + if(vertexToPlane.direction().dot(new Vector3D(px,py,pz))>0) { + swimmer.SetSwimParameters(vx, vy, vz, px, py, pz, trk.getQ()); + for(int il=0; il tracks = new ArrayList<>(); + for(Entry entry: trackmap.entrySet()) { + tracks.add(entry.getValue()); + } + return tracks; + } + + public Point3D transGlobaltoLocal(int sector, double x, double y, double z){ + Point3D point = new Point3D(x, y, z); + point.rotateZ(Math.toRadians(-60 * (sector - 1))); + point.rotateY(Math.toRadians(-25)); + + return point; + } + + public Point3D transLocaltoGlobal(int sector, double x, double y, double z){ + Point3D point = new Point3D(x, y, z); + point.rotateY(Math.toRadians(25)); + point.rotateZ(Math.toRadians(60 * (sector - 1))); + + return point; + } + + @Override + public String toString() { + String str = "FMT track :" + " Index " + this._index + + " Q " + this._q + + String.format(" P (%.4f,%.4f,%.4f)", this._px, this._py, this._pz) + + String.format(" D (%.4f,%.4f,%.4f)", this._x, this._y, this._z); + for(int i=0; i clusters; + + public KFitter(MUVTTrack track, Swim swimmer, int c) { + sv = new StateVecs(swimmer); + this.track = track; + this.clusters = track.getClusters(); + this.init(clusters, track.getSector(), track.getX(), track.getY(), track.getZ(), + track.getPx(), track.getPy(), track.getPz(), track.getQ(), c); + } + + public KFitter(List clusters, int sector, double xVtx, double yVtx, double zVtx, + double pxVtx, double pyVtx, double pzVtx, int q, Swim swimmer, int c) { + sv = new StateVecs(swimmer); + this.track = new MUVTTrack(0,sector, q, xVtx, yVtx, zVtx, pxVtx, pyVtx, pzVtx, clusters); + this.clusters = clusters; + this.init(clusters, sector, xVtx, yVtx, zVtx, pxVtx, pyVtx, pzVtx, q, c); + } + + private void init(List clusters, int sector, double xVtx, double yVtx, double zVtx, + double pxVtx, double pyVtx, double pzVtx, int q, int c) { + // initialize measVecs + mv.setMeasVecs(clusters); + int mSize = mv.measurements.size(); + + sv.Z = new double[mSize]; + + for (int i = 0; i < mSize; i++) sv.Z[i] = mv.measurements.get(i).z; + + // initialize stateVecs + sv.init(sector, xVtx, yVtx, zVtx, pxVtx, pyVtx, pzVtx, q, sv.Z[0], this, c); + } + + public void runFitter(int sector) { + int svzLength = sv.Z.length; + + for (int i = 1; i <= totNumIter; i++) { + interNum = i; + this.chi2 = 0; + if (i > 1) { + for (int k = svzLength - 1; k > 0; k--) { + if (k >= 1) { + sv.transport(sector, k, k - 1, sv.trackTraj.get(k), sv.trackCov.get(k)); + this.filter(k - 1); + } + } + } + for (int k = 0; k < svzLength - 1; k++) { + sv.transport(sector, k, k + 1, sv.trackTraj.get(k), sv.trackCov.get(k)); + this.filter(k + 1); + } + if (i > 1) { + if (this.setFitFailed) i = totNumIter; + if (!this.setFitFailed) { + this.finalStateVec = sv.trackTraj.get(svzLength - 1); + this.finalCovMat = sv.trackCov.get(svzLength - 1); + } else { + this.ConvStatus = 1; + } + } + } + if (totNumIter == 1) { + this.finalStateVec = sv.trackTraj.get(svzLength - 1); + this.finalCovMat = sv.trackCov.get(svzLength - 1); + } + + // Do one final pass to get the final chi^2 and the corresponding centroid residuals. + this.chi2 = 0; + for (int k = svzLength - 1; k > 0; --k) { + if (k >= 1) { + sv.transport(sector, k, k-1, sv.trackTraj.get(k), sv.trackCov.get(k)); + this.filter(k - 1); + } + } + for (int k = 0; k < svzLength - 1; ++k) { + sv.transport(sector, k, k+1, sv.trackTraj.get(k), sv.trackCov.get(k)); + } + + + // save final trajectory points + /* + if(this.finalStateVec!=null) { + for (int k = 0; k < svzLength; ++k) { + Trajectory trj = new Trajectory(mv.measurements.get(k).layer, + sv.trackTraj.get(k).x, + sv.trackTraj.get(k).y, + sv.trackTraj.get(k).z, + sv.trackTraj.get(k).tx, + sv.trackTraj.get(k).ty, + 0, + sv.trackTraj.get(k).deltaPath); + track.setFMTtraj(trj); + } + } + */ + + } + + public Matrix filterCovMat(double[] H, Matrix Ci, double V) { + + double det = Matrix5x5.inverse(Ci, first_inverse, adj); + if (Math.abs(det) < 1.e-60) { + return null; + } + + addition.set( + H[0] * H[0] / V, H[0] * H[1] / V, 0, 0, 0, + H[0] * H[1] / V, H[1] * H[1] / V, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0); + + Matrix5x5.add(first_inverse, addition, result); + double det2 = Matrix5x5.inverse(result, result_inv, adj); + if (Math.abs(det2) < 1.e-60) { + return null; + } + + return result_inv; + } + + private void filter(int k) { + if (sv.trackTraj.get(k) != null && sv.trackCov.get(k).covMat != null && k < sv.Z.length ) { + double[] K = new double[5]; + double V = mv.measurements.get(k).error * mv.measurements.get(k).error; + + double[] H = mv.HMUVT(sv.trackTraj.get(k),sv); + Matrix CaInv = this.filterCovMat(H, sv.trackCov.get(k).covMat, V); + if (CaInv != null) sv.trackCov.get(k).covMat = CaInv; + else return; + + Matrix cMat = new Matrix(); + if (CaInv != null) { + Matrix5x5.copy(CaInv, cMat); + } else { + return; + } + + // Calculate the gain matrix. + for (int j = 0; j < 5; j++) { + // the gain matrix + K[j] = (H[0] * cMat.get(j, 0) + + H[1] * cMat.get(j, 1)) / V; + } + + // Update Chi^2 and filtered state vector. + double res = mv.dhMUVT(sv.trackTraj.get(k)); + double filt[] = new double[5]; + for(int j = 0; j < 5; j ++){ + filt[j] += K[j]*res; + } + + this.chi2 += (res*res/mv.measurements.get(k).error/mv.measurements.get(k).error); + + double x_filt = sv.trackTraj.get(k).x + filt[0]; + double y_filt = sv.trackTraj.get(k).y + filt[1]; + double tx_filt = sv.trackTraj.get(k).tx + filt[2]; + double ty_filt = sv.trackTraj.get(k).ty + filt[3]; + double Q_filt = sv.trackTraj.get(k).Q + filt[4]; + + if (filterOn) { + sv.trackTraj.get(k).x = x_filt; + sv.trackTraj.get(k).y = y_filt; + sv.trackTraj.get(k).tx = tx_filt; + sv.trackTraj.get(k).ty = ty_filt; + sv.trackTraj.get(k).Q = Q_filt; + } + } + } + + public Matrix propagateToVtx(int sector, double Zf) { + return sv.transport(sector, 0, Zf, sv.trackTraj.get(0), sv.trackCov.get(0)); + } +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/MeasVecs.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/MeasVecs.java new file mode 100644 index 0000000000..5cc75e942e --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/MeasVecs.java @@ -0,0 +1,129 @@ +package org.jlab.rec.muvt.track.fit; + +import java.util.ArrayList; +import java.util.List; +import org.jlab.rec.muvt.track.fit.StateVecs.StateVec; + +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Plane3D; +import org.jlab.rec.muvt.MUVTCluster; + +/** + * @author ziegler + */ + +public class MeasVecs { + + public List measurements ; + + public class MeasVec implements Comparable { + public double z = Double.NaN; + public Point3D lineEndPoint1 = null; + public Point3D lineEndPoint2 = null; + public double seed; + public double error; + public int layer; + public int k; + public int size; + + MeasVec() {} + + @Override + public int compareTo(MeasVec arg) { + int CompLay = this.layer < arg.layer ? -1 : this.layer == arg.layer ? 0 : 1; + return CompLay; + } + } + + public void setMeasVecs(List clusters) { + measurements = new ArrayList<>(); + + for (int i = 0; i < clusters.size(); i++) { + int l = clusters.get(i).getLayer()-1; + Point3D lineEndPoint1 = clusters.get(i).getLineTS().origin(); + Point3D lineEndPoint2 = clusters.get(i).getLineTS().end(); + double error = 0.0144; // = pitch/sqrt(12), where pitch is 500 um + double z = lineEndPoint1.z(); + int seed = clusters.get(i).getMaxStrip(); + MeasVec meas = this.setMeasVec(l, lineEndPoint1, lineEndPoint2, error, z, seed); + measurements.add(meas); + } + } + + public MeasVec setMeasVec(int l, Point3D lineEndPoint1, Point3D lineEndPoint2, double error, double z, int seed) { + + MeasVec meas = new MeasVec(); + meas.layer = l+1; + meas.error = error; + meas.z = z; + meas.seed = seed; + + meas.lineEndPoint1 = lineEndPoint1; + meas.lineEndPoint2 = lineEndPoint2; + + return meas; + } + + public double dhMUVT(StateVec stateVec) { + double value = Double.NaN; + if (stateVec == null|| this.measurements.get(stateVec.k) == null) { + return value; + } + + Line3D l = new Line3D(this.measurements.get(stateVec.k).lineEndPoint1, + this.measurements.get(stateVec.k).lineEndPoint2); + Line3D WL = new Line3D(); + WL.copy(l); + Point3D svP = new Point3D(stateVec.x, stateVec.y, stateVec.z); + WL.copy(WL.distance(svP)); + Plane3D plane = new Plane3D(0, 0, this.measurements.get(stateVec.k).z, 0, 0, 1); // plan perpenticular to z axis in TSC + double sideStrip = -Math.signum(l.direction().cross(WL.direction()). + dot(plane.normal())); + value = WL.length()*sideStrip; + + return value; + } + + public double[] HMUVT(StateVec stateVec, StateVecs sv) { + double[] hMatrix = new double[5]; + double Err = 0.01; + double[][] Result = new double[2][2]; + for (int i = 0; i < 2; i++) { + StateVec svc = sv.new StateVec(stateVec.k); + svc.x = stateVec.x; + svc.y = stateVec.y; + svc.z = stateVec.z; + svc.x = stateVec.x + (double) Math.pow(-1, i) * Err; + Result[i][0] = dhMUVT(svc); + } + for (int i = 0; i < 2; i++) { + StateVec svc = sv.new StateVec(stateVec.k); + svc.x = stateVec.x; + svc.y = stateVec.y; + svc.z = stateVec.z; + svc.y = stateVec.y + (double) Math.pow(-1, i) * Err; + Result[i][1] = dhMUVT(svc); + } + + hMatrix[0] = -(Result[0][0] - Result[1][0]) / (2. * Err); // Add negative sign since dh = meas - h; here use dh to replace h since meas is cancelled when derivative + hMatrix[1] = -(Result[0][1] - Result[1][1]) / (2. * Err); // Add negative sign since dh = meas - h; here use dh to replace h since meas is cancelled when derivative + hMatrix[2] = 0; + hMatrix[3] = 0; + hMatrix[4] = 0; + + return hMatrix; + } + + private StateVec reset(StateVec SVplus, StateVec stateVec, StateVecs sv) { + SVplus = sv.new StateVec(stateVec.k); + SVplus.x = stateVec.x; + SVplus.y = stateVec.y; + SVplus.z = stateVec.z; + SVplus.tx = stateVec.tx; + SVplus.ty = stateVec.ty; + SVplus.Q = stateVec.Q; + + return SVplus; + } +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/RungeKutta.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/RungeKutta.java new file mode 100644 index 0000000000..3ccbf4e93d --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/RungeKutta.java @@ -0,0 +1,497 @@ +package org.jlab.rec.muvt.track.fit; + +import java.util.ArrayList; +import org.jlab.clas.swimtools.Swim; + +/** + * + * @author ziegler + */ +public class RungeKutta { + + private final float[] _b = new float[3]; + final double v = 0.0029979245; + private final ArrayList k1; + private final ArrayList k2; + private final ArrayList k3; + private final ArrayList k4; + private final ArrayList jk1; + private final ArrayList jk2; + private final ArrayList jk3; + private final ArrayList jk4; + + public RungeKutta() { + this.k1 = new ArrayList<>(4); + this.k2 = new ArrayList<>(4); + this.k3 = new ArrayList<>(4); + this.k4 = new ArrayList<>(4); + this.jk1 = new ArrayList<>(12); + this.jk2 = new ArrayList<>(12); + this.jk3 = new ArrayList<>(12); + this.jk4 = new ArrayList<>(12); + } + + public void SwimToZ(int sector, StateVecs.StateVec fVec, Swim dcSwim, double z0, float[] bf){ + + double stepSize = 0.5; + dcSwim.Bfield(sector, fVec.x, fVec.y, fVec.z, bf); + + fVec.B = Math.sqrt(bf[0]*bf[0]+bf[1]*bf[1]+bf[2]*bf[2]); + double s = fVec.B; + double z = fVec.z; + final double Zi = fVec.z; + double BatMeas = 0; + + while(Math.signum(z0 - Zi) *z 0) { +// C[2][2] += cov_txtx; +// C[2][3] += cov_txty; +// C[3][2] += cov_txty; +// C[3][3] += cov_tyty; +// } + + fVec.x = x; + fVec.y = y ; + fVec.z = z0+h; + fVec.tx = tx; + fVec.ty = ty; + fVec.Q = q; + fVec.B = Math.sqrt(_b[0]*_b[0]+_b[1]*_b[1]+_b[2]*_b[2]); + fVec.deltaPath = Math.sqrt((x0-x)*(x0-x)+(y0-y)*(y0-y)+h*h)+dPath; + fCov.covMat.set(C); + //System.out.println("Transported matrix"); + //Matrix5x5.show(fCov.covMat); + } + + + private double RK4(double k1, double k2, double k3, double k4, double h) { + return h/6*(k1 + 2*k2 +2*k3 + k4); + } + + private double Ax(double tx, double ty, double Bx, double By, double Bz) { + double C = Math.sqrt(1 + tx * tx + ty * ty); + return C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + } + private double Ay(double tx, double ty, double Bx, double By, double Bz) { + double C = Math.sqrt(1 + tx * tx + ty * ty); + return C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + } + + private double delAx_deltx(double tx, double ty, double Bx, double By, double Bz) { + double C2 = 1 + tx * tx + ty * ty; + double C = Math.sqrt(1 + tx * tx + ty * ty); + double Ax = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + double Ay = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + + return tx * Ax / C2 + C * (ty * Bx - 2 * tx * By); //delAx_deltx + } + private double delAx_delty(double tx, double ty, double Bx, double By, double Bz) { + double C2 = 1 + tx * tx + ty * ty; + double C = Math.sqrt(1 + tx * tx + ty * ty); + double Ax = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + double Ay = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + + return ty * Ax / C2 + C * (tx * Bx + Bz); //delAx_delty + } + private double delAy_deltx(double tx, double ty, double Bx, double By, double Bz) { + double C2 = 1 + tx * tx + ty * ty; + double C = Math.sqrt(1 + tx * tx + ty * ty); + double Ax = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + double Ay = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + + return tx * Ay / C2 + C * (-ty * By - Bz); //delAy_deltx + } + private double delAy_delty(double tx, double ty, double Bx, double By, double Bz) { + double C2 = 1 + tx * tx + ty * ty; + double C = Math.sqrt(1 + tx * tx + ty * ty); + double Ax = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + double Ay = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + + return ty * Ay / C2 + C * (-tx * By + 2 * ty * Bx); //delAy_delty + } + + private void A(double tx, double ty, double Bx, double By, double Bz, double[] a) { + + double C = Math.sqrt(1 + tx * tx + ty * ty); + a[0] = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + a[1] = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + } + + private void delA_delt(double tx, double ty, double Bx, double By, double Bz, double[] dela_delt) { + + double C2 = 1 + tx * tx + ty * ty; + double C = Math.sqrt(1 + tx * tx + ty * ty); + double Ax = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + double Ay = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + + dela_delt[0] = tx * Ax / C2 + C * (ty * Bx - 2 * tx * By); //delAx_deltx + dela_delt[1] = ty * Ax / C2 + C * (tx * Bx + Bz); //delAx_delty + dela_delt[2] = tx * Ay / C2 + C * (-ty * By - Bz); //delAy_deltx + dela_delt[3] = ty * Ay / C2 + C * (-tx * By + 2 * ty * Bx); //delAy_delty + } + + private double deltx_deltx0_next(double q, double v, double tx1, double ty1, float b0, float b1, float b2, double deltx_deltx0_1, double delty_deltx0_1) { + return q*v*(delAx_deltx(tx1,ty1,b0,b1,b2)*(deltx_deltx0_1) + + delAx_delty(tx1,ty1,b0,b1,b2)*(delty_deltx0_1)); + } + + private double delty_deltx0_next(double q, double v, double tx1, double ty1, float b0, float b1, float b2, double deltx_deltx0_1, double delty_deltx0_1) { + return q*v*(delAy_deltx(tx1,ty1,b0,b1,b2)*(deltx_deltx0_1) + + delAy_delty(tx1,ty1,b0,b1,b2)*(delty_deltx0_1)); + } + + private double deltx_delty0_next(double q, double v, double tx1, double ty1, float b0, float b1, float b2, double deltx_delty0_1, double delty_delty0_1) { + return q*v*(delAx_delty(tx1,ty1,b0,b1,b2)*(deltx_delty0_1) + + delAx_delty(tx1,ty1,b0,b1,b2)*(delty_delty0_1)); + } + + private double delty_delty0_next(double q, double v, double tx1, double ty1, float b0, float b1, float b2, double deltx_delty0_1, double delty_delty0_1) { + return q*v*(delAy_delty(tx1,ty1,b0,b1,b2)*(deltx_delty0_1) + + delAy_delty(tx1,ty1,b0,b1,b2)*(delty_delty0_1)); + } + + private double deltx_delq0_next(double q, double v, double tx1, double ty1, float b0, float b1, float b2, double deltx_delq0_1, double delty_delq0_1) { + return v*Ax(tx1, ty1, b0, b1, b2) + + q*v*(delAx_deltx(tx1,ty1,b0,b1,b2)*(deltx_delq0_1) + + delAx_delty(tx1,ty1,b0,b1,b2)*(delty_delq0_1)); + } + + private double delty_delq0_next(double q, double v, double tx1, double ty1, float b0, float b1, float b2, double deltx_delq0_1, double delty_delq0_1) { + return v*Ay(tx1, ty1, b0, b1, b2) + + q*v*(delAy_deltx(tx1, ty1,b0,b1,b2)*(deltx_delq0_1) + + delAy_delty(tx1, ty1,b0,b1,b2)*(delty_delq0_1)); + } + + private void getRKn(int sector, ArrayList k1, ArrayList k2, double d, double x0, double y0, double z0, double tx0, double ty0, double q, float[] b) { + + double tx1 = k1.get(2); + double ty1 = k1.get(3); + + double x2 = tx0+d*tx1; + double y2 = ty0+d*ty1; + double tx2=q*v*Ax((tx0+d*tx1), (ty0+d*ty1), b[0], b[1], b[2]); + double ty2=q*v*Ay((tx0+d*tx1), (ty0+d*ty1), b[0], b[1], b[2]); + + k2.add(0, x2); + k2.add(1, y2); + k2.add(2, tx2); + k2.add(3, ty2); + } + + private void getjRKn(int sector, ArrayList k1, ArrayList jk1, ArrayList jk2, double d, double x0, double y0, double z0, double tx0, double ty0, double q, float[] _b, + double deltx_deltx0_0, double delty_deltx0_0, double deltx_delty0_0, double delty_delty0_0, double deltx_delq0_0, double delty_delq0_0) { + + double tx1 = k1.get(2); + double ty1 = k1.get(3); + + double delx_deltx0_1 = jk1.get(0); + double dely_deltx0_1 = jk1.get(1); + double delx_delty0_1 = jk1.get(2); + double dely_delty0_1 = jk1.get(3); + + double deltx_deltx0_1 = jk1.get(4); + double delty_deltx0_1 = jk1.get(5); + double deltx_delty0_1 = jk1.get(6); + double delty_delty0_1 = jk1.get(7); + + double delx_delq0_1 = jk1.get(8); + double dely_delq0_1 = jk1.get(9); + + double deltx_delq0_1 = jk1.get(10); + double delty_delq0_1 = jk1.get(11); + + double delx_deltx0_2 = deltx_deltx0_0+d*deltx_deltx0_1; + double dely_deltx0_2 = delty_deltx0_0+d*delty_deltx0_1; + double delx_delty0_2 = deltx_delty0_0+d*deltx_delty0_1; + double dely_delty0_2 = delty_delty0_0+d*delty_delty0_1; + + double deltx_deltx0_2 = this.deltx_deltx0_next(q,v,tx0+d*tx1,ty0+d*ty1,_b[0],_b[1],_b[2], + deltx_deltx0_0+d*deltx_deltx0_1,delty_deltx0_0+d*delty_deltx0_1); + double delty_deltx0_2 = this.delty_deltx0_next(q,v,tx0+d*tx1,ty0+d*ty1,_b[0],_b[1],_b[2], + deltx_deltx0_0+d*deltx_deltx0_1,delty_deltx0_0+d*delty_deltx0_1); + double deltx_delty0_2 = this.deltx_delty0_next(q,v,tx0+d*tx1,ty0+d*ty1,_b[0],_b[1],_b[2], + deltx_delty0_0+d*deltx_delty0_1,delty_delty0_0+d*delty_delty0_1); + double delty_delty0_2 = this.delty_delty0_next(q,v,tx0+d*tx1,ty0+d*ty1,_b[0],_b[1],_b[2], + deltx_delty0_0+d*deltx_delty0_1,delty_delty0_0+d*delty_delty0_1); + + double delx_delq0_2 = deltx_delq0_0+d*deltx_delq0_1; + double dely_delq0_2 = delty_delq0_0+d*delty_delq0_1; + + double deltx_delq0_2 = this.deltx_delq0_next(q,v,tx0+d*tx1,ty0+d*ty1,_b[0],_b[1],_b[2], + deltx_delq0_0+d*deltx_delq0_1,delty_delq0_0+d*delty_delq0_1); + double delty_delq0_2 = this.delty_delq0_next(q,v,tx0+d*tx1,ty0+d*ty1,_b[0],_b[1],_b[2], + deltx_delq0_0+d*deltx_delq0_1,delty_delq0_0+d*delty_delq0_1); + + jk2.add(0, delx_deltx0_2 ); + jk2.add(1, dely_deltx0_2 ); + jk2.add(2, delx_delty0_2 ); + jk2.add(3, dely_delty0_2 ); + + jk2.add(4, deltx_deltx0_2 ); + jk2.add(5, delty_deltx0_2 ); + jk2.add(6, deltx_delty0_2 ); + jk2.add(7, delty_delty0_2 ); + + jk2.add(8, delx_delq0_2 ); + jk2.add(9, dely_delq0_2 ); + + jk2.add(10, deltx_delq0_2 ); + jk2.add(11, delty_delq0_2 ); + } +} diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/StateVecs.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/StateVecs.java new file mode 100644 index 0000000000..d5155f2a6f --- /dev/null +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/track/fit/StateVecs.java @@ -0,0 +1,508 @@ +package org.jlab.rec.muvt.track.fit; + +import org.jlab.jnp.matrix.*; +import java.util.HashMap; +import java.util.Map; +import org.jlab.clas.pdg.PhysicsConstants; +import org.jlab.clas.swimtools.Swim; + +/** + * + * @author ziegler + */ +public class StateVecs { + private final double Bmax = 2.366498; // averaged + + private final double MuonMass = 0.105658; // GeV/c^2 + + final double speedLight = 0.002997924580; + public double[] Z; + public Map trackTraj = new HashMap(); + public Map trackCov = new HashMap(); + + public StateVec StateVec; + public CovMat CovMat; + public Matrix F = new Matrix(); + private final Matrix fMS = new Matrix(); + private final Matrix copyMatrix = new Matrix(); + private final double[] A = new double[2]; + private final double[] dA = new double[4]; + private final float[] bf = new float[3]; + private final float[] lbf = new float[3]; + private final Swim dcSwim; + private final RungeKutta rk; + + /** + * State vector representing the track in the sector coordinate system at the measurement layer + * @param swimmer + */ + public StateVecs(Swim swimmer) { + dcSwim = swimmer; + rk = new RungeKutta(); + } + + /** + * + * @param sector + * @param i initial state vector index + * @param Zf + * @param iVec state vector at the initial index + * @param covMat state covariance matrix at the initial index + * @return + */ + public Matrix transport(int sector, int i, double Zf, StateVec iVec, CovMat covMat) { // s = signed step-size + double stepSize = 1.0; + StateVecs.StateVec fVec = new StateVec(0); + CovMat fCov = new CovMat(0); + fVec.x = iVec.x; + fVec.y = iVec.y; + fVec.z = iVec.z; + fVec.tx = iVec.tx; + fVec.ty = iVec.ty; + fVec.Q = iVec.Q; + fVec.B = iVec.B; + + Matrix5x5.copy(covMat.covMat, fCov.covMat); + double s = 0; + double z = Z[i]; + double BatMeas = iVec.B; + + while(Math.signum(Zf - Z[i]) *zMath.signum(Zf - Z[i]) *Zf) + s=Math.signum(Zf - Z[i]) *Math.abs(Zf-z); + + rk.RK4transport(sector, Q, x, y, z, tx, ty, s, dcSwim, + covMat, fVec, fCov, dPath); + + // Q process noise matrix estimate + + double p = Math.abs(1. / iVec.Q); + + double X0 = this.getX0(z); + double t_ov_X0 = Math.abs(s) / X0;//path length in radiation length units = t/X0 [true path length/ X0] ; Ar radiation length = 14 cm + + double energy = Math.sqrt(p*p + MuonMass * MuonMass); + double beta = p/energy; + if(beta>1.0 || beta<=0) + beta =1.0; + + double sctRMS = 0; + + if(Math.abs(s)>0) + sctRMS = ((0.0136)/(beta*PhysicsConstants.speedOfLight()*p))*Math.sqrt(t_ov_X0)* + (1 + 0.038 * Math.log(t_ov_X0)); + + double cov_txtx = (1 + tx * tx) * (1 + tx * tx + ty * ty) * sctRMS * sctRMS; + double cov_tyty = (1 + ty * ty) * (1 + tx * tx + ty * ty) * sctRMS * sctRMS; + double cov_txty = tx * ty * (1 + tx * tx + ty * ty) * sctRMS * sctRMS; + + fMS.set( + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, cov_txtx, cov_txty, 0, + 0, 0, cov_txty, cov_tyty, 0, + 0, 0, 0, 0, 0 + ); + + Matrix5x5.copy(fCov.covMat, copyMatrix); + Matrix5x5.add(copyMatrix, fMS, fCov.covMat); + + // end add process noise + if (Math.abs(fVec.B - BatMeas) < 0.0001) stepSize*=2; + BatMeas = fVec.B; + } + + return fCov.covMat; + } + + /** + * + * @param sector + * @param i initial state vector index + * @param f final state vector index + * @param iVec state vector at the initial index + * @param covMat state covariance matrix at the initial index + */ + public void transport(int sector, int i, int f, StateVec iVec, CovMat covMat) { // s = signed step-size + if(iVec==null) + return; + double stepSize = 1.0; + StateVecs.StateVec fVec = new StateVec(f); + CovMat fCov = new CovMat(f); + fVec.x = iVec.x; + fVec.y = iVec.y; + fVec.z = iVec.z; + fVec.tx = iVec.tx; + fVec.ty = iVec.ty; + fVec.Q = iVec.Q; + fVec.B = iVec.B; + //fCov.covMat = covMat.covMat; + Matrix5x5.copy(covMat.covMat, fCov.covMat); + double s = 0; + double z = Z[i]; + double BatMeas = iVec.B; + + while(Math.signum(Z[f] - Z[i]) *zMath.signum(Z[f] - Z[i]) *Z[f]) + s=Math.signum(Z[f] - Z[i]) *Math.abs(Z[f]-z); + + rk.RK4transport(sector, Q, x, y, z, tx, ty, s, dcSwim, + covMat, fVec, fCov, dPath); + + // Q process noise matrix estimate + + double p = Math.abs(1. / iVec.Q); + + double X0 = this.getX0(z); + double t_ov_X0 = Math.abs(s) / X0;//path length in radiation length units = t/X0 [true path length/ X0] ; Ar radiation length = 14 cm + + double beta = this.beta; + if(beta>1.0 || beta<=0) + beta =1.0; + + double sctRMS = 0; + + if(Math.abs(s)>0) + sctRMS = ((0.0136)/(beta*PhysicsConstants.speedOfLight()*p))*Math.sqrt(t_ov_X0)* + (1 + 0.038 * Math.log(t_ov_X0)); + + + double cov_txtx = (1 + tx * tx) * (1 + tx * tx + ty * ty) * sctRMS * sctRMS; + double cov_tyty = (1 + ty * ty) * (1 + tx * tx + ty * ty) * sctRMS * sctRMS; + double cov_txty = tx * ty * (1 + tx * tx + ty * ty) * sctRMS * sctRMS; + + + //if (Math.signum(Z[f] - Z[i]) > 0) { + fMS.set( + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, cov_txtx, cov_txty, 0, + 0, 0, cov_txty, cov_tyty, 0, + 0, 0, 0, 0, 0 + ); + + Matrix5x5.copy(fCov.covMat, copyMatrix); + Matrix5x5.add(copyMatrix, fMS, fCov.covMat); + + //} + // end add process noise + + if( Math.abs(fVec.B - BatMeas)<0.0001) + stepSize*=2; + + BatMeas = fVec.B; + } + this.trackTraj.put(f, fVec); + this.trackCov.put(f, fCov); + } + double AIRRADLEN = 30400; // radiation length in cm + public double getX0(double z) { + + return AIRRADLEN; + } + /** + * + * @param i initial state vector index + * @param f final state vector index + * @param iVec state vector at the initial index + * @param covMat state covariance matrix at the initial index + */ + public void transportFixed(int sector, int i, int f, StateVec iVec, CovMat covMat) { // s = signed step-size + if(iVec==null) + return; + double stepSize = 0.5; + + StateVecs.StateVec fVec = new StateVec(f); + StateVecs.CovMat fCov = new CovMat(f); + fVec.x = iVec.x; + fVec.y = iVec.y; + fVec.z = iVec.z; + fVec.tx = iVec.tx; + fVec.ty = iVec.ty; + fVec.Q = iVec.Q; + fCov.covMat = covMat.covMat; + int nSteps = (int) (Math.abs((Z[i] - Z[f]) / stepSize) + 1); + + double s = (Z[f] - Z[i]) / (double) nSteps; + double z = Z[i]; + + for (int j = 0; j < nSteps; j++) { + // get the sign of the step + if (j == nSteps - 1) { + s = Math.signum(Z[f] - Z[i]) * Math.abs(z - Z[f]); + } + //System.out.println(" RK step num "+(j+1)+" = "+(float)s+" nSteps = "+nSteps); + double x = fVec.x; + double y = fVec.y; + z = fVec.z; + double tx = fVec.tx; + double ty = fVec.ty; + double Q = fVec.Q; + double dPath = fVec.deltaPath; + covMat.covMat = fCov.covMat; + + rk.RK4transport(sector, Q, x, y, z, tx, ty, s, dcSwim, + covMat, fVec, fCov, dPath); + + } + + this.trackTraj.put(f, fVec); + this.trackCov.put(f, fCov); + } + + + private void A(double tx, double ty, double Bx, double By, double Bz, double[] a) { + + double C = Math.sqrt(1 + tx * tx + ty * ty); + a[0] = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + a[1] = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + } + + private void delA_delt(double tx, double ty, double Bx, double By, double Bz, double[] dela_delt) { + + double C2 = 1 + tx * tx + ty * ty; + double C = Math.sqrt(1 + tx * tx + ty * ty); + double Ax = C * (ty * (tx * Bx + Bz) - (1 + tx * tx) * By); + double Ay = C * (-tx * (ty * By + Bz) + (1 + ty * ty) * Bx); + + dela_delt[0] = tx * Ax / C2 + C * (ty * Bx - 2 * tx * By); //delAx_deltx + dela_delt[1] = ty * Ax / C2 + C * (tx * Bx + Bz); //delAx_delty + dela_delt[2] = tx * Ay / C2 + C * (-ty * By - Bz); //delAy_deltx + dela_delt[3] = ty * Ay / C2 + C * (-tx * By + 2 * ty * Bx); //delAy_delty + } + + + private double beta = 1.0; + + /** + * + * @param sector + * @param xVtx + * @param yVtx + * @param zVtx + * @param z0 the value in z to which the track is swam back to + * @param pyVtx + * @param pzVtx + * @param q + * @param kf the final state measurement index + * @param pxVtx + * @param c + */ + public void init(int sector, double xVtx, double yVtx, double zVtx, + double pxVtx, double pyVtx, double pzVtx, + int q, + double z0, KFitter kf, int c) { + + StateVec initSV = new StateVec(0); + initSV.x = xVtx; + initSV.y = yVtx; + initSV.z = zVtx; + initSV.tx = pxVtx/pzVtx; + initSV.ty = pyVtx/pzVtx; + double p = Math.sqrt(pxVtx*pxVtx+pyVtx*pyVtx+pzVtx*pzVtx); + initSV.Q = (double)q / p; + + rk.SwimToZ(sector, initSV, dcSwim, z0, bf); + + if (initSV != null) { + + this.trackTraj.put(0, initSV); + } else { + kf.setFitFailed = true; + return; + } + + CovMat initCM = new CovMat(0); + StateVec rinitSV = new StateVec(0); + rinitSV.x = xVtx; + rinitSV.y = yVtx; + rinitSV.z = zVtx; + rinitSV.tx = pxVtx/pzVtx; + rinitSV.ty = pyVtx/pzVtx; + rinitSV.Q = (double)q / p; + /* + double[] FTF = new double[25]; + double[] F = this.F(sector, z0, rinitSV); + for(int i = 0; i<5; i++) { + FTF[i*5+i]=F[i]*F[i]; + } + Matrix initCMatrix = new Matrix(); + initCMatrix.set(FTF); + initCM.covMat = initCMatrix; + */ + Matrix initCMatrix = new Matrix(); + initCMatrix.set(8 * 8, 0, 0, 0, 0, + 0, 8 * 8, 0, 0, 0, + 0, 0, 0.1 * 0.1, 0, 0, + 0, 0, 0, 0.1 * 0.1, 0, + 0, 0, 0, 0, 0.03 * 0.03 + ); + initCM.covMat = initCMatrix; + + this.trackCov.put(0, initCM); + } + private StateVec reset(StateVec SVplus, StateVec stateVec) { + SVplus = new StateVec(stateVec.k); + SVplus.x = stateVec.x; + SVplus.y = stateVec.y; + SVplus.tx = stateVec.tx; + SVplus.ty = stateVec.ty; + SVplus.z = stateVec.z; + SVplus.Q = stateVec.Q; + + return SVplus; + } + private void swimToSite(int sector, double z0, + StateVec SVplus, StateVec SVminus) { + + rk.SwimToZ(sector, SVplus, dcSwim, z0, bf); + rk.SwimToZ(sector, SVminus, dcSwim, z0, bf); + } + + double[] F(int sector, double z0, StateVec stateVec) { + double[] _F = new double[5]; + StateVec SVplus = null; + StateVec SVminus = null; + + SVplus = this.reset(SVplus, stateVec); + SVminus = this.reset(SVminus, stateVec); + + double delt_x = 0.05; + SVplus.x += delt_x/2.; + SVminus.x-= delt_x/2.; + + this.swimToSite(sector, z0, SVplus, SVminus); + + _F[0] = (SVplus.x - SVminus.x)/delt_x; + + SVplus = this.reset(SVplus, stateVec); + SVminus = this.reset(SVminus, stateVec); + + double delt_y = 0.05; + SVplus.y += delt_y/2.; + SVminus.y-= delt_y/2.; + + this.swimToSite(sector, z0, SVplus, SVminus); + + _F[1] = (SVplus.y - SVminus.y)/delt_y; + + SVplus = this.reset(SVplus, stateVec); + SVminus = this.reset(SVminus, stateVec); + + double delt_tx = 0.001; + SVplus.tx += delt_tx/2.; + SVminus.tx-= delt_tx/2.; + + this.swimToSite(sector, z0, SVplus, SVminus); + + _F[2] = (SVplus.tx - SVminus.tx)/delt_tx; + + SVplus = this.reset(SVplus, stateVec); + SVminus = this.reset(SVminus, stateVec); + + double delt_ty = 0.001; + SVplus.ty += delt_ty/2.; + SVminus.ty-= delt_ty/2.; + + this.swimToSite(sector, z0, SVplus, SVminus); + + _F[3] = (SVplus.ty - SVminus.ty)/delt_ty; + + SVplus = this.reset(SVplus, stateVec); + SVminus = this.reset(SVminus, stateVec); + + + _F[4] = 0.01/Math.abs(SVplus.Q); + + return _F; + + } + + public void printMatrix(Matrix C) { + for (int k = 0; k < 5; k++) { + for (int j = 0; j < 5; j++) { + System.out.println("C["+j+"]["+k+"] = "+C.get(j, k)); + } + } + } + + /** + * The state vector representing the track at a given measurement site + */ + public class StateVec { + + final int k; //index + public double z; //z (fixed measurement planes) + public double x; //track x in the tilted sector coordinate system at z + public double y; //track y in the tilted sector coordinate system at z + public double tx; //track px/pz in the tilted sector coordinate system at z + public double ty; //track py/pz in the tilted sector coordinate system at z + public double Q; //track q/p + double B; + double deltaPath; + + StateVec(int k) { + this.k = k; + } + + public double getPx() { + return this.getPz()*tx; + } + + public double getPy() { + return this.getPz()*ty; + } + + public double getPz() { + double pz = this.getP()/Math.sqrt(tx*tx+ty*ty+1); + return pz; + } + + public double getP() { + return 1./Math.abs(this.Q); + } + + + + String printInfo() { + return this.k+"] = "+(float)this.x+", "+(float)this.y+", "+(float)this.z+", " + +(float)this.tx+", "+(float)this.ty+", "+(float)this.Q+" B = "+(float)this.B; + } + } + /** + * The track covariance matrix + */ + public class CovMat { + + final int k; + public Matrix covMat = new Matrix(); + + CovMat(int k) { + this.k = k; + } + + } +} diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 8482f1f3e1..7be3fc771b 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -40,6 +40,7 @@ recoil calib uber + mu From 88d9bdaf07a66450054ee2b27b1d930dae7c253f Mon Sep 17 00:00:00 2001 From: Tongtong Cao Date: Fri, 20 Mar 2026 15:19:27 -0400 Subject: [PATCH 092/190] update calculated doca in KF processing (#1108) --- .../clas/tracking/kalmanfilter/AMeasVecs.java | 20 ++++-- .../kalmanfilter/zReference/KFitter.java | 70 ++++++++++++------- .../zReference/KFitterStraight.java | 30 +++++--- .../kalmanfilter/zReference/MeasVecs.java | 32 +++++++-- 4 files changed, 105 insertions(+), 47 deletions(-) diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/AMeasVecs.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/AMeasVecs.java index c20bcdfd80..50c25ae412 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/AMeasVecs.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/AMeasVecs.java @@ -10,6 +10,7 @@ import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; import org.jlab.geom.prim.Transformation3D; +import org.jlab.geom.prim.Vector3D; /** * @@ -50,7 +51,9 @@ public double[] dhDoca(int k, StateVec stateVec) { Surface surf = this.measurements.get(stateVec.k).surface; Point3D point = new Point3D(stateVec.x, stateVec.y, stateVec.z); - double h = hDoca(point, surf.wireLine[0]); + Vector3D dir = new Vector3D(stateVec.tx, stateVec.ty, 1); + Line3D line = new Line3D(point, dir); + double h = hDoca(line, surf.wireLine[0]); double signMeas = 1; double sign = 1; @@ -66,7 +69,7 @@ public double[] dhDoca(int k, StateVec stateVec) { //USE THE DOUBLE HIT if(surf.doca[1]!=-99) { - h = hDoca(point, surf.wireLine[1]); + h = hDoca(line, surf.wireLine[1]); signMeas = Math.signum(surf.doca[1]); sign = Math.signum(h); @@ -78,13 +81,20 @@ public double[] dhDoca(int k, StateVec stateVec) { } // Return a signed doca for DC - public double hDoca(Point3D point, Line3D wireLine) { + // Suppose that trajectory is line at the given layer, which is defined by the state vector with point(x, y, z) and dir(tx, ty, 1) + public double hDoca(Line3D trajLine, Line3D wireLine) { + // Define sign of calculated doca to be consistent with LR definition of measured doca Line3D WL = new Line3D(); WL.copy(wireLine); - WL.copy(WL.distance(point)); + WL.copy(WL.distance(trajLine.origin())); - return WL.length()*Math.signum(WL.direction().x()); + // Get a line, which is commonly perpendicular to trajectory line and wire line + Line3D cpLine = new Line3D(); + cpLine.copy(trajLine); + cpLine.copy(cpLine.distance(wireLine)); + + return cpLine.length()*Math.signum(WL.direction().x()); } public double dh(int k, StateVec stateVec) { diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java index 8b2f038c10..2ecff1db9e 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitter.java @@ -15,6 +15,8 @@ import org.jlab.clas.tracking.utilities.RungeKuttaDoca; import org.jlab.clas.tracking.utilities.MatrixOps.Libr; import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; +import org.jlab.geom.prim.Line3D; import org.jlab.jnp.matrix.*; /** @@ -592,7 +594,7 @@ private boolean filter(int k, boolean forward, double annealingFactor) { double[] K = new double[5]; double V = effectiveVar; - double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), mVec.surface.wireLine[0]); + double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), sVec.tx, sVec.ty, mVec.surface.wireLine[0]); Matrix CaInv = this.filterCovMat(H, sVec.CM, V); if (CaInv != null) { Matrix5x5.copy(CaInv, cMat); @@ -607,7 +609,9 @@ private boolean filter(int k, boolean forward, double annealingFactor) { } Point3D point = new Point3D(sVec.x, sVec.y, mVec.surface.measPoint.z()); - double h = mv.hDoca(point, mVec.surface.wireLine[0]); + Vector3D dir = new Vector3D(sVec.tx, sVec.ty, 1); + Line3D line = new Line3D(point, dir); + double h = mv.hDoca(line, mVec.surface.wireLine[0]); c2 = (effectiveDoca - h) * (effectiveDoca - h) / V; @@ -623,7 +627,9 @@ private boolean filter(int k, boolean forward, double annealingFactor) { + K[4] * (effectiveDoca - h); Point3D pointFiltered = new Point3D(x_filt, y_filt, mVec.surface.measPoint.z()); - double h0 = mv.hDoca(pointFiltered, mVec.surface.wireLine[0]); + Vector3D dirFiltered = new Vector3D(tx_filt, ty_filt, 1); + Line3D lineFiltered = new Line3D(pointFiltered, dirFiltered); + double h0 = mv.hDoca(lineFiltered, mVec.surface.wireLine[0]); double residual = effectiveDoca - h0; updatedWeights_singleHit = daf.calc_updatedWeight_singleHit(residual, annealingFactor); @@ -644,7 +650,7 @@ private boolean filter(int k, boolean forward, double annealingFactor) { double[] K = new double[5]; double V = effectiveVar; - double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), mVec.surface.wireLine[indexReferenceWire]); + double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), sVec.tx, sVec.ty, mVec.surface.wireLine[indexReferenceWire]); Matrix CaInv = this.filterCovMat(H, sVec.CM, V); if (CaInv != null) { Matrix5x5.copy(CaInv, cMat); @@ -659,7 +665,9 @@ private boolean filter(int k, boolean forward, double annealingFactor) { } Point3D point = new Point3D(sVec.x, sVec.y, mVec.surface.measPoint.z()); - double h = mv.hDoca(point, mVec.surface.wireLine[indexReferenceWire]); + Vector3D dir = new Vector3D(sVec.tx, sVec.ty, 1); + Line3D line = new Line3D(point, dir); + double h = mv.hDoca(line, mVec.surface.wireLine[indexReferenceWire]); c2 = (effectiveDoca - h) * (effectiveDoca - h) / V; @@ -675,8 +683,10 @@ private boolean filter(int k, boolean forward, double annealingFactor) { + K[4] * (effectiveDoca - h); Point3D pointFiltered = new Point3D(x_filt, y_filt, mVec.surface.measPoint.z()); - double h0 = mv.hDoca(pointFiltered, mVec.surface.wireLine[0]); - double h1 = mv.hDoca(pointFiltered, mVec.surface.wireLine[1]); + Vector3D dirFiltered = new Vector3D(tx_filt, ty_filt, 1); + Line3D lineFiltered = new Line3D(pointFiltered, dirFiltered); + double h0 = mv.hDoca(lineFiltered, mVec.surface.wireLine[0]); + double h1 = mv.hDoca(lineFiltered, mVec.surface.wireLine[1]); double[] residuals = {mVec.surface.doca[0] - h0, mVec.surface.doca[1] - h1}; updatedWeights_doubleHits = daf.calc_updatedWeights_doubleHits(residuals, annealingFactor); } @@ -725,7 +735,7 @@ private boolean filter(int k, boolean forward) { double[] K = new double[5]; double V = mVec.surface.unc[0] * KFScale; - double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), mVec.surface.wireLine[0]); + double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), sVec.tx, sVec.ty, mVec.surface.wireLine[0]); Matrix CaInv = this.filterCovMat(H, sVec.CM, V); Matrix cMat = new Matrix(); if (CaInv != null) { @@ -741,7 +751,9 @@ private boolean filter(int k, boolean forward) { } Point3D point = new Point3D(sVec.x, sVec.y, mVec.surface.measPoint.z()); - double h = mv.hDoca(point, mVec.surface.wireLine[0]); + Vector3D dir = new Vector3D(sVec.tx, sVec.ty, 1); + Line3D line = new Line3D(point, dir); + double h = mv.hDoca(line, mVec.surface.wireLine[0]); double signMeas = 1; double sign = 1; @@ -774,8 +786,7 @@ private boolean filter(int k, boolean forward) { if (mVec.surface.doca[1] != -99) { // now filter using the other Hit V = mVec.surface.unc[1] * KFScale; - H = mv.H(x_filt, y_filt, mVec.surface.measPoint.z(), - mVec.surface.wireLine[1]); + H = mv.H(x_filt, y_filt, mVec.surface.measPoint.z(), tx_filt, ty_filt, mVec.surface.wireLine[1]); CaInv = this.filterCovMat(H, cMat, V); if (CaInv != null) { for (int i = 0; i < 5; i++) { @@ -791,8 +802,9 @@ private boolean filter(int k, boolean forward) { } Point3D point2 = new Point3D(x_filt, y_filt, mVec.surface.measPoint.z()); - - h = mv.hDoca(point2, mVec.surface.wireLine[1]); + Vector3D dir2 = new Vector3D(tx_filt, ty_filt, 1); + Line3D line2 = new Line3D(point2, dir2); + h = mv.hDoca(line2, mVec.surface.wireLine[1]); signMeas = Math.signum(mVec.surface.doca[1]); sign = Math.signum(h); @@ -889,7 +901,9 @@ public void calcFinalChisq(int sector, boolean nofilter) { double V0 = mv.measurements.get(0).surface.unc[0]; Point3D point = new Point3D(svc.x, svc.y, mv.measurements.get(0).surface.measPoint.z()); - double h0 = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[0]); + Vector3D dir = new Vector3D(svc.tx, svc.ty, 1); + Line3D line = new Line3D(point, dir); + double h0 = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[0]); svc.setProjector(mv.measurements.get(0).surface.wireLine[0].origin().x()); svc.setProjectorDoca(h0); @@ -900,7 +914,7 @@ public void calcFinalChisq(int sector, boolean nofilter) { //USE THE DOUBLE HIT if (mv.measurements.get(0).surface.doca[1] != -99) { V0 = mv.measurements.get(0).surface.unc[1]; - h0 = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[1]); + h0 = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[1]); res = (mv.measurements.get(0).surface.doca[1] - h0); chi2 += (mv.measurements.get(0).surface.doca[1] - h0) * (mv.measurements.get(0).surface.doca[1] - h0) / V0; nRj[mv.measurements.get(0).region - 1] += res * res / mv.measurements.get(0).error; @@ -922,8 +936,10 @@ public void calcFinalChisq(int sector, boolean nofilter) { double V = mv.measurements.get(k1 + 1).surface.unc[0]; point = new Point3D(sv.transported(forward).get(k1 + 1).x, sv.transported(forward).get(k1 + 1).y, mv.measurements.get(k1 + 1).surface.measPoint.z()); + dir = new Vector3D(sv.transported(forward).get(k1 + 1).tx, sv.transported(forward).get(k1 + 1).ty, 1); + line = new Line3D(point, dir); - double h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[0]); + double h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[0]); svc = sv.transported(forward).get(k1 + 1); path += (forward ? 1 : -1) * svc.deltaPath; svc.setPathLength(path); @@ -936,7 +952,7 @@ public void calcFinalChisq(int sector, boolean nofilter) { //USE THE DOUBLE HIT if (mv.measurements.get(k1 + 1).surface.doca[1] != -99) { V = mv.measurements.get(k1 + 1).surface.unc[1]; - h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[1]); + h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[1]); res = (mv.measurements.get(k1 + 1).surface.doca[1] - h); chi2 += (mv.measurements.get(k1 + 1).surface.doca[1] - h) * (mv.measurements.get(k1 + 1).surface.doca[1] - h) / V; nRj[mv.measurements.get(k1 + 1).region - 1] += res * res / V; @@ -982,6 +998,8 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { svc.setPathLength(path); Point3D point = new Point3D(svc.x, svc.y, mv.measurements.get(0).surface.measPoint.z()); + Vector3D dir = new Vector3D(svc.tx, svc.ty, 1); + Line3D line = new Line3D(point, dir); if(mv.measurements.get(0).surface.doca[1] == -99) { StateVec sVecPreviousFiltered = sv.filtered(true).get(0); double daf_weight = 1; @@ -995,7 +1013,7 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { double effectiveDoca = daf.get_EffectiveDoca(); double effectiveVar = daf.get_EffectiveVar(); - double h = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[0]); + double h = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[0]); double res = (effectiveDoca - h); chi2 += res*res / effectiveVar; ndfDAF += daf_weight; @@ -1020,12 +1038,12 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { double effectiveVar = daf.get_EffectiveVar(); int indexReferenceWire = daf.get_IndexReferenceWire(); - double h = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[indexReferenceWire]); + double h = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[indexReferenceWire]); double res = (effectiveDoca - h); chi2 += res*res / effectiveVar; ndfDAF += (daf_weights[0] + daf_weights[1]); - h = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[0]); + h = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[0]); svc.setProjectorDoca(h); svc.setProjector(mv.measurements.get(0).surface.wireLine[0].origin().x()); svc.setFinalDAFWeight(daf_weights[0]); @@ -1033,7 +1051,7 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { kfStateVecsAlongTrajectory.add(svc); StateVec svc2 = sv.new StateVec(svc); - h = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[1]); + h = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[1]); svc2.setProjectorDoca(h); svc2.setProjector(mv.measurements.get(0).surface.wireLine[1].origin().x()); svc2.setFinalDAFWeight(daf_weights[1]); @@ -1054,6 +1072,8 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { svc.setPathLength(path); point = new Point3D(sv.transported(forward).get(k1 + 1).x, sv.transported(forward).get(k1 + 1).y, mv.measurements.get(k1 + 1).surface.measPoint.z()); + dir = new Vector3D(sv.transported(forward).get(k1 + 1).tx, sv.transported(forward).get(k1 + 1).ty, 1); + line = new Line3D(point, dir); if(mv.measurements.get(k1 + 1).surface.doca[1] == -99) { StateVec sVecPreviousFiltered = sv.filtered(true).get(k1 + 1); double daf_weight = 1; @@ -1067,7 +1087,7 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { double effectiveDoca = daf.get_EffectiveDoca(); double effectiveVar = daf.get_EffectiveVar(); - double h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[0]); + double h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[0]); double res = (effectiveDoca - h); chi2 += res*res / effectiveVar; ndfDAF += daf_weight; @@ -1092,12 +1112,12 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { double effectiveVar = daf.get_EffectiveVar(); int indexReferenceWire = daf.get_IndexReferenceWire(); - double h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[indexReferenceWire]); + double h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[indexReferenceWire]); double res = (effectiveDoca - h); chi2 += res*res / effectiveVar; ndfDAF += (daf_weights[0] + daf_weights[1]); - h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[0]); + h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[0]); svc.setProjectorDoca(h); svc.setProjector(mv.measurements.get(k1 + 1).surface.wireLine[0].origin().x()); svc.setFinalDAFWeight(daf_weights[0]); @@ -1105,7 +1125,7 @@ private void calcFinalChisqDAF(int sector, boolean nofilter) { kfStateVecsAlongTrajectory.add(svc); StateVec svc2 = sv.new StateVec(svc); - h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[1]); + h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[1]); svc2.setProjectorDoca(h); svc2.setProjector(mv.measurements.get(k1 + 1).surface.wireLine[1].origin().x()); svc2.setFinalDAFWeight(daf_weights[1]); diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitterStraight.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitterStraight.java index 8218df35d9..60943ac4c8 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitterStraight.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/KFitterStraight.java @@ -13,7 +13,9 @@ import org.jlab.clas.tracking.kalmanfilter.zReference.StateVecs; import org.jlab.clas.tracking.utilities.RungeKuttaDoca; import org.jlab.clas.tracking.utilities.MatrixOps.Libr; +import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; import org.jlab.jnp.matrix.*; /** @@ -272,7 +274,7 @@ private boolean filter(int k, boolean forward) { double[] K = new double[5]; double V = mVec.surface.unc[0] * KFScale; - double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), mVec.surface.wireLine[0]); + double[] H = mv.H(sVec.x, sVec.y, mVec.surface.measPoint.z(), sVec.tx, sVec.ty, mVec.surface.wireLine[0]); Matrix CaInv = this.filterCovMat(H, sVec.CM, V); Matrix cMat = new Matrix(); if (CaInv != null) { @@ -288,7 +290,9 @@ private boolean filter(int k, boolean forward) { } Point3D point = new Point3D(sVec.x, sVec.y, mVec.surface.measPoint.z()); - double h = mv.hDoca(point, mVec.surface.wireLine[0]); + Vector3D dir = new Vector3D(sVec.tx, sVec.ty, 1); + Line3D line = new Line3D(point, dir); + double h = mv.hDoca(line, mVec.surface.wireLine[0]); double signMeas = 1; double sign = 1; @@ -321,7 +325,7 @@ private boolean filter(int k, boolean forward) { if (mVec.surface.doca[1] != -99) { // now filter using the other Hit V = mVec.surface.unc[1] * KFScale; - H = mv.H(x_filt, y_filt, mVec.surface.measPoint.z(), mVec.surface.wireLine[1]); + H = mv.H(x_filt, y_filt, mVec.surface.measPoint.z(), tx_filt, ty_filt, mVec.surface.wireLine[1]); CaInv = this.filterCovMat(H, cMat, V); if (CaInv != null) { for (int i = 0; i < 5; i++) { @@ -337,8 +341,10 @@ private boolean filter(int k, boolean forward) { } Point3D point2 = new Point3D(x_filt, y_filt, mVec.surface.measPoint.z()); + Vector3D dir2 = new Vector3D(tx_filt, ty_filt, 1); + Line3D line2 = new Line3D(point2, dir2); - h = mv.hDoca(point2, mVec.surface.wireLine[1]); + h = mv.hDoca(line2, mVec.surface.wireLine[1]); signMeas = Math.signum(mVec.surface.doca[1]); sign = Math.signum(h); @@ -436,8 +442,10 @@ private void calcFinalChisq(int sector, boolean nofilter) { double V0 = mv.measurements.get(0).surface.unc[0]; - Point3D point = new Point3D(svc.x, svc.y, mv.measurements.get(0).surface.measPoint.z()); - double h0 = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[0]); + Point3D point = new Point3D(svc.x, svc.y, mv.measurements.get(0).surface.measPoint.z()); + Vector3D dir = new Vector3D(sVec.tx, sVec.ty, 1); + Line3D line = new Line3D(point, dir); + double h0 = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[0]); svc.setProjector(mv.measurements.get(0).surface.wireLine[0].origin().x()); svc.setProjectorDoca(h0); @@ -448,7 +456,7 @@ private void calcFinalChisq(int sector, boolean nofilter) { //USE THE DOUBLE HIT if(mv.measurements.get(0).surface.doca[1]!=-99) { V0 = mv.measurements.get(0).surface.unc[1]; - h0 = mv.hDoca(point, mv.measurements.get(0).surface.wireLine[1]); + h0 = mv.hDoca(line, mv.measurements.get(0).surface.wireLine[1]); res = (mv.measurements.get(0).surface.doca[1] - h0); chi2 += (mv.measurements.get(0).surface.doca[1] - h0) * (mv.measurements.get(0).surface.doca[1] - h0) / V0; nRj[mv.measurements.get(0).region-1]+=res*res/mv.measurements.get(0).error; @@ -470,9 +478,11 @@ private void calcFinalChisq(int sector, boolean nofilter) { double V = mv.measurements.get(k1 + 1).surface.unc[0]; - point = new Point3D(sv.transported(forward).get(k1+1).x, sv.transported(forward).get(k1+1).y, mv.measurements.get(k1+1).surface.measPoint.z()); + point = new Point3D(sv.transported(forward).get(k1+1).x, sv.transported(forward).get(k1+1).y, mv.measurements.get(k1+1).surface.measPoint.z()); + dir = new Vector3D(sv.transported(forward).get(k1+1).tx, sv.transported(forward).get(k1+1).ty, 1); + line = new Line3D(point, dir); - double h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[0]); + double h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[0]); svc = sv.transported(forward).get(k1+1); path += (forward ? 1 : -1) * svc.deltaPath; svc.setPathLength(path); @@ -485,7 +495,7 @@ private void calcFinalChisq(int sector, boolean nofilter) { //USE THE DOUBLE HIT if(mv.measurements.get(k1 + 1).surface.doca[1]!=-99) { V = mv.measurements.get(k1 + 1).surface.unc[1]; - h = mv.hDoca(point, mv.measurements.get(k1 + 1).surface.wireLine[1]); + h = mv.hDoca(line, mv.measurements.get(k1 + 1).surface.wireLine[1]); res = (mv.measurements.get(k1 + 1).surface.doca[1] - h); chi2 += (mv.measurements.get(k1 + 1).surface.doca[1] - h) * (mv.measurements.get(k1 + 1).surface.doca[1] - h) / V; nRj[mv.measurements.get(k1 + 1).region-1]+=res*res/V; diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/MeasVecs.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/MeasVecs.java index 8814ca17ea..60ce46189e 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/MeasVecs.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/zReference/MeasVecs.java @@ -10,6 +10,7 @@ import org.jlab.clas.tracking.kalmanfilter.AStateVecs.StateVec; import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; /** * @@ -17,23 +18,40 @@ */ public class MeasVecs extends AMeasVecs { - public double[] H(double x, double y, double z, Line3D wireLine) { + public double[] H(double x, double y, double z, double tx, double ty, Line3D wireLine) { double[] hMatrix = new double[5]; double Err = 0.025; - double[][] Result = new double[2][2]; + double Err_dir = 0.00025; + double[][] Result = new double[2][4]; for (int i = 0; i < 2; i++) { Point3D point = new Point3D(x + (double) Math.pow(-1, i) * Err, y, z); - Result[i][0] = hDoca(point, wireLine); + Vector3D dir = new Vector3D(tx, ty, 1); + Line3D line = new Line3D(point, dir); + Result[i][0] = hDoca(line, wireLine); } for (int i = 0; i < 2; i++) { Point3D point = new Point3D(x, y + (double) Math.pow(-1, i) * Err, z); - Result[i][1] = hDoca(point, wireLine); + Vector3D dir = new Vector3D(tx, ty, 1); + Line3D line = new Line3D(point, dir); + Result[i][1] = hDoca(line, wireLine); } - + for (int i = 0; i < 2; i++) { + Point3D point = new Point3D(x, y, z); + Vector3D dir = new Vector3D(tx + (double) Math.pow(-1, i) * Err_dir, ty, 1); + Line3D line = new Line3D(point, dir); + Result[i][2] = hDoca(line, wireLine); + } + for (int i = 0; i < 2; i++) { + Point3D point = new Point3D(x, y, z); + Vector3D dir = new Vector3D(tx, ty + (double) Math.pow(-1, i) * Err_dir, 1); + Line3D line = new Line3D(point, dir); + Result[i][3] = hDoca(line, wireLine); + } + hMatrix[0] = (Result[0][0] - Result[1][0]) / (2. * Err); hMatrix[1] = (Result[0][1] - Result[1][1]) / (2. * Err); - hMatrix[2] = 0; - hMatrix[3] = 0; + hMatrix[2] = (Result[0][2] - Result[1][2]) / (2. * Err_dir); + hMatrix[3] = (Result[0][3] - Result[1][3]) / (2. * Err_dir); hMatrix[4] = 0; return hMatrix; From d3d1fe763ca61162b30d8baf1e6bcb43122bcba5 Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Fri, 20 Mar 2026 22:21:34 -0400 Subject: [PATCH 093/190] avoid call to method that recalibrates already-calibrated dsc2 (#1153) --- .../src/main/java/org/jlab/detector/scalers/DaqScalers.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java index a08b4955f8..e6c7a84a38 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/scalers/DaqScalers.java @@ -150,8 +150,12 @@ public static DaqScalers create(Bank rawScalerBank,IndexedTable fcupTable,Indexe * @return */ public static DaqScalers create(Bank rawScalerBank,IndexedTable fcupTable,IndexedTable slmTable,IndexedTable helTable,IndexedTable dscTable) { + StruckScalers struck = StruckScalers.read(rawScalerBank,fcupTable,slmTable,helTable); Dsc2Scaler dsc2 = new Dsc2Scaler(rawScalerBank,fcupTable,slmTable,dscTable); - return DaqScalers.create(rawScalerBank,fcupTable,slmTable,helTable,dsc2.getGatedClockSeconds()); + DaqScalers ds = new DaqScalers(); + ds.dsc2 = dsc2; + ds.struck = struck; + return ds; } /** From 7532104c036ecb9a8a406cea90fa3b0cc4e8e339 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 23 Mar 2026 09:48:30 -0400 Subject: [PATCH 094/190] remove rogue clara jar (#1148) --- build-coatjava.sh | 9 +- common-tools/coat-libs/pom.xml | 2 - external-dependencies/jclara-4.3-SNAPSHOT.jar | Bin 429997 -> 0 bytes pom.xml | 2 +- validation/advanced-tests/run-eb-tests.sh | 163 ++++-------------- .../advanced-tests/src/eb/EBTwoTrackTest.java | 27 ++- 6 files changed, 59 insertions(+), 144 deletions(-) delete mode 100644 external-dependencies/jclara-4.3-SNAPSHOT.jar diff --git a/build-coatjava.sh b/build-coatjava.sh index dcb6bdf617..350c19f623 100755 --- a/build-coatjava.sh +++ b/build-coatjava.sh @@ -311,10 +311,6 @@ cp -r libexec $prefix_dir/ which python3 >& /dev/null && python=python3 || python=python $python etc/bankdefs/util/bankSplit.py $prefix_dir/etc/bankdefs/hipo4 || exit 1 -# FIXME: this is still needed by one of the tests -mkdir -p $prefix_dir/lib/utils -cp external-dependencies/jclara-4.3-SNAPSHOT.jar $prefix_dir/lib/utils - # build (and test) unset CLAS12DIR if $runUnitTests; then @@ -359,6 +355,11 @@ for pom in $(find common-tools -name pom.xml); do # install_jars $pom $prefix_dir/lib/services fi done + +# install CLARA jar in separate directory: +mvn org.apache.maven.plugins:maven-dependency-plugin:3.10.0:copy \ + -Dartifact=org.jlab.coda:jclara:4.3:jar -DoutputDirectory=$prefix_dir/lib/utils -DstripVersion=false + echo "installed coatjava to: $prefix_dir" # install clara diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index a7dafd7878..22761f6a99 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -203,8 +203,6 @@ cnuphys:cnuphys - cnuphys:bCNU - cnuphys:bCNU3D cnuphys:jogl-all cnuphys:jogl cnuphys:gluegen diff --git a/external-dependencies/jclara-4.3-SNAPSHOT.jar b/external-dependencies/jclara-4.3-SNAPSHOT.jar deleted file mode 100644 index 65cc502dabf920f92a515685e37332c725470c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429997 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 org.jlab.coda jclara - 4.3-SNAPSHOT + 4.3 diff --git a/validation/advanced-tests/run-eb-tests.sh b/validation/advanced-tests/run-eb-tests.sh index 02e8909afb..fa2077f3df 100755 --- a/validation/advanced-tests/run-eb-tests.sh +++ b/validation/advanced-tests/run-eb-tests.sh @@ -1,162 +1,63 @@ #!/bin/bash -webDir=http://clasweb.jlab.org/clas12offline/distribution/coatjava/validation_files/eb -webVersion=5.11-fid-tm-dc2-r11 -webDir=$webDir/$webVersion -webDir=./data/$webVersion - # coatjava must already be built at ../../coatjava/ # and input test data files at ./data -# whether to use CLARA (0=no) -useClara=0 - -# if non-zero, don't redownload dependencies, don't run reconstruction: -runTestOnly=0 +#set -x # print every command executed -# gemc default solenoid (changed in 4a.2.4): -gemcSolenoidDefault=-1.0 -if [[ $webVersion = *"4a.2.2"* ]] || [[ $webVersion = *"4a.2.3"* ]] -then - gemcSolenoidDefault=1.0 -fi +input_dir=./data/5.11-fid-tm-dc2-r11 -# geometry variation for DC -geoDbVariation="default" -if [[ $webVersion = *"4a.2.2"* ]] || [[ $webVersion = *"4a.2.3"* ]] || [[ $webVersion = *"4a.2.4"* ]] -then - geoDbVariation="dc_geo_gemc424" -fi +source ../../coatjava/libexec/env.sh -nEvents=-1 +classPath="${COATJAVA_CLASSPATH}:../lib/*:src/" +# check arguments: for arg in $@ do - if [ "$arg" == "-t" ] + if [[ $arg == "-100" ]] then - runTestOnly=1 - elif [[ $arg == "-100" ]] - then - webDir=${webDir}-100 + input_dir=${input_dir}-100 fi done # last argument is input file stub: stub="${@: -1}" -# sanity check on filestub name, -# just to error with reasonable message before proceeding: +# check (file)stub name: case $stub in - # electron in forward, hadron in forward: - electronproton) - ;; - electronkaon) - ;; - electronpion) - ;; - electrongamma) - ;; - electronneutron) - ;; - electronFTproton) - ;; - electronFTkaon) - ;; - electronFTpion) - ;; - electronFTgamma) - ;; - electrongammaFT) - ;; - electronprotonC) - ;; - electronkaonC) - ;; - electronpionC) - ;; - electrongammaC) - ;; - electronneutronC) - ;; - electrondeuteronC) - ;; + electronproton) ;; + electronkaon) ;; + electronpion) ;; + electrongamma) ;; + electronneutron) ;; + electronFTproton) ;; + electronFTkaon) ;; + electronFTpion) ;; + electronFTgamma) ;; + electrongammaFT) ;; + electronprotonC) ;; + electronkaonC) ;; + electronpionC) ;; + electrongammaC) ;; + electronneutronC) ;; + electrondeuteronC) ;; *) echo Invalid input evio file: $stub exit 1 esac -# set up environment -if [ $useClara -eq 0 ] -then - COAT=../../coatjava - source $COAT/libexec/env.sh -else - CLARA_HOME=$PWD/clara_installation/ - COAT=$CLARA_HOME/plugins/clas12/ - source $COAT/libexec/env.sh - export CLARA_HOME -fi - -classPath="${COATJAVA_CLASSPATH}:../lib/*:src/" - -# make sure test code compiles before anything else: +# compile test code: javac -cp $classPath src/eb/EBTwoTrackTest.java if [ $? != 0 ] ; then echo "EBTwoTrackTest compilation failure" ; exit 1 ; fi -# download and setup dependencies, run reconstruction: -if [ $runTestOnly -eq 0 ] -then - - if ! [ $useClara -eq 0 ] - then - # tar the local coatjava build so it can be installed with clara - cd ../.. - tar -zcvf coatjava-local.tar.gz coatjava - mv coatjava-local.tar.gz validation/advanced-tests/ - cd - +# run reconstruction: +rm -f out_${stub}.hipo +../../coatjava/bin/recon-util -l FINE -i ${input_dir}/${stub}.hipo -o out_${stub}.hipo -c 2 - # install clara - if ! [ -d clara_installation ] - then - ../../bin/install-clara clara_installation - fi - fi - - # download test files, if necessary: - #wget -N --no-check-certificate $webDir/${stub}.hipo - #if [ $? != 0 ] ; then echo "wget validation files failure" ; exit 1 ; fi - - # update the schema dictionary: (no longer necessary now that recon-util does it) - #rm -f up_${stub}.hipo - #../../coatjava/bin/hipo-utils -update -d ../../coatjava/etc/bankdefs/hipo4/ -o up_${stub}.hipo ${stub}.hipo - - # run reconstruction: - rm -f out_${stub}.hipo - if [ $useClara -eq 0 ] - then - GEOMDBVAR=$geoDbVariation - export GEOMDBVAR - ../../coatjava/bin/recon-util -l FINE -i ${webDir}/${stub}.hipo -o out_${stub}.hipo -c 2 - else - echo "set inputDir $PWD/" > cook.clara - echo "set outputDir $PWD/" >> cook.clara - echo "set threads 7" >> cook.clara - echo "set javaMemory 2" >> cook.clara - echo "set session s_cook" >> cook.clara - echo "set description d_cook" >> cook.clara - ls ${stub}.hipo > files.list - echo "set fileList $PWD/files.list" >> cook.clara - echo "run local" >> cook.clara - echo "exit" >> cook.clara - $CLARA_HOME/bin/clara-shell cook.clara - fi -fi - -# run Event Builder tests: -java -DCLAS12DIR="$COAT" -Xmx1536m -Xms1024m -cp $classPath -DINPUTFILE=out_${stub}.hipo org.junit.runner.JUnitCore eb.EBTwoTrackTest +# run EB tests: +java -DCLAS12DIR="$COAT" -Xmx1536m -Xms1024m -cp $classPath -DINPUTFILE=out_${stub}.hipo eb.EBTwoTrackTest if [ $? != 0 ] ; then echo "EBTwoTrackTest unit test failure" ; exit 1 ; else echo "EBTwoTrackTest passed unit tests" ; fi -$COAT/bin/trutheff ./out_${stub}.hipo - -exit 0 +# run truth-efficiency calculator: +../../coatjava/bin/trutheff ./out_${stub}.hipo diff --git a/validation/advanced-tests/src/eb/EBTwoTrackTest.java b/validation/advanced-tests/src/eb/EBTwoTrackTest.java index a0e4b26f40..996df8b43f 100644 --- a/validation/advanced-tests/src/eb/EBTwoTrackTest.java +++ b/validation/advanced-tests/src/eb/EBTwoTrackTest.java @@ -1,12 +1,10 @@ package eb; import java.io.File; -import org.junit.Test; import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.ArrayList; -import static org.junit.Assert.*; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; @@ -21,8 +19,6 @@ * * Analyze EB efficiencies based on Joseph's 2-particle test events. * - * TODO: Inherit process/checkResults to subclasses for FD/CD/FT - * TODO: Write a more general purpose test based on MC::Particle bank. * TODO: Rewrite this from scratch. Meanwhile, can't live without it. * * @author baltzell @@ -78,10 +74,29 @@ public class EBTwoTrackTest { Map > recSciMap=new HashMap>(); Map > recTrkMap=new HashMap>(); - @Test - public void main() { + static void assertEquals(boolean a, boolean b) { + if (a!=b) { + System.err.println("Assertion Failed!"); + System.exit(3); + } + } + static void assertEquals(String msg, int a, int b) { + if (a!=b) { + System.err.println(msg); + System.exit(3); + } + } + + public static void main(String[] args) { + EBTwoTrackTest t = new EBTwoTrackTest(); + t.go(); + } + + public void go() { + String fileName=System.getProperty("INPUTFILE"); File file = new File(fileName); + if (!file.exists() || file.isDirectory()) { System.err.println("Cannot find input file."); assertEquals(false, true); From 146f69f65c6d8a746599875874d4f158ef551a11 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 23 Mar 2026 10:06:20 -0400 Subject: [PATCH 095/190] new grapes version (#1154) --- bin/install-clara | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/install-clara b/bin/install-clara index 89566e505a..574cad228c 100755 --- a/bin/install-clara +++ b/bin/install-clara @@ -3,7 +3,7 @@ set -e # Default versions: -grapes=2.21 +grapes=2.22 clara=5.0.2 function error() { From dc6a6b147c3b9191277574db2ad70ef3439e9c01 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Mon, 23 Mar 2026 11:20:07 -0400 Subject: [PATCH 096/190] fix(build): duplicate `maven-enforcer-plugin` declaration (#1155) --- pom.xml | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index 75e1343339..abae1bce84 100644 --- a/pom.xml +++ b/pom.xml @@ -263,28 +263,6 @@ - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.6.2 - - - enforce-java - - enforce - - - - - [21,) - - - - - - - com.github.spotbugs @@ -388,12 +366,13 @@ - + org.apache.maven.plugins maven-enforcer-plugin 3.6.2 + enforce-dependency-convergence @@ -410,6 +389,20 @@ + + + enforce-java + + enforce + + + + + [21,) + + + + From 9dbd182e645be4f420c4499b2059350546bff98d Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Mon, 23 Mar 2026 12:03:45 -0400 Subject: [PATCH 097/190] added DC raw bank to dcalign schema and pre-HB cluster bank to dchv schema (#1157) --- etc/bankdefs/util/bankSplit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/bankdefs/util/bankSplit.py b/etc/bankdefs/util/bankSplit.py index 63385a9bc3..9a43123094 100755 --- a/etc/bankdefs/util/bankSplit.py +++ b/etc/bankdefs/util/bankSplit.py @@ -98,11 +98,11 @@ def create(dirname, banklist): # DC alignment and AI-tracking validation schema: dcalign = list(dst) -dcalign.extend(["ai::tracks", "aidn::tracks", "TimeBasedTrkg::AIClusters", "TimeBasedTrkg::AIHits", "TimeBasedTrkg::AISegments", "TimeBasedTrkg::AITracks", "TimeBasedTrkg::TBClusters", "TimeBasedTrkg::TBHits", "TimeBasedTrkg::TBSegments", "TimeBasedTrkg::TBSegmentTrajectory", "TimeBasedTrkg::TBTracks"]) +dcalign.extend(["ai::tracks", "aidn::tracks", "DC::tdc", "DC::tot", "TimeBasedTrkg::AIClusters", "TimeBasedTrkg::AIHits", "TimeBasedTrkg::AISegments", "TimeBasedTrkg::AITracks", "TimeBasedTrkg::TBClusters", "TimeBasedTrkg::TBHits", "TimeBasedTrkg::TBSegments", "TimeBasedTrkg::TBSegmentTrajectory", "TimeBasedTrkg::TBTracks"]) # DC HV studies schema: dchv = list(dsthb) -dchv.extend(["DC::tdc","DC::tot","DC::jitter", "HitBasedTrkg::HBClusters", "HitBasedTrkg::HBHitTrkId", "HitBasedTrkg::HBHits", "HitBasedTrkg::HBSegmentTrajectory", "HitBasedTrkg::HBSegments", "HitBasedTrkg::HBTracks", "HitBasedTrkg::Hits", "HitBasedTrkg::Trajectory", "TimeBasedTrkg::TBClusters", "TimeBasedTrkg::TBHits", "TimeBasedTrkg::TBSegments", "TimeBasedTrkg::TBSegmentTrajectory", "TimeBasedTrkg::TBTracks"]) +dchv.extend(["DC::tdc","DC::tot","DC::jitter", "HitBasedTrkg::Clusters", "HitBasedTrkg::HBClusters", "HitBasedTrkg::HBHitTrkId", "HitBasedTrkg::HBHits", "HitBasedTrkg::HBSegmentTrajectory", "HitBasedTrkg::HBSegments", "HitBasedTrkg::HBTracks", "HitBasedTrkg::Hits", "HitBasedTrkg::Trajectory", "TimeBasedTrkg::TBClusters", "TimeBasedTrkg::TBHits", "TimeBasedTrkg::TBSegments", "TimeBasedTrkg::TBSegmentTrajectory", "TimeBasedTrkg::TBTracks"]) # Level3 validation schema: level3 = list(dst) From 473f48b2df481630afd845e74acabe49ad56c1ab Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 23 Mar 2026 13:52:53 -0400 Subject: [PATCH 098/190] Add some TranslationTable javadoc (#1158) * add documentation * fix --- .../java/org/jlab/detector/decode/TranslationTable.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java index da1c3512b4..ac689c33f3 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/TranslationTable.java @@ -6,6 +6,8 @@ import org.jlab.detector.calib.utils.ConstantsManager; /** + * An IndexedTable assuming the standard, /daq/tt CCDB format (c/s/c/s/l/c/o), + * appended by a DetectorType column. A global CCDB translation table. * * @author baltzell */ @@ -15,6 +17,10 @@ public TranslationTable() { super(3,new String[]{"sector/I","layer/I","component/I","order/I","type/I"}); }; + /** + * Add a detector's entire translation table. + * + */ public void add(DetectorType dt, IndexedTable it) { for (Object key : it.getList().getMap().keySet()) { From 121c54d7d0a3eb3317ebe7bab8d6d5d1d256b013 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 23 Mar 2026 14:54:41 -0400 Subject: [PATCH 099/190] build: bump version number to 13.8.0 (#1159) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 50 files changed, 341 insertions(+), 341 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 9dcb63bf36..854e680e74 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 7142fc283c..3919fd5184 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 33b067df2c..cac3ec4548 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar cnuphys swimmer - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 58d4a7f573..a375f891cc 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-logging - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 9a9958dac4..cf2f9ef05a 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index a2fef9a137..18dd9994f9 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 7f1095ccde..bc0668a5c1 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index d42153a52b..297e52ae5b 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 1ba26e2200..21f247f3ac 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index bbbd60ed91..6528a86cb1 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 7f8b211a89..89e0a13638 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys swimmer - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 835e1ea5a8..a0d43a7a82 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index fca61f16d2..0415bda388 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 843e28760d..36e8a47b98 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar cnuphys clas12 - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 5d3c0d47da..867a5369d7 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT pom org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 3331057b14..91d98fdabc 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar cnuphys clas12 - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 843b3084d1..5c52bea06b 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar cnuphys clas12 - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index c84ab05e7d..c05b30741e 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar cnuphys clas12 - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys splot - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 22761f6a99..2033652f3f 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clara-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-logging - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-math - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-tracking - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-decay-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys snr - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 42e9a842f2..2f68ba51a9 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT pom org.jlab.clas coatjava - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index f18005dde5..364ebd7efa 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas common-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys swimmer - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/pom.xml b/pom.xml index abae1bce84..6734525935 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index fc8fbefa32..55b3f3e800 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 7eca04c76c..28e268aa9a 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 7a6d067ff2..7341c4f91f 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index e9f8e32378..83684c2e5a 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 231af02812..5533fb3b2a 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index e939fc56ad..bf43e950ac 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 4107935e26..cc607745e1 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index bef1dde4f5..97de5c2703 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test org.jlab.clas clas-math - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys snr - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 47e4bd700b..d29ea3e3e6 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 3103548b4a..f0148128cb 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT test org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 7b647a7402..f7b1d1842b 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index c94d5d83fd..9c2ebe9276 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index f0af19be03..4cd6078c22 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 5fe165c2f0..1b845f6e06 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index 57edc41a65..21dd8035c3 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index c539c483e5..0fce6c2faf 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index 45aed2aecb..62e5256dec 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 7be3fc771b..63770e11fe 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT pom org.jlab.clas coatjava - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 025e1d347c..23e40ce376 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-analysis - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index fbcc88b349..7fa097bb9f 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index f72b408df4..fdf8241ea9 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index fd921d577a..ae78ac01f3 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 533f56cf85..b058e52ec9 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT cnuphys magfield - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-tracking - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index c0fe6cce72..7ee5a28715 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 97028718e9..254bf34034 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-physics - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-utils - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 9b6755564a..9765093e5c 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index 6368af7deb..ac68d0acec 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index 06840daf40..7b3834496c 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas swim-tools - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT jar cnuphys swimmer - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-reco - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-io - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT org.jlab.clas clas-geometry - 13.7.1-SNAPSHOT + 13.8.0-SNAPSHOT From bd738f8d2851cad427ae943a3bf63cc7a130d2ed Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 23 Mar 2026 16:54:34 -0400 Subject: [PATCH 100/190] use github and propagate tag/branch (#1160) --- bin/install-clara | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/install-clara b/bin/install-clara index 574cad228c..7ed45915c1 100755 --- a/bin/install-clara +++ b/bin/install-clara @@ -62,8 +62,7 @@ function build_clara { } function build_grapes { - #git clone --branch $grapes --depth 1 https://code.jlab.org/hallb/clas12/coatjava/grapes - git clone --depth 1 https://code.jlab.org/hallb/clas12/coatjava/grapes + git clone --depth 1 --branch $grapes https://github.com/jeffersonlab/grapes cd grapes && mvn package && cd - } From ec869e03cbd33d346a4e97f63e8749979b3c159d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 13:07:03 -0400 Subject: [PATCH 101/190] chore(submodule): bump etc/data/nnet from `800f8f3` to `d03b07d` (#1162) Bumps etc/data/nnet from `800f8f3` to `d03b07d`. --- updated-dependencies: - dependency-name: etc/data/nnet dependency-version: d03b07dd16918ebe8a3a648cf63b70f1016fce79 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- etc/data/nnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/data/nnet b/etc/data/nnet index 800f8f38db..d03b07dd16 160000 --- a/etc/data/nnet +++ b/etc/data/nnet @@ -1 +1 @@ -Subproject commit 800f8f38dba46fef729ee228590f4f2d66e7fbaf +Subproject commit d03b07dd16918ebe8a3a648cf63b70f1016fce79 From a7afa469abc186efbe445cb04bfaf056b7a4297e Mon Sep 17 00:00:00 2001 From: Tongtong Cao Date: Tue, 24 Mar 2026 14:25:04 -0400 Subject: [PATCH 102/190] fix null issue for finalSV in KF for new HB tracking (#1164) --- .../main/java/org/jlab/rec/dc/track/TrackCandListFinder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java index 6f68d554ab..b643cfccc7 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/track/TrackCandListFinder.java @@ -294,6 +294,8 @@ public List getTrackCandsAI(CrossList crossList, DCGeant4Factory DcDetect if(cand.get_Vtx0() != null){ Point3D VTCS = cand.get(cand.size()-1).getCoordsInTiltedSector(cand.get_Vtx0().x(), cand.get_Vtx0().y(), cand.get_Vtx0().z()); + finalSV.k = measSurfaces.size()-1; + kFZRef.finalStateVec = finalSV; double deltaPathToVtx = kFZRef.getDeltaPathToVtx(sector, VTCS.z()); List kfStateVecsAlongTrajectory = setKFStateVecsAlongTrajectory(kFZRef, deltaPathToVtx); From 2ec330e731ffeabe5c2040b43e6c1ed2963ac5c8 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 26 Mar 2026 10:25:32 -0400 Subject: [PATCH 103/190] update grapes version (#1167) --- bin/install-clara | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/install-clara b/bin/install-clara index 7ed45915c1..1db8247c84 100755 --- a/bin/install-clara +++ b/bin/install-clara @@ -3,7 +3,7 @@ set -e # Default versions: -grapes=2.22 +grapes=2.23 clara=5.0.2 function error() { From 165d077f389ebfb6c4d02376f965536b0decdc4e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Sun, 29 Mar 2026 20:00:38 -0400 Subject: [PATCH 104/190] catch rare EVIO errors (#1170) --- .../main/java/org/jlab/detector/decode/CodaDecoders.java | 7 ++++++- .../main/java/org/jlab/io/evio/EvioDataEventHandler.java | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java index 9a46c55844..c97d2b6cdb 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaDecoders.java @@ -7,6 +7,7 @@ import java.util.logging.Logger; import org.jlab.coda.jevio.CompositeData; import org.jlab.coda.jevio.DataType; +import org.jlab.coda.jevio.EvioCompactStructureHandler; import org.jlab.coda.jevio.EvioException; import org.jlab.coda.jevio.EvioNode; import org.jlab.detector.decode.DetectorDataDgtz.ADCData; @@ -30,7 +31,11 @@ public class CodaDecoders { public static List getEventBranches(EvioDataEvent event){ ArrayList branches = new ArrayList<>(); try { - List eventNodes = event.getStructureHandler().getNodes(); + EvioCompactStructureHandler handler = event.getStructureHandler(); + if (handler == null) { + return branches; + } + List eventNodes = handler.getNodes(); if (eventNodes==null) { return branches; } diff --git a/common-tools/clas-io/src/main/java/org/jlab/io/evio/EvioDataEventHandler.java b/common-tools/clas-io/src/main/java/org/jlab/io/evio/EvioDataEventHandler.java index ef8e7c5953..dc8a6a0bbc 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/io/evio/EvioDataEventHandler.java +++ b/common-tools/clas-io/src/main/java/org/jlab/io/evio/EvioDataEventHandler.java @@ -47,7 +47,7 @@ public EvioDataEventHandler(ByteBuffer buff){ try { structure = new EvioCompactStructureHandler(evioBuffer,DataType.BANK); eventNodes = structure.getChildNodes(); - } catch (EvioException ex) { + } catch (EvioException | IndexOutOfBoundsException | NullPointerException ex) { Logger.getLogger(EvioDataEvent.class.getName()).log(Level.SEVERE, null, ex); } } From 20f455ae71b049640ced1025a56cfe1fd8a05669 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 30 Mar 2026 10:52:06 -0400 Subject: [PATCH 105/190] new grapes version (#1171) --- bin/install-clara | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/install-clara b/bin/install-clara index 1db8247c84..d510db20f3 100755 --- a/bin/install-clara +++ b/bin/install-clara @@ -3,7 +3,7 @@ set -e # Default versions: -grapes=2.23 +grapes=2.24 clara=5.0.2 function error() { From 5c8cf0f9bcb98bf08e8e29969226b51b9ceecc52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:21:39 -0400 Subject: [PATCH 106/190] build(deps): bump com.github.spotbugs:spotbugs-maven-plugin (#1173) Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.9.8.2 to 4.9.8.3. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.9.8.2...spotbugs-maven-plugin-4.9.8.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-version: 4.9.8.3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6734525935..062189403a 100644 --- a/pom.xml +++ b/pom.xml @@ -267,7 +267,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.9.8.2 + 4.9.8.3 spotbugs-exclude.xml From b47663db8a158943c10e62e8363cebbbd4a4c3aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 21:30:06 +0000 Subject: [PATCH 107/190] ci(deps): bump actions/download-artifact from 7 to 8 (#1172) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3cb609762c..aac21b2ead 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -158,7 +158,7 @@ jobs: - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: name: build_ubuntu-latest - name: untar build @@ -180,7 +180,7 @@ jobs: - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: name: build_ubuntu-latest - uses: actions/cache/restore@v5 @@ -212,7 +212,7 @@ jobs: uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: name: build_ubuntu-latest - uses: actions/cache/restore@v5 @@ -262,7 +262,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: name: build_${{ matrix.runner }} - uses: cvmfs-contrib/github-action-cvmfs@v5 @@ -295,7 +295,7 @@ jobs: uses: wtfjoke/setup-groovy@v3 with: groovy-version: ${{ env.groovy_version }} - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: name: build_ubuntu-latest - name: untar build @@ -318,7 +318,7 @@ jobs: run: docs/mkdocs/generate.sh pages ### jacoco - name: download jacoco report artifact - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: jacoco_report path: pages/jacoco @@ -371,7 +371,7 @@ jobs: TAG_NAME: ${{ github.ref_name }} steps: - uses: actions/checkout@v6 - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: name: build_ubuntu-latest - name: rename artifact From d965c4957cc1a255a25642bf8544f7cb6145d04c Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 30 Mar 2026 18:16:27 -0400 Subject: [PATCH 108/190] build: bump version number to 13.8.1 (#1174) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 50 files changed, 341 insertions(+), 341 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 854e680e74..ee190a419c 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 3919fd5184..543dfd8235 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index cac3ec4548..f157ad1550 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar cnuphys swimmer - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index a375f891cc..1c5b2723cc 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-logging - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index cf2f9ef05a..0002b171ce 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 18dd9994f9..e4a8370a27 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index bc0668a5c1..08aefef758 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 297e52ae5b..711bf4a3a9 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 21f247f3ac..ffb6697637 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 6528a86cb1..68c00f1761 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 89e0a13638..1d438d1d69 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys swimmer - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index a0d43a7a82..e509a1151d 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 0415bda388..e29f06e377 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 36e8a47b98..73a14345cc 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar cnuphys clas12 - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 867a5369d7..42d9125b8d 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT pom org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 91d98fdabc..2a8ff5b0b0 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar cnuphys clas12 - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 5c52bea06b..499285ed2f 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar cnuphys clas12 - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index c05b30741e..c465a6f6f8 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar cnuphys clas12 - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys splot - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 2033652f3f..7f16f242d3 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clara-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-logging - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-math - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-tracking - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-decay-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys snr - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 2f68ba51a9..230ac66699 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT pom org.jlab.clas coatjava - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index 364ebd7efa..14fed75655 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas common-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys swimmer - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 062189403a..8ba66ddae9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 55b3f3e800..75ae6598bb 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 28e268aa9a..59d922878b 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 7341c4f91f..3e95ca4d1e 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 83684c2e5a..7299de72fb 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 5533fb3b2a..bc791c4fed 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index bf43e950ac..1889b2382d 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index cc607745e1..d966328663 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 97de5c2703..31ead10136 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test org.jlab.clas clas-math - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys snr - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index d29ea3e3e6..9e24c25ba8 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index f0148128cb..9aa3e39276 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT test org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index f7b1d1842b..f79376dc5b 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 9c2ebe9276..0fa50e23fd 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 4cd6078c22..aadfba79ba 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 1b845f6e06..4eaf3f819d 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index 21dd8035c3..dcab12231b 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 0fce6c2faf..7f4c91737b 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index 62e5256dec..ec17d31764 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 63770e11fe..af3c9a321a 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT pom org.jlab.clas coatjava - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 23e40ce376..1d08c71929 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-analysis - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index 7fa097bb9f..802f828c83 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index fdf8241ea9..e097c7f9a4 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index ae78ac01f3..a567ee860d 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index b058e52ec9..e171e0f460 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT cnuphys magfield - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-tracking - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 7ee5a28715..df28f2afdb 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 254bf34034..04c2194cc0 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-physics - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-utils - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 9765093e5c..c96f9ce63f 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index ac68d0acec..ac17c47221 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index 7b3834496c..cc9e7eceda 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas swim-tools - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT jar cnuphys swimmer - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-reco - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-io - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT org.jlab.clas clas-geometry - 13.8.0-SNAPSHOT + 13.8.1-SNAPSHOT From 6d970fc9d473af72fe0823bdc3735ff119fd4b44 Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Wed, 1 Apr 2026 11:25:31 -0400 Subject: [PATCH 109/190] prevent loading of translation tables if run=0 (#1175) --- .../src/main/java/org/jlab/detector/decode/CLASDecoder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java index 3eb66b58a9..667d8ab586 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -744,9 +744,9 @@ public void initEvent(DataEvent event){ } int runNumberCoda = codaDecoder.getRunNumber(); - this.setRunNumber(runNumberCoda); if (runNumberCoda > 0) { + this.setRunNumber(runNumberCoda); detectorDecoder.translate(dataList); detectorDecoder.fitPulses(dataList); detectorDecoder.filterTDCs(dataList); From 27cfec290ff0e2ae042807475bdece8be803ff13 Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Wed, 1 Apr 2026 12:24:30 -0400 Subject: [PATCH 110/190] build: bump version number to 13.8.2 (#1176) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 50 files changed, 341 insertions(+), 341 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index ee190a419c..9b51d4d9d0 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 543dfd8235..7349ca9a54 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index f157ad1550..a6f95614cb 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar cnuphys swimmer - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 1c5b2723cc..2a0052332c 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-logging - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 0002b171ce..1780dc2bdd 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index e4a8370a27..9e0d0e1895 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 08aefef758..93faa1c532 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 711bf4a3a9..e7d39b4f02 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index ffb6697637..2840186559 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 68c00f1761..7e7ca0a7d8 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 1d438d1d69..fb8ce23b37 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys swimmer - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index e509a1151d..c6cefc70fd 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index e29f06e377..000cd6c54d 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 73a14345cc..49a904d7f0 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar cnuphys clas12 - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 42d9125b8d..4a327acaf9 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT pom org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 2a8ff5b0b0..592e072d11 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar cnuphys clas12 - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 499285ed2f..4bede572a5 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar cnuphys clas12 - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index c465a6f6f8..6a701df721 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar cnuphys clas12 - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys splot - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 7f16f242d3..0c17b60a34 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clara-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-logging - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-math - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-tracking - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-decay-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys snr - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 230ac66699..04f96ee357 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT pom org.jlab.clas coatjava - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index 14fed75655..96526b9e7b 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas common-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys swimmer - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 8ba66ddae9..834fe121ad 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 75ae6598bb..0a9b017a88 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 59d922878b..c108e7cdfe 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 3e95ca4d1e..e4ad34d507 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 7299de72fb..4ed67f5977 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index bc791c4fed..8e51dac219 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 1889b2382d..77d4f82149 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index d966328663..e6de0c3c27 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 31ead10136..cba2c02207 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test org.jlab.clas clas-math - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys snr - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 9e24c25ba8..dedf5fdba4 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 9aa3e39276..7927f8e90e 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT test org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index f79376dc5b..e3bc444693 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 0fa50e23fd..f33eac5feb 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index aadfba79ba..d7fa32a9d5 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 4eaf3f819d..97e4a7f255 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index dcab12231b..dd80dfd419 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 7f4c91737b..ecc1c09006 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index ec17d31764..877bd88984 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index af3c9a321a..8cdfaa470b 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT pom org.jlab.clas coatjava - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 1d08c71929..6a58cb92cd 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-analysis - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index 802f828c83..e56f246c9e 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index e097c7f9a4..40b49a2999 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index a567ee860d..6b7eeac8ac 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index e171e0f460..91bc06311a 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT cnuphys magfield - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-tracking - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index df28f2afdb..e311fdbd47 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 04c2194cc0..93aeb8e978 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-physics - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-utils - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index c96f9ce63f..7c132507a7 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index ac17c47221..00dba278e9 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index cc9e7eceda..64f3c52064 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas swim-tools - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT jar cnuphys swimmer - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-reco - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-io - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT org.jlab.clas clas-geometry - 13.8.1-SNAPSHOT + 13.8.2-SNAPSHOT From d76194de71fe1f0a281cfa25dedab65b649db777 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 3 Apr 2026 17:42:04 -0400 Subject: [PATCH 111/190] move jclara jar install earlier, for cleaner log finish (#1180) --- build-coatjava.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/build-coatjava.sh b/build-coatjava.sh index 350c19f623..3bf00d346b 100755 --- a/build-coatjava.sh +++ b/build-coatjava.sh @@ -311,6 +311,10 @@ cp -r libexec $prefix_dir/ which python3 >& /dev/null && python=python3 || python=python $python etc/bankdefs/util/bankSplit.py $prefix_dir/etc/bankdefs/hipo4 || exit 1 +# use maven to copy a CLARA jar to a separate directory: +mvn org.apache.maven.plugins:maven-dependency-plugin:3.10.0:copy \ + -Dartifact=org.jlab.coda:jclara:4.3:jar -DoutputDirectory=$prefix_dir/lib/utils -DstripVersion=false + # build (and test) unset CLAS12DIR if $runUnitTests; then @@ -325,7 +329,6 @@ if $runSpotBugs; then echo "spotbugs spotted no bugs!" fi - ################################################################################ # install ################################################################################ @@ -356,10 +359,6 @@ for pom in $(find common-tools -name pom.xml); do fi done -# install CLARA jar in separate directory: -mvn org.apache.maven.plugins:maven-dependency-plugin:3.10.0:copy \ - -Dartifact=org.jlab.coda:jclara:4.3:jar -DoutputDirectory=$prefix_dir/lib/utils -DstripVersion=false - echo "installed coatjava to: $prefix_dir" # install clara From b819adeecfc57ae24649af20d6afc4f93bece731 Mon Sep 17 00:00:00 2001 From: Zeyu Zhang Date: Tue, 7 Apr 2026 23:07:02 +0800 Subject: [PATCH 112/190] correct the calculation of z positions of clusters and docaclusters (#1165) * correct the calculation of z positions of clusters and docaclusters * calculate stereoangle with line information * remove unused variables --------- Co-authored-by: Zeyu Zhang Co-authored-by: Zeyu Zhang --- .../org/jlab/rec/ahdc/Cluster/Cluster.java | 41 ++++++++++++++++--- .../ahdc/DocaCluster/DocaClusterRefiner.java | 7 ++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java index c985eb968f..f0df2e98da 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java @@ -4,6 +4,9 @@ import org.jlab.rec.ahdc.PreCluster.PreCluster; import java.util.ArrayList; +import org.jlab.geom.detector.alert.AHDC.AlertDCFactory; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; /** * Cluster are compose by 2 PreCluster on layer with a different stereo angle @@ -11,10 +14,6 @@ public class Cluster { private int _trackId = -1; - private double _StereoAngle = 20.0; - private double _DeltaZ = 300.0; - private double _Zoffset = 150.0; - private double _Radius; private double _Phi; private double _Z; @@ -26,14 +25,46 @@ public class Cluster { private double _V; private ArrayList _PreClusters_list; + private static Line3D representativeLine(PreCluster pc) { + if (pc == null || pc.get_hits_list() == null || pc.get_hits_list().isEmpty()) { + return null; + } + Hit h = pc.get_hits_list().get(0); + return h.getLine(); + } + private static double wrapPi(double a) { + while (a > Math.PI) a -= 2.0 * Math.PI; + while (a < -Math.PI) a += 2.0 * Math.PI; + return a; + } + private static double stereoTwistFromLine(Line3D line) { + if (line == null) { + return 0.0; + } + + Point3D p0 = line.origin(); + Point3D p1 = line.end(); + + double phi0 = Math.atan2(p0.y(), p0.x()); + double phi1 = Math.atan2(p1.y(), p1.x()); + return wrapPi(phi1 - phi0); + } public Cluster(PreCluster precluster, PreCluster other_precluster) { this._PreClusters_list = new ArrayList<>(); _PreClusters_list.add(precluster); _PreClusters_list.add(other_precluster); this._Radius = (precluster.get_Radius() + other_precluster.get_Radius()) / 2; - this._Z = ((other_precluster.get_Phi() - precluster.get_Phi()) / (Math.toRadians(_StereoAngle) * Math.pow(-1, precluster.get_Super_layer()-1) - Math.toRadians(_StereoAngle) * Math.pow(-1, other_precluster.get_Super_layer()-1))) * _DeltaZ - _Zoffset; + Line3D line1 = representativeLine(precluster); + Line3D line2 = representativeLine(other_precluster); + Point3D end1 = line1.end(); + Point3D start1 = line1.origin(); + double DeltaZ = end1.z()-start1.z(); + double Zref = end1.z(); + double StereoAnglep = stereoTwistFromLine(line1); + double StereoAngleo = stereoTwistFromLine(line2); + this._Z = ((precluster.get_Phi() - other_precluster.get_Phi()) / (StereoAnglep - StereoAngleo)) * DeltaZ + Zref; double x1 = -precluster.get_Radius() * Math.sin(precluster.get_Phi()); double y1 = -precluster.get_Radius() * Math.cos(precluster.get_Phi()); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java index 504d41572f..1491f0a96e 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java @@ -209,9 +209,10 @@ private static Line3D buildShiftedWireLine(Hit h, Vec2 tangentXY) { double dz = e.z() - o.z(); // New origin: (tangent.x, tangent.y, original_z) - Point3D oShift = new Point3D(tangentXY.x, tangentXY.y, o.z()); - Point3D eShift = new Point3D(oShift.x() + dx, oShift.y() + dy, oShift.z() + dz); - + //Point3D oShift = new Point3D(tangentXY.x, tangentXY.y, o.z()); + //Point3D eShift = new Point3D(oShift.x() + dx, oShift.y() + dy, oShift.z() + dz); + Point3D eShift = new Point3D(tangentXY.x, tangentXY.y, e.z()); + Point3D oShift = new Point3D(tangentXY.x - dx, tangentXY.y - dy, e.z() - dz); return new Line3D(oShift, eShift); } From 26aa37b92249cfb1ac48fce13d681cb36a061123 Mon Sep 17 00:00:00 2001 From: Michael Paolone Date: Thu, 9 Apr 2026 08:52:03 -0600 Subject: [PATCH 113/190] New T2D function for ALERT AHDC (#1178) * Added new T2D functional form and new wire-by-wire T2D database table call: time_to_distance_wire * Removed old T2D database calls and added some checks on NaN and null parameters --- .../java/org/jlab/rec/ahdc/Hit/HitReader.java | 381 +++++++++--------- .../constants/CalibrationConstantsLoader.java | 88 ++-- .../org/jlab/service/ahdc/AHDCEngine.java | 2 +- 3 files changed, 240 insertions(+), 231 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java index f7d2e3d444..ff2b83e5f7 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java @@ -19,194 +19,199 @@ public HitReader(DataEvent event, AlertDCDetector detector, boolean simulation) fetch_AHDCHits(event, detector); if (simulation) fetch_TrueAHDCHits(event); } - - public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector) { - - ArrayList hits = new ArrayList<>(); - - if (!event.hasBank("AHDC::adc")) { - this.set_AHDCHits(hits); - return; - } - - double startTime = 0.0; - if (event.hasBank("REC::Event") && !sim) { - DataBank bankRecEvent = event.getBank("REC::Event"); - startTime = bankRecEvent.getFloat("startTime", 0); - } - - RawDataBank bankDGTZ = new RawDataBank("AHDC::adc"); - bankDGTZ.read(event); - - for (int i = 0; i < bankDGTZ.rows(); i++) { - - int id = bankDGTZ.trueIndex(i) + 1; - int number = bankDGTZ.getByte("layer", i); // e.g. 11,12,21,... (this matches CCDB "layer") - int layer = number % 10; - int superlayer = (number % 100) / 10; - int sector = bankDGTZ.getInt("sector", i); - int wire = bankDGTZ.getShort("component", i); - - // RAW quantities from bank - double adcRaw = bankDGTZ.getInt("ADC", i); - double leadingEdgeTime = bankDGTZ.getFloat("leadingEdgeTime", i); - double timeOverThreshold = bankDGTZ.getFloat("timeOverThreshold", i); - double adcOffset = bankDGTZ.getFloat("ped", i); - int wfType = bankDGTZ.getShort("wfType", i); - - // CCDB key - int key_value = sector * 10000 + number * 100 + wire; - - // ----------------------------- - // Raw hit cuts - // ----------------------------- - // double[] rawHitCuts = CalibrationConstantsLoader.AHDC_RAW_HIT_CUTS.get(key_value); - //if (rawHitCuts == null) continue; - - - double[] rawHitCuts = CalibrationConstantsLoader.AHDC_RAW_HIT_CUTS.get(key_value); - if (rawHitCuts == null) {throw new IllegalStateException("Missing CCDB table /calibration/alert/ahdc/raw_hit_cuts for key=" + key_value+ " (check run/variation + key mapping)"); - } + public double T2Dfunction(int key, double time){ + double[] time2distance = CalibrationConstantsLoader.AHDC_TIME_TO_DISTANCE_WIRE.get(key); + if (time2distance == null){ + throw new IllegalStateException("Missing CCDB /calibration/alert/ahdc/time_to_distance_wire for key=" + key + " (check run/variation + key mapping)"); + } + + if (time2distance[7] == 0.0 || time2distance[9] == 0.0){ + throw new IllegalStateException("Incorrect table values in CCDB /calibration/alert/ahdc/time_to_distance_wire. t1_width ("+ time2distance[7] +") or t2_width ("+time2distance[9]+") for key: " + key + " must not equal zero. Please check database table issues."); + } + + // T2D function consists of three 1st order polynomials (p1, p2, p3) and two transition functions (t1, t2). + + double p1 = (time2distance[0] + time2distance[1]*time); + double p2 = (time2distance[2] + time2distance[3]*time); + double p3 = (time2distance[4] + time2distance[5]*time); + + double t1 = 1.0/(1.0 + Math.exp(-(time - time2distance[6])/time2distance[7])); + double t2 = 1.0/(1.0 + Math.exp(-(time - time2distance[8])/time2distance[9])); + + double retval = (p1)*(1.0 - t1) + (t1)*(p2)*(1.0 - t2) + (t2)*(p3); + return retval; + } + + public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector) { + + ArrayList hits = new ArrayList<>(); + + if (!event.hasBank("AHDC::adc")) { + this.set_AHDCHits(hits); + return; + } + + double startTime = 0.0; + if (event.hasBank("REC::Event") && !sim) { + DataBank bankRecEvent = event.getBank("REC::Event"); + startTime = bankRecEvent.getFloat("startTime", 0); + } + + RawDataBank bankDGTZ = new RawDataBank("AHDC::adc"); + bankDGTZ.read(event); + + for (int i = 0; i < bankDGTZ.rows(); i++) { + + int id = bankDGTZ.trueIndex(i) + 1; + int number = bankDGTZ.getByte("layer", i); // e.g. 11,12,21,... (this matches CCDB "layer") + int layer = number % 10; + int superlayer = (number % 100) / 10; + int sector = bankDGTZ.getInt("sector", i); + int wire = bankDGTZ.getShort("component", i); + + // RAW quantities from bank + double adcRaw = bankDGTZ.getInt("ADC", i); + double leadingEdgeTime = bankDGTZ.getFloat("leadingEdgeTime", i); + double timeOverThreshold = bankDGTZ.getFloat("timeOverThreshold", i); + double adcOffset = bankDGTZ.getFloat("ped", i); + int wfType = bankDGTZ.getShort("wfType", i); + + // CCDB key + int key_value = sector * 10000 + number * 100 + wire; + + // ----------------------------- + // Raw hit cuts + // ----------------------------- + // double[] rawHitCuts = CalibrationConstantsLoader.AHDC_RAW_HIT_CUTS.get(key_value); + //if (rawHitCuts == null) continue; + + + double[] rawHitCuts = CalibrationConstantsLoader.AHDC_RAW_HIT_CUTS.get(key_value); + if (rawHitCuts == null) {throw new IllegalStateException("Missing CCDB table /calibration/alert/ahdc/raw_hit_cuts for key=" + key_value+ " (check run/variation + key mapping)"); + } - double t_min = rawHitCuts[0]; - double t_max = rawHitCuts[1]; - double tot_min = rawHitCuts[2]; - double tot_max = rawHitCuts[3]; - double adc_min = rawHitCuts[4]; - double adc_max = rawHitCuts[5]; - double ped_min = rawHitCuts[6]; - double ped_max = rawHitCuts[7]; - - // ----------------------------- - // Time calibration + t->d - // ----------------------------- - //double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); - //if (timeOffsets == null) continue; - - // double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); - //if (timeOffsets == null) { - //throw new IllegalStateException("Missing AHDC time_offsets for key=" + key_value); - //} - - double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); + double t_min = rawHitCuts[0]; + double t_max = rawHitCuts[1]; + double tot_min = rawHitCuts[2]; + double tot_max = rawHitCuts[3]; + double adc_min = rawHitCuts[4]; + double adc_max = rawHitCuts[5]; + double ped_min = rawHitCuts[6]; + double ped_max = rawHitCuts[7]; + + // ----------------------------- + // Time calibration + t->d + // ----------------------------- + //double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); + //if (timeOffsets == null) continue; + + // double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); + //if (timeOffsets == null) { + //throw new IllegalStateException("Missing AHDC time_offsets for key=" + key_value); + //} + + double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); - if (timeOffsets == null) { - throw new IllegalStateException("Missing CCDB /calibration/alert/ahdc/time_offsets for key=" + key_value + " (check run/variation + key mapping)"); - } - - - - - double[] time2distance = CalibrationConstantsLoader.AHDC_TIME_TO_DISTANCE.get(10101); - if (time2distance == null) continue; - - double t0 = timeOffsets[0]; - - double p0 = time2distance[0]; - double p1 = time2distance[1]; - double p2 = time2distance[2]; - double p3 = time2distance[3]; - double p4 = time2distance[4]; - double p5 = time2distance[5]; - - double time = leadingEdgeTime - t0 - startTime; - - // ----------------------------- - // ToT correction (new CCDB) - // convention: ToT_corr = ToT_raw * totCorr - // ----------------------------- - double totUsed = timeOverThreshold; - if (!sim) { - double[] totArr = CalibrationConstantsLoader.AHDC_TIME_OVER_THRESHOLD.get(key_value); - if (totArr != null && totArr.length > 0) { - double totCorr = totArr[0]; - totUsed = timeOverThreshold * totCorr; - } - } - - // ----------------------------- - // Hit selection (cuts) - // NOTE: we cut on totUsed (corrected ToT). If you want RAW-ToT cuts, - // replace totUsed with timeOverThreshold in the condition. - // ----------------------------- - boolean passCuts = - (wfType <= 2) && - (adcRaw >= adc_min) && (adcRaw <= adc_max) && - (time >= t_min) && (time <= t_max) && - (timeOverThreshold >= tot_min) && (timeOverThreshold <= tot_max)&& - //(totUsed >= tot_min) && (totUsed <= tot_max) && - (adcOffset >= ped_min) && (adcOffset <= ped_max); - - if (!passCuts && !sim) continue; - - // ----------------------------- - // DOCA from calibrated time - // ----------------------------- - double doca = p0 - + p1*Math.pow(time, 1.0) - + p2*Math.pow(time, 2.0) - + p3*Math.pow(time, 3.0) - + p4*Math.pow(time, 4.0) - + p5*Math.pow(time, 5.0); - - if (time < 0) doca = 0.0; - - // ----------------------------- - // ADC gain calibration (new gains schema: gainCorr is index 0) - // convention: ADC_cal = ADC_raw * gainCorr - // ----------------------------- - double adcCal = adcRaw; - if (!sim) { - double[] gainArr = CalibrationConstantsLoader.AHDC_ADC_GAINS.get(key_value); - if (gainArr != null && gainArr.length > 0) { - double gainCorr = gainArr[0]; - adcCal = adcRaw * gainCorr; - } - } - - Hit h = new Hit(id, superlayer, layer, wire, doca, adcRaw, time); - h.setWirePosition(detector); - h.setADC(adcCal); // place to store calibrated ADC - h.setToT(totUsed); // place to store caibrated ToT - hits.add(h); - } - - this.set_AHDCHits(hits); - } - - public final void fetch_TrueAHDCHits(DataEvent event) { - - ArrayList truehits = new ArrayList<>(); - - if (event.hasBank("MC::True")) { - DataBank bankSIMU = event.getBank("MC::True"); - for (int i = 0; i < bankSIMU.rows(); i++) { - int pid = bankSIMU.getInt("pid", i); - double x_true = bankSIMU.getFloat("avgX", i); - double y_true = bankSIMU.getFloat("avgY", i); - double z_true = bankSIMU.getFloat("avgZ", i); - double trackE = bankSIMU.getFloat("trackE", i); - - truehits.add(new TrueHit(pid, x_true, y_true, z_true, trackE)); - } - } - - this.set_TrueAHDCHits(truehits); - } - - public ArrayList get_AHDCHits() { - return _AHDCHits; - } - - public void set_AHDCHits(ArrayList hits) { - this._AHDCHits = hits; - } - - public ArrayList get_TrueAHDCHits() { - return _TrueAHDCHits; - } - - public void set_TrueAHDCHits(ArrayList trueHits) { - this._TrueAHDCHits = trueHits; - } + if (timeOffsets == null) { + throw new IllegalStateException("Missing CCDB /calibration/alert/ahdc/time_offsets for key=" + key_value + " (check run/variation + key mapping)"); + } + + + + double t0 = timeOffsets[0]; + double time = leadingEdgeTime - t0 - startTime; + + // ----------------------------- + // ToT correction (new CCDB) + // convention: ToT_corr = ToT_raw * totCorr + // ----------------------------- + double totUsed = timeOverThreshold; + if (!sim) { + double[] totArr = CalibrationConstantsLoader.AHDC_TIME_OVER_THRESHOLD.get(key_value); + if (totArr != null && totArr.length > 0) { + double totCorr = totArr[0]; + totUsed = timeOverThreshold * totCorr; + } + } + + // ----------------------------- + // Hit selection (cuts) + // NOTE: we cut on totUsed (corrected ToT). If you want RAW-ToT cuts, + // replace totUsed with timeOverThreshold in the condition. + // ----------------------------- + boolean passCuts = + (wfType <= 2) && + (adcRaw >= adc_min) && (adcRaw <= adc_max) && + (time >= t_min) && (time <= t_max) && + (timeOverThreshold >= tot_min) && (timeOverThreshold <= tot_max)&& + //(totUsed >= tot_min) && (totUsed <= tot_max) && + (adcOffset >= ped_min) && (adcOffset <= ped_max); + + if (!passCuts && !sim) continue; + + // ----------------------------- + // DOCA from calibrated time + // ----------------------------- + double doca = T2Dfunction(key_value,time); + + if (time < 0) doca = 0.0; + + // ----------------------------- + // ADC gain calibration (new gains schema: gainCorr is index 0) + // convention: ADC_cal = ADC_raw * gainCorr + // ----------------------------- + double adcCal = adcRaw; + if (!sim) { + double[] gainArr = CalibrationConstantsLoader.AHDC_ADC_GAINS.get(key_value); + if (gainArr != null && gainArr.length > 0) { + double gainCorr = gainArr[0]; + adcCal = adcRaw * gainCorr; + } + } + + Hit h = new Hit(id, superlayer, layer, wire, doca, adcRaw, time); + h.setWirePosition(detector); + h.setADC(adcCal); // place to store calibrated ADC + h.setToT(totUsed); // place to store caibrated ToT + hits.add(h); + } + + this.set_AHDCHits(hits); + } + + public final void fetch_TrueAHDCHits(DataEvent event) { + + ArrayList truehits = new ArrayList<>(); + + if (event.hasBank("MC::True")) { + DataBank bankSIMU = event.getBank("MC::True"); + for (int i = 0; i < bankSIMU.rows(); i++) { + int pid = bankSIMU.getInt("pid", i); + double x_true = bankSIMU.getFloat("avgX", i); + double y_true = bankSIMU.getFloat("avgY", i); + double z_true = bankSIMU.getFloat("avgZ", i); + double trackE = bankSIMU.getFloat("trackE", i); + + truehits.add(new TrueHit(pid, x_true, y_true, z_true, trackE)); + } + } + + this.set_TrueAHDCHits(truehits); + } + + public ArrayList get_AHDCHits() { + return _AHDCHits; + } + + public void set_AHDCHits(ArrayList hits) { + this._AHDCHits = hits; + } + + public ArrayList get_TrueAHDCHits() { + return _TrueAHDCHits; + } + + public void set_TrueAHDCHits(ArrayList trueHits) { + this._TrueAHDCHits = trueHits; + } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java index 0da9fef09c..d2238898f4 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java @@ -24,28 +24,28 @@ public CalibrationConstantsLoader() { // Maps for constants from database // AHDC - public static Map AHDC_TIME_OFFSETS = new HashMap<>(); ///< {t0,dt0,extra1,extra2,chi2ndf} - public static Map AHDC_TIME_TO_DISTANCE = new HashMap<>(); ///< {p0..p5, dp0..dp5, chi2ndf} - public static Map AHDC_RAW_HIT_CUTS = new HashMap<>(); ///< {t_min,t_max,tot_min,tot_max,adc_min,adc_max,ped_min,ped_max} - + public static Map AHDC_TIME_OFFSETS = new HashMap<>(); ///< {t0,dt0,extra1,extra2,chi2ndf} + public static Map AHDC_TIME_TO_DISTANCE_WIRE = new HashMap<>(); ///< T2D function for every wire + public static Map AHDC_RAW_HIT_CUTS = new HashMap<>(); ///< {t_min,t_max,tot_min,tot_max,adc_min,adc_max,ped_min,ped_max} + // UPDATED SCHEMA: keys (sector,layer,component), columns: gainCorr,dgainCorr,extra1,extra2,extra3 - public static Map AHDC_ADC_GAINS = new HashMap<>(); ///< {gainCorr, dgainCorr, extra1, extra2, extra3} - + public static Map AHDC_ADC_GAINS = new HashMap<>(); ///< {gainCorr, dgainCorr, extra1, extra2, extra3} + // NEW ToT TABLE: keys (sector,layer,component), columns: totCorr,dtotCorr,extra1,extra2,extra3 - public static Map AHDC_TIME_OVER_THRESHOLD = new HashMap<>(); ///< {totCorr, dtotCorr, extra1, extra2, extra3} - - // ATOF - public static Map ATOF_EFFECTIVE_VELOCITY = new HashMap<>(); ///< {veff,dveff,extra1,extra2} - public static Map ATOF_TIME_WALK = new HashMap<>(); ///< {tw0..tw3, dtw0..dtw3, chi2ndf} - public static Map ATOF_ATTENUATION_LENGTH = new HashMap<>(); ///< {attlen,dattlen,extra1,extra2} - public static Map ATOF_TIME_OFFSETS = new HashMap<>(); ///< {t0,upstream_downstream,wedge_bar,extra1,extra2} + public static Map AHDC_TIME_OVER_THRESHOLD = new HashMap<>(); ///< {totCorr, dtotCorr, extra1, extra2, extra3} + + // ATOF + public static Map ATOF_EFFECTIVE_VELOCITY = new HashMap<>(); ///< {veff,dveff,extra1,extra2} + public static Map ATOF_TIME_WALK = new HashMap<>(); ///< {tw0..tw3, dtw0..dtw3, chi2ndf} + public static Map ATOF_ATTENUATION_LENGTH = new HashMap<>(); ///< {attlen,dattlen,extra1,extra2} + public static Map ATOF_TIME_OFFSETS = new HashMap<>(); ///< {t0,upstream_downstream,wedge_bar,extra1,extra2} public static synchronized void Load(int runno, ConstantsManager manager) { if (CSTLOADED) return; IndexedTable ahdc_timeOffsets = manager.getConstants(runno, "/calibration/alert/ahdc/time_offsets"); - IndexedTable ahdc_time2distance = manager.getConstants(runno, "/calibration/alert/ahdc/time_to_distance"); + IndexedTable ahdc_time2distanceWire = manager.getConstants(runno, "/calibration/alert/ahdc/time_to_distance_wire"); IndexedTable ahdc_rawHitCuts = manager.getConstants(runno, "/calibration/alert/ahdc/raw_hit_cuts"); // Gains table (UPDATED SCHEMA) @@ -76,35 +76,39 @@ public static synchronized void Load(int runno, ConstantsManager manager) { double params[] = { t0, dt0, extra1, extra2, chi2ndf }; AHDC_TIME_OFFSETS.put(Integer.valueOf(key), params); } - + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // AHDC time to distance - // Caution, this table has only one row - // the corresponding identifiers are (sector, layer, component) == (1,1,1) - // but it applies for all AHDC wires ! - for (int i = 0; i < ahdc_time2distance.getRowCount(); i++) { - int sector = Integer.parseInt((String) ahdc_time2distance.getValueAt(i, 0)); - int layer = Integer.parseInt((String) ahdc_time2distance.getValueAt(i, 1)); - int component = Integer.parseInt((String) ahdc_time2distance.getValueAt(i, 2)); - - double p0 = ahdc_time2distance.getDoubleValue("p0", sector, layer, component); - double p1 = ahdc_time2distance.getDoubleValue("p1", sector, layer, component); - double p2 = ahdc_time2distance.getDoubleValue("p2", sector, layer, component); - double p3 = ahdc_time2distance.getDoubleValue("p3", sector, layer, component); - double p4 = ahdc_time2distance.getDoubleValue("p4", sector, layer, component); - double p5 = ahdc_time2distance.getDoubleValue("p5", sector, layer, component); - double dp0 = ahdc_time2distance.getDoubleValue("dp0", sector, layer, component); - double dp1 = ahdc_time2distance.getDoubleValue("dp1", sector, layer, component); - double dp2 = ahdc_time2distance.getDoubleValue("dp2", sector, layer, component); - double dp3 = ahdc_time2distance.getDoubleValue("dp3", sector, layer, component); - double dp4 = ahdc_time2distance.getDoubleValue("dp4", sector, layer, component); - double dp5 = ahdc_time2distance.getDoubleValue("dp5", sector, layer, component); - double chi2ndf = ahdc_time2distance.getDoubleValue("chi2ndf", sector, layer, component); - - int key = sector * 10000 + layer * 100 + component; - double params[] = { p0, p1, p2, p3, p4, p5, dp0, dp1, dp2, dp3, dp4, dp5, chi2ndf }; - AHDC_TIME_TO_DISTANCE.put(Integer.valueOf(key), params); - } + // AHDC time to distance per wire + // See implementation and functional form in reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java + if(ahdc_time2distanceWire != null){ + for (int i = 0; i < ahdc_time2distanceWire.getRowCount(); i++) { + int sector = Integer.parseInt((String) ahdc_time2distanceWire.getValueAt(i, 0)); + int layer = Integer.parseInt((String) ahdc_time2distanceWire.getValueAt(i, 1)); + int component = Integer.parseInt((String) ahdc_time2distanceWire.getValueAt(i, 2)); + + double p1_int = ahdc_time2distanceWire.getDoubleValue("p1_int", sector, layer, component); + double p1_slope = ahdc_time2distanceWire.getDoubleValue("p1_slope", sector, layer, component); + double p2_int = ahdc_time2distanceWire.getDoubleValue("p2_int", sector, layer, component); + double p2_slope = ahdc_time2distanceWire.getDoubleValue("p2_slope", sector, layer, component); + double p3_int = ahdc_time2distanceWire.getDoubleValue("p3_int", sector, layer, component); + double p3_slope = ahdc_time2distanceWire.getDoubleValue("p3_slope", sector, layer, component); + double t1_x0 = ahdc_time2distanceWire.getDoubleValue("t1_x0", sector, layer, component); + double t1_width = ahdc_time2distanceWire.getDoubleValue("t1_width", sector, layer, component); + double t2_x0 = ahdc_time2distanceWire.getDoubleValue("t2_x0", sector, layer, component); + double t2_width = ahdc_time2distanceWire.getDoubleValue("t2_width", sector, layer, component); + double z0 = ahdc_time2distanceWire.getDoubleValue("z0", sector, layer, component); + double z1 = ahdc_time2distanceWire.getDoubleValue("z1", sector, layer, component); + double z2 = ahdc_time2distanceWire.getDoubleValue("z2", sector, layer, component); + double extra1 = ahdc_time2distanceWire.getDoubleValue("extra1", sector, layer, component); + double extra2 = ahdc_time2distanceWire.getDoubleValue("extra2", sector, layer, component); + double chi2ndf = ahdc_time2distanceWire.getDoubleValue("chi2ndf", sector, layer, component); + + int key = sector * 10000 + layer * 100 + component; + double params[] = { p1_int, p1_slope, p2_int, p2_slope, p3_int, p3_slope, t1_x0, t1_width, t2_x0, t2_width, z0, z1, z2, extra1, extra2, chi2ndf }; + AHDC_TIME_TO_DISTANCE_WIRE.put(Integer.valueOf(key), params); + } + } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // AHDC raw hit cuts diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index eb3dbdca24..839db72e86 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -87,7 +87,7 @@ else if (Objects.equals(this.getEngineConfigString("Mode"), ModeTrackFinding.CV_ // Requires calibration constants String[] alertTables = new String[] { "/calibration/alert/ahdc/time_offsets", - "/calibration/alert/ahdc/time_to_distance", + "/calibration/alert/ahdc/time_to_distance_wire", "/calibration/alert/ahdc/raw_hit_cuts", "/calibration/alert/atof/effective_velocity", "/calibration/alert/atof/time_walk", From 7d517dc90234fe7d331f38348721e4d6ac193053 Mon Sep 17 00:00:00 2001 From: Mathieu Ouillon <67646911+mathieuouillon@users.noreply.github.com> Date: Fri, 10 Apr 2026 10:14:44 -0400 Subject: [PATCH 114/190] Fix ATOF and AHDC issues: Remove CalibrationConstantsLoader, use IndexedTable directly for AHDC/ATOF calibration (#1200) * fix: update requireConstants to handle varying column counts in calibration tables * fix: streamline mode configuration handling and remove redundant code * fix: guard against empty hit list in ALERTEngine Kalman filter loop * Refactor ATOF and AHDC calibration handling. After Michael pull request. Instead of replacing static maps with instance maps, we remove the intermediate layer entirely. Each engine now stores IndexedTable references fetched directly from ConstantsManager (which already caches per run with proper synchronization). Consumer code queries tables via getDoubleValue("column", sector, layer, component) or getDoublesByHash() for bulk access. * feat: load ahdcAdcGains table in ALERTEngine Register /calibration/alert/ahdc/gains in ALERTEngine's init() and refresh the IndexedTable reference on run change, so it is available for downstream use. Requested by @ftouchte for an upcoming pull request. --- .../java/org/jlab/rec/ahdc/Hit/HitReader.java | 165 ++++------ .../constants/CalibrationConstantsLoader.java | 308 ------------------ .../java/org/jlab/rec/atof/hit/ATOFHit.java | 20 +- .../java/org/jlab/rec/atof/hit/BarHit.java | 10 +- .../java/org/jlab/rec/atof/hit/HitFinder.java | 9 +- .../org/jlab/service/ahdc/AHDCEngine.java | 64 ++-- .../org/jlab/service/alert/ALERTEngine.java | 18 +- .../org/jlab/service/atof/ATOFEngine.java | 47 ++- 8 files changed, 148 insertions(+), 493 deletions(-) delete mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java index ff2b83e5f7..e2953d7857 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java @@ -1,12 +1,13 @@ package org.jlab.rec.ahdc.Hit; import java.util.ArrayList; +import java.util.List; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.detector.banks.RawDataBank; import org.jlab.geom.detector.alert.AHDC.AlertDCDetector; -import org.jlab.rec.alert.constants.CalibrationConstantsLoader; +import org.jlab.utils.groups.IndexedTable; public class HitReader { @@ -14,35 +15,50 @@ public class HitReader { private ArrayList _TrueAHDCHits; private boolean sim = false; - public HitReader(DataEvent event, AlertDCDetector detector, boolean simulation) { + private IndexedTable rawHitCutsTable; + private IndexedTable timeOffsetsTable; + private IndexedTable timeToDistanceWireTable; + private IndexedTable timeOverThresholdTable; + private IndexedTable adcGainsTable; + + public HitReader(DataEvent event, AlertDCDetector detector, boolean simulation, + IndexedTable rawHitCuts, + IndexedTable timeOffsets, + IndexedTable timeToDistanceWire, + IndexedTable timeOverThreshold, + IndexedTable adcGains) { sim = simulation; - fetch_AHDCHits(event, detector); + fetch_AHDCHits(event, detector, rawHitCuts, timeOffsets, timeToDistanceWire, timeOverThreshold, adcGains); if (simulation) fetch_TrueAHDCHits(event); } - public double T2Dfunction(int key, double time){ - double[] time2distance = CalibrationConstantsLoader.AHDC_TIME_TO_DISTANCE_WIRE.get(key); - if (time2distance == null){ - throw new IllegalStateException("Missing CCDB /calibration/alert/ahdc/time_to_distance_wire for key=" + key + " (check run/variation + key mapping)"); - } - - if (time2distance[7] == 0.0 || time2distance[9] == 0.0){ - throw new IllegalStateException("Incorrect table values in CCDB /calibration/alert/ahdc/time_to_distance_wire. t1_width ("+ time2distance[7] +") or t2_width ("+time2distance[9]+") for key: " + key + " must not equal zero. Please check database table issues."); - } - + + public double T2Dfunction(int sector, int layer, int wire, double time){ + long hash = timeToDistanceWireTable.getList().getIndexGenerator().hashCode(sector, layer, wire); + List t2d = timeToDistanceWireTable.getDoublesByHash(hash); + // T2D function consists of three 1st order polynomials (p1, p2, p3) and two transition functions (t1, t2). - - double p1 = (time2distance[0] + time2distance[1]*time); - double p2 = (time2distance[2] + time2distance[3]*time); - double p3 = (time2distance[4] + time2distance[5]*time); - - double t1 = 1.0/(1.0 + Math.exp(-(time - time2distance[6])/time2distance[7])); - double t2 = 1.0/(1.0 + Math.exp(-(time - time2distance[8])/time2distance[9])); - - double retval = (p1)*(1.0 - t1) + (t1)*(p2)*(1.0 - t2) + (t2)*(p3); - return retval; + // Column order: p1_int(0), p1_slope(1), p2_int(2), p2_slope(3), p3_int(4), p3_slope(5), + // t1_x0(6), t1_width(7), t2_x0(8), t2_width(9), z0(10), z1(11), z2(12), extra1(13), extra2(14), chi2ndf(15) + + double p1 = (t2d.get(0) + t2d.get(1)*time); + double p2 = (t2d.get(2) + t2d.get(3)*time); + double p3 = (t2d.get(4) + t2d.get(5)*time); + + double t1 = 1.0/(1.0 + Math.exp(-(time - t2d.get(6))/t2d.get(7))); + double t2 = 1.0/(1.0 + Math.exp(-(time - t2d.get(8))/t2d.get(9))); + + return (p1)*(1.0 - t1) + (t1)*(p2)*(1.0 - t2) + (t2)*(p3); } - public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector) { + public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector, + IndexedTable rawHitCuts, IndexedTable timeOffsets, + IndexedTable timeToDistanceWire, IndexedTable totCorrTable, + IndexedTable adcGains) { + this.rawHitCutsTable = rawHitCuts; + this.timeOffsetsTable = timeOffsets; + this.timeToDistanceWireTable = timeToDistanceWire; + this.timeOverThresholdTable = totCorrTable; + this.adcGainsTable = adcGains; ArrayList hits = new ArrayList<>(); @@ -63,7 +79,7 @@ public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector) { for (int i = 0; i < bankDGTZ.rows(); i++) { int id = bankDGTZ.trueIndex(i) + 1; - int number = bankDGTZ.getByte("layer", i); // e.g. 11,12,21,... (this matches CCDB "layer") + int number = bankDGTZ.getByte("layer", i); int layer = number % 10; int superlayer = (number % 100) / 10; int sector = bankDGTZ.getInt("sector", i); @@ -76,103 +92,52 @@ public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector) { double adcOffset = bankDGTZ.getFloat("ped", i); int wfType = bankDGTZ.getShort("wfType", i); - // CCDB key - int key_value = sector * 10000 + number * 100 + wire; - - // ----------------------------- // Raw hit cuts - // ----------------------------- - // double[] rawHitCuts = CalibrationConstantsLoader.AHDC_RAW_HIT_CUTS.get(key_value); - //if (rawHitCuts == null) continue; - - - double[] rawHitCuts = CalibrationConstantsLoader.AHDC_RAW_HIT_CUTS.get(key_value); - if (rawHitCuts == null) {throw new IllegalStateException("Missing CCDB table /calibration/alert/ahdc/raw_hit_cuts for key=" + key_value+ " (check run/variation + key mapping)"); - } - - double t_min = rawHitCuts[0]; - double t_max = rawHitCuts[1]; - double tot_min = rawHitCuts[2]; - double tot_max = rawHitCuts[3]; - double adc_min = rawHitCuts[4]; - double adc_max = rawHitCuts[5]; - double ped_min = rawHitCuts[6]; - double ped_max = rawHitCuts[7]; - - // ----------------------------- - // Time calibration + t->d - // ----------------------------- - //double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); - //if (timeOffsets == null) continue; - - // double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); - //if (timeOffsets == null) { - //throw new IllegalStateException("Missing AHDC time_offsets for key=" + key_value); - //} - - double[] timeOffsets = CalibrationConstantsLoader.AHDC_TIME_OFFSETS.get(key_value); - - if (timeOffsets == null) { - throw new IllegalStateException("Missing CCDB /calibration/alert/ahdc/time_offsets for key=" + key_value + " (check run/variation + key mapping)"); - } - - - - double t0 = timeOffsets[0]; + double t_min = rawHitCutsTable.getDoubleValue("t_min", sector, number, wire); + double t_max = rawHitCutsTable.getDoubleValue("t_max", sector, number, wire); + double tot_min = rawHitCutsTable.getDoubleValue("tot_min", sector, number, wire); + double tot_max = rawHitCutsTable.getDoubleValue("tot_max", sector, number, wire); + double adc_min = rawHitCutsTable.getDoubleValue("adc_min", sector, number, wire); + double adc_max = rawHitCutsTable.getDoubleValue("adc_max", sector, number, wire); + double ped_min = rawHitCutsTable.getDoubleValue("ped_min", sector, number, wire); + double ped_max = rawHitCutsTable.getDoubleValue("ped_max", sector, number, wire); + + // Time calibration + double t0 = timeOffsetsTable.getDoubleValue("t0", sector, number, wire); double time = leadingEdgeTime - t0 - startTime; - // ----------------------------- - // ToT correction (new CCDB) - // convention: ToT_corr = ToT_raw * totCorr - // ----------------------------- + // ToT correction double totUsed = timeOverThreshold; if (!sim) { - double[] totArr = CalibrationConstantsLoader.AHDC_TIME_OVER_THRESHOLD.get(key_value); - if (totArr != null && totArr.length > 0) { - double totCorr = totArr[0]; - totUsed = timeOverThreshold * totCorr; - } + double totCorr = timeOverThresholdTable.getDoubleValue("totCorr", sector, number, wire); + if (totCorr != 0.0) totUsed = timeOverThreshold * totCorr; } - // ----------------------------- // Hit selection (cuts) - // NOTE: we cut on totUsed (corrected ToT). If you want RAW-ToT cuts, - // replace totUsed with timeOverThreshold in the condition. - // ----------------------------- boolean passCuts = (wfType <= 2) && - (adcRaw >= adc_min) && (adcRaw <= adc_max) && - (time >= t_min) && (time <= t_max) && - (timeOverThreshold >= tot_min) && (timeOverThreshold <= tot_max)&& - //(totUsed >= tot_min) && (totUsed <= tot_max) && - (adcOffset >= ped_min) && (adcOffset <= ped_max); + (adcRaw >= adc_min) && (adcRaw <= adc_max) && + (time >= t_min) && (time <= t_max) && + (timeOverThreshold >= tot_min) && (timeOverThreshold <= tot_max) && + (adcOffset >= ped_min) && (adcOffset <= ped_max); if (!passCuts && !sim) continue; - // ----------------------------- // DOCA from calibrated time - // ----------------------------- - double doca = T2Dfunction(key_value,time); - + double doca = T2Dfunction(sector, number, wire, time); if (time < 0) doca = 0.0; - // ----------------------------- - // ADC gain calibration (new gains schema: gainCorr is index 0) - // convention: ADC_cal = ADC_raw * gainCorr - // ----------------------------- + // ADC gain calibration double adcCal = adcRaw; if (!sim) { - double[] gainArr = CalibrationConstantsLoader.AHDC_ADC_GAINS.get(key_value); - if (gainArr != null && gainArr.length > 0) { - double gainCorr = gainArr[0]; - adcCal = adcRaw * gainCorr; - } + double gainCorr = adcGainsTable.getDoubleValue("gainCorr", sector, number, wire); + if (gainCorr != 0.0) adcCal = adcRaw * gainCorr; } Hit h = new Hit(id, superlayer, layer, wire, doca, adcRaw, time); h.setWirePosition(detector); - h.setADC(adcCal); // place to store calibrated ADC - h.setToT(totUsed); // place to store caibrated ToT + h.setADC(adcCal); + h.setToT(totUsed); hits.add(h); } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java deleted file mode 100644 index d2238898f4..0000000000 --- a/reconstruction/alert/src/main/java/org/jlab/rec/alert/constants/CalibrationConstantsLoader.java +++ /dev/null @@ -1,308 +0,0 @@ -package org.jlab.rec.alert.constants; - -import org.jlab.detector.calib.utils.ConstantsManager; -import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.utils.groups.IndexedTable; - -import java.util.HashMap; -import java.util.Map; - -/** - * This class loads constants from CCDB - * - * inspired by the one of the BAND subsystem - * - * @author ftouchte - */ -public class CalibrationConstantsLoader { - - public CalibrationConstantsLoader() { - // default ctor - } - - public static boolean CSTLOADED = false; - - // Maps for constants from database - // AHDC - public static Map AHDC_TIME_OFFSETS = new HashMap<>(); ///< {t0,dt0,extra1,extra2,chi2ndf} - public static Map AHDC_TIME_TO_DISTANCE_WIRE = new HashMap<>(); ///< T2D function for every wire - public static Map AHDC_RAW_HIT_CUTS = new HashMap<>(); ///< {t_min,t_max,tot_min,tot_max,adc_min,adc_max,ped_min,ped_max} - - // UPDATED SCHEMA: keys (sector,layer,component), columns: gainCorr,dgainCorr,extra1,extra2,extra3 - public static Map AHDC_ADC_GAINS = new HashMap<>(); ///< {gainCorr, dgainCorr, extra1, extra2, extra3} - - // NEW ToT TABLE: keys (sector,layer,component), columns: totCorr,dtotCorr,extra1,extra2,extra3 - public static Map AHDC_TIME_OVER_THRESHOLD = new HashMap<>(); ///< {totCorr, dtotCorr, extra1, extra2, extra3} - - // ATOF - public static Map ATOF_EFFECTIVE_VELOCITY = new HashMap<>(); ///< {veff,dveff,extra1,extra2} - public static Map ATOF_TIME_WALK = new HashMap<>(); ///< {tw0..tw3, dtw0..dtw3, chi2ndf} - public static Map ATOF_ATTENUATION_LENGTH = new HashMap<>(); ///< {attlen,dattlen,extra1,extra2} - public static Map ATOF_TIME_OFFSETS = new HashMap<>(); ///< {t0,upstream_downstream,wedge_bar,extra1,extra2} - - public static synchronized void Load(int runno, ConstantsManager manager) { - - if (CSTLOADED) return; - - IndexedTable ahdc_timeOffsets = manager.getConstants(runno, "/calibration/alert/ahdc/time_offsets"); - IndexedTable ahdc_time2distanceWire = manager.getConstants(runno, "/calibration/alert/ahdc/time_to_distance_wire"); - IndexedTable ahdc_rawHitCuts = manager.getConstants(runno, "/calibration/alert/ahdc/raw_hit_cuts"); - - // Gains table (UPDATED SCHEMA) - IndexedTable ahdc_adcGains = manager.getConstants(runno, "/calibration/alert/ahdc/gains"); - - // NEW ToT table - IndexedTable ahdc_timeOverThreshold = manager.getConstants(runno, "/calibration/alert/ahdc/time_over_threshold"); - - IndexedTable atof_effectiveVelocity = manager.getConstants(runno, "/calibration/alert/atof/effective_velocity"); - IndexedTable atof_timeWalk = manager.getConstants(runno, "/calibration/alert/atof/time_walk"); - IndexedTable atof_attenuationLength = manager.getConstants(runno, "/calibration/alert/atof/attenuation"); - IndexedTable atof_timeOffsets = manager.getConstants(runno, "/calibration/alert/atof/time_offsets"); - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // AHDC time offsets - for (int i = 0; i < ahdc_timeOffsets.getRowCount(); i++) { - int sector = Integer.parseInt((String) ahdc_timeOffsets.getValueAt(i, 0)); - int layer = Integer.parseInt((String) ahdc_timeOffsets.getValueAt(i, 1)); - int component = Integer.parseInt((String) ahdc_timeOffsets.getValueAt(i, 2)); - - double t0 = ahdc_timeOffsets.getDoubleValue("t0", sector, layer, component); - double dt0 = ahdc_timeOffsets.getDoubleValue("dt0", sector, layer, component); - double extra1 = ahdc_timeOffsets.getDoubleValue("extra1", sector, layer, component); - double extra2 = ahdc_timeOffsets.getDoubleValue("extra2", sector, layer, component); - double chi2ndf = ahdc_timeOffsets.getDoubleValue("chi2ndf", sector, layer, component); - - int key = sector * 10000 + layer * 100 + component; - double params[] = { t0, dt0, extra1, extra2, chi2ndf }; - AHDC_TIME_OFFSETS.put(Integer.valueOf(key), params); - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // AHDC time to distance per wire - // See implementation and functional form in reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java - if(ahdc_time2distanceWire != null){ - for (int i = 0; i < ahdc_time2distanceWire.getRowCount(); i++) { - int sector = Integer.parseInt((String) ahdc_time2distanceWire.getValueAt(i, 0)); - int layer = Integer.parseInt((String) ahdc_time2distanceWire.getValueAt(i, 1)); - int component = Integer.parseInt((String) ahdc_time2distanceWire.getValueAt(i, 2)); - - double p1_int = ahdc_time2distanceWire.getDoubleValue("p1_int", sector, layer, component); - double p1_slope = ahdc_time2distanceWire.getDoubleValue("p1_slope", sector, layer, component); - double p2_int = ahdc_time2distanceWire.getDoubleValue("p2_int", sector, layer, component); - double p2_slope = ahdc_time2distanceWire.getDoubleValue("p2_slope", sector, layer, component); - double p3_int = ahdc_time2distanceWire.getDoubleValue("p3_int", sector, layer, component); - double p3_slope = ahdc_time2distanceWire.getDoubleValue("p3_slope", sector, layer, component); - double t1_x0 = ahdc_time2distanceWire.getDoubleValue("t1_x0", sector, layer, component); - double t1_width = ahdc_time2distanceWire.getDoubleValue("t1_width", sector, layer, component); - double t2_x0 = ahdc_time2distanceWire.getDoubleValue("t2_x0", sector, layer, component); - double t2_width = ahdc_time2distanceWire.getDoubleValue("t2_width", sector, layer, component); - double z0 = ahdc_time2distanceWire.getDoubleValue("z0", sector, layer, component); - double z1 = ahdc_time2distanceWire.getDoubleValue("z1", sector, layer, component); - double z2 = ahdc_time2distanceWire.getDoubleValue("z2", sector, layer, component); - double extra1 = ahdc_time2distanceWire.getDoubleValue("extra1", sector, layer, component); - double extra2 = ahdc_time2distanceWire.getDoubleValue("extra2", sector, layer, component); - double chi2ndf = ahdc_time2distanceWire.getDoubleValue("chi2ndf", sector, layer, component); - - int key = sector * 10000 + layer * 100 + component; - double params[] = { p1_int, p1_slope, p2_int, p2_slope, p3_int, p3_slope, t1_x0, t1_width, t2_x0, t2_width, z0, z1, z2, extra1, extra2, chi2ndf }; - AHDC_TIME_TO_DISTANCE_WIRE.put(Integer.valueOf(key), params); - } - } - - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // AHDC raw hit cuts - for (int i = 0; i < ahdc_rawHitCuts.getRowCount(); i++) { - int sector = Integer.parseInt((String) ahdc_rawHitCuts.getValueAt(i, 0)); - int layer = Integer.parseInt((String) ahdc_rawHitCuts.getValueAt(i, 1)); - int component = Integer.parseInt((String) ahdc_rawHitCuts.getValueAt(i, 2)); - - double t_min = ahdc_rawHitCuts.getDoubleValue("t_min", sector, layer, component); - double t_max = ahdc_rawHitCuts.getDoubleValue("t_max", sector, layer, component); - double tot_min = ahdc_rawHitCuts.getDoubleValue("tot_min", sector, layer, component); - double tot_max = ahdc_rawHitCuts.getDoubleValue("tot_max", sector, layer, component); - double adc_min = ahdc_rawHitCuts.getDoubleValue("adc_min", sector, layer, component); - double adc_max = ahdc_rawHitCuts.getDoubleValue("adc_max", sector, layer, component); - double ped_min = ahdc_rawHitCuts.getDoubleValue("ped_min", sector, layer, component); - double ped_max = ahdc_rawHitCuts.getDoubleValue("ped_max", sector, layer, component); - - int key = sector * 10000 + layer * 100 + component; - double params[] = { t_min, t_max, tot_min, tot_max, adc_min, adc_max, ped_min, ped_max }; - AHDC_RAW_HIT_CUTS.put(Integer.valueOf(key), params); - } - - - // AHDC ADC gains table - // keys : sector, layer, component - // cols : gainCorr, dgainCorr, extra1, extra2, extra3 - - if (ahdc_adcGains != null) { - for (int i = 0; i < ahdc_adcGains.getRowCount(); i++) { - - int sector = Integer.parseInt((String) ahdc_adcGains.getValueAt(i, 0)); - int layer = Integer.parseInt((String) ahdc_adcGains.getValueAt(i, 1)); - int component = Integer.parseInt((String) ahdc_adcGains.getValueAt(i, 2)); - - double gainCorr = ahdc_adcGains.getDoubleValue("gainCorr", sector, layer, component); - double dgainCorr = ahdc_adcGains.getDoubleValue("dgainCorr", sector, layer, component); - - double extra1 = 0.0, extra2 = 0.0, extra3 = 0.0; - try { extra1 = ahdc_adcGains.getDoubleValue("extra1", sector, layer, component); } catch (Exception e) {} - try { extra2 = ahdc_adcGains.getDoubleValue("extra2", sector, layer, component); } catch (Exception e) {} - try { extra3 = ahdc_adcGains.getDoubleValue("extra3", sector, layer, component); } catch (Exception e) {} - - int key = sector * 10000 + layer * 100 + component; - AHDC_ADC_GAINS.put(key, new double[]{gainCorr, dgainCorr, extra1, extra2, extra3}); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AHDC time_over_threshold (NEW TABLE) -// keys : sector, layer, component -// columns: totCorr, dtotCorr, extra1, extra2, extra3 - -// always clear so behavior is deterministic if Load() is ever called again -AHDC_TIME_OVER_THRESHOLD.clear(); - -// Table may not exist for some runs/variations -> treat as "no correction" -if (ahdc_timeOverThreshold != null) { - - for (int i = 0; i < ahdc_timeOverThreshold.getRowCount(); i++) { - int sector = Integer.parseInt((String) ahdc_timeOverThreshold.getValueAt(i, 0)); - int layer = Integer.parseInt((String) ahdc_timeOverThreshold.getValueAt(i, 1)); - int component = Integer.parseInt((String) ahdc_timeOverThreshold.getValueAt(i, 2)); - - double totCorr = ahdc_timeOverThreshold.getDoubleValue("totCorr", sector, layer, component); - double dtotCorr = ahdc_timeOverThreshold.getDoubleValue("dtotCorr", sector, layer, component); - - double extra1 = 0.0, extra2 = 0.0, extra3 = 0.0; - try { extra1 = ahdc_timeOverThreshold.getDoubleValue("extra1", sector, layer, component); } catch (Exception e) {} - try { extra2 = ahdc_timeOverThreshold.getDoubleValue("extra2", sector, layer, component); } catch (Exception e) {} - try { extra3 = ahdc_timeOverThreshold.getDoubleValue("extra3", sector, layer, component); } catch (Exception e) {} - - int key = sector * 10000 + layer * 100 + component; - double[] params = { totCorr, dtotCorr, extra1, extra2, extra3 }; - AHDC_TIME_OVER_THRESHOLD.put(Integer.valueOf(key), params); - } -} - - - - - - - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // AHDC time_over_threshold (NEW TABLE) - // keys : sector, layer, component - // columns: totCorr, dtotCorr, extra1, extra2, extra3 -// for (int i = 0; i < ahdc_timeOverThreshold.getRowCount(); i++) { -// int sector = Integer.parseInt((String) ahdc_timeOverThreshold.getValueAt(i, 0)); -// int layer = Integer.parseInt((String) ahdc_timeOverThreshold.getValueAt(i, 1)); -// int component = Integer.parseInt((String) ahdc_timeOverThreshold.getValueAt(i, 2)); -// -// double totCorr = ahdc_timeOverThreshold.getDoubleValue("totCorr", sector, layer, component); -// double dtotCorr = ahdc_timeOverThreshold.getDoubleValue("dtotCorr", sector, layer, component); - -// double extra1 = 0.0, extra2 = 0.0, extra3 = 0.0; -// try { extra1 = ahdc_timeOverThreshold.getDoubleValue("extra1", sector, layer, component); } catch (Exception e) {} -//// try { extra2 = ahdc_timeOverThreshold.getDoubleValue("extra2", sector, layer, component); } catch (Exception e) {} -// try { extra3 = ahdc_timeOverThreshold.getDoubleValue("extra3", sector, layer, component); } catch (Exception e) {} - -// int key = sector * 10000 + layer * 100 + component; -// double params[] = { totCorr, dtotCorr, extra1, extra2, extra3 }; -// AHDC_TIME_OVER_THRESHOLD.put(Integer.valueOf(key), params); -// } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // ATOF effective velocity - for (int i = 0; i < atof_effectiveVelocity.getRowCount(); i++) { - int sector = Integer.parseInt((String) atof_effectiveVelocity.getValueAt(i, 0)); - int layer = Integer.parseInt((String) atof_effectiveVelocity.getValueAt(i, 1)); - int component = Integer.parseInt((String) atof_effectiveVelocity.getValueAt(i, 2)); - - double veff = atof_effectiveVelocity.getDoubleValue("veff", sector, layer, component); - double dveff = atof_effectiveVelocity.getDoubleValue("dveff", sector, layer, component); - double extra1 = atof_effectiveVelocity.getDoubleValue("extra1", sector, layer, component); - double extra2 = atof_effectiveVelocity.getDoubleValue("extra2", sector, layer, component); - - int key = sector * 10000 + layer * 1000 + component * 10; - double params[] = { veff, dveff, extra1, extra2 }; - ATOF_EFFECTIVE_VELOCITY.put(Integer.valueOf(key), params); - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // ATOF time walk - for (int i = 0; i < atof_timeWalk.getRowCount(); i++) { - int sector = Integer.parseInt((String) atof_timeWalk.getValueAt(i, 0)); - int layer = Integer.parseInt((String) atof_timeWalk.getValueAt(i, 1)); - int component = Integer.parseInt((String) atof_timeWalk.getValueAt(i, 2)); - int order = Integer.parseInt((String) atof_timeWalk.getValueAt(i, 3)); - - double tw0 = atof_timeWalk.getDoubleValue("tw0", sector, layer, component, order); - double tw1 = atof_timeWalk.getDoubleValue("tw1", sector, layer, component, order); - double tw2 = atof_timeWalk.getDoubleValue("tw2", sector, layer, component, order); - double tw3 = atof_timeWalk.getDoubleValue("tw3", sector, layer, component, order); - double dtw0 = atof_timeWalk.getDoubleValue("dtw0", sector, layer, component, order); - double dtw1 = atof_timeWalk.getDoubleValue("dtw1", sector, layer, component, order); - double dtw2 = atof_timeWalk.getDoubleValue("dtw2", sector, layer, component, order); - double dtw3 = atof_timeWalk.getDoubleValue("dtw3", sector, layer, component, order); - double chi2ndf = atof_timeWalk.getDoubleValue("chi2ndf", sector, layer, component, order); - - int key = sector * 10000 + layer * 1000 + component * 10 + order; - double params[] = { tw0, tw1, tw2, tw3, dtw0, dtw1, dtw2, dtw3, chi2ndf }; - ATOF_TIME_WALK.put(Integer.valueOf(key), params); - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // ATOF attenuation length - for (int i = 0; i < atof_attenuationLength.getRowCount(); i++) { - int sector = Integer.parseInt((String) atof_attenuationLength.getValueAt(i, 0)); - int layer = Integer.parseInt((String) atof_attenuationLength.getValueAt(i, 1)); - int component = Integer.parseInt((String) atof_attenuationLength.getValueAt(i, 2)); - - double attlen = atof_attenuationLength.getDoubleValue("attlen", sector, layer, component); - double dattlen = atof_attenuationLength.getDoubleValue("dattlen", sector, layer, component); - double extra1 = atof_attenuationLength.getDoubleValue("extra1", sector, layer, component); - double extra2 = atof_attenuationLength.getDoubleValue("extra2", sector, layer, component); - - int key = sector * 10000 + layer * 1000 + component * 10; - double params[] = { attlen, dattlen, extra1, extra2 }; - ATOF_ATTENUATION_LENGTH.put(Integer.valueOf(key), params); - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // ATOF time offsets - for (int i = 0; i < atof_timeOffsets.getRowCount(); i++) { - int sector = Integer.parseInt((String) atof_timeOffsets.getValueAt(i, 0)); - int layer = Integer.parseInt((String) atof_timeOffsets.getValueAt(i, 1)); - int component = Integer.parseInt((String) atof_timeOffsets.getValueAt(i, 2)); - int order = Integer.parseInt((String) atof_timeOffsets.getValueAt(i, 3)); // we have to use it here ! - - double t0 = atof_timeOffsets.getDoubleValue("t0", sector, layer, component, order); - double upstream_downstream = atof_timeOffsets.getDoubleValue("upstream_downstream", sector, layer, component, order); - double wedge_bar = atof_timeOffsets.getDoubleValue("wedge_bar", sector, layer, component, order); - double extra1 = atof_timeOffsets.getDoubleValue("extra1", sector, layer, component, order); - double extra2 = atof_timeOffsets.getDoubleValue("extra2", sector, layer, component, order); - - int key = sector * 10000 + layer * 1000 + component * 10 + order; - double params[] = { t0, upstream_downstream, wedge_bar, extra1, extra2 }; - ATOF_TIME_OFFSETS.put(Integer.valueOf(key), params); - } - - CSTLOADED = true; - } - - private static DatabaseConstantProvider DB; - - public static final DatabaseConstantProvider getDB() { - return DB; - } - - public static final void setDB(DatabaseConstantProvider dB) { - DB = dB; - } - - public static void main(String arg[]) { - } -} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java index 81f1d6dc17..c04a4ad4d4 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java @@ -4,7 +4,7 @@ import org.jlab.geom.prim.Point3D; import org.jlab.rec.atof.constants.Parameters; import java.util.logging.Logger; -import org.jlab.rec.alert.constants.CalibrationConstantsLoader; +import org.jlab.utils.groups.IndexedTable; /** * @@ -27,6 +27,7 @@ public class ATOFHit { private boolean isInACluster; private int associatedClusterIndex; int idTDC; + private IndexedTable atofTimeOffsets; public int getSector() { @@ -195,16 +196,11 @@ public final int convertTdcToTime() { //If the startTime has been defined, remove it if(this.startTime!= null) this.time -= this.startTime; - //TODO: When table structure evolves, pay attention to order. - //Key for the current channel - int key = this.sector*10000 + this.layer*1000 + this.component*10 + 0;//this.order; - //Time offsets - double[] timeOffsets = CalibrationConstantsLoader.ATOF_TIME_OFFSETS.get(key); - double t0 = timeOffsets[0]; - - //tud is used to store the bar up - bar down alignment - double tud = timeOffsets[1]; + if (atofTimeOffsets == null) return 0; + int order0 = 0; + double t0 = atofTimeOffsets.getDoubleValue("t0", this.sector, this.layer, this.component, order0); + double tud = atofTimeOffsets.getDoubleValue("upstream_downstream", this.sector, this.layer, this.component, order0); //The rest of the constants are not used for now /*double twb = timeOffsets[2]; double xtra1 = timeOffsets[3]; @@ -403,7 +399,8 @@ public double getPhi() { * @param atof Detector object representing the atof, used to calculate * spatial coordinates. */ - public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot, Float startTime, Detector atof) { + public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot, Float startTime, Detector atof, + IndexedTable atofTimeOffsets) { this.sector = sector; this.layer = layer; this.component = component; @@ -411,6 +408,7 @@ public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot this.tdc = tdc; this.tot = tot; this.startTime = startTime; + this.atofTimeOffsets = atofTimeOffsets; this.isInACluster = false; this.makeType(); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java index eba7640c4b..b60ecbdc2a 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java @@ -3,7 +3,7 @@ import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; import org.jlab.rec.atof.constants.Parameters; -import org.jlab.rec.alert.constants.CalibrationConstantsLoader; +import org.jlab.utils.groups.IndexedTable; /** * @@ -106,7 +106,7 @@ public final void computeEnergy() { this.setEnergy(Edep_up + Edep_down); } - public BarHit(ATOFHit hit_down, ATOFHit hit_up) { + public BarHit(ATOFHit hit_down, ATOFHit hit_up, IndexedTable atofEffectiveVelocity) { boolean hits_match = hit_down.matchBar(hit_up); if (!hits_match) { throw new UnsupportedOperationException("Hits do not match \n"); @@ -120,11 +120,9 @@ public BarHit(ATOFHit hit_down, ATOFHit hit_up) { this.setComponent(10); this.setX(hit_up.getX()); this.setY(hit_up.getY()); - + //CCDB readout for the effective velocity - int key = this.getSector()*10000 + this.getLayer()*1000 + this.getComponent()*10; - double[] vEffTable = CalibrationConstantsLoader.ATOF_EFFECTIVE_VELOCITY.get(key); - this.vEff = vEffTable[0]; + this.vEff = atofEffectiveVelocity.getDoubleValue("veff", this.getSector(), this.getLayer(), this.getComponent()); this.computeZ(); this.computeTime(); this.computeEnergy(); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java index 1f7c04e901..3970f11139 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java @@ -5,6 +5,7 @@ import org.jlab.geom.base.Detector; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; +import org.jlab.utils.groups.IndexedTable; /** * The {@code HitFinder} class finds hits in the atof. @@ -63,7 +64,9 @@ public void setWedgeHits(ArrayList wedge_hits) { * @param atof the {@link Detector} representing the atof geometry to match * the sector/layer/component to x/y/z. */ - public void findHits(DataEvent event, Detector atof, Float startTime) { + public void findHits(DataEvent event, Detector atof, Float startTime, + IndexedTable atofTimeOffsets, + IndexedTable atofEffectiveVelocity) { //For each event a list of bar hits and a list of wedge hits are filled this.barHits.clear(); this.wedgeHits.clear(); @@ -89,7 +92,7 @@ public void findHits(DataEvent event, Detector atof, Float startTime) { int tot = bank.getInt("ToT", i); //Building a Hit - ATOFHit hit = new ATOFHit(sector, layer, component, order, tdc, tot, startTime, atof); + ATOFHit hit = new ATOFHit(sector, layer, component, order, tdc, tot, startTime, atof, atofTimeOffsets); if (hit.getEnergy() < 0.01) { continue; //energy threshold } @@ -124,7 +127,7 @@ public void findHits(DataEvent event, Detector atof, Float startTime) { //Matching the hits: if same module and different order, they make up a bar hit if (this_hit_up.matchBar(this_hit_down)) { //Bar hits are matched to ahdc tracks and listed - BarHit this_bar_hit = new BarHit(this_hit_down, this_hit_up); + BarHit this_bar_hit = new BarHit(this_hit_down, this_hit_up, atofEffectiveVelocity); //Only add bar hits for which the time sum is in time if(!this_bar_hit.isInTime()) continue; this.barHits.add(this_bar_hit); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index 839db72e86..8d4252fd28 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -29,7 +29,7 @@ import org.jlab.detector.calib.utils.DatabaseConstantProvider; import org.jlab.geom.detector.alert.AHDC.AlertDCDetector; import org.jlab.geom.detector.alert.AHDC.AlertDCFactory; -import org.jlab.rec.alert.constants.CalibrationConstantsLoader; +import org.jlab.utils.groups.IndexedTable; import org.jlab.detector.pulse.ModeAHDC; /** AHDCEngine reconstruction service. @@ -56,6 +56,15 @@ public class AHDCEngine extends ReconstructionEngine { private AlertDCDetector factory = null; private ModeAHDC ahdcExtractor = new ModeAHDC(); + // AHDC calibration tables (instance-level, refreshed on run change) + private IndexedTable ahdcTimeOffsets; + private IndexedTable ahdcTimeToDistanceWire; + private IndexedTable ahdcRawHitCuts; + private IndexedTable ahdcAdcGains; + private IndexedTable ahdcTimeOverThreshold; + + int Run = -1; + public AHDCEngine() { super("ALERT", "ouillon", "1.0.1"); } public boolean init(ModeTrackFinding m) { @@ -71,33 +80,18 @@ public boolean init() { if (materialMap == null) materialMap = MaterialMap.generateMaterials(); - if(this.getEngineConfigString("Mode")!=null) { - if (Objects.equals(this.getEngineConfigString("Mode"), ModeTrackFinding.AI_Track_Finding.name())) - modeTrackFinding = ModeTrackFinding.AI_Track_Finding; - else if (Objects.equals(this.getEngineConfigString("Mode"), ModeTrackFinding.CV_Distance.name())) - modeTrackFinding = ModeTrackFinding.CV_Distance; - else if (Objects.equals(this.getEngineConfigString("Mode"), ModeTrackFinding.CV_Hough.name())) - modeTrackFinding = ModeTrackFinding.CV_Hough; - } + String modeConfig = this.getEngineConfigString("Mode"); + if (modeConfig != null) modeTrackFinding = ModeTrackFinding.valueOf(modeConfig); + if (modeTrackFinding == ModeTrackFinding.AI_Track_Finding) modelTrackFinding = new ModelTrackFinding(); - if (modeTrackFinding == ModeTrackFinding.AI_Track_Finding) { - modelTrackFinding = new ModelTrackFinding(); - } + Map tableMap = new HashMap<>(); + tableMap.put("/calibration/alert/ahdc/time_offsets", 3); + tableMap.put("/calibration/alert/ahdc/time_to_distance_wire", 3); + tableMap.put("/calibration/alert/ahdc/raw_hit_cuts", 3); + tableMap.put("/calibration/alert/ahdc/gains", 3); + tableMap.put("/calibration/alert/ahdc/time_over_threshold", 3); - // Requires calibration constants - String[] alertTables = new String[] { - "/calibration/alert/ahdc/time_offsets", - "/calibration/alert/ahdc/time_to_distance_wire", - "/calibration/alert/ahdc/raw_hit_cuts", - "/calibration/alert/atof/effective_velocity", - "/calibration/alert/atof/time_walk", - "/calibration/alert/atof/attenuation", - "/calibration/alert/atof/time_offsets", - "/calibration/alert/ahdc/gains", - "/calibration/alert/ahdc/time_over_threshold" - - }; - requireConstants(Arrays.asList(alertTables)); + requireConstants(tableMap); this.getConstantsManager().setVariation("default"); @@ -106,8 +100,6 @@ else if (Objects.equals(this.getEngineConfigString("Mode"), ModeTrackFinding.CV_ return true; } - int Run = -1; - @Override public boolean processDataEvent(DataEvent event) { @@ -122,19 +114,21 @@ public boolean processDataEvent(DataEvent event) { LOGGER.warning("AHDCEngine: got run <= 0 in RUN::config, skipping event."); return false; } - // Load the constants - //------------------- if(Run != newRun) { - CalibrationConstantsLoader.Load(newRun, this.getConstantsManager()); + ahdcTimeOffsets = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_offsets"); + ahdcTimeToDistanceWire = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_to_distance_wire"); + ahdcRawHitCuts = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/raw_hit_cuts"); + ahdcAdcGains = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/gains"); + ahdcTimeOverThreshold = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_over_threshold"); Run = newRun; } } - - if (event.hasBank("AHDC::adc")) { // I) Read raw hits - HitReader hitReader = new HitReader(event, factory, simulation); + HitReader hitReader = new HitReader(event, factory, simulation, + ahdcRawHitCuts, ahdcTimeOffsets, ahdcTimeToDistanceWire, + ahdcTimeOverThreshold, ahdcAdcGains); ArrayList AHDC_Hits = hitReader.get_AHDCHits(); // II) Create PreClusters @@ -251,7 +245,6 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { all_interclusters.addAll(track.getInterclusters()); } DataBank recoInterClusterBank = writer.fillInterClusterBank(event, all_interclusters); - // DataBank AIPredictionBanks = writer.fillAIPrediction(event, predictions); //event.removeBanks("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::kftrack","AHDC::mc","AHDC::ai:prediction"); event.appendBank(recoHitsBank); @@ -260,7 +253,6 @@ else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { event.appendBank(recoTracksBank); event.appendBank(recoInterClusterBank); event.appendBank(clustersDocaBank); - // event.appendBank(AIPredictionBanks); if (simulation) { DataBank recoMCBank = writer.fillAHDCMCTrackBank(event); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index 5465ec29d8..3b6444e46e 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -6,9 +6,13 @@ import java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; +import java.util.HashMap; +import java.util.Map; + import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.clas.swimtools.Swim; import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.utils.groups.IndexedTable; import org.jlab.geom.base.Detector; import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; import org.jlab.io.base.DataBank; @@ -71,6 +75,9 @@ public class ALERTEngine extends ReconstructionEngine { private ModelTrackMatching modelTrackMatching; private ModelPrePID modelPrePID; + // AHDC calibration table (refreshed on run change) + private IndexedTable ahdcAdcGains; + public void setB(double B) { this.b = B; } @@ -103,6 +110,11 @@ public boolean init() { ATOF = factory.createDetectorCLAS(cp); AHDC = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider()); + Map tableMap = new HashMap<>(); + tableMap.put("/calibration/alert/ahdc/gains", 3); + requireConstants(tableMap); + this.getConstantsManager().setVariation("default"); + if(this.getEngineConfigString("Mode")!=null) { //if (Objects.equals(this.getEngineConfigString("Mode"), Mode.AI_Track_Finding.name())) // mode = Mode.AI_Track_Finding; @@ -140,6 +152,7 @@ public boolean processDataEvent(DataEvent event) { if (run.get() == 0 || (run.get() != 0 && run.get() != newRun)) { run.set(newRun); + ahdcAdcGains = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/gains"); } //Do we need to read the event vx,vy,vz? @@ -190,7 +203,7 @@ public boolean processDataEvent(DataEvent event) { int layer_pred = (int) pred[1]; int wedge_pred = (int) pred[2]; - ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0f, ATOF); + ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0f, ATOF, null); double pred_x = hit_pred.getX(); double pred_y = hit_pred.getY(); double pred_z = hit_pred.getZ(); @@ -208,7 +221,7 @@ public boolean processDataEvent(DataEvent event) { int sector = bank_ATOFHits.getInt("sector", k); int layer = bank_ATOFHits.getInt("layer", k); - ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0f, ATOF); + ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0f, ATOF, null); double dx = pred_x - hit.getX(); double dy = pred_y - hit.getY(); @@ -346,6 +359,7 @@ public boolean processDataEvent(DataEvent event) { AHDC_hits.add(hit); } } + if (AHDC_hits.isEmpty()) continue; // It can happen that a track has no associated hit, in this case we skip it for the Kalman Filter AHDC_tracks.add(new Track(AHDC_hits)); // Initialise the position and the momentum using the information of the AHDC::track // position : mm diff --git a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java index 4b847ff069..7e4974ef3a 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java @@ -12,14 +12,13 @@ import org.jlab.detector.calib.utils.DatabaseConstantProvider; import org.jlab.geom.base.Detector; import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; -import org.jlab.io.hipo.HipoDataSource; import org.jlab.rec.atof.banks.RecoBankWriter; import org.jlab.rec.atof.cluster.ATOFCluster; import org.jlab.rec.atof.cluster.ClusterFinder; import org.jlab.rec.atof.hit.ATOFHit; import org.jlab.rec.atof.hit.BarHit; import org.jlab.rec.atof.hit.HitFinder; -import org.jlab.rec.alert.constants.CalibrationConstantsLoader; +import org.jlab.utils.groups.IndexedTable; /** * Service to return reconstructed ATOF hits and clusters @@ -54,7 +53,13 @@ public Detector getATOF() { } int Run = -1; - + + // ATOF calibration tables (instance-level, refreshed on run change) + private IndexedTable atofEffectiveVelocity; + private IndexedTable atofTimeWalk; + private IndexedTable atofAttenuationLength; + private IndexedTable atofTimeOffsets; + @Override public boolean processDataEvent(DataEvent event) { if (!event.hasBank("RUN::config")) { @@ -80,11 +85,14 @@ public boolean processDataEvent(DataEvent event) { System.err.println("ATOFEngine: got run <= 0 in RUN::config, skipping event."); return false; } - int newRun = runNo; - // Load the constants + int newRun = runNo; if(Run!=newRun) { - CalibrationConstantsLoader.Load(newRun, this.getConstantsManager()); - } + atofEffectiveVelocity = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/effective_velocity"); + atofTimeWalk = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/time_walk"); + atofAttenuationLength = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/attenuation"); + atofTimeOffsets = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/time_offsets"); + Run = newRun; + } ////Do we need to read the event vx,vy,vz? ////If not, this part can be moved in the initialization of the engine. @@ -103,7 +111,7 @@ public boolean processDataEvent(DataEvent event) { //Hit finder init HitFinder hitfinder = new HitFinder(); - hitfinder.findHits(event, ATOF, startTime); + hitfinder.findHits(event, ATOF, startTime, atofTimeOffsets, atofEffectiveVelocity); ArrayList WedgeHits = hitfinder.getWedgeHits(); ArrayList BarHits = hitfinder.getBarHits(); //Exit if hit lists are empty @@ -131,26 +139,11 @@ public boolean init() { DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); this.ATOF = factory.createDetectorCLAS(cp); - String[] alertTables = new String[] { - "/calibration/alert/ahdc/time_offsets", - "/calibration/alert/ahdc/time_to_distance", - "/calibration/alert/ahdc/raw_hit_cuts", - "/calibration/alert/atof/effective_velocity", - "/calibration/alert/atof/time_walk", - "/calibration/alert/atof/attenuation", - "/calibration/alert/atof/time_offsets" - }; - Map tableMap = new HashMap<>(); - for (String table : alertTables) { - if (table.equals("/calibration/alert/atof/time_offsets") || - table.equals("/calibration/alert/atof/time_walk")) { - tableMap.put(table, 4); - } else { - tableMap.put(table, 3); - } - } - + tableMap.put("/calibration/alert/atof/effective_velocity", 3); + tableMap.put("/calibration/alert/atof/time_walk", 4); + tableMap.put("/calibration/alert/atof/attenuation", 3); + tableMap.put("/calibration/alert/atof/time_offsets", 4); requireConstants(tableMap); this.getConstantsManager().setVariation("default"); this.registerOutputBank("ATOF::hits", "ATOF::clusters"); From e7a103078da32ce6fffab09690cd72568ebe6e10 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 10 Apr 2026 19:41:44 -0400 Subject: [PATCH 115/190] build: bump version number to 13.8.3 (#1203) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 50 files changed, 341 insertions(+), 341 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 9b51d4d9d0..b25558dc2c 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 7349ca9a54..43ffef46cb 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index a6f95614cb..8fc851a613 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar cnuphys swimmer - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 2a0052332c..543c8f9a79 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-logging - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 1780dc2bdd..f464c51e6c 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 9e0d0e1895..e87c4487c4 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 93faa1c532..7dfd17d15f 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index e7d39b4f02..ee71e0719b 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 2840186559..ef09b38d2e 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 7e7ca0a7d8..75410aa18e 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index fb8ce23b37..6985a776a7 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys swimmer - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index c6cefc70fd..50b468e3d2 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 000cd6c54d..d604ccece6 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 49a904d7f0..79bf378633 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar cnuphys clas12 - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 4a327acaf9..a28b8479f1 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT pom org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 592e072d11..aa0634cc14 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar cnuphys clas12 - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 4bede572a5..41df0ed603 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar cnuphys clas12 - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 6a701df721..9ee2ef420a 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar cnuphys clas12 - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys splot - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 0c17b60a34..ce8fe83d48 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clara-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-logging - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-math - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-tracking - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-decay-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys snr - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 04f96ee357..d472b1815b 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT pom org.jlab.clas coatjava - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index 96526b9e7b..0b7a5e9088 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas common-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys swimmer - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/pom.xml b/pom.xml index 834fe121ad..75fdbe9ecc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 0a9b017a88..ad000d0bb4 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index c108e7cdfe..7ebf9b7cf7 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index e4ad34d507..4ba1e672d7 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 4ed67f5977..29b74cc53c 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 8e51dac219..518b0e01fc 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 77d4f82149..bbed982553 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index e6de0c3c27..b4111dc9e4 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index cba2c02207..9fe4136e6d 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test org.jlab.clas clas-math - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys snr - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index dedf5fdba4..ed37cd3d04 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 7927f8e90e..17346913ff 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT test org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index e3bc444693..52ec2153e8 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index f33eac5feb..5530069874 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index d7fa32a9d5..f2b1042e40 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 97e4a7f255..88dfb46ba0 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index dd80dfd419..a3ebbe4489 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index ecc1c09006..aa0a5c423b 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index 877bd88984..6364ba88ee 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 8cdfaa470b..0a0869eea7 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT pom org.jlab.clas coatjava - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 6a58cb92cd..a2453d7a5f 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-analysis - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index e56f246c9e..7144b80a23 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 40b49a2999..094abb26a2 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index 6b7eeac8ac..f772ffe1f4 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 91bc06311a..e1e9697a3e 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT cnuphys magfield - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-tracking - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index e311fdbd47..381ffb8f64 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 93aeb8e978..349268aab9 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-physics - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-utils - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 7c132507a7..99b17c30c2 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index 00dba278e9..79c8de6b87 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index 64f3c52064..a9ff4c6009 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas swim-tools - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT jar cnuphys swimmer - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-reco - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-io - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT org.jlab.clas clas-geometry - 13.8.2-SNAPSHOT + 13.8.3-SNAPSHOT From 34b31de82e45bb66ae9812663680eef9f5206f65 Mon Sep 17 00:00:00 2001 From: Mathieu Ouillon <67646911+mathieuouillon@users.noreply.github.com> Date: Wed, 15 Apr 2026 15:51:44 -0400 Subject: [PATCH 116/190] Continue with RG-L Fix in the HitReader and AHDCEngine (#1207) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * AHDC: skip raw-hit cut lookups in sim and tidy HitReader In simulation mode fetch_AHDCHits was still reading the per-wire rawHitCuts table even though the pass/fail result was discarded, which is wasted work and can fail when the sim CCDB run has no cut entries. The cut lookups and pass check are now nested inside the existing !sim branch alongside the ToT and ADC-gain corrections, so sim events go straight from time calibration to DOCA. While in the file: - Drop the rawHitCutsTable/timeOffsetsTable/... instance fields; the IndexedTables are passed through to fetch_AHDCHits and T2Dfunction as parameters, matching how they are used. - Make T2Dfunction / fetch_AHDCHits / fetch_TrueAHDCHits private; nothing outside HitReader calls them. - Collapse the DOCA branch to a single ternary. - Add Javadoc on the class, constructor, calibration pipeline, T2D function, and the hit/true-hit accessors. * AHDC: register missing output banks, fix track-finding mode leak, drop unused MaterialMap - Add AHDC::interclusters and AHDC::docaclusters to registerOutputBank so framework bank management (clearing, schema lookup) sees them. - Use a per-event effectiveMode local instead of overwriting the modeTrackFinding instance field when an event exceeds MAX_HITS_FOR_AI; previously a single noisy event forced CV_Distance for the rest of the run. - Remove the unused materialMap field and its MaterialMap/Material imports; the Kalman filter no longer consumes it from AHDCEngine. * AHDC/ATOF/ALERT: suffix IndexedTable variables with "Table" Rename all IndexedTable fields, parameters, and javadoc references in the ALERT engine suite to carry a "Table" suffix, making calibration-table variables easy to spot at a glance. Touches AHDCEngine, ATOFEngine, ALERTEngine, HitReader, HitFinder, ATOFHit, and BarHit. * ALERTEngine: fix IOOBE when Kalman loop skips a track row The Kalman preprocessing loop read tracks back via AHDC_tracks.get(row), which breaks as soon as the empty-hit guard skips a row and desynchronises row from the list index. Build each Track through a local reference, initialise position/momentum/trackid, then append — so skipped rows never poison later iterations. Also log a warning on the skip branch so the upstream "AHDC::track row with no matching AHDC::hits" case is visible. * ALERTEngine: drop unreachable empty-hit guard, document invariant * AHDC: greedy non-overlap selection in AI track finding The AI candidate generator routinely emits overlapping TrackPredictions that share PreCluster (and therefore Hit) references. Accepting all predictions above threshold let later tracks silently steal earlier tracks' hits via in-place set_trackId() mutation, leaving orphan rows in AHDC::track with no matching rows in AHDC::hits — which in turn crashed the ALERTEngine Kalman loop with IndexOutOfBoundsException inside Track(ArrayList). Sort predictions by score descending, greedily accept each one only if none of its PreClusters has already been claimed, enforcing one-hit one-track. --- .../java/org/jlab/rec/ahdc/Hit/HitReader.java | 170 ++++++++++++------ .../java/org/jlab/rec/atof/hit/ATOFHit.java | 12 +- .../java/org/jlab/rec/atof/hit/BarHit.java | 4 +- .../java/org/jlab/rec/atof/hit/HitFinder.java | 8 +- .../org/jlab/service/ahdc/AHDCEngine.java | 71 ++++---- .../org/jlab/service/alert/ALERTEngine.java | 32 ++-- .../org/jlab/service/atof/ATOFEngine.java | 18 +- 7 files changed, 197 insertions(+), 118 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java index e2953d7857..6268dd5dd2 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java @@ -9,37 +9,65 @@ import org.jlab.geom.detector.alert.AHDC.AlertDCDetector; import org.jlab.utils.groups.IndexedTable; +/** + * Reads raw AHDC hits from the {@code AHDC::adc} bank, applies calibration corrections + * (time offsets, time-over-threshold, ADC gains), filters them against per-wire cuts in + * data mode, and builds the list of {@link Hit} objects used by downstream reconstruction. + * In simulation mode, the per-wire cuts and data-only ADC/ToT corrections are bypassed, + * and truth information is additionally read from the {@code MC::True} bank into {@link TrueHit}s. + */ public class HitReader { private ArrayList _AHDCHits; private ArrayList _TrueAHDCHits; private boolean sim = false; - private IndexedTable rawHitCutsTable; - private IndexedTable timeOffsetsTable; - private IndexedTable timeToDistanceWireTable; - private IndexedTable timeOverThresholdTable; - private IndexedTable adcGainsTable; - - public HitReader(DataEvent event, AlertDCDetector detector, boolean simulation, - IndexedTable rawHitCuts, - IndexedTable timeOffsets, - IndexedTable timeToDistanceWire, - IndexedTable timeOverThreshold, - IndexedTable adcGains) { + /** + * Constructs a HitReader and eagerly populates the hit lists from the given event. + * After construction, retrieve the results via {@link #get_AHDCHits()} and + * (in simulation) {@link #get_TrueAHDCHits()}. + * + * @param event current event containing the {@code AHDC::adc} bank (and {@code MC::True} in sim) + * @param detector AHDC geometry used to resolve wire positions on each hit + * @param simulation {@code true} for Monte Carlo events; disables data-only cuts and corrections + * @param rawHitCutsTable per-wire acceptance cuts (time, ToT, ADC, pedestal min/max) + * @param timeOffsetsTable per-wire {@code t0} offsets applied to the leading-edge time + * @param timeToDistanceWireTable per-wire T2D calibration coefficients used to convert time to DOCA + * @param timeOverThresholdTable per-wire ToT correction factors (applied in data mode only) + * @param adcGainsTable per-wire ADC gain corrections (applied in data mode only) + */ + public HitReader(DataEvent event, AlertDCDetector detector, boolean simulation, IndexedTable rawHitCutsTable, IndexedTable timeOffsetsTable, + IndexedTable timeToDistanceWireTable, IndexedTable timeOverThresholdTable, IndexedTable adcGainsTable) { sim = simulation; - fetch_AHDCHits(event, detector, rawHitCuts, timeOffsets, timeToDistanceWire, timeOverThreshold, adcGains); + fetch_AHDCHits(event, detector, rawHitCutsTable, timeOffsetsTable, timeToDistanceWireTable, timeOverThresholdTable, adcGainsTable); if (simulation) fetch_TrueAHDCHits(event); } - public double T2Dfunction(int sector, int layer, int wire, double time){ + /** + * Converts a calibrated drift time into a distance-of-closest-approach (DOCA) for a + * given wire, using the piecewise T2D calibration stored in {@code timeToDistanceWireTable}. + * + *

The result is a blend of three 1st-order polynomials {@code p1, p2, p3} stitched + * together by two logistic transition functions {@code t1, t2}: + * {@code doca = p1·(1-t1) + t1·p2·(1-t2) + t2·p3}. The coefficients are looked up + * once per call via a hashed index on (sector, layer, wire). + * + *

Expected column order of the calibration row: + * p1_int(0), p1_slope(1), p2_int(2), p2_slope(3), p3_int(4), p3_slope(5), + * t1_x0(6), t1_width(7), t2_x0(8), t2_width(9), z0(10), z1(11), z2(12), + * extra1(13), extra2(14), chi2ndf(15). + * + * @param sector AHDC sector index + * @param layer packed layer index ({@code superlayer*10 + layer}) + * @param wire wire (component) id within the layer + * @param time calibrated drift time in ns + * @param timeToDistanceWireTable per-wire T2D calibration table + * @return the DOCA in mm + */ + private double T2Dfunction(int sector, int layer, int wire, double time, IndexedTable timeToDistanceWireTable){ long hash = timeToDistanceWireTable.getList().getIndexGenerator().hashCode(sector, layer, wire); List t2d = timeToDistanceWireTable.getDoublesByHash(hash); - // T2D function consists of three 1st order polynomials (p1, p2, p3) and two transition functions (t1, t2). - // Column order: p1_int(0), p1_slope(1), p2_int(2), p2_slope(3), p3_int(4), p3_slope(5), - // t1_x0(6), t1_width(7), t2_x0(8), t2_width(9), z0(10), z1(11), z2(12), extra1(13), extra2(14), chi2ndf(15) - double p1 = (t2d.get(0) + t2d.get(1)*time); double p2 = (t2d.get(2) + t2d.get(3)*time); double p3 = (t2d.get(4) + t2d.get(5)*time); @@ -50,16 +78,31 @@ public double T2Dfunction(int sector, int layer, int wire, double time){ return (p1)*(1.0 - t1) + (t1)*(p2)*(1.0 - t2) + (t2)*(p3); } - public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector, - IndexedTable rawHitCuts, IndexedTable timeOffsets, - IndexedTable timeToDistanceWire, IndexedTable totCorrTable, - IndexedTable adcGains) { - this.rawHitCutsTable = rawHitCuts; - this.timeOffsetsTable = timeOffsets; - this.timeToDistanceWireTable = timeToDistanceWire; - this.timeOverThresholdTable = totCorrTable; - this.adcGainsTable = adcGains; - + /** + * Reads the {@code AHDC::adc} bank, calibrates each raw row, and builds the list of + * reconstructed {@link Hit}s. For each row the method: + *

    + *
  1. applies the per-wire time offset {@code t0} (subtracting event start time in data mode),
  2. + *
  3. in data mode, corrects time-over-threshold and enforces per-wire acceptance cuts + * (time, ToT, ADC, pedestal, and {@code wfType <= 2}) — hits failing the cuts are dropped,
  4. + *
  5. computes the DOCA from the calibrated time via {@link #T2Dfunction} (DOCA forced to 0 + * when {@code time < 0}),
  6. + *
  7. in data mode, applies the per-wire ADC gain correction,
  8. + *
  9. instantiates a {@link Hit}, resolves its wire position via the geometry, and stores the + * calibrated ADC and ToT on it.
  10. + *
+ * The resulting list is stored via {@link #set_AHDCHits(ArrayList)} (empty if the bank is absent). + * + * @param event current event + * @param detector AHDC geometry used to set each hit's wire position + * @param rawHitCutsTable per-wire acceptance cuts (data mode only) + * @param timeOffsetsTable per-wire {@code t0} + * @param timeToDistanceWireTable per-wire T2D coefficients + * @param timeOverThresholdTable per-wire ToT correction factors (data mode only) + * @param adcGainsTable per-wire ADC gain corrections (data mode only) + */ + private void fetch_AHDCHits(DataEvent event, AlertDCDetector detector, IndexedTable rawHitCutsTable, IndexedTable timeOffsetsTable, + IndexedTable timeToDistanceWireTable, IndexedTable timeOverThresholdTable, IndexedTable adcGainsTable) { ArrayList hits = new ArrayList<>(); if (!event.hasBank("AHDC::adc")) { @@ -92,16 +135,6 @@ public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector, double adcOffset = bankDGTZ.getFloat("ped", i); int wfType = bankDGTZ.getShort("wfType", i); - // Raw hit cuts - double t_min = rawHitCutsTable.getDoubleValue("t_min", sector, number, wire); - double t_max = rawHitCutsTable.getDoubleValue("t_max", sector, number, wire); - double tot_min = rawHitCutsTable.getDoubleValue("tot_min", sector, number, wire); - double tot_max = rawHitCutsTable.getDoubleValue("tot_max", sector, number, wire); - double adc_min = rawHitCutsTable.getDoubleValue("adc_min", sector, number, wire); - double adc_max = rawHitCutsTable.getDoubleValue("adc_max", sector, number, wire); - double ped_min = rawHitCutsTable.getDoubleValue("ped_min", sector, number, wire); - double ped_max = rawHitCutsTable.getDoubleValue("ped_max", sector, number, wire); - // Time calibration double t0 = timeOffsetsTable.getDoubleValue("t0", sector, number, wire); double time = leadingEdgeTime - t0 - startTime; @@ -111,21 +144,30 @@ public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector, if (!sim) { double totCorr = timeOverThresholdTable.getDoubleValue("totCorr", sector, number, wire); if (totCorr != 0.0) totUsed = timeOverThreshold * totCorr; - } - - // Hit selection (cuts) - boolean passCuts = - (wfType <= 2) && - (adcRaw >= adc_min) && (adcRaw <= adc_max) && - (time >= t_min) && (time <= t_max) && - (timeOverThreshold >= tot_min) && (timeOverThreshold <= tot_max) && - (adcOffset >= ped_min) && (adcOffset <= ped_max); - if (!passCuts && !sim) continue; + // Hit selection (cuts) — only applied on data, bypassed in sim + long hash = rawHitCutsTable.getList().getIndexGenerator().hashCode(sector, number, wire); + double t_min = rawHitCutsTable.getDoubleValueByHash("t_min", hash); + double t_max = rawHitCutsTable.getDoubleValueByHash("t_max", hash); + double tot_min = rawHitCutsTable.getDoubleValueByHash("tot_min", hash); + double tot_max = rawHitCutsTable.getDoubleValueByHash("tot_max", hash); + double adc_min = rawHitCutsTable.getDoubleValueByHash("adc_min", hash); + double adc_max = rawHitCutsTable.getDoubleValueByHash("adc_max", hash); + double ped_min = rawHitCutsTable.getDoubleValueByHash("ped_min", hash); + double ped_max = rawHitCutsTable.getDoubleValueByHash("ped_max", hash); + + boolean passCuts = + (wfType <= 2) && + (adcRaw >= adc_min) && (adcRaw <= adc_max) && + (time >= t_min) && (time <= t_max) && + (timeOverThreshold >= tot_min) && (timeOverThreshold <= tot_max) && + (adcOffset >= ped_min) && (adcOffset <= ped_max); + + if (!passCuts) continue; + } // DOCA from calibrated time - double doca = T2Dfunction(sector, number, wire, time); - if (time < 0) doca = 0.0; + double doca = (time < 0) ? 0.0 : T2Dfunction(sector, number, wire, time, timeToDistanceWireTable); // ADC gain calibration double adcCal = adcRaw; @@ -144,7 +186,15 @@ public final void fetch_AHDCHits(DataEvent event, AlertDCDetector detector, this.set_AHDCHits(hits); } - public final void fetch_TrueAHDCHits(DataEvent event) { + /** + * Reads Monte-Carlo truth information from the {@code MC::True} bank into a list of + * {@link TrueHit}s (particle id and average hit position/energy). Called only when + * the reader is constructed with {@code simulation = true}. If the bank is absent, + * the resulting list is empty. + * + * @param event current event + */ + private void fetch_TrueAHDCHits(DataEvent event) { ArrayList truehits = new ArrayList<>(); @@ -164,18 +214,36 @@ public final void fetch_TrueAHDCHits(DataEvent event) { this.set_TrueAHDCHits(truehits); } + /** + * @return the calibrated AHDC hits produced from the current event; never {@code null} + * (empty if the {@code AHDC::adc} bank is missing) + */ public ArrayList get_AHDCHits() { return _AHDCHits; } + /** + * Replaces the internally stored list of AHDC hits. Primarily used by {@link #fetch_AHDCHits}. + * + * @param hits the list to store + */ public void set_AHDCHits(ArrayList hits) { this._AHDCHits = hits; } + /** + * @return the MC-truth hits for the current event (populated only in simulation mode; + * {@code null} for data events where {@code fetch_TrueAHDCHits} was not called) + */ public ArrayList get_TrueAHDCHits() { return _TrueAHDCHits; } + /** + * Replaces the internally stored list of MC-truth hits. Primarily used by {@link #fetch_TrueAHDCHits}. + * + * @param trueHits the list to store + */ public void set_TrueAHDCHits(ArrayList trueHits) { this._TrueAHDCHits = trueHits; } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java index c04a4ad4d4..a1812a237b 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java @@ -27,7 +27,7 @@ public class ATOFHit { private boolean isInACluster; private int associatedClusterIndex; int idTDC; - private IndexedTable atofTimeOffsets; + private IndexedTable atofTimeOffsetsTable; public int getSector() { @@ -197,10 +197,10 @@ public final int convertTdcToTime() { if(this.startTime!= null) this.time -= this.startTime; //Time offsets - if (atofTimeOffsets == null) return 0; + if (atofTimeOffsetsTable == null) return 0; int order0 = 0; - double t0 = atofTimeOffsets.getDoubleValue("t0", this.sector, this.layer, this.component, order0); - double tud = atofTimeOffsets.getDoubleValue("upstream_downstream", this.sector, this.layer, this.component, order0); + double t0 = atofTimeOffsetsTable.getDoubleValue("t0", this.sector, this.layer, this.component, order0); + double tud = atofTimeOffsetsTable.getDoubleValue("upstream_downstream", this.sector, this.layer, this.component, order0); //The rest of the constants are not used for now /*double twb = timeOffsets[2]; double xtra1 = timeOffsets[3]; @@ -400,7 +400,7 @@ public double getPhi() { * spatial coordinates. */ public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot, Float startTime, Detector atof, - IndexedTable atofTimeOffsets) { + IndexedTable atofTimeOffsetsTable) { this.sector = sector; this.layer = layer; this.component = component; @@ -408,7 +408,7 @@ public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot this.tdc = tdc; this.tot = tot; this.startTime = startTime; - this.atofTimeOffsets = atofTimeOffsets; + this.atofTimeOffsetsTable = atofTimeOffsetsTable; this.isInACluster = false; this.makeType(); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java index b60ecbdc2a..4dd8a94b12 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java @@ -106,7 +106,7 @@ public final void computeEnergy() { this.setEnergy(Edep_up + Edep_down); } - public BarHit(ATOFHit hit_down, ATOFHit hit_up, IndexedTable atofEffectiveVelocity) { + public BarHit(ATOFHit hit_down, ATOFHit hit_up, IndexedTable atofEffectiveVelocityTable) { boolean hits_match = hit_down.matchBar(hit_up); if (!hits_match) { throw new UnsupportedOperationException("Hits do not match \n"); @@ -122,7 +122,7 @@ public BarHit(ATOFHit hit_down, ATOFHit hit_up, IndexedTable atofEffectiveVeloci this.setY(hit_up.getY()); //CCDB readout for the effective velocity - this.vEff = atofEffectiveVelocity.getDoubleValue("veff", this.getSector(), this.getLayer(), this.getComponent()); + this.vEff = atofEffectiveVelocityTable.getDoubleValue("veff", this.getSector(), this.getLayer(), this.getComponent()); this.computeZ(); this.computeTime(); this.computeEnergy(); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java index 3970f11139..918cefa864 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java @@ -65,8 +65,8 @@ public void setWedgeHits(ArrayList wedge_hits) { * the sector/layer/component to x/y/z. */ public void findHits(DataEvent event, Detector atof, Float startTime, - IndexedTable atofTimeOffsets, - IndexedTable atofEffectiveVelocity) { + IndexedTable atofTimeOffsetsTable, + IndexedTable atofEffectiveVelocityTable) { //For each event a list of bar hits and a list of wedge hits are filled this.barHits.clear(); this.wedgeHits.clear(); @@ -92,7 +92,7 @@ public void findHits(DataEvent event, Detector atof, Float startTime, int tot = bank.getInt("ToT", i); //Building a Hit - ATOFHit hit = new ATOFHit(sector, layer, component, order, tdc, tot, startTime, atof, atofTimeOffsets); + ATOFHit hit = new ATOFHit(sector, layer, component, order, tdc, tot, startTime, atof, atofTimeOffsetsTable); if (hit.getEnergy() < 0.01) { continue; //energy threshold } @@ -127,7 +127,7 @@ public void findHits(DataEvent event, Detector atof, Float startTime, //Matching the hits: if same module and different order, they make up a bar hit if (this_hit_up.matchBar(this_hit_down)) { //Bar hits are matched to ahdc tracks and listed - BarHit this_bar_hit = new BarHit(this_hit_down, this_hit_up, atofEffectiveVelocity); + BarHit this_bar_hit = new BarHit(this_hit_down, this_hit_up, atofEffectiveVelocityTable); //Only add bar hits for which the time sum is in time if(!this_bar_hit.isInTime()) continue; this.barHits.add(this_bar_hit); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index 8d4252fd28..66b965825c 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -1,7 +1,6 @@ package org.jlab.service.ahdc; import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.clas.tracking.kalmanfilter.Material; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; @@ -17,7 +16,6 @@ import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.Hit.HitReader; import org.jlab.rec.ahdc.HoughTransform.HoughTransform; -import org.jlab.rec.ahdc.KalmanFilter.MaterialMap; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; import org.jlab.rec.ahdc.Track.Track; @@ -43,10 +41,7 @@ public class AHDCEngine extends ReconstructionEngine { static final Logger LOGGER = Logger.getLogger(AHDCEngine.class.getName()); - private boolean simulation; - - /// Material Map used by Kalman filter - private HashMap materialMap; + private boolean simulation = false; private ModelTrackFinding modelTrackFinding; private ModeTrackFinding modeTrackFinding = ModeTrackFinding.AI_Track_Finding; @@ -57,11 +52,11 @@ public class AHDCEngine extends ReconstructionEngine { private ModeAHDC ahdcExtractor = new ModeAHDC(); // AHDC calibration tables (instance-level, refreshed on run change) - private IndexedTable ahdcTimeOffsets; - private IndexedTable ahdcTimeToDistanceWire; - private IndexedTable ahdcRawHitCuts; - private IndexedTable ahdcAdcGains; - private IndexedTable ahdcTimeOverThreshold; + private IndexedTable ahdcTimeOffsetsTable; + private IndexedTable ahdcTimeToDistanceWireTable; + private IndexedTable ahdcRawHitCutsTable; + private IndexedTable ahdcAdcGainsTable; + private IndexedTable ahdcTimeOverThresholdTable; int Run = -1; @@ -76,9 +71,6 @@ public boolean init(ModeTrackFinding m) { public boolean init() { factory = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider()); - simulation = false; - - if (materialMap == null) materialMap = MaterialMap.generateMaterials(); String modeConfig = this.getEngineConfigString("Mode"); if (modeConfig != null) modeTrackFinding = ModeTrackFinding.valueOf(modeConfig); @@ -92,10 +84,8 @@ public boolean init() { tableMap.put("/calibration/alert/ahdc/time_over_threshold", 3); requireConstants(tableMap); - - this.getConstantsManager().setVariation("default"); - - this.registerOutputBank("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::mc","AHDC::ai:prediction"); + this.getConstantsManager().setVariation("default"); + this.registerOutputBank("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::mc","AHDC::ai:prediction","AHDC::interclusters","AHDC::docaclusters"); return true; } @@ -115,11 +105,11 @@ public boolean processDataEvent(DataEvent event) { return false; } if(Run != newRun) { - ahdcTimeOffsets = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_offsets"); - ahdcTimeToDistanceWire = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_to_distance_wire"); - ahdcRawHitCuts = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/raw_hit_cuts"); - ahdcAdcGains = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/gains"); - ahdcTimeOverThreshold = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_over_threshold"); + ahdcTimeOffsetsTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_offsets"); + ahdcTimeToDistanceWireTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_to_distance_wire"); + ahdcRawHitCutsTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/raw_hit_cuts"); + ahdcAdcGainsTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/gains"); + ahdcTimeOverThresholdTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/time_over_threshold"); Run = newRun; } } @@ -127,8 +117,8 @@ public boolean processDataEvent(DataEvent event) { if (event.hasBank("AHDC::adc")) { // I) Read raw hits HitReader hitReader = new HitReader(event, factory, simulation, - ahdcRawHitCuts, ahdcTimeOffsets, ahdcTimeToDistanceWire, - ahdcTimeOverThreshold, ahdcAdcGains); + ahdcRawHitCutsTable, ahdcTimeOffsetsTable, ahdcTimeToDistanceWireTable, + ahdcTimeOverThresholdTable, ahdcAdcGainsTable); ArrayList AHDC_Hits = hitReader.get_AHDCHits(); // II) Create PreClusters @@ -147,14 +137,15 @@ public boolean processDataEvent(DataEvent event) { // Otherwise, the conventional methods (Hough Transform or distance) use clusters. // Safety check: if too many hits, rely on conventional track finding + ModeTrackFinding effectiveMode = modeTrackFinding; if (AHDC_Hits.size() > MAX_HITS_FOR_AI) { LOGGER.info("Too many AHDC_Hits in AHDC::adc, rely on conventional track finding for this event"); - modeTrackFinding = ModeTrackFinding.CV_Distance; + effectiveMode = ModeTrackFinding.CV_Distance; } ArrayList AHDC_Tracks = new ArrayList<>(); - if (modeTrackFinding == ModeTrackFinding.AI_Track_Finding) { + if (effectiveMode == ModeTrackFinding.AI_Track_Finding) { // 1) Create inter-clusters from pre-clusters PreClustering preClustering = new PreClustering(); ArrayList inter_clusters = preClustering.mergePreclusters(AHDC_PreClusters); @@ -178,12 +169,26 @@ public boolean processDataEvent(DataEvent event) { throw new RuntimeException(e); } - // 4) Use the output for the AI model to select the good tracks among the candidates + // 4) Select good tracks via greedy non-overlap: sort predictions by score + // descending, accept the highest-scoring prediction, mark its PreClusters + // as claimed, and skip any later prediction that reuses a claimed PreCluster. + // The AI candidate generator routinely emits overlapping predictions (each + // PreCluster can feed several combinations), and because set_trackId mutates + // the shared Hit references in place, a naive "accept all above threshold" + // pass would let later tracks silently steal earlier tracks' hits and leave + // them orphaned in AHDC::hits. Greedy selection enforces one-hit-one-track. + predictions.sort((a, b) -> Float.compare(b.getPrediction(), a.getPrediction())); + Set claimedPreclusters = new HashSet<>(); for (TrackPrediction t : predictions) { - if (t.getPrediction() > TRACK_FINDING_AI_THRESHOLD) AHDC_Tracks.add(new Track(t.getClusters())); + if (t.getPrediction() <= TRACK_FINDING_AI_THRESHOLD) continue; + boolean overlaps = false; + for (PreCluster pc : t.getPreclusters()) { + if (claimedPreclusters.contains(pc)) { overlaps = true; break; } + } + if (overlaps) continue; + claimedPreclusters.addAll(t.getPreclusters()); + AHDC_Tracks.add(new Track(t.getClusters())); } - // The assignment of Track ID to all objects is done in the Kalman filter step below - // I don't know if it is a good idea. } else { // Conventional Track Finding: Hough Transform or Distance: use cluster informations to find tracks @@ -193,12 +198,12 @@ public boolean processDataEvent(DataEvent event) { ArrayList AHDC_Clusters = clusterfinder.get_AHDCClusters(); // 2) Find tracks using the selected conventional method - if (modeTrackFinding == ModeTrackFinding.CV_Distance) { + if (effectiveMode == ModeTrackFinding.CV_Distance) { Distance distance = new Distance(); distance.find_track(AHDC_Clusters); AHDC_Tracks = distance.get_AHDCTracks(); } - else if (modeTrackFinding == ModeTrackFinding.CV_Hough) { + else if (effectiveMode == ModeTrackFinding.CV_Hough) { HoughTransform houghtransform = new HoughTransform(); houghtransform.find_tracks(AHDC_Clusters); AHDC_Tracks = houghtransform.get_AHDCTracks(); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index 3b6444e46e..a899e20c8a 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -76,7 +76,7 @@ public class ALERTEngine extends ReconstructionEngine { private ModelPrePID modelPrePID; // AHDC calibration table (refreshed on run change) - private IndexedTable ahdcAdcGains; + private IndexedTable ahdcAdcGainsTable; public void setB(double B) { this.b = B; @@ -152,7 +152,7 @@ public boolean processDataEvent(DataEvent event) { if (run.get() == 0 || (run.get() != 0 && run.get() != newRun)) { run.set(newRun); - ahdcAdcGains = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/gains"); + ahdcAdcGainsTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/gains"); } //Do we need to read the event vx,vy,vz? @@ -359,20 +359,26 @@ public boolean processDataEvent(DataEvent event) { AHDC_hits.add(hit); } } - if (AHDC_hits.isEmpty()) continue; // It can happen that a track has no associated hit, in this case we skip it for the Kalman Filter - AHDC_tracks.add(new Track(AHDC_hits)); // Initialise the position and the momentum using the information of the AHDC::track // position : mm // momentum : MeV - double x = trackBank.getFloat("x", row); - double y = trackBank.getFloat("y", row); - double z = trackBank.getFloat("z", row); - double px = trackBank.getFloat("px", row); - double py = trackBank.getFloat("py", row); - double pz = trackBank.getFloat("pz", row); - double[] vec = {x, y, z, px, py, pz}; - AHDC_tracks.get(row).setPositionAndMomentumVec(vec); - AHDC_tracks.get(row).set_trackId(trackid); + // Invariant: AHDC_hits is non-empty. AHDCEngine's AI_Track_Finding path uses greedy + // non-overlap selection so each PreCluster (and thus each Hit) belongs to at most one + // surviving track, so the set_trackId stamping is unambiguous and every AHDC::track + // row has matching AHDC::hits rows. If this invariant ever flips, the get(0) inside + // Track(ArrayList) fails loudly here, which is the right signal. + Track newTrack = new Track(AHDC_hits); + double[] vec = { + trackBank.getFloat("x", row), + trackBank.getFloat("y", row), + trackBank.getFloat("z", row), + trackBank.getFloat("px", row), + trackBank.getFloat("py", row), + trackBank.getFloat("pz", row) + }; + newTrack.setPositionAndMomentumVec(vec); + newTrack.set_trackId(trackid); + AHDC_tracks.add(newTrack); } // intialise the Kalman Filter double magfieldfactor = runBank.getFloat("solenoid", 0); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java index 7e4974ef3a..ad15498413 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java @@ -55,10 +55,10 @@ public Detector getATOF() { int Run = -1; // ATOF calibration tables (instance-level, refreshed on run change) - private IndexedTable atofEffectiveVelocity; - private IndexedTable atofTimeWalk; - private IndexedTable atofAttenuationLength; - private IndexedTable atofTimeOffsets; + private IndexedTable atofEffectiveVelocityTable; + private IndexedTable atofTimeWalkTable; + private IndexedTable atofAttenuationLengthTable; + private IndexedTable atofTimeOffsetsTable; @Override public boolean processDataEvent(DataEvent event) { @@ -87,10 +87,10 @@ public boolean processDataEvent(DataEvent event) { } int newRun = runNo; if(Run!=newRun) { - atofEffectiveVelocity = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/effective_velocity"); - atofTimeWalk = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/time_walk"); - atofAttenuationLength = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/attenuation"); - atofTimeOffsets = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/time_offsets"); + atofEffectiveVelocityTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/effective_velocity"); + atofTimeWalkTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/time_walk"); + atofAttenuationLengthTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/attenuation"); + atofTimeOffsetsTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/time_offsets"); Run = newRun; } @@ -111,7 +111,7 @@ public boolean processDataEvent(DataEvent event) { //Hit finder init HitFinder hitfinder = new HitFinder(); - hitfinder.findHits(event, ATOF, startTime, atofTimeOffsets, atofEffectiveVelocity); + hitfinder.findHits(event, ATOF, startTime, atofTimeOffsetsTable, atofEffectiveVelocityTable); ArrayList WedgeHits = hitfinder.getWedgeHits(); ArrayList BarHits = hitfinder.getBarHits(); //Exit if hit lists are empty From 73de29b5d45b68f0f276f897186d665d02617dd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:43:36 +0000 Subject: [PATCH 117/190] ci(deps): bump softprops/action-gh-release from 2 to 2.6.1 (#1209) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 2.6.1. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 2.6.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aac21b2ead..ec4bad9bf6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -380,7 +380,7 @@ jobs: mv coatjava{,-${{ env.TAG_NAME }}} tar czf coatjava-${{ env.TAG_NAME }}{.tar.gz,} - name: release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: files: coatjava-${{ env.TAG_NAME }}.tar.gz - name: open issue if failed From efc71b12f090277f9456be5d2fb7c594b65c9921 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:53:34 -0400 Subject: [PATCH 118/190] ci(deps): bump actions/deploy-pages from 4 to 5 (#1208) Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5. - [Release notes](https://github.com/actions/deploy-pages/releases) - [Commits](https://github.com/actions/deploy-pages/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/deploy-pages dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec4bad9bf6..43849d9c78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -352,7 +352,7 @@ jobs: steps: - name: deployment id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 # finalize ############################################################################# From c37ef347f388333fce5f29daa6daf7eb9db0de68 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 23 Apr 2026 19:12:30 -0400 Subject: [PATCH 119/190] add option to only set $PATH (#1219) --- libexec/env.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libexec/env.sh b/libexec/env.sh index 8497746346..543a1f81bd 100644 --- a/libexec/env.sh +++ b/libexec/env.sh @@ -2,6 +2,12 @@ export CLAS12DIR=$(cd $(dirname ${BASH_SOURCE[0]:-$0})/.. && pwd -P) +export PATH=$CLAS12DIR/bin:$PATH + +if [ "${1-}" = '--shell' ]; then + return +fi + # Set default field maps (but do not override user's env): if [ -z "${COAT_MAGFIELD_TORUSMAP-}" ]; then export COAT_MAGFIELD_TORUSMAP=Symm_torus_r2501_phi16_z251_24Apr2018.dat From 93422b842355177d118b63651e24e4f47f1e2947 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 24 Apr 2026 16:18:09 -0400 Subject: [PATCH 120/190] feat: decouple macos/linux build jobs to reduce CI latency (#1222) --- .github/workflows/ci.yml | 76 +++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43849d9c78..3c69cfc8c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,14 +61,46 @@ jobs: # build ############################################################################# + build_macos: + strategy: + fail-fast: true + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-java@v5 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: ${{ env.java_distribution }} + cache: maven + - name: setup cvmfs + uses: cvmfs-contrib/github-action-cvmfs@v5 + with: + cvmfs_repositories: 'oasis.opensciencegrid.org' + - name: cvmfs + run: ls /cvmfs/oasis.opensciencegrid.org/jlab/hallb/clas12/sw/noarch/data/ccdb/ccdb_latest.sqlite + - name: bump version to tag if tag trigger + if: ${{ github.ref_type == 'tag' }} + run: libexec/version-bump.sh ${{ github.ref_name }} + - name: build + run: | + ./build-coatjava.sh --lfs --no-progress -T${{ env.nthreads }} + ./bin/install-clara -b -c ./coatjava ./clara + - name: tar # tarball to preserve permissions + run: | + tar czvf coatjava.tar.gz coatjava + tar czvf clara.tar.gz clara + - uses: actions/upload-artifact@v7 + with: + name: build_macos + retention-days: 1 + path: | + coatjava.tar.gz + clara.tar.gz + build: strategy: fail-fast: true - matrix: - runner: - - ubuntu-latest - - macos-latest - runs-on: ${{ matrix.runner }} + runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 @@ -95,7 +127,7 @@ jobs: tar czvf clara.tar.gz clara - uses: actions/upload-artifact@v7 with: - name: build_${{ matrix.runner }} + name: build_ubuntu-latest retention-days: 1 path: | coatjava.tar.gz @@ -251,8 +283,6 @@ jobs: - { id: eb-epc, cmd: ./run-eb-tests.sh -100 electronprotonC } - { id: eb-enc, cmd: ./run-eb-tests.sh -100 electronneutronC } - { id: eb-eftpi, cmd: ./run-eb-tests.sh -100 electronFTpion } - # run one macos test - - { runner: macos-latest, id: eb-ep, cmd: ./run-eb-tests.sh -100 electronproton } runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v6 @@ -280,6 +310,36 @@ jobs: echo "COMMAND: ${{ matrix.cmd }}" ${{ matrix.cmd }} + test_coatjava_macos: + needs: [ build_macos ] + strategy: + fail-fast: true + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + - name: Set up JDK + uses: actions/setup-java@v5 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: ${{ env.java_distribution }} + cache: maven + - uses: actions/download-artifact@v8 + with: + name: build_macos + - uses: cvmfs-contrib/github-action-cvmfs@v5 + with: + cvmfs_repositories: 'oasis.opensciencegrid.org' + - name: untar build + run: | + tar xzvf coatjava.tar.gz + tar xzvf clara.tar.gz + - name: run test + run: | + git lfs install + git submodule update --init validation/advanced-tests/data + cd validation/advanced-tests + ./run-eb-tests.sh -100 electronproton + test_run-groovy: needs: [ build ] runs-on: ubuntu-latest From 4c4c97bf1596f650e1d02ecc9389160225c66fed Mon Sep 17 00:00:00 2001 From: Uditha Weerasinghe <92590276+skuditha@users.noreply.github.com> Date: Fri, 24 Apr 2026 20:50:51 -0400 Subject: [PATCH 121/190] fix: indexing issue between DECAYS::Particle and REC::VertDoca bank (#1212) Co-authored-by: Uditha Weerasinghe --- .../src/main/java/org/jlab/clas/decay/analysis/Decay.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Decay.java b/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Decay.java index e1c08685b6..36c2c08ce3 100644 --- a/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Decay.java +++ b/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Decay.java @@ -584,8 +584,8 @@ private boolean checkVertDocaBank(Particle p1, Particle p2) { if(getVertBank()!=null) { int nrows2 = getVertBank().rows(); for(int loop2 = 0; loop2 < nrows2; loop2++){ - if(p1.getIdx()-1==(int) getVertBank().getShort("index1", loop2) - && p2.getIdx()-1==(int) getVertBank().getShort("index2", loop2)) { + if(p1.getIdx()==(int) getVertBank().getShort("index1", loop2) + && p2.getIdx()==(int) getVertBank().getShort("index2", loop2)) { p1.vIndex=loop2; p2.vIndex=loop2; @@ -620,8 +620,8 @@ private boolean checkVertDocaBank(Particle p1, Particle p2) { pass=true; return pass; } - if(p2.getIdx()-1==(int) getVertBank().getShort("index1", loop2) - && p1.getIdx()-1==(int) getVertBank().getShort("index2", loop2)) { + if(p2.getIdx()==(int) getVertBank().getShort("index1", loop2) + && p1.getIdx()==(int) getVertBank().getShort("index2", loop2)) { p1.vIndex=loop2; p2.vIndex=loop2; //r = (double) getVertBank().getFloat("r", loop2); From 822fbd3102f5177706a73412cfcf9afa04c30fd6 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Sun, 26 Apr 2026 16:46:28 -0400 Subject: [PATCH 122/190] cleanup: remove unnecessary CLARA reader class (#1223) * remove unnecessary reader class * cleanup --- .../java/org/jlab/io/clara/Clas12Reader.java | 91 ------------------- .../org/jlab/io/clara/Clas12Reader.yaml | 11 --- etc/services/rgd-clarode.yml | 4 +- 3 files changed, 2 insertions(+), 104 deletions(-) delete mode 100644 common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java delete mode 100644 common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java deleted file mode 100644 index cd1f39dc95..0000000000 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.jlab.io.clara; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.file.Path; -import org.jlab.clara.engine.EngineDataType; -import org.jlab.clara.std.services.AbstractEventReaderService; -import org.jlab.clara.std.services.EventReaderException; -import org.jlab.coda.jevio.EvioException; -import org.jlab.detector.decode.CLASDecoder4; -import org.jlab.io.evio.EvioDataEvent; -import org.jlab.io.evio.EvioSource; -import org.jlab.jnp.hipo4.data.Event; -import org.jlab.jnp.hipo4.io.HipoReader; -import org.json.JSONObject; - -/** - * Emulate DecoderReader for EVIO files, or HipoToHipoReader for HIPO files. - * - * @author baltzell - */ -public class Clas12Reader extends AbstractEventReaderService { - - boolean evio; - CLASDecoder4 decoder; - private long maxEvents; - private Double torus; - private Double solenoid; - - @Override - protected Object createReader(Path path, JSONObject opts) throws EventReaderException { - if (path.toString().endsWith(".hipo")) { - evio = false; - HipoReader r = new HipoReader(); - r.open(path.toString()); - return r; - } - else { - evio = true; - EvioSource r = new EvioSource(); - r.open(path.toString()); - maxEvents = r.getEventCount(); - decoder = new CLASDecoder4(); - torus = opts.has("torus") ? opts.getDouble("torus") : null; - solenoid = opts.has("solenoid") ? opts.getDouble("solenoid") : null; - if (opts.has("variation")) decoder.setVariation(opts.getString("variation")); - if (opts.has("timestamp")) decoder.setTimestamp(opts.getString("timestamp")); - return r; - } - } - - @Override - protected void closeReader() { - if (evio) ((EvioSource)reader).close(); - else ((HipoReader)reader).close(); - } - - @Override - protected int readEventCount() throws EventReaderException { - if (evio) return ((EvioSource)reader).getEventCount(); - else return ((HipoReader)reader).getEventCount(); - } - - @Override - protected Object readEvent(int eventNumber) throws EventReaderException { - try { - if (evio) { - if (eventNumber++ >= maxEvents) return null; - ByteBuffer b = ((EvioSource)reader).getEventBuffer(eventNumber, true); - EvioDataEvent e = new EvioDataEvent(b.array(), readByteOrder()); - return decoder.getDecodedEvent(e, -1, eventNumber, torus, solenoid); - } - else { - return ((HipoReader)reader).getEvent(new Event(),eventNumber); - } - } catch (EvioException e) { - throw new EventReaderException(e); - } - } - - @Override - public ByteOrder readByteOrder() throws EventReaderException { - return ByteOrder.LITTLE_ENDIAN; - } - - @Override - protected EngineDataType getDataType() { - return Clas12Types.HIPO; - } - -} diff --git a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml deleted file mode 100644 index 30c6e00495..0000000000 --- a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Clas12Reader -engine: org.jlab.io.clara.Clas12Reader -type: java - -author: Nathan Baltzell -email: baltzell@jlab.org - -version: 0.1 -description: - Reads EVIO or HIPO events from a file, converting to HIPO via "decoding" if EVIO. diff --git a/etc/services/rgd-clarode.yml b/etc/services/rgd-clarode.yml index 0fef0e2016..b3612af29d 100644 --- a/etc/services/rgd-clarode.yml +++ b/etc/services/rgd-clarode.yml @@ -19,8 +19,8 @@ configuration: outputBankPrefix: "HB" io-services: reader: - class: org.jlab.io.clara.Clas12Reader - name: Clas12Reader + class: org.jlab.io.clara.DecoderReader + name: DecoderReader writer: class: org.jlab.io.clara.DecoderWriter name: DecoderWriter From f826f66d54367e543f8709c39b6e9282bc09b3b0 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Sun, 26 Apr 2026 16:53:37 -0400 Subject: [PATCH 123/190] remove example engine (#1224) --- .../clas/service/PulseExtractorEngine.java | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java deleted file mode 100644 index 3f2dc5254e..0000000000 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/service/PulseExtractorEngine.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.jlab.clas.service; - -import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.detector.pulse.Mode3; -import org.jlab.detector.pulse.Mode7; -import org.jlab.detector.pulse.ModeAHDC; -import org.jlab.io.base.DataEvent; - -/** - * An example of using a {@link org.jlab.detector.pulse.HipoExtractor} from a - * {@link org.jlab.clas.reco.ReconstructionEngine}. - * - * @author baltzell - */ -public class PulseExtractorEngine extends ReconstructionEngine { - - Mode3 mode3 = new Mode3(); - Mode3 mode7 = new Mode7(); - ModeAHDC mode_ahdc = new ModeAHDC(); - - public PulseExtractorEngine() { - super("PULSE", "baltzell", "0.0"); - } - - @Override - public boolean init() { - // If using a CCDB table, must register it here: - //requireConstants("/daq/config/ahdc"); - return true; - } - - @Override - public boolean processDataEvent(DataEvent event) { - - // No CCDB table, hardcoded parameters in the extractor: - //mode3.update(6, null, event, "BMT::wf", "BMT::adc"); - //mode7.update(80, null, event, "AHDC::wf", "AHDC::adc"); - mode_ahdc.update(30, null, event, "AHDC::wf", "AHDC::adc"); - - /* - // Requiring a CCDB table: - DataBank runConfig = event.getBank("RUN::config"); - if (runConfig.rows()>0) { - IndexedTable it = getConstantsManager().getConstants( - runConfig.getInt("run", 0), "/daq/config/ahdc"); - basic.update(136, it, event, "AHDC::wf", "AHDC::adc"); - } - */ - - return true; - } - -} From b3c4fc24ab36aa32a87e45ff3c84ec63d320240a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 09:24:13 -0400 Subject: [PATCH 124/190] ci(deps): bump actions/upload-pages-artifact from 4 to 5 (#1227) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c69cfc8c9..453bd9dd84 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -394,7 +394,7 @@ jobs: libexec/build-javadocs.sh mv target/reports/apidocs pages/javadoc ### upload artifacts - - uses: actions/upload-pages-artifact@v4 + - uses: actions/upload-pages-artifact@v5 with: retention-days: 7 path: pages/ From 8fac63d3adb6db8bded6678ff07f52846a0bca2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 13:33:11 +0000 Subject: [PATCH 125/190] ci(deps): bump actions/github-script from 8 to 9 (#1226) --- .github/workflows/submodule.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/submodule.yml b/.github/workflows/submodule.yml index a647fa395d..0141491d6a 100644 --- a/.github/workflows/submodule.yml +++ b/.github/workflows/submodule.yml @@ -29,7 +29,7 @@ jobs: cat changes.txt >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: comment - uses: actions/github-script@v8 + uses: actions/github-script@v9 with: script: | github.rest.issues.createComment({ From 957842592404045ab54a0baa66bedce7cd8e54cc Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 27 Apr 2026 10:57:15 -0400 Subject: [PATCH 126/190] fix run-clara for macos (#1221) * higher ports on macos, cleanup process dpe process * remove ineffective pid trap Removed process ID handling and cleanup trap. --- bin/run-clara | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/run-clara b/bin/run-clara index 798ffd6544..05c0b6b148 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -127,7 +127,7 @@ function get_host_ip() { } function get_dpe_port() { local ports - ports=$(seq 7000 20 8000) + ports=$(seq 49152 20 65535) command -v shuf >/dev/null 2>&1 && ports=$(echo "$ports" | shuf) for port in $ports do @@ -153,7 +153,7 @@ then --max-sockets 5120 --report 5 \ 2>&1 | tee $CLARA_USER_DATA/log/dpe.log & set +v - #echo "Sleeping 7 ......." && sleep 7 + sleep 1 unset JAVA_OPTS set -v $CLARA_HOME/bin/clara-orchestrator \ From 298028360a8b05f761d53a4d9ed67d60a38e4e6b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 30 Apr 2026 14:18:33 -0400 Subject: [PATCH 127/190] fix: disable gnuplot fit logging and log file (#1232) * disable gnuplot fit logfile * also silence stderr/stdout --- libexec/scaling.gpl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libexec/scaling.gpl b/libexec/scaling.gpl index 1589761971..3c5598d0d4 100644 --- a/libexec/scaling.gpl +++ b/libexec/scaling.gpl @@ -67,6 +67,8 @@ set key nobox inside top left f(x) = m*x m = 2 +set fit quiet +set fit nolog fit [0:24] f(x) datafile using 1:(1/$2*1e3) via m rate = sprintf('%.1f Hz/CPU',m) plot datafile using 1:(1/$2*1e3) pt 7 notitle, f(x) title rate @@ -83,7 +85,6 @@ plot datafile \ '' using 1:($5) pt 9 with points title 'Reader' ,\ '' using 1:((column($#-1))) pt 11 with points title 'Writer' ,\ -#set logscale y set size 0.6,1.0 set origin 0.4,0.0 set key outside right vertical From 9a7978de80c590209afcf70c39d15e9f50bcf300 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 30 Apr 2026 14:27:10 -0400 Subject: [PATCH 128/190] just run gnuplot automatically if available (#1233) --- libexec/scaling | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libexec/scaling b/libexec/scaling index b5fb0c9412..735b74a1e8 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -123,6 +123,22 @@ def save(benchmarks): for row in table(benchmarks): f.write(' '.join([str(x) for x in row])+'\n') +def plot(): + import os,shutil,subprocess + if shutil.which('gnuplot'): + g = os.path.dirname(os.path.abspath(__file__))+'/scaling.gpl' + r = subprocess.run(['gnuplot',g], capture_output=True, text=True) + if r.returncode == 0: + with open('scaling.svg','w') as f: + f.write(r.stdout) + print('Info: created scaling.svg from scaling.txt and scaling.gpl!') + else: + print(r.stdout) + print(r.stderr) + print('Error: gnuplot failed!') + else: + print('Warning: gnuplot is not in $PATH.') + if __name__ == '__main__': cfg = cli() import os @@ -133,4 +149,5 @@ if __name__ == '__main__': benchmarks.append([threads, benchmark(cfg, threads, log)]) show(benchmarks) save(benchmarks) + plot() From 1398e1e6903a559e5f553be01d700c717a73ce26 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 30 Apr 2026 14:37:30 -0400 Subject: [PATCH 129/190] use events instead of events/thread (#1231) --- libexec/scaling | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libexec/scaling b/libexec/scaling index 735b74a1e8..a5f73beec8 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -6,7 +6,7 @@ def cli(): cli.add_argument('-y','--yaml', metavar='YAML',help='path to YAML file',required=True) cli.add_argument('-c','--clara', metavar='DIR',help='CLARA_HOME path (default=$CLARA_HOME)',default=os.getenv('CLARA_HOME',None)) cli.add_argument('-t','--threads',metavar='#',help='threads (default=4,8)',default='4,8') - cli.add_argument('-e','--events', metavar='#',help='events per thread (default=555)',default=555,type=int) + cli.add_argument('-e','--events', metavar='#',help='events per threads (default=2555)',default=2555,type=int) cli.add_argument('-N','--numa', metavar='#',help='NUMA socket (default=None, choices=[0,1])',default=None,type=int,choices=[0,1]) cli.add_argument('datafile', help='input EVIO/HIPO data file') cfg = cli.parse_args() @@ -58,7 +58,7 @@ def benchmark(cfg, threads, log): # add the run-clara command: cmd.extend([cfg.run_clara, '-c',cfg.clara, - '-n',str(cfg.events*int(threads)), + '-n',str(cfg.events), '-t',str(threads), '-l', '-y',cfg.yaml, From 3fafda781e779b6ed44817feb7788ed9f890c725 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 4 May 2026 09:57:51 -0400 Subject: [PATCH 130/190] reduce cosines (#1237) --- .../org/jlab/rec/dc/timetodistance/TableLoader.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java index 1ff5c51e32..947ec8f809 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java @@ -229,18 +229,15 @@ private static int getAlphaBin(double Alpha) { } private static synchronized void FillAlpha() { + final double cos30 = Math.cos(Math.toRadians(30.)); for(int icosalpha =0; icosalpha Date: Mon, 4 May 2026 12:23:09 -0400 Subject: [PATCH 131/190] back to events-per-thread and better default threads for scaling script (#1241) --- libexec/scaling | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libexec/scaling b/libexec/scaling index a5f73beec8..30064ada1e 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -5,8 +5,8 @@ def cli(): cli = argparse.ArgumentParser(description='CLARA scaling test') cli.add_argument('-y','--yaml', metavar='YAML',help='path to YAML file',required=True) cli.add_argument('-c','--clara', metavar='DIR',help='CLARA_HOME path (default=$CLARA_HOME)',default=os.getenv('CLARA_HOME',None)) - cli.add_argument('-t','--threads',metavar='#',help='threads (default=4,8)',default='4,8') - cli.add_argument('-e','--events', metavar='#',help='events per threads (default=2555)',default=2555,type=int) + cli.add_argument('-t','--threads',metavar='#',help='threads (default=8,16,24,34,44)',default='8,16,24,34,44') + cli.add_argument('-e','--events', metavar='#',help='events per thread (default=555)',default=555,type=int) cli.add_argument('-N','--numa', metavar='#',help='NUMA socket (default=None, choices=[0,1])',default=None,type=int,choices=[0,1]) cli.add_argument('datafile', help='input EVIO/HIPO data file') cfg = cli.parse_args() @@ -58,7 +58,7 @@ def benchmark(cfg, threads, log): # add the run-clara command: cmd.extend([cfg.run_clara, '-c',cfg.clara, - '-n',str(cfg.events), + '-n',str(cfg.events*int(threads)), '-t',str(threads), '-l', '-y',cfg.yaml, From c143e4e8d5f43434ed43b25cd79b6af9897cdb8c Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 8 May 2026 15:08:20 -0400 Subject: [PATCH 132/190] fix: replace chains of DC ifs with if-elses (#1245) --- .../dc/cluster/ClusterCleanerUtilities.java | 61 ++++++------------- 1 file changed, 20 insertions(+), 41 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index 6ab72f997e..48643ca6e2 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -17,14 +17,13 @@ public class ClusterCleanerUtilities { private static final Logger LOGGER = Logger.getLogger(ClusterCleanerUtilities.class.getName()); + private List> sortedHits; + public ClusterCleanerUtilities() { - List> sortdHits = new ArrayList<>(); - for(int l = 0; l < 6; l++) { - sortdHits.add(new ArrayList<>()); - } - sortedHits = sortdHits; + sortedHits = new ArrayList<>(); + for(int l = 0; l < 6; l++) sortedHits.add(new ArrayList<>()); } - private List> sortedHits = null; + /** * * Pattern Recognition step for identifying clusters in a clump: Find the @@ -220,7 +219,6 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI FittedCluster bestCls = OverlappingClusterResolver(cluster, splitclusters); if (bestCls != null) { - if (!(selectedClusList.contains(bestCls))) { selectedClusList.add(bestCls); } @@ -237,7 +235,6 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI FittedCluster bestCls = OverlappingClusterResolver(cluster, selectedClusList); if (bestCls != null) { - if (!(selectedClusList2.contains(bestCls))) { selectedClusList2.add(bestCls); } @@ -283,12 +280,9 @@ public List> byLayerListSorter(List DCHits, int sector, int super */ public int count_nlayers_hit(Hit[] hits_inlayer) { int nlayr = 6; - Hit[] allhits_inlayer = new Hit[nlayr]; - allhits_inlayer = hits_inlayer; - int nlayers_hit = 0; for (int la = 0; la < nlayr; la++) { - if (allhits_inlayer[la] != null) { + if (hits_inlayer[la] != null) { nlayers_hit++; } } @@ -341,7 +335,6 @@ public FittedCluster LRAmbiguityResolver(DataEvent event, FittedCluster fClus, if (hit.get_LeftRightAmb() == 0) { index++; } - } if (index == 0) { return fClus; // cluster OK @@ -445,7 +438,7 @@ public FittedCluster LRAmbiguityResolver(DataEvent event, FittedCluster fClus, arrayOfClus.get(0).addAll(okClus); arrayOfClus.get(1).addAll(okClus); } - if (index == 2) { + else if (index == 2) { for (int i1 = 0; i1 < totNotLRClus.size(); i1++) { for (int i2 = 2; i2 < totNotLRClus.size(); i2++) { if (totNotLRClus.get(i1).get_Id() == totNotLRClus.get(i2).get_Id()) { @@ -459,8 +452,7 @@ public FittedCluster LRAmbiguityResolver(DataEvent event, FittedCluster fClus, } } } - - if (index == 3) { + else if (index == 3) { for (int i1 = 0; i1 < totNotLRClus.size(); i1++) { for (int i2 = 2; i2 < totNotLRClus.size(); i2++) { for (int i3 = 4; i3 < totNotLRClus.size(); i3++) { @@ -479,8 +471,7 @@ public FittedCluster LRAmbiguityResolver(DataEvent event, FittedCluster fClus, } } } - - if (index == 4) { + else if (index == 4) { for (int i1 = 0; i1 < totNotLRClus.size(); i1++) { for (int i2 = 2; i2 < totNotLRClus.size(); i2++) { for (int i3 = 4; i3 < totNotLRClus.size(); i3++) { @@ -505,8 +496,7 @@ public FittedCluster LRAmbiguityResolver(DataEvent event, FittedCluster fClus, } } } - - if (index == 5) { + else if (index == 5) { for (int i1 = 0; i1 < totNotLRClus.size(); i1++) { for (int i2 = 2; i2 < totNotLRClus.size(); i2++) { for (int i3 = 4; i3 < totNotLRClus.size(); i3++) { @@ -538,8 +528,7 @@ public FittedCluster LRAmbiguityResolver(DataEvent event, FittedCluster fClus, } } } - - if (index == 6) { + else if (index == 6) { for (int i1 = 0; i1 < totNotLRClus.size(); i1++) { for (int i2 = 2; i2 < totNotLRClus.size(); i2++) { for (int i3 = 4; i3 < totNotLRClus.size(); i3++) { @@ -613,14 +602,14 @@ public FittedCluster SecondariesRemover(DataEvent event, FittedCluster clus, Clu if (hitsInLayer.isEmpty()) { continue; } - if (hitsInLayer.size() == 1) { + else if (hitsInLayer.size() == 1) { baseClusterHits.addAll(hitsInLayer); // safe all good hits to base cluster for (int j = 0; j < hitsInLayer.size(); j++) { hitsInLayer.get(j).set_LeftRightAmb(0); hitsInLayer.get(j).updateHitPositionWithTime(event, 1, hitsInLayer.get(j).getB(), tab, DcDetector, tde); } } - if (hitsInLayer.size() == 2) { + else if (hitsInLayer.size() == 2) { double docaSum = 0; for (int j = 0; j < hitsInLayer.size(); j++) { docaSum += hitsInLayer.get(j).get_Doca(); @@ -665,7 +654,6 @@ public FittedCluster SecondariesRemover(DataEvent event, FittedCluster clus, Clu } if (nbLyr > 0) { - for (int[] get : Constants.getInstance().CombArray.get(nbLyr - 1)) { ArrayList hitsInClusterCand = new ArrayList<>(); hitsInClusterCand.addAll(baseClusterHits); @@ -675,6 +663,7 @@ public FittedCluster SecondariesRemover(DataEvent event, FittedCluster clus, Clu hitsInClusCandLists.add(hitsInClusterCand); } } + for (int i = 0; i < hitsInClusCandLists.size(); i++) { FittedCluster newClus = new FittedCluster(clus.getBaseCluster()); for (int i1 = 0; i1 < newClus.size(); i1++) { @@ -794,7 +783,7 @@ public List HitListPruner(List hits) { rmHits.removeAll(kHits); sortedHits.get(l).removeAll(rmHits); } - if(sortedHits.get(l).size()>4 && sortedHits.get(l).size()<10) { + else if(sortedHits.get(l).size()>4 && sortedHits.get(l).size()<10) { ArrayList rmHits = (ArrayList) sortedHits.get(l).clone(); ArrayList kHits = new ArrayList<>(); kHits.add(sortedHits.get(l).get(0)); @@ -804,7 +793,7 @@ public List HitListPruner(List hits) { rmHits.removeAll(kHits); sortedHits.get(l).removeAll(rmHits); } - if(sortedHits.get(l).size()>=10) + else if(sortedHits.get(l).size()>=10) sortedHits.get(l).removeAll(sortedHits.get(l)); } @@ -861,13 +850,13 @@ public FittedCluster IsolatedHitsPruner(FittedCluster clus) { fcluster.add(clus.get(i)); } } - if (layer == 6) // look of neighbor in previous layer + else if (layer == 6) // look of neighbor in previous layer { if (HitArray[layer - 2][wire - 1] != null || HitArray[layer - 2][wire - 2] != null || HitArray[layer - 2][wire] != null || HitArray[layer - 1][wire - 2] != null || HitArray[layer - 1][wire] != null) { fcluster.add(clus.get(i)); } } - if (layer > 1 && layer < 6) // look of neighbor in next and previous layers + else if (layer > 1 && layer < 6) // look of neighbor in next and previous layers { if (HitArray[layer][wire - 1] != null || HitArray[layer][wire - 2] != null || HitArray[layer][wire] != null || HitArray[layer - 2][wire - 1] != null || HitArray[layer - 2][wire - 2] != null || HitArray[layer - 2][wire] != null || HitArray[layer - 1][wire - 2] != null || HitArray[layer - 1][wire] != null) { fcluster.add(clus.get(i)); @@ -929,7 +918,7 @@ public FittedCluster ClusterCleaner(FittedCluster clus, ClusterFitter cf, DCGean baseClusterHits.addAll(hitsInLayer); // safe all good hits to base cluster } - if (hitsInLayer.size() == 2) { + else if (hitsInLayer.size() == 2) { double docaSum = 0; for (int j = 0; j < hitsInLayer.size(); j++) { docaSum += hitsInLayer.get(j).get_Residual(); @@ -963,7 +952,6 @@ public FittedCluster ClusterCleaner(FittedCluster clus, ClusterFitter cf, DCGean } if (nbLyr > 0) { - for (int[] get : Constants.getInstance().CombArray.get(nbLyr - 1)) { ArrayList hitsInClusterCand = new ArrayList<>(); hitsInClusterCand.addAll(baseClusterHits); @@ -973,6 +961,7 @@ public FittedCluster ClusterCleaner(FittedCluster clus, ClusterFitter cf, DCGean hitsInClusCandLists.add(hitsInClusterCand); } } + for (int i = 0; i < hitsInClusCandLists.size(); i++) { FittedCluster newClus = new FittedCluster(clus.getBaseCluster()); for (int i1 = 0; i1 < newClus.size(); i1++) { @@ -982,17 +971,7 @@ public FittedCluster ClusterCleaner(FittedCluster clus, ClusterFitter cf, DCGean clusters.add(newClus); } - // get the best cluster - //LOGGER.log(Level.INFO, " clusters for selection "); - //for(FittedCluster c : clusters) { - // LOGGER.log(Level.INFO, c.printInfo()); - // for(FittedHit h : c) - // LOGGER.log(Level.INFO, h.printInfo()); - //} FittedCluster BestCluster = cf.BestClusterSelector(clusters, "LC"); - //LOGGER.log(Level.INFO, " ---> selected cluster : "); - //for(FittedHit h : BestCluster) - // LOGGER.log(Level.INFO, h.printInfo()); return BestCluster; } From 2e3d74476de3135a08fc3e0443097e2ac85cbe4f Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 8 May 2026 15:17:12 -0400 Subject: [PATCH 133/190] fix: reduce DCA swim stopper overhead (#1244) --- .../src/main/java/org/jlab/clas/swimtools/Swim.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/Swim.java b/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/Swim.java index 66897dc346..e83c49fd66 100644 --- a/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/Swim.java +++ b/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/Swim.java @@ -1361,21 +1361,20 @@ public DCASwimStopper(SwimTrajectory swimTraj) { @Override public boolean stopIntegration(double t, double[] y) { - Point3D dcaCand = new Point3D(y[0],y[1],y[2]); double maxDoca = Double.POSITIVE_INFINITY; - - for(Line3D l : polylines) { - if(l.distance(dcaCand).length() Date: Fri, 8 May 2026 15:45:18 -0400 Subject: [PATCH 134/190] feat: add GitLab profiling and pages jobs (#1248) --- .gitlab-ci.yml | 113 ++++++++++++++++++++++++++------------ docs/mkdocs/docs/index.md | 6 +- libexec/profile | 64 +++++++++++---------- 3 files changed, 119 insertions(+), 64 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b4cae92810..7c1117abf5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: codecr.jlab.org/hallb/clas12/container-forge/base:latest +image: codecr.jlab.org/hallb/clas12/iguana/ci_no_root:latest workflow: rules: @@ -6,13 +6,16 @@ workflow: auto_cancel: on_new_commit: interruptible - if: $CI_PIPELINE_SOURCE == "schedule" - - if: $CI_COMMIT_BRANCH == "main" + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH auto_cancel: on_new_commit: conservative - if: $CI_COMMIT_TAG auto_cancel: on_new_commit: conservative +variables: + EVIOFILE: clas_018779.evio.00001 + default: interruptible: true before_script: @@ -22,6 +25,25 @@ default: - export PATH=$CLARA_HOME/bin:$PATH - export PATH=$COATJAVA/bin:$PATH +.clon: + tags: + - clonfarm3-shell + stage: test + needs: [build,download] + dependencies: [build,download] + interruptible: true + before_script: + - export JAVA_HOME=/usr/clas12/offline/jdk/21.0.2 + - export PATH=$JAVA_HOME:$PATH + - export PATH=/usr/clas12/offline/maven/3.9.6/bin:$PATH + - export PATH=/usr/clas12/offline/asprof/4.4/bin:$PATH + - export CLARA_HOME=$CI_PROJECT_DIR/clara + - export COATJAVA=$CI_PROJECT_DIR/coatjava + - export PATH=$CLARA_HOME/plugins/clas12/bin:$PATH + - export PATH=$CLARA_HOME/bin:$PATH + - export PATH=$COATJAVA/bin:$PATH + - tar -xzvf clara.tar.gz + stages: - mirror - build @@ -50,7 +72,7 @@ build: optional: true script: - git config --global --add safe.directory $CI_PROJECT_DIR - - ./build-coatjava.sh --lfs --clara -T$JL_RUNNER_AVAIL_CPU --quiet --no-progress + - ./build-coatjava.sh --lfs --clara -T48 --quiet --no-progress - tar -czf coatjava.tar.gz coatjava - tar -czf clara.tar.gz clara artifacts: @@ -63,31 +85,33 @@ build: download: stage: build script: -# - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-d/clas_018779.evio.00001 ./ - - git lfs install - - git clone https://code.jlab.org/hallb/clas12/validation-data - - cp validation-data/raw/rg-d/clas_018779.evio.00001 . + - GIT_LFS_SKIP_SMUDGE=1 git clone https://code.jlab.org/hallb/clas12/validation-data + - cd validation-data + - git lfs install --skip-smudge + - git config lfs.fetchinclude raw/rg-d/$EVIOFILE + - git lfs pull + - cd - + - ln validation-data/raw/rg-d/$EVIOFILE artifacts: when: always - expire_in: 1 day paths: - - clas_018779.evio.00001 + - $EVIOFILE -.spotbugs: +spotbugs: stage: test needs: [build] dependencies: [build] script: - tar -xzf coatjava.tar.gz - - ./build-coatjava.sh -T$JL_RUNNER_AVAIL_CPU --spotbugs --quiet --no-progress + - ./build-coatjava.sh -T48 --spotbugs --quiet --no-progress -.unit_tests: +unit-tests: stage: test needs: [build] dependencies: [build] script: - tar -xzf coatjava.tar.gz - - ./build-coatjava.sh -T$JL_RUNNER_AVAIL_CPU --lfs --unittests --quiet --no-progress + - ./build-coatjava.sh -T48 --lfs --unittests --quiet --no-progress - ./validation/jacoco-aggregate.sh artifacts: when: always @@ -95,10 +119,10 @@ download: paths: - publish -.docs: +docs: stage: test - needs: [build,unit_tests] - dependencies: [build,unit_tests] + needs: [build,unit-tests] + dependencies: [build,unit-tests] script: - tar -xzf coatjava.tar.gz - python3 -m venv venv @@ -111,7 +135,7 @@ download: - cp -r publish pages/jacoco artifacts: when: always - expire_in: 7 days + expire_in: 1 week paths: - pages @@ -121,7 +145,6 @@ eb: dependencies: [build] script: - tar -xzf coatjava.tar.gz - - tar -xzf clara.tar.gz - git config --global --add safe.directory $CI_PROJECT_DIR - git lfs install - git submodule update --init validation/advanced-tests/data @@ -141,12 +164,7 @@ decoder: dependencies: [build,download] script: - tar -xzf clara.tar.gz - - decoder -l FINE -n 1000 -o clas_018779_00001.hipo clas_018779.evio.00001 - artifacts: - when: always - expire_in: 1 day - paths: - - clas_018779_00001.hipo + - decoder -l FINE -n 1000 -o decoded.hipo $EVIOFILE clara: stage: test @@ -154,24 +172,49 @@ clara: dependencies: [build,download] script: - tar -xzf clara.tar.gz - - run-clara -v -c $CLARA_HOME -t $JL_RUNNER_AVAIL_CPU -y ./etc/services/rgd-clarode.yml -n 100 -o out clas_018779.evio.00001 + - run-clara -v -c $CLARA_HOME -t 4 -y ./etc/services/rgd-clarode.yml -n 30 -o out $EVIOFILE + - mv out/rec_$EVIOFILE.hipo claroded.hipo profile: - stage: test - needs: [build,decoder] - dependencies: [build,decoder] + extends: .clon + allow_failure: true script: - - tar -xzf coatjava.tar.gz - - libexec/profile -f flamegraph -e cpu clas_018779_00001.hipo - - libexec/profile -f flamegraph -e nativemem clas_018779_00001.hipo - - libexec/profile -f flamegraph -e alloc clas_018779_00001.hipo + - ./clara/plugins/clas12/libexec/profile -e cpu run-clara -c ./clara -y ./etc/services/rgd-clarode.yml -o tmp1 -t 16 -l $EVIOFILE + - ./clara/plugins/clas12/libexec/profile -e alloc run-clara -c ./clara -y ./etc/services/rgd-clarode.yml -o tmp2 -t 16 -l $EVIOFILE + - ./clara/plugins/clas12/libexec/profile -e lock run-clara -c ./clara -y ./etc/services/rgd-clarode.yml -o tmp3 -t 16 -l $EVIOFILE artifacts: when: always expire_in: 1 week paths: - - pro_flamegraph_cpu_clas_018779_00001 - - pro_flamegraph_nativemem_clas_018779_00001 - - pro_flamegraph_alloc_clas_018779_00001 + - "asprof*.html" + +scaling: + extends: .clon + allow_failure: true + script: + - ./clara/plugins/clas12/libexec/scaling -c ./clara -y ./etc/services/rgd-clarode.yml -t 8,12,18,24 $EVIOFILE + artifacts: + when: always + expire_in: 1 week + paths: + - scaling.svg + +pages: + stage: deploy + needs: [profile,scaling,docs] + dependencies: [profile,scaling,docs] + script: + - cp -r pages public + - mkdir public/perf + - cp asprof*.html public/perf + - cp scaling.svg public/perf + pages: true + artifacts: + expire_in: 1 week + paths: + - public + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH .deploy: stage: deploy diff --git a/docs/mkdocs/docs/index.md b/docs/mkdocs/docs/index.md index 25a1cf9442..1dc49c17df 100644 --- a/docs/mkdocs/docs/index.md +++ b/docs/mkdocs/docs/index.md @@ -12,4 +12,8 @@ --- ## Reports -- [Coverage Report](jacoco/index.html) +- [Jacoco Coverage](jacoco/index.html) +- [Scaling Test](perf/scaling.svg) +- [Cpu Profiling](perf/asprof_cpu.html) +- [Alloc Profiling](perf/asprof_alloc.html) +- [Lock Profiling](perf/asprof_lock.html) diff --git a/libexec/profile b/libexec/profile index 19da5dbd5c..a16b534935 100755 --- a/libexec/profile +++ b/libexec/profile @@ -1,29 +1,31 @@ #!/bin/bash event=cpu -format=flat -seconds=12 -usage1="Usage: profile [-h] [-s seconds] [-w seconds] [-e event] [-f format] [--] executable args" -usage2="Usage: profile [options] executable args\nOptions:\n\t[-h] [-s seconds] [-w seconds]\n\t[-e cpu|alloc|nativemem|lock|cache-misses]\n\t[-f flat|traces|collapsed|flamegraph|tree|jfr|otlp]" +profile_seconds=30 +warmup_seconds=60 +usage1="Usage: profile [-h] [-s seconds] [-w seconds] [-e event] [--] executable args" +usage2="Usage: profile [options] executable args\nOptions:\n\t[-h] [-s seconds] [-w seconds]\n\t[-e cpu|alloc|nativemem|lock|cache-misses]" -while getopts s:f:e:o:w:h opt +let tail_seconds=warmup_seconds-5 +let sleep_seconds=5 + +while getopts s:e:o:w:h opt do case $opt in - s) seconds=$OPTARG ;; - f) format=$OPTARG ;; + s) profile_seconds=$OPTARG ;; + w) warmup_seconds=$OPTARG ;; e) event=$OPTARG ;; o) stub=$OPTARG ;; - w) warmup=$OPTARG ;; h) echo -e $usage2 && exit 0 ;; --) break ;; \?) echo $usage1 && exit 1 ;; -# :) echo $usage1 && exit 2 ;; esac done shift $((OPTIND-1)) executable=$1 arguments=${@:2} +logfile=asprof$stub.log which asprof >& /dev/null [ "$?" -ne 0 ] && echo 'ERROR: asprof is not in $PATH.' && echo -e $usage2 && exit 3 @@ -32,30 +34,36 @@ which $executable >& /dev/null [ "$?" -ne 0 ] && echo "ERROR: $executable is not in \$PATH." && echo -e $usage2 && exit 4 echo "Running asprof on '$executable $arguments' ..." +sleep 1 -set -e +rm -f $logfile && touch $logfile -$executable $arguments >& asprof_$stub.log +set -e +$executable $arguments >> $logfile 2>&1 & +set +e pid_bash=$! +echo info: pid bash=$pid_bash, getting java ... +sleep 1 +pid_java=$(pgrep -P $pid_bash) +sleep 1 +# go 2 deep for run-clara: +pid_java=$(pgrep -P $pid_java | head -n 1) +echo info: pid java=$pid_java +tail -f $logfile & +pid_tail=$! +sleep $tail_seconds +kill -9 $pid_tail -echo PID1=$pid_bash -sleep 5 -pid_java=$(pgrep -P "$pid_bash") - -echo PID2=$pid_java - -ps waux && ps -p $pid_java - -echo "Waiting for $warmup seconds of warmup ..." -for x in $(seq $warmup); do let y=$warmup-$x && echo -e -n "\r$y ..." && sleep 1; done - -# This 42 is probably for recon-util: -tail -n 42 asprof_$stub.log +set -e +asprof -e $event -d $profile_seconds -f asprof_${event}$stub.html $pid_java >> $logfile 2>&1 & +pid_asprof=$! +set +e -asprof --title "Coatjava:asprof:$executable:$event" -e $event \ - -d $seconds -o $format -f asprof_${format}_${event}_$stub $pid_java +tail -f $logfile & +pid_tail=$! +wait $pid_asprof +kill -9 $pid_bash +kill -9 $pid_tail kill -9 $pid_java -rm -f asprof_$stub.hipo - From add24dc7deeea6fa3f593fb9276df34ecd7b125f Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 8 May 2026 16:09:31 -0400 Subject: [PATCH 135/190] remove unnecessary check (#1250) --- .../magfield/src/main/java/cnuphys/magfield/Cell3D.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/Cell3D.java b/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/Cell3D.java index 20b5141000..7562b86019 100644 --- a/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/Cell3D.java +++ b/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/Cell3D.java @@ -71,14 +71,9 @@ private boolean reset(double q1, double q2, double q3) { for (int k = 0; k < 2; k++) { int nn3 = _n3 + k; int index = _probe.getCompositeIndex(nn1, nn2, nn3); - - if (index < 0) { - System.out.println(); - } c[i][j][k][0] = _probe.getB1(index); c[i][j][k][1] = _probe.getB2(index); c[i][j][k][2] = _probe.getB3(index); - } } } From 646a0790734a997e0bb806ddebeccee8819476ff Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 8 May 2026 19:09:54 -0400 Subject: [PATCH 136/190] feat: add thread affinity options to scaling script (#1239) * add -C and -T options * back to events per thread --- libexec/scaling | 55 ++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/libexec/scaling b/libexec/scaling index 30064ada1e..6cad8e3450 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -7,36 +7,38 @@ def cli(): cli.add_argument('-c','--clara', metavar='DIR',help='CLARA_HOME path (default=$CLARA_HOME)',default=os.getenv('CLARA_HOME',None)) cli.add_argument('-t','--threads',metavar='#',help='threads (default=8,16,24,34,44)',default='8,16,24,34,44') cli.add_argument('-e','--events', metavar='#',help='events per thread (default=555)',default=555,type=int) - cli.add_argument('-N','--numa', metavar='#',help='NUMA socket (default=None, choices=[0,1])',default=None,type=int,choices=[0,1]) + cli.add_argument('-N','--numa', metavar='#',help='restrict to a NUMA socket (choices=[0,1])',choices=[0,1]) + cli.add_argument('-C','--cpus', metavar='#',help='restrict to a CPU list (e.g. 0,1,2,3)') + cli.add_argument('-T','--cputhr', metavar='#',help='restrict to same number of CPUs as threads') cli.add_argument('datafile', help='input EVIO/HIPO data file') cfg = cli.parse_args() cfg.threads = cfg.threads.split(',') if not cfg.clara: cli.error('cannot find CLARA installation via -c or $CLARA_HOME') - cfg.run_clara = find_run_clara(cfg.clara) - if not cfg.run_clara: - cli.error('cannot find run-clara in $PATH or CLARA installation') - if cfg.numa is not None: + elif shutil.which('run-clara'): + cfg.run_clara = shutil.which('run-clara') + elif os.path.exists(clara_home + '/plugins/clas12/bin/run-clara'): + cfg.run_clara = clara_home + '/plugins/clas12/bin/run-clara' + else: + cli.error('cannot find run-clara in $PATH or $CLARA_HOME') + if cfg.cpus: + try: + cfg.cpus = ','.join([str(int(i)) for i in cfg.cpus.split(',')]) + except Exception as e: + cli.error('invalid --cpus argument: {cfg.cpus}') + elif cfg.numa or cfg.cputhr: + if not cfg.numa: + cfg.numa = 0 if not shutil.which('numactl'): cli.error('numactl is not in $PATH, --numa option not supported') - if len(list(get_numa_cpus(cfg.numa))) == 0: - cli.error('invalid --numa node: {cfg.numa}') - cfg.numa = ','.join(list(get_numa_cpus(cfg.numa))) + for x in run(['numactl','-H']): + if x.startswith(f'node {cfg.numa} cpus:'): + cfg.cpus = ','.join([str(int(i)) for i in x.strip().split()[3:]]) + break + if not cfg.cpus: + cli.error('error determining cpu list for -C or -T') return cfg -def find_run_clara(clara_home): - import os,shutil - if shutil.which('run-clara'): - return shutil.which('run-clara') - elif os.path.exists(clara_home + '/plugins/clas12/bin/run-clara'): - return clara_home + '/plugins/clas12/bin/run-clara' - -def get_numa_cpus(node): - for line in run(['numactl','-H']): - if line.startswith(f'node {node} cpus:'): - for col in line.strip().split()[3:]: - yield col - def run(cmd): import subprocess print('run >>> '+' '.join(cmd)) @@ -46,15 +48,16 @@ def run(cmd): if len(line) > 0: yield line p.wait() - if p.returncode != 0: - pass def benchmark(cfg, threads, log): import collections cmd = [] - # use taskset: - if cfg.numa is not None: - cmd.extend(['taskset','-c',cfg.numa]) + # use taskset for thread affinity: + if cfg.cpus: + if cfg.cputhr: + cmd.extend(['taskset','-c',','.join(cfg.cpus.split(',')[:threads])]) + else: + cmd.extend(['taskset','-c',cfg.cpus]) # add the run-clara command: cmd.extend([cfg.run_clara, '-c',cfg.clara, From e425aae216f8bef9661c719ee7dfa45ff3382e22 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 8 May 2026 19:24:34 -0400 Subject: [PATCH 137/190] fix: reduce thread contention in DC TableLoader (#1238) * cleanup * private some methods and reduce locks --------- Co-authored-by: raffaelladevita --- .../jlab/rec/dc/timetodistance/TableLoader.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java index 947ec8f809..3742f6e906 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java @@ -228,7 +228,7 @@ private static int getAlphaBin(double Alpha) { return bin; } - private static synchronized void FillAlpha() { + private static void FillAlpha() { final double cos30 = Math.cos(Math.toRadians(30.)); for(int icosalpha =0; icosalpha Date: Fri, 8 May 2026 19:33:07 -0400 Subject: [PATCH 138/190] fix: more hash/index-based IndexedTable access in DC (#1236) * switch to row/hash based lookup * reduce hashing * fix oops --- .../src/main/java/org/jlab/rec/dc/Constants.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java index e11d0ac1b6..ad651acd4e 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java @@ -519,14 +519,15 @@ private void addReverseTT(int run, IndexedTable tt) { int crate = tt.getList().getIndexGenerator().getIndex((long)key, 0); int slot = tt.getList().getIndexGenerator().getIndex((long)key, 1); int channel = tt.getList().getIndexGenerator().getIndex((long)key, 2); - int sector = tt.getIntValue("sector", crate,slot,channel); - int layer = tt.getIntValue("layer", crate,slot,channel); - int comp = tt.getIntValue("component", crate,slot,channel); - int order = tt.getIntValue("order", crate,slot,channel); + int sector = tt.getIntValueByHash(0, (long)key); + int layer = tt.getIntValueByHash(1, (long)key); + int comp = tt.getIntValueByHash(2, (long)key); + int order = tt.getIntValueByHash(3, (long)key); reverse.addEntry(sector, layer, comp, order); - reverse.setIntValue(crate, "crate", sector, layer, comp, order); - reverse.setIntValue(slot, "slot", sector, layer, comp, order); - reverse.setIntValue(channel, "channel", sector, layer, comp, order); + long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(sector,layer,comp,order); + reverse.setIntValueByHash(crate, 0, hash); + reverse.setIntValueByHash(slot, 1, hash); + reverse.setIntValueByHash(channel, 2, hash); } reverseTTs.put(run, reverse); } From 32e3887716182bcbd31f72a541d6fe3bfb659748 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 8 May 2026 19:59:56 -0400 Subject: [PATCH 139/190] fix: reduce CVT atan calculations (#1243) * reduce atan calculations * restore --- .../java/org/jlab/rec/cvt/cross/Cross.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/cross/Cross.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/cross/Cross.java index fcc5cc01e9..2dfc4b60e0 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/cross/Cross.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/cross/Cross.java @@ -616,33 +616,38 @@ public int getSVTCosmicsRegion() { @Override public int compareTo(Cross arg) { - int return_val = 0; - if(Constants.getInstance().isCosmics) { + int return_val; + if (Constants.getInstance().isCosmics) { int RegComp = this.getSVTCosmicsRegion() < arg.getSVTCosmicsRegion() ? -1 : this.getSVTCosmicsRegion() == arg.getSVTCosmicsRegion() ? 0 : 1; int IDComp = this.getId() < arg.getId() ? -1 : this.getId() == arg.getId() ? 0 : 1; - return_val = ((RegComp == 0) ? IDComp : RegComp); - } else { - - //int thisreg = (this.getDetector().equalsIgnoreCase("BMT")) ? 3 + bgeom.getLayer( this.getRegion(), this.getDetectorType()) : this.getRegion(); - //int argreg = (arg.getDetector().equalsIgnoreCase("BMT")) ? 3 + bgeom.getLayer( arg.getRegion(), arg.getDetectorType()) : arg.getRegion(); + } + else { + int thisreg = this.getOrderedRegion(); int argreg = arg.getOrderedRegion(); int RegComp = thisreg < argreg ? -1 : thisreg == argreg ? 0 : 1; -// int RegComp = this.getRegion() < arg.getRegion() ? -1 : this.getRegion() == arg.getRegion() ? 0 : 1; // check that is not BMTC for phi comparison if( Double.isNaN(arg.getPoint().x())==false && Double.isNaN(this.getPoint().x())==false ) { - int PhiComp = this.getPoint0().toVector3D().phi() < arg.getPoint0().toVector3D().phi() ? -1 : this.getPoint0().toVector3D().phi() == arg.getPoint0().toVector3D().phi() ? 0 : 1; - - return_val = ((RegComp == 0) ? PhiComp : RegComp); + if (RegComp == 0) { + double phi0 = this.getPoint0().toVector3D().phi(); + double phi1 = arg.getPoint0().toVector3D().phi(); + return_val = phi0 < phi1 ? -1 : phi0 == phi1 ? 0 : 1; + } + else { + return_val = RegComp; + } } else { - int ZComp = this.getPoint0().z() < arg.getPoint0().z() ? -1 : this.getPoint0().z() == arg.getPoint0().z() ? 0 : 1; - return_val = ((RegComp == 0) ? ZComp : RegComp); + if (RegComp == 0) { + return_val = this.getPoint0().z() < arg.getPoint0().z() ? -1 : this.getPoint0().z() == arg.getPoint0().z() ? 0 : 1; + } + else { + return_val = RegComp; + } } } - return return_val; } From 975a9ccff38bc9dd0bfd5afd644707eef06e784d Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 11 May 2026 10:37:33 -0400 Subject: [PATCH 140/190] build: bump version number to 13.8.4 (#1253) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 50 files changed, 341 insertions(+), 341 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index b25558dc2c..e75018765d 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 43ffef46cb..1260cfe315 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 8fc851a613..384a4bcfa9 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar cnuphys swimmer - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 543c8f9a79..63f7f53bb4 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-logging - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index f464c51e6c..c22d685037 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index e87c4487c4..06daa9b4b1 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 7dfd17d15f..1e33cf8332 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index ee71e0719b..1a57384ab0 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index ef09b38d2e..a849951d91 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 75410aa18e..3d819ebf25 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 6985a776a7..b839caa297 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys swimmer - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 50b468e3d2..adb391695f 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index d604ccece6..460ad95fe7 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 79bf378633..bcd4854fea 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar cnuphys clas12 - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index a28b8479f1..6161774821 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT pom org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index aa0634cc14..90f23dfcbc 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar cnuphys clas12 - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 41df0ed603..26ee79a55f 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar cnuphys clas12 - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 9ee2ef420a..33a857bbfc 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar cnuphys clas12 - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys splot - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index ce8fe83d48..345723ee7f 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clara-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-logging - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-math - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-tracking - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-decay-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys snr - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index d472b1815b..809fb7afe3 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT pom org.jlab.clas coatjava - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index 0b7a5e9088..dcf4a09be7 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas common-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys swimmer - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/pom.xml b/pom.xml index 75fdbe9ecc..7b2cf7486b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index ad000d0bb4..4bebb2c65c 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 7ebf9b7cf7..69c0e1a864 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 4ba1e672d7..a985e8bcd6 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 29b74cc53c..3f862882d7 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 518b0e01fc..8e800e62f9 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index bbed982553..13ec3a10a4 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index b4111dc9e4..258c6ed025 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 9fe4136e6d..2724d7d10b 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test org.jlab.clas clas-math - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys snr - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index ed37cd3d04..ddcb8c21fe 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 17346913ff..aedc1a47e5 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT test org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 52ec2153e8..633fbb24e2 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 5530069874..77ca4bc8ad 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index f2b1042e40..6269c5b7e8 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 88dfb46ba0..b56d01d75e 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index a3ebbe4489..c5be978515 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index aa0a5c423b..2fe2256f97 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index 6364ba88ee..79a1b3bddf 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 0a0869eea7..0befecee4b 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT pom org.jlab.clas coatjava - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index a2453d7a5f..dfb46c0607 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-analysis - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index 7144b80a23..a0e997b026 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 094abb26a2..7a8ed1c523 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index f772ffe1f4..5c81bdf09a 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index e1e9697a3e..181992fc12 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT cnuphys magfield - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-tracking - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 381ffb8f64..8de6b7310d 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 349268aab9..3ff73e323f 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-physics - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-utils - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index 99b17c30c2..f033ed8ff1 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index 79c8de6b87..a1a86403fe 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index a9ff4c6009..a787878ef4 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas swim-tools - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT jar cnuphys swimmer - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-reco - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-io - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT org.jlab.clas clas-geometry - 13.8.3-SNAPSHOT + 13.8.4-SNAPSHOT From bdb78a1a9ad5817e238432cb0393767c4a40cc63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 11:21:14 -0400 Subject: [PATCH 141/190] chore(submodule): bump validation/advanced-tests/data (#1257) Bumps validation/advanced-tests/data from `198e15d` to `b9f2abe`. --- updated-dependencies: - dependency-name: validation/advanced-tests/data dependency-version: b9f2abe1ff7ee7698ff57a276bba8e0866660f8d dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- validation/advanced-tests/data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validation/advanced-tests/data b/validation/advanced-tests/data index 198e15dca3..b9f2abe1ff 160000 --- a/validation/advanced-tests/data +++ b/validation/advanced-tests/data @@ -1 +1 @@ -Subproject commit 198e15dca3b5a661e57a401312e14a0a88a002ea +Subproject commit b9f2abe1ff7ee7698ff57a276bba8e0866660f8d From 2dd19d7a5e838971f7a9eb5dcfb2b86745165dbb Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 12 May 2026 16:14:56 -0400 Subject: [PATCH 142/190] feat: keep track of field types during initialization instead of checking later (#1251) * keep track of field types instead of checking later * follow magfield naming conventions * fix initialization --------- Co-authored-by: heddle --- .../java/cnuphys/magfield/CompositeField.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/CompositeField.java b/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/CompositeField.java index c9b2820da7..f80a8560db 100644 --- a/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/CompositeField.java +++ b/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/CompositeField.java @@ -11,6 +11,9 @@ @SuppressWarnings("serial") public class CompositeField extends ArrayList implements IMagField { + boolean _hasTorus; + boolean _hasSolenoid; + /** * Checks whether the field has been set to always return zero. * @@ -43,7 +46,16 @@ public boolean add(IMagField field) { } } - return super.add(field); + _hasSolenoid = false; + _hasTorus = false; + if (super.add(field)) { + for (IMagField ifield : this) { + if (ifield instanceof Solenoid) _hasSolenoid = true; + if (ifield instanceof Torus) _hasTorus = true; + } + return true; + } + return false; } @Override @@ -69,13 +81,7 @@ public String getName() { * @return true if we have a torus */ public boolean hasTorus() { - for (IMagField field : this) { - if (field instanceof Torus) { - return true; - } - } - - return false; + return _hasTorus; } /** @@ -84,13 +90,7 @@ public boolean hasTorus() { * @return true if we have a solenoid */ public boolean hasSolenoid() { - for (IMagField field : this) { - if (field instanceof Solenoid) { - return true; - } - } - - return false; + return _hasSolenoid; } /** From bc911b03da3a4dfd29dc585d689c1816d8b95683 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 12 May 2026 16:30:13 -0400 Subject: [PATCH 143/190] feat: keep track of field types during initialization instead of checking later (#1252) * keep track instead of calculating later * complete initializations --------- Co-authored-by: heddle --- .../java/cnuphys/magfield/MagneticFields.java | 144 +++++++++++------- 1 file changed, 87 insertions(+), 57 deletions(-) diff --git a/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/MagneticFields.java b/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/MagneticFields.java index 070dc817b2..f368a46e44 100644 --- a/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/MagneticFields.java +++ b/common-tools/cnuphys/magfield/src/main/java/cnuphys/magfield/MagneticFields.java @@ -72,6 +72,12 @@ public class MagneticFields { // which field is active private IMagField _activeField; + // whether the active field is a torus: + private boolean _hasActiveTorus = false; + + // whether the active field is a solenoid: + private boolean _hasActiveSolenoid = false; + // types of fields public enum FieldType { TORUS, SOLENOID, COMPOSITE, COMPOSITEROTATED, ZEROFIELD @@ -181,7 +187,7 @@ protected void openNewTorus(String path) throws FileNotFoundException { _torus = readTorus(path); if (activeFieldWasTorus) { - _activeField = _torus; + setActiveField(_torus); } if (_torus != null) { @@ -266,7 +272,7 @@ protected void openSolenoid(File file, boolean isTransverse) throws FileNotFound _solenoid = readSolenoid(file.getAbsolutePath(), isTransverse); if (activeFieldWasSolenoid) { - _activeField = _solenoid; + setActiveField(_solenoid); } if (_solenoid != null) { @@ -479,6 +485,57 @@ private String sysPropOrEnvVar(String key) { return s; } + private boolean getActiveTorus() { + + if (_activeField != null) { + if (_activeField instanceof Torus) { + return true; + } else if (_activeField instanceof TorusProbe) { + return true; + } else if (_activeField instanceof CompositeProbe) { + return ((CompositeProbe) _activeField).hasTorus(); + } else if (_activeField instanceof CompositeField) { + return ((CompositeField) _activeField).hasTorus(); + } + } + + return false; + } + + private boolean getActiveSolenoid() { + if (_activeField != null) { + if (_activeField instanceof Solenoid) { + return true; + } else if (_activeField instanceof SolenoidProbe) { + return true; + } else if (_activeField instanceof CompositeProbe) { + return ((CompositeProbe) _activeField).hasSolenoid(); + } else if (_activeField instanceof CompositeField) { + return ((CompositeField) _activeField).hasSolenoid(); + } + } + + return false; + } + + /** + * Check whether we have an active torus field + * + * @return true if we have a torus + */ + public boolean hasActiveTorus() { + return _hasActiveTorus; + } + + /** + * Check whether we have an active solenoid field + * + * @return true if we have a solenoid + */ + public boolean hasActiveSolenoid() { + return _hasActiveSolenoid; + } + /** * Sets the active field * @@ -486,6 +543,14 @@ private String sysPropOrEnvVar(String key) { */ public void setActiveField(IMagField field) { _activeField = field; + _hasActiveTorus = getActiveTorus(); + _hasActiveSolenoid = getActiveSolenoid(); + } + + private void resetActiveField() { + _activeField = null; + _hasActiveTorus = false; + _hasActiveSolenoid = false; } /** @@ -500,18 +565,28 @@ public void setActiveField(FieldType ftype) { switch (ftype) { case TORUS: _activeField = _torus; + _hasActiveTorus = true; + _hasActiveSolenoid = false; break; case SOLENOID: _activeField = _solenoid; + _hasActiveTorus = false; + _hasActiveSolenoid = true; break; case COMPOSITE: _activeField = _compositeField; + _hasActiveTorus = _compositeField.hasTorus(); + _hasActiveSolenoid = _compositeField.hasSolenoid(); break; case COMPOSITEROTATED: _activeField = _rotatedCompositeField; + _hasActiveTorus = _rotatedCompositeField.hasTorus(); + _hasActiveSolenoid = _rotatedCompositeField.hasSolenoid(); break; case ZEROFIELD: _activeField = null; + _hasActiveTorus = false; + _hasActiveSolenoid = false; break; } @@ -1019,21 +1094,19 @@ private void makeComposites() { } // set the default active field - _activeField = null; + resetActiveField(); if ((_torus != null) && (_solenoid != null)) { - _activeField = _compositeField; + setActiveField(_compositeField); } else if ((_torus != null) && (_solenoid != null)) { - _activeField = _compositeField; + setActiveField(_compositeField); } - else if (_torus != null) { - _activeField = _torus; + setActiveField(_torus); } else if (_solenoid != null) { - _activeField = _solenoid; + setActiveField(_solenoid); } - } // final initialziation @@ -1134,19 +1207,19 @@ private void handleMenuSelection(ActionEvent ae) { Object source = ae.getSource(); if (source == _torusItem) { - _activeField = _torus; + setActiveField(_torus); } else if (source == _solenoidItem) { - _activeField = _solenoid; + setActiveField(_solenoid); } else if (source == _bothItem) { - _activeField = _compositeField; + setActiveField(_compositeField); } else if ((_bothRotatedItem != null) && (source == _bothRotatedItem)) { - _activeField = _rotatedCompositeField; + setActiveField(_rotatedCompositeField); } else if (source == _zeroItem) { - _activeField = null; + resetActiveField(); } else if (source == _interpolateItem) { MagneticField.setInterpolate(true); @@ -1379,49 +1452,6 @@ public void removeMapOverlap() { notifyListeners(); } - /** - * Check whether we have an active torus field - * - * @return true if we have a torus - */ - public boolean hasActiveTorus() { - - if (_activeField != null) { - if (_activeField instanceof Torus) { - return true; - } else if (_activeField instanceof TorusProbe) { - return true; - } else if (_activeField instanceof CompositeProbe) { - return ((CompositeProbe) _activeField).hasTorus(); - } else if (_activeField instanceof CompositeField) { - return ((CompositeField) _activeField).hasTorus(); - } - } - - return false; - } - - /** - * Check whether we have an active solenoid field - * - * @return true if we have a solenoid - */ - public boolean hasActiveSolenoid() { - if (_activeField != null) { - if (_activeField instanceof Solenoid) { - return true; - } else if (_activeField instanceof SolenoidProbe) { - return true; - } else if (_activeField instanceof CompositeProbe) { - return ((CompositeProbe) _activeField).hasSolenoid(); - } else if (_activeField instanceof CompositeField) { - return ((CompositeField) _activeField).hasSolenoid(); - } - } - - return false; - } - /** * Get the torus field * From 0e88d70332ce7860bc87f60d54fcad23279d8278 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 13 May 2026 10:54:30 -0400 Subject: [PATCH 144/190] fix: restore working EB parallel test generation (#1255) * remove unimplemented test * fix parallel eb gemcs --- validation/advanced-tests/src/eb/scripts/gemc.sh | 3 +-- validation/advanced-tests/src/eb/scripts/list.txt | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/validation/advanced-tests/src/eb/scripts/gemc.sh b/validation/advanced-tests/src/eb/scripts/gemc.sh index d4d9e36785..02fbecb537 100755 --- a/validation/advanced-tests/src/eb/scripts/gemc.sh +++ b/validation/advanced-tests/src/eb/scripts/gemc.sh @@ -65,8 +65,7 @@ function run_gemc () { for p in "${particles[@]}" do - [ -z ${multithread+} ] && args= || args=-m - run_gemc -r $run -g $gemc -n $nevents -c $gcard -i $p.txt -o $p.hipo $args + run_gemc -r $run -g $gemc -n $nevents -c $gcard -i $p.txt -o $p.hipo done [ -z ${multithread+x} ] || wait diff --git a/validation/advanced-tests/src/eb/scripts/list.txt b/validation/advanced-tests/src/eb/scripts/list.txt index 03a77c22b2..548db442e2 100644 --- a/validation/advanced-tests/src/eb/scripts/list.txt +++ b/validation/advanced-tests/src/eb/scripts/list.txt @@ -12,4 +12,3 @@ electrondeuteronC -pid 45 -cd electronFTpion -pid -211 -ft electronFTproton -pid -2212 -ft electronFTkaon -pid -321 -ft -electronprotonA -pid -2212 -al From 9082b505d66531736569030e6bed2e4ee0c5bd8a Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 13 May 2026 18:12:18 -0400 Subject: [PATCH 145/190] feat: add generic EVIO+HIPO reader service (#1256) * add Clas12Reader * remove unused imports Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * cast and rethrow exception Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../java/org/jlab/io/clara/Clas12Reader.java | 90 +++++++++++++++++++ .../org/jlab/io/clara/Clas12Reader.yaml | 11 +++ 2 files changed, 101 insertions(+) create mode 100644 common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java create mode 100644 common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java new file mode 100644 index 0000000000..e4cf0b7625 --- /dev/null +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java @@ -0,0 +1,90 @@ +package org.jlab.io.clara; + +import java.nio.ByteOrder; +import java.nio.file.Path; +import org.jlab.clara.engine.EngineDataType; +import org.jlab.clara.std.services.AbstractEventReaderService; +import org.jlab.clara.std.services.EventReaderException; +import org.jlab.coda.jevio.EvioException; +import org.jlab.io.evio.EvioSource; +import org.jlab.jnp.hipo4.data.Event; +import org.jlab.jnp.hipo4.io.HipoReader; +import org.json.JSONObject; + +/** + * Just reads EVIO or HIPO, and passes it along. + * + * @author baltzell + */ +public class Clas12Reader extends AbstractEventReaderService { + + EngineDataType type = Clas12Types.HIPO; + private long maxEvents; + + @Override + protected Object createReader(Path path, JSONObject opts) throws EventReaderException { + if (path.toString().endsWith(".hipo")) { + type = Clas12Types.HIPO; + HipoReader r = new HipoReader(); + try { + r.open(path.toString()); + return r; + } catch (Exception e) { + throw new EventReaderException(e); + } + } + else { + type = Clas12Types.EVIO; + EvioSource r = new EvioSource(); + r.open(path.toString()); + maxEvents = r.getEventCount(); + return r; + } + } + + @Override + protected void closeReader() { + if (type == Clas12Types.EVIO) { + ((EvioSource)reader).close(); + } + else { + ((HipoReader)reader).close(); + } + } + + @Override + protected int readEventCount() throws EventReaderException { + if (type == Clas12Types.EVIO) { + return ((EvioSource)reader).getEventCount(); + } + else { + return ((HipoReader)reader).getEventCount(); + } + } + + @Override + protected Object readEvent(int eventNumber) throws EventReaderException { + try { + if (type == Clas12Types.EVIO) { + if (eventNumber++ >= maxEvents) return null; + return ((EvioSource)reader).getEventBuffer(eventNumber, true); + //return new EvioDataEvent(b.array(), readByteOrder()); + } + else { + return ((HipoReader)reader).getEvent(new Event(),eventNumber); + } + } catch (EvioException e) { + throw new EventReaderException(e); + } + } + + @Override + public ByteOrder readByteOrder() throws EventReaderException { + return ByteOrder.LITTLE_ENDIAN; + } + + @Override + protected EngineDataType getDataType() { + return type; + } +} diff --git a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml new file mode 100644 index 0000000000..f499fccd2b --- /dev/null +++ b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Reader.yaml @@ -0,0 +1,11 @@ +--- +name: Clas12Reader +engine: org.jlab.io.clara.Clas12Reader +type: java + +author: Nathan Baltzell +email: baltzell@jlab.org + +version: 0.1 +description: + Reads EVIO or HIPO events from a file and passes them along unchanged. From 801d8194f7a97355616c2d6efd1814f153304878 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 15 May 2026 15:59:16 -0400 Subject: [PATCH 146/190] add event sorting (#1262) --- .../main/java/org/jlab/utils/HipoDiff.java | 67 ++++++++++++++++--- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java index 8826afff82..726eb129ce 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java +++ b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.TreeMap; import org.jlab.jnp.hipo4.io.HipoReader; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -96,6 +97,8 @@ public Bank getDiff(Bank b) { static double tolerance; static boolean verboseMode; static boolean quietMode; + static boolean sortEvents; + static int tag; static Bank runConfigBank; static HipoWriter writer; static Event event; @@ -112,7 +115,9 @@ public static void main(String args[]) { op.addOption("-Q", null, "verbose mode"); op.addOption("-b", null, "name of bank to diff"); op.addOption("-B", "", "names of banks to ignore (comma separated)"); - op.addOption("-s", null, "sort on column index"); + op.addOption("-s", null, "column indices to sort on (comma separated)"); + op.addOption("-e", null, "sort events by RUN::config.event"); + op.addOption("-T", "0", "event tag to compare"); op.addOption("-o", null, "output HIPO diff file"); op.setRequiresInputList(true); op.parse(args); @@ -128,8 +133,10 @@ public static void main(String args[]) { } verboseMode = op.getOption("-Q").stringValue() != null; quietMode = op.getOption("-q").stringValue() != null; + sortEvents = op.getOption("-e").stringValue() != null; nmax = op.getOption("-n").intValue(); tolerance = op.getOption("-t").doubleValue(); + tag = op.getOption("-T").intValue(); HipoReader readerA = new HipoReader(); HipoReader readerB = new HipoReader(); @@ -157,22 +164,64 @@ public static void main(String args[]) { writer.open(op.getOption("-o").stringValue()); } - compare(readerA, readerB); + compare(tag, readerA, readerB); if (writer != null) writer.close(); } - public static int compare(HipoReader a, HipoReader b) { + public static TreeMap getEventMap(int tag, HipoReader reader) { + TreeMap m = new TreeMap<>(); + ArrayList duplicates = new ArrayList<>(); + Event event = new Event(); + for (int eventIndex=0; eventIndex 0) { + int eventNumber = runConfigBank.getInt("event",0); + if (m.containsKey(eventNumber)) { + System.out.println("WARNING: Duplicate event number " + eventNumber + " at event index " + eventIndex); + duplicates.add(eventNumber); + } + else { + m.put(eventNumber, eventIndex); + } + } + } + m.keySet().removeAll(duplicates); + return m; + } + + public static int compare(int tag, HipoReader a, HipoReader b) { int ret=0; Event eventA = new Event(); Event eventB = new Event(); - while (a.hasNext() && b.hasNext() && (nmax < 1 || nevent < nmax)) { - if (++nevent % 5000 == 0) System.out.println("Analyzed " + nevent + " events"); - a.nextEvent(eventA); - b.nextEvent(eventB); - eventA.read(runConfigBank); - ret += compare(eventA, eventB); + if (sortEvents) { + TreeMap mapA = getEventMap(tag, a); + TreeMap mapB = getEventMap(tag, b); + for (Integer eventNumber : mapA.keySet()) { + if (mapB.containsKey(eventNumber)){ + if (nmax > 0 && nevent >= nmax) break; + if (++nevent % 5000 == 0) System.out.println("Analyzed " + nevent + " events"); + a.getEvent(eventA, mapA.get(eventNumber)); + b.getEvent(eventB, mapB.get(eventNumber)); + eventA.read(runConfigBank); + ret += compare(eventA, eventB); + } + } } + else { + a.setTags(tag); + b.setTags(tag); + while (a.hasNext() && b.hasNext() && (nmax < 1 || nevent < nmax)) { + if (++nevent % 5000 == 0) System.out.println("Analyzed " + nevent + " events"); + a.nextEvent(eventA); + b.nextEvent(eventB); + eventA.read(runConfigBank); + ret += compare(eventA, eventB); + } + } + System.out.println("\n Analyzed " + nevent + " with " + nbadevent + " bad banks"); System.out.println(nbadrow + "/" + nrow + " mismatched rows"); System.out.println(nbadentry + "/" + nentry + " mismatched entry"); From 08793f77b3425e1f4c1bdb774aa475a165cc3d0c Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 15 May 2026 18:06:31 -0400 Subject: [PATCH 147/190] stop preserving unixTime across events (#1263) --- .../main/java/org/jlab/detector/decode/CodaEventDecoder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java index 65516fb3a3..4aa8b35564 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CodaEventDecoder.java @@ -245,7 +245,7 @@ private void readHeaderBank(Integer crate, EvioNode node, EvioDataEvent event){ int[] intData = ByteDataTransformer.toIntArray(node.getStructureBuffer(true)); this.runNumber = intData[3]; this.eventNumber = intData[4]; - if(intData[5]!=0) this.unixTime = intData[5]; + this.unixTime = intData[5]; this.helicityLevel3=HelicityBit.DNE.value(); if(intData.length>7) { if ( (intData[7] & 0x1) == 0) { From 9a05b5b90e9731f9f1ddcc89979198efe02a3fac Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 15 May 2026 18:37:46 -0400 Subject: [PATCH 148/190] fix: use index loops in DC hot spots (#1247) * switch to indexed loops * switch to indexed loops * revert changes to CompositeField * Optimize for loop by storing size in a variable * Refactor loop for cluster size calculation * reduce getter calls * fix oops --- .../jlab/rec/dc/cluster/ClusterFitter.java | 83 +++++++++---------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFitter.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFitter.java index 3744a3ff65..40a5b39d81 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFitter.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFitter.java @@ -3,36 +3,33 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.jlab.clas.clas.math.FastMath; import org.jlab.detector.geant4.v2.DCGeant4Factory; import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; import org.jlab.geom.prim.Vector3D; -import org.jlab.rec.dc.hit.FittedHit; import org.jlab.rec.dc.track.fit.basefit.LineFitPars; import org.jlab.rec.dc.track.fit.basefit.LineFitter; import org.jlab.rec.dc.Constants; public class ClusterFitter { - /** * Fits a cluster to a line * */ private LineFitPars FitPars; - private final List> FitArray = new ArrayList>(); - private final List x = new ArrayList(); - private final List y = new ArrayList(); - private final List ex = new ArrayList(); - private final List ey = new ArrayList(); + private final List> FitArray = new ArrayList<>(); + private final List x = new ArrayList<>(); + private final List y = new ArrayList<>(); + private final List ex = new ArrayList<>(); + private final List ey = new ArrayList<>(); private final double stereo = Constants.COS6; private String CoordinateSystem; // LC= local, TSC = tilted Sector - public ClusterFitter() { - // TODO Auto-generated constructor stub - } + + public ClusterFitter() {} + public void reset() { for(int i =0; i) ex); FitArray.add((ArrayList) y); FitArray.add((ArrayList) ey); - } + /** * * @param clus fitted cluster @@ -242,23 +232,27 @@ public void SetResidualDerivedParams(FittedCluster clus, boolean calcTimeResidua * @return the fitted cluster with the best fit chi2 */ public FittedCluster BestClusterSelector(List clusters, String system) { - //init + FittedCluster BestCluster = null; double bestChisq = 999999999.; - // double bestClusx0=0; - for (FittedCluster clusCand : clusters) { - if(isBrickWall(clusCand)) { + int size = clusters.size(); + for (int i=0; i clusters, String sy if (chisq < bestChisq) { bestChisq = chisq; - BestCluster = clusCand; - // bestClusx0 = FitArray[0][0]; + BestCluster = cluster; } } - //SetSegmentLineParameters(bestClusx0, BestCluster) ; return BestCluster; - } /** @@ -306,19 +297,23 @@ private Point3D get_PointOnLine(double d, double the_slope, */ private boolean isBrickWall(FittedCluster clusCand) { boolean isBW = true; - int sumWireNum = 0; - if(clusCand.size()!=6) - isBW=false; - - for(FittedHit hit : clusCand) { - sumWireNum+=hit.get_Wire(); + if (clusCand.size() != 6) { + isBW = false; + } + else { + int sumWireNum = 0; + int size = clusCand.size(); + for (int i=0; i Date: Fri, 15 May 2026 19:37:44 -0400 Subject: [PATCH 149/190] fix: replace DC string comparisons with enums (#1246) * cleanup * remove string bookkeeping * cleanup * satisfy spotbug/dependency analysis * satisfy spotbugs --- .../dc/cluster/ClusterCleanerUtilities.java | 30 ++++++------- .../jlab/rec/dc/cluster/ClusterFinder.java | 27 ++++++------ .../jlab/rec/dc/cluster/ClusterFitter.java | 35 ++++++++++----- .../jlab/rec/dc/cross/CrossListFinder.java | 7 +-- .../java/org/jlab/rec/dc/nn/PatternRec.java | 5 ++- .../jlab/rec/dc/trajectory/RoadFinder.java | 44 ++++++++----------- 6 files changed, 76 insertions(+), 72 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index 48643ca6e2..b93809da55 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -3,20 +3,18 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.logging.Logger; -import org.jlab.detector.geant4.v2.DCGeant4Factory; -import org.jlab.io.base.DataEvent; +import org.jlab.io.base.DataEvent; import org.jlab.rec.dc.Constants; +import org.jlab.rec.dc.cluster.ClusterFitter.CoordSys; import org.jlab.rec.dc.hit.FittedHit; import org.jlab.rec.dc.hit.Hit; import org.jlab.rec.dc.timetodistance.TimeToDistanceEstimator; import org.jlab.utils.groups.IndexedTable; +import org.jlab.detector.geant4.v2.DCGeant4Factory; public class ClusterCleanerUtilities { - private static final Logger LOGGER = Logger.getLogger(ClusterCleanerUtilities.class.getName()); - private List> sortedHits; public ClusterCleanerUtilities() { @@ -194,7 +192,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI if((!isExceptionalCluster(newClus) && nLayers >= Constants.DC_MIN_NLAYERS) || (isExceptionalCluster(newClus) && nLayers >= Constants.DC_MIN_NLAYERS - 1)) { //require consistency with line - cf.SetFitArray(newClus, "LC"); + cf.SetFitArray(newClus, CoordSys.LC); cf.Fit(newClus, true); if ((nLayers == 6 && newClus.get_fitProb() > 0.9) || (nLayers == 5 && newClus.get_fitProb() > 0.85) || (nLayers == 4 && newClus.get_fitProb() > 0.75) || (nLayers == 3 && newClus.get_fitProb() > 0.65)) { @@ -213,7 +211,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI int newcid = nextClsStartIndex; for (FittedCluster cluster : splitclusters) { cluster.set_Id(newcid++); - cf.SetFitArray(cluster, "LC"); + cf.SetFitArray(cluster, CoordSys.LC); cf.Fit(cluster, true); FittedCluster bestCls = OverlappingClusterResolver(cluster, splitclusters); @@ -229,7 +227,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI List selectedClusList2 = new ArrayList<>(); for (FittedCluster cluster : selectedClusList) { cluster.set_Id(newcid++); - cf.SetFitArray(cluster, "LC"); + cf.SetFitArray(cluster, CoordSys.LC); cf.Fit(cluster, true); FittedCluster bestCls = OverlappingClusterResolver(cluster, selectedClusList); @@ -569,7 +567,7 @@ else if (index == 6) { } } - return cf.BestClusterSelector(arrayOfClus, "TSC"); + return cf.BestClusterSelector(arrayOfClus, CoordSys.TSC); } @@ -680,7 +678,7 @@ else if (hitsInLayer.size() == 2) { // for(FittedHit h : c) // LOGGER.log(Level.INFO, h.printInfo()); //} - FittedCluster BestCluster = cf.BestClusterSelector(clusters, "LC"); + FittedCluster BestCluster = cf.BestClusterSelector(clusters, CoordSys.LC); //LOGGER.log(Level.INFO, " ---> selected cluster : "); //for(FittedHit h : BestCluster) // LOGGER.log(Level.INFO, h.printInfo()); @@ -752,13 +750,14 @@ public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List 4, keep the first 2 and last 2 hits in that column, if Nc > 10 - remove all hits in that column. + * the middle hit If Nc=4, keep only the first and last hit in that column; + * if Nc > 4, keep the first 2 and last 2 hits in that column, if Nc > 10 + * remove all hits in that column. * * @param hits the unfitted hits * @return @@ -971,8 +970,7 @@ else if (hitsInLayer.size() == 2) { clusters.add(newClus); } - FittedCluster BestCluster = cf.BestClusterSelector(clusters, "LC"); - return BestCluster; + return cf.BestClusterSelector(clusters, CoordSys.LC); } /** diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index a2d1b735fe..9887337d42 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -8,16 +8,17 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import org.jlab.detector.geant4.v2.DCGeant4Factory; -import org.jlab.io.base.DataEvent; +import org.jlab.io.base.DataEvent; import org.jlab.io.evio.EvioDataBank; import org.jlab.io.evio.EvioDataEvent; import org.jlab.rec.dc.Constants; +import org.jlab.rec.dc.cluster.ClusterFitter.CoordSys; import org.jlab.rec.dc.hit.Hit; import org.jlab.rec.dc.timetodistance.TimeToDistanceEstimator; import org.jlab.rec.dc.hit.FittedHit; import org.jlab.utils.groups.IndexedTable; +import org.jlab.detector.geant4.v2.DCGeant4Factory; /** * A hit pruning algorithm to reject noise that gives a pattern of hits that are @@ -216,12 +217,12 @@ public List FindHitBasedClusters(List allhits, ClusterCleane for (FittedCluster clus : selectedClusList) { - cf.SetFitArray(clus, "LC"); + cf.SetFitArray(clus, CoordSys.LC); cf.Fit(clus, true); if(!ct.isExceptionalFittedCluster(clus) && clus.get_fitProb() Constants.HITBASEDTRKGMINFITHI2PROB ){ @@ -246,7 +247,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane //fhit.set_AssociatedClusterID(clus.get_Id()); } - cf.SetFitArray(clus, "TSC"); + cf.SetFitArray(clus, CoordSys.TSC); cf.Fit(clus, true); cf.SetResidualDerivedParams(clus, false, false, DcDetector); //calcTimeResidual=false, resetLRAmbig=false, local= false @@ -273,7 +274,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane } clus.removeAll(rmHits); clus.addAll(addHits); - cf.SetFitArray(clus, "TSC"); + cf.SetFitArray(clus, CoordSys.TSC); cf.Fit(clus, false); cf.SetSegmentLineParameters(clus.get(0).get_Z(), clus); if (clus != null ) { @@ -318,7 +319,7 @@ public List RecomposeClusters(Map> for (FittedCluster clus : clusters) { if (clus != null) { - cf.SetFitArray(clus, "TSC"); + cf.SetFitArray(clus, CoordSys.TSC); cf.Fit(clus, true); cf.SetResidualDerivedParams(clus, true, false, dcDetector); //calcTimeResidual=false, resetLRAmbig=false cf.Fit(clus, false); @@ -476,7 +477,7 @@ public List FindTimeBasedClusters(DataEvent event, } } - cf.SetFitArray(Clus2, "TSC"); + cf.SetFitArray(Clus2, CoordSys.TSC); cf.Fit(Clus2, true); if (Math.abs(clus.get_Chisq() - Clus2.get_Chisq()) < 1) { @@ -488,7 +489,7 @@ public List FindTimeBasedClusters(DataEvent event, for (FittedCluster clus : clusters) { - cf.SetFitArray(clus, "TSC"); + cf.SetFitArray(clus, CoordSys.TSC); cf.Fit(clus, true); // update the hits @@ -500,7 +501,7 @@ public List FindTimeBasedClusters(DataEvent event, double prevChi2 = 999999999; double trkAngleFinal = 0; while (Chi2Diff > 0) { - cf.SetFitArray(clus, "TSC"); + cf.SetFitArray(clus, CoordSys.TSC); cf.Fit(clus, true); Chi2Diff = prevChi2 - clus.get_Chisq(); if (Chi2Diff > 0) { @@ -519,11 +520,11 @@ public List FindTimeBasedClusters(DataEvent event, for (FittedHit fhit : clus) { fhit.updateHitPositionWithTime(event, trkAngleFinal, fhit.getB(), tab, DcDetector, tde); } - cf.SetFitArray(clus, "TSC"); + cf.SetFitArray(clus, CoordSys.TSC); cf.Fit(clus, true); cf.SetResidualDerivedParams(clus, true, false, DcDetector); //calcTimeResidual=false, resetLRAmbig=false - cf.SetFitArray(clus, "TSC"); + cf.SetFitArray(clus, CoordSys.TSC); cf.Fit(clus, false); cf.SetSegmentLineParameters(clus.get(0).get_Z(), clus); @@ -582,7 +583,7 @@ public EvioDataBank getLayerEfficiencies(List fclusters, List clusters, String system) { + public FittedCluster BestClusterSelector(List clusters, CoordSys system) { FittedCluster BestCluster = null; double bestChisq = 999999999.; @@ -315,5 +327,4 @@ private boolean isBrickWall(FittedCluster clusCand) { } return isBW; } - } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cross/CrossListFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cross/CrossListFinder.java index dc28ef9ab4..5399b2dadb 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cross/CrossListFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cross/CrossListFinder.java @@ -10,6 +10,7 @@ import org.jlab.io.base.DataEvent; import org.jlab.rec.dc.Constants; import org.jlab.rec.dc.cluster.ClusterFitter; +import org.jlab.rec.dc.cluster.ClusterFitter.CoordSys; import org.jlab.rec.dc.hit.FittedHit; import org.jlab.rec.dc.segment.Segment; import org.jlab.rec.dc.timetodistance.TimeToDistanceEstimator; @@ -216,18 +217,18 @@ private void recalcParsSegment(DataEvent event, Segment _Segment1, IndexedTable fhit.updateHitPositionWithTime(event, trkAngle, fhit.getB(), tab, DcDetector, tde); } - cf.SetFitArray(_Segment1.get_fittedCluster(), "TSC"); + cf.SetFitArray(_Segment1.get_fittedCluster(), CoordSys.TSC); cf.Fit(_Segment1.get_fittedCluster(), true); trkAngle = _Segment1.get_fittedCluster().get_clusterLineFitSlope(); for (FittedHit fhit : _Segment1.get_fittedCluster()) { fhit.updateHitPositionWithTime(event, trkAngle, fhit.getB(), tab, DcDetector, tde); } - cf.SetFitArray(_Segment1.get_fittedCluster(), "TSC"); + cf.SetFitArray(_Segment1.get_fittedCluster(), CoordSys.TSC); cf.Fit(_Segment1.get_fittedCluster(), true); cf.SetResidualDerivedParams(_Segment1.get_fittedCluster(), true, false, DcDetector); //calcTimeResidual=false, resetLRAmbig=false - cf.SetFitArray(_Segment1.get_fittedCluster(), "TSC"); + cf.SetFitArray(_Segment1.get_fittedCluster(), CoordSys.TSC); cf.Fit(_Segment1.get_fittedCluster(), false); cf.SetSegmentLineParameters(_Segment1.get_fittedCluster().get(0).get_Z(), _Segment1.get_fittedCluster()); diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java index 945c6a65a6..bde2e522b5 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java @@ -14,6 +14,7 @@ import org.jlab.rec.dc.cluster.ClusterCleanerUtilities; import org.jlab.rec.dc.cluster.ClusterFinder; import org.jlab.rec.dc.cluster.ClusterFitter; +import org.jlab.rec.dc.cluster.ClusterFitter.CoordSys; import org.jlab.rec.dc.cluster.FittedCluster; import org.jlab.rec.dc.cross.Cross; import org.jlab.rec.dc.cross.CrossList; @@ -172,7 +173,7 @@ public List RecomposeSegments(List fhits, fhit.updateHitPosition(DcDetector); } - cf.SetFitArray(fclus, "TSC"); + cf.SetFitArray(fclus, CoordSys.TSC); cf.Fit(fclus, true); cf.SetResidualDerivedParams(fclus, false, false, DcDetector); //calcTimeResidual=false, resetLRAmbig=false, local= false @@ -183,7 +184,7 @@ public List RecomposeSegments(List fhits, fhit.set_AssociatedClusterID(fclus.get_Id()); fhit.set_AssociatedHBTrackID(entry.getKey()); } - cf.SetFitArray(fclus, "TSC"); + cf.SetFitArray(fclus, org.jlab.rec.dc.cluster.ClusterFitter.CoordSys.TSC); cf.Fit(fclus, false); cf.SetSegmentLineParameters(fclus.get(0).get_Z(), fclus); diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/trajectory/RoadFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/trajectory/RoadFinder.java index 53efdfd097..e259c9fc53 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/trajectory/RoadFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/trajectory/RoadFinder.java @@ -3,17 +3,16 @@ import java.util.ArrayList; import java.util.List; -import org.jlab.clas.clas.math.FastMath; import org.jlab.rec.dc.cluster.Cluster; import org.jlab.rec.dc.cluster.ClusterFitter; +import org.jlab.rec.dc.cluster.ClusterFitter.CoordSys; import org.jlab.rec.dc.cluster.FittedCluster; import org.jlab.rec.dc.hit.FittedHit; import org.jlab.rec.dc.segment.Segment; import org.jlab.rec.dc.Constants; - -import Jama.Matrix; import org.jlab.detector.geant4.v2.DCGeant4Factory; +import Jama.Matrix; public class RoadFinder { @@ -31,16 +30,12 @@ public RoadFinder() { * @return list of segments corresponding to pseudo-segments */ public List findRoads(List segs, DCGeant4Factory DcDetector) { - //QuadraticFit qf = new QuadraticFit(); - //initialize the lists List Roads = new ArrayList<>(); List>> superLayerLists = new ArrayList<>(); for(int sec=0; sec<6; sec++) { ArrayList> sLyrs = new ArrayList<>(); - ArrayList>> rLyrs = new ArrayList<>(); - for(int sly=0; sly<6; sly++) { sLyrs.add(new ArrayList<>()); } @@ -54,11 +49,9 @@ public List findRoads(List segs, DCGeant4Factory DcDetector) { } for(int sec=0; sec<6; sec++) { for(int sly=0; sly<6; sly++) { - //if(superLayerLists.get(sec).get(sly).size()==0) { // add a blank to each superlayer Segment blank = new Segment(new FittedCluster(new Cluster(sec+1, sly+1, -1))); blank.set_Id(-10); superLayerLists.get(sec).get(sly).add(blank); - //} } } int roadId =1; @@ -101,8 +94,6 @@ public List findRoads(List segs, DCGeant4Factory DcDetector) { public Segment findRoadMissingSegment(List segList, DCGeant4Factory DcDetector, double[] a) { - //his.fitRoad((ArrayList) segList, DcDetector); - Segment pseudoSeg = null; if(segList.size()<3) { // make pseudo-segment for missing segment // find missing segment superlayer @@ -142,7 +133,7 @@ public Segment findRoadMissingSegment(List segList, DCGeant4Factory DcD fpseudoCluster.add(pseudoHit); } - cf.SetFitArray(fpseudoCluster, "TSC"); + cf.SetFitArray(fpseudoCluster, CoordSys.TSC); cf.Fit(fpseudoCluster, true); cf.SetSegmentLineParameters(fpseudoCluster.get(0).get_Z(), fpseudoCluster) ; @@ -151,6 +142,7 @@ public Segment findRoadMissingSegment(List segList, DCGeant4Factory DcD } return pseudoSeg; } + /** * * @param pseudoSeg @@ -159,13 +151,13 @@ public Segment findRoadMissingSegment(List segList, DCGeant4Factory DcD * @return redo the fit (not used) */ private Segment reFit(Segment pseudoSeg, ArrayList segList, DCGeant4Factory DcDetector ) { - qf.init(); - this.fitRoad(segList, DcDetector); + qf.init(); + this.fitRoad(segList, DcDetector); - Cluster pseudoCluster = new Cluster(segList.get(0).get_Sector(),pseudoSeg.get_Superlayer(),-1); - FittedCluster fpseudoCluster = new FittedCluster(pseudoCluster); + Cluster pseudoCluster = new Cluster(segList.get(0).get_Sector(),pseudoSeg.get_Superlayer(),-1); + FittedCluster fpseudoCluster = new FittedCluster(pseudoCluster); - for(int l = 0; l<6; l++) { + for(int l = 0; l<6; l++) { int layer = l+1; double z = DcDetector.getWireMidpoint(pseudoSeg.get_Sector()-1, pseudoSeg.get_Superlayer()-1,layer-1,0).z; double trkX = qf.a[0]*z*z+qf.a[1]*z+qf.a[2]; @@ -178,16 +170,16 @@ private Segment reFit(Segment pseudoSeg, ArrayList segList, DCGeant4Fac pseudoHit.updateHitPosition(DcDetector); pseudoHit.calc_GeomCorr(DcDetector, 0); fpseudoCluster.add(pseudoHit); - } - cf.SetFitArray(fpseudoCluster, "TSC"); - cf.Fit(fpseudoCluster, true); - - cf.SetSegmentLineParameters(fpseudoCluster.get(0).get_Z(), fpseudoCluster) ; - Segment pseudoSeg1 = new Segment(fpseudoCluster); - - pseudoSeg1.set_fitPlane(DcDetector); + } + cf.SetFitArray(fpseudoCluster, CoordSys.TSC); + cf.Fit(fpseudoCluster, true); - return pseudoSeg1; + cf.SetSegmentLineParameters(fpseudoCluster.get(0).get_Z(), fpseudoCluster) ; + Segment pseudoSeg1 = new Segment(fpseudoCluster); + + pseudoSeg1.set_fitPlane(DcDetector); + + return pseudoSeg1; } private boolean fitRoad(ArrayList segList, DCGeant4Factory DcDetector) { From 6237413886672a7da92f02a1728e05f76bdbec57 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 18 May 2026 18:32:26 -0400 Subject: [PATCH 150/190] feat: add auto-generated enums for HIPO schema (#1205) * add script to generate enums from bank schema * add resulting enums * cleanup * update package name * update bank package path * remove auto-generated bank schema enums * rename * remove auto-generated bank enums (again?) * gitignore auto-generated bank enums * add schema-enum-cleaning to mvn clean * add bank schema enum generation to maven validation phase * switch to single underscore * move enum build to clas-io --- .gitignore | 1 + common-tools/clas-io/bank-schema-enums | 18 +++++++++++ common-tools/clas-io/pom.xml | 41 ++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100755 common-tools/clas-io/bank-schema-enums diff --git a/.gitignore b/.gitignore index d88c305087..0bdf3fdcef 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ target /docs/javadoc/* /clara-home tmp +/common-tools/clas-io/src/main/java/org/jlab/io/banks # deployment /myLocalMvnRepo diff --git a/common-tools/clas-io/bank-schema-enums b/common-tools/clas-io/bank-schema-enums new file mode 100755 index 0000000000..b441901385 --- /dev/null +++ b/common-tools/clas-io/bank-schema-enums @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +import os,glob,json +top = os.path.normpath(os.path.dirname(os.path.abspath(__file__))+'/../..') +idir = 'etc/bankdefs/hipo4' +odir = 'common-tools/clas-io/src/main/java/org/jlab/io/banks' +print(f'INFO: Creating schema enums at {odir}') +os.makedirs(f'{top}/{odir}', exist_ok=True) +for x in glob.glob(f'{top}/{idir}/*.json'): + for bank in json.load(open(x,'r')): + class_name = bank['name'].replace('::','_').replace(':','_') + with open(f'{top}/{odir}/{class_name}.java','w') as f: + f.write('package org.jlab.io.banks;\n') + f.write(f'public class {class_name} {{\n') + for i,entry in enumerate(bank['entries']): + var_name = entry['name'] + f.write(f' public static final short {var_name} = {i};\n') + f.write('}\n') + f.close() diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 06daa9b4b1..216d59fc21 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -55,4 +55,45 @@ + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.1.0 + + + bank-schema-enums + validate + + run + + false + + + + + + + + + + + + maven-clean-plugin + 3.4.0 + + + + src/main/java/org/jlab/io/banks + + **/*.java + + + + + + + + From c964a4dc90ac4a3a2e22426d3d2b510b4b77760d Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 19 May 2026 12:02:08 -0400 Subject: [PATCH 151/190] build: bump version number to 13.8.5 (#1271) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 50 files changed, 341 insertions(+), 341 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index e75018765d..6d05b77e92 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 1260cfe315..fe34126ac3 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 384a4bcfa9..45808e74d9 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar cnuphys swimmer - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 63f7f53bb4..e6ce463255 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-logging - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index c22d685037..7d7b1c5177 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 216d59fc21..0ae146ee68 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 1e33cf8332..8a91330814 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 1a57384ab0..e2bfc05c91 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index a849951d91..3d3ed7349a 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index 3d819ebf25..f1347f468d 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index b839caa297..ba180d588a 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys swimmer - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index adb391695f..be83719ea1 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 460ad95fe7..55ed295ce0 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index bcd4854fea..1c03c07d11 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar cnuphys clas12 - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 6161774821..3afc93193a 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT pom org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 90f23dfcbc..ecd1129e2f 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar cnuphys clas12 - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 26ee79a55f..d8b7c70f9d 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar cnuphys clas12 - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 33a857bbfc..fc86116100 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar cnuphys clas12 - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys splot - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 345723ee7f..c0e66dbbb0 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clara-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-logging - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-math - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-tracking - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-decay-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys snr - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 809fb7afe3..3c8a7c843b 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT pom org.jlab.clas coatjava - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index dcf4a09be7..c2521fb430 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas common-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys swimmer - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/pom.xml b/pom.xml index 7b2cf7486b..8d7c507758 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 4bebb2c65c..b4a46ce4f6 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 69c0e1a864..2fb593f994 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index a985e8bcd6..311bf74785 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 3f862882d7..7337666188 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 8e800e62f9..6157517dca 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 13ec3a10a4..c7089099ae 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 258c6ed025..719ccfab3a 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 2724d7d10b..84b0e8984e 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test org.jlab.clas clas-math - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys snr - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index ddcb8c21fe..a433dc4854 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index aedc1a47e5..8d7d9970a1 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT test org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 633fbb24e2..c718e374c6 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 77ca4bc8ad..f9f2c51717 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 6269c5b7e8..7cf4988251 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index b56d01d75e..8666d8d6f9 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index c5be978515..b988a051c0 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 2fe2256f97..5501bf8efe 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index 79a1b3bddf..ec27362091 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 0befecee4b..7e392dbc37 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT pom org.jlab.clas coatjava - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index dfb46c0607..68d16dcd34 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-analysis - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index a0e997b026..2cc85f86f7 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 7a8ed1c523..4d81e3aa8e 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index 5c81bdf09a..13c990c4d7 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 181992fc12..e2f7f0232b 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT cnuphys magfield - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-tracking - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 8de6b7310d..edaf701a11 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 3ff73e323f..6b2041c31c 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-physics - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-utils - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index f033ed8ff1..b0dbe0bf28 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index a1a86403fe..e060fbd3dd 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index a787878ef4..dc08789255 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas swim-tools - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT jar cnuphys swimmer - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-reco - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-io - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT org.jlab.clas clas-geometry - 13.8.4-SNAPSHOT + 13.8.5-SNAPSHOT From e6df0d2892afdd96528ad1db44ee4ae0b9000947 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 19 May 2026 12:15:29 -0400 Subject: [PATCH 152/190] feat: detector changed hook (#1211) * remove unused stuff * add detectorChanged method (and remove unused imports) * fix formatting * implement all detectorChanged hooks (and cleanup/formatting) * synchronize and count changes * allow nulls * add empty list check * cleanup/formatting * use the same wrapper used in clara/recon-util * hardcode it to 11 for now * implement detectorChanged for cvt * implement detector changed for dc * use the same wrapper used in clara/recon-util * fix logic oops * rename processDataEvent/processEvent * make MLTDEngine respect run number like everyone else, unless overriden from YAML * add newly-required methods * restore initialization * allow run number override from YAML * add missing overrides * remove mc/data check * processDataEvent should be final * cleanup script * remove unused/unnecessary script * add neutron test * abort on error * fix rebase mistake * add missing overrides * add missing overrides * add missing overrides * accounting for tstart, tflight and tprop in MC tracks reconstruction * removed check on run number when setting the DC hit uncertainty * removed hardcoded change to default variation in BAND engine * apply TDC jitter correction only if TI timestamp is >0, excluding MC events * moved RF offsets to time written to RUN::rf bank * fixed bug in REC::Event.RFTime introduced with last commit * restored TDC jitter correction for timestamp=0 * switch to load geometry for real run number * fix env * add missing override * remove unused imports * add missing overrides * add missing overrides * propagate detectorChanged and method renaming to new UberEngine * changed EC to load the geometry with the real run number * fix merge mistake * undoing RF offset changes * add missing overrides * updated use of geometry factory in URWT engine * cleanup * add detector changed hooks * switch eb tests to gemc/6.0 * bugfix * updated yamls for MC --------- Co-authored-by: Nathan Baltzell Co-authored-by: Raffaella De Vita --- .github/workflows/ci.yml | 4 +- .../jlab/clas/decay/analysis/Analysis.java | 4 +- .../main/java/org/jlab/utils/JsonUtils.java | 4 +- .../org/jlab/clas/reco/EngineProcessor.java | 2 +- .../jlab/clas/reco/ReconstructionEngine.java | 74 ++++++---- .../java/org/jlab/clas/reco/UberEngine.java | 16 +- .../jlab/clas/swimtools/MagFieldsEngine.java | 4 +- etc/services/mc-ai.yaml | 26 ++-- etc/services/mc-aicv.yaml | 22 ++- etc/services/mc-cv.yaml | 8 +- .../org/jlab/service/ai/DCClsComboEngine.java | 7 +- .../org/jlab/service/ai/DCDenoiseEngine.java | 6 +- .../org/jlab/service/ahdc/AHDCEngine.java | 7 +- .../org/jlab/service/alert/ALERTEngine.java | 5 +- .../org/jlab/service/atof/ATOFEngine.java | 8 +- .../org/jlab/rec/band/banks/HitReader.java | 2 +- .../constants/CalibrationConstantsLoader.java | 3 +- .../org/jlab/service/band/BANDEngine.java | 32 ++-- .../org/jlab/service/bg/BackgroundEngine.java | 5 +- .../calibration/service/CalibBanksEngine.java | 5 +- .../org/jlab/rec/cnd/banks/HitReader.java | 2 +- .../service/cnd/CNDCalibrationEngine.java | 137 ++++-------------- .../org/jlab/rec/cvt/services/CVTEngine.java | 20 ++- .../rec/cvt/services/CVTSecondPassEngine.java | 2 +- .../main/java/org/jlab/rec/dc/Constants.java | 25 ++-- .../java/org/jlab/rec/dc/banks/HitReader.java | 12 +- .../org/jlab/rec/dc/banks/RecoBankWriter.java | 2 +- .../java/org/jlab/rec/dc/hit/FittedHit.java | 3 +- .../java/org/jlab/service/dc/DCEngine.java | 8 +- .../org/jlab/service/dc/DCHBClustering.java | 2 +- .../java/org/jlab/service/dc/DCHBEngine.java | 2 +- .../jlab/service/dc/DCHBPostClusterAI.java | 2 +- .../jlab/service/dc/DCHBPostClusterConv.java | 2 +- .../org/jlab/service/dc/DCHBTrackingAI.java | 7 +- .../java/org/jlab/service/dc/DCTBEngine.java | 3 +- .../service/dc/LayerEfficiencyAnalyzer.java | 4 +- .../org/jlab/rec/eb/EBRadioFrequency.java | 2 +- .../java/org/jlab/service/eb/EBEngine.java | 7 +- .../org/jlab/service/eb/EBHBAIEngine.java | 4 +- .../java/org/jlab/service/eb/EBHBEngine.java | 4 +- .../org/jlab/service/eb/EBTBAIEngine.java | 4 +- .../java/org/jlab/service/eb/EBTBEngine.java | 4 +- .../org/jlab/service/eb/VersionEngine.java | 5 +- .../org/jlab/display/ec/ECRECMonitor.java | 8 +- .../java/org/jlab/service/ec/ECCommon.java | 9 +- .../java/org/jlab/service/ec/ECEngine.java | 17 ++- .../org/jlab/service/swim/SwimEngine.java.old | 2 +- .../java/org/jlab/service/fmt/FMTEngine.java | 17 ++- .../main/java/org/jlab/rec/ft/FTEBEngine.java | 8 +- .../java/org/jlab/rec/ft/cal/FTCALEngine.java | 32 ++-- .../org/jlab/rec/ft/hodo/FTHODOEngine.java | 30 ++-- .../java/org/jlab/rec/ft/trk/FTTRKEngine.java | 108 ++++++-------- .../org/jlab/service/ft/FTEBEngineTest.java | 30 +--- .../org/jlab/service/ft/FTTRKEngineTest.java | 12 +- .../htcc/HTCCReconstructionService.java | 11 +- .../org/jlab/service/ltcc/LTCCEngine.java | 49 +++---- .../java/org/jlab/service/mc/TruthMatch.java | 5 +- .../org/jlab/service/mltn/MLTDEngine.java | 68 +++------ .../org/jlab/service/mltn/MLTNEngine.java | 14 +- .../java/org/jlab/rec/mucal/MUCALEngine.java | 5 +- .../java/org/jlab/rec/muhd/MUHDEngine.java | 5 +- .../java/org/jlab/rec/muvt/MUVTEngine.java | 7 +- .../jlab/service/postproc/PostprocEngine.java | 5 +- .../org/jlab/service/raster/RasterEngine.java | 6 +- .../org/jlab/service/recoil/RecoilEngine.java | 5 +- .../java/org/jlab/rec/rich/RICHEBEngine.java | 45 ++---- .../org/jlab/service/rtpc/RTPCEngine.java | 19 +-- .../org/jlab/service/swaps/SwapEngine.java | 5 +- .../jlab/rec/tof/banks/ctof/HitReader.java | 2 +- .../jlab/rec/tof/banks/ftof/HitReader.java | 2 +- .../org/jlab/service/ctof/CTOFEngine.java | 31 ++-- .../org/jlab/service/ftof/FTOFEngine.java | 50 ++----- .../org/jlab/service/urwt/URWTEngine.java | 11 +- .../org/jlab/rec/service/vtx/VTXEngine.java | 4 +- validation/advanced-tests/run-eb-tests-all.sh | 16 -- validation/advanced-tests/run-eb-tests.sh | 12 +- .../advanced-tests/src/eb/scripts/gemc.sh | 2 + 77 files changed, 497 insertions(+), 662 deletions(-) delete mode 100755 validation/advanced-tests/run-eb-tests-all.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 453bd9dd84..f4b9598007 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -271,14 +271,16 @@ jobs: id: - kpp - eb-ep + - eb-en - eb-eg - eb-epc - eb-enc - eb-eftpi include: - # run all tests on ubuntu + # run selected tests on ubuntu - { id: kpp, cmd: ./run-advanced-tests.sh } - { id: eb-ep, cmd: ./run-eb-tests.sh -100 electronproton } + - { id: eb-en, cmd: ./run-eb-tests.sh -100 electronneutron } - { id: eb-eg, cmd: ./run-eb-tests.sh -100 electrongamma } - { id: eb-epc, cmd: ./run-eb-tests.sh -100 electronprotonC } - { id: eb-enc, cmd: ./run-eb-tests.sh -100 electronneutronC } diff --git a/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Analysis.java b/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Analysis.java index be81479a79..8578817a3e 100644 --- a/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Analysis.java +++ b/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/Analysis.java @@ -67,7 +67,7 @@ public void setFieldsConfig(String fieldsConfig) { @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { Reader reader ; this.FieldsConfig = this.getFieldsConfig(); if (event.hasBank("RUN::config") == false) { @@ -250,5 +250,7 @@ public double[] getBeamSpot(DataEvent event, IndexedTable beamPos) { } return xybeam; } + + public void detectorChanged(int run) {} } diff --git a/common-tools/clas-io/src/main/java/org/jlab/utils/JsonUtils.java b/common-tools/clas-io/src/main/java/org/jlab/utils/JsonUtils.java index c94c6cf6a5..ef28fbb2ed 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/utils/JsonUtils.java +++ b/common-tools/clas-io/src/main/java/org/jlab/utils/JsonUtils.java @@ -113,9 +113,7 @@ public static JsonObject Map2Json(Map map) { ret.add(topKey,Map2Json((Map)entry.getValue())); } else { - if(entry.getValue() != null) { - ret.add(topKey, entry.getValue().toString()); - } + ret.add(topKey, entry.getValue() == null ? null : entry.getValue().toString()); } } return ret; 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 a389302475..5f17e9b6d4 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 @@ -282,7 +282,7 @@ public void init(){ public void processEvent(DataEvent event){ for(Map.Entry engine : this.processorEngines.entrySet()){ try { - engine.getValue().filterEvent(event); + engine.getValue().processDataEvent(event); } catch (Exception e){ LOGGER.log(Level.SEVERE, "[Exception] >>>>> engine : {0}\n\n", engine.getKey()); e.printStackTrace(); 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 b729c1aec7..ca84dda768 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 @@ -2,6 +2,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -60,14 +61,22 @@ public abstract class ReconstructionEngine implements Engine { volatile boolean dropOutputBanks = false; private final Set outputBanks = new HashSet<>(); + private volatile List runNumbers = new ArrayList<>(); + private boolean ignoreInvalidRunNumbers = true; + private int runNumberOverride = -1; + volatile long triggerMask = 0xFFFFFFFFFFFFFFFFL; - String engineName = "UnknownEngine"; - String engineAuthor = "N.T."; - String engineVersion = "0.0"; - String engineDescription = "CLARA Engine"; + String engineName = "UnknownEngine"; + String engineAuthor = "N.T."; + String engineVersion = "0.0"; + String engineDescription = "CLARA Engine"; + + abstract public boolean processDataEventUser(DataEvent event); + abstract public boolean init(); + abstract public void detectorChanged(int runNumber); public ReconstructionEngine(String name, String author, String version){ engineName = name; @@ -108,9 +117,6 @@ protected RawBank getRawBankReader(String bankName, OrderType... order) { return new RawDataBank(bankName, order); } - abstract public boolean processDataEvent(DataEvent event); - abstract public boolean init(); - /** * Use a map just to avoid name clash in ConstantsManager. * @param tables map of table names to #indices @@ -187,6 +193,9 @@ public EngineData configure(EngineData ed) { engineDictionary = new SchemaFactory(); LOGGER.log(Level.FINEST,"--- engine configuration is called " + this.getDescription()); try { + if (this.getEngineConfigString("runNumberOverride")!=null) { + this.runNumberOverride = Integer.valueOf(this.getEngineConfigString("runNumberOverride")); + } if (this.getEngineConfigString("rawBankGroup")!=null) { this.rawBankOrders = RawBank.getFilterGroup(this.getEngineConfigString("rawBankGroup")); } @@ -227,8 +236,7 @@ public EngineData configure(EngineData ed) { } protected String getStringConfigParameter(String jsonString, - String key) throws Exception { - Object js; + String key) throws Exception { String variation = ""; try { JSONObject base = new JSONObject(jsonString); @@ -238,13 +246,6 @@ protected String getStringConfigParameter(String jsonString, } else { LOGGER.log(Level.FINE,"[JSON]" + this.getName() + " **** warning **** does not contain key = " + key); } - /* - js = base.get(key); - if (js instanceof String) { - return (String) js; - } else { - throw new Exception("JSONObject[" + "] not a string."); - }*/ } catch (JSONException e) { throw new Exception(e.getMessage()); } @@ -345,17 +346,22 @@ public void dropBanks(DataEvent event) { } } } - - public boolean checkRunNumber(DataEvent event) { - if (!this.ignoreInvalidRunNumbers) return true; - int run = 0; - if (event.hasBank("RUN::config")) { - run = event.getBank("RUN::config").getInt("run",0); + + public synchronized boolean checkRunNumber(DataEvent event) { + int r = runNumberOverride; + if (r <= 0 && event.hasBank("RUN::config")) { + r = event.getBank("RUN::config").getInt("run",0); } - return run>0; + if (r > 0) { + if (this.runNumbers.isEmpty() || r != this.runNumbers.get(this.runNumbers.size()-1)) { + this.runNumbers.add(r); + this.detectorChanged(r); + } + } + return !this.ignoreInvalidRunNumbers || r>0; } - public void filterEvent(DataEvent dataEvent) { + public void processDataEvent(DataEvent dataEvent) { if (!this.wroteConfig) { this.wroteConfig = true; JsonUtils.extend(dataEvent, CONFIG_BANK_NAME, "json", this.generateConfig()); @@ -365,7 +371,7 @@ public void filterEvent(DataEvent dataEvent) { } if(this.applyTriggerMask(dataEvent)) { if (this.checkRunNumber(dataEvent)) { - this.processDataEvent(dataEvent); + this.processDataEventUser(dataEvent); } } } @@ -404,7 +410,7 @@ public EngineData execute(EngineData input) { } try { - this.filterEvent(dataEventHipo); + this.processDataEvent(dataEventHipo); output.setData(mt, dataEventHipo.getHipoEvent()); } catch (Exception e) { String msg = String.format("Error processing input event%n%n%s", ClaraUtil.reportException(e)); @@ -519,16 +525,21 @@ public Reco(){ super("a","b","c"); } @Override - public boolean processDataEvent(DataEvent event) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + public boolean processDataEventUser(DataEvent event) { + throw new UnsupportedOperationException("Not supported yet."); } @Override public boolean init() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); } - -} + + @Override + public void detectorChanged(int runNumber) { + throw new UnsupportedOperationException("Not supported yet."); + } + } + public static void main(String[] args){ System.setProperty("CLAS12DIR", "/Users/gavalian/Work/Software/project-3a.0.0/Distribution/clas12-offline-software/coatjava"); try { @@ -549,7 +560,6 @@ public static void main(String[] args){ "\"timestamp\":333\n" + "}"; System.out.println(json); - //json = "{ \"ccdb\":{\"run\":10,\"variation\":\"default\"}, \"variation\":\"cosmic\"}"; Reco reco = new Reco(); String variation = reco.getStringConfigParameter(json, "variation"); System.out.println(" Variation : " + variation); diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/UberEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/UberEngine.java index 221b4f86d9..70bfb7e2d3 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/UberEngine.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/UberEngine.java @@ -30,7 +30,7 @@ protected void add(ReconstructionEngine... e) { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { throw new RuntimeException("UberEngine does not implement processDataEvent."); } @@ -39,9 +39,9 @@ public boolean processDataEvent(DataEvent event) { * @param event */ @Override - public final void filterEvent(DataEvent event) { + public final void processDataEvent(DataEvent event) { for (ReconstructionEngine e : engines) - e.filterEvent(event); + e.processDataEvent(event); } /** @@ -55,6 +55,16 @@ public final boolean init() { if (!e.init()) ret = false; return ret; } + + /** + * Run all engines' dettectorChanged methods. + * @param runNumber + */ + @Override + public final void detectorChanged(int runNumber) { + for (ReconstructionEngine e : engines) + e.detectorChanged(runNumber); + } /** * Run all engines' configure methods. diff --git a/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/MagFieldsEngine.java b/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/MagFieldsEngine.java index ceab50389a..24a2a9b585 100644 --- a/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/MagFieldsEngine.java +++ b/common-tools/swim-tools/src/main/java/org/jlab/clas/swimtools/MagFieldsEngine.java @@ -162,7 +162,7 @@ private void loadTables() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { DataBank bank = event.getBank("RUN::config"); // Load the constants // ------------------- @@ -195,4 +195,6 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int runNumber) {} } diff --git a/etc/services/mc-ai.yaml b/etc/services/mc-ai.yaml index a9ba359372..3b6a64255c 100644 --- a/etc/services/mc-ai.yaml +++ b/etc/services/mc-ai.yaml @@ -18,15 +18,14 @@ services: name: FTEB - class: org.jlab.service.raster.RasterEngine name: RASTER -# DC clustering: nominal algoritm, filled the cluster bank for ai and conventional tracking + - class: org.jlab.service.ai.DCDenoiseEngine + name: DCDN - class: org.jlab.service.dc.DCHBClustering name: DCCR -# This is where the AI plugin would go. THe AI code reads the HB clusters. - - class: org.jlab.service.mltn.MLTDEngine - name: MLTD -# DC using clustering on AI hits: NN assisted HB tracking - - class: org.jlab.service.dc.DCHBPostClusterAI - name: DCHAI + - class: org.jlab.service.ai.DCClsComboEngine + name: DCCC + - class: org.jlab.service.dc.DCHBTrackingAI + name: DCHTAI - class: org.jlab.service.ftof.FTOFHBEngine name: FTOFHB - class: org.jlab.service.ec.ECEngine @@ -64,11 +63,10 @@ services: - class: org.jlab.calibration.service.CalibBanksEngine name: CALIB configuration: -# global: -# variation: rga_fall2018_mc -# timestamp: 12/31/2020-00:00:00 -# dcMinistagger: "NOTONREFWIRE" -# dcFeedthroughs: "OFF" + global: + variation: mc2026 + dcMinistagger: "NOTONREFWIRE" + dcFeedthroughs: "OFF" io-services: writer: schema_dir: dst @@ -77,9 +75,7 @@ configuration: MAGFIELDS: magfieldSolenoidMap: Symm_solenoid_r601_phi1_z1201_13June2018.dat magfieldTorusMap: Symm_torus_r2501_phi16_z251_24Apr2018.dat - MLTD: - run: "6302" - DCHAI: + DCHTAI: outputBankPrefix: "HB" RTPC: rtpcSimulation: "true" diff --git a/etc/services/mc-aicv.yaml b/etc/services/mc-aicv.yaml index 51112d338d..6dcf7509b7 100644 --- a/etc/services/mc-aicv.yaml +++ b/etc/services/mc-aicv.yaml @@ -18,18 +18,16 @@ services: name: FTEB - class: org.jlab.service.raster.RasterEngine name: RASTER -# DC clustering: nominal algoritm, filled the cluster bank for ai and conventional tracking +# - class: org.jlab.service.ai.DCDenoiseEngine +# name: DCDN - class: org.jlab.service.dc.DCHBClustering name: DCCR -# This is where the AI plugin would go. THe AI code reads the HB clusters. - - class: org.jlab.service.mltn.MLTDEngine - name: MLTD -# DC using clustering: regular HB tracking + - class: org.jlab.service.ai.DCClsComboEngine + name: DCCC - class: org.jlab.service.dc.DCHBPostClusterConv name: DCHB -# DC using clustering on AI hits: NN assisted HB tracking - - class: org.jlab.service.dc.DCHBPostClusterAI - name: DCHAI + - class: org.jlab.service.dc.DCHBTrackingAI + name: DCHTAI - class: org.jlab.service.ftof.FTOFHBEngine name: FTOFHB - class: org.jlab.service.ec.ECEngine @@ -75,10 +73,10 @@ services: - class: org.jlab.calibration.service.CalibBanksEngine name: CALIB configuration: -# global: -# variation: rga_fall2018_mc -# dcMinistagger: "NOTONREFWIRE" -# dcFeedthroughs: "OFF" + global: + variation: mc2026 + dcMinistagger: "NOTONREFWIRE" + dcFeedthroughs: "OFF" io-services: writer: schema_dir: mc-aicv diff --git a/etc/services/mc-cv.yaml b/etc/services/mc-cv.yaml index a5a379ec7c..54d187522b 100644 --- a/etc/services/mc-cv.yaml +++ b/etc/services/mc-cv.yaml @@ -62,10 +62,10 @@ services: - class: org.jlab.calibration.service.CalibBanksEngine name: CALIB configuration: -# global: -# variation: rga_fall2018_mc -# dcMinistagger: "NOTONREFWIRE" -# dcFeedthroughs: "OFF" + global: + variation: mc2026 + dcMinistagger: "NOTONREFWIRE" + dcFeedthroughs: "OFF" io-services: writer: schema_dir: dst diff --git a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java index deec994fb9..847caa11ed 100644 --- a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java +++ b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCClsComboEngine.java @@ -58,6 +58,9 @@ public DCClsComboEngine() { super("DCClsComboEngine","tongtong","1.0"); } + @Override + public void detectorChanged(int run){} + @Override public boolean init() { System.setProperty("ai.djl.pytorch.num_interop_threads", "1"); @@ -116,7 +119,7 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { //// 6-cluster combo prediction // load clusters from bank HitBasedTrkg::Clusters @@ -537,4 +540,4 @@ public float[] processOutput(TranslatorContext ctx, NDList out) { public Batchifier getBatchifier() { return Batchifier.STACK; } }; } -} \ No newline at end of file +} diff --git a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java index cc58fea625..f67a5a05a9 100644 --- a/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java +++ b/reconstruction/ai/src/main/java/org/jlab/service/ai/DCDenoiseEngine.java @@ -79,7 +79,11 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public void detectorChanged(int run) {} + + @Override + public boolean processDataEventUser(DataEvent event) { + for (String bankName : BANK_NAMES) { if (!event.hasBank(bankName)) continue; diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index 66b965825c..9d3cc1b023 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -67,6 +67,11 @@ public boolean init(ModeTrackFinding m) { return init(); } + @Override + public void detectorChanged(int run) { + // FIXME: move geometry initialization here + } + @Override public boolean init() { @@ -91,7 +96,7 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { if(event.hasBank("MC::Particle")) simulation = true; diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index a899e20c8a..36bbdac3bf 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -92,6 +92,9 @@ public ALERTEngine() { super("ALERT", "whit,ouillon,pilleux", "0.1"); } + @Override + public void detectorChanged(int run) {} + /** * ALERTEngine initialization. * Creates the RecoBankWriter and checks for various yaml flags. @@ -132,7 +135,7 @@ public boolean init() { * */ @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { if (!event.hasBank("AHDC::adc")) return false; diff --git a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java index ad15498413..27153fb14c 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java @@ -61,7 +61,8 @@ public Detector getATOF() { private IndexedTable atofTimeOffsetsTable; @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { + if (!event.hasBank("RUN::config")) { return true; } @@ -131,6 +132,11 @@ public boolean processDataEvent(DataEvent event) { return true; } + @Override + public void detectorChanged(int run) { + // FIXME: move geometry initialization here + } + @Override public boolean init() { rbc = new RecoBankWriter(); diff --git a/reconstruction/band/src/main/java/org/jlab/rec/band/banks/HitReader.java b/reconstruction/band/src/main/java/org/jlab/rec/band/banks/HitReader.java index e82694012f..185ec2b5e1 100644 --- a/reconstruction/band/src/main/java/org/jlab/rec/band/banks/HitReader.java +++ b/reconstruction/band/src/main/java/org/jlab/rec/band/banks/HitReader.java @@ -154,7 +154,7 @@ private static double getTriggerPhase( DataEvent ev) { if(ev.hasBank("RUN::config")) { DataBank bank = ev.getBank("RUN::config"); long timeStamp = bank.getLong("timestamp", 0); - if( CalibrationConstantsLoader.JITTER_CYCLES > 0 && timeStamp != -1 ) { + if( CalibrationConstantsLoader.JITTER_CYCLES > 0 && timeStamp >= 0 ) { tPh = CalibrationConstantsLoader.JITTER_PERIOD * ( ( timeStamp + CalibrationConstantsLoader.JITTER_PHASE ) % CalibrationConstantsLoader.JITTER_CYCLES); diff --git a/reconstruction/band/src/main/java/org/jlab/rec/band/constants/CalibrationConstantsLoader.java b/reconstruction/band/src/main/java/org/jlab/rec/band/constants/CalibrationConstantsLoader.java index fd316bc15e..920fb51bc2 100644 --- a/reconstruction/band/src/main/java/org/jlab/rec/band/constants/CalibrationConstantsLoader.java +++ b/reconstruction/band/src/main/java/org/jlab/rec/band/constants/CalibrationConstantsLoader.java @@ -53,10 +53,9 @@ public CalibrationConstantsLoader() { public static int LASER_COMPONENT = 6; public static double[] LASER_CONV = {0,1,0}; - public static synchronized void Load(int runno, String var, ConstantsManager manager) { + public static synchronized void Load(int runno, ConstantsManager manager) { //System.out.println("*Loading calibration constants*"); - manager.setVariation(var); IndexedTable lroffsets = manager.getConstants(runno, "/calibration/band/lr_offsets"); IndexedTable timewalkL = manager.getConstants(runno, "/calibration/band/time_walk_amp_left"); diff --git a/reconstruction/band/src/main/java/org/jlab/service/band/BANDEngine.java b/reconstruction/band/src/main/java/org/jlab/service/band/BANDEngine.java index 636d4a8dcb..3bc81fac92 100644 --- a/reconstruction/band/src/main/java/org/jlab/service/band/BANDEngine.java +++ b/reconstruction/band/src/main/java/org/jlab/service/band/BANDEngine.java @@ -1,11 +1,7 @@ package org.jlab.service.band; - import java.util.ArrayList; import java.util.Arrays; - -import javax.naming.event.NamingEvent; - import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; @@ -26,16 +22,14 @@ public class BANDEngine extends ReconstructionEngine { - public BANDEngine() { super("BAND", "hauensteinsegarra", "1.0"); } int Run = -1; - @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { //System.out.println("**** NEW EVENT ****"); // update calibration constants based on run number if changed setRunConditionsParameters(event); @@ -61,9 +55,9 @@ public boolean processDataEvent(DataEvent event) { } @Override - public boolean init() { + public boolean init() { - String[] bandTables = new String[]{ + String[] bandTables = new String[]{ "/calibration/band/time_jitter", "/calibration/band/lr_offsets", "/calibration/band/effective_velocity", @@ -79,14 +73,15 @@ public boolean init() { "/calibration/band/energy_conversion" //"/calibration/band/time_walk_corr_left", //"/calibration/band/time_walk_corr_right", - }; + }; - requireConstants(Arrays.asList(bandTables)); - - this.registerOutputBank("BAND::hits","BAND::rawhits","BAND::laser"); - - return true; - } + requireConstants(Arrays.asList(bandTables)); + this.registerOutputBank("BAND::hits","BAND::rawhits","BAND::laser"); + return true; + } + + @Override + public void detectorChanged(int runNumber) {} public void setRunConditionsParameters(DataEvent event) { if(event.hasBank("RUN::config")==false) { @@ -100,7 +95,7 @@ public void setRunConditionsParameters(DataEvent event) { // Load the constants //------------------- if(Run!=newRun) { - CalibrationConstantsLoader.Load(newRun,"default",this.getConstantsManager()); + CalibrationConstantsLoader.Load(newRun,this.getConstantsManager()); Run = newRun; Parameters.CreateGeometry(); // loading BAND params } @@ -132,7 +127,7 @@ public static void main (String arg[]) { // event.getBank("band::adc").show(); // event.getBank("band::tdc").show(); //} - en.processDataEvent(event); + en.processDataEventUser(event); writer.writeEvent(event); //event.getBank("band::hits").show(); nevent++; @@ -142,5 +137,4 @@ public static void main (String arg[]) { } - } 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 index 1cec83e1e0..0bb00115cb 100644 --- a/reconstruction/bg/src/main/java/org/jlab/service/bg/BackgroundEngine.java +++ b/reconstruction/bg/src/main/java/org/jlab/service/bg/BackgroundEngine.java @@ -40,6 +40,9 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int run){} + public boolean init(String... filenames) { String detectors = getEngineConfigString(CONF_DETECTORS,"DC,FTOF"); String orders = getEngineConfigString(CONF_ORDERS,"NOMINAL"); @@ -52,7 +55,7 @@ public boolean init(String... filenames) { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { return bgmerger.mergeEvents(event); } diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/service/CalibBanksEngine.java b/reconstruction/calib/src/main/java/org/jlab/calibration/service/CalibBanksEngine.java index 486ba3e748..2ae753da36 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/service/CalibBanksEngine.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/service/CalibBanksEngine.java @@ -56,7 +56,7 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { List banks = new ArrayList<>(); @@ -75,4 +75,7 @@ public boolean processDataEvent(DataEvent event) { return true; } + @Override + public void detectorChanged(int run) {} + } diff --git a/reconstruction/cnd/src/main/java/org/jlab/rec/cnd/banks/HitReader.java b/reconstruction/cnd/src/main/java/org/jlab/rec/cnd/banks/HitReader.java index 194b1faba0..cae8f85286 100644 --- a/reconstruction/cnd/src/main/java/org/jlab/rec/cnd/banks/HitReader.java +++ b/reconstruction/cnd/src/main/java/org/jlab/rec/cnd/banks/HitReader.java @@ -22,7 +22,7 @@ public static ArrayList getCndHalfHits(DataEvent event, CalibrationCon if(event.hasBank("RUN::config")) { DataBank bank = event.getBank("RUN::config"); long timeStamp = bank.getLong("timestamp", 0); - if(ccdb.JITTER_CYCLES>0 && timeStamp!=-1) + if(ccdb.JITTER_CYCLES>0 && timeStamp>=0) triggerPhase=ccdb.JITTER_PERIOD*((timeStamp+ccdb.JITTER_PHASE)%ccdb.JITTER_CYCLES); } diff --git a/reconstruction/cnd/src/main/java/org/jlab/service/cnd/CNDCalibrationEngine.java b/reconstruction/cnd/src/main/java/org/jlab/service/cnd/CNDCalibrationEngine.java index 2670f6f1a9..902e1f0565 100644 --- a/reconstruction/cnd/src/main/java/org/jlab/service/cnd/CNDCalibrationEngine.java +++ b/reconstruction/cnd/src/main/java/org/jlab/service/cnd/CNDCalibrationEngine.java @@ -1,7 +1,8 @@ package org.jlab.service.cnd; -import java.io.IOException; +import java.util.Arrays; import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicInteger; import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.io.base.DataBank; @@ -15,17 +16,8 @@ import org.jlab.rec.cnd.hit.CvtGetHTrack; import org.jlab.rec.cnd.hit.HalfHit; import org.jlab.rec.cnd.hit.CndHitFinder; - -import java.lang.String; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; -import org.jlab.clas.physics.LorentzVector; - import org.jlab.rec.cnd.cluster.CNDCluster; import org.jlab.rec.cnd.cluster.CNDClusterFinder; -import org.jlab.utils.groups.IndexedTable; /** * Service to return reconstructed CND Hits - the output is in Hipo format @@ -33,18 +25,14 @@ * * */ - public class CNDCalibrationEngine extends ReconstructionEngine { - public CNDCalibrationEngine() { super("CND", "chatagnon & WANG", "1.0"); } - //int Run = -1; RecoBankWriter rbc; - //test static int enb =0; static int ecnd=0; static int hcvt=0; @@ -53,41 +41,33 @@ public CNDCalibrationEngine() { static int ctof=0; static int ctoftot=0; - private AtomicInteger Run = new AtomicInteger(0); - private int newRun = 0; + private AtomicInteger Run = new AtomicInteger(0); + private int newRun = 0; @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { - - if (!event.hasBank("RUN::config")) { + if (!event.hasBank("RUN::config")) { return true; - } - - DataBank bank = event.getBank("RUN::config"); - - // Load the constants - //------------------- - int newRun = bank.getInt("run", 0); - if (newRun == 0) - return true; - - if (Run.get() == 0 || (Run.get() != 0 && Run.get() != newRun)) { - Run.set(newRun); - } - - CalibrationConstantsLoader constantsLoader = new CalibrationConstantsLoader(newRun, this.getConstantsManager()); - //event.show(); - //System.out.println("in data process "); + } + + DataBank bank = event.getBank("RUN::config"); + + // Load the constants + int newRun = bank.getInt("run", 0); + if (newRun == 0) + return true; + if (Run.get() == 0 || (Run.get() != 0 && Run.get() != newRun)) { + Run.set(newRun); + } + CalibrationConstantsLoader constantsLoader = new CalibrationConstantsLoader(newRun, this.getConstantsManager()); - ArrayList halfhits = new ArrayList(); + ArrayList halfhits = new ArrayList(); ArrayList hits = new ArrayList(); halfhits = HitReader.getCndHalfHits(event, constantsLoader); //1) exit if halfhit list is empty if(halfhits.size()==0 ){ - // System.out.println("fin de process (0) : "); - // event.show(); return true; } @@ -103,89 +83,32 @@ public boolean processDataEvent(DataEvent event) { double length =hitFinder.findLength(hit, cvttry.getHelices(),0,constantsLoader); if (length!=0){ hit.set_tLength(length); // the path length is non zero only when there is a match with cvt track - //if(flag==0){match++;} - //flag=1; } - } - // GetVertex getVertex = new GetVertex(); - // Point3D vertex = getVertex.getVertex(event); - // for (CndHit hit : hits){ // check findlengthneutral - // hitFinder.findLengthNeutral( vertex, hit); - // } - // - - // if(hits.size()!=0){ - // - // DataBank outbank = RecoBankWriter.fillCndHitBanks(event, hits); - //// System.out.println("event before process : "); - //// event.show(); - // event.appendBanks(outbank); - // //System.out.println("event after process : "); - // //event.show(); - // ecnd++; - // if(event.hasBank("CVT::Tracks")){ - // posmatch++; - // //event.getBank("MC::Particle").show(); - // //outbank.show(); - // } - // - // } - //// System.out.println("fin de process : "); - //// event.show(); - // return true; - // } - - - - //// clustering of the CND hits CNDClusterFinder cndclusterFinder = new CNDClusterFinder(); ArrayList cndclusters = cndclusterFinder.findClusters(hits,constantsLoader); - - - - - if(hits.size()!=0){ - // DataBank outbank = RecoBankWriter.fillCndHitBanks(event, hits); - // event.appendBanks(outbank); - // event.show(); - // System.out.println("in process event "); + if(hits.size()!=0){ rbc.appendCNDBanks(event,hits,cndclusters); - // ecnd++; - // if(event.hasBank("CVT::Tracks")){ - // posmatch++; - //event.getBank("MC::Particle").show(); - //outbank.show(); - // } - // event.show(); - } - - - - return true; - } @Override public boolean init() { - rbc = new RecoBankWriter(); - - requireConstants(Arrays.asList(CalibrationConstantsLoader.getCndTables())); - this.getConstantsManager().setVariation("default"); - - this.registerOutputBank("CND::hits","CND::clusters"); - - return true; + rbc = new RecoBankWriter(); + requireConstants(Arrays.asList(CalibrationConstantsLoader.getCndTables())); + this.getConstantsManager().setVariation("default"); + this.registerOutputBank("CND::hits","CND::clusters"); + return true; } + + @Override + public void detectorChanged(int runNumber) {} - - public static void main (String arg[]) { CNDCalibrationEngine en = new CNDCalibrationEngine(); @@ -208,7 +131,6 @@ public static void main (String arg[]) { HipoDataSync writer = new HipoDataSync(); writer.open(outputFile); - while(reader.hasEvent()) { enb++; DataEvent event = (DataEvent) reader.getNextEvent(); @@ -220,7 +142,7 @@ public static void main (String arg[]) { //event.getBank("MC::Particle").show(); //if(event.hasBank("CVT::Tracks")){event.getBank("CVT::Tracks").show();}; - en.processDataEvent(event); + en.processDataEventUser(event); // System.out.println("event après process "); // event.show(); @@ -265,6 +187,5 @@ public static void main (String arg[]) { } } - } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java index ce9554514f..52a98e040e 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java @@ -28,7 +28,6 @@ */ public class CVTEngine extends ReconstructionEngine { - /** * @param docacutsum the docacutsum to set */ @@ -134,7 +133,14 @@ public boolean init() { this.initConstantsTables(); this.registerBanks(); this.printConfiguration(); - return true; + return true; + } + + @Override + public void detectorChanged(int runNumber) { + IndexedTable svtLorentz = this.getConstantsManager().getConstants(runNumber, "/calibration/svt/lorentz_angle"); + IndexedTable bmtVoltage = this.getConstantsManager().getConstants(runNumber, "/calibration/mvt/bmt_voltage"); + Geometry.initialize(this.getConstantsManager().getVariation(), runNumber, svtLorentz, bmtVoltage); } public final void setOutputBankPrefix(String prefix) { @@ -275,24 +281,20 @@ public void setBmtzmaxclussize(int bmtzmaxclussize) { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { Swim swimmer = new Swim(); int run = this.getRun(event); IndexedTable svtStatus = this.getConstantsManager().getConstants(run, "/calibration/svt/status"); - IndexedTable svtLorentz = this.getConstantsManager().getConstants(run, "/calibration/svt/lorentz_angle"); IndexedTable bmtStatus = this.getConstantsManager().getConstants(run, "/calibration/mvt/bmt_status"); IndexedTable bmtTime = this.getConstantsManager().getConstants(run, "/calibration/mvt/bmt_time"); - IndexedTable bmtVoltage = this.getConstantsManager().getConstants(run, "/calibration/mvt/bmt_voltage"); IndexedTable bmtStripVoltage = this.getConstantsManager().getConstants(run, "/calibration/mvt/bmt_strip_voltage"); IndexedTable bmtStripThreshold = this.getConstantsManager().getConstants(run, "/calibration/mvt/bmt_strip_voltage_thresholds"); IndexedTable beamPos = this.getConstantsManager().getConstants(run, "/geometry/beam/position"); IndexedTable adcStatus = this.getConstantsManager().getConstants(run, "/calibration/svt/adcstatus"); - Geometry.getInstance().initialize(this.getConstantsManager().getVariation(), run, svtLorentz, bmtVoltage); - CVTReconstruction reco = new CVTReconstruction(swimmer); List> hits = reco.readHits(event, svtStatus, bmtStatus, bmtTime, @@ -578,7 +580,6 @@ public String getCovMat() { return cvtCovMatBank; } - public void printConfiguration() { System.out.println("["+this.getName()+"] run with cosmics setting set to "+Constants.getInstance().isCosmics); @@ -611,7 +612,4 @@ public void printConfiguration() { } - - - } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java index 645974c313..dd9d219e76 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java @@ -30,7 +30,7 @@ public CVTSecondPassEngine() { @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int run = this.getRun(event); if(Constants.getInstance().seedingDebugMode) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java index ad651acd4e..82473ccf2b 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/Constants.java @@ -49,6 +49,8 @@ public static Constants getInstance() { public static boolean DEBUG = false; + public static double[][] SHIFTS = null; + // CONSTATNS for TRANSFORMATION public static final double SIN25 = Math.sin(Math.toRadians(25.)); public static final double COS25 = Math.cos(Math.toRadians(25.)); @@ -366,7 +368,6 @@ public boolean isSWAPDCRBBITS() { public void setSWAPDCRBBITS(boolean SWAPDCRBBITS) { this.SWAPDCRBBITS = SWAPDCRBBITS; } - public synchronized void initialize(String engine, String variation, @@ -400,9 +401,6 @@ public synchronized void initialize(String engine, SECTORSELECT = selectedSector; LoadConstants(); - - LoadGeometry(GEOVARIATION, shifts); - ConstantsLoaded = true; printConfig(engine); } @@ -414,9 +412,6 @@ public synchronized void initialize(String engine) { } else { LoadConstants(); - - LoadGeometry(GEOVARIATION, null); - ConstantsLoaded = true; printConfig(engine); } @@ -532,24 +527,24 @@ private void addReverseTT(int run, IndexedTable tt) { reverseTTs.put(run, reverse); } - private synchronized void LoadGeometry(String geoVariation, double[][] shifts) { + public synchronized void LoadGeometry(int runNumber, String geoVariation, double[][] shifts) { // Load the geometry - ConstantProvider provider = GeometryFactory.getConstants(DetectorType.DC, 11, geoVariation); + ConstantProvider provider = GeometryFactory.getConstants(DetectorType.DC, runNumber, geoVariation); dcDetector = new DCGeant4Factory(provider, MINISTAGGERSTATUS, FEEDTHROUGHSSTATUS, ENDPLATESBOWING, shifts); for(int l=0; l<6; l++) { wpdist[l] = provider.getDouble("/geometry/dc/superlayer/wpdist", l); } // Load target - ConstantProvider providerTG = GeometryFactory.getConstants(DetectorType.TARGET, 11, geoVariation); + ConstantProvider providerTG = GeometryFactory.getConstants(DetectorType.TARGET, runNumber, geoVariation); double targetPosition = providerTG.getDouble("/geometry/shifts/target/z",0); double targetLength = providerTG.getDouble("/geometry/materials/target/length",0); // Load other geometries - ConstantProvider providerFTOF = GeometryFactory.getConstants(DetectorType.FTOF, 11, geoVariation); + ConstantProvider providerFTOF = GeometryFactory.getConstants(DetectorType.FTOF, runNumber, geoVariation); ftofDetector = new FTOFGeant4Factory(providerFTOF); - ecalDetector = GeometryFactory.getDetector(DetectorType.ECAL, 11, geoVariation); - fmtDetector = GeometryFactory.getDetector(DetectorType.FMT, 11, geoVariation); - ConstantsManager managerRICH = new ConstantsManager(geoVariation);; - richDetector = new RICHGeoFactory(0, managerRICH, 11, false); + ecalDetector = GeometryFactory.getDetector(DetectorType.ECAL, runNumber, geoVariation); + fmtDetector = GeometryFactory.getDetector(DetectorType.FMT, runNumber, geoVariation); + ConstantsManager managerRICH = new ConstantsManager(geoVariation); + richDetector = new RICHGeoFactory(0, managerRICH, runNumber, false); // create the surfaces trajSurfaces = new TrajectorySurfaces(); trajSurfaces.loadSurface(targetPosition, targetLength, dcDetector, ftofDetector, ecalDetector, fmtDetector, richDetector); diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java index eaa35990c4..4a66375c08 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java @@ -114,7 +114,6 @@ private int getTIJitter() { double period = timejitter.getDoubleValueByHash("period", hash); int phase = timejitter.getIntValueByHash("phase", hash); int cycles = timejitter.getIntValueByHash("cycles", hash); - if (cycles > 0) jitter = (int) (period * ((tiTimeStamp + phase) % cycles)); } return jitter; @@ -378,11 +377,6 @@ private void read_HBHits(TimeToDistanceEstimator tde) { tFlight[i] = this.id2tidtFlight.get(id[i]); } - if (event.hasBank("MC::Particle") || - event.getBank("RUN::config").getInt("run", 0) < 100) { - tProp[i] = 0; - tFlight[i] = 0; - } } int size = layer.length; @@ -405,12 +399,8 @@ private void read_HBHits(TimeToDistanceEstimator tde) { continue; } - if (!event.hasBank("MC::Particle") && - event.getBank("RUN::config").getInt("run", 0) > 100) { - //T_0 = this.getT0(sector[i], slayer[i], layer[i], wire[i], T0, T0ERR)[0]; - if (event.hasBank(recBankName)) + if (event.hasBank(recBankName)) T_Start = event.getBank(recBankName).getFloat("startTime", 0); - } T_0 = this.getT0(sector[i], slayer[i], layer[i], wire[i], t0s)[0]; FittedHit hit = new FittedHit(sector[i], slayer[i], layer[i], wire[i], tdc[i], jitter[i], id[i]); diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java index 01e734df15..d018dd3c8d 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java @@ -570,7 +570,7 @@ private DataBank fillTBHitsBank(DataEvent event, List hitlist) { if(bank.getDescriptor().hasEntry("beta")){ bank.setFloat("beta", i, (float) hitlist.get(i).get_Beta()); } - if(hitlist.get(i).get_AssociatedTBTrackID()>-1 && !event.hasBank("MC::Particle")) { + if(hitlist.get(i).get_AssociatedTBTrackID()>-1) { if(hitlist.get(i).getSignalPropagTimeAlongWire()==0 || hitlist.get(i).get_AssociatedTBTrackID()<1) { bank.setFloat("TProp", i, (float) hitlist.get(i).getTProp()); //old value if track fit failed } else { diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java index 19f27b1c50..fb2ccb1460 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java @@ -194,8 +194,7 @@ public double get_PosErr(DataEvent event, double B, IndexedTable constants0, Ind } double x = this.get_Doca() / this.get_CellSize(); - if(event.hasBank("MC::Particle") || - event.getBank("RUN::config").getInt("run", 0) < 100 ) { // for MC use functional form put in simulation + if(event.hasBank("MC::Particle")) { // for MC use functional form put in simulation double p1 = constants0.getDoubleValue("parameter1", this.get_Sector(),this.get_Superlayer(),0); double p2 = constants0.getDoubleValue("parameter2", this.get_Sector(),this.get_Superlayer(),0); diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java index 156493cd30..cd1eaddaf6 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCEngine.java @@ -45,7 +45,6 @@ public class DCEngine extends ReconstructionEngine { public static final Logger LOGGER = Logger.getLogger(ReconstructionEngine.class.getName()); - public DCEngine(String name) { super(name,"ziegler","5.0"); } @@ -182,7 +181,7 @@ public void LoadTables() { @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { return true; } @@ -209,6 +208,11 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int runNumber) { + Constants.getInstance().LoadGeometry(runNumber, geoVariation, shifts); + } + private void initBanks() { if(inBankPrefix==null && outBankPrefix!=null) this.getBanks().init(outBankPrefix); diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java index f6d0e5f7ab..a19acd8270 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java @@ -32,7 +32,7 @@ public void setDropBanks() { @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int run = this.getRun(event); if(run==0) return true; diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java index c25bc4f479..da825d48ae 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java @@ -51,7 +51,7 @@ public void setDropBanks() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int run = this.getRun(event); if(run==0) return true; diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterAI.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterAI.java index 016bbf58a0..75998a1325 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterAI.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterAI.java @@ -55,7 +55,7 @@ public void setDropBanks() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int run = this.getRun(event); if(run==0) { diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterConv.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterConv.java index 1c8a2bcbdf..df442203c9 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterConv.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterConv.java @@ -46,7 +46,7 @@ public void setDropBanks() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int run = this.getRun(event); if(run==0) return true; diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java index b51d8c054c..80651c3c42 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBTrackingAI.java @@ -52,7 +52,10 @@ public DCHBTrackingAI(String outputBankPrefix) { hbTSEstimatorInbending = new HBTrackStateEstimator(hbTSEModelFileInbending); hbTSEstimatorOutbending = new HBTrackStateEstimator(hbTSEModelFileOutbending); } - + + @Override + public void detectorChanged(int run) {} + @Override public void setDropBanks() { super.registerOutputBank(this.getBanks().getHitsBank()); @@ -64,7 +67,7 @@ public void setDropBanks() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int run = this.getRun(event); if(run==0) { diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java index a08543e28d..a483d218e2 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java @@ -71,7 +71,8 @@ public void setDropBanks() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { + int run = this.getRun(event); if(run==0) return true; diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/LayerEfficiencyAnalyzer.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/LayerEfficiencyAnalyzer.java index 300ed153c1..188ba2d364 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/LayerEfficiencyAnalyzer.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/LayerEfficiencyAnalyzer.java @@ -213,7 +213,7 @@ public boolean equals(Object obj) { private final ArrayList> LayerEffsTrkD = new ArrayList>(); @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int run = this.getRun(event); if(run==0) return true; @@ -447,7 +447,7 @@ public static void main(String[] args) { while (reader.hasEvent()) { counter++; DataEvent event = reader.getNextEvent(); - tm.processDataEvent(event); + tm.processDataEventUser(event); tm.ProcessLayerEffs(event); //event.show(); if(counter%1000==0) { diff --git a/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBRadioFrequency.java b/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBRadioFrequency.java index 14fed64fb9..57c1348d09 100644 --- a/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBRadioFrequency.java +++ b/reconstruction/eb/src/main/java/org/jlab/rec/eb/EBRadioFrequency.java @@ -96,7 +96,7 @@ public void processEvent(DataEvent event) { int phase = ccdb.getInteger(EBCCDBEnum.RF_JITTER_PHASE); int cycles = ccdb.getInteger(EBCCDBEnum.RF_JITTER_CYCLES); long timeStamp = bank.getLong("timestamp", 0); - if(cycles>0 && timeStamp!=-1) triggerPhase=period*((timeStamp+phase)%cycles); + if(cycles>0 && timeStamp>=0) triggerPhase=period*((timeStamp+phase)%cycles); } // if RF::tdc exists (data), calculate rfTime from scratch diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java index 3aa1380c28..89b6bf0145 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java @@ -67,7 +67,7 @@ public void setUsePOCA(boolean val) { } @Override - public boolean processDataEvent(DataEvent de) { + public boolean processDataEventUser(DataEvent de) { throw new RuntimeException("EBEngine cannot be used directly. Use EBTBEngine/EBHBEngine instead."); } @@ -93,7 +93,7 @@ public void setOutputBankPrefix(String prefix) { } } - public boolean processDataEvent(DataEvent de,EBScalers ebs) { + public boolean processDataEventUser(DataEvent de,EBScalers ebs) { // check run number, get constants from CCDB: int run=-1; @@ -375,5 +375,8 @@ public boolean init() { return true; } + + @Override + public void detectorChanged(int runNumber) {} } diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBAIEngine.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBAIEngine.java index 2533e6d275..62cd991cec 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBAIEngine.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBAIEngine.java @@ -18,8 +18,8 @@ public EBHBAIEngine(){ } @Override - public boolean processDataEvent(DataEvent de) { - return super.processDataEvent(de,ebScalers); + public boolean processDataEventUser(DataEvent de) { + return super.processDataEventUser(de,ebScalers); } @Override diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBEngine.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBEngine.java index c255b63bfa..d570d39b06 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBEngine.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBHBEngine.java @@ -18,8 +18,8 @@ public EBHBEngine(){ } @Override - public boolean processDataEvent(DataEvent de) { - return super.processDataEvent(de,ebScalers); + public boolean processDataEventUser(DataEvent de) { + return super.processDataEventUser(de,ebScalers); } @Override diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBAIEngine.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBAIEngine.java index aef5586a56..ead154c357 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBAIEngine.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBAIEngine.java @@ -24,8 +24,8 @@ public EBTBAIEngine(String outputBankPrefix) { } @Override - public boolean processDataEvent(DataEvent de) { - return super.processDataEvent(de,ebScalers); + public boolean processDataEventUser(DataEvent de) { + return super.processDataEventUser(de,ebScalers); } @Override diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBEngine.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBEngine.java index 1db49db301..bce06a152a 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBEngine.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/EBTBEngine.java @@ -24,8 +24,8 @@ public EBTBEngine(){ } @Override - public boolean processDataEvent(DataEvent de) { - final boolean ret = super.processDataEvent(de,ebScalers); + public boolean processDataEventUser(DataEvent de) { + final boolean ret = super.processDataEventUser(de,ebScalers); this.linkTracks(de); return ret; } diff --git a/reconstruction/eb/src/main/java/org/jlab/service/eb/VersionEngine.java b/reconstruction/eb/src/main/java/org/jlab/service/eb/VersionEngine.java index 12016d5951..29ed6c8673 100644 --- a/reconstruction/eb/src/main/java/org/jlab/service/eb/VersionEngine.java +++ b/reconstruction/eb/src/main/java/org/jlab/service/eb/VersionEngine.java @@ -25,7 +25,7 @@ public static void show(DataBank bank) { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { if (!done) { JsonObject versions = Versions.getVersionsJson(); JsonObject config = new JsonObject(); @@ -44,4 +44,7 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int runNumber) {} + } diff --git a/reconstruction/ec/src/main/java/org/jlab/display/ec/ECRECMonitor.java b/reconstruction/ec/src/main/java/org/jlab/display/ec/ECRECMonitor.java index 7d8d8fe68d..12cc5a4710 100644 --- a/reconstruction/ec/src/main/java/org/jlab/display/ec/ECRECMonitor.java +++ b/reconstruction/ec/src/main/java/org/jlab/display/ec/ECRECMonitor.java @@ -22,9 +22,12 @@ public class ECRECMonitor extends ReconstructionEngine { public ECRECMonitor(){ super("ECMon","gavalian","1.0"); } - + + @Override + public void detectorChanged(int runNumber) {} + @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { if(event.hasBank("REC::Particle")==true){ DataBank bank = event.getBank("REC::Particle"); int index1 = this.index(bank, 22, 0); @@ -62,6 +65,7 @@ private int index(DataBank b, int pid, int skip){ } return -1; } + @Override public boolean init() { canvas = new TGCanvas("c","EC Engine Monitoring",500,500); diff --git a/reconstruction/ec/src/main/java/org/jlab/service/ec/ECCommon.java b/reconstruction/ec/src/main/java/org/jlab/service/ec/ECCommon.java index 96b0286891..e14576f120 100644 --- a/reconstruction/ec/src/main/java/org/jlab/service/ec/ECCommon.java +++ b/reconstruction/ec/src/main/java/org/jlab/service/ec/ECCommon.java @@ -42,7 +42,6 @@ public class ECCommon { public static int stripSortMethod = 0; public static int[] splitThresh = new int[3]; - public static Boolean isMC = false; public static Boolean debug = false; public static Boolean debugSplit = false; public static Boolean isSingleThreaded = false; @@ -149,11 +148,7 @@ public static int getRunNumber(DataEvent de) { public static List initEC(DataEvent event, ConstantsManager manager){ int run = getRunNumber(event); - - isMC = run<=100; - - if(isMC) {usePass2Timing = false; useDTCorrections = false; useFTpcal = false;} - + manager.setVariation(variation); IndexedTable atten1 = manager.getConstants(run, "/calibration/ec/attenuation"); @@ -332,7 +327,7 @@ public static List readStripsHipo(DataEvent event, int run, ConstantsM if(CYCLES>0&&event.hasBank("RUN::config")==true){ DataBank bank = event.getBank("RUN::config"); long timestamp = bank.getLong("timestamp", 0); - triggerPhase = (int) (PERIOD*((timestamp+PHASE)%CYCLES)); + triggerPhase = timestamp>=0 ? (int) (PERIOD*((timestamp+PHASE)%CYCLES)) : 0; } if(event.hasBank("ECAL::tdc")==true){ diff --git a/reconstruction/ec/src/main/java/org/jlab/service/ec/ECEngine.java b/reconstruction/ec/src/main/java/org/jlab/service/ec/ECEngine.java index 0657f1db26..42020dca0d 100644 --- a/reconstruction/ec/src/main/java/org/jlab/service/ec/ECEngine.java +++ b/reconstruction/ec/src/main/java/org/jlab/service/ec/ECEngine.java @@ -30,7 +30,7 @@ public ECEngine(){ } @Override - public boolean processDataEvent(DataEvent de) { + public boolean processDataEventUser(DataEvent de) { List ecStrips = ECCommon.initEC(de, this.getConstantsManager()); // thresholds, ADC/TDC match List ecPeaks = ECCommon.processPeaks(ECCommon.createPeaks(ecStrips)); // thresholds, split peaks -> update peak-lines @@ -244,7 +244,6 @@ public void setSingleEvent(boolean val) { } public void setIsMC(boolean val) { - ECCommon.isMC = val; } public void setConfig(String val) { @@ -423,12 +422,8 @@ public boolean init() { requireConstants(Arrays.asList(ecTables)); - + getConstantsManager().setVariation(ECCommon.variation); - String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); - if(!(ECCommon.geomVariation.equals("default"))) variationName = ECCommon.geomVariation; - LOGGER.log(Level.INFO,"GEOMETRY VARIATION IS "+variationName); - ECCommon.ecDetector = GeometryFactory.getDetector(DetectorType.ECAL,11,variationName); setConfig("test"); @@ -466,5 +461,13 @@ public boolean init() { return true; } + + @Override + public void detectorChanged(int runNumber) { + String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); + if(!(ECCommon.geomVariation.equals("default"))) variationName = ECCommon.geomVariation; + LOGGER.log(Level.INFO,"GEOMETRY VARIATION IS "+variationName); + ECCommon.ecDetector = GeometryFactory.getDetector(DetectorType.ECAL,runNumber,variationName); + } } diff --git a/reconstruction/ec/src/main/java/org/jlab/service/swim/SwimEngine.java.old b/reconstruction/ec/src/main/java/org/jlab/service/swim/SwimEngine.java.old index 3fb2364af2..961a050968 100644 --- a/reconstruction/ec/src/main/java/org/jlab/service/swim/SwimEngine.java.old +++ b/reconstruction/ec/src/main/java/org/jlab/service/swim/SwimEngine.java.old @@ -48,7 +48,7 @@ public class SwimEngine extends ReconstructionEngine { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { //this.test_caching_index(); //this.test_caching(); this.swimParticles(event); diff --git a/reconstruction/fmt/src/main/java/org/jlab/service/fmt/FMTEngine.java b/reconstruction/fmt/src/main/java/org/jlab/service/fmt/FMTEngine.java index de6e67e4d5..053cdd47c9 100644 --- a/reconstruction/fmt/src/main/java/org/jlab/service/fmt/FMTEngine.java +++ b/reconstruction/fmt/src/main/java/org/jlab/service/fmt/FMTEngine.java @@ -26,6 +26,7 @@ */ public class FMTEngine extends ReconstructionEngine { + String variation = null; boolean debug = false; public FMTEngine() { @@ -36,7 +37,7 @@ public FMTEngine() { public boolean init() { // Get the constants for the correct variation - String variation = this.getEngineConfigString("variation"); + variation = this.getEngineConfigString("variation"); if (variation!=null) { System.out.println("["+this.getName()+"] " + "run with FMT geometry variation based on yaml = " + variation); @@ -45,7 +46,6 @@ public boolean init() { variation = "default"; System.out.println("["+this.getName()+"] run with FMT default geometry"); } - String[] tables = new String[]{ "/geometry/beam/position", @@ -55,10 +55,6 @@ public boolean init() { requireConstants(Arrays.asList(tables)); this.getConstantsManager().setVariation(variation); - // Load the geometry - int run = 10; - Constants.setDetector(GeometryFactory.getDetector(DetectorType.FMT,run, variation)); - // Register output banks super.registerOutputBank("FMT::Hits"); super.registerOutputBank("FMT::Clusters"); @@ -70,7 +66,13 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public void detectorChanged(int runNumber) { + Constants.setDetector(GeometryFactory.getDetector(DetectorType.FMT,runNumber, + getConstantsManager().getVariation())); + } + + @Override + public boolean processDataEventUser(DataEvent event) { // Initial setup. if(debug) System.out.println("\nNew event"); @@ -232,5 +234,4 @@ public boolean processDataEvent(DataEvent event) { return true; } - } diff --git a/reconstruction/ft/src/main/java/org/jlab/rec/ft/FTEBEngine.java b/reconstruction/ft/src/main/java/org/jlab/rec/ft/FTEBEngine.java index 32cda98f09..0369d8cdb3 100644 --- a/reconstruction/ft/src/main/java/org/jlab/rec/ft/FTEBEngine.java +++ b/reconstruction/ft/src/main/java/org/jlab/rec/ft/FTEBEngine.java @@ -1,6 +1,5 @@ package org.jlab.rec.ft; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -52,14 +51,15 @@ public boolean init() { }; requireConstants(Arrays.asList(tables)); this.getConstantsManager().setVariation("default"); - this.registerOutputBank("FT::particles"); - return true; } @Override - public boolean processDataEvent(DataEvent event) { + public void detectorChanged(int runNumber) {} + + @Override + public boolean processDataEventUser(DataEvent event) { int run = this.setRunConditionsParameters(event); if (run>=0) { diff --git a/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java b/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java index 454fc11b83..2b4977f734 100644 --- a/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java +++ b/reconstruction/ft/src/main/java/org/jlab/rec/ft/cal/FTCALEngine.java @@ -18,7 +18,6 @@ import org.jlab.io.evio.EvioDataEvent; import org.jlab.io.hipo.HipoDataSource; - public class FTCALEngine extends ReconstructionEngine { public FTCALEngine() { @@ -33,27 +32,28 @@ public boolean init() { reco.debugMode=0; String[] tables = new String[]{ - "/calibration/ft/ftcal/charge_to_energy", - "/calibration/ft/ftcal/time_offsets", - "/calibration/ft/ftcal/time_walk", - "/calibration/ft/ftcal/status", - "/calibration/ft/ftcal/thresholds", - "/calibration/ft/ftcal/cluster", - "/calibration/ft/ftcal/energycorr" + "/calibration/ft/ftcal/charge_to_energy", + "/calibration/ft/ftcal/time_offsets", + "/calibration/ft/ftcal/time_walk", + "/calibration/ft/ftcal/status", + "/calibration/ft/ftcal/thresholds", + "/calibration/ft/ftcal/cluster", + "/calibration/ft/ftcal/energycorr" }; requireConstants(Arrays.asList(tables)); this.getConstantsManager().setVariation("default"); - - this.registerOutputBank("FTCAL::hits","FTCAL::clusters"); - + this.registerOutputBank("FTCAL::hits","FTCAL::clusters"); return true; - } + } @Override - public boolean processDataEvent(DataEvent event) { - List allHits = new ArrayList(); - List selectedHits = new ArrayList(); - List clusters = new ArrayList(); + public void detectorChanged(int runNumber) {} + + @Override + public boolean processDataEventUser(DataEvent event) { + List allHits = new ArrayList(); + List selectedHits = new ArrayList(); + List clusters = new ArrayList(); // update calibration constants based on run number if changed int run = setRunConditionsParameters(event); diff --git a/reconstruction/ft/src/main/java/org/jlab/rec/ft/hodo/FTHODOEngine.java b/reconstruction/ft/src/main/java/org/jlab/rec/ft/hodo/FTHODOEngine.java index 26166c562e..2b51115e5d 100644 --- a/reconstruction/ft/src/main/java/org/jlab/rec/ft/hodo/FTHODOEngine.java +++ b/reconstruction/ft/src/main/java/org/jlab/rec/ft/hodo/FTHODOEngine.java @@ -1,6 +1,5 @@ package org.jlab.rec.ft.hodo; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.swing.JFrame; @@ -30,22 +29,23 @@ public boolean init() { reco = new FTHODOReconstruction(); reco.debugMode=0; - String[] tables = new String[]{ - "/calibration/ft/fthodo/charge_to_energy", - "/calibration/ft/fthodo/time_offsets", - "/calibration/ft/fthodo/status", - "/geometry/ft/fthodo" - }; - requireConstants(Arrays.asList(tables)); - this.getConstantsManager().setVariation("default"); - - this.registerOutputBank("FTHODO::hits","FTHODO::clusters"); - - return true; + String[] tables = new String[]{ + "/calibration/ft/fthodo/charge_to_energy", + "/calibration/ft/fthodo/time_offsets", + "/calibration/ft/fthodo/status", + "/geometry/ft/fthodo" + }; + requireConstants(Arrays.asList(tables)); + this.getConstantsManager().setVariation("default"); + this.registerOutputBank("FTHODO::hits","FTHODO::clusters"); + return true; } + @Override + public void detectorChanged(int runNumber) {} + @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { // update calibration constants based on run number if changed int run = setRunConditionsParameters(event); @@ -104,7 +104,7 @@ public static void main (String arg[]) { while(reader.hasEvent()){ DataEvent event = (DataEvent) reader.getNextEvent(); - cal.processDataEvent(event); + cal.processDataEventUser(event); DetectorEvent detectorEvent = DetectorData.readDetectorEvent(event); PhysicsEvent gen = detectorEvent.getGeneratedEvent(); diff --git a/reconstruction/ft/src/main/java/org/jlab/rec/ft/trk/FTTRKEngine.java b/reconstruction/ft/src/main/java/org/jlab/rec/ft/trk/FTTRKEngine.java index c052f62283..249ec4442a 100644 --- a/reconstruction/ft/src/main/java/org/jlab/rec/ft/trk/FTTRKEngine.java +++ b/reconstruction/ft/src/main/java/org/jlab/rec/ft/trk/FTTRKEngine.java @@ -44,74 +44,64 @@ public boolean init() { }; requireConstants(Arrays.asList(tables)); this.getConstantsManager().setVariation("default"); - - // use 11 provisionally as run number to download the basic FTTK geometry constants - FTTRKConstantsLoader.Load(11, this.getConstantsManager().getVariation()); + reco = new FTTRKReconstruction(); - reco.debugMode=0; + reco.debugMode=0; if(this.getEngineConfigString("fall18TT")!=null) { FTTRKConstantsLoader.ADJUSTTT = Boolean.parseBoolean(this.getEngineConfigString("fall18TT")); } -/* - String[] tables = new String[]{ - "/calibration/ft/fthodo/charge_to_energy", - "/calibration/ft/fthodo/time_offsets", - "/calibration/ft/fthodo/status", - "/geometry/ft/fthodo", - "/geometry/ft/fttrk" - }; - requireConstants(Arrays.asList(tables)); - this.getConstantsManager().setVariation("default"); -*/ - return true; } + @Override + public void detectorChanged(int runNumber) { + FTTRKConstantsLoader.Load(runNumber, this.getConstantsManager().getVariation()); + } + @Override - public boolean processDataEvent(DataEvent event) { - // update calibration constants based on run number if changed - int run = setRunConditionsParameters(event); + public boolean processDataEventUser(DataEvent event) { + // update calibration constants based on run number if changed + int run = setRunConditionsParameters(event); + if(run>=0) { + // get hits fron banks + List allHits = reco.initFTTRK(event,this.getConstantsManager(), run); + // create clusters + List clusters = reco.findClusters(allHits); + // create crosses + List crosses = reco.findCrosses(clusters); + // update hit banks with associated clusters/crosses information + reco.updateAllHitsWithAssociatedIDs(allHits, clusters); + // write output banks + reco.writeBanks(event, allHits, clusters, crosses); + } + return true; + } + + public ArrayList processDataEventAndGetClusters(DataEvent event) { + List allHits = new ArrayList(); + ArrayList clusters = new ArrayList(); // era ArrayList + ArrayList crosses = new ArrayList(); - if(run>=0) { - // get hits fron banks - List allHits = reco.initFTTRK(event,this.getConstantsManager(), run); + // update calibration constants based on run number if changed + int run = setRunConditionsParameters(event); + + if(run>=0) { + // get hits from banks + allHits = reco.initFTTRK(event,this.getConstantsManager(), run); + if(allHits.size()>0){ // create clusters - List clusters = reco.findClusters(allHits); + clusters = reco.findClusters(allHits); // create crosses - List crosses = reco.findCrosses(clusters); + crosses = reco.findCrosses(clusters); // update hit banks with associated clusters/crosses information reco.updateAllHitsWithAssociatedIDs(allHits, clusters); // write output banks reco.writeBanks(event, allHits, clusters, crosses); } - return true; - } - - public ArrayList processDataEventAndGetClusters(DataEvent event) { - List allHits = new ArrayList(); - ArrayList clusters = new ArrayList(); // era ArrayList - ArrayList crosses = new ArrayList(); - - // update calibration constants based on run number if changed - int run = setRunConditionsParameters(event); - - if(run>=0) { - // get hits from banks - allHits = reco.initFTTRK(event,this.getConstantsManager(), run); - if(allHits.size()>0){ - // create clusters - clusters = reco.findClusters(allHits); - // create crosses - crosses = reco.findCrosses(clusters); - // update hit banks with associated clusters/crosses information - reco.updateAllHitsWithAssociatedIDs(allHits, clusters); - // write output banks - reco.writeBanks(event, allHits, clusters, crosses); - } - } - return clusters; + } + return clusters; } public int setRunConditionsParameters(DataEvent event) { @@ -119,25 +109,22 @@ public int setRunConditionsParameters(DataEvent event) { if(event.hasBank("RUN::config")==false) { System.out.println("RUN CONDITIONS NOT READ!"); } - DataBank bank = event.getBank("RUN::config"); - run = bank.getInt("run")[0]; - - return run; + run = bank.getInt("run")[0]; + return run; } - public static void main (String arg[]) { int debug = FTTRKReconstruction.debugMode; - FTTRKEngine trk = new FTTRKEngine(); - trk.init(); + FTTRKEngine trk = new FTTRKEngine(); + trk.init(); // insert input filename here String input = "/home/filippi/clas12/fttrkDev/clas12-offline-software-6.5.13-fttrkDev/filter_005418_newbanks.hipo"; System.out.println("input file " + input); - HipoDataSource reader = new HipoDataSource(); - reader.open(input); + HipoDataSource reader = new HipoDataSource(); + reader.open(input); - // initialize histos + // initialize histos H2F h1 = new H2F("h1", "Layer vs. Component", 768, 0., 769., 4, 0.5, 4.5); h1.setTitleX("Component"); h1.setTitleY("Layer"); @@ -177,7 +164,6 @@ public static void main (String arg[]) { int nc1 = 0, nc2 = 0, ncmatch = 0; int nev=0; while(reader.hasEvent()){ -// int nev1 = 0; int nev2 = 20000; for(nev=nev1; nev=1) System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~ processing event ~~~~~~~~~~~ " + nev); diff --git a/reconstruction/ft/src/test/java/org/jlab/service/ft/FTEBEngineTest.java b/reconstruction/ft/src/test/java/org/jlab/service/ft/FTEBEngineTest.java index c93469706a..9328cea189 100644 --- a/reconstruction/ft/src/test/java/org/jlab/service/ft/FTEBEngineTest.java +++ b/reconstruction/ft/src/test/java/org/jlab/service/ft/FTEBEngineTest.java @@ -4,40 +4,17 @@ import java.util.Arrays; import java.util.List; -import javax.swing.JFrame; -import org.jlab.clas.detector.DetectorData; -import org.jlab.clas.detector.DetectorEvent; - import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.detector.base.DetectorLayer; -import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; -import org.jlab.geom.prim.Vector3D; import org.jlab.groot.data.H1F; import org.jlab.groot.data.H2F; -import org.jlab.groot.data.DataLine; -import org.jlab.groot.ui.LatexText; -import org.jlab.groot.math.F1D; -import org.jlab.groot.fitter.DataFitter; -import org.jlab.groot.graphics.EmbeddedCanvas; -import org.jlab.groot.data.GraphErrors; -import org.jlab.clas.pdg.PhysicsConstants; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.io.evio.EvioDataBank; import org.jlab.io.evio.EvioDataEvent; -import org.jlab.io.hipo.HipoDataSource; -import org.jlab.rec.ft.cal.FTCALConstantsLoader; -import org.jlab.rec.ft.cal.FTCALEngine; -import org.jlab.rec.ft.hodo.FTHODOEngine; -import org.jlab.rec.ft.trk.FTTRKEngine; -import org.jlab.rec.ft.trk.FTTRKConstantsLoader; -import org.jlab.rec.ft.trk.FTTRKReconstruction; import org.jlab.rec.ft.FTEventBuilder; import org.jlab.rec.ft.FTParticle; import org.jlab.rec.ft.FTResponse; -import org.jlab.rec.ft.FTEBEngine; -import org.jlab.rec.ft.FTConstants; public class FTEBEngineTest extends ReconstructionEngine { @@ -74,13 +51,14 @@ public class FTEBEngineTest extends ReconstructionEngine { public static H2F hSeedDet1 = new H2F("lay 4 vs lay3 cluster seeds fo form a cross", 768/4, -0.5, 767.5, 768/4, -0.5, 767.5); public static Point3D centerOfTarget = new Point3D(0., 0., -3.); - - public FTEBEngineTest() { super("FTEB", "devita", "3.0"); } + @Override + public void detectorChanged(int i) {} + @Override public boolean init() { reco = new FTEventBuilder(); @@ -97,7 +75,7 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { List FTparticles = new ArrayList(); List FTresponses = new ArrayList(); diff --git a/reconstruction/ft/src/test/java/org/jlab/service/ft/FTTRKEngineTest.java b/reconstruction/ft/src/test/java/org/jlab/service/ft/FTTRKEngineTest.java index 0023082b20..753f5faa0b 100644 --- a/reconstruction/ft/src/test/java/org/jlab/service/ft/FTTRKEngineTest.java +++ b/reconstruction/ft/src/test/java/org/jlab/service/ft/FTTRKEngineTest.java @@ -1,8 +1,3 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package org.jlab.service.ft; import java.util.ArrayList; @@ -66,7 +61,7 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { List allHits = new ArrayList(); ArrayList clusters = new ArrayList(); ArrayList crosses = new ArrayList(); @@ -561,6 +556,11 @@ public static void main (String arg[]) { frame3.setVisible(true); } + + @Override + public void detectorChanged(int runNumber) { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/reconstruction/htcc/src/main/java/org/jlab/service/htcc/HTCCReconstructionService.java b/reconstruction/htcc/src/main/java/org/jlab/service/htcc/HTCCReconstructionService.java index bb7816c7d3..dcb7e68ab3 100644 --- a/reconstruction/htcc/src/main/java/org/jlab/service/htcc/HTCCReconstructionService.java +++ b/reconstruction/htcc/src/main/java/org/jlab/service/htcc/HTCCReconstructionService.java @@ -20,7 +20,7 @@ public HTCCReconstructionService(){ } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { int runNo = 10; if(event.hasBank("RUN::config")==true){ @@ -48,9 +48,7 @@ public boolean processDataEvent(DataEvent event) { @Override public boolean init() { - - - String[] htccTables = new String[]{ + String[] htccTables = new String[]{ "/calibration/htcc/gain", "/calibration/htcc/time", "/calibration/htcc/ring_time", @@ -59,13 +57,12 @@ public boolean init() { "/geometry/htcc/htcc", }; - this.registerOutputBank("HTCC::rec"); - requireConstants(Arrays.asList(htccTables)); return true; } - + @Override + public void detectorChanged(int runNumber) {} } diff --git a/reconstruction/ltcc/src/main/java/org/jlab/service/ltcc/LTCCEngine.java b/reconstruction/ltcc/src/main/java/org/jlab/service/ltcc/LTCCEngine.java index 0a1f2380e3..db518ddfdc 100644 --- a/reconstruction/ltcc/src/main/java/org/jlab/service/ltcc/LTCCEngine.java +++ b/reconstruction/ltcc/src/main/java/org/jlab/service/ltcc/LTCCEngine.java @@ -4,7 +4,6 @@ import org.jlab.io.base.DataEvent; import java.util.List; import java.util.Arrays; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -18,38 +17,36 @@ public class LTCCEngine extends ReconstructionEngine { private static final boolean DEBUG = false; private static final List CC_TABLES = - Arrays.asList("/calibration/ltcc/spe", - "/calibration/ltcc/status" - ); + Arrays.asList("/calibration/ltcc/spe","/calibration/ltcc/status"); public LTCCEngine() { super("LTCC", "joosten", "1.0"); } @Override - public boolean processDataEvent(DataEvent event) { - if (DEBUG) event.show(); - // only process the event if the LTCC bank is present - if (event.hasBank("LTCC::adc")) { - if (DEBUG) event.getBank("LTCC::adc").show(); - List hits = - LTCCHit.loadHits(event, this.getConstantsManager()); - List clusters = - LTCCClusterFinder.findClusters(hits); - LTCCCluster.saveClusters(event, clusters); - if (DEBUG) { - event.getBank("LTCC::clusters").show(); - } - } - - return true; - } + public boolean processDataEventUser(DataEvent event) { + if (DEBUG) event.show(); + // only process the event if the LTCC bank is present + if (event.hasBank("LTCC::adc")) { + if (DEBUG) event.getBank("LTCC::adc").show(); + List hits = + LTCCHit.loadHits(event, this.getConstantsManager()); + List clusters = + LTCCClusterFinder.findClusters(hits); + LTCCCluster.saveClusters(event, clusters); + if (DEBUG) event.getBank("LTCC::clusters").show(); + } + return true; + } @Override - public boolean init() { - this.requireConstants(CC_TABLES); - this.registerOutputBank("LTCC::clusters"); - return true; - } + public boolean init() { + this.requireConstants(CC_TABLES); + this.registerOutputBank("LTCC::clusters"); + return true; + } + + @Override + public void detectorChanged(int runNumber) {} } diff --git a/reconstruction/mc/src/main/java/org/jlab/service/mc/TruthMatch.java b/reconstruction/mc/src/main/java/org/jlab/service/mc/TruthMatch.java index a8c4b9b189..310c4788cd 100644 --- a/reconstruction/mc/src/main/java/org/jlab/service/mc/TruthMatch.java +++ b/reconstruction/mc/src/main/java/org/jlab/service/mc/TruthMatch.java @@ -46,7 +46,7 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { if (event.hasBank("MC::True") == false) { return false; @@ -233,6 +233,9 @@ public boolean processDataEvent(DataEvent event) { } + @Override + public void detectorChanged(int runNumber) {} + /** * ************************************************************************ * Defining objects that will be needed int the matching process diff --git a/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTDEngine.java b/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTDEngine.java index e7bcac7fe4..6dce3c09cd 100644 --- a/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTDEngine.java +++ b/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTDEngine.java @@ -19,39 +19,36 @@ */ public class MLTDEngine extends ReconstructionEngine { - EJMLTrackNeuralNetwork network = null; private String networkFlavor = "default"; - private Integer networkRun = 5038; + private Integer userRunNumber = -1; private String inputBankPrefix = ""; private String outputBankPrefix = "ai"; private String inputBank = null; private String outputBank = null; - + public MLTDEngine(){ super("MLTD","gavalian","1.0"); } @Override public boolean init() { - - //Set bank names inputBankPrefix = Optional.ofNullable(this.getEngineConfigString("inputBankPrefix")).orElse(""); outputBankPrefix = Optional.ofNullable(this.getEngineConfigString("outputBankPrefix")).orElse("ai"); inputBank = "HitBasedTrkg::"+inputBankPrefix+"Clusters"; outputBank = outputBankPrefix+"::tracks"; - networkFlavor = Optional.ofNullable(this.getEngineConfigString("flavor")).orElse("default"); - String runNumber = Optional.ofNullable(this.getEngineConfigString("run")).orElse("5038"); - networkRun = Integer.parseInt(runNumber); - + userRunNumber = Integer.valueOf(Optional.ofNullable(this.getEngineConfigString("run")).orElse("-1")); + return true; + } + + public boolean load(int run) { String path = CLASResources.getResourcePath("etc/data/nnet/ejml/ejmlclas12.network"); if(this.getEngineConfigString("network")!=null) path = this.getEngineConfigString("network"); System.out.println("[neural-network] info : Loading neural network from " + path); - network = new EJMLTrackNeuralNetwork(); - Map files = new HashMap(); + Map files = new HashMap<>(); files.put("classifier", "trackClassifier.network"); files.put("fixer", "trackFixer.network"); @@ -64,7 +61,7 @@ public boolean init() { //----- however it the provided run # it lower than anything //----- existing in the arhive, it will return the closest run //----- number entry. - int adjustedRun = provider.findEntry(networkRun); + int adjustedRun = provider.findEntry(run); String directory = String.format("network/%d/%s", adjustedRun, networkFlavor); network.initZip(path.trim(),directory, files); @@ -80,23 +77,20 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent de) { + public void detectorChanged(int runNumber) { + if (userRunNumber < 0) { + load(runNumber); + } + else if (network == null) { + load(userRunNumber); + } + } + + @Override + public boolean processDataEventUser(DataEvent de) { if(de.hasBank(inputBank)==true){ - DataBank bank = de.getBank(inputBank); - + DataBank bank = de.getBank(inputBank); HipoDataBank hipoBank = (HipoDataBank) bank; - - //classifier.processBank(hipoBank.getBank()); - - /*Clas12TrackAnalyzer analyzer = new Clas12TrackAnalyzer(); - for(int sector = 1; sector <=6; sector++){ - analyzer.readBank(hipoBank.getBank(), sector); - classifier.evaluate(analyzer.getCombinations()); - //analyzer.getCombinations().analyze(); - //System.out.println(analyzer.getCombinations()); - classifier.evaluate5(analyzer.getCombinationsPartial()); - analyzer.analyze(); - }*/ Clas12TrackFinder trackFinder = new Clas12TrackFinder(); trackFinder.setTrackingNetwork(network); trackFinder.process(hipoBank.getBank()); @@ -106,8 +100,6 @@ public boolean processDataEvent(DataEvent de) { } public void writeBank(DataEvent event, ClusterCombinations combi){ - //ClusterCombinations combi = cl.getTracks(); - //System.out.println(">>> writing ai bank with entries = " + combi.getSize()); DataBank bank = event.createBank(outputBank, combi.getSize()); for(int i = 0; i < combi.getSize(); i++){ bank.setByte("id", i, (byte) (i+1)); @@ -120,26 +112,8 @@ public void writeBank(DataEvent event, ClusterCombinations combi){ bank.setShort("c"+order, i, (short) ids[c]); } } - //System.out.println("appending bank"); event.removeBank(outputBank); event.appendBank(bank); } - /*public void writeBank(DataEvent event, Clas12TrackClassifier cl){ - ClusterCombinations combi = cl.getTracks(); - //System.out.println(">>> writing ai bank with entries = " + combi.getSize()); - DataBank bank = event.createBank("ai::tracks", combi.getSize()); - for(int i = 0; i < combi.getSize(); i++){ - bank.setByte("id", i, (byte) (i+1)); - bank.setByte("sector", i, (byte) 1); - int[] ids = combi.getLabels(i); - for(int c = 0; c < 6; c++){ - int order = c+1; - bank.setShort("c"+order, i, (short) ids[c]); - } - } - //System.out.println("appending bank"); - event.appendBank(bank); - }*/ - } diff --git a/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTNEngine.java b/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTNEngine.java index f4e8790dfe..0d2c3ce339 100644 --- a/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTNEngine.java +++ b/reconstruction/mltn/src/main/java/org/jlab/service/mltn/MLTNEngine.java @@ -1,8 +1,3 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package org.jlab.service.mltn; import j4ml.clas12.Clas12TrackAnalyzer; @@ -16,7 +11,7 @@ /** * * @author gavalian - @deprecated + @Deprecated */ public class MLTNEngine extends ReconstructionEngine { @@ -32,12 +27,14 @@ public boolean init() { classifier.setEnvPath("etc/data/nnet/neuroph"); classifier.load("trackClassifier.nnet", "trackFixer.nnet"); System.out.println("Loading neural network files done..."); - //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. return true; } @Override - public boolean processDataEvent(DataEvent de) { + public void detectorChanged(int runNumber) {} + + @Override + public boolean processDataEventUser(DataEvent de) { if(de.hasBank("HitBasedTrkg::Clusters")==true){ DataBank bank = de.getBank("HitBasedTrkg::Clusters"); @@ -96,5 +93,4 @@ public void writeBank(DataEvent event, ClusterCombinations combi){ //System.out.println("appending bank"); event.appendBank(bank); }*/ - } diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java index 0d9dc58efb..463c1a34bd 100644 --- a/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java +++ b/reconstruction/mu/src/main/java/org/jlab/rec/mucal/MUCALEngine.java @@ -49,8 +49,11 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int run) {} + @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { List allHits = new ArrayList(); List selectedHits = new ArrayList(); List clusters = new ArrayList(); diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDEngine.java b/reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDEngine.java index 8935ba6420..806bd92856 100644 --- a/reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDEngine.java +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muhd/MUHDEngine.java @@ -44,8 +44,11 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int run) {} + @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { // update calibration constants based on run number if changed int run = setRunConditionsParameters(event); diff --git a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java index 33025f6e72..b1ab656c94 100644 --- a/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java +++ b/reconstruction/mu/src/main/java/org/jlab/rec/muvt/MUVTEngine.java @@ -55,7 +55,10 @@ public boolean init() { } @Override - public boolean processDataEvent(DataEvent event) { + public void detectorChanged(int run) {} + + @Override + public boolean processDataEventUser(DataEvent event) { // Initial setup. if(debug) System.out.println("\nNew event"); @@ -279,4 +282,4 @@ private void writeHipoBanks(DataEvent de, de.appendBanks(bankS,bankC,bankX,bankT); } -} \ No newline at end of file +} diff --git a/reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java b/reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java index 3a45e064a1..0aa6145e85 100644 --- a/reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java +++ b/reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java @@ -47,7 +47,10 @@ else if (getEngineConfigString(CONF_PRELOAD_DIR) != null) { } @Override - public boolean processDataEvent(DataEvent event) { + public void detectorChanged(int run) {} + + @Override + public boolean processDataEventUser(DataEvent event) { processor.processEvent(event); return true; } diff --git a/reconstruction/raster/src/main/java/org/jlab/service/raster/RasterEngine.java b/reconstruction/raster/src/main/java/org/jlab/service/raster/RasterEngine.java index fe1a313904..7776206e03 100644 --- a/reconstruction/raster/src/main/java/org/jlab/service/raster/RasterEngine.java +++ b/reconstruction/raster/src/main/java/org/jlab/service/raster/RasterEngine.java @@ -49,9 +49,11 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int runNumber) {} @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { // Read run number from RUN::config bank int run=-1; @@ -132,7 +134,7 @@ public static void main(String arg[]) { System.out.print("MC position read : " + MC_Part.getFloat("vx",0) +"\n"); // run the raster engine - engine.processDataEvent(event); + engine.processDataEventUser(event); // read the output bank and fill the histograms if(event.hasBank("RASTER::position")) { diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java index d1f8325f7a..bbb1bc8bfc 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java @@ -55,7 +55,7 @@ public boolean init() { @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { List strips = RecoilStrip.getStrips(event, factory, this.getConstantsManager()); List clusters = RecoilCluster.createClusters(strips); @@ -241,4 +241,7 @@ public static void main (String arg[]) { frame.setVisible(true); } + + @Override + public void detectorChanged(int run) {} } diff --git a/reconstruction/rich/src/main/java/org/jlab/rec/rich/RICHEBEngine.java b/reconstruction/rich/src/main/java/org/jlab/rec/rich/RICHEBEngine.java index 56540d6335..faff8505dd 100644 --- a/reconstruction/rich/src/main/java/org/jlab/rec/rich/RICHEBEngine.java +++ b/reconstruction/rich/src/main/java/org/jlab/rec/rich/RICHEBEngine.java @@ -1,53 +1,30 @@ package org.jlab.rec.rich; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JFrame; - -import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.io.base.DataEvent; -import org.jlab.io.base.DataBank; - -import org.jlab.utils.groups.IndexedTable; import java.util.Arrays; import java.util.Optional; - -import org.jlab.geom.prim.Plane3D; -import org.jlab.geom.prim.Line3D; - +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.io.base.DataEvent; import org.jlab.detector.geom.RICH.RICHGeoFactory; public class RICHEBEngine extends ReconstructionEngine { private int Run = -1; private int Ncalls = 0; - private long EBRICH_start_time; - private RICHGeoFactory richgeo; private RICHTime richtime = new RICHTime(); private boolean engineDebug = false; - - // ---------------- public RICHEBEngine() { - // ---------------- super("RICHEB", "mcontalb", "3.0"); - } - @Override - // ---------------- public boolean init() { - // ---------------- int debugMode = 0; if(debugMode>=1)System.out.format("I am in RICHEBEngine init \n"); - String[] richTables = new String[]{ "/geometry/rich/setup", "/geometry/rich/geo_parameter", @@ -83,25 +60,24 @@ public boolean init() { if(this.getEngineConfigString("debug")!=null) this.engineDebug = Boolean.parseBoolean(this.getEngineConfigString("debug")); - // Get the constant tables for reconstruction parameters, geometry and optical characterization - int run = 11; - - richgeo = new RICHGeoFactory(1, this.getConstantsManager(), run, engineDebug); - richtime.init_ProcessTime(); - return true; } - + + @Override + public void detectorChanged(int runNumber) { + richgeo = new RICHGeoFactory(1, this.getConstantsManager(), runNumber, engineDebug); + richtime.init_ProcessTime(); + } @Override // ---------------- - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { // ---------------- int debugMode = 0; - // create instances of all event-dependent classes in processDataEvent to avoid interferences between different threads when running in clara + // create instances of all event-dependent classes in processDataEventUser to avoid interferences between different threads when running in clara RICHEvent richevent = new RICHEvent(); RICHio richio = new RICHio(); RICHCalibration richcal = new RICHCalibration(); @@ -159,5 +135,4 @@ public boolean processDataEvent(DataEvent event) { return true; } - } diff --git a/reconstruction/rtpc/src/main/java/org/jlab/service/rtpc/RTPCEngine.java b/reconstruction/rtpc/src/main/java/org/jlab/service/rtpc/RTPCEngine.java index b6231f34be..42a5316c93 100644 --- a/reconstruction/rtpc/src/main/java/org/jlab/service/rtpc/RTPCEngine.java +++ b/reconstruction/rtpc/src/main/java/org/jlab/service/rtpc/RTPCEngine.java @@ -1,9 +1,6 @@ package org.jlab.service.rtpc; import java.io.File; - - - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -26,16 +23,12 @@ import org.jlab.rec.rtpc.hit.TrackFinder; import org.jlab.rec.rtpc.hit.TrackHitReco; import org.jlab.rec.rtpc.hit.HelixFitTest; -import org.jlab.detector.calib.utils.ConstantsManager; import org.jlab.utils.groups.IndexedTable; import org.jlab.clas.tracking.kalmanfilter.Material; - - public class RTPCEngine extends ReconstructionEngine{ - public RTPCEngine() { super("RTPC","davidp","3.0"); } @@ -54,8 +47,7 @@ public boolean init() { String cosm = this.getEngineConfigString("rtpcCosmic"); String beamfit = this.getEngineConfigString("rtpcBeamlineFit"); String disentangler = this.getEngineConfigString("rtpcDisentangler"); - String chi2cull = this.getEngineConfigString("rtpcChi2Cull"); - //System.out.println(sim + " " + cosm + " " + beamfit); + String chi2cull = this.getEngineConfigString("rtpcChi2Cull"); String kfstatus = this.getEngineConfigString("rtpcKF"); if(sim != null){ @@ -98,11 +90,12 @@ public boolean init() { return true; } - - + + @Override + public void detectorChanged(int runNumber) {} @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { HitParameters params = new HitParameters(); @@ -230,7 +223,7 @@ public static void main(String[] args){ while(reader.hasEvent()){ DataEvent event = reader.getNextEvent(); //if(eventcount == eventselect){ - en.processDataEvent(event); + en.processDataEventUser(event); writer.writeEvent(event); //}else if(eventcount > eventselect) break; eventcount ++; diff --git a/reconstruction/swaps/src/main/java/org/jlab/service/swaps/SwapEngine.java b/reconstruction/swaps/src/main/java/org/jlab/service/swaps/SwapEngine.java index 609a678c9f..5c5dcaaeaf 100644 --- a/reconstruction/swaps/src/main/java/org/jlab/service/swaps/SwapEngine.java +++ b/reconstruction/swaps/src/main/java/org/jlab/service/swaps/SwapEngine.java @@ -37,7 +37,7 @@ private void updateBank(int run,DataBank bank) { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { DataBank bank = event.getBank("RUN::config"); final int run = bank.getInt("run",0); for (String detectorName : this.swapman.getDetectors()) { @@ -87,4 +87,7 @@ public boolean init() { return true; } + @Override + public void detectorChanged(int runNumber) {} + } diff --git a/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ctof/HitReader.java b/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ctof/HitReader.java index e11edad02b..47141e8a08 100644 --- a/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ctof/HitReader.java +++ b/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ctof/HitReader.java @@ -524,7 +524,7 @@ private double getTriggerPhase(long timestamp, IndexedTable table) { int phase = table.getIntValue("phase", 0,0,0); int cycles = table.getIntValue("cycles", 0,0,0); double triggerphase=0; - if(cycles > 0) triggerphase=period*((timestamp+phase)%cycles); + if(cycles>0 && timestamp>=0) triggerphase=period*((timestamp+phase)%cycles); // System.out.println(period + " " + phase + " " + cycles + " " + timestamp + " " + triggerphase); return triggerphase; } diff --git a/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ftof/HitReader.java b/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ftof/HitReader.java index 613b0ab55e..2c49879f4f 100644 --- a/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ftof/HitReader.java +++ b/reconstruction/tof/src/main/java/org/jlab/rec/tof/banks/ftof/HitReader.java @@ -540,7 +540,7 @@ private double getTriggerPhase(long timestamp, IndexedTable table) { int phase = table.getIntValue("phase", 0,0,0); int cycles = table.getIntValue("cycles", 0,0,0); double triggerphase=0; - if(cycles > 0) triggerphase=period*((timestamp+phase)%cycles); + if(cycles>0 && timestamp>=0) triggerphase=period*((timestamp+phase)%cycles); // System.out.println(period + " " + phase + " " + cycles + " " + timestamp + " " + triggerphase); return triggerphase; } diff --git a/reconstruction/tof/src/main/java/org/jlab/service/ctof/CTOFEngine.java b/reconstruction/tof/src/main/java/org/jlab/service/ctof/CTOFEngine.java index 8fb79d5b51..c079a59686 100644 --- a/reconstruction/tof/src/main/java/org/jlab/service/ctof/CTOFEngine.java +++ b/reconstruction/tof/src/main/java/org/jlab/service/ctof/CTOFEngine.java @@ -1,6 +1,5 @@ package org.jlab.service.ctof; -import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -8,12 +7,10 @@ import java.util.Optional; import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.coda.jevio.EvioException; import org.jlab.detector.base.DetectorType; import org.jlab.detector.base.GeometryFactory; import org.jlab.detector.geant4.v2.CTOFGeant4Factory; import org.jlab.geom.base.ConstantProvider; -import org.jlab.geometry.prim.Line3d; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; @@ -46,13 +43,9 @@ public CTOFEngine() { @Override public boolean init() { - // Load the Constants - // if (Constants.CSTLOADED == false) { Constants.Load(); - // } rbc = new RecoBankWriter(); - // CalibrationConstantsLoader.Load(); - // } + String[] ctofTables = new String[]{ "/calibration/ctof/attenuation", "/calibration/ctof/effective_velocity", @@ -68,20 +61,21 @@ public boolean init() { }; requireConstants(Arrays.asList(ctofTables)); - - // Get the constants for the correct variation this.getConstantsManager().setVariation("default"); - String engineVariation = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); - ConstantProvider cp = GeometryFactory.getConstants(DetectorType.CTOF, 11, engineVariation); - geometry = new CTOFGeant4Factory(cp); - this.registerOutputBank("CTOF::rawhits","CTOF::hits","CTOF::clusters"); - return true; } + + + @Override + public void detectorChanged(int runNumber) { + String engineVariation = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); + ConstantProvider cp = GeometryFactory.getConstants(DetectorType.CTOF, runNumber, engineVariation); + geometry = new CTOFGeant4Factory(cp); + } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { //setRunConditionsParameters( event) ; if(event.hasBank("RUN::config")==false ) { System.err.println("RUN CONDITIONS NOT READ!"); @@ -89,8 +83,6 @@ public boolean processDataEvent(DataEvent event) { } DataBank bank = event.getBank("RUN::config"); -// System.out.println(); -// System.out.println(bank.getInt("event", 0)); // Load the constants //------------------- @@ -218,7 +210,7 @@ public static void main(String[] args) { counter++; DataEvent event = reader.getNextEvent(); - en.processDataEvent(event); + en.processDataEventUser(event); writer.writeEvent(event); if (counter > 3) { break; @@ -231,5 +223,4 @@ public static void main(String[] args) { System.out.println("TOTAL PROCESSING TIME = " + t); writer.close(); } - } diff --git a/reconstruction/tof/src/main/java/org/jlab/service/ftof/FTOFEngine.java b/reconstruction/tof/src/main/java/org/jlab/service/ftof/FTOFEngine.java index 4a0c24d2c3..eb08d82226 100644 --- a/reconstruction/tof/src/main/java/org/jlab/service/ftof/FTOFEngine.java +++ b/reconstruction/tof/src/main/java/org/jlab/service/ftof/FTOFEngine.java @@ -45,9 +45,6 @@ public FTOFEngine(String name) { @Override public boolean init() { - - // Load the Constants - // if (Constants.CSTLOADED == false) { Constants.Load(); rbc = new RecoBankWriter(); @@ -68,30 +65,27 @@ public boolean init() { }; requireConstants(Arrays.asList(ftofTables)); - - // Get the constants for the correct variation this.getConstantsManager().setVariation("default"); - - // Get geometry database provider, load the geometry tables and create geometry - String engineVariation = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); - ConstantProvider db = GeometryFactory.getConstants(DetectorType.FTOF, 11, engineVariation); - geometry = new FTOFGeant4Factory(db); this.registerOutputBank("FTOF::rawhits","FTOF::hbhits","FTOF::hbclusters"); this.registerOutputBank("FTOF::hits","FTIF::clusters","FTOF::matchedClusters"); return true; } + + @Override + public void detectorChanged(int runNumber) { + String engineVariation = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); + ConstantProvider db = GeometryFactory.getConstants(DetectorType.FTOF, runNumber, engineVariation); + geometry = new FTOFGeant4Factory(db); + } @Override - public boolean processDataEvent(DataEvent event) { - // System.out.println(" PROCESSING EVENT ...."); - // Constants.DEBUGMODE = true; - //setRunConditionsParameters( event) ; + public boolean processDataEventUser(DataEvent event) { if(event.hasBank("RUN::config")==false ) { - System.err.println("RUN CONDITIONS NOT READ!"); - return true; - } + System.err.println("RUN CONDITIONS NOT READ!"); + return true; + } DataBank bank = event.getBank("RUN::config"); @@ -215,24 +209,10 @@ public boolean processDataEvent(DataEvent event) { // 3.4) exit if cluster list is empty but save the hits rbc.appendFTOFBanks(event, hits, clusters, matchedClusters, TrkType); -// if (event.hasBank("FTOF::adc")) { -// if (event.hasBank("FTOF::adc")) { -// event.getBank("FTOF::adc").show(); -// } -// if (event.hasBank("FTOF::tdc")) { -// event.getBank("FTOF::tdc").show(); -// } -// if (event.hasBank("FTOF::hits")) { -// event.getBank("FTOF::hits").show(); -// } -// } - return true; } - - public static void main(String arg[]) { FTOFHBEngine en = new FTOFHBEngine(); en.init(); @@ -263,11 +243,11 @@ public static void main(String arg[]) { t1 = System.currentTimeMillis(); } - //en0.processDataEvent(event); + //en0.processDataEventUser(event); // if (counter > 3062) - //en0.processDataEvent(event); - //en1.processDataEvent(event); - en.processDataEvent(event); + //en0.processDataEventUser(event); + //en1.processDataEventUser(event); + en.processDataEventUser(event); System.out.println(" EVENT " + counter); //if (counter > 3066) // break; diff --git a/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java index de555dbf26..4473edf913 100644 --- a/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java +++ b/reconstruction/urwt/src/main/java/org/jlab/service/urwt/URWTEngine.java @@ -51,11 +51,14 @@ public boolean init() { return true; } - - + @Override + public void detectorChanged(int runNumber) { + String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); + factory = new URWTStripFactory(runNumber, variationName); + } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { List strips = URWRStrip.getStrips(event, factory, this.getConstantsManager()); List clusters = URWTCluster.createClusters(strips); @@ -180,7 +183,7 @@ public static void main (String arg[]) { while(reader.hasEvent()) { DataEvent event = reader.getNextEvent(); - engine.processDataEvent(event); + engine.processDataEventUser(event); double xtrue = 0; double ytrue = 0; diff --git a/reconstruction/vtx/src/main/java/org/jlab/rec/service/vtx/VTXEngine.java b/reconstruction/vtx/src/main/java/org/jlab/rec/service/vtx/VTXEngine.java index 380f1f08f9..f7fe0d9b63 100644 --- a/reconstruction/vtx/src/main/java/org/jlab/rec/service/vtx/VTXEngine.java +++ b/reconstruction/vtx/src/main/java/org/jlab/rec/service/vtx/VTXEngine.java @@ -50,7 +50,7 @@ public void setFieldsConfig(String fieldsConfig) { } @Override - public boolean processDataEvent(DataEvent event) { + public boolean processDataEventUser(DataEvent event) { this.FieldsConfig = this.getFieldsConfig(); if (event.hasBank("RUN::config") == false) { System.err.println("RUN CONDITIONS NOT READ!"); @@ -118,5 +118,7 @@ public void loadConfiguration() { } + @Override + public void detectorChanged(int run) {} } diff --git a/validation/advanced-tests/run-eb-tests-all.sh b/validation/advanced-tests/run-eb-tests-all.sh deleted file mode 100755 index ccd5116fd8..0000000000 --- a/validation/advanced-tests/run-eb-tests-all.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# -# This runs all existing EB tests. -# Requires about 10 minutes to fully succeed (single-threaded), else aborts ASAP. -# - -for xx in `awk '{print$1}' src/eb/scripts/list.txt` -do - ./run-eb-tests.sh -100 $xx - if [ $? != 0 ] - then - echo run-eb-tests.sh: failed on $xx - exit - fi -done - diff --git a/validation/advanced-tests/run-eb-tests.sh b/validation/advanced-tests/run-eb-tests.sh index fa2077f3df..05c7470db5 100755 --- a/validation/advanced-tests/run-eb-tests.sh +++ b/validation/advanced-tests/run-eb-tests.sh @@ -1,14 +1,11 @@ #!/bin/bash -# coatjava must already be built at ../../coatjava/ +# WARNING: coatjava must already be built at ../../coatjava/ # and input test data files at ./data -#set -x # print every command executed - -input_dir=./data/5.11-fid-tm-dc2-r11 - +set -e source ../../coatjava/libexec/env.sh - +input_dir=./data/6.0-r11 classPath="${COATJAVA_CLASSPATH}:../lib/*:src/" # check arguments: @@ -55,9 +52,8 @@ rm -f out_${stub}.hipo ../../coatjava/bin/recon-util -l FINE -i ${input_dir}/${stub}.hipo -o out_${stub}.hipo -c 2 # run EB tests: -java -DCLAS12DIR="$COAT" -Xmx1536m -Xms1024m -cp $classPath -DINPUTFILE=out_${stub}.hipo eb.EBTwoTrackTest +java -Xmx1536m -Xms1024m -cp $classPath -DINPUTFILE=out_${stub}.hipo eb.EBTwoTrackTest if [ $? != 0 ] ; then echo "EBTwoTrackTest unit test failure" ; exit 1 ; else echo "EBTwoTrackTest passed unit tests" ; fi # run truth-efficiency calculator: ../../coatjava/bin/trutheff ./out_${stub}.hipo - diff --git a/validation/advanced-tests/src/eb/scripts/gemc.sh b/validation/advanced-tests/src/eb/scripts/gemc.sh index 02fbecb537..ad3e977bdb 100755 --- a/validation/advanced-tests/src/eb/scripts/gemc.sh +++ b/validation/advanced-tests/src/eb/scripts/gemc.sh @@ -1,5 +1,7 @@ #!/bin/sh +set -e + usage() { echo "Usage: $0 [-g GEMC] [-n NEV] [-p PARTS] [-c GCARD] [-m]" 1>&2; exit $1; } run=11 From 394fc7051435092f031f5773d7ce97c7737c8e12 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 19 May 2026 12:41:06 -0400 Subject: [PATCH 153/190] build: bump version number to 14.0.0 (#1272) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/postproc/pom.xml | 10 +++---- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 50 files changed, 341 insertions(+), 341 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 6d05b77e92..85cfa974ec 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index fe34126ac3..07d8976e1a 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 45808e74d9..761a04c53f 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar cnuphys swimmer - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index e6ce463255..9371842f38 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-logging - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 7d7b1c5177..c0bad013e0 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 0ae146ee68..d2bd579eaa 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 8a91330814..ec5c3f97a8 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index e2bfc05c91..cdba88e937 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 3d3ed7349a..09b316c4dd 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index f1347f468d..cc36d3083b 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index ba180d588a..21ab1752f5 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys swimmer - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index be83719ea1..4fe4ecedfb 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 55ed295ce0..442032257c 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 1c03c07d11..47a484412a 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar cnuphys clas12 - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 3afc93193a..25a704ffc5 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT pom org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index ecd1129e2f..22e45ec0fd 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar cnuphys clas12 - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index d8b7c70f9d..9c4d4cee66 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar cnuphys clas12 - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index fc86116100..8ccb37974f 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar cnuphys clas12 - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys splot - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index c0e66dbbb0..1d40b02d32 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clara-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-logging - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-math - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-tracking - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-decay-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys snr - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 3c8a7c843b..d781fcfbbf 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT pom org.jlab.clas coatjava - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index c2521fb430..e0cc669f52 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas common-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys swimmer - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/pom.xml b/pom.xml index 8d7c507758..54643a6a6b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index b4a46ce4f6..76c131ef46 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 2fb593f994..5720ad1004 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 311bf74785..6f0249513d 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 7337666188..579017d670 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 6157517dca..131a6b415c 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index c7089099ae..195f16fef3 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 719ccfab3a..e2d3c8cc2d 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 84b0e8984e..0c714672c5 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test org.jlab.clas clas-tracking - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test org.jlab.clas clas-math - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys snr - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index a433dc4854..93934c69f0 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 8d7d9970a1..fe645909c1 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT test org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index c718e374c6..3fffc1984c 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index f9f2c51717..0812da261d 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 7cf4988251..6b0827de37 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 8666d8d6f9..8dad2e6a5d 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index b988a051c0..6338a42434 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 5501bf8efe..ad5fe94134 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index ec27362091..35d4660be3 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 7e392dbc37..25099bd6b9 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT pom org.jlab.clas coatjava - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index 68d16dcd34..b748059b77 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-analysis - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index 2cc85f86f7..f9c6fa1224 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 4d81e3aa8e..b3189d3449 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index 13c990c4d7..205fd7af27 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index e2f7f0232b..436d6aeff0 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT cnuphys magfield - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-tracking - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT compile org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index edaf701a11..6bd1372dd4 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 6b2041c31c..164e85da50 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-physics - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-utils - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index b0dbe0bf28..b9d08e55b7 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index e060fbd3dd..b82205bf46 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-jcsg - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index dc08789255..a9ef62290b 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas swim-tools - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT jar cnuphys swimmer - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-reco - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-io - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT org.jlab.clas clas-geometry - 13.8.5-SNAPSHOT + 14.0.0-SNAPSHOT From b0a77f1af92e00be1c52600cc0db46adff7596ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 13:01:29 -0400 Subject: [PATCH 154/190] build(deps): bump org.slf4j:slf4j-api from 2.0.17 to 2.0.18 (#1266) Bumps org.slf4j:slf4j-api from 2.0.17 to 2.0.18. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-version: 2.0.18 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 54643a6a6b..bcd471719c 100644 --- a/pom.xml +++ b/pom.xml @@ -101,7 +101,7 @@ org.slf4j slf4j-api - 2.0.17 + 2.0.18 From f233db400398b4fecddc41da37662f2f8b6ebaf7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 17:11:20 +0000 Subject: [PATCH 155/190] build(deps): bump org.apache.maven.plugins:maven-enforcer-plugin (#1267) Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.6.2 to 3.6.3. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.6.2...enforcer-3.6.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-version: 3.6.3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bcd471719c..0e3c7e919e 100644 --- a/pom.xml +++ b/pom.xml @@ -370,7 +370,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.6.2 + 3.6.3 From 1c3541e7e6897e4aee16b31d43bbbc61b83453c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 16:27:55 -0400 Subject: [PATCH 156/190] chore(submodule): bump etc/data/nnet from `d03b07d` to `73aa434` (#1275) Bumps etc/data/nnet from `d03b07d` to `73aa434`. --- updated-dependencies: - dependency-name: etc/data/nnet dependency-version: 73aa4341c739175950def77252a018549d1411b0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- etc/data/nnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/data/nnet b/etc/data/nnet index d03b07dd16..73aa4341c7 160000 --- a/etc/data/nnet +++ b/etc/data/nnet @@ -1 +1 @@ -Subproject commit d03b07dd16918ebe8a3a648cf63b70f1016fce79 +Subproject commit 73aa4341c739175950def77252a018549d1411b0 From dce382e10361bb23eab72d662d4623d75c6920d3 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 19 May 2026 22:26:02 -0400 Subject: [PATCH 157/190] qiuet for ci (#1276) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c1117abf5..342de80f08 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,7 +42,7 @@ default: - export PATH=$CLARA_HOME/plugins/clas12/bin:$PATH - export PATH=$CLARA_HOME/bin:$PATH - export PATH=$COATJAVA/bin:$PATH - - tar -xzvf clara.tar.gz + - tar -xzf clara.tar.gz stages: - mirror From da27c6a9911832185da7be7f253997adeb778589 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 20 May 2026 18:21:28 -0400 Subject: [PATCH 158/190] feat: add decoder CLARA engine and a decoderless Clas12Reader I/O service (#1229) * add convenience method * remove unused stuff * add decoding engine * add it to the clara yaml * use a pool * hmm * allow decoder instances to share ConstantsManagers * share ConstantsManagers * kludge test * cleanup * try this * inherit ConstantsManagers * cleanup * only check tables if not shared * higher ports on macos, cleanup process dpe process * remove ineffective pid trap * Revert "higher ports on macos, cleanup process dpe process" This reverts commit 3c0135ea67de5252184ebe50556acd775a3b7c72. * Revert "fix job name" This reverts commit a5512a9c531aa723ab5b0a087d71a2ed9f75d9f8. * Revert "decouple ubuntu/macos builds to reduce wait" This reverts commit 446a6a538e9839b52077796d84c78b73ceb5c88e. * Revert "remove unnecessary reader class" This reverts commit 45e96c88ddebfb12a92cbd0a07313f8a85a1eda4. * Revert "remove example engine" This reverts commit d1dce3be33733e1d6d5b33e5274759f9eb43f9c0. * restore reported data type * rename class * undo * fix rebase oops * rename class * fix rebase oops * cleanup * cleanup * stf * just events, not per thread * reduce constants sharing * bugfix * share one RCDBManager * bugfix * restore Adjust the number of events based on the number of threads. * DecoderEngine: just pass along HIPO events * add Clas12Reader, no decoding * dummy initialization value * bugfix --- .../org/jlab/io/clara/EvioToEvioReader.java | 2 +- .../org/jlab/detector/decode/CLASDecoder.java | 21 ++-- .../detector/decode/DetectorEventDecoder.java | 37 ++++-- .../org/jlab/clas/reco/DecoderEngine.java | 113 ++++++++++++++++++ etc/services/rgd-clarode.yml | 6 +- 5 files changed, 155 insertions(+), 24 deletions(-) create mode 100644 common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecoderEngine.java diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java index fb8303719a..372bd423a7 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioReader.java @@ -39,7 +39,7 @@ public int readEventCount() throws EventReaderException { @Override public ByteOrder readByteOrder() throws EventReaderException { - return reader.getFileByteOrder(); + return ByteOrder.LITTLE_ENDIAN; //reader.getFileByteOrder(); } @Override diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java index 667d8ab586..663444dc63 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/CLASDecoder.java @@ -15,8 +15,6 @@ import org.jlab.io.base.DataEvent; import org.jlab.io.evio.EvioDataEvent; -import org.jlab.io.hipo.HipoDataEvent; -import org.jlab.io.hipo.HipoDataSync; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -38,18 +36,14 @@ public class CLASDecoder { protected SchemaFactory schemaFactory = new SchemaFactory(); private CodaEventDecoder codaDecoder = null; private List dataList = new ArrayList<>(); - private HipoDataSync writer = null; - private HipoDataEvent hipoEvent = null; private boolean isRunNumberFixed = false; private int decoderDebugMode = 0; private ModeAHDC ahdcExtractor = new ModeAHDC(); - private RCDBManager rcdbManager = new RCDBManager(); + private static RCDBManager rcdbManager = new RCDBManager(); public CLASDecoder(boolean development){ codaDecoder = new CodaEventDecoder(); detectorDecoder = new DetectorEventDecoder(development); - writer = new HipoDataSync(); - hipoEvent = (HipoDataEvent) writer.createEvent(); String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); schemaFactory.initFromDirectory(dir); } @@ -57,8 +51,13 @@ public CLASDecoder(boolean development){ public CLASDecoder(){ codaDecoder = new CodaEventDecoder(); detectorDecoder = new DetectorEventDecoder(); - writer = new HipoDataSync(); - hipoEvent = (HipoDataEvent) writer.createEvent(); + String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); + schemaFactory.initFromDirectory(dir); + } + + public CLASDecoder(CLASDecoder d) { + codaDecoder = new CodaEventDecoder(); + detectorDecoder = new DetectorEventDecoder(d.detectorDecoder); String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); schemaFactory.initFromDirectory(dir); } @@ -792,4 +791,8 @@ public Event getDecodedEvent(EvioDataEvent rawEvent, int run, int counter, Doubl return decodedEvent; } + + public Event getDecodedEvent(EvioDataEvent rawEvent) { + return getDecodedEvent(rawEvent, -1, -1, null, null); + } } diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java index 84ec0a6cf4..ff8df013c1 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/decode/DetectorEventDecoder.java @@ -45,6 +45,17 @@ public DetectorEventDecoder(boolean development){ } } + public DetectorEventDecoder(){ + this.initDecoder(); + } + + public DetectorEventDecoder(DetectorEventDecoder d) { + translationManager = d.translationManager; + fitterManager = d.fitterManager; + scalerManager = d.scalerManager; + initDecoder(false); + } + public void setTimestamp(String timestamp) { translationManager.setTimeStamp(timestamp); fitterManager.setTimeStamp(timestamp); @@ -80,10 +91,6 @@ public float getRcdbSolenoidScale() { getValue()).floatValue(); } - public DetectorEventDecoder(){ - this.initDecoder(); - } - public final void initDecoderDev(){ keysTrans = Arrays.asList(new DetectorType[]{ DetectorType.HTCC,DetectorType.BST,DetectorType.RTPC} ); tablesTrans = Arrays.asList(new String[]{ "/daq/tt/clasdev/htcc","/daq/tt/clasdev/svt","/daq/tt/clasdev/rtpc" }); @@ -95,7 +102,11 @@ public final void initDecoderDev(){ "/runcontrol/helicity","/daq/config/scalers/dsc1"})); } - public final void initDecoder(){ + public final void initDecoder() { + initDecoder(true); + } + + public final void initDecoder(boolean initializeManagers){ // Detector translation table keysTrans = Arrays.asList(new DetectorType[]{DetectorType.FTCAL,DetectorType.FTHODO,DetectorType.FTTRK,DetectorType.LTCC,DetectorType.ECAL,DetectorType.FTOF, @@ -109,7 +120,6 @@ public final void initDecoder(){ "/daq/tt/rf","/daq/tt/bmt","/daq/tt/fmt","/daq/tt/rich2","/daq/tt/hel","/daq/tt/band","/daq/tt/rtpc", "/daq/tt/raster","/daq/tt/atof","/daq/tt/ahdc" }); - translationManager.init(tablesTrans); // ADC waveform fitter translation table keysFitter = Arrays.asList(new DetectorType[]{DetectorType.FTCAL,DetectorType.FTHODO,DetectorType.FTTRK,DetectorType.FTOF,DetectorType.LTCC, @@ -122,17 +132,20 @@ public final void initDecoder(){ "/daq/config/fmt","/daq/fadc/hel","/daq/fadc/rf","/daq/fadc/band","/daq/fadc/raster", "/daq/config/ahdc" }); - fitterManager.init(tablesFitter); // Data filter list keysFilter = Arrays.asList(new DetectorType[]{DetectorType.DC}); - - scalerManager.init(Arrays.asList(new String[]{"/runcontrol/fcup","/runcontrol/slm","/runcontrol/hwp", - "/runcontrol/helicity","/daq/config/scalers/dsc1"})); - + keysMicromega = Arrays.asList(new DetectorType[]{DetectorType.BMT,DetectorType.FMT,DetectorType.FTTRK}); - checkTables(); + if (initializeManagers) { + translationManager.init(tablesTrans); + fitterManager.init(tablesFitter); + scalerManager.init(Arrays.asList(new String[]{"/runcontrol/fcup","/runcontrol/slm","/runcontrol/hwp", + "/runcontrol/helicity","/daq/config/scalers/dsc1"})); + checkTables(); + } + } public void checkTables() { diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecoderEngine.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecoderEngine.java new file mode 100644 index 0000000000..0d10debe60 --- /dev/null +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/reco/DecoderEngine.java @@ -0,0 +1,113 @@ +package org.jlab.clas.reco; + +import java.util.Set; +import java.util.HashSet; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import org.jlab.clara.base.ClaraUtil; +import org.jlab.clara.engine.Engine; +import org.jlab.clara.engine.EngineData; +import org.jlab.clara.engine.EngineDataType; +import org.jlab.clara.engine.EngineStatus; +import org.jlab.detector.decode.CLASDecoder; +import org.jlab.io.evio.EvioDataEvent; +import org.jlab.io.hipo.HipoDataEvent; +import org.jlab.jnp.hipo4.data.SchemaFactory; +import org.json.JSONObject; + +/** + * + * @author baltzell + */ +public class DecoderEngine implements Engine { + + static final int POOL_SIZE = 64; + static final Set ED_TYPES = ClaraUtil.buildDataTypes( + Clas12Types.EVIO,Clas12Types.HIPO,EngineDataType.JSON,EngineDataType.STRING); + + SchemaFactory schema; + BlockingQueue pool; + int constantsShared = 64; + + public DecoderEngine() { + schema = new SchemaFactory(); + schema.initFromDirectory(System.getenv("CLAS12DIR") + "/etc/bankdefs/hipo4"); + } + + @Override + public Set getInputDataTypes() { return ED_TYPES; } + @Override + public Set getOutputDataTypes() { return ED_TYPES; } + @Override + public EngineData executeGroup(Set set) { return null; } + @Override + public Set getStates() { return new HashSet<>(); } + @Override + public String getDescription() { return "decoder engine"; } + @Override + public String getVersion() { return "1.0"; } + @Override + public String getAuthor() { return "baltzell"; } + @Override + public void reset() {} + @Override + public void destroy() {} + + @Override + public EngineData configure(EngineData ed) { + JSONObject json = new JSONObject(ed.getData()); + pool = new ArrayBlockingQueue<>(POOL_SIZE); + CLASDecoder d0 = null; + for (int i=0; i Date: Thu, 21 May 2026 10:22:52 -0400 Subject: [PATCH 159/190] feat: cache unix times and write RUN::unix bank (#1278) * cache unix times and write RUN::unix bank * add RUN::unix bankdef --- .../java/org/jlab/io/clara/DecoderWriter.java | 46 ++++++++++++++----- etc/bankdefs/hipo4/header.json | 10 ++++ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java index 127b29c0ab..c380fbaac3 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java @@ -2,6 +2,7 @@ import java.io.File; import java.nio.file.Path; +import java.util.TreeMap; import java.util.TreeSet; import org.jlab.analysis.postprocess.Processor; import org.jlab.clara.std.services.EventWriterException; @@ -38,6 +39,7 @@ public class DecoderWriter extends HipoToHipoWriter { Bank runConfig; Bank helicityAdc; ConstantsManager conman; + TreeMap eventUnix; TreeSet helicities; DaqScalersSequence scalers; SchemaFactory fullSchema; @@ -51,6 +53,7 @@ private void init(JSONObject opts) { helicities = new TreeSet<>(); scalers = new DaqScalersSequence(fullSchema); conman = new ConstantsManager(); + eventUnix = new TreeMap<>(); conman.init("/runcontrol/hwp","/runcontrol/helicity"); postprocess = opts.optBoolean("postprocess", false); if (opts.has("variation")) conman.setVariation(opts.getString("variation")); @@ -73,37 +76,37 @@ protected HipoWriterSorted createWriter(Path file, JSONObject opts) throws Event } } - /** - * In addition to writing the incoming event, copies all tag-1 banks to new - * tag-1 events and writes them, and stores helicity/scaler readings for later. - * @param event - * @throws EventWriterException - */ @Override protected void writeEvent(Object event) throws EventWriterException { scalers.add((Event)event); ((Event)event).read(runConfig); ((Event)event).read(helicityAdc); + if (runConfig.getRows() > 0) { + int unix = runConfig.getInt("unixtime",0); + int evno = runConfig.getInt("event",0); + if (unix > 0 && evno > 0) eventUnix.put(evno, unix); + } helicities.add(HelicityState.createFromFadcBank(helicityAdc, runConfig, conman)); Event t = CLASDecoder4.createTaggedEvent((Event)event, runConfig, tag1banks); if (!t.isEmpty()) writer.addEvent(t, 1); super.writeEvent(event); } - /** - * In addition to closing the writer, creates and writes tag-1 events with - * HEL::flip bnks and clears old scaler/helicity readings. - */ @Override protected void closeWriter() { HelicitySequence.writeFlips(fullSchema, writer, helicities); + writer.addEvent(getUnixEvent(runConfig),1); super.closeWriter(); if (postprocess) postprocess(); // keep the latest helicity/scaler reading for the next file: while (helicities.size() > 60) helicities.pollFirst(); scalers.clear(10); } - + + /** + * Get the first valid run number from a RUN::config bank. + * @return run + */ private int getRunNumber() { Event e = new Event(); HipoReader r = new HipoReader(); @@ -117,6 +120,27 @@ private int getRunNumber() { return 0; } + /** + * Get a new event with a RUN::unix bank containing event-timestamp mapping, + * and the latest RUN::config bank. + * @param config + * @return + */ + private Event getUnixEvent(Bank config) { + Bank unix = new Bank(fullSchema.getSchema("RUN::unix")); + unix.setRows(eventUnix.size()); + int row = 0; + for (int evno : eventUnix.keySet()) { + unix.putInt("event", row, evno); + unix.putInt("unixtime",row, eventUnix.get(evno)); + row++; + } + Event e = new Event(); + e.write(config); + e.write(unix); + return e; + } + /** * Copy helicity/charge tag-1 information to all events. */ diff --git a/etc/bankdefs/hipo4/header.json b/etc/bankdefs/hipo4/header.json index fb7e100b08..d98b3f64d3 100644 --- a/etc/bankdefs/hipo4/header.json +++ b/etc/bankdefs/hipo4/header.json @@ -81,5 +81,15 @@ "entries":[ { "name":"json" , "type":"B", "info":"json character" } ] + }, + { + "name" : "RUN::unix", + "group": 10000, + "item" : 18, + "info" : "Mapping between CODA event number and unix time", + "entries":[ + { "name":"event" , "type":"I", "info":"event number, from RUN::config.event" }, + { "name":"unixtime" , "type":"I", "info":"unix time in seconds, from RUN::config.unixtime" } + ] } ] From db14522b82bf6f400b1b4717aebc051c2e9e23a4 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 21 May 2026 19:08:31 -0400 Subject: [PATCH 160/190] feat: finalize clara io service names (#1279) * rename DecoderWriter->Clas12Writer * parallelize decoder.yaml * fix comments --- .../{DecoderWriter.java => Clas12Writer.java} | 2 +- .../java/org/jlab/io/clara/DecoderReader.java | 2 +- .../{DecoderWriter.yaml => Clas12Writer.yaml} | 4 ++-- etc/services/data-ai-uber.yml | 4 ++-- etc/services/data-aicv-uber.yml | 4 ++-- etc/services/data-cv-uber.yml | 4 ++-- etc/services/decode.yaml | 20 ++++++------------- etc/services/rgd-clarode.yml | 4 ++-- etc/services/rgl-clarode.yml | 4 ++-- 9 files changed, 20 insertions(+), 28 deletions(-) rename common-tools/clara-io/src/main/java/org/jlab/io/clara/{DecoderWriter.java => Clas12Writer.java} (99%) rename common-tools/clara-io/src/main/resources/org/jlab/io/clara/{DecoderWriter.yaml => Clas12Writer.yaml} (74%) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java similarity index 99% rename from common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java rename to common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index c380fbaac3..02fe28979a 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderWriter.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -31,7 +31,7 @@ * * @author baltzell */ -public class DecoderWriter extends HipoToHipoWriter { +public class Clas12Writer extends HipoToHipoWriter { static final String[] TAG1BANKS = {"RUN::scaler","HEL::scaler","RAW::scaler","RAW::epics","HEL::flip","COAT::config"}; diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java index e105739f17..a307e1790c 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java @@ -14,7 +14,7 @@ import org.json.JSONObject; /** - * Combined with DecoderWriter, a port of the standard "decoder" to CLARA. + * Combined with Clas12Writer, a port of the standard "decoder" to CLARA. * * 1. Convert EVIO to HIPO * 2. CCDB translation tables, c/s/c -> s/l/c/o diff --git a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/DecoderWriter.yaml b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Writer.yaml similarity index 74% rename from common-tools/clara-io/src/main/resources/org/jlab/io/clara/DecoderWriter.yaml rename to common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Writer.yaml index f84fed809a..7b54c1bc9a 100644 --- a/common-tools/clara-io/src/main/resources/org/jlab/io/clara/DecoderWriter.yaml +++ b/common-tools/clara-io/src/main/resources/org/jlab/io/clara/Clas12Writer.yaml @@ -1,6 +1,6 @@ --- -name: DecoderWriter -engine: org.jlab.io.clara.DecoderWriter +name: Clas12Writer +engine: org.jlab.io.clara.Clas12Writer type: java author: Nathan Baltzell diff --git a/etc/services/data-ai-uber.yml b/etc/services/data-ai-uber.yml index 7bb7c6ec74..6f15e67723 100644 --- a/etc/services/data-ai-uber.yml +++ b/etc/services/data-ai-uber.yml @@ -17,8 +17,8 @@ io-services: class: org.jlab.io.clara.DecoderReader name: DecoderReader writer: - class: org.jlab.io.clara.DecoderWriter - name: DecoderWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: - class: org.jlab.service.uber.Uber$First name: 1ST diff --git a/etc/services/data-aicv-uber.yml b/etc/services/data-aicv-uber.yml index 186c43d954..08d6d1ac16 100644 --- a/etc/services/data-aicv-uber.yml +++ b/etc/services/data-aicv-uber.yml @@ -17,8 +17,8 @@ io-services: class: org.jlab.io.clara.DecoderReader name: DecoderReader writer: - class: org.jlab.io.clara.DecoderWriter - name: DecoderWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: - class: org.jlab.service.uber.Uber$First name: 1ST diff --git a/etc/services/data-cv-uber.yml b/etc/services/data-cv-uber.yml index 6c7c899dab..538c5837f9 100644 --- a/etc/services/data-cv-uber.yml +++ b/etc/services/data-cv-uber.yml @@ -15,8 +15,8 @@ io-services: class: org.jlab.io.clara.DecoderReader name: DecoderReader writer: - class: org.jlab.io.clara.DecoderWriter - name: DecoderWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: - class: org.jlab.service.uber.Uber$First name: 1ST diff --git a/etc/services/decode.yaml b/etc/services/decode.yaml index 4a0966d2f3..6708387a12 100644 --- a/etc/services/decode.yaml +++ b/etc/services/decode.yaml @@ -1,20 +1,12 @@ io-services: reader: - class: org.jlab.io.clara.DecoderReader - name: DecoderReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.DecoderWriter - name: DecoderWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: - # FIXME: replace with dummy/useful service - - class: org.jlab.service.eb.EBTBEngine - name: EBTB -configuration: - io-services: - reader: - variation: default - timestamp: 05/11/2025-00:00:00 - writer: - schema_dir: full + - class: org.jlab.clas.reco.DecoderEngine + name: DECO mime-types: - binary/data-hipo diff --git a/etc/services/rgd-clarode.yml b/etc/services/rgd-clarode.yml index e00a0b0395..5d63253fd8 100644 --- a/etc/services/rgd-clarode.yml +++ b/etc/services/rgd-clarode.yml @@ -22,8 +22,8 @@ io-services: class: org.jlab.io.clara.EvioToEvioReader name: EvioReader writer: - class: org.jlab.io.clara.DecoderWriter - name: DecoderWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: - class: org.jlab.clas.reco.DecoderEngine name: DECO diff --git a/etc/services/rgl-clarode.yml b/etc/services/rgl-clarode.yml index b6b417c4da..762f68d804 100644 --- a/etc/services/rgl-clarode.yml +++ b/etc/services/rgl-clarode.yml @@ -3,8 +3,8 @@ io-services: class: org.jlab.io.clara.Clas12Reader name: Clas12Reader writer: - class: org.jlab.io.clara.DecoderWriter - name: DecoderWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS From 7e6afba786d826bd7d39f1cbc85455aa254e43bd Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 22 May 2026 11:56:54 -0400 Subject: [PATCH 161/190] cleanup printout (#1282) --- .../src/main/java/org/jlab/utils/options/OptionParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java index 9b6f34f68d..1bdb2c5222 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionParser.java @@ -111,7 +111,7 @@ public String getUsageString(){ StringBuilder str = new StringBuilder(); - str.append(" Usage : ").append(program).append(" "); + str.append("\n Usage : ").append(program).append(" "); for(Map.Entry entry : this.requiredOptions.entrySet()){ str.append(entry.getKey()).append(" ["). append(entry.getValue().getDescription()).append("] "); From 1414776a362b2bb0ad51413983f221573d3891d9 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 22 May 2026 20:14:19 -0400 Subject: [PATCH 162/190] remove postprocessing engine (#1284) --- reconstruction/pom.xml | 1 - reconstruction/postproc/pom.xml | 38 ------------ .../jlab/service/postproc/PostprocEngine.java | 58 ------------------- 3 files changed, 97 deletions(-) delete mode 100644 reconstruction/postproc/pom.xml delete mode 100644 reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 25099bd6b9..5b555fcac9 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -36,7 +36,6 @@ urwt alert bg - postproc recoil calib uber diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml deleted file mode 100644 index b748059b77..0000000000 --- a/reconstruction/postproc/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - - org.jlab.clas12.detector - clas12detector-postproc - 14.0.0-SNAPSHOT - jar - - - org.jlab.clas12 - reconstruction - 14.0.0-SNAPSHOT - - - - - - org.jlab.clas - clas-io - 14.0.0-SNAPSHOT - - - - org.jlab.clas - clas-reco - 14.0.0-SNAPSHOT - - - - org.jlab.clas - clas-analysis - 14.0.0-SNAPSHOT - - - - - diff --git a/reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java b/reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java deleted file mode 100644 index 0aa6145e85..0000000000 --- a/reconstruction/postproc/src/main/java/org/jlab/service/postproc/PostprocEngine.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.jlab.service.postproc; - -import java.io.File; -import java.util.logging.Logger; -import org.jlab.analysis.postprocess.Processor; -import org.jlab.clas.reco.ReconstructionEngine; -import org.jlab.io.base.DataEvent; - -/** - * Post-processing as an engine. - * @author baltzell - */ -public class PostprocEngine extends ReconstructionEngine { - - public static final String CONF_PRELOAD_FILE = "preloadFile"; - public static final String CONF_PRELOAD_DIR = "preloadDir"; - public static final String CONF_PRELOAD_GLOB = "preloadGlob"; - public static final String CONF_RESTREAM_HELICITY = "restream"; - public static final String CONF_REBUILD_SCALERS = "rebuild"; - - static final Logger logger = Logger.getLogger(PostprocEngine.class.getName()); - - Processor processor = null; - - public PostprocEngine() { - super("PP", "baltzell", "1.0"); - } - - @Override - public boolean init() { - requireConstants(Processor.CCDB_TABLES); - if (getEngineConfigString(CONF_PRELOAD_FILE) != null) { - if (getEngineConfigString(CONF_PRELOAD_DIR) != null) - logger.warning("PostprocEngine:: Ignoring preloadDir, using preloadFile."); - processor = new Processor(new File(getEngineConfigString(CONF_PRELOAD_FILE)), - Boolean.parseBoolean(getEngineConfigString(CONF_RESTREAM_HELICITY,"false")), - Boolean.parseBoolean(getEngineConfigString(CONF_REBUILD_SCALERS,"false"))); - } - else if (getEngineConfigString(CONF_PRELOAD_DIR) != null) { - processor = new Processor( - getEngineConfigString(CONF_PRELOAD_DIR), - getEngineConfigString(CONF_PRELOAD_GLOB, Processor.DEF_PRELOAD_GLOB), - Boolean.parseBoolean(getEngineConfigString(CONF_RESTREAM_HELICITY,"false")), - Boolean.parseBoolean(getEngineConfigString(CONF_REBUILD_SCALERS,"false"))); - } - return true; - } - - @Override - public void detectorChanged(int run) {} - - @Override - public boolean processDataEventUser(DataEvent event) { - processor.processEvent(event); - return true; - } - -} From 6c2861a8bf018573d8cf11ea2098b7e3746c4791 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 22 May 2026 20:26:10 -0400 Subject: [PATCH 163/190] feat: cleanup io classes in yamls (#1280) * unify io classes * add DecoderEngine to all yamls * fix comments * fix name --- .../src/main/java/org/jlab/io/clara/Clas12Reader.java | 2 +- .../src/main/java/org/jlab/io/clara/Clas12Writer.java | 11 +++++------ .../main/java/org/jlab/io/clara/DecoderReader.java | 6 +----- etc/services/data-ai-2026.yaml | 10 ++++++---- etc/services/data-ai-uber.yml | 6 ++++-- etc/services/data-ai.yaml | 10 ++++++---- etc/services/data-aicv-uber.yml | 6 ++++-- etc/services/data-aicv.yaml | 10 ++++++---- etc/services/data-cv-uber.yml | 6 ++++-- etc/services/data-cv.yaml | 10 ++++++---- etc/services/dcalign.yaml | 10 ++++++---- etc/services/denoise.yaml | 10 ++++++---- etc/services/eb.yaml | 10 ++++++---- etc/services/kpp.yaml | 10 ++++++---- etc/services/rgd-clarode.yml | 4 ++-- etc/services/rgl-clarode.yml | 2 ++ 16 files changed, 71 insertions(+), 52 deletions(-) diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java index e4cf0b7625..245c60b718 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Reader.java @@ -12,7 +12,7 @@ import org.json.JSONObject; /** - * Just reads EVIO or HIPO, and passes it along. + * Just reads EVIO or HIPO and passes it along. * * @author baltzell */ diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index 02fe28979a..6a36e60488 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -21,13 +21,12 @@ import org.json.JSONObject; /** - * Combined with DecoderReader, a port of the standard "decoder" to CLARA. - * + * * 1. Copies certain banks on-the-fly to new tag-1 events - * 2. Caches helicity states and scaler readouts, for later use in post-processing - * 3. Writes the helicity sequence to HEL::flip banks in new tag-1 events - * 4. Adds .hipo to the output filename, if necessary - * 5. Runs post-processing, writing tag-1 information to all events + * 2. Caches helicity states, scaler readouts, and unix time + * 3. Writes HEL::flip, RUN/HEL::scaler, and RUN::unix to new tag-1 events + * 4. Runs post-processing, writing tag-1 information to all events + * 5. Adds .hipo to the output filename, if necessary * * @author baltzell */ diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java index a307e1790c..da7a334bf4 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/DecoderReader.java @@ -14,11 +14,7 @@ import org.json.JSONObject; /** - * Combined with Clas12Writer, a port of the standard "decoder" to CLARA. - * - * 1. Convert EVIO to HIPO - * 2. CCDB translation tables, c/s/c -> s/l/c/o - * 3. Pulse extraction, e.g., Mode-1 FADC250 + * The CLAS decoder. Requires EVIO input. * * @author baltzell */ diff --git a/etc/services/data-ai-2026.yaml b/etc/services/data-ai-2026.yaml index 2b1bf55a40..80fccf0326 100644 --- a/etc/services/data-ai-2026.yaml +++ b/etc/services/data-ai-2026.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine diff --git a/etc/services/data-ai-uber.yml b/etc/services/data-ai-uber.yml index 6f15e67723..5a173f9c37 100644 --- a/etc/services/data-ai-uber.yml +++ b/etc/services/data-ai-uber.yml @@ -14,12 +14,14 @@ configuration: run: "19000" io-services: reader: - class: org.jlab.io.clara.DecoderReader - name: DecoderReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: class: org.jlab.io.clara.Clas12Writer name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.service.uber.Uber$First name: 1ST - class: org.jlab.service.uber.Uber$ForwardTagger diff --git a/etc/services/data-ai.yaml b/etc/services/data-ai.yaml index a2c827da14..38c26c7e42 100644 --- a/etc/services/data-ai.yaml +++ b/etc/services/data-ai.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine diff --git a/etc/services/data-aicv-uber.yml b/etc/services/data-aicv-uber.yml index 08d6d1ac16..d5ba19d256 100644 --- a/etc/services/data-aicv-uber.yml +++ b/etc/services/data-aicv-uber.yml @@ -14,12 +14,14 @@ configuration: run: "19000" io-services: reader: - class: org.jlab.io.clara.DecoderReader - name: DecoderReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: class: org.jlab.io.clara.Clas12Writer name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.service.uber.Uber$First name: 1ST - class: org.jlab.service.uber.Uber$ForwardTagger diff --git a/etc/services/data-aicv.yaml b/etc/services/data-aicv.yaml index a1851e0a74..7e62bcc414 100644 --- a/etc/services/data-aicv.yaml +++ b/etc/services/data-aicv.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine diff --git a/etc/services/data-cv-uber.yml b/etc/services/data-cv-uber.yml index 538c5837f9..bcdcc52715 100644 --- a/etc/services/data-cv-uber.yml +++ b/etc/services/data-cv-uber.yml @@ -12,12 +12,14 @@ configuration: run: "19000" io-services: reader: - class: org.jlab.io.clara.DecoderReader - name: DecoderReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: class: org.jlab.io.clara.Clas12Writer name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.service.uber.Uber$First name: 1ST - class: org.jlab.service.uber.Uber$ForwardTagger diff --git a/etc/services/data-cv.yaml b/etc/services/data-cv.yaml index 050fcb3279..51c9e17b1d 100644 --- a/etc/services/data-cv.yaml +++ b/etc/services/data-cv.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine diff --git a/etc/services/dcalign.yaml b/etc/services/dcalign.yaml index 3f2699a6a1..1a99135ec4 100644 --- a/etc/services/dcalign.yaml +++ b/etc/services/dcalign.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine diff --git a/etc/services/denoise.yaml b/etc/services/denoise.yaml index c06a7b902c..46a0cca21d 100644 --- a/etc/services/denoise.yaml +++ b/etc/services/denoise.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine diff --git a/etc/services/eb.yaml b/etc/services/eb.yaml index 047e66a291..76109a39e6 100644 --- a/etc/services/eb.yaml +++ b/etc/services/eb.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.service.eb.EBTBEngine name: EBTB configuration: diff --git a/etc/services/kpp.yaml b/etc/services/kpp.yaml index d56b4f905f..f0a37eac5f 100644 --- a/etc/services/kpp.yaml +++ b/etc/services/kpp.yaml @@ -1,11 +1,13 @@ io-services: reader: - class: org.jlab.io.clara.HipoToHipoReader - name: HipoToHipoReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: - class: org.jlab.io.clara.HipoToHipoWriter - name: HipoToHipoWriter + class: org.jlab.io.clara.Clas12Writer + name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine diff --git a/etc/services/rgd-clarode.yml b/etc/services/rgd-clarode.yml index 5d63253fd8..e46daddc7e 100644 --- a/etc/services/rgd-clarode.yml +++ b/etc/services/rgd-clarode.yml @@ -19,8 +19,8 @@ configuration: outputBankPrefix: "HB" io-services: reader: - class: org.jlab.io.clara.EvioToEvioReader - name: EvioReader + class: org.jlab.io.clara.Clas12Reader + name: Clas12Reader writer: class: org.jlab.io.clara.Clas12Writer name: Clas12Writer diff --git a/etc/services/rgl-clarode.yml b/etc/services/rgl-clarode.yml index 762f68d804..9c92b0a1d2 100644 --- a/etc/services/rgl-clarode.yml +++ b/etc/services/rgl-clarode.yml @@ -6,6 +6,8 @@ io-services: class: org.jlab.io.clara.Clas12Writer name: Clas12Writer services: + - class: org.jlab.clas.reco.DecoderEngine + name: DECO - class: org.jlab.clas.swimtools.MagFieldsEngine name: MAGFIELDS - class: org.jlab.rec.ft.cal.FTCALEngine From a362ed71a7aacd58dfd4558599f0fe4fe2f80480 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 22 May 2026 20:33:25 -0400 Subject: [PATCH 164/190] support null defaults (#1285) --- .../src/main/java/org/jlab/utils/options/OptionValue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java index 5ffcac4963..684dba4aa7 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/options/OptionValue.java @@ -55,6 +55,6 @@ public boolean parse(List arguments){ } public boolean isDefault() { - return this.optionValue.equals(this.optionDefault); + return this.optionValue==null || this.optionValue.equals(this.optionDefault); } } From 249e26fcc7fd72f907a2aa050712c1c3515259c6 Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Fri, 22 May 2026 20:42:16 -0400 Subject: [PATCH 165/190] adding hit-track matching info to RICH::calib (#1286) * adding hit-track matchinng info * fixed type in reading/writing from/to the bank * fixed type in reading/writing from/to the bank --- etc/bankdefs/hipo4/rich.json | 2 ++ .../jlab/calibration/detectors/RICHBankBuilder.java | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/etc/bankdefs/hipo4/rich.json b/etc/bankdefs/hipo4/rich.json index 8b5a57415d..57f16c6002 100644 --- a/etc/bankdefs/hipo4/rich.json +++ b/etc/bankdefs/hipo4/rich.json @@ -238,6 +238,8 @@ {"name":"time", "type":"F", "info":"Hit time" }, {"name":"rawtime", "type":"F", "info":"Hit rawtime" }, {"name":"duration", "type":"S", "info":"Hit duration" }, + {"name":"mchi2", "type":"F", "info":"Track-cluster matching chi2 (if any)"}, + {"name":"msize", "type":"S", "info":"Cluster size"}, {"name":"status", "type":"S", "info":"Hit status" }, {"name":"used", "type":"B", "info":"eligible for PID in time (1=yes, 0=no) angle (10=yes, 0=no) hypo (100=by other) or cluster (2)"}, {"name":"emilay", "type":"B", "info":"aerogel layer of photon emission"}, diff --git a/reconstruction/calib/src/main/java/org/jlab/calibration/detectors/RICHBankBuilder.java b/reconstruction/calib/src/main/java/org/jlab/calibration/detectors/RICHBankBuilder.java index 5f52852a1f..4309ff89ef 100644 --- a/reconstruction/calib/src/main/java/org/jlab/calibration/detectors/RICHBankBuilder.java +++ b/reconstruction/calib/src/main/java/org/jlab/calibration/detectors/RICHBankBuilder.java @@ -35,6 +35,7 @@ public DataBank buildCalibBank(DataEvent event) { DataBank part = event.getBank("REC::Particle"); DataBank rich = event.getBank("RICH::Particle"); DataBank hits = event.getBank("RICH::Hit"); + DataBank clus = event.getBank("RICH::Cluster"); DataBank phos = event.getBank("RICH::Photon"); List goodPhotons = new ArrayList<>(); @@ -45,9 +46,12 @@ public DataBank buildCalibBank(DataEvent event) { } Map part2Rich = new HashMap<>(); + Map clus2Rich = new HashMap<>(); for(int i=0; i goodClusters = new ArrayList<>(); @@ -99,6 +103,7 @@ public DataBank buildCalibBank(DataEvent event) { row++; } for(int i : goodClusters) { + int cluster = hits.getShort("cluster", i); calib.setShort("hindex", row, (short) i); calib.setByte( "sector", row, (byte) hits.getShort("sector", i)); calib.setShort("pmt", row, hits.getShort("pmt", i)); @@ -111,6 +116,14 @@ public DataBank buildCalibBank(DataEvent event) { calib.setFloat("time", row, hits.getFloat("time", i)); calib.setFloat("rawtime", row, hits.getFloat("rawtime", i)); calib.setShort("duration", row, hits.getShort("duration", i)); + if(clus2Rich.containsKey(cluster-1)) { + int rindex = clus2Rich.get(cluster-1); + calib.setByte("pindex", row, rich.getByte("pindex", rindex)); + calib.setFloat("mchi2", row, rich.getFloat("mchi2", rindex)); + calib.setShort("msize", row, clus.getShort("size", cluster-1)); + } + else + calib.setByte("pindex", row, (byte) -1); row++; } return calib; From 115013edde880cd38c0b7fc427f9c085e74ef295 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 May 2026 09:59:12 -0400 Subject: [PATCH 166/190] build(deps): bump org.apache.maven.plugins:maven-clean-plugin (#1291) Bumps [org.apache.maven.plugins:maven-clean-plugin](https://github.com/apache/maven-clean-plugin) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-clean-plugin/releases) - [Commits](https://github.com/apache/maven-clean-plugin/compare/maven-clean-plugin-3.4.0...maven-clean-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-clean-plugin dependency-version: 3.5.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- common-tools/clas-io/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index d2bd579eaa..714c8ed86d 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -81,7 +81,7 @@ maven-clean-plugin - 3.4.0 + 3.5.0 From 0bd97b6910ebc29705fd4137d417defc830d0426 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 May 2026 14:09:12 +0000 Subject: [PATCH 167/190] build(deps): bump org.json:json from 20251224 to 20260522 (#1290) Bumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20251224 to 20260522. - [Release notes](https://github.com/douglascrockford/JSON-java/releases) - [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md) - [Commits](https://github.com/douglascrockford/JSON-java/compare/20251224...20260522) --- updated-dependencies: - dependency-name: org.json:json dependency-version: '20260522' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0e3c7e919e..cd94e64e5d 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,7 @@ org.json json - 20251224 + 20260522 From 285a8eff7e495e27c6088628606613a4547b3c06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 May 2026 14:19:07 +0000 Subject: [PATCH 168/190] build(deps): bump org.apache.maven.plugins:maven-antrun-plugin (#1289) Bumps [org.apache.maven.plugins:maven-antrun-plugin](https://github.com/apache/maven-antrun-plugin) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/apache/maven-antrun-plugin/releases) - [Commits](https://github.com/apache/maven-antrun-plugin/compare/maven-antrun-plugin-3.1.0...maven-antrun-plugin-3.2.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-antrun-plugin dependency-version: 3.2.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- common-tools/clas-io/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 714c8ed86d..4b16ccf748 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -60,7 +60,7 @@ org.apache.maven.plugins maven-antrun-plugin - 3.1.0 + 3.2.0 bank-schema-enums From 0c709fa1c045c76d084e7ed65cee92179b460627 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 26 May 2026 13:57:48 -0400 Subject: [PATCH 169/190] feat: little DC ClusterCleanupUtilities initialization cleanup, optimization (#1288) * make local variable final for clarity * cleanup initialization * reduce calculations --- .../dc/cluster/ClusterCleanerUtilities.java | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index b93809da55..e82f9a1414 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -74,34 +74,29 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI /// determined. /// This is a preliminary pattern recognition method used to identify /// reconstructed hits belonging to the same track-segment. - int N_t = 180; + final int N_t = 180; // From this calculate the bin size in the theta accumulator array - double ThetaMin = 0.; - double ThetaMax = 2. * Math.PI; - double SizeThetaBin = (ThetaMax - ThetaMin) / ((double) N_t); + final double ThetaMin = 0.; + final double ThetaMax = 2. * Math.PI; + final double SizeThetaBin = (ThetaMax - ThetaMin) / ((double) N_t); // Define the dimension of the r accumulator array - int N_r = 130; + final int N_r = 130; // From this calculate the bin size in the theta accumulator array - double RMin = -130; - double RMax = 130; + final double RMin = -130; + final double RMax = 130; + final double dR = RMax - RMin; - int[][] R_Phi_Accumul; - R_Phi_Accumul = new int[N_r][N_t]; + int[][] R_Phi_Accumul = new int[N_r][N_t]; // cache the cos and sin theta values [for performance improvement] - double[] cosTheta_RPhi_array; - double[] sinTheta_RPhi_array; + double[] cosTheta_RPhi_array = new double[N_t]; + double[] sinTheta_RPhi_array = new double[N_t]; // the values corresponding to the peaks in the array - double[] binrMaxR_Phi; - double[] bintMaxR_Phi; - binrMaxR_Phi = new double[N_r * N_t]; - bintMaxR_Phi = new double[N_r * N_t]; - - cosTheta_RPhi_array = new double[N_t]; - sinTheta_RPhi_array = new double[N_t]; + double[] binrMaxR_Phi = new double[N_r * N_t]; + double[] bintMaxR_Phi = new double[N_r * N_t]; for (int j_t = 0; j_t < N_t; j_t++) { // theta_j in the middle of the bin : @@ -123,7 +118,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI // r_j corresponding to that theta_j: double r_j = rho * cosTheta_RPhi_array[j_t] + phi * sinTheta_RPhi_array[j_t]; // this value of r_j falls into the following bin in the r array: - int j_r = (int) Math.floor(N_r * (r_j - RMin) / (float) (RMax - RMin)); + int j_r = (int) Math.floor(N_r * (r_j - RMin) / dR); // increase this accumulator cell: R_Phi_Accumul[j_r][j_t]++; @@ -177,7 +172,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI // r_j corresponding to that theta_j: double r_j = rho * cosTheta_RPhi_array[j_t] + phi * sinTheta_RPhi_array[j_t]; // this value of r_j falls into the following bin in the r array: - int j_r = (int) Math.floor(N_r * (r_j - RMin) / (float) (RMax - RMin)); + int j_r = (int) Math.floor(N_r * (r_j - RMin) / dR); // match bins: if (j_r == binrMaxR_Phi[p] && j_t == bintMaxR_Phi[p]) { From 2ea8db38bd9161341244993e6aa1977f0113d663 Mon Sep 17 00:00:00 2001 From: Mathieu Ouillon <67646911+mathieuouillon@users.noreply.github.com> Date: Tue, 26 May 2026 14:10:16 -0400 Subject: [PATCH 170/190] refactor(alert): move AHDC track-finding from AHDCEngine to ALERTEngine (#1242) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(alert): move AHDC track-finding from AHDCEngine to ALERTEngine AHDCEngine now only reads AHDC::adc, applies calibration via HitReader, and writes AHDC::hits. The full track-finding pipeline (preclustering, AI/CV_Distance/CV_Hough finder, DOCA refinement, helix fit) runs in ALERTEngine on top of AHDC::hits + ATOF::hits/clusters, alongside the existing projection / matching / prePID / Kalman steps. The track finder is selected via the ALERT.Mode YAML key (was AHDC.Mode); ModelTrackFinding only loads when AI_Track_Finding is selected. The ATOF::tdc gate now fires after the AHDC pipeline so events without ATOF still get their AHDC::* banks, matching the pre-refactor behavior. * refactor(ahdc): unify track finders behind a TrackFinder strategy interface Introduce TrackFinder { findTracks(hits) -> TrackFinderResult } with three implementations — AITrackFinder, DistanceTrackFinder, HoughTrackFinder — each owning its own preclustering, cluster building, and mode-specific logic. AITrackFinder owns ModelTrackFinding, the MAX_HITS_FOR_AI Distance fallback, and the greedy non-overlap selection; the "too many candidates" exit becomes TrackFinderResult.invalid() instead of a return-false from processDataEvent. ALERTEngine becomes a thin dispatcher: init() picks the strategy from ALERT.Mode via a switch, and processDataEvent calls findTracks(hits) once. Output is byte-identical to the prior refactor (same 9/999 sum_adc/dEdx precision drift, no new mismatches). * test(ahdc): AHDCTest should test hits-only AHDCEngine * feat(track-finding): add GNN track finder Introduce GNN_Track_Finding as a fourth track-finding mode alongside the renamed MLP_Track_Finding (was AI_Track_Finding), CV_Distance, and CV_Hough. The new path runs a GravNet edge scorer (TorchScript via DJL) on a per-event AHDC + ATOF hit graph, extracts tracks as connected components on edges with sigmoid score >= 0.1, then re-preclusters each surviving track's AHDC hits and pairs them into per-superlayer Clusters so the existing DOCA refinement + helix fit + Kalman stages consume them unchanged. Selected via ALERT.Mode in YAML. MLP regression is bit-identical (same pre-existing AHDC::track sum_adc/ dEdx precision drift); only COAT::config changes, reflecting the renamed mode. * fix(alert): unify DatabaseConstantProvider usage and improve track matching prediction handling * refactor(alert): split Track into TrackCandidate (finder output) and Track (fit result) The AHDC track finders produced org.jlab.rec.ahdc.Track.Track, and the helix fit + Kalman filter then mutated that same object in place. One class was doing two jobs: a track-finder output (hits + clusters) and a fit result (vertex, momentum, chi2). A "Track" should mean the result of track fitting. Split the conflated class into two: - TrackCandidate: the track-finder output. Owns hits, clusters, and interclusters. Carries a CandidateType (AHDC_ONLY / AHDC_ATOF, plus a reserved AHDC_VERTEX) describing its specialization; the type is what will dictate how the candidate is fitted. The two old Track constructors (from Clusters, from Hits) move here. - Track: the fit result, produced by fitting a TrackCandidate. Composes the candidate it was fitted from and adds the fitted vertex, momentum, chi2, path, dEdx, p_drift, sum_residuals. It stays a full facade: every accessor the old Track exposed still works, and the candidate-side ones are delegated to the underlying TrackCandidate. All four finders (MLP / Distance / Hough / GNN) plus Distance and HoughTransform now produce TrackCandidate; TrackFinderResult wraps List. ALERTEngine's fit stage turns each candidate into a Track, with a switch (CandidateType) dispatch seam. * refactor(alert): rename AHDC Cluster/ClusterFinder -> AHDCCluster/AHDCClusterFinder * refactor(alert): rename enum ModeTrackFinding -> TrackFindingMode * refactor(alert): rename MLP_Track_Finding/GNN_Track_Finding -> AI_MLP/AI_GNN, document modes * docs(alert): document ALERTEngine YAML config, default Mode to AI_GNN Add a YAML-config section to the ALERTEngine class javadoc listing every key the engine reads (currently just Mode) together with the valid values of TrackFindingMode. Flip the default track-finding mode from AI_MLP to AI_GNN: GNN is now the default. * refactor(alert): pass ATOF hits to TrackFinder as List, not DataBank ove bank I/O to the ALERTEngine boundary: - TrackFinder.findTracks now takes List. The interface speaks pure domain types; the ATOF-blind finders simply ignore it. - GNNPrediction / GNNGraphBuilder accept the list directly and iterate it instead of reading from the bank. Verified byte-identical end-to-end: recon_output on clas_021903.evio.00000 (config_p0v9.local.yaml, AI_MLP, 1000 events) is unchanged vs development AHDC::track has the same pre-existing 9/999 sum_adc/dEdx precision drift * refactor(alert): move ALERT-level track finding from rec.ahdc to rec.alert The TrackFinding strategy, the Track/TrackCandidate value types, and the AI/* models live in rec.ahdc today, but they are ALERT-level orchestration across AHDC and ATOF (GNN literally builds a joint AHDC+ATOF graph). They belong in rec.alert.* alongside the existing rec.alert.TrackMatchingAI, rec.alert.AIPID, rec.alert.banks, rec.alert.projections. * docs(alert): update documentation for DJL usage in ModelTrackFindingGNN * docs(alert): add source reference for SeedExtendTrackExtractor --- .../AHDCCluster.java} | 41 ++- .../AHDCClusterFinder.java} | 20 +- .../jlab/rec/ahdc/Banks/RecoBankWriter.java | 10 +- .../org/jlab/rec/ahdc/Distance/Distance.java | 100 +++--- .../ahdc/DocaCluster/DocaClusterRefiner.java | 22 +- .../ahdc/HoughTransform/HoughTransform.java | 44 +-- .../rec/ahdc/KalmanFilter/KalmanFilter.java | 2 +- .../org/jlab/rec/ahdc/ModeTrackFinding.java | 7 - .../org/jlab/rec/ahdc/TrackFindingMode.java | 29 ++ .../rec/{ahdc => alert}/AI/AIPrediction.java | 2 +- .../org/jlab/rec/alert/AI/GNNConstants.java | 42 +++ .../jlab/rec/alert/AI/GNNGraphBuilder.java | 218 ++++++++++++ .../org/jlab/rec/alert/AI/GNNPrediction.java | 129 ++++++++ .../rec/{ahdc => alert}/AI/InterCluster.java | 2 +- .../{ahdc => alert}/AI/ModelTrackFinding.java | 2 +- .../rec/alert/AI/ModelTrackFindingGNN.java | 107 ++++++ .../rec/{ahdc => alert}/AI/PreClustering.java | 2 +- .../alert/AI/SeedExtendTrackExtractor.java | 65 ++++ .../AI/TrackCandidatesGenerator.java | 2 +- .../{ahdc => alert}/AI/TrackPrediction.java | 16 +- .../org/jlab/rec/alert/Track/AtofHitStub.java | 35 ++ .../jlab/rec/alert/Track/CandidateType.java | 19 ++ .../java/org/jlab/rec/alert/Track/Track.java | 143 ++++++++ .../Track/TrackCandidate.java} | 137 +++----- .../rec/alert/TrackFinding/AITrackFinder.java | 95 ++++++ .../TrackFinding/DistanceTrackFinder.java | 33 ++ .../alert/TrackFinding/GNNTrackFinder.java | 48 +++ .../alert/TrackFinding/HoughTrackFinder.java | 33 ++ .../rec/alert/TrackFinding/TrackFinder.java | 17 + .../alert/TrackFinding/TrackFinderResult.java | 33 ++ .../TrackMatchingAI/ModelTrackMatching.java | 2 +- .../org/jlab/service/ahdc/AHDCEngine.java | 203 +----------- .../org/jlab/service/alert/ALERTEngine.java | 309 +++++++++++++++--- .../java/org/jlab/service/alert/AHDCTest.java | 4 +- 34 files changed, 1506 insertions(+), 467 deletions(-) rename reconstruction/alert/src/main/java/org/jlab/rec/ahdc/{Cluster/Cluster.java => AHDCCluster/AHDCCluster.java} (72%) rename reconstruction/alert/src/main/java/org/jlab/rec/ahdc/{Cluster/ClusterFinder.java => AHDCCluster/AHDCClusterFinder.java} (86%) delete mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/ModeTrackFinding.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/TrackFindingMode.java rename reconstruction/alert/src/main/java/org/jlab/rec/{ahdc => alert}/AI/AIPrediction.java (97%) create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNConstants.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNGraphBuilder.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNPrediction.java rename reconstruction/alert/src/main/java/org/jlab/rec/{ahdc => alert}/AI/InterCluster.java (97%) rename reconstruction/alert/src/main/java/org/jlab/rec/{ahdc => alert}/AI/ModelTrackFinding.java (99%) create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/ModelTrackFindingGNN.java rename reconstruction/alert/src/main/java/org/jlab/rec/{ahdc => alert}/AI/PreClustering.java (97%) create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/SeedExtendTrackExtractor.java rename reconstruction/alert/src/main/java/org/jlab/rec/{ahdc => alert}/AI/TrackCandidatesGenerator.java (99%) rename reconstruction/alert/src/main/java/org/jlab/rec/{ahdc => alert}/AI/TrackPrediction.java (80%) create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/AtofHitStub.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/CandidateType.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java rename reconstruction/alert/src/main/java/org/jlab/rec/{ahdc/Track/Track.java => alert/Track/TrackCandidate.java} (53%) create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/AITrackFinder.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/DistanceTrackFinder.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/GNNTrackFinder.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/HoughTrackFinder.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinder.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinderResult.java diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AHDCCluster/AHDCCluster.java similarity index 72% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java rename to reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AHDCCluster/AHDCCluster.java index f0df2e98da..26f5a016fa 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AHDCCluster/AHDCCluster.java @@ -1,4 +1,4 @@ -package org.jlab.rec.ahdc.Cluster; +package org.jlab.rec.ahdc.AHDCCluster; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; @@ -9,9 +9,9 @@ import org.jlab.geom.prim.Point3D; /** - * Cluster are compose by 2 PreCluster on layer with a different stereo angle + * AHDCCluster are compose by 2 PreCluster on layer with a different stereo angle */ -public class Cluster { +public class AHDCCluster { private int _trackId = -1; private double _Radius; @@ -50,7 +50,7 @@ private static double stereoTwistFromLine(Line3D line) { return wrapPi(phi1 - phi0); } - public Cluster(PreCluster precluster, PreCluster other_precluster) { + public AHDCCluster(PreCluster precluster, PreCluster other_precluster) { this._PreClusters_list = new ArrayList<>(); _PreClusters_list.add(precluster); _PreClusters_list.add(other_precluster); @@ -80,15 +80,44 @@ public Cluster(PreCluster precluster, PreCluster other_precluster) { this._V = this._Y / (this._X * this._X + this._Y * this._Y); } - public Cluster(double X, double Y, double Z) { + public AHDCCluster(double X, double Y, double Z) { this._X = X; this._Y = Y; this._Z = Z; } + /** Build an AHDCCluster from a single PreCluster (one layer of a superlayer). + * Used by the GNN path when a track covers a superlayer on only one + * stereo layer — no stereo pair is available, so Z is taken from the + * average wire-midpoint z of the PreCluster's hits rather than from a + * stereo-angle computation. DocaClusterRefiner falls back to a degenerate + * DocaCluster when {@code get_PreClusters_list().size() != 2}, so + * downstream is unaffected. */ + public AHDCCluster(PreCluster precluster) { + this._PreClusters_list = new ArrayList<>(); + _PreClusters_list.add(precluster); + this._Radius = precluster.get_Radius(); + this._Phi = precluster.get_Phi(); + this._X = precluster.get_X(); + this._Y = precluster.get_Y(); + this._Num_wire = (int) precluster.get_Num_wire(); + double r2 = this._X * this._X + this._Y * this._Y; + if (r2 > 0.0) { + this._U = this._X / r2; + this._V = this._Y / r2; + } + double zSum = 0.0; + int zCount = 0; + for (Hit h : precluster.get_hits_list()) { + Line3D line = h.getLine(); + if (line != null) { zSum += line.midpoint().z(); zCount++; } + } + this._Z = (zCount > 0) ? zSum / zCount : 0.0; + } + @Override public String toString() { - return "Cluster{" + "_X=" + _X + ", _Y=" + _Y + ", _Z=" + _Z + '}'; + return "AHDCCluster{" + "_X=" + _X + ", _Y=" + _Y + ", _Z=" + _Z + '}'; } public ArrayList get_PreClusters_list() { diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/ClusterFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AHDCCluster/AHDCClusterFinder.java similarity index 86% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/ClusterFinder.java rename to reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AHDCCluster/AHDCClusterFinder.java index 87a4446b1c..36f85cae84 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/ClusterFinder.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AHDCCluster/AHDCClusterFinder.java @@ -1,21 +1,21 @@ -package org.jlab.rec.ahdc.Cluster; +package org.jlab.rec.ahdc.AHDCCluster; import org.jlab.rec.ahdc.PreCluster.PreCluster; import java.util.ArrayList; import java.util.List; -/** ClusterFinder +/** AHDCClusterFinder * * \todo description of what it does and how it works * */ -public class ClusterFinder { +public class AHDCClusterFinder { - private final ArrayList _AHDCClusters = new ArrayList<>(); - private final ArrayList _list_with_maybe_same_cluster = new ArrayList<>(); + private final ArrayList _AHDCClusters = new ArrayList<>(); + private final ArrayList _list_with_maybe_same_cluster = new ArrayList<>(); - public ClusterFinder() {} + public AHDCClusterFinder() {} private void find_associate_cluster(PreCluster precluster, List AHDC_precluster_list, int window, int minimal_distance, int super_layer, int layer, int associate_super_layer) { //System.out.println(" precluster superlayer " + precluster.get_Super_layer() + " ref superlayer " + super_layer + " layer " + precluster.get_Layer() + " ref " + layer); @@ -52,7 +52,7 @@ private void find_associate_cluster(PreCluster precluster, List AHDC if (best_precluster != null) { precluster.set_Used(true); best_precluster.set_Used(true); - Cluster new_Cluster = new Cluster(precluster, best_precluster); + AHDCCluster new_Cluster = new AHDCCluster(precluster, best_precluster); _list_with_maybe_same_cluster.add(new_Cluster); } } @@ -81,18 +81,18 @@ public void findCluster(List AHDC_precluster_list) { find_associate_cluster(precluster, AHDC_precluster_list, window, minimal_distance, 4, 2, 5); } - for (Cluster cluster : _list_with_maybe_same_cluster) { + for (AHDCCluster cluster : _list_with_maybe_same_cluster) { if (!containsCluster(_AHDCClusters, cluster.get_Phi(), cluster.get_Radius())) { _AHDCClusters.add(cluster); } } } - public boolean containsCluster(final List list, double phi, double radius) { + public boolean containsCluster(final List list, double phi, double radius) { return list.stream().anyMatch(o -> o.get_Radius() == (radius) && o.get_Phi() == phi); } - public ArrayList get_AHDCClusters() { + public ArrayList get_AHDCClusters() { return _AHDCClusters; } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java index 0884ab547f..dead9dacdd 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java @@ -2,13 +2,13 @@ import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; -import org.jlab.rec.ahdc.AI.InterCluster; -import org.jlab.rec.ahdc.AI.TrackPrediction; -import org.jlab.rec.ahdc.Cluster.Cluster; +import org.jlab.rec.alert.AI.InterCluster; +import org.jlab.rec.alert.AI.TrackPrediction; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; import org.jlab.rec.ahdc.DocaCluster.DocaCluster; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; -import org.jlab.rec.ahdc.Track.Track; +import org.jlab.rec.alert.Track.Track; import java.util.ArrayList; import java.util.List; @@ -50,7 +50,7 @@ public DataBank fillPreClustersBank(DataEvent event, ArrayList preCl return bank; } - public DataBank fillClustersBank(DataEvent event, ArrayList clusters) { + public DataBank fillClustersBank(DataEvent event, ArrayList clusters) { if (clusters == null || clusters.size() == 0) return null; DataBank bank = event.createBank("AHDC::clusters", clusters.size()); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Distance/Distance.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Distance/Distance.java index 0d9d10ce87..86b6c9b15b 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Distance/Distance.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Distance/Distance.java @@ -1,7 +1,7 @@ package org.jlab.rec.ahdc.Distance; -import org.jlab.rec.ahdc.Cluster.Cluster; -import org.jlab.rec.ahdc.Track.Track; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; +import org.jlab.rec.alert.Track.TrackCandidate; import java.util.ArrayList; import java.util.Arrays; @@ -14,13 +14,13 @@ */ public class Distance { - private ArrayList _AHDCTracks; + private ArrayList _AHDCTrackCandidates; public Distance(){ - _AHDCTracks = new ArrayList<>(); + _AHDCTrackCandidates = new ArrayList<>(); } - public void find_track(List AHDC_Cluster){ + public void find_track(List AHDC_Cluster){ find_track_4_clusters(AHDC_Cluster); find_track_3_clusters(AHDC_Cluster); } @@ -41,14 +41,14 @@ public static List> computeCombinations2(List> lists) { return combinations; } - private void find_track_4_clusters(List AHDC_Cluster){ - List clusters_to_remove = new ArrayList<>(); - List layer1 = new ArrayList<>(); // List of all cluster with a radius equal 35 - List layer2 = new ArrayList<>(); // List of all cluster with a radius equal 45 - List layer3 = new ArrayList<>(); // List of all cluster with a radius equal 55 - List layer4 = new ArrayList<>(); // List of all cluster with a radius equal 65 + private void find_track_4_clusters(List AHDC_Cluster){ + List clusters_to_remove = new ArrayList<>(); + List layer1 = new ArrayList<>(); // List of all cluster with a radius equal 35 + List layer2 = new ArrayList<>(); // List of all cluster with a radius equal 45 + List layer3 = new ArrayList<>(); // List of all cluster with a radius equal 55 + List layer4 = new ArrayList<>(); // List of all cluster with a radius equal 65 - for(Cluster cluster : AHDC_Cluster){ + for(AHDCCluster cluster : AHDC_Cluster){ if(cluster.get_Radius() == 35){ layer1.add(cluster); } @@ -62,29 +62,29 @@ else if(cluster.get_Radius() == 65){ layer4.add(cluster); } } - List> merged_list = new ArrayList<>(); + List> merged_list = new ArrayList<>(); merged_list.add(layer1); merged_list.add(layer2); merged_list.add(layer3); merged_list.add(layer4); - List> all_combinations = computeCombinations2(merged_list); + List> all_combinations = computeCombinations2(merged_list); - List all_track = new ArrayList<>(); - for(List combination : all_combinations){ - all_track.add(new Track(combination)); + List all_track = new ArrayList<>(); + for(List combination : all_combinations){ + all_track.add(new TrackCandidate(combination)); } - List tracks_possible = new ArrayList<>(); - for(Track track : all_track){ + List tracks_possible = new ArrayList<>(); + for(TrackCandidate track : all_track){ if(track.get_Distance() < 45){ tracks_possible.add(track); } } double window = 3.8; - for(Track track : tracks_possible){ - List tracks_with_close_starting_point = new ArrayList<>(); - for(Track other_track : tracks_possible){ + for(TrackCandidate track : tracks_possible){ + List tracks_with_close_starting_point = new ArrayList<>(); + for(TrackCandidate other_track : tracks_possible){ if(other_track.get_Clusters().get(0).get_X() > track.get_Clusters().get(0).get_X() - window && other_track.get_Clusters().get(0).get_X() < track.get_Clusters().get(0).get_X() + window && other_track.get_Clusters().get(0).get_Y() > track.get_Clusters().get(0).get_Y() - window @@ -97,12 +97,12 @@ else if(cluster.get_Radius() == 65){ if(tracks_with_close_starting_point.size() > 0){ double chisq_min = Double.MAX_VALUE; - Track best_track = null; - for(Track other_track : tracks_with_close_starting_point){ + TrackCandidate best_track = null; + for(TrackCandidate other_track : tracks_with_close_starting_point){ ArrayList x_ = new ArrayList<>(); ArrayList y_ = new ArrayList<>(); ArrayList w_ = new ArrayList<>(); // weight for circlefit - for(Cluster cluster : other_track.get_Clusters()){ + for(AHDCCluster cluster : other_track.get_Clusters()){ x_.add(cluster.get_X()); y_.add(cluster.get_Y()); w_.add(1.); @@ -119,32 +119,32 @@ else if(cluster.get_Radius() == 65){ } if (best_track != null ){ clusters_to_remove.addAll(best_track.get_Clusters()); - _AHDCTracks.add(best_track); + _AHDCTrackCandidates.add(best_track); } } } - List clusters_to_remove_without_double = new ArrayList<>(); - for(Cluster cluster : clusters_to_remove){ + List clusters_to_remove_without_double = new ArrayList<>(); + for(AHDCCluster cluster : clusters_to_remove){ if(!containsCluster(clusters_to_remove_without_double, cluster.get_Phi(), cluster.get_Radius())){ clusters_to_remove_without_double.add(cluster); } } - for(Cluster cluster : clusters_to_remove_without_double){ + for(AHDCCluster cluster : clusters_to_remove_without_double){ AHDC_Cluster.remove(cluster); } } - public boolean containsCluster(final List list, double phi, double radius){ + public boolean containsCluster(final List list, double phi, double radius){ return list.stream().anyMatch(o -> o.get_Radius() == (radius) && o.get_Phi() == phi); } - private ArrayList> combination(List arr, ArrayList data, int start, + private ArrayList> combination(List arr, ArrayList data, int start, int end, int index, int r) { - ArrayList> all = new ArrayList<>(); + ArrayList> all = new ArrayList<>(); if (index == r) { all.add(data); } @@ -157,25 +157,25 @@ private ArrayList> combination(List arr, ArrayList AHDC_Cluster){ - ArrayList> all_combinations = combination(AHDC_Cluster, new ArrayList(),0, AHDC_Cluster.size()-1, 0, 3); + private void find_track_3_clusters(List AHDC_Cluster){ + ArrayList> all_combinations = combination(AHDC_Cluster, new ArrayList(),0, AHDC_Cluster.size()-1, 0, 3); - List all_track = new ArrayList<>(); - for(List combination : all_combinations){ - all_track.add(new Track(combination)); + List all_track = new ArrayList<>(); + for(List combination : all_combinations){ + all_track.add(new TrackCandidate(combination)); } - List tracks_possible = new ArrayList<>(); - for(Track track : all_track){ + List tracks_possible = new ArrayList<>(); + for(TrackCandidate track : all_track){ if(track.get_Distance() < 45){ tracks_possible.add(track); } } double window = 3.8; - for(Track track : tracks_possible) { - List tracks_with_close_starting_point = new ArrayList<>(); - for (Track other_track : tracks_possible) { + for(TrackCandidate track : tracks_possible) { + List tracks_with_close_starting_point = new ArrayList<>(); + for (TrackCandidate other_track : tracks_possible) { if (other_track.get_Clusters().get(0).get_X() > track.get_Clusters().get(0).get_X() - window && other_track.get_Clusters().get(0).get_X() < track.get_Clusters().get(0).get_X() + window && other_track.get_Clusters().get(0).get_Y() > track.get_Clusters().get(0).get_Y() - window @@ -188,12 +188,12 @@ private void find_track_3_clusters(List AHDC_Cluster){ if(tracks_with_close_starting_point.size() > 0){ double chisq_min = Double.MAX_VALUE; - Track best_track = null; - for(Track other_track : tracks_with_close_starting_point){ + TrackCandidate best_track = null; + for(TrackCandidate other_track : tracks_with_close_starting_point){ ArrayList x_ = new ArrayList<>(); ArrayList y_ = new ArrayList<>(); ArrayList w_ = new ArrayList<>(); // weight for circlefit - for(Cluster cluster : other_track.get_Clusters()){ + for(AHDCCluster cluster : other_track.get_Clusters()){ x_.add(cluster.get_X()); y_.add(cluster.get_Y()); w_.add(1.); @@ -209,17 +209,17 @@ private void find_track_3_clusters(List AHDC_Cluster){ } } if (best_track != null ){ - _AHDCTracks.add(best_track); + _AHDCTrackCandidates.add(best_track); } } } } - public ArrayList get_AHDCTracks() { - return _AHDCTracks; + public ArrayList get_AHDCTrackCandidates() { + return _AHDCTrackCandidates; } - public void set_AHDCTracks(ArrayList _AHDCTracks) { - this._AHDCTracks = _AHDCTracks; + public void set_AHDCTrackCandidates(ArrayList _AHDCTrackCandidates) { + this._AHDCTrackCandidates = _AHDCTrackCandidates; } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java index 1491f0a96e..897f598028 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java @@ -2,7 +2,7 @@ import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; -import org.jlab.rec.ahdc.Cluster.Cluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; @@ -14,7 +14,7 @@ /** * Build refined cluster space points using DOCA circles. * - * For each original Cluster (2 PreClusters with stereo angle), + * For each original AHDCCluster (2 PreClusters with stereo angle), * if the hit multiplicity is (1,1), (1,2)/(2,1) or (2,2), we * construct new space points from circle-circle tangents. * Otherwise we fall back to the original (x,y,z) with weight 1. @@ -284,18 +284,18 @@ private static Point3D midpointOfCommonPerpendicular(Line3D L1, Line3D L2) { // ===================================================================== /** - * Build a list of DocaCluster objects from the original list of Cluster. - * Each Cluster may generate multiple DocaCluster points. + * Build a list of DocaCluster objects from the original list of AHDCCluster. + * Each AHDCCluster may generate multiple DocaCluster points. */ - public static ArrayList buildRefinedClusters(List clusters) { + public static ArrayList buildRefinedClusters(List clusters) { ArrayList out = new ArrayList<>(); if (clusters == null) return out; for (int idx = 0; idx < clusters.size(); idx++) { - Cluster cl = clusters.get(idx); + AHDCCluster cl = clusters.get(idx); ArrayList pcs = cl.get_PreClusters_list(); if (pcs == null || pcs.size() != 2) { @@ -367,7 +367,7 @@ public static ArrayList buildRefinedClusters(List clusters // (1,1) case // ===================================================================== - private static List refine11(Cluster oldCluster, + private static List refine11(AHDCCluster oldCluster, PreCluster pc1, Hit h1, PreCluster pc2, Hit h2, int clusterIndex) { @@ -460,11 +460,11 @@ private static List refine11(Cluster oldCluster, /** * One precluster has 1 hit (singlePc, singleHits), the other has 2 hits (doublePc, doubleHits). - * singleIsFirst indicates whether in the original Cluster list ordering we had: + * singleIsFirst indicates whether in the original AHDCCluster list ordering we had: * - true : (pc1, pc2) = (singlePc, doublePc) * - false : (pc1, pc2) = (doublePc, singlePc) */ - private static List refine12(Cluster oldCluster, + private static List refine12(AHDCCluster oldCluster, PreCluster singlePc, ArrayList singleHits, PreCluster doublePc, ArrayList doubleHits, boolean singleIsFirst, @@ -637,7 +637,7 @@ private static List refine12(Cluster oldCluster, // (2,2) case // ===================================================================== - private static List refine22(Cluster oldCluster, + private static List refine22(AHDCCluster oldCluster, PreCluster pc1, ArrayList hits1, PreCluster pc2, ArrayList hits2, int clusterIndex) { @@ -867,7 +867,7 @@ private static double mod(double a, double b) { return a - b * Math.floor(a / b); } - /** Compute Z using the same relation as Cluster constructor but with new φ values. */ + /** Compute Z using the same relation as AHDCCluster constructor but with new φ values. */ private static double computeZ(PreCluster pre1, PreCluster pre2, double phi1, double phi2) { diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HoughTransform/HoughTransform.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HoughTransform/HoughTransform.java index ed697aecff..4ab649cdd0 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HoughTransform/HoughTransform.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/HoughTransform/HoughTransform.java @@ -1,21 +1,21 @@ package org.jlab.rec.ahdc.HoughTransform; -import org.jlab.rec.ahdc.Cluster.Cluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; import Jama.Matrix; -import org.jlab.rec.ahdc.Track.Track; +import org.jlab.rec.alert.Track.TrackCandidate; import java.util.ArrayList; import java.util.List; public class HoughTransform { - private ArrayList _AHDCTracks; + private ArrayList _AHDCTrackCandidates; public HoughTransform(){ - _AHDCTracks = new ArrayList<>(); + _AHDCTrackCandidates = new ArrayList<>(); } - public void find_tracks(List AHDC_Clusters){ + public void find_tracks(List AHDC_Clusters){ int matrix_size = 300; boolean delete = false; ArrayList delete_i_max = new ArrayList<>(); @@ -23,7 +23,7 @@ public void find_tracks(List AHDC_Clusters){ while(true){ Matrix B = new Matrix(matrix_size + 1, matrix_size + 1, 0); - for (Cluster cluster : AHDC_Clusters) { + for (AHDCCluster cluster : AHDC_Clusters) { double new_u = (cluster.get_U() + 0.06) / 0.12; double new_v = (cluster.get_V() + 0.06) / 0.12; B.set((int) (new_u * matrix_size), (int) (new_v * matrix_size), 1); @@ -85,8 +85,8 @@ public void find_tracks(List AHDC_Clusters){ double a = Math.cos(theta)/(2*rho); double b = Math.sin(theta)/(2*rho); - ArrayList possible_cluster_of_track = new ArrayList<>(); - for(Cluster cluster : AHDC_Clusters){ + ArrayList possible_cluster_of_track = new ArrayList<>(); + for(AHDCCluster cluster: AHDC_Clusters){ double distance = Math.abs(Math.sqrt(Math.pow((cluster.get_X() - a),2) + Math.pow((cluster.get_Y() - b),2)) - r); if(distance < 4){ possible_cluster_of_track.add(cluster); @@ -97,10 +97,10 @@ public void find_tracks(List AHDC_Clusters){ double x_0 = possible_cluster_of_track.get(0).get_X(); double y_0 = possible_cluster_of_track.get(0).get_Y(); - ArrayList cluster_track = new ArrayList<>(); - ArrayList cluster_to_remove = new ArrayList<>(); + ArrayList cluster_track = new ArrayList<>(); + ArrayList cluster_to_remove = new ArrayList<>(); - for(Cluster other_cluster : possible_cluster_of_track){ + for(AHDCCluster other_cluster: possible_cluster_of_track){ double distance = Math.sqrt( (other_cluster.get_X() - x_0)*(other_cluster.get_X() - x_0) + (other_cluster.get_Y() - y_0)*(other_cluster.get_Y() - y_0) ); if(distance < 50){ @@ -119,21 +119,21 @@ public void find_tracks(List AHDC_Clusters){ } } - ArrayList cluster_to_remove_without_double = new ArrayList<>(); - for(Cluster cluster : cluster_to_remove){ + ArrayList cluster_to_remove_without_double = new ArrayList<>(); + for(AHDCCluster cluster: cluster_to_remove){ if(!containsCluster(cluster_to_remove_without_double, cluster.get_Phi(), cluster.get_Radius())){ cluster_to_remove_without_double.add(cluster); } } - for(Cluster cluster : cluster_to_remove_without_double){ + for(AHDCCluster cluster: cluster_to_remove_without_double){ cluster_track.remove(cluster); } if(cluster_track.size() > 2){ - Track track = new Track(cluster_track); - _AHDCTracks.add(track); - for(Cluster cluster : cluster_track){AHDC_Clusters.remove(cluster);} + TrackCandidate track = new TrackCandidate(cluster_track); + _AHDCTrackCandidates.add(track); + for(AHDCCluster cluster: cluster_track){AHDC_Clusters.remove(cluster);} } else{ delete = true; @@ -149,15 +149,15 @@ public void find_tracks(List AHDC_Clusters){ } } - public boolean containsCluster(final List list, double phi, double radius){ + public boolean containsCluster(final List list, double phi, double radius){ return list.stream().anyMatch(o -> o.get_Radius() == (radius) && o.get_Phi() == phi); } - public ArrayList get_AHDCTracks() { - return _AHDCTracks; + public ArrayList get_AHDCTrackCandidates() { + return _AHDCTrackCandidates; } - public void set_AHDCTracks(ArrayList _AHDCTracks) { - this._AHDCTracks = _AHDCTracks; + public void set_AHDCTrackCandidates(ArrayList _AHDCTrackCandidates) { + this._AHDCTrackCandidates = _AHDCTrackCandidates; } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java index 272857efbd..26dcf2ee7f 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java @@ -14,7 +14,7 @@ import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.rec.ahdc.Hit.Hit; -import org.jlab.rec.ahdc.Track.Track; +import org.jlab.rec.alert.Track.Track; //import org.apache.commons.math3.linear.RealMatrixFormat; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/ModeTrackFinding.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/ModeTrackFinding.java deleted file mode 100644 index ec500c3ad9..0000000000 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/ModeTrackFinding.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.jlab.rec.ahdc; - -public enum ModeTrackFinding { - AI_Track_Finding, - CV_Distance, - CV_Hough, -} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/TrackFindingMode.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/TrackFindingMode.java new file mode 100644 index 0000000000..600efd82a7 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/TrackFindingMode.java @@ -0,0 +1,29 @@ +package org.jlab.rec.ahdc; + +/** AHDC track-finding strategy, selectable via the {@code ALERT.Mode} YAML key + * in the reconstruction config. + * + *

"AI_*" modes use a trained neural network; "CV_*" modes are conventional algorithms.

+ */ +public enum TrackFindingMode { + + /** AI: an MLP scores every candidate track built from inter-clusters, then + * a greedy non-overlap pass keeps the highest-scoring non-conflicting set. + */ + AI_MLP, + + /** CV: distance-based association of clusters across + * superlayers, with a circle-fit chi^2 selecting the best track among + * candidates that share a starting point. */ + CV_Distance, + + /** CV: Hough-transform track finding in the (u, v) plane — + * peaks in Hough space define circle parameters from which the track's + * clusters are gathered. */ + CV_Hough, + + /** AI: a GravNet graph neural network scores edges in a per-event + * AHDC (+ATOF when present) hit graph; tracks are extracted as connected + * components on the high-scoring edges. */ + AI_GNN, +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/AIPrediction.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/AIPrediction.java similarity index 97% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/AIPrediction.java rename to reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/AIPrediction.java index 4a12650ec7..09c8944f35 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/AIPrediction.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/AIPrediction.java @@ -1,4 +1,4 @@ -package org.jlab.rec.ahdc.AI; +package org.jlab.rec.alert.AI; import java.util.ArrayList; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNConstants.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNConstants.java new file mode 100644 index 0000000000..41fb449ef7 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNConstants.java @@ -0,0 +1,42 @@ +package org.jlab.rec.alert.AI; + +/** Normalization and graph-construction constants for the GNN track finder. + * Mirrors track-finding/gnn/config.py — keep in sync with the training config. + */ +final class GNNConstants { + private GNNConstants() {} + + static final int NODE_FEAT_DIM = 10; + static final int EDGE_FEAT_DIM = 9; + + // Model architecture parameters (control the minimum graph size at inference). + // GravNet progressive-k reaches 2*k, topk uses k+1 → N_nodes >= 2*k + 2. + // The exported model clamps topk(k+1) to N internally (see + // track-finding/export_torchscript.py::_knn_indices), so any graph with + // >=3 nodes runs without crashing. Smaller graphs can't form any edge + // with the MAX_LAYER_GAP rule anyway, so we skip them here. + static final int MIN_NODES = 3; + + // Graph construction + static final int MAX_LAYER_GAP = 2; + static final double MAX_EDGE_DISTANCE = 35.0; // mm + static final double MAX_EDGE_DIST_SQ = MAX_EDGE_DISTANCE * MAX_EDGE_DISTANCE; + + // Feature normalization + static final double MAX_R = 100.0; // mm + static final double DOCA_STD = 10.0; // mm + static final double Z_HALF_LENGTH = 200.0; // mm + static final double STEREO_ANGLE_MAX = 0.03; // rad + static final double STEREO_SCALE = 1.0 / STEREO_ANGLE_MAX; + + // ATOF abs_layer convention from Python's build_graph + static final int ATOF_BAR_ABS_LAYER = 10; // component == 10 + static final int ATOF_WEDGE_ABS_LAYER = 11; // all other components + + // Track extraction: connected components at a single score threshold, matching + // gnn/evaluate.py (extract_tracks(..., method="cc", threshold=0.1)). Drop tracks + // with fewer than MIN_TRACK_NODES total nodes — same filter evaluate.py applies + // after the method call. + static final double TRACK_SCORE_THRESHOLD = 0.1; + static final int MIN_TRACK_NODES = 3; +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNGraphBuilder.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNGraphBuilder.java new file mode 100644 index 0000000000..0b79936935 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNGraphBuilder.java @@ -0,0 +1,218 @@ +package org.jlab.rec.alert.AI; + +import java.util.ArrayList; +import java.util.List; + +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.alert.Track.AtofHitStub; + +/** Builds the graph tensors expected by the exported GNN edge scorer. + */ +final class GNNGraphBuilder { + + /** Container for the tensors + node provenance that the caller needs. */ + static final class GraphInput { + final float[][] nodeFeatures; // shape [N, 10] + final long[][] edgeIndex; // shape [2, E] + final float[][] edgeAttr; // shape [E, 9] + /** nodeToSource[i] is the backing Hit for AHDC nodes, or null for ATOF nodes. */ + final Hit[] nodeToSource; + /** nodeToAtof[i] is the backing ATOF hit for ATOF nodes, or null for AHDC nodes. */ + final AtofHitStub[] nodeToAtof; + + GraphInput(float[][] nodeFeatures, long[][] edgeIndex, float[][] edgeAttr, + Hit[] nodeToSource, AtofHitStub[] nodeToAtof) { + this.nodeFeatures = nodeFeatures; + this.edgeIndex = edgeIndex; + this.edgeAttr = edgeAttr; + this.nodeToSource = nodeToSource; + this.nodeToAtof = nodeToAtof; + } + } + + private GNNGraphBuilder() {} + + /** Build a graph from AHDC hits (required) plus the attached ATOF hits + * (optional — pass empty/null when no ATOF is available). */ + static GraphInput build(List ahdcHits, List atofHits) { + int nAhdc = ahdcHits == null ? 0 : ahdcHits.size(); + + // Node state buffers (grow as we append AHDC then ATOF nodes). + List nodeBuf = new ArrayList<>(); // per-node raw floats (see NodeField indexes) + List nodeLine = new ArrayList<>(); // wire line for AHDC; null for ATOF + List nodeHit = new ArrayList<>(); // backing Hit for AHDC; null for ATOF + List nodeAtof = new ArrayList<>(); // backing ATOF hit for ATOF; null for AHDC + + // --- AHDC nodes ------------------------------------------------------------- + for (int i = 0; i < nAhdc; i++) { + Hit h = ahdcHits.get(i); + Line3D line = h.getLine(); + if (line == null) continue; // missing geometry → skip (shouldn't happen after setWirePosition) + + Point3D mid = line.midpoint(); + Vector3D dir = line.toVector(); + double len = Math.max(dir.mag(), 1e-12); + double ux = dir.x() / len, uy = dir.y() / len, uz = dir.z() / len; + double stereo = Math.atan2(Math.sqrt(ux*ux + uy*uy), uz); + + int absLayer = (h.getSuperLayerId() - 1) * 2 + (h.getLayerId() - 1); + nodeBuf.add(new double[]{ + absLayer, // 0: abs_layer + h.getPhi(), // 1: phi + h.getRadius(), // 2: r + stereo, // 3: stereo_angle + mid.x(), // 4: x_mid + mid.y(), // 5: y_mid + mid.z(), // 6: z_mid + ux, // 7: ux + uy, // 8: uy + uz, // 9: uz + h.getX(), // 10: x (raw, for edge distance mask) + h.getY(), // 11: y (raw, for edge distance mask) + 0.0, // 12: det_type = 0 (AHDC) + }); + nodeLine.add(line); + nodeHit.add(h); + nodeAtof.add(null); + } + + // --- ATOF nodes ------------------------------------------------------------- + // The caller supplies already-unique ATOF hits; no dedup needed here. + if (atofHits != null) { + for (AtofHitStub a : atofHits) { + int component = a.getComponent(); + double x = a.getX(); + double y = a.getY(); + double radius = Math.hypot(x, y); + double phi = Math.atan2(y, x); + int absLayer = (component == 10) ? GNNConstants.ATOF_BAR_ABS_LAYER + : GNNConstants.ATOF_WEDGE_ABS_LAYER; + + nodeBuf.add(new double[]{ + absLayer, phi, radius, + 0.0, // stereo + x, y, 0.0, // mid + 0.0, 0.0, 1.0, // (ux, uy, uz) + x, y, // raw x, y (for edge mask) + 1.0, // det_type = 1 (ATOF) + }); + nodeLine.add(null); + nodeHit.add(null); + nodeAtof.add(a); + } + } + + int n = nodeBuf.size(); + if (n < 2) { + return new GraphInput(new float[0][GNNConstants.NODE_FEAT_DIM], + new long[][]{new long[0], new long[0]}, + new float[0][GNNConstants.EDGE_FEAT_DIM], + new Hit[0], new AtofHitStub[0]); + } + + // --- Node feature tensor [N, 10] -------------------------------------------- + float[][] nodeFeatures = new float[n][GNNConstants.NODE_FEAT_DIM]; + for (int i = 0; i < n; i++) { + double[] v = nodeBuf.get(i); + nodeFeatures[i][0] = (float)(v[0] / 11.0); + nodeFeatures[i][1] = (float)(v[1] / Math.PI); + nodeFeatures[i][2] = (float)(v[2] / GNNConstants.DOCA_STD); + nodeFeatures[i][3] = (float)(v[3] / GNNConstants.STEREO_ANGLE_MAX); + nodeFeatures[i][4] = (float)(v[4] / GNNConstants.MAX_R); + nodeFeatures[i][5] = (float)(v[5] / GNNConstants.MAX_R); + nodeFeatures[i][6] = (float)(v[6] / GNNConstants.Z_HALF_LENGTH); + nodeFeatures[i][7] = (float)(v[7] * GNNConstants.STEREO_SCALE); + nodeFeatures[i][8] = (float)(v[8] * GNNConstants.STEREO_SCALE); + nodeFeatures[i][9] = (float)(v[9]); + } + + // --- Edge construction (directed, layer_gap in [1, MAX_LAYER_GAP]) ----------- + int[] absLayer = new int[n]; + double[] xRaw = new double[n]; + double[] yRaw = new double[n]; + double[] rRaw = new double[n]; + double[] phiRaw = new double[n]; + double[] stereoRaw = new double[n]; + double[] detTypeRaw = new double[n]; + for (int i = 0; i < n; i++) { + double[] v = nodeBuf.get(i); + absLayer[i] = (int) v[0]; + phiRaw[i] = v[1]; + rRaw[i] = v[2]; + stereoRaw[i] = v[3]; + xRaw[i] = v[10]; + yRaw[i] = v[11]; + detTypeRaw[i] = v[12]; + } + + List edgePairs = new ArrayList<>(); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (i == j) continue; + int gap = absLayer[j] - absLayer[i]; + if (gap < 1 || gap > GNNConstants.MAX_LAYER_GAP) continue; + double dx = xRaw[i] - xRaw[j]; + double dy = yRaw[i] - yRaw[j]; + if (dx*dx + dy*dy > GNNConstants.MAX_EDGE_DIST_SQ) continue; + edgePairs.add(new long[]{i, j}); + } + } + + int e = edgePairs.size(); + long[][] edgeIndex = new long[2][e]; + float[][] edgeAttr = new float[e][GNNConstants.EDGE_FEAT_DIM]; + + for (int k = 0; k < e; k++) { + long[] p = edgePairs.get(k); + int s = (int) p[0]; + int d = (int) p[1]; + edgeIndex[0][k] = s; + edgeIndex[1][k] = d; + + // dphi wrapped into [-pi, pi] + double dphi = phiRaw[s] - phiRaw[d]; + dphi = ((dphi + Math.PI) % (2.0 * Math.PI) + 2.0 * Math.PI) % (2.0 * Math.PI) - Math.PI; + double dlayer = (double)(absLayer[d] - absLayer[s]) / GNNConstants.MAX_LAYER_GAP; + + double doca, z1, z2; + Line3D ls = nodeLine.get(s); + Line3D ld = nodeLine.get(d); + if (ls != null && ld != null) { + doca = ls.distance(ld).length(); + z1 = clampZ(ls.distance(ld.midpoint()).origin().z()); + z2 = clampZ(ld.distance(ls.midpoint()).origin().z()); + } else { + double ex = xRaw[s] - xRaw[d]; + double ey = yRaw[s] - yRaw[d]; + doca = Math.hypot(ex, ey); + z1 = 0.0; + z2 = 0.0; + } + + double edgeDetType = 0.5 * (detTypeRaw[s] + detTypeRaw[d]); + + edgeAttr[k][0] = (float)(dphi / Math.PI); + edgeAttr[k][1] = (float) dlayer; + edgeAttr[k][2] = (float)(doca / GNNConstants.MAX_R); + edgeAttr[k][3] = (float)(z1 / GNNConstants.Z_HALF_LENGTH); + edgeAttr[k][4] = (float)(z2 / GNNConstants.Z_HALF_LENGTH); + edgeAttr[k][5] = (float)(rRaw[s] / GNNConstants.DOCA_STD); + edgeAttr[k][6] = (float)(rRaw[d] / GNNConstants.DOCA_STD); + edgeAttr[k][7] = (float)((stereoRaw[s] - stereoRaw[d]) / (2.0 * GNNConstants.STEREO_ANGLE_MAX)); + edgeAttr[k][8] = (float) edgeDetType; + } + + Hit[] nodeToHit = nodeHit.toArray(new Hit[0]); + AtofHitStub[] nodeToAtof = nodeAtof.toArray(new AtofHitStub[0]); + return new GraphInput(nodeFeatures, edgeIndex, edgeAttr, nodeToHit, nodeToAtof); + } + + private static double clampZ(double z) { + if (z < -GNNConstants.Z_HALF_LENGTH) return -GNNConstants.Z_HALF_LENGTH; + if (z > GNNConstants.Z_HALF_LENGTH) return GNNConstants.Z_HALF_LENGTH; + return z; + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNPrediction.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNPrediction.java new file mode 100644 index 0000000000..44ea4eabc4 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/GNNPrediction.java @@ -0,0 +1,129 @@ +package org.jlab.rec.alert.AI; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.ahdc.PreCluster.PreCluster; +import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; +import org.jlab.rec.alert.Track.AtofHitStub; +import org.jlab.rec.alert.Track.CandidateType; +import org.jlab.rec.alert.Track.TrackCandidate; + +/** Orchestrates GNN-based track finding: builds the graph, runs the exported + * edge scorer, extracts tracks via connected components on edge scores + * thresholded at 0.1, and converts each node-set back into a + * {@link TrackCandidate} carrying per-superlayer Clusters so the downstream + * helix fit / Kalman stages can consume it. Components that include ATOF + * graph nodes yield {@code AHDC_ATOF} candidates with those ATOF hits + * attached; the rest are {@code AHDC_ONLY}. + */ +public final class GNNPrediction { + + private static final Logger LOGGER = Logger.getLogger(GNNPrediction.class.getName()); + + public ArrayList prediction(List ahdcHits, + List atofHits, + ModelTrackFindingGNN model) { + ArrayList out = new ArrayList<>(); + if (ahdcHits == null || ahdcHits.isEmpty() || model == null) return out; + + GNNGraphBuilder.GraphInput g = GNNGraphBuilder.build(ahdcHits, atofHits); + int nNodes = g.nodeToSource.length; + int nEdges = g.edgeIndex[0].length; + if (nNodes < GNNConstants.MIN_NODES || nEdges == 0) { + return out; // model cannot run on graphs this small + } + + float[] edgeScores; + try { + edgeScores = model.predictEdgeScores(g.nodeFeatures, g.edgeIndex, g.edgeAttr); + } catch (Exception ex) { + LOGGER.warning(() -> "GNN inference failed: " + ex); + return out; + } + + // Connected components at TRACK_SCORE_THRESHOLD, filtered to + // components of size >= MIN_TRACK_NODES. + List trackNodeSets = SeedExtendTrackExtractor.extract(edgeScores, g.edgeIndex, nNodes); + + for (int[] nodes : trackNodeSets) { + // Split the component's nodes: AHDC Hits become the candidate's hits, + // ATOF nodes (when present) are attached so the candidate is typed + // AHDC_ATOF. Only AHDC hits feed AHDC::track / AHDC::hits. + ArrayList trackHits = new ArrayList<>(nodes.length); + ArrayList trackAtof = new ArrayList<>(); + for (int n : nodes) { + Hit h = g.nodeToSource[n]; + if (h != null) { trackHits.add(h); continue; } + AtofHitStub a = g.nodeToAtof[n]; + if (a != null) trackAtof.add(a); + } + if (trackHits.isEmpty()) continue; + + ArrayList clusters = buildSuperlayerClusters(trackHits); + if (clusters.size() < 3) continue; // matches the downstream >=3 filter + + TrackCandidate candidate = new TrackCandidate(clusters); + if (!trackAtof.isEmpty()) { + candidate.setType(CandidateType.AHDC_ATOF); + for (AtofHitStub a : trackAtof) candidate.addAtofHit(a); + } + out.add(candidate); + } + + return out; + } + + /** One {@link AHDCCluster} per superlayer built from two {@link PreCluster}s (one + * per layer within the superlayer). Using real PreClusters — instead of the + * 3-arg {@code AHDCCluster(x,y,z)} constructor — keeps + * {@code Track.generateHitList()} and {@code DocaClusterRefiner}'s stereo + * pairing working for GNN-discovered tracks just like they do for MLP tracks. + */ + private static ArrayList buildSuperlayerClusters(List hits) { + // Feed the track's hits through the same preclustering the MLP path uses. + // findPreclusters mutates its input (it calls setUse(true) on consumed + // hits), so pass a copy and ensure each hit starts unmarked. + ArrayList hitsForPre = new ArrayList<>(hits.size()); + for (Hit h : hits) { h.setUse(false); hitsForPre.add(h); } + PreClusterFinder pcf = new PreClusterFinder(); + pcf.findPreclusters(hitsForPre); + ArrayList preclusters = pcf.get_AHDCPreClusters(); + + // Index by (superlayer, layer). If the GNN assigns two PreClusters of the + // same superlayer+layer to one track (rare — it would mean two disjoint + // wire runs on the same layer), keep the largest and drop the rest. + Map bySuperlayer = new HashMap<>(); + for (PreCluster pc : preclusters) { + int sl = pc.get_Super_layer(); + int layerIdx = pc.get_Layer() - 1; // layer is 1-based, slots are [0,1] + if (layerIdx < 0 || layerIdx > 1) continue; + PreCluster[] slot = bySuperlayer.computeIfAbsent(sl, k -> new PreCluster[2]); + PreCluster prev = slot[layerIdx]; + if (prev == null || pc.get_Num_wire() > prev.get_Num_wire()) slot[layerIdx] = pc; + } + + ArrayList clusters = new ArrayList<>(); + // Iterate superlayers in ascending order to keep downstream output stable. + // If both stereo layers have a PreCluster, pair them (full stereo cluster). + // If only one has hits, use the single-layer AHDCCluster(PreCluster) ctor — + // DocaClusterRefiner handles PreClusters_list.size() != 2 with a + // degenerate DocaCluster fallback, so the helix fit still runs. + for (int sl = 1; sl <= 5; sl++) { + PreCluster[] slot = bySuperlayer.get(sl); + if (slot == null) continue; + if (slot[0] != null && slot[1] != null) { + clusters.add(new AHDCCluster(slot[0], slot[1])); + } else { + PreCluster single = (slot[0] != null) ? slot[0] : slot[1]; + if (single != null) clusters.add(new AHDCCluster(single)); + } + } + return clusters; + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/InterCluster.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/InterCluster.java similarity index 97% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/InterCluster.java rename to reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/InterCluster.java index 0522f18fc5..c0f2076fd9 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/InterCluster.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/InterCluster.java @@ -1,4 +1,4 @@ -package org.jlab.rec.ahdc.AI; +package org.jlab.rec.alert.AI; import org.jlab.rec.ahdc.PreCluster.PreCluster; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/ModelTrackFinding.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/ModelTrackFinding.java similarity index 99% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/ModelTrackFinding.java rename to reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/ModelTrackFinding.java index 8a2ebb7d23..4af8c94333 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/ModelTrackFinding.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/ModelTrackFinding.java @@ -1,4 +1,4 @@ -package org.jlab.rec.ahdc.AI; +package org.jlab.rec.alert.AI; import ai.djl.MalformedModelException; import ai.djl.ndarray.NDArray; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/ModelTrackFindingGNN.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/ModelTrackFindingGNN.java new file mode 100644 index 0000000000..85b7b71e37 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/ModelTrackFindingGNN.java @@ -0,0 +1,107 @@ +package org.jlab.rec.alert.AI; + +import java.io.IOException; +import java.nio.file.Paths; + +import ai.djl.MalformedModelException; +import ai.djl.inference.Predictor; +import ai.djl.ndarray.NDArray; +import ai.djl.ndarray.NDList; +import ai.djl.ndarray.NDManager; +import ai.djl.ndarray.types.Shape; +import ai.djl.repository.zoo.Criteria; +import ai.djl.repository.zoo.ModelNotFoundException; +import ai.djl.repository.zoo.ZooModel; +import ai.djl.training.util.ProgressBar; +import ai.djl.translate.NoopTranslator; +import org.jlab.utils.CLASResources; + +/** DJL wrapper around the GravNet TorchScript model exported from + * track-finding/export_torchscript.py. Runs per-event edge scoring. + * + * Exported forward signature (see SingleGraphEdgeScorer): + * forward(x: float32[N, 10], edge_index: int64[2, E], edge_attr: float32[E, 9]) + * -> float32[E] (sigmoid edge scores in [0, 1]) + * + *

DJL (Deep Java Library) is the inference engine used here. See its + * documentation for the {@code Criteria} / {@code ZooModel} / {@code Predictor} + * / {@code NDArray} APIs used below: + *

+ */ +public class ModelTrackFindingGNN { + + private final ZooModel model; + /** Reused across every call. DJL's Predictor is NOT thread-safe, but the + * ALERT reconstruction engine is single-threaded, so one instance is fine + * and avoids the allocation/libtorch-graph-prep cost per event that + * dominated predictEdgeScores on small graphs. + */ + private final Predictor predictor; + + public ModelTrackFindingGNN() { + // Let libtorch pick sensible defaults: GravNet's cdist + topk + gather + // chain benefits from the graph optimizer and intra-op parallelism the + // MLP copy-paste was pinning off. Keep num_interop_threads=1 — there is + // only one event in flight at a time. + System.setProperty("ai.djl.pytorch.num_interop_threads", "1"); + + String path = CLASResources.getResourcePath("etc/data/nnet/rg-l/model_AHDC_GNN/"); + Criteria criteria = Criteria.builder() + .setTypes(NDList.class, NDList.class) + .optModelPath(Paths.get(path)) + .optEngine("PyTorch") + .optTranslator(new NoopTranslator()) + .optProgress(new ProgressBar()) + .build(); + + try { + model = criteria.loadModel(); + } catch (IOException | ModelNotFoundException | MalformedModelException ex) { + throw new RuntimeException(ex); + } + predictor = model.newPredictor(new NoopTranslator()); + } + + /** Score every edge in the input graph. + * + * @param nodeFeatures shape [N, 10] — see GNNConstants.NODE_FEAT_DIM + * @param edgeIndex shape [2, E] — int64 source / destination node ids + * @param edgeAttr shape [E, 9] — see GNNConstants.EDGE_FEAT_DIM + * @return float[E] of sigmoid edge scores in [0, 1] + */ + public float[] predictEdgeScores(float[][] nodeFeatures, long[][] edgeIndex, float[][] edgeAttr) throws Exception { + if (nodeFeatures == null || nodeFeatures.length == 0) return new float[0]; + int n = nodeFeatures.length; + int e = edgeIndex[0].length; + if (e == 0) return new float[0]; + + try (NDManager manager = NDManager.newBaseManager()) { + // Flatten x into a contiguous float[] so DJL builds a [N, node_dim] tensor. + int nodeDim = nodeFeatures[0].length; + float[] xFlat = new float[n * nodeDim]; + for (int i = 0; i < n; i++) System.arraycopy(nodeFeatures[i], 0, xFlat, i * nodeDim, nodeDim); + NDArray x = manager.create(xFlat, new Shape(n, nodeDim)); + + // edge_index is int64[2, E]; flatten row-major. + long[] edgeIndexFlat = new long[2 * e]; + System.arraycopy(edgeIndex[0], 0, edgeIndexFlat, 0, e); + System.arraycopy(edgeIndex[1], 0, edgeIndexFlat, e, e); + NDArray edgeIndexNd = manager.create(edgeIndexFlat, new Shape(2, e)); + + int edgeDim = edgeAttr[0].length; + float[] edgeAttrFlat = new float[e * edgeDim]; + for (int i = 0; i < e; i++) System.arraycopy(edgeAttr[i], 0, edgeAttrFlat, i * edgeDim, edgeDim); + NDArray edgeAttrNd = manager.create(edgeAttrFlat, new Shape(e, edgeDim)); + + NDList output = predictor.predict(new NDList(x, edgeIndexNd, edgeAttrNd)); + NDArray scoresNd = output.get(0); + return scoresNd.toFloatArray(); + } + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/PreClustering.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/PreClustering.java similarity index 97% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/PreClustering.java rename to reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/PreClustering.java index 5e2e9c270f..c64eb0f406 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/PreClustering.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/PreClustering.java @@ -1,4 +1,4 @@ -package org.jlab.rec.ahdc.AI; +package org.jlab.rec.alert.AI; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/SeedExtendTrackExtractor.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/SeedExtendTrackExtractor.java new file mode 100644 index 0000000000..63c727e757 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/SeedExtendTrackExtractor.java @@ -0,0 +1,65 @@ +package org.jlab.rec.alert.AI; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** Track extraction from per-edge scores via union-find connected components + * at a single threshold. Ports the {@code method="cc"} branch of + * {@code track-finding/gnn/inference.py::extract_tracks}, which is the + * extractor that gnn/evaluate.py uses. + * + * Code from: https://gitlab.com/MathieuOuillon/track-finding + */ +final class SeedExtendTrackExtractor { + + private SeedExtendTrackExtractor() {} + + /** @return list of node-index arrays, one per connected component of size + * ≥ {@link GNNConstants#MIN_TRACK_NODES}. */ + static List extract(float[] scores, long[][] edgeIndex, int nNodes) { + if (nNodes <= 0 || scores == null || edgeIndex == null || edgeIndex[0].length != scores.length) { + return new ArrayList<>(); + } + long[] src = edgeIndex[0]; + long[] dst = edgeIndex[1]; + + int[] parent = new int[nNodes]; + for (int i = 0; i < nNodes; i++) parent[i] = i; + for (int e = 0; e < scores.length; e++) { + if (scores[e] >= GNNConstants.TRACK_SCORE_THRESHOLD) { + union(parent, (int) src[e], (int) dst[e]); + } + } + + Map> groups = new HashMap<>(); + for (int i = 0; i < nNodes; i++) { + int r = find(parent, i); + groups.computeIfAbsent(r, k -> new ArrayList<>()).add(i); + } + + List out = new ArrayList<>(); + for (List members : groups.values()) { + if (members.size() < GNNConstants.MIN_TRACK_NODES) continue; + int[] arr = new int[members.size()]; + for (int i = 0; i < arr.length; i++) arr[i] = members.get(i); + out.add(arr); + } + return out; + } + + private static int find(int[] parent, int x) { + while (parent[x] != x) { + parent[x] = parent[parent[x]]; + x = parent[x]; + } + return x; + } + + private static void union(int[] parent, int a, int b) { + int ra = find(parent, a); + int rb = find(parent, b); + if (ra != rb) parent[ra] = rb; + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/TrackCandidatesGenerator.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/TrackCandidatesGenerator.java similarity index 99% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/TrackCandidatesGenerator.java rename to reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/TrackCandidatesGenerator.java index 732c44839d..e121b28862 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/TrackCandidatesGenerator.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/TrackCandidatesGenerator.java @@ -1,4 +1,4 @@ -package org.jlab.rec.ahdc.AI; +package org.jlab.rec.alert.AI; import org.apache.commons.lang3.mutable.MutableBoolean; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/TrackPrediction.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/TrackPrediction.java similarity index 80% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/TrackPrediction.java rename to reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/TrackPrediction.java index 0937243b87..d37a62ea61 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/AI/TrackPrediction.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/AI/TrackPrediction.java @@ -1,6 +1,6 @@ -package org.jlab.rec.ahdc.AI; +package org.jlab.rec.alert.AI; -import org.jlab.rec.ahdc.Cluster.Cluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; import org.jlab.rec.ahdc.PreCluster.PreCluster; import java.util.ArrayList; @@ -10,7 +10,7 @@ public class TrackPrediction { private float prediction; private final ArrayList interclusters; private final ArrayList preclusters = new ArrayList<>(); - private ArrayList clusters = new ArrayList<>(); + private ArrayList clusters = new ArrayList<>(); public TrackPrediction(float prediction, ArrayList interclusters_) { this.prediction = prediction; @@ -25,28 +25,28 @@ public TrackPrediction(float prediction, ArrayList interclusters_) if (p.get_Super_layer() == 1) { for (PreCluster other : this.preclusters) { if (other.get_Super_layer() == 2 && other.get_Layer() == 1) - clusters.add(new Cluster(p, other)); + clusters.add(new AHDCCluster(p, other)); } } if (p.get_Super_layer() == 2 && p.get_Layer() == 2) { for (PreCluster other : this.preclusters) { if (other.get_Super_layer() == 3 && other.get_Layer() == 1) - clusters.add(new Cluster(p, other)); + clusters.add(new AHDCCluster(p, other)); } } if (p.get_Super_layer() == 3 && p.get_Layer() == 2) { for (PreCluster other : this.preclusters) { if (other.get_Super_layer() == 4 && other.get_Layer() == 1) - clusters.add(new Cluster(p, other)); + clusters.add(new AHDCCluster(p, other)); } } if (p.get_Super_layer() == 4 && p.get_Layer() == 2) { for (PreCluster other : this.preclusters) { if (other.get_Super_layer() == 5 && other.get_Layer() == 1) - clusters.add(new Cluster(p, other)); + clusters.add(new AHDCCluster(p, other)); } } @@ -67,7 +67,7 @@ public ArrayList getPreclusters() { return preclusters; } - public ArrayList getClusters() { + public ArrayList getClusters() { return clusters; } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/AtofHitStub.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/AtofHitStub.java new file mode 100644 index 0000000000..5f7e1726b4 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/AtofHitStub.java @@ -0,0 +1,35 @@ +package org.jlab.rec.alert.Track; + +/** A minimal stand-in for an ATOF hit, attached to a {@link TrackCandidate} by + * the GNN graph. + * + *

Carries only the fields the GNN graph builder already extracts from the + * {@code ATOF::hits} bank. It is deliberately not + * {@code org.jlab.rec.atof.hit.ATOFHit}: constructing a real {@code ATOFHit} + * requires the ATOF {@code Detector} geometry and a calibration table, neither + * of which is available where the graph is built. Keeping this a plain value + * class also keeps the {@code Track} package free of any dependency on the + * {@code atof} package.

+ */ +public final class AtofHitStub { + + private final int sector; + private final int layer; + private final int component; + private final double x; + private final double y; + + public AtofHitStub(int sector, int layer, int component, double x, double y) { + this.sector = sector; + this.layer = layer; + this.component = component; + this.x = x; + this.y = y; + } + + public int getSector() { return sector; } + public int getLayer() { return layer; } + public int getComponent() { return component; } + public double getX() { return x; } + public double getY() { return y; } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/CandidateType.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/CandidateType.java new file mode 100644 index 0000000000..015e939e0e --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/CandidateType.java @@ -0,0 +1,19 @@ +package org.jlab.rec.alert.Track; + +/** Specialization of a {@link TrackCandidate}. The type a track finder assigns + * to a candidate dictates how the candidate is fitted downstream. + * + *
    + *
  • {@code AHDC_ONLY} — AHDC hits only (MLP / Distance / Hough, and GNN + * tracks that include no ATOF graph nodes).
  • + *
  • {@code AHDC_ATOF} — AHDC hits plus attached ATOF hits (GNN tracks whose + * connected component includes ATOF graph nodes).
  • + *
  • {@code AHDC_VERTEX} — reserved for future use (AHDC hits + a vertex + * constraint).
  • + *
+ */ +public enum CandidateType { + AHDC_ONLY, + AHDC_ATOF, + AHDC_VERTEX +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java new file mode 100644 index 0000000000..e108ee3493 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java @@ -0,0 +1,143 @@ +package org.jlab.rec.alert.Track; + +import org.jlab.rec.alert.AI.InterCluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; +import org.jlab.rec.ahdc.HelixFit.HelixFitObject; +import org.jlab.rec.ahdc.Hit.Hit; + +import java.util.ArrayList; +import java.util.List; + +/** A fitted track: the result of track fitting. + * + *

A {@code Track} is produced by fitting a {@link TrackCandidate} (helix + * fit, then Kalman filter). It composes the candidate it was fitted from — so + * it still exposes the candidate's hits / clusters to the bank writers — and + * adds the fitted vertex, momentum and fit-quality quantities.

+ */ +public class Track { + + private final TrackCandidate candidate; + + private double sum_residuals = 0; ///< sum of residuals (mm) + private double chi2 = 0; ///< sum of residuals^2 (mm^2) + // AHDC::track + private double x0 = 0; + private double y0 = 0; + private double z0 = 0; + private double px0 = 0; + private double py0 = 0; + private double pz0 = 0; + private double dEdx = 0; ///< deposited energy per path length (adc/mm) + private double p_drift = 0; ///< momentum in the drift region (MeV) + private double path = 0; ///< length of the track (mm) + + public Track(TrackCandidate candidate) { + this.candidate = candidate; + } + + /** The candidate this track was fitted from. */ + public TrackCandidate getCandidate() { + return candidate; + } + + public void setPositionAndMomentum(HelixFitObject helixFitObject) { + this.x0 = helixFitObject.get_X0(); + this.y0 = helixFitObject.get_Y0(); + this.z0 = helixFitObject.get_Z0(); + this.px0 = helixFitObject.get_px(); + this.py0 = helixFitObject.get_py(); + this.pz0 = helixFitObject.get_pz(); + this.chi2 = helixFitObject.get_Chi2(); + this.path = helixFitObject.get_path(); + } + + public void setPositionAndMomentumVec(double[] x) { + this.x0 = x[0]; + this.y0 = x[1]; + this.z0 = x[2]; + this.px0 = x[3]; + this.py0 = x[4]; + this.pz0 = x[5]; + } + + @Override + public String toString() { + return "Track{" + "candidate=" + candidate + '}'; + } + + public double get_X0() { + return x0; + } + + public double get_Y0() { + return y0; + } + + public double get_Z0() { + return z0; + } + + public double get_px() { + return px0; + } + + public double get_py() { + return py0; + } + + public double get_pz() { + return pz0; + } + + public void set_chi2(double _chi2) { chi2 = _chi2;} + public void set_sum_residuals(double _sum_residuals) { sum_residuals = _sum_residuals;} + public double get_chi2() {return chi2;} + public double get_sum_residuals() {return sum_residuals;} + // AHDC::track + public void set_dEdx(double _dEdx) { dEdx = _dEdx;} + public void set_p_drift(double _p_drift) { p_drift = _p_drift;} + public void set_path(double _path) { path = _path;} + public double get_dEdx() { + if (path <= 0) { + dEdx = 0; + }else { + int sum = 0; + for (Hit h : candidate.getHits()) { + sum += (int) Math.round(h.getADC()); + } + dEdx = sum/path; + } + return dEdx; + } + public double get_p_drift() {return p_drift;} + public double get_path() {return path;} + + // --- delegated to the underlying candidate ------------------------------- + // The candidate owns the hits / clusters / specialization; Track exposes the + // same accessors so callers can treat a fitted Track as a full handle. + public int get_trackId() { return candidate.get_trackId(); } + public void set_trackId(int id) { candidate.set_trackId(id); } + public int get_n_hits() { return candidate.get_n_hits(); } + public void set_n_hits(int n) { candidate.set_n_hits(n); } + public int get_sum_adc() { return candidate.get_sum_adc(); } + public void set_sum_adc(int s) { candidate.set_sum_adc(s); } + public ArrayList getHits() { return candidate.getHits(); } + public List get_Clusters() { return candidate.get_Clusters(); } + public List getInterclusters() { return candidate.getInterclusters(); } + public double get_Distance() { return candidate.get_Distance(); } + public boolean is_Used() { return candidate.is_Used(); } + public void set_Used(boolean u) { candidate.set_Used(u); } + public CandidateType getType() { return candidate.getType(); } + public void setType(CandidateType t) { candidate.setType(t); } + public List getAtofHits() { return candidate.getAtofHits(); } + public void addAtofHit(AtofHitStub h) { candidate.addAtofHit(h); } + + // AHDC::aiprediction — delegated to the candidate + public void set_predicted_ATOF_sector(int s) { candidate.set_predicted_ATOF_sector(s); } + public void set_predicted_ATOF_layer(int l) { candidate.set_predicted_ATOF_layer(l); } + public void set_predicted_ATOF_wedge(int w) { candidate.set_predicted_ATOF_wedge(w); } + public int get_predicted_ATOF_sector() { return candidate.get_predicted_ATOF_sector(); } + public int get_predicted_ATOF_layer() { return candidate.get_predicted_ATOF_layer(); } + public int get_predicted_ATOF_wedge() { return candidate.get_predicted_ATOF_wedge(); } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/TrackCandidate.java similarity index 53% rename from reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java rename to reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/TrackCandidate.java index 7efc0cc37e..ac92c293ec 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Track/Track.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/TrackCandidate.java @@ -1,47 +1,49 @@ -package org.jlab.rec.ahdc.Track; +package org.jlab.rec.alert.Track; -import org.apache.commons.math3.linear.RealVector; -import org.jlab.rec.ahdc.AI.InterCluster; -import org.jlab.rec.ahdc.Cluster.Cluster; -import org.jlab.rec.ahdc.HelixFit.HelixFitObject; +import org.jlab.rec.alert.AI.InterCluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; -import org.jlab.rec.ahdc.AI.PreClustering; +import org.jlab.rec.alert.AI.PreClustering; import java.util.ArrayList; import java.util.List; -public class Track { +/** A track candidate: the output of a track finder. + * + *

A candidate is a set of hits grouped into {@link AHDCCluster}s (and the + * derived {@link InterCluster}s). It is not a fitted track — fitting + * consumes a {@code TrackCandidate} and produces a {@link Track}.

+ * + *

A candidate carries a {@link CandidateType} describing its specialization + * (AHDC-only, AHDC+ATOF, ...). The type is what dictates how the candidate is + * fitted downstream.

+ */ +public class TrackCandidate { private double _Distance; - private List _Clusters = new ArrayList<>(); + private List _Clusters = new ArrayList<>(); private List _InterClusters = new ArrayList<>(); private boolean _Used = false; private final ArrayList hits = new ArrayList<>(); - + private int trackId = -1; ///< id of the track private int n_hits = 0; ///< number of hits private int sum_adc = 0; ///< sum of adc (adc) - private double sum_residuals = 0; ///< sum of residuals (mm) - private double chi2 = 0; ///< sum of residuals^2 (mm^2) - // AHDC::track - private double x0 = 0; - private double y0 = 0; - private double z0 = 0; - private double px0 = 0; - private double py0 = 0; - private double pz0 = 0; - private double dEdx = 0; ///< deposited energy per path length (adc/mm) - private double p_drift = 0; ///< momentum in the drift region (MeV) - private double path = 0; ///< length of the track (mm) + + /** Candidate specialization — defaults to AHDC-only; finders that build + * AHDC+ATOF candidates (GNN) override it via {@link #setType}. */ + private CandidateType type = CandidateType.AHDC_ONLY; + /** ATOF hits attached to this candidate (non-empty only for AHDC_ATOF). */ + private final List atofHits = new ArrayList<>(); // AHDC::aiprediction private int predicted_ATOF_sector = -1; private int predicted_ATOF_layer = -1; private int predicted_ATOF_wedge = -1; - public Track(List clusters) { + public TrackCandidate(List clusters) { this._Clusters = clusters; this._Distance = 0; for (int i = 0; i < clusters.size() - 1; i++) { @@ -51,43 +53,12 @@ public Track(List clusters) { generateInterClusterList(); } - public Track(ArrayList hitslist) { + public TrackCandidate(ArrayList hitslist) { hits.addAll(hitslist); - this.x0 = 0.0; - this.y0 = 0.0; - this.z0 = 0.0; - double p = 150.0;//MeV/c - //take first hit. - Hit hit = hitslist.get(0); - double phi = Math.atan2(hit.getY(), hit.getX()); - //hitslist. - this.px0 = p*Math.sin(phi); - this.py0 = p*Math.cos(phi); - this.pz0 = 0.0; } - public void setPositionAndMomentum(HelixFitObject helixFitObject) { - this.x0 = helixFitObject.get_X0(); - this.y0 = helixFitObject.get_Y0(); - this.z0 = helixFitObject.get_Z0(); - this.px0 = helixFitObject.get_px(); - this.py0 = helixFitObject.get_py(); - this.pz0 = helixFitObject.get_pz(); - this.chi2 = helixFitObject.get_Chi2(); - this.path = helixFitObject.get_path(); - } - - public void setPositionAndMomentumVec(double[] x) { - this.x0 = x[0]; - this.y0 = x[1]; - this.z0 = x[2]; - this.px0 = x[3]; - this.py0 = x[4]; - this.pz0 = x[5]; - } - private void generateHitList() { - for (Cluster cluster : _Clusters) { + for (AHDCCluster cluster : _Clusters) { for (PreCluster preCluster : cluster.get_PreClusters_list()) { hits.addAll(preCluster.get_hits_list()); } @@ -111,14 +82,14 @@ public ArrayList getHits() { @Override public String toString() { - return "Track{" + "_Clusters=" + _Clusters + '}'; + return "TrackCandidate{" + "_Clusters=" + _Clusters + '}'; } public double get_Distance() { return _Distance; } - public List get_Clusters() { + public List get_Clusters() { return _Clusters; } @@ -134,34 +105,26 @@ public void set_Used(boolean _Used) { this._Used = _Used; } - public double get_X0() { - return x0; + public CandidateType getType() { + return type; } - public double get_Y0() { - return y0; + public void setType(CandidateType type) { + this.type = type; } - public double get_Z0() { - return z0; + public List getAtofHits() { + return atofHits; } - public double get_px() { - return px0; + public void addAtofHit(AtofHitStub hit) { + atofHits.add(hit); } - public double get_py() { - return py0; - } - - public double get_pz() { - return pz0; - } - - public void set_trackId(int _trackId) { + public void set_trackId(int _trackId) { trackId = _trackId; // set trackId for clusters - for(Cluster cluster : this._Clusters) { + for(AHDCCluster cluster : this._Clusters) { cluster.set_trackId(_trackId); } // set trackId for interclusters @@ -175,8 +138,6 @@ public void set_trackId(int _trackId) { } public void set_n_hits(int _n_hits) { n_hits = _n_hits;} public void set_sum_adc(int _sum_adc) { sum_adc = _sum_adc;} - public void set_chi2(double _chi2) { chi2 = _chi2;} - public void set_sum_residuals(double _sum_residuals) { sum_residuals = _sum_residuals;} public int get_trackId() {return trackId;} public int get_n_hits() { if (hits == null) { @@ -194,26 +155,6 @@ public int get_sum_adc() { } return sum; } - public double get_chi2() {return chi2;} - public double get_sum_residuals() {return sum_residuals;} - // AHDC::track - public void set_dEdx(double _dEdx) { dEdx = _dEdx;} - public void set_p_drift(double _p_drift) { p_drift = _p_drift;} - public void set_path(double _path) { path = _path;} - public double get_dEdx() { - if (path <= 0) { - dEdx = 0; - }else { - int sum = 0; - for (Hit h : hits) { - sum += (int) Math.round(h.getADC()); - } - dEdx = sum/path; - } - return dEdx; - } - public double get_p_drift() {return p_drift;} - public double get_path() {return path;} // AHDC::aiprediction public void set_predicted_ATOF_sector(int s) {predicted_ATOF_sector = s;} @@ -223,4 +164,4 @@ public double get_dEdx() { public int get_predicted_ATOF_layer() {return predicted_ATOF_layer;} public int get_predicted_ATOF_wedge() {return predicted_ATOF_wedge;} -} \ No newline at end of file +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/AITrackFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/AITrackFinder.java new file mode 100644 index 0000000000..451397e749 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/AITrackFinder.java @@ -0,0 +1,95 @@ +package org.jlab.rec.alert.TrackFinding; + +import org.jlab.rec.alert.AI.AIPrediction; +import org.jlab.rec.alert.AI.InterCluster; +import org.jlab.rec.alert.AI.ModelTrackFinding; +import org.jlab.rec.alert.AI.PreClustering; +import org.jlab.rec.alert.AI.TrackCandidatesGenerator; +import org.jlab.rec.alert.AI.TrackPrediction; +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.ahdc.PreCluster.PreCluster; +import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; +import org.jlab.rec.alert.Track.AtofHitStub; +import org.jlab.rec.alert.Track.TrackCandidate; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.logging.Logger; + +public class AITrackFinder implements TrackFinder { + + private static final Logger LOGGER = Logger.getLogger(AITrackFinder.class.getName()); + + private static final double TRACK_FINDING_AI_THRESHOLD = 0.2; + private static final int MAX_HITS_FOR_AI = 300; + + private final ModelTrackFinding model; + private final TrackFinder fallback; + + public AITrackFinder() { + this.model = new ModelTrackFinding(); + this.fallback = new DistanceTrackFinder(); + } + + @Override + public TrackFinderResult findTracks(ArrayList hits, List atofHits) { + // Safety: too many hits → fall back to conventional track finding for this event + if (hits.size() > MAX_HITS_FOR_AI) { + LOGGER.info("Too many AHDC_Hits in AHDC::adc, rely on conventional track finding for this event"); + return fallback.findTracks(hits, atofHits); + } + + // Preclustering + PreClusterFinder pcf = new PreClusterFinder(); + pcf.findPreclusters(hits); + ArrayList preclusters = pcf.get_AHDCPreClusters(); + + // 1) Create inter-clusters from pre-clusters + PreClustering preClustering = new PreClustering(); + ArrayList inter_clusters = preClustering.mergePreclusters(preclusters); + + // 2) Create track candidates from inter-clusters + ArrayList> tracks_candidates = new ArrayList<>(); + TrackCandidatesGenerator trackCandidatesGenerator = new TrackCandidatesGenerator(); + boolean success = trackCandidatesGenerator.getAllPossibleTrack(inter_clusters, tracks_candidates); + + if (!success) { + LOGGER.severe("Too many track candidates find by the AI, exiting..."); + return TrackFinderResult.invalid(); + } + + // 3) Use AI model to evaluate track candidates + ArrayList predictions; + try { + AIPrediction aiPrediction = new AIPrediction(); + predictions = aiPrediction.prediction(tracks_candidates, model); + } catch (Exception e) { + throw new RuntimeException(e); + } + + // 4) Select good tracks via greedy non-overlap: sort predictions by score + // descending, accept the highest-scoring prediction, mark its PreClusters + // as claimed, and skip any later prediction that reuses a claimed PreCluster. + // The AI candidate generator routinely emits overlapping predictions (each + // PreCluster can feed several combinations), and because set_trackId mutates + // the shared Hit references in place, a naive "accept all above threshold" + // pass would let later tracks silently steal earlier tracks' hits and leave + // them orphaned in AHDC::hits. Greedy selection enforces one-hit-one-track. + predictions.sort((a, b) -> Float.compare(b.getPrediction(), a.getPrediction())); + Set claimedPreclusters = new HashSet<>(); + ArrayList tracks = new ArrayList<>(); + for (TrackPrediction t : predictions) { + if (t.getPrediction() <= TRACK_FINDING_AI_THRESHOLD) continue; + boolean overlaps = false; + for (PreCluster pc : t.getPreclusters()) { + if (claimedPreclusters.contains(pc)) { overlaps = true; break; } + } + if (overlaps) continue; + claimedPreclusters.addAll(t.getPreclusters()); + tracks.add(new TrackCandidate(t.getClusters())); + } + return TrackFinderResult.ok(tracks); + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/DistanceTrackFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/DistanceTrackFinder.java new file mode 100644 index 0000000000..3e3f4af912 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/DistanceTrackFinder.java @@ -0,0 +1,33 @@ +package org.jlab.rec.alert.TrackFinding; + +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCClusterFinder; +import org.jlab.rec.ahdc.Distance.Distance; +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.ahdc.PreCluster.PreCluster; +import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; +import org.jlab.rec.alert.Track.AtofHitStub; +import org.jlab.rec.alert.Track.TrackCandidate; + +import java.util.ArrayList; +import java.util.List; + +public class DistanceTrackFinder implements TrackFinder { + + @Override + public TrackFinderResult findTracks(ArrayList hits, List atofHits) { + PreClusterFinder pcf = new PreClusterFinder(); + pcf.findPreclusters(hits); + ArrayList preclusters = pcf.get_AHDCPreClusters(); + + AHDCClusterFinder cf = new AHDCClusterFinder(); + cf.findCluster(preclusters); + ArrayList clusters = cf.get_AHDCClusters(); + + Distance distance = new Distance(); + distance.find_track(clusters); + ArrayList tracks = distance.get_AHDCTrackCandidates(); + + return TrackFinderResult.ok(tracks); + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/GNNTrackFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/GNNTrackFinder.java new file mode 100644 index 0000000000..51610fb539 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/GNNTrackFinder.java @@ -0,0 +1,48 @@ +package org.jlab.rec.alert.TrackFinding; + +import org.jlab.rec.alert.AI.GNNPrediction; +import org.jlab.rec.alert.AI.ModelTrackFindingGNN; +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.alert.Track.AtofHitStub; +import org.jlab.rec.alert.Track.TrackCandidate; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + +/** GravNet-based track finder. Builds a per-event hit graph from the AHDC + * hits and (when present) the ATOF::hits bank, runs the exported edge + * scorer, extracts tracks via connected components on edges with score + * ≥ 0.1, and packages each surviving track as a {@link TrackCandidate} + * backed by per-superlayer {@link org.jlab.rec.ahdc.AHDCCluster.AHDCCluster}s. + */ +public class GNNTrackFinder implements TrackFinder { + + private static final Logger LOGGER = Logger.getLogger(GNNTrackFinder.class.getName()); + + /** Above this hit count the graph builder + GNN inference is too slow to + * be useful, so the event is skipped (no GNN tracks produced). */ + private static final int MAX_HITS_FOR_GNN = 500; + + private final ModelTrackFindingGNN model; + private final GNNPrediction predictor; + + public GNNTrackFinder() { + this.model = new ModelTrackFindingGNN(); + this.predictor = new GNNPrediction(); + } + + /** With an empty {@code atofHits} list the GNN still runs on AHDC-only graphs. */ + @Override + public TrackFinderResult findTracks(ArrayList ahdcHits, List atofHits) { + if (ahdcHits == null || ahdcHits.size() > MAX_HITS_FOR_GNN) { + if (ahdcHits != null) { + LOGGER.info("Too many AHDC_Hits in AHDC::hits, skipping GNN track finding for this event"); + } + return TrackFinderResult.ok(new ArrayList<>()); + } + + ArrayList tracks = predictor.prediction(ahdcHits, atofHits, model); + return TrackFinderResult.ok(tracks); + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/HoughTrackFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/HoughTrackFinder.java new file mode 100644 index 0000000000..1a850ff94a --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/HoughTrackFinder.java @@ -0,0 +1,33 @@ +package org.jlab.rec.alert.TrackFinding; + +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCClusterFinder; +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.ahdc.HoughTransform.HoughTransform; +import org.jlab.rec.ahdc.PreCluster.PreCluster; +import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; +import org.jlab.rec.alert.Track.AtofHitStub; +import org.jlab.rec.alert.Track.TrackCandidate; + +import java.util.ArrayList; +import java.util.List; + +public class HoughTrackFinder implements TrackFinder { + + @Override + public TrackFinderResult findTracks(ArrayList hits, List atofHits) { + PreClusterFinder pcf = new PreClusterFinder(); + pcf.findPreclusters(hits); + ArrayList preclusters = pcf.get_AHDCPreClusters(); + + AHDCClusterFinder cf = new AHDCClusterFinder(); + cf.findCluster(preclusters); + ArrayList clusters = cf.get_AHDCClusters(); + + HoughTransform hough = new HoughTransform(); + hough.find_tracks(clusters); + ArrayList tracks = hough.get_AHDCTrackCandidates(); + + return TrackFinderResult.ok(tracks); + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinder.java new file mode 100644 index 0000000000..e8f9a26e74 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinder.java @@ -0,0 +1,17 @@ +package org.jlab.rec.alert.TrackFinding; + +import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.alert.Track.AtofHitStub; + +import java.util.ArrayList; +import java.util.List; + +public interface TrackFinder { + + /** Find tracks from AHDC hits, optionally using attached ATOF hits as + * additional context (e.g. GNN builds a joint AHDC + ATOF hit graph). + * Implementations that don't use ATOF should ignore the + * {@code atofHits} parameter; it may be empty when no ATOF bank is + * present in the event. */ + TrackFinderResult findTracks(ArrayList ahdcHits, List atofHits); +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinderResult.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinderResult.java new file mode 100644 index 0000000000..e5c9691b91 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackFinding/TrackFinderResult.java @@ -0,0 +1,33 @@ +package org.jlab.rec.alert.TrackFinding; + +import org.jlab.rec.alert.Track.TrackCandidate; + +import java.util.Collections; +import java.util.List; + +public class TrackFinderResult { + + private final List tracks; + private final boolean valid; + + public TrackFinderResult(List tracks, boolean valid) { + this.tracks = tracks; + this.valid = valid; + } + + public static TrackFinderResult ok(List tracks) { + return new TrackFinderResult(tracks, true); + } + + public static TrackFinderResult invalid() { + return new TrackFinderResult(Collections.emptyList(), false); + } + + public List getTracks() { + return tracks; + } + + public boolean isValid() { + return valid; + } +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackMatchingAI/ModelTrackMatching.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackMatchingAI/ModelTrackMatching.java index 409a14c1bd..94e627c4ee 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackMatchingAI/ModelTrackMatching.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/TrackMatchingAI/ModelTrackMatching.java @@ -15,7 +15,7 @@ import ai.djl.translate.TranslatorContext; import ai.djl.util.Pair; -import org.jlab.rec.ahdc.AI.InterCluster; +import org.jlab.rec.alert.AI.InterCluster; import org.jlab.utils.CLASResources; import java.io.IOException; diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index 9d3cc1b023..b52d306f7a 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -5,23 +5,13 @@ import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; import org.jlab.io.hipo.HipoDataSync; -import org.jlab.rec.ahdc.AI.*; import org.jlab.rec.ahdc.Banks.RecoBankWriter; -import org.jlab.rec.ahdc.Cluster.Cluster; -import org.jlab.rec.ahdc.Cluster.ClusterFinder; -import org.jlab.rec.ahdc.DocaCluster.DocaClusterRefiner; -import org.jlab.rec.ahdc.DocaCluster.DocaCluster; -import org.jlab.rec.ahdc.Distance.Distance; -import org.jlab.rec.ahdc.HelixFit.HelixFitJava; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.ahdc.Hit.HitReader; -import org.jlab.rec.ahdc.HoughTransform.HoughTransform; -import org.jlab.rec.ahdc.PreCluster.PreCluster; -import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; -import org.jlab.rec.ahdc.Track.Track; -import org.jlab.rec.ahdc.ModeTrackFinding; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Logger; import org.jlab.detector.calib.utils.DatabaseConstantProvider; @@ -32,22 +22,14 @@ /** AHDCEngine reconstruction service. * - * AHDC Reconstruction using only AHDC information. - * - * Reconstruction utilizing other detectors (i.e. ATOF) are - * implemented in ALERTEngine. + * Reads AHDC::adc, applies calibration, and writes calibrated AHDC::hits. * + * Track finding (preclustering, AI/CV track finders, DOCA refinement, + * helix fit) lives in ALERTEngine. */ public class AHDCEngine extends ReconstructionEngine { static final Logger LOGGER = Logger.getLogger(AHDCEngine.class.getName()); - private boolean simulation = false; - - private ModelTrackFinding modelTrackFinding; - private ModeTrackFinding modeTrackFinding = ModeTrackFinding.AI_Track_Finding; - static final double TRACK_FINDING_AI_THRESHOLD = 0.2; - static final int MAX_HITS_FOR_AI = 300; - private AlertDCDetector factory = null; private ModeAHDC ahdcExtractor = new ModeAHDC(); @@ -62,11 +44,6 @@ public class AHDCEngine extends ReconstructionEngine { public AHDCEngine() { super("ALERT", "ouillon", "1.0.1"); } - public boolean init(ModeTrackFinding m) { - modeTrackFinding = m; - return init(); - } - @Override public void detectorChanged(int run) { // FIXME: move geometry initialization here @@ -77,10 +54,6 @@ public boolean init() { factory = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider()); - String modeConfig = this.getEngineConfigString("Mode"); - if (modeConfig != null) modeTrackFinding = ModeTrackFinding.valueOf(modeConfig); - if (modeTrackFinding == ModeTrackFinding.AI_Track_Finding) modelTrackFinding = new ModelTrackFinding(); - Map tableMap = new HashMap<>(); tableMap.put("/calibration/alert/ahdc/time_offsets", 3); tableMap.put("/calibration/alert/ahdc/time_to_distance_wire", 3); @@ -89,8 +62,8 @@ public boolean init() { tableMap.put("/calibration/alert/ahdc/time_over_threshold", 3); requireConstants(tableMap); - this.getConstantsManager().setVariation("default"); - this.registerOutputBank("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::mc","AHDC::ai:prediction","AHDC::interclusters","AHDC::docaclusters"); + this.getConstantsManager().setVariation("default"); + this.registerOutputBank("AHDC::hits"); return true; } @@ -98,8 +71,6 @@ public boolean init() { @Override public boolean processDataEventUser(DataEvent event) { - if(event.hasBank("MC::Particle")) simulation = true; - ahdcExtractor.update(30, null, event, "AHDC::wf", "AHDC::adc"); if (event.hasBank("RUN::config")) { @@ -120,155 +91,15 @@ public boolean processDataEventUser(DataEvent event) { } if (event.hasBank("AHDC::adc")) { - // I) Read raw hits + boolean simulation = event.hasBank("MC::Particle"); HitReader hitReader = new HitReader(event, factory, simulation, ahdcRawHitCutsTable, ahdcTimeOffsetsTable, ahdcTimeToDistanceWireTable, ahdcTimeOverThresholdTable, ahdcAdcGainsTable); ArrayList AHDC_Hits = hitReader.get_AHDCHits(); - // II) Create PreClusters - PreClusterFinder preclusterfinder = new PreClusterFinder(); - preclusterfinder.findPreclusters(AHDC_Hits); - ArrayList AHDC_PreClusters = preclusterfinder.get_AHDCPreClusters(); - - - // III) Track Finding: Input = PreClusters, Output = Tracks - // During track finding we build Clusters and InterClusters. Each of these objects must be assigned a Track ID so we can: - // - identify which track they belong to, - // - write them properly into the output banks later, - // - and reuse them downstream in the ALERT Engine. - // - // If using AI-based track finding, tracks are identified using inter-clusters. - // Otherwise, the conventional methods (Hough Transform or distance) use clusters. - - // Safety check: if too many hits, rely on conventional track finding - ModeTrackFinding effectiveMode = modeTrackFinding; - if (AHDC_Hits.size() > MAX_HITS_FOR_AI) { - LOGGER.info("Too many AHDC_Hits in AHDC::adc, rely on conventional track finding for this event"); - effectiveMode = ModeTrackFinding.CV_Distance; - } - - ArrayList AHDC_Tracks = new ArrayList<>(); - - if (effectiveMode == ModeTrackFinding.AI_Track_Finding) { - // 1) Create inter-clusters from pre-clusters - PreClustering preClustering = new PreClustering(); - ArrayList inter_clusters = preClustering.mergePreclusters(AHDC_PreClusters); - - // 2) Create track candidates from inter-clusters - ArrayList> tracks_candidates = new ArrayList<>(); - TrackCandidatesGenerator trackCandidatesGenerator = new TrackCandidatesGenerator(); - boolean success = trackCandidatesGenerator.getAllPossibleTrack(inter_clusters, tracks_candidates); - - if (!success) { - LOGGER.severe("Too many track candidates find by the AI, exiting..."); - return false; - } - - // 3) Use AI model to evaluate track candidates - ArrayList predictions = new ArrayList<>(); - try { - AIPrediction aiPrediction = new AIPrediction(); - predictions = aiPrediction.prediction(tracks_candidates, modelTrackFinding); - } catch (Exception e) { - throw new RuntimeException(e); - } - - // 4) Select good tracks via greedy non-overlap: sort predictions by score - // descending, accept the highest-scoring prediction, mark its PreClusters - // as claimed, and skip any later prediction that reuses a claimed PreCluster. - // The AI candidate generator routinely emits overlapping predictions (each - // PreCluster can feed several combinations), and because set_trackId mutates - // the shared Hit references in place, a naive "accept all above threshold" - // pass would let later tracks silently steal earlier tracks' hits and leave - // them orphaned in AHDC::hits. Greedy selection enforces one-hit-one-track. - predictions.sort((a, b) -> Float.compare(b.getPrediction(), a.getPrediction())); - Set claimedPreclusters = new HashSet<>(); - for (TrackPrediction t : predictions) { - if (t.getPrediction() <= TRACK_FINDING_AI_THRESHOLD) continue; - boolean overlaps = false; - for (PreCluster pc : t.getPreclusters()) { - if (claimedPreclusters.contains(pc)) { overlaps = true; break; } - } - if (overlaps) continue; - claimedPreclusters.addAll(t.getPreclusters()); - AHDC_Tracks.add(new Track(t.getClusters())); - } - } - else { - // Conventional Track Finding: Hough Transform or Distance: use cluster informations to find tracks - // 1) Create clusters from pre-clusters - ClusterFinder clusterfinder = new ClusterFinder(); - clusterfinder.findCluster(AHDC_PreClusters); - ArrayList AHDC_Clusters = clusterfinder.get_AHDCClusters(); - - // 2) Find tracks using the selected conventional method - if (effectiveMode == ModeTrackFinding.CV_Distance) { - Distance distance = new Distance(); - distance.find_track(AHDC_Clusters); - AHDC_Tracks = distance.get_AHDCTracks(); - } - else if (effectiveMode == ModeTrackFinding.CV_Hough) { - HoughTransform houghtransform = new HoughTransform(); - houghtransform.find_tracks(AHDC_Clusters); - AHDC_Tracks = houghtransform.get_AHDCTracks(); - } - } - - - //Temporary track method ONLY for MC with no background; - //AHDC_Tracks.add(new Track(AHDC_Hits)); - - // V) Global fit - int trackid = 0; - ArrayList all_docaClusters = new ArrayList<>(); - AHDC_Tracks.removeIf(track -> track.get_Clusters().size() < 3); - for (Track track : AHDC_Tracks) { - trackid++; - track.set_trackId(trackid); - List originalClusters = track.get_Clusters(); - ArrayList docaClusters = DocaClusterRefiner.buildRefinedClusters(originalClusters); - all_docaClusters.addAll(docaClusters); - if (docaClusters == null || docaClusters.size() < 3 || originalClusters == null || originalClusters.size() < 3) { - // not enough points, skip helix fit - continue; - } - HelixFitJava h = new HelixFitJava(); - track.setPositionAndMomentum(h.helix_fit_with_doca_selection(docaClusters, 1)); - } - - // VII) Write bank RecoBankWriter writer = new RecoBankWriter(); - - DataBank recoHitsBank = writer.fillAHDCHitsBank(event, AHDC_Hits); - DataBank recoPreClusterBank = writer.fillPreClustersBank(event, AHDC_PreClusters); - ArrayList AHDC_Clusters = new ArrayList<>(); - for (Track track : AHDC_Tracks) { - AHDC_Clusters.addAll(track.get_Clusters()); - } - DataBank recoClusterBank = writer.fillClustersBank(event, AHDC_Clusters); - DataBank recoTracksBank = writer.fillAHDCTrackBank(event, AHDC_Tracks); - DataBank clustersDocaBank = writer.fillAHDCDocaClustersBank(event, all_docaClusters); - - ArrayList all_interclusters = new ArrayList<>(); - for (Track track : AHDC_Tracks) { - all_interclusters.addAll(track.getInterclusters()); - } - DataBank recoInterClusterBank = writer.fillInterClusterBank(event, all_interclusters); - - //event.removeBanks("AHDC::hits","AHDC::preclusters","AHDC::clusters","AHDC::track","AHDC::kftrack","AHDC::mc","AHDC::ai:prediction"); - event.appendBank(recoHitsBank); - event.appendBank(recoPreClusterBank); - event.appendBank(recoClusterBank); - event.appendBank(recoTracksBank); - event.appendBank(recoInterClusterBank); - event.appendBank(clustersDocaBank); - - if (simulation) { - DataBank recoMCBank = writer.fillAHDCMCTrackBank(event); - event.appendBank(recoMCBank); - } - + DataBank recoHitsBank = writer.fillAHDCHitsBank(event, AHDC_Hits); + if (recoHitsBank != null) event.appendBank(recoHitsBank); } return true; } @@ -279,7 +110,6 @@ public static void main(String[] args) { int nEvent = 0; int maxEvent = 10; - int myEvent = 3; String inputFile = "output1.hipo"; String outputFile = "output.hipo"; @@ -291,24 +121,17 @@ public static void main(String[] args) { HipoDataSource reader = new HipoDataSource(); - // en.init(); - en.init(ModeTrackFinding.AI_Track_Finding); + en.init(); reader.open(inputFile); - // SchemaFactory factory = reader.getReader().getSchemaFactory(); HipoDataSync writer = new HipoDataSync(); writer.open(outputFile); while (reader.hasEvent() && nEvent < maxEvent) { nEvent++; - // if (nEvent % 100 == 0) System.out.println("nEvent = " + nEvent); DataEvent event = reader.getNextEvent(); System.out.println("Event: " + nEvent); - // if (nEvent != myEvent) continue; - // System.out.println("*********** NEXT EVENT ************"); - // event.show(); - en.processDataEvent(event); writer.writeEvent(event); @@ -317,4 +140,4 @@ public static void main(String[] args) { System.out.println("finished " + (System.nanoTime() - starttime) * Math.pow(10, -9)); } -} \ No newline at end of file +} diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index 36bbdac3bf..c54a7636e5 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -4,6 +4,9 @@ import ai.djl.translate.TranslateException; import java.io.File; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.HashMap; @@ -24,13 +27,30 @@ import org.jlab.rec.alert.banks.RecoBankWriter; import org.jlab.rec.alert.projections.TrackProjector; import org.jlab.rec.atof.hit.ATOFHit; +import org.jlab.rec.alert.AI.InterCluster; +import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; +import org.jlab.rec.ahdc.DocaCluster.DocaCluster; +import org.jlab.rec.ahdc.DocaCluster.DocaClusterRefiner; +import org.jlab.rec.ahdc.HelixFit.HelixFitJava; import org.jlab.rec.ahdc.KalmanFilter.KalmanFilter; +import org.jlab.rec.ahdc.TrackFindingMode; +import org.jlab.rec.ahdc.PreCluster.PreCluster; +import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.alert.TrackFinding.AITrackFinder; +import org.jlab.rec.alert.TrackFinding.DistanceTrackFinder; +import org.jlab.rec.alert.TrackFinding.GNNTrackFinder; +import org.jlab.rec.alert.TrackFinding.HoughTrackFinder; +import org.jlab.rec.alert.TrackFinding.TrackFinder; +import org.jlab.rec.alert.TrackFinding.TrackFinderResult; import org.jlab.geom.detector.alert.AHDC.AlertDCDetector; import org.jlab.geom.detector.alert.AHDC.AlertDCFactory; -import org.jlab.rec.ahdc.Track.Track; +import org.jlab.rec.alert.Track.AtofHitStub; +import org.jlab.rec.alert.Track.Track; +import org.jlab.rec.alert.Track.TrackCandidate; import org.jlab.clas.pdg.PDGDatabase; import org.jlab.clas.pdg.PDGParticle; +import java.util.List; import java.util.logging.Logger; @@ -39,11 +59,29 @@ import org.jlab.rec.alert.AIPID.PrePIDResult; -/** +/** *

ALERTEngine reconstruction service.

* + *

YAML configuration

+ * + * All settings the engine reads from the reconstruction YAML, shown with their + * default values: + * + *
{@code
+ * services:
+ *   - class: org.jlab.service.alert.ALERTEngine
+ *     name: ALERT
+ *
+ * configuration:
+ *   services:
+ *     ALERT:
+ *       Mode: "AI_GNN"   # track-finding strategy; see TrackFindingMode
+ *                        # (AI_MLP | CV_Distance | CV_Hough | AI_GNN)
+ * }
+ * * @author Whit Armstrong * @author Noemie Pilleux + * @author Mathieu Ouillon * @since 2025-04-03 */ public class ALERTEngine extends ReconstructionEngine { @@ -60,7 +98,7 @@ public class ALERTEngine extends ReconstructionEngine { * */ private RecoBankWriter rbc; - static final Logger LOGGER = Logger.getLogger(ModelPrePID.class.getName()); + static final Logger LOGGER = Logger.getLogger(ALERTEngine.class.getName()); Detector ATOF; // ALERT ATOF detector private AlertDCDetector AHDC; // ALERT AHDC detector @@ -75,6 +113,10 @@ public class ALERTEngine extends ReconstructionEngine { private ModelTrackMatching modelTrackMatching; private ModelPrePID modelPrePID; + // AHDC track-finding strategy (driven by ALERT.Mode YAML key) + private TrackFinder trackFinder; + private final org.jlab.rec.ahdc.Banks.RecoBankWriter ahdcWriter = new org.jlab.rec.ahdc.Banks.RecoBankWriter(); + // AHDC calibration table (refreshed on run change) private IndexedTable ahdcAdcGainsTable; @@ -109,19 +151,33 @@ public boolean init() { modelPrePID = new ModelPrePID(); AlertTOFFactory factory = new AlertTOFFactory(); + + // One CCDB session for both ATOF and AHDC geometry. DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); ATOF = factory.createDetectorCLAS(cp); - AHDC = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider()); + AHDC = (new AlertDCFactory()).createDetectorCLAS(cp); Map tableMap = new HashMap<>(); tableMap.put("/calibration/alert/ahdc/gains", 3); requireConstants(tableMap); this.getConstantsManager().setVariation("default"); - if(this.getEngineConfigString("Mode")!=null) { - //if (Objects.equals(this.getEngineConfigString("Mode"), Mode.AI_Track_Finding.name())) - // mode = Mode.AI_Track_Finding; + TrackFindingMode mode = TrackFindingMode.AI_GNN; + String modeConfig = this.getEngineConfigString("Mode"); + if (modeConfig != null) mode = TrackFindingMode.valueOf(modeConfig); + switch (mode) { + case AI_MLP: trackFinder = new AITrackFinder(); break; + case CV_Distance: trackFinder = new DistanceTrackFinder(); break; + case CV_Hough: trackFinder = new HoughTrackFinder(); break; + case AI_GNN: trackFinder = new GNNTrackFinder(); break; } + + this.registerOutputBank( + "AHDC::preclusters", "AHDC::clusters", "AHDC::track", + "AHDC::interclusters", "AHDC::docaclusters", "AHDC::ai:prediction", + "AHDC::mc", "AHDC::kftrack", + "ALERT::projections", "ALERT::ai:projections", "ALERT::prePID"); + return true; } @@ -137,9 +193,7 @@ public boolean init() { @Override public boolean processDataEventUser(DataEvent event) { - if (!event.hasBank("AHDC::adc")) - return false; - if (!event.hasBank("ATOF::tdc")) + if (!event.hasBank("AHDC::adc")) return false; if (!event.hasBank("RUN::config")) { @@ -157,7 +211,129 @@ public boolean processDataEventUser(DataEvent event) { run.set(newRun); ahdcAdcGainsTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/ahdc/gains"); } - + + // =========================================================================== + // AHDC track-finding pipeline (preclustering, track finder, DOCA, helix fit) + // Originally lived in AHDCEngine; runs here so AHDCEngine is hits-only. + // Reads AHDC::hits produced by AHDCEngine, mutates Hit.trackId during finding, + // then rewrites AHDC::hits and writes the cluster/track/intercluster banks. + // =========================================================================== + boolean simulation = event.hasBank("MC::Particle"); + + if (event.hasBank("AHDC::hits")) { + + // I) Reconstruct Hit list from AHDC::hits bank + DataBank ahdcHitBank = event.getBank("AHDC::hits"); + ArrayList AHDC_Hits = new ArrayList<>(); + for (int row = 0; row < ahdcHitBank.rows(); row++) { + int id = ahdcHitBank.getShort("id", row); + int superlayer = ahdcHitBank.getByte("superlayer", row); + int layer = ahdcHitBank.getByte("layer", row); + int wire = ahdcHitBank.getInt("wire", row); + int adc = ahdcHitBank.getInt("adc", row); + double doca = ahdcHitBank.getDouble("doca", row); + double time = ahdcHitBank.getDouble("time", row); + double tot = ahdcHitBank.getDouble("timeOverThreshold", row); + Hit hit = new Hit(id, superlayer, layer, wire, doca, adc, time); + hit.setWirePosition(AHDC); + hit.setADC(adc); + hit.setToT(tot); + AHDC_Hits.add(hit); + } + + // II) Track Finding via the strategy selected in init() (ALERT.Mode YAML key). + // The implementation owns its own preclustering, cluster building, and any + // mode-specific safety fallbacks (e.g. AITrackFinder delegates to Distance + // when the hit count exceeds its MAX_HITS_FOR_AI threshold). The ATOF hits + // are passed for finders that build joint AHDC+ATOF graphs (GNN); the + // AHDC-only finders ignore them. + List atofHitsForGNN = extractAtofHits(event); + TrackFinderResult trackResult = trackFinder.findTracks(AHDC_Hits, atofHitsForGNN); + if (!trackResult.isValid()) { + return false; + } + ArrayList AHDC_Candidates = new ArrayList<>(trackResult.getTracks()); + + // Preclusters are also written to AHDC::preclusters as a diagnostic bank; + // PreClusterFinder is idempotent on Hit.use, so re-running it here is safe. + PreClusterFinder preclusterfinder = new PreClusterFinder(); + preclusterfinder.findPreclusters(AHDC_Hits); + ArrayList AHDC_PreClusters = preclusterfinder.get_AHDCPreClusters(); + + // IV) Global fit: DOCA refinement + helix fit. + // Each surviving TrackCandidate is fitted into a Track; the fit is + // dispatched on the candidate's CandidateType (see the switch below). + int trackid = 0; + ArrayList all_docaClusters = new ArrayList<>(); + AHDC_Candidates.removeIf(cand -> cand.get_Clusters().size() < 3); + ArrayList AHDC_Tracks = new ArrayList<>(); + for (TrackCandidate cand : AHDC_Candidates) { + trackid++; + cand.set_trackId(trackid); + // Every surviving candidate yields an AHDC::track row, even if the + // helix fit below is skipped (its Track keeps zero parameters). + Track track = new Track(cand); + AHDC_Tracks.add(track); + List originalClusters = cand.get_Clusters(); + ArrayList docaClusters = DocaClusterRefiner.buildRefinedClusters(originalClusters); + all_docaClusters.addAll(docaClusters); + if (docaClusters == null || docaClusters.size() < 3 || originalClusters == null || originalClusters.size() < 3) { + // not enough points, skip helix fit + continue; + } + HelixFitJava h = new HelixFitJava(); + switch (cand.getType()) { + case AHDC_ATOF: + // EXTENSION HOOK: a future commit may incorporate + // cand.getAtofHits() as an additional fit constraint here. + // For now AHDC_ATOF fits exactly like AHDC_ONLY — the ATOF + // hits are carried on the candidate, not yet fitted. + case AHDC_ONLY: + case AHDC_VERTEX: + default: + track.setPositionAndMomentum(h.helix_fit_with_doca_selection(docaClusters, 1)); + break; + } + } + + // V) Replace AHDC::hits (now with trackId) and write track-finding output banks + DataBank recoHitsBank = ahdcWriter.fillAHDCHitsBank(event, AHDC_Hits); + DataBank recoPreClusterBank = ahdcWriter.fillPreClustersBank(event, AHDC_PreClusters); + ArrayList AHDC_Clusters = new ArrayList<>(); + for (Track track : AHDC_Tracks) { + AHDC_Clusters.addAll(track.get_Clusters()); + } + DataBank recoClusterBank = ahdcWriter.fillClustersBank(event, AHDC_Clusters); + DataBank recoTracksBank = ahdcWriter.fillAHDCTrackBank(event, AHDC_Tracks); + DataBank clustersDocaBank = ahdcWriter.fillAHDCDocaClustersBank(event, all_docaClusters); + + ArrayList all_interclusters = new ArrayList<>(); + for (Track track : AHDC_Tracks) { + all_interclusters.addAll(track.getInterclusters()); + } + DataBank recoInterClusterBank = ahdcWriter.fillInterClusterBank(event, all_interclusters); + + event.removeBank("AHDC::hits"); + event.appendBank(recoHitsBank); + event.appendBank(recoPreClusterBank); + event.appendBank(recoClusterBank); + event.appendBank(recoTracksBank); + event.appendBank(recoInterClusterBank); + event.appendBank(clustersDocaBank); + + if (simulation) { + DataBank recoMCBank = ahdcWriter.fillAHDCMCTrackBank(event); + event.appendBank(recoMCBank); + } + } + // =========================================================================== + + // ATOF-dependent processing follows. Bail out for events without ATOF::tdc + // so the AHDC track-finding output above stands on its own (matches the + // pre-refactor flow where AHDCEngine ran independently of ATOF presence). + if (!event.hasBank("ATOF::tdc")) + return false; + //Do we need to read the event vx,vy,vz? //If not, this part can be moved in the initialization of the engine. double eventVx=0,eventVy=0,eventVz=0; //They should be in CM @@ -199,50 +375,60 @@ public boolean processDataEventUser(DataEvent event) { } if (interClusters.size() != 5) continue; + float[] pred; try { + pred = modelTrackMatching.prediction(interClusters); + } catch (TranslateException ex) { + LOGGER.warning(() -> "Exception in ALERTEngine track matching: " + ex); + continue; + } + int sector_pred = (int) pred[0]; + int layer_pred = (int) pred[1]; + int wedge_pred = (int) pred[2]; + + // The matching model's three argmax heads can land outside the ATOF + // ranges (sectors 0-14, layers 0-3, wedges 0-9) when the input + // interclusters fall outside its training distribution; the ATOFHit + // geometry lookup chain returns null on a miss and would NPE. + if (sector_pred < 0 || sector_pred >= 15 + || layer_pred < 0 || layer_pred >= 4 + || wedge_pred < 0 || wedge_pred >= 10) { + continue; + } - float[] pred = modelTrackMatching.prediction(interClusters); - int sector_pred = (int) pred[0]; - int layer_pred = (int) pred[1]; - int wedge_pred = (int) pred[2]; - - ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0f, ATOF, null); - double pred_x = hit_pred.getX(); - double pred_y = hit_pred.getY(); - double pred_z = hit_pred.getZ(); + ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0f, ATOF, null); + double pred_x = hit_pred.getX(); + double pred_y = hit_pred.getY(); + double pred_z = hit_pred.getZ(); - double threshold = 20.0; - double minDistanceSquared = threshold * threshold; + double threshold = 20.0; + double minDistanceSquared = threshold * threshold; - ATOFHit matchAtofHit = null; // Could be used later - int matchHitId = -1; + ATOFHit matchAtofHit = null; // Could be used later + int matchHitId = -1; - for (int k = 0; k < bank_ATOFHits.rows(); k++) { - int component = bank_ATOFHits.getInt("component", k); - if (component == 10) continue; + for (int k = 0; k < bank_ATOFHits.rows(); k++) { + int component = bank_ATOFHits.getInt("component", k); + if (component == 10) continue; - int sector = bank_ATOFHits.getInt("sector", k); - int layer = bank_ATOFHits.getInt("layer", k); + int sector = bank_ATOFHits.getInt("sector", k); + int layer = bank_ATOFHits.getInt("layer", k); - ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0f, ATOF, null); + ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0f, ATOF, null); - double dx = pred_x - hit.getX(); - double dy = pred_y - hit.getY(); - double dz = pred_z - hit.getZ(); + double dx = pred_x - hit.getX(); + double dy = pred_y - hit.getY(); + double dz = pred_z - hit.getZ(); - double distanceSquared = dx * dx + dy * dy + dz * dz; + double distanceSquared = dx * dx + dy * dy + dz * dz; - if (distanceSquared < minDistanceSquared) { - minDistanceSquared = distanceSquared; - matchAtofHit = hit; - matchHitId = bank_ATOFHits.getInt("id", k); - } + if (distanceSquared < minDistanceSquared) { + minDistanceSquared = distanceSquared; + matchAtofHit = hit; + matchHitId = bank_ATOFHits.getInt("id", k); } - matched_ATOF_hit_id.add(new Pair<>(track_id, matchHitId)); - - } catch (Exception ex) { - System.out.println("Exception in ALERTEngine processDataEvent: " + ex); // TODO: proper logging } + matched_ATOF_hit_id.add(new Pair<>(track_id, matchHitId)); } rbc.appendTrackMatchingAIBank(event, matched_ATOF_hit_id); @@ -362,15 +548,14 @@ public boolean processDataEventUser(DataEvent event) { AHDC_hits.add(hit); } } - // Initialise the position and the momentum using the information of the AHDC::track - // position : mm - // momentum : MeV - // Invariant: AHDC_hits is non-empty. AHDCEngine's AI_Track_Finding path uses greedy + // Rebuild a hits-only TrackCandidate and wrap it in a Track seeded + // with the banked helix-fit position/momentum (mm / MeV). + // Invariant: AHDC_hits is non-empty. The AI_MLP path uses greedy // non-overlap selection so each PreCluster (and thus each Hit) belongs to at most one // surviving track, so the set_trackId stamping is unambiguous and every AHDC::track - // row has matching AHDC::hits rows. If this invariant ever flips, the get(0) inside - // Track(ArrayList) fails loudly here, which is the right signal. - Track newTrack = new Track(AHDC_hits); + // row has matching AHDC::hits rows. + TrackCandidate newCandidate = new TrackCandidate(AHDC_hits); + Track newTrack = new Track(newCandidate); double[] vec = { trackBank.getFloat("x", row), trackBank.getFloat("y", row), @@ -413,6 +598,30 @@ public boolean processDataEventUser(DataEvent event) { return true; } + /** Extract a deduplicated list of ATOF hits from {@code ATOF::hits} for the + * GNN graph builder. Dedup key is {@code (sector, layer, component)} — + * inference-time variant of the Python dedup which also keys on track id + * (only needed at training time). Returns an empty list when the bank is + * absent. */ + private static List extractAtofHits(DataEvent event) { + if (!event.hasBank("ATOF::hits")) return Collections.emptyList(); + DataBank bank = event.getBank("ATOF::hits"); + int rows = bank.rows(); + Set seen = new HashSet<>(); + ArrayList hits = new ArrayList<>(rows); + for (int r = 0; r < rows; r++) { + int sector = bank.getInt("sector", r); + int layer = bank.getInt("layer", r); + int component = bank.getInt("component", r); + long key = (((long) sector * 1000L) + layer) * 1000L + component; + if (!seen.add(key)) continue; + double x = bank.getFloat("x", r); + double y = bank.getFloat("y", r); + hits.add(new AtofHitStub(sector, layer, component, x, y)); + } + return hits; + } + /** * ALERTEngine main. * TODO: needs good test. diff --git a/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java b/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java index 0c372b919c..640ab7fea4 100644 --- a/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java +++ b/reconstruction/alert/src/test/java/org/jlab/service/alert/AHDCTest.java @@ -7,7 +7,6 @@ import org.jlab.detector.base.DetectorType; import org.jlab.analysis.physics.TestEvent; import org.jlab.service.ahdc.AHDCEngine; -import org.jlab.rec.ahdc.ModeTrackFinding; /** * @@ -23,12 +22,11 @@ public void run() { DataEvent event = TestEvent.get(DetectorType.AHDC); AHDCEngine engine = new AHDCEngine(); - engine.init(ModeTrackFinding.AI_Track_Finding); + engine.init(); engine.processDataEvent(event); event.show(); event.getBank("AHDC::hits").show(); - event.getBank("AHDC::clusters").show(); assertEquals(event.hasBank("FAKE::Bank"), false); assertEquals(event.hasBank("AHDC::wf"), true); From 18cac5848a6ebc849156b094672054f20c1b99d4 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 27 May 2026 14:11:51 -0400 Subject: [PATCH 171/190] feat: add unix-time post-processing (#1281) * add unix time to postproc * make it static * propagate to old post-processor * finish the old new postprocessor * add new postprocessor * remove constructor * cleanup constructors * process all events * cleanup/bugfix * bugfix * Revert "bugfix" This reverts commit ad7484f02663f3eef44a396de4a5ee5ea810024c. * Revert "cleanup/bugfix" This reverts commit 198f395ffcbcea7ebd8c5971b839b38ea82171a8. * Revert "process all events" This reverts commit 7a5b38a37661110851c78de3786f461b09964d36. * Revert "cleanup constructors" This reverts commit 9b6fd5bed9d431d22bfe270c67de3f7743799a35. * Revert "remove constructor" This reverts commit 3a53b39c7dd3f477869ea48f32290419a5573339. * Revert "add new postprocessor" This reverts commit 89902ed925116cb58b8fbd8fecfdd0de2e56c5a3. * Revert "finish the old new postprocessor" This reverts commit 6735592a7ce0e0b36a73605a56fa052d7038e590. * add null checks * fix javadoc, add missing null check --- .github/workflows/ci.yml | 3 +- .../jlab/analysis/postprocess/Processor.java | 190 +++++++++++++----- .../analysis/postprocess/Tag1ToEvent.java | 18 ++ 3 files changed, 155 insertions(+), 56 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4b9598007..366580249b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -225,7 +225,8 @@ jobs: - name: run test run: | ls -lhtr - ./coatjava/bin/decoder -l FINE -n 10000 -o dog.hipo ./clas_018779.evio.00001 + ./coatjava/bin/decoder -l FINE -n 10000 -o dec.hipo clas_018779.evio.00001 + ./coatjava/bin/postprocess -d 1 -q 1 -o pp.hipo dec.hipo test_clara: needs: [ build, download_test_data ] diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java index f5f4ca1cee..f36955c7dd 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -35,10 +36,13 @@ public class Processor { private final String outputPrefix = "tmp_"; + private Bank runConfig = null; + private Bank recEvent = null; private ConstantsManager conman = null; private SchemaFactory schemaFactory = null; private DaqScalersSequence chargeSequence = null; private HelicitySequenceDelayed helicitySequence = null; + private TreeMap eventUnix = null; public Processor(File file, boolean restream, boolean rebuild) { configure(Arrays.asList(file.getAbsolutePath()), restream, rebuild); @@ -58,19 +62,24 @@ public Processor(SchemaFactory schema, HelicitySequenceDelayed h, DaqScalersSequ schemaFactory = schema; helicitySequence = h; chargeSequence = s; + runConfig = new Bank(schemaFactory.getSchema("RUN::config")); + recEvent = new Bank(schemaFactory.getSchema("REC::Event")); } private void configure(List preloadFiles, boolean restream, boolean rebuild) { if (!preloadFiles.isEmpty()) { HipoReader r = new HipoReader(); r.open(preloadFiles.get(0)); + schemaFactory = r.getSchemaFactory(); + r.close(); + runConfig = new Bank(schemaFactory.getSchema("RUN::config")); + recEvent = new Bank(schemaFactory.getSchema("REC::Event")); conman = new ConstantsManager(); conman.init(CCDB_TABLES); - schemaFactory = r.getSchemaFactory(); helicitySequence = Util.getHelicity(preloadFiles, schemaFactory, restream, conman); if (rebuild) chargeSequence = DaqScalersSequence.rebuildSequence(1, conman, preloadFiles); else chargeSequence = DaqScalersSequence.readSequence(preloadFiles); - r.close(); + eventUnix = getEventUnixMap(schemaFactory, preloadFiles); } } @@ -92,21 +101,48 @@ private static List findPreloadFiles(String dir, String glob) { return ret; } + /** + * Load the mapping from event number to unix time + * @param schema + * @param files + * @return map + */ + public static TreeMap getEventUnixMap(SchemaFactory schema, List files) { + Bank unix = new Bank(schema.getSchema("RUN::unix")); + TreeMap m = new TreeMap<>(); + Event e = new Event(); + for (String f : files) { + HipoReader r = new HipoReader(); + r.setTags(1); + r.open(f); + while (r.hasNext()) { + r.nextEvent(e); + e.read(unix); + int size = unix.getRows(); + for (int i=0; i0) { event.removeBank("HEL::scaler"); - Util.assignScalerHelicity(runConfig.getLong("timestamp",0), ((HipoDataBank)helScaler).getBank(), helicitySequence); + Util.assignScalerHelicity(runcfg.getLong("timestamp",0), ((HipoDataBank)helScaler).getBank(), helicitySequence); event.appendBank(helScaler); } } @@ -114,95 +150,139 @@ private void processEventHelicity(DataEvent event, DataBank runConfig, DataBank /** * Modify REC::Event/HEL::scaler with the delay-corrected helicity * @param event - * @param runConfig - * @param recEvent + * @param runcfg + * @param recevt */ - private void processEventHelicity(Event event, Bank runConfig, Bank recEvent) { - HelicityBit hb = helicitySequence.search(runConfig.getLong("timestamp", 0)); + private void processEventHelicity(Event event, Bank runcfg, Bank recevt) { + HelicityBit hb = helicitySequence.search(runcfg.getLong("timestamp", 0)); HelicityBit hbraw = helicitySequence.getHalfWavePlate() ? HelicityBit.getFlipped(hb) : hb; - recEvent.setByte("helicity",0,hb.value()); - recEvent.setByte("helicityRaw",0,hbraw.value()); + recevt.setByte("helicity",0,hb.value()); + recevt.setByte("helicityRaw",0,hbraw.value()); Bank helScaler = new Bank(schemaFactory.getSchema("HEL::scaler")); event.read(helScaler); if (helScaler.getRows()>0) { event.remove(schemaFactory.getSchema("HEL::scaler")); - Util.assignScalerHelicity(runConfig.getLong("timestamp",0), helScaler, helicitySequence); + Util.assignScalerHelicity(runcfg.getLong("timestamp",0), helScaler, helicitySequence); event.write(helScaler); } } /** * Modify REC::Event for beam charge and livetime - * @param runConfig - * @param recEvent + * @param runcfg + * @param recevt */ - private void processEventScalers(DataBank runConfig, DataBank recEvent) { - DaqScalers ds = chargeSequence.get(runConfig.getLong("timestamp", 0)); + private void processEventScalers(DataBank runcfg, DataBank recevt) { + DaqScalers ds = chargeSequence.get(runcfg.getLong("timestamp", 0)); if (ds != null) { - recEvent.setFloat("beamCharge",0, (float) ds.dsc2.getBeamChargeGated()); - recEvent.setDouble("liveTime",0,ds.dsc2.getLivetime()); + recevt.setFloat("beamCharge",0, (float) ds.dsc2.getBeamChargeGated()); + recevt.setDouble("liveTime",0,ds.dsc2.getLivetime()); } } /** * Modify REC::Event for beam charge and livetime - * @param runConfig - * @param recEvent + * @param runcfg + * @param recevt */ - private void processEventScalers(Bank runConfig, Bank recEvent) { - DaqScalers ds = chargeSequence.get(runConfig.getLong("timestamp", 0)); + private void processEventScalers(Bank runcfg, Bank recevt) { + DaqScalers ds = chargeSequence.get(runcfg.getLong("timestamp", 0)); if (ds != null) { - recEvent.putFloat("beamCharge",0, (float) ds.dsc2.getBeamChargeGated()); - recEvent.putDouble("liveTime",0,ds.dsc2.getLivetime()); + recevt.putFloat("beamCharge",0, (float) ds.dsc2.getBeamChargeGated()); + recevt.putDouble("liveTime",0,ds.dsc2.getLivetime()); + } + } + + /** + * Modify RUN::config's unixtime and update the event + * @param event + * @param runcfg + */ + private void processEventUnix(Event event, Bank runcfg) { + if (runcfg.getRows() > 0) { + Integer key = eventUnix.floorKey(runcfg.getInt("event",0)); + if (key != null) { + Integer unix = eventUnix.get(key); + if (unix != null) { + event.remove(runcfg.getSchema()); + runcfg.putInt("unixtime", 0, unix); + event.write(runcfg); + } + } + } + } + + /** + * Modify RUN::config's unixtime and update the event + * @param event + * @param runcfg + */ + private void processEventUnix(DataEvent event, DataBank runcfg) { + if (runcfg.rows() > 0) { + Integer key = eventUnix.floorKey(runcfg.getInt("event",0)); + if (key != null) { + Integer unix = eventUnix.get(key); + if (unix != null) { + event.removeBank(runcfg.getDescriptor().getName()); + runcfg.setInt("unixtime", 0, unix); + event.appendBank(runcfg); + } + } } } /** * Postprocess one event - * @param e + * @param event */ - public void processEvent(DataEvent e) { - if (!e.hasBank("RUN::config")) return; - if (!e.hasBank("REC::Event")) return; - DataBank runConfig = e.getBank("RUN::config"); - DataBank recEvent = e.getBank("REC::Event"); - if (runConfig.rows()<1 || recEvent.rows()<1) return; - e.removeBank("REC::Event"); - if (helicitySequence != null) processEventHelicity(e, runConfig, recEvent); - if (chargeSequence != null) processEventScalers(runConfig, recEvent); - e.appendBank(recEvent); + public void processEvent(DataEvent event) { + if (event.hasBank("RUN::config")) { + DataBank runcfg = event.getBank("RUN::config"); + if (runcfg.rows() > 0) { + processEventUnix(event, runcfg); + if (event.hasBank("REC::Event")) { + DataBank recevt = event.getBank("REC::Event"); + if (recevt.rows() > 0) { + event.removeBank("REC::Event"); + if (helicitySequence != null) processEventHelicity(event, runcfg, recevt); + if (chargeSequence != null) processEventScalers(runcfg, recevt); + event.appendBank(recevt); + } + } + } + } } /** * Postprocess one event - * @param e + * @param event */ - public void processEvent(Event e) { - if (!e.hasBank(schemaFactory.getSchema("RUN::config"))) return; - if (!e.hasBank(schemaFactory.getSchema("REC::Event"))) return; - Bank runConfig = new Bank(schemaFactory.getSchema("RUN::config")); - Bank recEvent = new Bank(schemaFactory.getSchema("REC::Event")); - e.read(runConfig); - e.read(recEvent); - if (runConfig.getRows()<1 || recEvent.getRows()<1) return; - e.remove(schemaFactory.getSchema("REC::Event")); - if (helicitySequence != null) processEventHelicity(e, runConfig, recEvent); - if (chargeSequence != null) processEventScalers(runConfig, recEvent); - e.write(recEvent); + public void processEvent(Event event) { + event.read(runConfig); + event.read(recEvent); + if (runConfig.getRows() > 0) { + processEventUnix(event, runConfig); + if (recEvent.getRows() > 0) { + event.remove(recEvent.getSchema()); + if (helicitySequence != null) processEventHelicity(event, runConfig, recEvent); + if (chargeSequence != null) processEventScalers(runConfig, recEvent); + event.write(recEvent); + } + } } /** * Create rebuilt files from preload files. - * @param preloadFiles + * @param files * @return map of rebuilt:preload files */ - private Map rebuild(String dir, List preloadFiles) { + private Map rebuild(String dir, List files) { File d = new File(dir); if (!d.canWrite()) { throw new RuntimeException("No write permissions on "+dir); } Map rebuiltFiles = new HashMap<>(); - for (String preloadFile : preloadFiles) { + for (String preloadFile : files) { String rebuiltFile = dir+"/"+outputPrefix+preloadFile.replace(dir+"/",""); Util.rebuildScalers(conman, preloadFile, rebuiltFile); rebuiltFiles.put(rebuiltFile,preloadFile); diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java index 857a9962f6..b85efd3a95 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Tag1ToEvent.java @@ -1,5 +1,6 @@ package org.jlab.analysis.postprocess; +import java.util.TreeMap; import java.util.logging.Logger; import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.detector.calib.utils.ConstantsManager; @@ -100,6 +101,9 @@ public static void main(String[] args) { helSeq.initialize(parser.getInputList()); } + // Initialize the unix-event map: + TreeMap eventUnix = Processor.getEventUnixMap(schema, parser.getInputList()); + // Loop over the input HIPO files: LOGGER.info("\n>>> Starting post-processing ...\n"); for (String filename : parser.getInputList()) { @@ -147,6 +151,20 @@ public static void main(String[] args) { event.write(recEventBank); event.write(helScalerBank); + // Update RUN::config.unixtime: + if (runConfigBank.getRows() > 0) { + int evno = runConfigBank.getInt("event", 0); + Integer key = eventUnix.floorKey(evno); + if (key != null) { + Integer unix = eventUnix.get(key); + if (unix != null) { + event.remove(runConfigBank.getSchema()); + runConfigBank.putInt("unixtime", 0, unix); + event.write(runConfigBank); + } + } + } + // Write out the original event: writer.addEvent(event, event.getEventTag()); From e5dd4911f1d2e27a0ecebeefb7961053c167e9b4 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 27 May 2026 19:07:49 -0400 Subject: [PATCH 172/190] feat: finish old, new post-processing (#1292) * finish the old new postprocessor * add new postprocessor * remove constructor * cleanup constructors * process all events * cleanup/bugfix --- bin/postprocess2 | 10 ++ .../java/org/jlab/io/clara/Clas12Writer.java | 7 +- .../jlab/analysis/postprocess/Processor.java | 153 +++++++----------- 3 files changed, 75 insertions(+), 95 deletions(-) create mode 100755 bin/postprocess2 diff --git a/bin/postprocess2 b/bin/postprocess2 new file mode 100755 index 0000000000..b10c9ff07a --- /dev/null +++ b/bin/postprocess2 @@ -0,0 +1,10 @@ +#!/bin/bash + +. `dirname $0`/../libexec/env.sh + +export MALLOC_ARENA_MAX=1 + +java ${JAVA_OPTS-} -Xmx768m -Xms768m -XX:+UseSerialGC \ + -cp ${COATJAVA_CLASSPATH:-''} \ + org.jlab.analysis.postprocess.Processor \ + $* diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java index 6a36e60488..a094b939cd 100644 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java +++ b/common-tools/clara-io/src/main/java/org/jlab/io/clara/Clas12Writer.java @@ -2,6 +2,7 @@ import java.io.File; import java.nio.file.Path; +import java.util.List; import java.util.TreeMap; import java.util.TreeSet; import org.jlab.analysis.postprocess.Processor; @@ -145,9 +146,9 @@ private Event getUnixEvent(Bank config) { */ private void postprocess() { int d = conman.getConstants(getRunNumber(), "/runcontrol/helicity").getIntValue("delay",0,0,0); - HelicitySequenceDelayed h = new HelicitySequenceDelayed(d); - h.addStream(helicities); - Processor p = new Processor(fullSchema, h, scalers); + HelicitySequenceDelayed helicity = new HelicitySequenceDelayed(d); + helicity.addStream(helicities); + Processor p = new Processor(List.of(filename), fullSchema, helicity, scalers); HipoReader r = new HipoReader(); r.open(filename); Event e = new Event(); diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java index f36955c7dd..7652b74d4c 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/postprocess/Processor.java @@ -1,13 +1,6 @@ package org.jlab.analysis.postprocess; -import java.io.File; -import java.nio.file.FileSystems; -import java.nio.file.PathMatcher; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.TreeMap; import org.jlab.jnp.hipo4.data.Bank; @@ -23,6 +16,9 @@ import org.jlab.detector.scalers.DaqScalersSequence; import org.jlab.detector.helicity.HelicityBit; import org.jlab.detector.helicity.HelicitySequenceDelayed; +import org.jlab.jnp.hipo4.io.HipoWriterSorted; +import org.jlab.utils.options.OptionParser; +import org.jlab.utils.system.ClasUtilsFile; /** * @@ -32,9 +28,6 @@ public class Processor { public static final String CCDB_TABLES[] = {"/runcontrol/fcup","/runcontrol/slm", "/runcontrol/helicity","/daq/config/scalers/dsc1","/runcontrol/hwp"}; - public static final String DEF_PRELOAD_GLOB = "*.{hipo,h5}"; - - private final String outputPrefix = "tmp_"; private Bank runConfig = null; private Bank recEvent = null; @@ -44,61 +37,30 @@ public class Processor { private HelicitySequenceDelayed helicitySequence = null; private TreeMap eventUnix = null; - public Processor(File file, boolean restream, boolean rebuild) { - configure(Arrays.asList(file.getAbsolutePath()), restream, rebuild); - } - - public Processor(String dir, boolean restream, boolean rebuild) { - configure(findPreloadFiles(dir,DEF_PRELOAD_GLOB), restream, rebuild); - } - - public Processor(String dir, String glob, boolean restream, boolean rebuild) { - configure(findPreloadFiles(dir,glob), restream, rebuild); - } - - public Processor(SchemaFactory schema, HelicitySequenceDelayed h, DaqScalersSequence s) { + public Processor(List files, boolean restream, boolean rebuild) { + HipoReader r = new HipoReader(); + r.open(files.get(0)); + schemaFactory = r.getSchemaFactory(); + r.close(); + runConfig = new Bank(schemaFactory.getSchema("RUN::config")); + recEvent = new Bank(schemaFactory.getSchema("REC::Event")); conman = new ConstantsManager(); conman.init(CCDB_TABLES); + helicitySequence = Util.getHelicity(files, schemaFactory, restream, conman); + if (rebuild) chargeSequence = DaqScalersSequence.rebuildSequence(1, conman, files); + else chargeSequence = DaqScalersSequence.readSequence(files); + eventUnix = getEventUnixMap(schemaFactory, files); + } + + public Processor(List files, SchemaFactory schema, HelicitySequenceDelayed h, DaqScalersSequence s) { schemaFactory = schema; helicitySequence = h; chargeSequence = s; runConfig = new Bank(schemaFactory.getSchema("RUN::config")); recEvent = new Bank(schemaFactory.getSchema("REC::Event")); - } - - private void configure(List preloadFiles, boolean restream, boolean rebuild) { - if (!preloadFiles.isEmpty()) { - HipoReader r = new HipoReader(); - r.open(preloadFiles.get(0)); - schemaFactory = r.getSchemaFactory(); - r.close(); - runConfig = new Bank(schemaFactory.getSchema("RUN::config")); - recEvent = new Bank(schemaFactory.getSchema("REC::Event")); - conman = new ConstantsManager(); - conman.init(CCDB_TABLES); - helicitySequence = Util.getHelicity(preloadFiles, schemaFactory, restream, conman); - if (rebuild) chargeSequence = DaqScalersSequence.rebuildSequence(1, conman, preloadFiles); - else chargeSequence = DaqScalersSequence.readSequence(preloadFiles); - eventUnix = getEventUnixMap(schemaFactory, preloadFiles); - } - } - - /** - * Get a list of files to preload, from one directory and a glob. - * @param dir - * @param glob - * @return list of preload files - */ - private static List findPreloadFiles(String dir, String glob) { - List ret = new ArrayList<>(); - if (dir != null) { - PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:"+dir+"/"+glob); - for (File f : (new File(dir)).listFiles()) { - if (matcher.matches(f.toPath())) - ret.add(f.getPath()); - } - } - return ret; + conman = new ConstantsManager(); + conman.init(CCDB_TABLES); + eventUnix = getEventUnixMap(schemaFactory, files); } /** @@ -108,20 +70,18 @@ private static List findPreloadFiles(String dir, String glob) { * @return map */ public static TreeMap getEventUnixMap(SchemaFactory schema, List files) { - Bank unix = new Bank(schema.getSchema("RUN::unix")); TreeMap m = new TreeMap<>(); Event e = new Event(); + Bank b = schema.getBank("RUN::unix");//new Bank(schema.getSchema("RUN::unix")); for (String f : files) { HipoReader r = new HipoReader(); r.setTags(1); r.open(f); while (r.hasNext()) { r.nextEvent(e); - e.read(unix); - int size = unix.getRows(); - for (int i=0; i0) { @@ -272,37 +232,46 @@ public void processEvent(Event event) { } /** - * Create rebuilt files from preload files. - * @param files - * @return map of rebuilt:preload files + * The "postprocess" program. + * @param args */ - private Map rebuild(String dir, List files) { - File d = new File(dir); - if (!d.canWrite()) { - throw new RuntimeException("No write permissions on "+dir); - } - Map rebuiltFiles = new HashMap<>(); - for (String preloadFile : files) { - String rebuiltFile = dir+"/"+outputPrefix+preloadFile.replace(dir+"/",""); - Util.rebuildScalers(conman, preloadFile, rebuiltFile); - rebuiltFiles.put(rebuiltFile,preloadFile); + public static void main(String args[]) { + + OptionParser o = new OptionParser("postprocess"); + o.addOption("-f","0","reflip: rebuild the HEL::flip bank"); + o.addOption("-c","0","recharge: rebuild the RUN/HEL::scaler banks"); + o.addOption("-o",null,"merged output file path"); + o.setRequiresInputList(true); + o.parse(args); + + boolean restream = !o.getOption("-f").isDefault(); + boolean rebuild = !o.getOption("-c").isDefault(); + + Processor post = new Processor(o.getInputList(), restream, rebuild); + + HipoWriterSorted writer = null; + + if (!o.getOption("-o").isDefault()) { + writer = new HipoWriterSorted(); + SchemaFactory schema = writer.getSchemaFactory(); + schema.initFromDirectory(ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4")); + writer.setCompressionType(2); + writer.open(o.getOption("-o").stringValue()); } - return rebuiltFiles; - } - /** - * Replace files with new ones. - * @param files map of new:old filenames - */ - private static void replace(Map files) { - for (String rebuiltFile : files.keySet()) { - new File(files.get(rebuiltFile)).delete(); - new File(rebuiltFile).renameTo(new File(files.get(rebuiltFile))); + for (String f : o.getInputList()) { + HipoReader reader = new HipoReader(); + reader.open(f); + Event event = new Event(); + while (reader.hasNext()) { + reader.nextEvent(event); + post.processEvent(event); + if (writer != null) writer.addEvent(event); + } + reader.close(); } - } - public static void main(String args[]) { - Processor p = new Processor(System.getenv("HOME")+"/tmp","r*.hipo",false,false); + if (writer != null) writer.close(); } } From a759329b6142a93def45f195859dc21388d49af8 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 28 May 2026 15:50:16 -0400 Subject: [PATCH 173/190] feat: little DC hits reading optimization (#1287) * reduce bank access * simplify logic, reduce event access --- .../java/org/jlab/rec/dc/banks/HitReader.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java index 4a66375c08..6fca3cdab2 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java @@ -330,10 +330,11 @@ private void read_HBHits(TimeToDistanceEstimator tde) { DataBank pbank = event.getBank(pointName); for (int i = 0; i < pbank.rows(); i++) { - id2tid.put((int)pbank.getShort("id", i), (int)pbank.getShort("tid", i)); - id2tidB.put((int)pbank.getShort("id", i), (double)pbank.getFloat("B", i)); - id2tidtFlight.put((int)pbank.getShort("id", i), (double)pbank.getFloat("TFlight", i)); - id2tidtProp.put((int)pbank.getShort("id", i), (double)pbank.getFloat("TProp", i)); + int id = pbank.getShort("id",i); + id2tid.put(id, (int)pbank.getShort("tid", i)); + id2tidB.put(id, (double)pbank.getFloat("B", i)); + id2tidtFlight.put(id, (double)pbank.getFloat("TFlight", i)); + id2tidtProp.put(id, (double)pbank.getFloat("TProp", i)); } DataBank bank = event.getBank(bankName); @@ -387,22 +388,17 @@ private void read_HBHits(TimeToDistanceEstimator tde) { continue; } - double T_0 = 0; - double T_Start = 0; - if (!event.hasBank(recBankName)) { continue; } - if (event.hasBank(recBankName) && - event.getBank(recBankName).getFloat("startTime", 0)==-1000) { + double T_Start = event.getBank(recBankName).getFloat("startTime", 0); + + if (T_Start == -1000) { continue; } - if (event.hasBank(recBankName)) - T_Start = event.getBank(recBankName).getFloat("startTime", 0); - - T_0 = this.getT0(sector[i], slayer[i], layer[i], wire[i], t0s)[0]; + double T_0 = this.getT0(sector[i], slayer[i], layer[i], wire[i], t0s)[0]; FittedHit hit = new FittedHit(sector[i], slayer[i], layer[i], wire[i], tdc[i], jitter[i], id[i]); hit.set_Id(id[i]); hit.setB(B[i]); From cfc74901feda90ed29039192d70b9b35f23b809b Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 29 May 2026 10:01:12 -0400 Subject: [PATCH 174/190] build: bump version number to 14.1.0 (#1293) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 336 insertions(+), 336 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 85cfa974ec..7136fcf222 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 07d8976e1a..f3190aa11e 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 761a04c53f..6c33a538c0 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar cnuphys swimmer - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 9371842f38..645cd24051 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-logging - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index c0bad013e0..2bfeb75509 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 4b16ccf748..fc4e724199 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index ec5c3f97a8..05ac2e8a42 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index cdba88e937..0919c02c40 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 09b316c4dd..19eea1d82c 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index cc36d3083b..f10d001d54 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 21ab1752f5..0d096dd439 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys swimmer - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 4fe4ecedfb..6bcd371610 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 442032257c..9996f605ed 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 47a484412a..177425c177 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar cnuphys clas12 - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 25a704ffc5..7588dd6b15 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT pom org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 22e45ec0fd..a9f89bb95d 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar cnuphys clas12 - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 9c4d4cee66..e184a898c4 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar cnuphys clas12 - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 8ccb37974f..67bc29acfa 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar cnuphys clas12 - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys splot - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 1d40b02d32..639bcab4a8 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clara-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-logging - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-math - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-tracking - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-decay-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys snr - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index d781fcfbbf..f66e67930c 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT pom org.jlab.clas coatjava - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index e0cc669f52..d2303819c2 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas common-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys swimmer - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/pom.xml b/pom.xml index cd94e64e5d..69540b2993 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 76c131ef46..caae55a959 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 5720ad1004..be5c1a312f 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test org.jlab.clas clas-tracking - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 6f0249513d..47bb0d0bdd 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 579017d670..9fb4cc2875 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 131a6b415c..2cdf71d77f 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 195f16fef3..82d9aa8f8a 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index e2d3c8cc2d..c834ea6ee4 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test org.jlab.clas clas-tracking - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 0c714672c5..7407eb9ce8 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test org.jlab.clas clas-tracking - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test org.jlab.clas clas-math - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys snr - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 93934c69f0..9c4a0e5086 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index fe645909c1..c5dc344cbe 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-analysis - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT test org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 3fffc1984c..8b3834ab30 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 0812da261d..4c0637dc8d 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 6b0827de37..66bec2df71 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 8dad2e6a5d..ae6f0a6298 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index 6338a42434..929c6ce06c 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index ad5fe94134..9289f20df6 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index 35d4660be3..bad81724c0 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 5b555fcac9..8cf061fb7d 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT pom org.jlab.clas coatjava - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index f9c6fa1224..a3007aad78 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index b3189d3449..6e639a177b 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index 205fd7af27..27af9c1071 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 436d6aeff0..18a1976e1b 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT cnuphys magfield - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-tracking - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT compile org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 6bd1372dd4..bec94374f6 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 164e85da50..7c9fe2a296 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-physics - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-utils - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index b9d08e55b7..c287321618 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index b82205bf46..356218f55c 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-jcsg - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index a9ef62290b..c2cdb105f5 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas swim-tools - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT jar cnuphys swimmer - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-reco - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-io - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT org.jlab.clas clas-geometry - 14.0.0-SNAPSHOT + 14.1.0-SNAPSHOT From 8ce52da4effe1d0dce8130c4bdd65bb5d9c3f8cb Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 29 May 2026 18:26:07 -0400 Subject: [PATCH 175/190] restore public access (#1294) --- .../main/java/org/jlab/rec/dc/timetodistance/TableLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java index 3742f6e906..c73a539019 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/timetodistance/TableLoader.java @@ -300,7 +300,7 @@ private static void getConstants(IndexedTable t2dPressure, IndexedTable t2dPress } } - private static void FillTable() { + public static void FillTable() { double stepSize = 0.00010; for(int s = 0; s<6; s++ ){ // loop over sectors for(int r = 0; r<6; r++ ){ //loop over slys From 4e8486049dd5acc24734c0f9ca63808194392903 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:21:47 -0400 Subject: [PATCH 176/190] build(deps): bump org.apache.maven.plugins:maven-dependency-plugin (#1295) Bumps [org.apache.maven.plugins:maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.10.0 to 3.11.0. - [Release notes](https://github.com/apache/maven-dependency-plugin/releases) - [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.10.0...maven-dependency-plugin-3.11.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-dependency-plugin dependency-version: 3.11.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- reconstruction/alert/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 69540b2993..5ae3a19755 100644 --- a/pom.xml +++ b/pom.xml @@ -342,7 +342,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.10.0 + 3.11.0 analyze diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index be5c1a312f..ab33d41515 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -127,7 +127,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.10.0 + 3.11.0 copy-dependencies From c43c3e8790adb73a4237d491cdd31e4cd416baa1 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 2 Jun 2026 21:48:30 -0400 Subject: [PATCH 177/190] avoid listeners and timers and call event action manually (#1301) --- .../org/jlab/io/task/DataSourceProcessorPane.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/common-tools/clas-io/src/main/java/org/jlab/io/task/DataSourceProcessorPane.java b/common-tools/clas-io/src/main/java/org/jlab/io/task/DataSourceProcessorPane.java index 569d720f47..c7516586f7 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/io/task/DataSourceProcessorPane.java +++ b/common-tools/clas-io/src/main/java/org/jlab/io/task/DataSourceProcessorPane.java @@ -210,13 +210,18 @@ public void openAndRun(String filename) { DataSource source = filename.endsWith(".hipo") ? new HipoDataSource() : new EvioSource(); source.open(filename); - this.dataProcessor.setSource(source); + dataProcessor.setSource(source); statusLabel.setText(dataProcessor.getStatusString()); mediaPlay.setEnabled(false); - mediaPause.setEnabled(true); - mediaNext.setEnabled(true); - mediaPrev.setEnabled(true); - this.startProcessorTimer(); + mediaPause.setEnabled(false); + mediaNext.setEnabled(false); + mediaPrev.setEnabled(false); + while (dataProcessor.dataSource.hasEvent()) { + DataEvent e = dataProcessor.dataSource.getNextEvent(); + for(IDataEventListener processor : dataProcessor.eventListeners){ + processor.dataEventAction(e); + } + } } @Override From c9a055e1cd394d0958e70ee4e941cbde8d1c55c0 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 2 Jun 2026 22:06:32 -0400 Subject: [PATCH 178/190] remove unused wrapper class (#1296) --- .../org/jlab/io/clara/EvioToEvioSource.java | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioSource.java diff --git a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioSource.java b/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioSource.java deleted file mode 100644 index 667659be12..0000000000 --- a/common-tools/clara-io/src/main/java/org/jlab/io/clara/EvioToEvioSource.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.jlab.io.clara; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.file.Path; - -import org.jlab.clara.engine.EngineDataType; -import org.jlab.clara.std.services.AbstractEventReaderService; -import org.jlab.clara.std.services.EventReaderException; -import org.jlab.coda.jevio.EvioException; -import org.jlab.io.evio.EvioDataEvent; -import org.jlab.io.evio.EvioSource; -import org.json.JSONObject; - -/** - * Converter service that converts EvIO persistent data to EvIO transient data - * (i.e. Reads EvIO events from an input file) - */ -public class EvioToEvioSource extends AbstractEventReaderService { - - private ByteOrder byteOrder; - private long maxEvents; - - @Override - protected EvioSource createReader(Path file, JSONObject opts) throws EventReaderException { - EvioSource s = new EvioSource(); - s.open(file.toString()); - byteOrder = s.getFileByteOrder(); - maxEvents = s.getEventCount(); - return s; - } - - @Override - protected void closeReader() { - reader.close(); - } - - @Override - public int readEventCount() throws EventReaderException { - return reader.getEventCount(); - } - - @Override - public ByteOrder readByteOrder() throws EventReaderException { - return reader.getFileByteOrder(); - } - - @Override - public Object readEvent(int eventNumber) throws EventReaderException { - if (eventNumber >= maxEvents) return null; - try { - ByteBuffer bb = reader.getEventBuffer(++eventNumber, true); - EvioDataEvent event = new EvioDataEvent(bb.array(), byteOrder); - return event; - } catch (EvioException e) { - throw new EventReaderException(e); - } - } - - @Override - protected EngineDataType getDataType() { - return Clas12Types.EVIO; - } -} From d64f59ba1fd7a14e2c49cd2d1eba7d595021e340 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Fri, 5 Jun 2026 17:36:54 -0400 Subject: [PATCH 179/190] remove AHDC::wf from non-full schema (#1305) --- etc/bankdefs/util/bankSplit.py | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/bankdefs/util/bankSplit.py b/etc/bankdefs/util/bankSplit.py index 9a43123094..d8e5d07770 100755 --- a/etc/bankdefs/util/bankSplit.py +++ b/etc/bankdefs/util/bankSplit.py @@ -113,6 +113,7 @@ def create(dirname, banklist): rgl.extend(glob.glob('./singles/full/AHDC*.json')) rgl.extend(glob.glob('./singles/full/ATOF*.json')) rgl = [os.path.basename(x)[:-5] for x in rgl] +rgl.remove('AHDC::wf') calib.extend(rgl) mon.extend(rgl) dst.extend(rgl) From c2be071191ab05ee4272cbfd89c13821c0e74c1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 15:18:27 -0400 Subject: [PATCH 180/190] build(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.14 to 0.8.15 (#1307) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5ae3a19755..2d516f2ad3 100644 --- a/pom.xml +++ b/pom.xml @@ -410,7 +410,7 @@ org.jacoco jacoco-maven-plugin - 0.8.14 + 0.8.15 From d6b3cf65b6f30d88a02053fe8402916cbc69b819 Mon Sep 17 00:00:00 2001 From: N-Plx <66355299+N-Plx@users.noreply.github.com> Date: Tue, 9 Jun 2026 14:32:12 -0500 Subject: [PATCH 181/190] Iss 1297 (#1304) * merge dev into iss-1297 (#1303) * avoid listeners and timers and call event action manually (#1301) * remove unused wrapper class (#1296) --------- Co-authored-by: Nathan Baltzell * run-dependent slope correction (radiation damage t0 increase) and some cleanup * run propagation from the engine to the hits --------- Co-authored-by: Nathan Baltzell --- .../java/org/jlab/rec/atof/hit/ATOFHit.java | 35 +++++++++---------- .../java/org/jlab/rec/atof/hit/BarHit.java | 2 -- .../java/org/jlab/rec/atof/hit/HitFinder.java | 9 +++-- .../org/jlab/service/alert/ALERTEngine.java | 19 +++++----- .../org/jlab/service/atof/ATOFEngine.java | 21 +++-------- 5 files changed, 36 insertions(+), 50 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java index a1812a237b..4ba2299fe7 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java @@ -28,6 +28,7 @@ public class ATOFHit { private int associatedClusterIndex; int idTDC; private IndexedTable atofTimeOffsetsTable; + private int Run; public int getSector() { @@ -199,25 +200,13 @@ public final int convertTdcToTime() { //Time offsets if (atofTimeOffsetsTable == null) return 0; int order0 = 0; + //global t0 double t0 = atofTimeOffsetsTable.getDoubleValue("t0", this.sector, this.layer, this.component, order0); + //time difference between bars up and down channels double tud = atofTimeOffsetsTable.getDoubleValue("upstream_downstream", this.sector, this.layer, this.component, order0); - //The rest of the constants are not used for now - /*double twb = timeOffsets[2]; - double xtra1 = timeOffsets[3]; - double xtra2 = timeOffsets[4];*/ - - //TW corrections TO BE IMPLEMENTED - /* - double[] timeWalks = CalibrationConstantsLoader.ATOF_TIME_WALK.get(key); - double tw0 = timeWalks[0]; - double tw1 = timeWalks[1]; - double tw2 = timeWalks[2]; - double tw3 = timeWalks[3]; - double dtw0 = timeWalks[4]; - double dtw1 = timeWalks[5]; - double dtw2 = timeWalks[6]; - double dtw3 = timeWalks[7]; - double chi2ndf = timeWalks[8];*/ + //run-dependent correction for the radiation damage + double slope = atofTimeOffsetsTable.getDoubleValue("extra1", this.sector, this.layer, this.component, order0); + double intersect = atofTimeOffsetsTable.getDoubleValue("extra2", this.sector, this.layer, this.component, order0); double veff, distance_to_sipm, timeOffset; if (null == this.type) { @@ -229,6 +218,7 @@ public final int convertTdcToTime() { veff = Parameters.VEFF; //Wedge hits are placed at the center of wedges and sipm at their top distance_to_sipm = Parameters.WEDGE_THICKNESS / 2.; + //Run-dependent slope correction timeOffset = - t0; } case "bar up" -> { @@ -254,8 +244,10 @@ public final int convertTdcToTime() { } } } + //Run-dependent slope correction + double dt = (this.Run - intersect) * slope; //Hit time. - this.time = this.time - distance_to_sipm / veff + timeOffset; + this.time = this.time - distance_to_sipm / veff + timeOffset - dt; return 0; } @@ -396,11 +388,14 @@ public double getPhi() { * @param order Order of the hit. * @param tdc TDC value. * @param tot ToT value. + * @param startTime event start time * @param atof Detector object representing the atof, used to calculate * spatial coordinates. + * @param atofTimeOffsetsTable time offset constants + * @param Run for run-dependent slope correction */ public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot, Float startTime, Detector atof, - IndexedTable atofTimeOffsetsTable) { + IndexedTable atofTimeOffsetsTable, int Run) { this.sector = sector; this.layer = layer; this.component = component; @@ -410,6 +405,8 @@ public ATOFHit(int sector, int layer, int component, int order, int tdc, int tot this.startTime = startTime; this.atofTimeOffsetsTable = atofTimeOffsetsTable; this.isInACluster = false; + + this.Run = Run; this.makeType(); this.convertTdcToTime(); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java index 4dd8a94b12..541dee2259 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java @@ -1,7 +1,5 @@ package org.jlab.rec.atof.hit; -import org.jlab.io.base.DataEvent; -import org.jlab.io.hipo.HipoDataSource; import org.jlab.rec.atof.constants.Parameters; import org.jlab.utils.groups.IndexedTable; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java index 918cefa864..b20c867ac3 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/atof/hit/HitFinder.java @@ -63,10 +63,15 @@ public void setWedgeHits(ArrayList wedge_hits) { * @param event the {@link DataEvent} containing hits. * @param atof the {@link Detector} representing the atof geometry to match * the sector/layer/component to x/y/z. + * @param startTime the event start time + * @param atofTimeOffsetsTable the constant table with time offsets + * @param atofEffectiveVelocityTable the constant table with effective velocity + * @param Run the run number corresponding to the event for run-dependent slope correction */ public void findHits(DataEvent event, Detector atof, Float startTime, IndexedTable atofTimeOffsetsTable, - IndexedTable atofEffectiveVelocityTable) { + IndexedTable atofEffectiveVelocityTable, + int Run) { //For each event a list of bar hits and a list of wedge hits are filled this.barHits.clear(); this.wedgeHits.clear(); @@ -92,7 +97,7 @@ public void findHits(DataEvent event, Detector atof, Float startTime, int tot = bank.getInt("ToT", i); //Building a Hit - ATOFHit hit = new ATOFHit(sector, layer, component, order, tdc, tot, startTime, atof, atofTimeOffsetsTable); + ATOFHit hit = new ATOFHit(sector, layer, component, order, tdc, tot, startTime, atof, atofTimeOffsetsTable, Run); if (hit.getEnergy() < 0.01) { continue; //energy threshold } diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index c54a7636e5..ad977cfc96 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -1,6 +1,5 @@ package org.jlab.service.alert; -import ai.djl.repository.zoo.ZooModel; import ai.djl.translate.TranslateException; import java.io.File; import java.util.ArrayList; @@ -396,7 +395,7 @@ public boolean processDataEventUser(DataEvent event) { continue; } - ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0f, ATOF, null); + ATOFHit hit_pred = new ATOFHit(sector_pred, layer_pred, wedge_pred, 0, 0, 0, 0f, ATOF, null, 0); double pred_x = hit_pred.getX(); double pred_y = hit_pred.getY(); double pred_z = hit_pred.getZ(); @@ -404,27 +403,25 @@ public boolean processDataEventUser(DataEvent event) { double threshold = 20.0; double minDistanceSquared = threshold * threshold; - ATOFHit matchAtofHit = null; // Could be used later int matchHitId = -1; for (int k = 0; k < bank_ATOFHits.rows(); k++) { int component = bank_ATOFHits.getInt("component", k); if (component == 10) continue; - int sector = bank_ATOFHits.getInt("sector", k); - int layer = bank_ATOFHits.getInt("layer", k); + double hitX = bank_ATOFHits.getFloat("x", k); + double hitY = bank_ATOFHits.getFloat("y", k); + double hitZ = bank_ATOFHits.getFloat("z", k); - ATOFHit hit = new ATOFHit(sector, layer, component, 0, 0, 0, 0f, ATOF, null); - - double dx = pred_x - hit.getX(); - double dy = pred_y - hit.getY(); - double dz = pred_z - hit.getZ(); + double dx = pred_x - hitX; + double dy = pred_y - hitY; + double dz = pred_z - hitZ; double distanceSquared = dx * dx + dy * dy + dz * dz; if (distanceSquared < minDistanceSquared) { minDistanceSquared = distanceSquared; - matchAtofHit = hit; + //matchAtofHit = hit; matchHitId = bank_ATOFHits.getInt("id", k); } } diff --git a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java index 27153fb14c..9b3595daf1 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java @@ -12,6 +12,7 @@ import org.jlab.detector.calib.utils.DatabaseConstantProvider; import org.jlab.geom.base.Detector; import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; +import org.jlab.io.hipo.HipoDataSource; import org.jlab.rec.atof.banks.RecoBankWriter; import org.jlab.rec.atof.cluster.ATOFCluster; import org.jlab.rec.atof.cluster.ClusterFinder; @@ -94,25 +95,10 @@ public boolean processDataEventUser(DataEvent event) { atofTimeOffsetsTable = this.getConstantsManager().getConstants(newRun, "/calibration/alert/atof/time_offsets"); Run = newRun; } - - ////Do we need to read the event vx,vy,vz? - ////If not, this part can be moved in the initialization of the engine. - //double eventVx=0,eventVy=0,eventVz=0; //They should be in CM - ////Track Projector Initialisation with b field - //Swim swim = new Swim(); - //float magField[] = new float[3]; - //swim.BfieldLab(eventVx, eventVy, eventVz, magField); - //this.b = Math.sqrt(Math.pow(magField[0],2) + Math.pow(magField[1],2) + Math.pow(magField[2],2)); - - ///// \todo move this to ALERTEngine - //TrackProjector projector = new TrackProjector(); - //projector.setB(this.b); - //projector.projectTracks(event); - //rbc.appendMatchBanks(event, projector.getProjections()); //Hit finder init HitFinder hitfinder = new HitFinder(); - hitfinder.findHits(event, ATOF, startTime, atofTimeOffsetsTable, atofEffectiveVelocityTable); + hitfinder.findHits(event, ATOF, startTime, atofTimeOffsetsTable, atofEffectiveVelocityTable, Run); ArrayList WedgeHits = hitfinder.getWedgeHits(); ArrayList BarHits = hitfinder.getBarHits(); //Exit if hit lists are empty @@ -165,5 +151,8 @@ else if ("false".equals(this.getEngineConfigString(useStartTimeString))) } public static void main(String arg[]) { + } } + + From a7228869eb569b3c7869b532dcafe412c69e7634 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 9 Jun 2026 23:07:49 -0400 Subject: [PATCH 182/190] move rg-l engine geometry initialization to detectorChanged (#1306) --- .../main/java/org/jlab/service/ahdc/AHDCEngine.java | 4 +--- .../java/org/jlab/service/alert/ALERTEngine.java | 13 +++++-------- .../main/java/org/jlab/service/atof/ATOFEngine.java | 8 +++----- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index b52d306f7a..d01d7385ad 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -46,14 +46,12 @@ public class AHDCEngine extends ReconstructionEngine { @Override public void detectorChanged(int run) { - // FIXME: move geometry initialization here + factory = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider(run,"default")); } @Override public boolean init() { - factory = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider()); - Map tableMap = new HashMap<>(); tableMap.put("/calibration/alert/ahdc/time_offsets", 3); tableMap.put("/calibration/alert/ahdc/time_to_distance_wire", 3); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index ad977cfc96..eac98f0cec 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -134,7 +134,11 @@ public ALERTEngine() { } @Override - public void detectorChanged(int run) {} + public void detectorChanged(int run) { + DatabaseConstantProvider cp = new DatabaseConstantProvider(run, "default"); + ATOF = (new AlertTOFFactory()).createDetectorCLAS(cp); + AHDC = (new AlertDCFactory()).createDetectorCLAS(cp); + } /** * ALERTEngine initialization. @@ -149,13 +153,6 @@ public boolean init() { modelTrackMatching = new ModelTrackMatching(); modelPrePID = new ModelPrePID(); - AlertTOFFactory factory = new AlertTOFFactory(); - - // One CCDB session for both ATOF and AHDC geometry. - DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); - ATOF = factory.createDetectorCLAS(cp); - AHDC = (new AlertDCFactory()).createDetectorCLAS(cp); - Map tableMap = new HashMap<>(); tableMap.put("/calibration/alert/ahdc/gains", 3); requireConstants(tableMap); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java index 9b3595daf1..39e5020d8b 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/atof/ATOFEngine.java @@ -120,17 +120,15 @@ public boolean processDataEventUser(DataEvent event) { @Override public void detectorChanged(int run) { - // FIXME: move geometry initialization here + AlertTOFFactory factory = new AlertTOFFactory(); + DatabaseConstantProvider cp = new DatabaseConstantProvider(run, "default"); + this.ATOF = factory.createDetectorCLAS(cp); } @Override public boolean init() { rbc = new RecoBankWriter(); - AlertTOFFactory factory = new AlertTOFFactory(); - DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); - this.ATOF = factory.createDetectorCLAS(cp); - Map tableMap = new HashMap<>(); tableMap.put("/calibration/alert/atof/effective_velocity", 3); tableMap.put("/calibration/alert/atof/time_walk", 4); From 1bd4e65df57380e12fa2cb0412aad5cedcab51d9 Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Fri, 12 Jun 2026 16:20:39 +0200 Subject: [PATCH 183/190] Clean bad AHDC hits and use ATOF wedges in the Kalman Filter (#1309) * extends the bank AHDC::kftrack and allow re-cooking of AHDC only * convenient use of PID in RK4 * create KFHit and refactor the kalman filter * activate atof hit * rename methods * remove unused variables and methods * use a logger * fix innovation vector for RadialKFHit * cleaning * let registerOutputBank removes the banks --- etc/bankdefs/hipo4/alert.json | 68 +++ .../jlab/rec/ahdc/Banks/RecoBankWriter.java | 34 ++ .../main/java/org/jlab/rec/ahdc/Hit/Hit.java | 71 ++- .../jlab/rec/ahdc/KalmanFilter/Hit_beam.java | 52 --- .../org/jlab/rec/ahdc/KalmanFilter/KFHit.java | 29 ++ .../jlab/rec/ahdc/KalmanFilter/KFitter.java | 140 +----- .../rec/ahdc/KalmanFilter/KalmanFilter.java | 413 ++++++++++++++---- .../rec/ahdc/KalmanFilter/Propagator.java | 10 +- .../rec/ahdc/KalmanFilter/RadialKFHit.java | 128 ++++++ .../ahdc/KalmanFilter/RadialSurfaceKFHit.java | 85 ++++ .../rec/ahdc/KalmanFilter/RungeKutta4.java | 6 +- .../java/org/jlab/rec/alert/Track/Track.java | 70 ++- .../jlab/rec/alert/Track/TrackCandidate.java | 4 - .../org/jlab/service/alert/ALERTEngine.java | 196 ++++++++- 14 files changed, 1005 insertions(+), 301 deletions(-) delete mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Hit_beam.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFHit.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialKFHit.java create mode 100644 reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialSurfaceKFHit.java diff --git a/etc/bankdefs/hipo4/alert.json b/etc/bankdefs/hipo4/alert.json index 64d4faeec1..580a54aecc 100644 --- a/etc/bankdefs/hipo4/alert.json +++ b/etc/bankdefs/hipo4/alert.json @@ -408,6 +408,74 @@ "name": "sum_residuals", "type": "F", "info": "Sum of residuals (mm)" + }, { + "name": "atof_region", + "type": "I", + "info": "a flag to know if a track reach S1, S2, or S3; is n if Sn is reached; is 0 otherwise" + }, { + "name": "atof_s1_x", + "type": "F", + "info": "x position of the track if it reaches the surface s1" + }, { + "name": "atof_s1_y", + "type": "F", + "info": "y position of the track if it reaches the surface s1" + }, { + "name": "atof_s1_z", + "type": "F", + "info": "z position of the track if it reaches the surface s1" + }, { + "name": "atof_s1_path", + "type": "F", + "info": "total path from the beamline to the surface s1" + }, { + "name": "atof_s1_p", + "type": "F", + "info": "momentum whith which the track reaches the surface s1" + }, { + "name": "atof_s2_x", + "type": "F", + "info": "x position of the track if it reaches the surface s2" + }, { + "name": "atof_s2_y", + "type": "F", + "info": "y position of the track if it reaches the surface s2" + }, { + "name": "atof_s2_z", + "type": "F", + "info": "z position of the track if it reaches the surface s2" + }, { + "name": "atof_s2_path", + "type": "F", + "info": "total path from the beamline to the surface s2" + }, { + "name": "atof_s2_p", + "type": "F", + "info": "momentum whith which the track reaches the surface s2" + }, { + "name": "atof_s3_x", + "type": "F", + "info": "x position of the track if it reaches the surface s3" + }, { + "name": "atof_s3_y", + "type": "F", + "info": "y position of the track if it reaches the surface s3" + }, { + "name": "atof_s3_z", + "type": "F", + "info": "z position of the track if it reaches the surface s3" + }, { + "name": "atof_s3_path", + "type": "F", + "info": "total path from the beamline to the surface s3" + }, { + "name": "atof_s3_p", + "type": "F", + "info": "momentum whith which the track reaches the surface s3" + }, { + "name": "atof_match", + "type": "B", + "info": "1 if there is a ATOF match, 0 if not" } ] }, { diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java index dead9dacdd..b276e4b605 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java @@ -7,6 +7,7 @@ import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; import org.jlab.rec.ahdc.DocaCluster.DocaCluster; import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.ahdc.KalmanFilter.Stepper; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.alert.Track.Track; @@ -153,6 +154,39 @@ public DataBank fillAHDCKFTrackBank(DataEvent event, ArrayList tracks) { bank.setFloat("chi2", row, (float) track.get_chi2()); bank.setFloat("sum_residuals", row, (float) track.get_sum_residuals()); + // track projection on ATOF surface S1 + Stepper stepper_s1 = track.get_ATOF_S1_stepper(); + if (stepper_s1 != null) { + bank.setFloat("atof_s1_x", row, (float) stepper_s1.y[0]); + bank.setFloat("atof_s1_y", row, (float) stepper_s1.y[1]); + bank.setFloat("atof_s1_z", row, (float) stepper_s1.y[2]); + bank.setFloat("atof_s1_path", row, (float) stepper_s1.sTot); + bank.setFloat("atof_s1_p", row, (float) stepper_s1.p()); + } + + // track projection on ATOF surface S2 + Stepper stepper_s2 = track.get_ATOF_S2_stepper(); + if (stepper_s2 != null) { + bank.setFloat("atof_s2_x", row, (float) stepper_s2.y[0]); + bank.setFloat("atof_s2_y", row, (float) stepper_s2.y[1]); + bank.setFloat("atof_s2_z", row, (float) stepper_s2.y[2]); + bank.setFloat("atof_s2_path", row, (float) stepper_s2.sTot); + bank.setFloat("atof_s2_p", row, (float) stepper_s2.p()); + } + + // track projection on ATOF surface S3 + Stepper stepper_s3 = track.get_ATOF_S3_stepper(); + if (stepper_s3 != null) { + bank.setFloat("atof_s3_x", row, (float) stepper_s3.y[0]); + bank.setFloat("atof_s3_y", row, (float) stepper_s3.y[1]); + bank.setFloat("atof_s3_z", row, (float) stepper_s3.y[2]); + bank.setFloat("atof_s3_path", row, (float) stepper_s3.sTot); + bank.setFloat("atof_s3_p", row, (float) stepper_s3.p()); + } + + bank.setInt("atof_region", row, track.get_ATOF_region()); + bank.setByte("atof_match", row, (byte) ((track.getATOFHits().size() > 0) ? 1 : 0)); + row++; } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java index 008e892104..3d9482b5a8 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java @@ -2,6 +2,7 @@ import org.apache.commons.math3.linear.Array2DRowRealMatrix; import org.apache.commons.math3.linear.ArrayRealVector; +import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.linear.RealVector; import org.jlab.detector.calib.utils.DatabaseConstantProvider; @@ -9,8 +10,9 @@ import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; import org.jlab.geom.detector.alert.AHDC.AlertDCFactory; +import org.jlab.rec.ahdc.KalmanFilter.KFHit; -public class Hit implements Comparable { +public class Hit implements Comparable, KFHit { private final int id; private final int superLayerId; @@ -33,6 +35,16 @@ public class Hit implements Comparable { private int trackId; //updated constructor with ADC + /** + * + * @param _Id is AHDC::adc row id + 1 + * @param _Super_layer super layer id + * @param _Layer layer id + * @param _Wire wire id + * @param _Doca distance from the timing information using the time2distance, matches {@link Hit.#time} + * @param _ADC raw ADC + * @param _Time calibrated time + */ public Hit(int _Id, int _Super_layer, int _Layer, int _Wire, double _Doca, double _ADC, double _Time) { this.id = _Id; this.superLayerId = _Super_layer; @@ -110,6 +122,7 @@ public Line3D getLine() { return wireLine; } + @Override public double getRadius() { return radius; } @@ -136,6 +149,7 @@ public double getY() { public double getPhi() {return phi;} + /** Get calibrated ADC */ public double getADC() {return adc;} public double getResidual() { @@ -146,18 +160,22 @@ public void setResidual(double resid) { this.residual = resid; } + /** Set calibrated ToT */ public void setToT(double _tot) { this.tot = _tot; } + /** Get calibrated ToT */ public double getToT() { return tot; } + /** Set calibrated ADC */ public void setADC(double _adc) { this.adc = _adc; } + /** Get raw ADC */ public double getRawADC() { return raw_adc; } @@ -174,11 +192,13 @@ public void setTrackId(int _trackId) { this.trackId = _trackId; } - public RealVector get_Vector() { + @Override + public RealVector getMeasurementVector() { return new ArrayRealVector(new double[]{this.doca}); } - public RealMatrix get_MeasurementNoise() { + @Override + public RealMatrix getMeasurementNoiseMatrix() { double mean_error = 0.471; // mm (no difference between adc and time) double error_on_adc = (1.15146*raw_adc + 437.63)/(3.21187*raw_adc + 878.855); // mm double error_on_time = (0.4423*time + 13.7215)/(0.846038*time + 31.9867); // mm @@ -188,11 +208,50 @@ public RealMatrix get_MeasurementNoise() { //return new Array2DRowRealMatrix(new double[][]{{0.09}}); } - // a signature for KalmanFilter.Hit_beam - public RealVector get_Vector_beam() { - return null; + // Projection function + @Override + public RealVector getProjectionVector(RealVector x) { + double d = this.distance(new Point3D(x.getEntry(0), x.getEntry(1), x.getEntry(2))); + return MatrixUtils.createRealVector(new double[]{d}); } + @Override + public RealVector getInnovationVector(RealVector x) { + RealVector measured = getMeasurementVector(); + RealVector predicted = getProjectionVector(x); + return measured.subtract(predicted); + } + + // Jacobian matrix of the measurement with respect to (x, y, z, px, py, pz) + @Override + public RealMatrix getProjectionMatrix(RealVector x) { + + double ddocadx = partialProjectionMatrix(x, 0); + double ddocady = partialProjectionMatrix(x, 1); + double ddocadz = partialProjectionMatrix(x, 2); + double ddocadpx = partialProjectionMatrix(x, 3); + double ddocadpy = partialProjectionMatrix(x, 4); + double ddocadpz = partialProjectionMatrix(x, 5); + + return MatrixUtils.createRealMatrix(new double[][]{ + {ddocadx, ddocady, ddocadz, ddocadpx, ddocadpy, ddocadpz}}); + } + + private double partialProjectionMatrix(RealVector x, int i) { + double h = 1e-8;// in mm + RealVector x_plus = x.copy(); + RealVector x_minus = x.copy(); + + x_plus.setEntry(i, x_plus.getEntry(i) + h); + x_minus.setEntry(i, x_minus.getEntry(i) - h); + + double doca_plus = this.getProjectionVector(x_plus).getEntry(0); + double doca_minus = this.getProjectionVector(x_minus).getEntry(0); + + return (doca_plus - doca_minus) / (2 * h); + } + + @Override public double distance(Point3D point3D) { return this.wireLine.distance(point3D).length(); } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Hit_beam.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Hit_beam.java deleted file mode 100644 index fd25c2e94d..0000000000 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Hit_beam.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.jlab.rec.ahdc.KalmanFilter; - -import org.apache.commons.math3.linear.ArrayRealVector; -import org.apache.commons.math3.linear.RealVector; -import org.jlab.geom.prim.Line3D; -import org.jlab.geom.prim.Point3D; -import org.jlab.rec.ahdc.Hit.Hit; - -/** - * A weird object that just want to be considered as a Hit - * The methods that matters are : distance(), getLine(), get_Vector_beam(), getRadius() - * - * @author Mathieu Ouillon - * @author Éric Fuchey - * @author Felix Touchte Codjo - */ -public class Hit_beam extends Hit { - - private double x,y,z; - private double r,phi; - Line3D beamline; - - public Hit_beam(double x, double y , double z) { - super(0,0,0,0, 0, 0, -1); - this.x = x; - this.y = y; - this.z = z; - this.r = Math.hypot(x,y); - this.phi = Math.atan2(y,x); - beamline = new Line3D(x,y,0,x,y,1); // a line parallel to the beam axis - } - - @Override - public RealVector get_Vector_beam() { - return new ArrayRealVector(new double[] {this.r, this.phi, this.z}); - } - - @Override - public Line3D getLine() { - return beamline; - } - - @Override - public double distance(Point3D point3D) { - return this.beamline.distance(point3D).length(); - } - - @Override - public double getRadius() { - return r; - } -} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFHit.java new file mode 100644 index 0000000000..7cf2237048 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFHit.java @@ -0,0 +1,29 @@ +package org.jlab.rec.ahdc.KalmanFilter; + +import org.apache.commons.math3.linear.RealMatrix; +import org.apache.commons.math3.linear.RealVector; +import org.jlab.geom.prim.Point3D; +/** + * An interface to unify the hits used the Kalman Filter (e.g AHDC hits, ATOF hits, beamline) + * + * @author Felix Touchte Codjo + */ +public interface KFHit { + public double distance(Point3D point3D); + public double getRadius(); + /** Return the measurement encoded in this KFHit */ + public RealVector getMeasurementVector(); + /** Return the measurement noise matrix for this this KFHit */ + public RealMatrix getMeasurementNoiseMatrix(); + /** Compute the measurement for a given state vector */ + public RealVector getProjectionVector(RealVector x); + /** Compute the Jacobian matrix of the {@link #getProjectionVector(RealVector)} with respect of the components of the state vector */ + public RealMatrix getProjectionMatrix(RealVector x); + + /** + * Compute the innovation by subtracting {@link #getMeasurementVector()} and {@link #getProjectionVector(RealVector)} + * @param x current state estimation + * @return return the innovation vector + */ + public RealVector getInnovationVector(RealVector x); +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java index 7263d6638f..08b468522a 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java @@ -2,7 +2,6 @@ import java.util.HashMap; -import org.apache.commons.math3.linear.Array2DRowRealMatrix; import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.linear.RealVector; @@ -22,24 +21,23 @@ public class KFitter { private RealVector stateEstimation; private RealMatrix errorCovariance; - public final Stepper stepper; + private Stepper stepper; private final Propagator propagator; private final HashMap materialHashMap; public double chi2 = 0; // masses/energies in MeV private final double electron_mass_c2 = PhysicsConstants.massElectron() * 1000; private final double proton_mass_c2 = PhysicsConstants.massProton() * 1000; - private double[] vertex_resolutions = {0.09,1e10}; // default values // dr^2 and dz^2 in mm^2 - public KFitter(final RealVector initialStateEstimate, final RealMatrix initialErrorCovariance, final Stepper stepper, final Propagator propagator, final HashMap materialHashMap) { - this.stateEstimation = initialStateEstimate; - this.errorCovariance = initialErrorCovariance; - this.stepper = stepper; + public KFitter(final RealVector initialStateEstimate, final RealMatrix initialErrorCovariance, final Propagator propagator, final HashMap materialHashMap) { + this.stateEstimation = initialStateEstimate.copy(); + this.errorCovariance = initialErrorCovariance.copy(); + this.stepper = new Stepper(initialStateEstimate.toArray()); this.propagator = propagator; this.materialHashMap = materialHashMap; } - public void predict(Hit hit, boolean direction) throws Exception { + public void predict(KFHit hit, boolean direction) throws Exception { // Initialization stepper.initialize(direction); Stepper stepper1 = new Stepper(stepper.y); @@ -86,39 +84,17 @@ public void predict(Hit hit, boolean direction) throws Exception { errorCovariance = (transitionMatrix.multiply(errorCovariance.multiply(transitionMatrixT))).add(processNoise); } - public void correct(Hit hit) { - RealVector z; - RealMatrix measurementNoise; - RealMatrix measurementMatrix; - RealVector h; - // check if the hit is the beamline - if (hit.getRadius() < 1) { - // the diagonal elements are the squared errors in r, phi, z - measurementNoise = - new Array2DRowRealMatrix( - new double[][]{ - {vertex_resolutions[0], 0.0000, 0.0000}, - {0.00, 1e10, 0.0000}, - {0.00, 0.0000, vertex_resolutions[1]} - });//3x3 - measurementMatrix = H_beam(stateEstimation);//6x3 - h = h_beam(stateEstimation);//3x1 - z = hit.get_Vector_beam();//0! - } - // else, it is an AHDC hits - else { - measurementNoise = hit.get_MeasurementNoise();//1x1 - measurementMatrix = H(stateEstimation, hit);//6x1 - h = h(stateEstimation, hit);//1x1 - z = hit.get_Vector();//1x1 - } + public void correct(KFHit hit) { + + RealMatrix measurementNoise = hit.getMeasurementNoiseMatrix(); + RealMatrix measurementMatrix = hit.getProjectionMatrix(stateEstimation); RealMatrix measurementMatrixT = measurementMatrix.transpose(); // S = H * P(k) * H' + R RealMatrix S = measurementMatrix.multiply(errorCovariance).multiply(measurementMatrixT).add(measurementNoise); // Inn = z(k) - h(xHat(k)-) - RealVector innovation = z.subtract(h); + RealVector innovation = hit.getInnovationVector(stateEstimation); double chi2inc = innovation.dotProduct(MatrixUtils.inverse(S).operate(innovation)); chi2 += chi2inc; @@ -138,6 +114,7 @@ public void correct(Hit hit) { stepper.y = stateEstimation.toArray(); } + // specific to AHDC hits public double residual(Hit hit) { double d = hit.distance( new Point3D( stateEstimation.getEntry(0), stateEstimation.getEntry(1), stateEstimation.getEntry(2) ) ); return hit.getDoca()-d; @@ -147,7 +124,7 @@ public void ResetErrorCovariance(final RealMatrix initialErrorCovariance){ this.errorCovariance = initialErrorCovariance; } - private RealMatrix F(Hit hit, Stepper stepper1) throws Exception { + private RealMatrix F(KFHit hit, Stepper stepper1) throws Exception { double[] dfdx = subfunctionF(hit, stepper1, 0); double[] dfdy = subfunctionF(hit, stepper1, 1); @@ -160,7 +137,7 @@ private RealMatrix F(Hit hit, Stepper stepper1) throws Exception { {dfdx[0], dfdy[0], dfdz[0], dfdpx[0], dfdpy[0], dfdpz[0]}, {dfdx[1], dfdy[1], dfdz[1], dfdpx[1], dfdpy[1], dfdpz[1]}, {dfdx[2], dfdy[2], dfdz[2], dfdpx[2], dfdpy[2], dfdpz[2]}, {dfdx[3], dfdy[3], dfdz[3], dfdpx[3], dfdpy[3], dfdpz[3]}, {dfdx[4], dfdy[4], dfdz[4], dfdpx[4], dfdpy[4], dfdpz[4]}, {dfdx[5], dfdy[5], dfdz[5], dfdpx[5], dfdpy[5], dfdpz[5]}}); } - double[] subfunctionF(Hit hit, Stepper stepper1, int i) throws Exception { + double[] subfunctionF(KFHit hit, Stepper stepper1, int i) throws Exception { double h = 1e-8;// in mm Stepper stepper_plus = new Stepper(stepper1.y); Stepper stepper_minus = new Stepper(stepper1.y); @@ -184,87 +161,6 @@ private RealMatrix F(Hit hit, Stepper stepper1) throws Exception { return new double[]{dxdi, dydi, dzdi, dpxdi, dpydi, dpzdi}; } - // Measurement matrix in 1x1 dimension: minimize distance - doca - private RealVector h(RealVector x, Hit hit) { - double d = hit.distance(new Point3D(x.getEntry(0), x.getEntry(1), x.getEntry(2))); - return MatrixUtils.createRealVector(new double[]{d}); - } - - // Jacobian matrix of the measurement with respect to (x, y, z, px, py, pz) - private RealMatrix H(RealVector x, Hit hit) { - - double ddocadx = subfunctionH(x, hit, 0); - double ddocady = subfunctionH(x, hit, 1); - double ddocadz = subfunctionH(x, hit, 2); - double ddocadpx = subfunctionH(x, hit, 3); - double ddocadpy = subfunctionH(x, hit, 4); - double ddocadpz = subfunctionH(x, hit, 5); - - return MatrixUtils.createRealMatrix(new double[][]{ - {ddocadx, ddocady, ddocadz, ddocadpx, ddocadpy, ddocadpz}}); - } - - double subfunctionH(RealVector x, Hit hit, int i) { - double h = 1e-8;// in mm - RealVector x_plus = x.copy(); - RealVector x_minus = x.copy(); - - x_plus.setEntry(i, x_plus.getEntry(i) + h); - x_minus.setEntry(i, x_minus.getEntry(i) - h); - - double doca_plus = h(x_plus, hit).getEntry(0); - double doca_minus = h(x_minus, hit).getEntry(0); - - return (doca_plus - doca_minus) / (2 * h); - } - - // Measurement matrix for the beamline (Hit_beam) in dimeansion 3x1 - private RealVector h_beam(RealVector x) { - - double xx = x.getEntry(0); - double yy = x.getEntry(1); - double zz = x.getEntry(2); - - double r = Math.hypot(xx, yy); - double phi = Math.atan2(yy, xx); - - return MatrixUtils.createRealVector(new double[]{r, phi, zz}); - } - - // Jacobian matrix of the measurement for the beamline with respect to (x, y, z, px, py, pz) - private RealMatrix H_beam(RealVector x) { - - double xx = x.getEntry(0); - double yy = x.getEntry(1); - - double drdx = (xx) / (Math.hypot(xx, yy)); - double drdy = (yy) / (Math.hypot(xx, yy)); - double drdz = 0.0; - double drdpx = 0.0; - double drdpy = 0.0; - double drdpz = 0.0; - - double dphidx = -(yy) / (xx * xx + yy * yy); - double dphidy = (xx) / (xx * xx + yy * yy); - double dphidz = 0.0; - double dphidpx = 0.0; - double dphidpy = 0.0; - double dphidpz = 0.0; - - double dzdx = 0.0; - double dzdy = 0.0; - double dzdz = 1.0; - double dzdpx = 0.0; - double dzdpy = 0.0; - double dzdpz = 0.0; - - return MatrixUtils.createRealMatrix( - new double[][]{ - {drdx, drdy, drdz, drdpx, drdpy, drdpz}, - {dphidx, dphidy, dphidz, dphidpx, dphidpy, dphidpz}, - {dzdx, dzdy, dzdz, dzdpx, dzdpy, dzdpz} - }); - } public RealVector getStateEstimationVector() { return stateEstimation.copy(); @@ -273,10 +169,8 @@ public RealVector getStateEstimationVector() { public RealMatrix getErrorCovarianceMatrix() { return errorCovariance.copy(); } - - public void setVertexResolution(double[] res) { - vertex_resolutions[0] = res[0]; - vertex_resolutions[1] = res[1]; - } + + /** Return a copy of the stepper. It is like a snapshot of the propagation. */ + public Stepper getStepper() {return new Stepper(stepper);} } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java index 26dcf2ee7f..7380ccefd6 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java @@ -1,22 +1,24 @@ package org.jlab.rec.ahdc.KalmanFilter; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; +import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.commons.math3.linear.ArrayRealVector; -import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.linear.RealVector; -import org.jlab.clas.pdg.PDGDatabase; import org.jlab.clas.pdg.PDGParticle; import org.jlab.clas.tracking.kalmanfilter.Material; -import org.jlab.io.base.DataBank; -import org.jlab.io.base.DataEvent; import org.jlab.rec.ahdc.Hit.Hit; import org.jlab.rec.alert.Track.Track; +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.geom.base.Component; +import org.jlab.geom.detector.alert.ATOF.AlertTOFDetector; +import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; +import org.jlab.geom.prim.Point3D; -//import org.apache.commons.math3.linear.RealMatrixFormat; /** * This is the main routine of the Kalman Filter. The fit is done by a KFitter @@ -31,149 +33,380 @@ public class KalmanFilter { public KalmanFilter(PDGParticle particle, int Niter) {this.particle = particle; this.Niter = Niter;} - public KalmanFilter(ArrayList tracks, DataEvent event, final double magfield, boolean IsMC) {propagation(tracks, event, magfield, IsMC);} + static final Logger LOGGER = Logger.getLogger(KalmanFilter.class.getName()); + + HashMap materialHashMap = MaterialMap.generateMaterials(); private PDGParticle particle; private int Niter = 40; // number of iterations for the Kalman Filter - private boolean IsVtxDefined = false; // implemented but not used yet - private double[] vertex_resolutions = {0.09, 1e10}; // {error in r squared in mm^2, error in z squared in mm^2} - // mm, CLAS and AHDC don't necessary have the same alignement (ZERO), this parameter may be subject to calibration - private double clas_alignement = -54; + private double vz_constraint = 0; + private boolean IsVtxDefined = false; + + // mm, they are the misalignement with respect to the AHDC: the are defined in ALERTEngine + private double atof_alignement = 0; - public void propagation(ArrayList tracks, DataEvent event, final double magfield, boolean IsMC) { + private int counter = 0; // number of utilisation of the Kalman Filter + + AlertTOFDetector ATOFdet = null; // reference to the ATOF geometry + HashMap> ATOF_hits_predicted = new HashMap<>(); // trackid vs (sector, layer, wedge) + + public void propagation(ArrayList tracks, final double magfield, boolean IsMC) { try { - double vz_constraint = 0; // to be linked to the electron vertex + counter++; // Initialization --------------------------------------------------------------------- final int numberOfVariables = 6; final double tesla = 0.001; final double[] B = {0.0, 0.0, magfield / 10 * tesla}; - HashMap materialHashMap = MaterialMap.generateMaterials(); - // Recover the vertex of the electron - if (event.hasBank("REC::Particle")) { - DataBank recBank = event.getBank("REC::Particle"); - int row = 0; - while ((!IsVtxDefined) && row < recBank.rows()) { - if (recBank.getInt("pid", row) == 11) { - IsVtxDefined = true; - vz_constraint = 10*recBank.getFloat("vz",row) - (IsMC ? 0 : clas_alignement); // mm - //////////////////////////////////////// - /// compute electron resolution here - /// it depends en p and theta - /// the fine tuning will be done later - /// //////////////////////////////////// - //double px = recBank.getFloat("px",row); - //double py = recBank.getFloat("py",row); - //double pz = recBank.getFloat("pz",row); - //double p = Math.sqrt(px*px+py*py+pz*pz); - //double theta = Math.acos(pz/p); - vertex_resolutions[0] = 0.09; - vertex_resolutions[1] = 64;//4 + 1e10*theta + 1e10*p; - } - row++; - } - } - + + // Loop over tracks for (Track track : tracks) { - // Initialize state vector + /// Initialize state vector double x0 = 0.0; double y0 = 0.0; - double z0 = IsVtxDefined ? vz_constraint : track.get_Z0(); + double z0 = (IsVtxDefined && counter < 2) ? vz_constraint : track.get_Z0(); double px0 = track.get_px(); double py0 = track.get_py(); double pz0 = track.get_pz(); double[] y = new double[]{x0, y0, z0, px0, py0, pz0}; - // Read list of hits + + /// Read list of hits + RadialKFHit beam_hit = track.getBeamlineHit(); ArrayList AHDC_hits = track.getHits(); - Collections.sort(AHDC_hits); // sorted following the compareTo() method in Hit.java + ArrayList ATOF_hits = track.getATOFHits(); - // Start propagation - Stepper stepper = new Stepper(y); + /// Initialize propagator RungeKutta4 RK4 = new RungeKutta4(particle, numberOfVariables, B); Propagator propagator = new Propagator(RK4); - // Initialization of the Kalman Fitter - // for the error matrix: first 3 lines in mm^2; last 3 lines in MeV^2 - RealVector initialStateEstimate = new ArrayRealVector(stepper.y); - RealMatrix initialErrorCovariance = MatrixUtils.createRealMatrix(new double[][]{{50.0, 0.0, 0.0, 0.0, 0.0, 0.0}, {0.0, 50.0, 0.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 900.0, 0.0, 0.0, 0.0}, {0.0, 0.0, 0.0, 100.00, 0.0, 0.0}, {0.0, 0.0, 0.0, 0.0, 100.00, 0.0}, {0.0, 0.0, 0.0, 0.0, 0.0, 900.0}}); - KFitter TrackFitter = new KFitter(initialStateEstimate, initialErrorCovariance, stepper, propagator, materialHashMap); - if (IsVtxDefined) TrackFitter.setVertexResolution(vertex_resolutions); + /// Initialization of the Kalman Fitter + RealVector initialStateEstimate = new ArrayRealVector(y); + RealMatrix initialErrorCovariance = track.getErrorCovarianceMatrix(); + KFitter TrackFitter = new KFitter(initialStateEstimate, initialErrorCovariance, propagator, materialHashMap); // Loop over number of iterations for (int k = 0; k < Niter; k++) { - // Forward propagation + + // Forward propagation in AHDC for (Hit hit : AHDC_hits) { TrackFitter.predict(hit, true); TrackFitter.correct(hit); } - // Backward propagation (last layer to first layer) - for (int i = AHDC_hits.size() - 2; i >= 0; i--) { + + // Take into account ATOF hits + if (!AHDC_hits.isEmpty() && !ATOF_hits.isEmpty()) { + // Forward propagation in ATOF + for (KFHit hit : ATOF_hits) { + TrackFitter.predict(hit, true); + TrackFitter.correct(hit); + } + // Backward propagation in ATOF + for (int i = ATOF_hits.size()-2; i >= 0; i--){ + KFHit hit = ATOF_hits.get(i); + TrackFitter.predict(hit, false); + TrackFitter.correct(hit); + } + // Backward propagation to the last AHDC layer + { + Hit hit = AHDC_hits.getLast(); + TrackFitter.predict(hit, false); + TrackFitter.correct(hit); + } + } + + // Backward propagation (from AHDC last layer to first AHDC layer) + for (int i = AHDC_hits.size()-2; i >= 0; i--) { Hit hit = AHDC_hits.get(i); TrackFitter.predict(hit, false); TrackFitter.correct(hit); } - // Backward propagation (first layer to beamline) + + // Backward propagation (from first AHDC layer to beamline) { - Hit hit = new Hit_beam(0, 0, vz_constraint); - TrackFitter.predict(hit, false); - TrackFitter.correct(hit); + TrackFitter.predict(beam_hit, false); + TrackFitter.correct(beam_hit); } - } - - /*RealMatrixFormat format = - new RealMatrixFormat( - "[\n", "\n]", // matrix start/end - "[", "]", // row start/end - ",\n", // column separator - " ; ", // row separator - new java.text.DecimalFormat("0.0000") - ); - System.out.println("=====> Print error matrix"); - System.out.println(format.format(TrackFitter.getErrorCovarianceMatrix()));*/ + } // end loop over nb. iteration - + /// Output: position and momentum RealVector x_out = TrackFitter.getStateEstimationVector(); track.setPositionAndMomentumVec(x_out.toArray()); + track.setErrorCovarianceMatrix(TrackFitter.getErrorCovarianceMatrix()); - // Post fit propagation (no correction) to set the residuals - KFitter PostFitPropagator = new KFitter(TrackFitter.getStateEstimationVector(), initialErrorCovariance, new Stepper(TrackFitter.getStateEstimationVector().toArray()), new Propagator(RK4), materialHashMap); + /// Post fit propagation (no correction) + KFitter PostFitPropagator = new KFitter(TrackFitter.getStateEstimationVector(), initialErrorCovariance, new Propagator(RK4), materialHashMap); + + // Forward propagation in AHDC for (Hit hit : AHDC_hits) { PostFitPropagator.predict(hit, true); - if( hit.getId()>0){ // for the beamline the hit id is 0, so we only look at AHDC hits - hit.setResidual(PostFitPropagator.residual(hit)); - } + hit.setResidual(PostFitPropagator.residual(hit)); // output: residual } - - // Fill track and hit bank + + // Fill values for AHDC::kftrack // TO DO : s and p_drift have to be checked to be sure they represent what we want - double s = PostFitPropagator.stepper.sTot; - double p_drift = PostFitPropagator.stepper.p(); - int sum_adc = 0; + Stepper current_stepper = PostFitPropagator.getStepper(); + double s = current_stepper.sTot; + double p_drift = current_stepper.p(); double sum_residuals = 0; double chi2 = 0; for (Hit hit : AHDC_hits) { - sum_adc += hit.getADC(); sum_residuals += hit.getResidual(); - chi2 += Math.pow(hit.getResidual(),2)/hit.get_MeasurementNoise().getEntry(0,0); + chi2 += Math.pow(hit.getResidual(),2)/hit.getMeasurementNoiseMatrix().getEntry(0,0); } - track.set_sum_adc(sum_adc); track.set_sum_residuals(sum_residuals); track.set_chi2(chi2/(AHDC_hits.size()-3)); track.set_p_drift(p_drift); - track.set_dEdx(sum_adc/s); track.set_path(s); - track.set_n_hits(AHDC_hits.size()); + + /// At the end of the PostFit propagation towards the last layer of the AHDC + /// we project the track on the ATOF surface without any AI ATOF hit indication + if (ATOFdet != null) { + // Projection towards the ATOF surfaces + // R1 : radius of the lower surface of an ATOF bar + // R2 : radius of the upper surface of an ATOF bar = lower surface of an ATOF wedge + // R3 : radius of the upper surface of an ATOF wedge + // Illustration of an ATOF component : p0 and p3 are the points on the lower surface; p1 and p2 are the points on the upper surface + // p2 ---------- p1 + // \ / + // \ / + // p3 ------ p0 + Point3D pR1 = ATOFdet.getSector(0).getSuperlayer(0).getLayer(0).getComponent(10).getVolumePoint(0); + Point3D pR2 = ATOFdet.getSector(0).getSuperlayer(0).getLayer(0).getComponent(10).getVolumePoint(2); + Point3D pR3 = ATOFdet.getSector(0).getSuperlayer(1).getLayer(0).getComponent(0).getVolumePoint(2); + double R1 = Math.hypot(pR1.x(), pR1.y()); + double R2 = Math.hypot(pR2.x(), pR2.y()); + double R3 = Math.hypot(pR3.x(), pR3.y()); + + /// From last AHDC hit to surface R1 + RadialSurfaceKFHit hitR1 = new RadialSurfaceKFHit(R1); + PostFitPropagator.predict(hitR1, true); + Stepper stepperR1 = PostFitPropagator.getStepper(); + track.set_ATOF_S1_stepper(stepperR1); // to store : x,y,z, path, p in AHDC::kftrack + if (Math.abs(stepperR1.r() - R1) < 1.5*stepperR1.h) { + track.set_ATOF_region(1); // indicate if we reach this surface or not + } + + /// From surface R1 to surface R2 + RadialSurfaceKFHit hitR2 = new RadialSurfaceKFHit(R2); + PostFitPropagator.predict(hitR2, true); + Stepper stepperR2 = PostFitPropagator.getStepper(); + track.set_ATOF_S2_stepper(stepperR2); // to store : x,y,z, path, p in AHDC::kftrack + if (Math.abs(stepperR2.r() - R2) < 1.5*stepperR2.h) { + track.set_ATOF_region(2); // indicate if we reach this surface or not + } + // predict the wedge + double[] vecR2 = PostFitPropagator.getStateEstimationVector().toArray(); + Point3D posR2 = new Point3D(vecR2[0], vecR2[1], vecR2[2]); + posR2.translateXYZ(0, 0, atof_alignement); + ATOF_hits_predicted.put(track.get_trackId(), predict_adjacent_wedges(ATOFdet, posR2)); + + + /// From surface R2 to surface R3 + RadialSurfaceKFHit hitR3 = new RadialSurfaceKFHit(R3); + PostFitPropagator.predict(hitR3, true); + Stepper stepperR3 = PostFitPropagator.getStepper(); + track.set_ATOF_S3_stepper(stepperR3); // to store : x,y,z, path, p in AHDC::kftrack + if (Math.abs(stepperR3.r() - R3) < 1.5*stepperR3.h) { + track.set_ATOF_region(3); // indicate if we reach this surface or not + } + + } // end propagation towards ATOF surface + }//end of loop on track candidates } catch (Exception e) { - //e.printStackTrace(); - //System.out.println("======> Kalman Filter Error"); + LOGGER.log(Level.FINE, "Kalman Filter propagation failed...", e); + } + } + public void set_Niter(int Niter) {this.Niter = Niter;} + public int get_Niter() {return this.Niter;} + public void set_particle(PDGParticle particle) {this.particle = particle;} + public PDGParticle get_particle() {return this.particle;} + public HashMap> get_ATOF_hits_predicted() {return this.ATOF_hits_predicted;} + + // Test + public static void main(String[] args) { + // ATOF detector + AlertTOFDetector atof = (new AlertTOFFactory()).createDetectorCLAS(new DatabaseConstantProvider()); + + int Npts = 1000; + int counter = 0; + int err = 0; + for (int i = 0; i < Npts; i++) { + Random rand = new Random(); + int true_sector = rand.nextInt(15); + int true_layer = rand.nextInt(4); + int true_wedge = rand.nextInt(10); + + Component comp = atof.getSector(true_sector).getSuperlayer(1).getLayer(true_layer).getComponent(true_wedge); + // top face + Point3D p0 = comp.getVolumePoint(0); + Point3D p1 = comp.getVolumePoint(1); + Point3D p2 = comp.getVolumePoint(2); + Point3D p3 = comp.getVolumePoint(3); + // bottom face + Point3D p4 = comp.getVolumePoint(4); + Point3D p5 = comp.getVolumePoint(5); + Point3D p6 = comp.getVolumePoint(6); + Point3D p7 = comp.getVolumePoint(7); + + // Random point int he current wedge volume + //Point3D pt = p0.lerp(p7, Math.random()); + //Point3D pt = comp.getMidpoint(); + double t0 = rand.nextDouble(1); + double t1 = rand.nextDouble(1-t0); + double t2 = rand.nextDouble(1-t0-t1); + double t3 = 1-t0-t1-t2; + //System.out.printf("t0 + t1 + t2 + t3 = %f\n", t0+t1+t2+t3); + double t4 = rand.nextDouble(1); + double t5 = rand.nextDouble(1-t4); + double t6 = rand.nextDouble(1-t4-t5); + double t7 = 1-t4-t5-t6; + //System.out.printf("t4 + t5 + t6 + t7 = %f\n", t4+t5+t6+t7); + double x_top = t0*p0.x() + t1*p1.x() + t2*p2.x() + t3*p3.x(); + double y_top = t0*p0.y() + t1*p1.y() + t2*p2.y() + t3*p3.y(); + double x_bot = t4*p4.x() + t5*p5.x() + t6*p6.x() + t7*p7.x(); + double y_bot = t4*p4.y() + t5*p5.y() + t6*p6.y() + t7*p7.y(); + Point3D pt_top = new Point3D(x_top, y_top, p0.z()); + Point3D pt_bot = new Point3D(x_bot, y_bot, p4.z()); + Point3D pt = pt_top.lerp(pt_bot, Math.random()); + //System.out.printf("distance from midpoint : %f\n", comp.getMidpoint().distance(pt)); + + // Test the algoritm + int[] res = KalmanFilter.predict_wedge(atof, pt); + + if (res[0] == true_sector && res[1] == true_layer && res[2] == true_wedge) { + counter++; + } else { + err++; + System.out.printf("%d) Initial wedge : sector (% 2d) layer (% 2d) wedge (% 2d)\n", err, true_sector, true_layer, true_wedge); + System.out.printf("%d) Predicted wedge : sector (% 2d) layer (% 2d) wedge (% 2d)\n", err, res[0], res[1], res[2]); + } + } + System.out.printf("Nb of testing : %d\n", Npts); + System.out.printf("Nb of success : %d (%.2f %%)\n", counter, 100.0*counter/Npts); + } + /** + * @param pt is defined in the center of the ATOF + */ + static public int[] predict_wedge(AlertTOFDetector atof, Point3D pt) { + // find the wedge + int wedge = -1; + double dz = 1e10; + for (int c = 0; c < atof.getSector(0).getSuperlayer(1).getLayer(0).getNumComponents(); c++) { + Point3D midpoint = atof.getSector(0).getSuperlayer(1).getLayer(0).getComponent(c).getMidpoint(); + if (Math.abs(midpoint.z()-pt.z()) < dz) { + dz = Math.abs(midpoint.z()-pt.z()); + wedge = c; + } + } + if (wedge == -1) return null; + // find sector and layer + int sector = -1; + int layer = -1; + double d = 1e10; + for (int s = 0; s < atof.getNumSectors(); s++) { + for (int l = 0; l < atof.getSector(s).getSuperlayer(1).getNumLayers(); l++) { + Point3D midpoint = atof.getSector(s).getSuperlayer(1).getLayer(l).getComponent(wedge).getMidpoint(); + if (midpoint.distance(pt) < d) { + d = midpoint.distance(pt); + sector = s; + layer = l; + } + } + } + if (sector == -1 || layer == -1) { + return null; + } else { + return new int[] {sector, layer, wedge}; } } - void set_Niter(int Niter) {this.Niter = Niter;} - void set_particle(PDGParticle particle) {this.particle = particle;} + + /** + * @param pt is defined in the center of the ATOF + */ + static public int[] predict_bar(AlertTOFDetector atof, Point3D pt) { + // find sector and layer + int sector = -1; + int layer = -1; + double d = 1e10; + for (int s = 0; s < atof.getNumSectors(); s++) { + for (int l = 0; l < atof.getSector(s).getSuperlayer(0).getNumLayers(); l++) { + Point3D midpoint = atof.getSector(s).getSuperlayer(0).getLayer(l).getComponent(10).getMidpoint(); + double distance = midpoint.vectorTo(pt).rho(); + if (distance < d) { + d = distance; + sector = s; + layer = l; + } + } + } + if (sector == -1 || layer == -1) { + return null; + } else { + return new int[] {sector, layer, 10}; + } + } + + public ArrayList predict_adjacent_wedges(AlertTOFDetector atof, Point3D pt) { + int[] closest_wedge_id = predict_wedge(atof, pt); + if (closest_wedge_id == null) { + return new ArrayList(); // an empty list + } + + int sector = closest_wedge_id[0]; + int layer = closest_wedge_id[1]; + int wedge = closest_wedge_id[2]; + + // find adjacent layer and sector + int sector_plus = sector; + int sector_minus = sector; + int layer_plus = layer+1; + int layer_minus = layer-1; + if (layer == 0) { + sector_plus = sector; + sector_minus = Math.floorMod(sector-1, 15); + layer_plus = layer+1; + layer_minus = 3; + } + else if (layer == 3) { + sector_plus = Math.floorMod(sector+1, 15); + sector_minus = sector; + layer_plus = 0; + layer_minus = layer-1; + } + // Here are all the adjacents wedges (maximum 9) + ArrayList listOfWedges = new ArrayList<>(); + listOfWedges.add(new int[]{sector, layer, wedge}); + listOfWedges.add(new int[]{sector_plus, layer_plus, wedge}); + listOfWedges.add(new int[]{sector_minus, layer_minus, wedge}); + if (wedge-1 >= 0) { + listOfWedges.add(new int[]{sector, layer, wedge-1}); + listOfWedges.add(new int[]{sector_plus, layer_plus, wedge-1}); + listOfWedges.add(new int[]{sector_minus, layer_minus, wedge-1}); + } + if (wedge+1 <= 9) { + listOfWedges.add(new int[]{sector, layer, wedge+1}); + listOfWedges.add(new int[]{sector_plus, layer_plus, wedge+1}); + listOfWedges.add(new int[]{sector_minus, layer_minus, wedge+1}); + } + + // order the list following the distance to the initial point + listOfWedges.sort((a,b) -> { + double da = atof.getSector(a[0]).getSuperlayer(1).getLayer(a[1]).getComponent(a[2]).getMidpoint().distance(pt); + double db = atof.getSector(b[0]).getSuperlayer(1).getLayer(b[1]).getComponent(b[2]).getMidpoint().distance(pt); + return Double.compare(da, db); + }); + + return listOfWedges; + } + + public void set_ATOF_detector(AlertTOFDetector atof) { this.ATOFdet = atof;} + public void set_atof_alignement(double _shift) {this.atof_alignement = _shift;} + public void set_vz_constraint(double _vz) {this.vz_constraint = _vz;} + public void set_vertex_flag(boolean _flag) {this.IsVtxDefined = _flag;} } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Propagator.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Propagator.java index e85021addb..6f4f58a835 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Propagator.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/Propagator.java @@ -1,13 +1,10 @@ package org.jlab.rec.ahdc.KalmanFilter; -//import java.util.Arrays; - import org.apache.commons.math3.linear.ArrayRealVector; import org.apache.commons.math3.linear.RealVector; import org.jlab.geom.prim.Point3D; import org.jlab.clas.tracking.kalmanfilter.Material; import java.util.HashMap; -import org.jlab.rec.ahdc.Hit.Hit; /** * Is responsible of the propagation @@ -27,7 +24,7 @@ public Propagator(RungeKutta4 rungeKutta4) { } // Propagate the stepper toward the next hit - void propagate(Stepper stepper, Hit hit, HashMap materialHashMap) { + void propagate(Stepper stepper, KFHit hit, HashMap materialHashMap) { // Do not allow more than 10000 steps (very critical cases) final int maxNbOfStep = 10000; @@ -95,9 +92,8 @@ void propagate(Stepper stepper, Hit hit, HashMap materialHashM } else { // the distance between the step is not so big but the distance with respect to the hit starts to increase - // so, go back to the previous step (the best we have) and stop the propagation, set the default step size + // so, go back to the previous step (the best we have) and stop the propagation stepper.copyContent(prev_stepper); - stepper.h = 0.5; break; } } @@ -161,7 +157,7 @@ void propagate(Stepper stepper, Hit hit, HashMap materialHashM } - public RealVector f(Stepper stepper, Hit hit, HashMap materialHashMap) { + public RealVector f(Stepper stepper, KFHit hit, HashMap materialHashMap) { propagate(stepper, hit, materialHashMap); return new ArrayRealVector(stepper.y); } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialKFHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialKFHit.java new file mode 100644 index 0000000000..2f2dbebc66 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialKFHit.java @@ -0,0 +1,128 @@ +package org.jlab.rec.ahdc.KalmanFilter; + +import org.apache.commons.math3.linear.ArrayRealVector; +import org.apache.commons.math3.linear.MatrixUtils; +import org.apache.commons.math3.linear.RealMatrix; +import org.apache.commons.math3.linear.RealVector; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; + +/** + * Implement a hit for which the state vector is a 3x1 matrix (r, phi, z) + * e.g beamline, ATOF wedges/bars + * + * @author Mathieu Ouillon + * @author Éric Fuchey + * @author Felix Touchte Codjo + */ +public class RadialKFHit implements KFHit { + + private double r,phi,z; + Line3D line; + RealMatrix measurementNoise = null; + + public RadialKFHit(double x, double y , double z) { + this.z = z; + this.r = Math.hypot(x,y); + this.phi = Math.atan2(y,x); + line = new Line3D(x,y,0,x,y,1); // a line parallel to the beam axis + } + + @Override + public RealVector getMeasurementVector() { + return new ArrayRealVector(new double[] {this.r, this.phi, this.z}); + } + + @Override + public RealMatrix getMeasurementNoiseMatrix() { + return measurementNoise; + } + + public void setMeasurementNoise(RealMatrix measurementNoise) { + this.measurementNoise= measurementNoise; + } + + @Override + public double distance(Point3D point3D) { + return this.line.distance(point3D).length(); + } + + @Override + public double getRadius() { + return r; + } + + // Projection function + @Override + public RealVector getProjectionVector(RealVector x) { + + double xx = x.getEntry(0); + double yy = x.getEntry(1); + double zz = x.getEntry(2); + + double r = Math.hypot(xx, yy); + double phi = Math.atan2(yy, xx); + + return MatrixUtils.createRealVector(new double[]{r, phi, zz}); + } + + // Jacobian matrix of the measurement for the beamline with respect to (x, y, z, px, py, pz) + @Override + public RealMatrix getProjectionMatrix(RealVector x) { + + double xx = x.getEntry(0); + double yy = x.getEntry(1); + + double drdx = (xx) / (Math.hypot(xx, yy)); + double drdy = (yy) / (Math.hypot(xx, yy)); + double drdz = 0.0; + double drdpx = 0.0; + double drdpy = 0.0; + double drdpz = 0.0; + + double dphidx = -(yy) / (xx * xx + yy * yy); + double dphidy = (xx) / (xx * xx + yy * yy); + double dphidz = 0.0; + double dphidpx = 0.0; + double dphidpy = 0.0; + double dphidpz = 0.0; + + double dzdx = 0.0; + double dzdy = 0.0; + double dzdz = 1.0; + double dzdpx = 0.0; + double dzdpy = 0.0; + double dzdpz = 0.0; + + return MatrixUtils.createRealMatrix( + new double[][]{ + {drdx, drdy, drdz, drdpx, drdpy, drdpz}, + {dphidx, dphidy, dphidz, dphidpx, dphidpy, dphidpz}, + {dzdx, dzdy, dzdz, dzdpx, dzdpy, dzdpz} + }); + } + + @Override + public RealVector getInnovationVector(RealVector x) { + RealVector measured = getMeasurementVector(); + RealVector predicted = getProjectionVector(x); + + double measuredRadius = measured.getEntry(0); + double measuredPhi = measured.getEntry(1); + double measuredZ = measured.getEntry(2); + + double predictedRadius = predicted.getEntry(0); + double predictedPhi = predicted.getEntry(1); + double predictedZ = predicted.getEntry(2); + + double dr = measuredRadius - predictedRadius; + double dz = measuredZ - predictedZ; + double dphi = Math.atan2( + Math.sin(measuredPhi - predictedPhi), + Math.cos(measuredPhi - predictedPhi) + ); // this ensures, we obtain an angle between -pi and pi + + return MatrixUtils.createRealVector(new double[]{dr, dphi, dz}); + } + +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialSurfaceKFHit.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialSurfaceKFHit.java new file mode 100644 index 0000000000..c108b92f09 --- /dev/null +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RadialSurfaceKFHit.java @@ -0,0 +1,85 @@ +package org.jlab.rec.ahdc.KalmanFilter; + +import org.apache.commons.math3.linear.Array2DRowRealMatrix; +import org.apache.commons.math3.linear.ArrayRealVector; +import org.apache.commons.math3.linear.MatrixUtils; +import org.apache.commons.math3.linear.RealMatrix; +import org.apache.commons.math3.linear.RealVector; +import org.jlab.geom.prim.Point3D; + +/** + * Implement a hit for which the state vector is a 3x1 matrix (r, phi, z) + * e.g beamline, ATOF wedges/bars + * + * @author Mathieu Ouillon + * @author Éric Fuchey + * @author Felix Touchte Codjo + */ +public class RadialSurfaceKFHit implements KFHit { + + private double r; + + public RadialSurfaceKFHit(double r) { + this.r = r; + } + + @Override + public RealVector getMeasurementVector() { + return new ArrayRealVector(new double[] {this.r}); + } + + @Override + public RealMatrix getMeasurementNoiseMatrix() { + return new Array2DRowRealMatrix(new double[][]{{1e-8}}); + } + + @Override + public double distance(Point3D point3D) { + return Math.abs(this.r - Math.hypot(point3D.x(), point3D.y())); + } + + @Override + public double getRadius() { + return r; + } + + // Projection function + @Override + public RealVector getProjectionVector(RealVector x) { + + double xx = x.getEntry(0); + double yy = x.getEntry(1); + + double r = Math.hypot(xx, yy); + + return MatrixUtils.createRealVector(new double[]{r}); + } + + // Jacobian matrix of the measurement for the beamline with respect to (x, y, z, px, py, pz) + @Override + public RealMatrix getProjectionMatrix(RealVector x) { + + double xx = x.getEntry(0); + double yy = x.getEntry(1); + + double drdx = (xx) / (Math.hypot(xx, yy)); + double drdy = (yy) / (Math.hypot(xx, yy)); + double drdz = 0.0; + double drdpx = 0.0; + double drdpy = 0.0; + double drdpz = 0.0; + + return MatrixUtils.createRealMatrix( + new double[][]{ + {drdx, drdy, drdz, drdpx, drdpy, drdpz} + }); + } + + @Override + public RealVector getInnovationVector(RealVector x) { + RealVector measured = getMeasurementVector(); + RealVector predicted = getProjectionVector(x); + return measured.subtract(predicted); + } + +} diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RungeKutta4.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RungeKutta4.java index b192ca978e..0331dc0f93 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RungeKutta4.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/RungeKutta4.java @@ -103,8 +103,7 @@ public void doOneStep(Stepper stepper) { } private double[] f(double[] y) { - double charge = 1.0; // the charge should by given by the particle object - // for now, we assume it is a proton + double charge = particle.charge(); double pModuleInverse = 1.0 / Math.sqrt(y[3] * y[3] + y[4] * y[4] + y[5] * y[5]); double k = charge * PhysicsConstants.speedOfLight() * 10 * pModuleInverse; @@ -133,13 +132,14 @@ private double[] f(double[] y) { private void energyLoss( double[] yIn, double h, org.jlab.clas.tracking.kalmanfilter.Material material) { double mass = particle.mass() * 1000; //particle mass defined in GeV, converted to MeV + int charge = particle.charge(); h /= 10; // h defined in mm, converted to cm double mom = Math.sqrt(yIn[3] * yIn[3] + yIn[4] * yIn[4] + yIn[5] * yIn[5]); double E = Math.sqrt(mom * mom + mass * mass); //material::getEloss(double p, double m) uses GeV and cm //see common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java - double dedx = material.getEloss(mom/1000, mass/1000) * 1000;//Momentum, mass input in GeV, output in GeV/cm, converted to MeV/cm + double dedx = material.getEloss(mom/1000, mass/1000, charge) * 1000;//Momentum, mass input in GeV, output in GeV/cm, converted to MeV/cm double DeltaE = dedx * h; stepper.dEdx += DeltaE; diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java index e108ee3493..43b9634bbb 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/Track.java @@ -1,9 +1,13 @@ package org.jlab.rec.alert.Track; import org.jlab.rec.alert.AI.InterCluster; +import org.apache.commons.math3.linear.MatrixUtils; +import org.apache.commons.math3.linear.RealMatrix; import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster; import org.jlab.rec.ahdc.HelixFit.HelixFitObject; import org.jlab.rec.ahdc.Hit.Hit; +import org.jlab.rec.ahdc.KalmanFilter.RadialKFHit; +import org.jlab.rec.ahdc.KalmanFilter.Stepper; import java.util.ArrayList; import java.util.List; @@ -95,7 +99,6 @@ public double get_pz() { public double get_chi2() {return chi2;} public double get_sum_residuals() {return sum_residuals;} // AHDC::track - public void set_dEdx(double _dEdx) { dEdx = _dEdx;} public void set_p_drift(double _p_drift) { p_drift = _p_drift;} public void set_path(double _path) { path = _path;} public double get_dEdx() { @@ -119,9 +122,7 @@ public double get_dEdx() { public int get_trackId() { return candidate.get_trackId(); } public void set_trackId(int id) { candidate.set_trackId(id); } public int get_n_hits() { return candidate.get_n_hits(); } - public void set_n_hits(int n) { candidate.set_n_hits(n); } public int get_sum_adc() { return candidate.get_sum_adc(); } - public void set_sum_adc(int s) { candidate.set_sum_adc(s); } public ArrayList getHits() { return candidate.getHits(); } public List get_Clusters() { return candidate.get_Clusters(); } public List getInterclusters() { return candidate.getInterclusters(); } @@ -140,4 +141,67 @@ public double get_dEdx() { public int get_predicted_ATOF_sector() { return candidate.get_predicted_ATOF_sector(); } public int get_predicted_ATOF_layer() { return candidate.get_predicted_ATOF_layer(); } public int get_predicted_ATOF_wedge() { return candidate.get_predicted_ATOF_wedge(); } + + // Recent extension of the Kalman Filter + /** + *

Error covariance matrix of the measurment around the beamline

+ * + *

This quite useful when one plan to run the Kalman filter several times. This object stores the current status of the error covariance matrix at the end of the backward propagation of an iteration.

+ * + *

First 3 lines in mm^2; last 3 lines in MeV^2 (in the beamline)

+ */ + RealMatrix errorCovarianceMatrix = MatrixUtils.createRealMatrix(new double[][]{ + {50 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0}, + {0.0 , 50 , 0.0 , 0.0 , 0.0 , 0.0}, + {0.0 , 0.0 , 900 , 0.0 , 0.0 , 0.0}, + {0.0 , 0.0 , 0.0 , 100 , 0.0 , 0.0}, + {0.0 , 0.0 , 0.0 , 0.0 , 100 , 0.0}, + {0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 900}}); + + /** + * Get the starting error covariance matrix {@link #errorCovarianceMatrix} (around the beamline) for the current KF iteration. + */ + public RealMatrix getErrorCovarianceMatrix() {return errorCovarianceMatrix;} + + private ArrayList ATOF_hits = new ArrayList<>(); + private RadialKFHit beamline_hit = null; + + public ArrayList getATOFHits() { + return this.ATOF_hits; + } + + public RadialKFHit getBeamlineHit() { + return this.beamline_hit; + } + + public void setATOFHits(ArrayList _ATOF_hits) {this.ATOF_hits = _ATOF_hits;} + + public void setBeamlineHit(RadialKFHit _beamline_hit) {this.beamline_hit = _beamline_hit;} + + /** + * Update the error covariance matrix {@link #errorCovarianceMatrix} + */ + public void setErrorCovarianceMatrix(RealMatrix errorCovarianceMatrix) {this.errorCovarianceMatrix = errorCovarianceMatrix;} + + // Position and momentum when the track crosses the ATOF surface + // S1 : lower surface of an ATOF bar + // S2 : upper surface of an ATOF bar = lower surface of an ATOF wedge + // S3 : upper surface of an ATOF wedge + Stepper ATOF_S1_stepper; + Stepper ATOF_S2_stepper; + Stepper ATOF_S3_stepper; + double ATOF_S1_radius; + double ATOF_S2_radius; + double ATOF_S3_radius; + int ATOF_region = 0; // is n if the trach reaches Sn, 0 otherwise (i.e does not reach S1) + + // Projection of the Track on the ATOF surfaces + public void set_ATOF_S1_stepper(Stepper _stepper) {this.ATOF_S1_stepper = _stepper;} + public void set_ATOF_S2_stepper(Stepper _stepper) {this.ATOF_S2_stepper = _stepper;} + public void set_ATOF_S3_stepper(Stepper _stepper) {this.ATOF_S3_stepper = _stepper;} + public void set_ATOF_region(int _n) {this.ATOF_region = _n;} + public Stepper get_ATOF_S1_stepper() {return this.ATOF_S1_stepper;} + public Stepper get_ATOF_S2_stepper() {return this.ATOF_S2_stepper;} + public Stepper get_ATOF_S3_stepper() {return this.ATOF_S3_stepper;} + public int get_ATOF_region() {return this.ATOF_region;} } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/TrackCandidate.java b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/TrackCandidate.java index ac92c293ec..5688c9f443 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/TrackCandidate.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/alert/Track/TrackCandidate.java @@ -29,8 +29,6 @@ public class TrackCandidate { private final ArrayList hits = new ArrayList<>(); private int trackId = -1; ///< id of the track - private int n_hits = 0; ///< number of hits - private int sum_adc = 0; ///< sum of adc (adc) /** Candidate specialization — defaults to AHDC-only; finders that build * AHDC+ATOF candidates (GNN) override it via {@link #setType}. */ @@ -136,8 +134,6 @@ public void set_trackId(int _trackId) { hit.setTrackId(_trackId); } } - public void set_n_hits(int _n_hits) { n_hits = _n_hits;} - public void set_sum_adc(int _sum_adc) { sum_adc = _sum_adc;} public int get_trackId() {return trackId;} public int get_n_hits() { if (hits == null) { diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index eac98f0cec..5f891a99c4 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import java.util.Iterator; import java.util.HashMap; import java.util.Map; @@ -16,6 +17,7 @@ import org.jlab.detector.calib.utils.DatabaseConstantProvider; import org.jlab.utils.groups.IndexedTable; import org.jlab.geom.base.Detector; +import org.jlab.geom.detector.alert.ATOF.AlertTOFDetector; import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; @@ -32,6 +34,7 @@ import org.jlab.rec.ahdc.DocaCluster.DocaClusterRefiner; import org.jlab.rec.ahdc.HelixFit.HelixFitJava; import org.jlab.rec.ahdc.KalmanFilter.KalmanFilter; +import org.jlab.rec.ahdc.KalmanFilter.RadialKFHit; import org.jlab.rec.ahdc.TrackFindingMode; import org.jlab.rec.ahdc.PreCluster.PreCluster; import org.jlab.rec.ahdc.PreCluster.PreClusterFinder; @@ -47,6 +50,8 @@ import org.jlab.rec.alert.Track.AtofHitStub; import org.jlab.rec.alert.Track.Track; import org.jlab.rec.alert.Track.TrackCandidate; +import org.apache.commons.math3.linear.Array2DRowRealMatrix; +import org.apache.commons.math3.linear.RealMatrix; import org.jlab.clas.pdg.PDGDatabase; import org.jlab.clas.pdg.PDGParticle; import java.util.List; @@ -98,7 +103,7 @@ public class ALERTEngine extends ReconstructionEngine { */ private RecoBankWriter rbc; static final Logger LOGGER = Logger.getLogger(ALERTEngine.class.getName()); - Detector ATOF; // ALERT ATOF detector + private AlertTOFDetector ATOF; // ALERT ATOF detector private AlertDCDetector AHDC; // ALERT AHDC detector /** @@ -515,8 +520,42 @@ public boolean processDataEventUser(DataEvent event) { /// Kalmam Filter /// /////////////////////////////////////// - // read the list of tracks/hits from the banks AHDC::track and AHDC::hits + /// Pre conditions if (!event.hasBank("AHDC::track")) {return false;} + if (!event.hasBank("AHDC::hits")) {return false;} + + /// tmp: misalignement with respect to the center of the AHDC (mm) + double clas_alignement = +75; + double atof_alignement = 0; + + /// Read the electron vertex + double vz_electron = 0; + double[] vz_error2 = {0.09, 1e10, 1e10}; // mm^2, radians^2, mm^2, error on r, phi, z + boolean IsVertexDefined = false; + if (event.hasBank("REC::Particle")) { + DataBank recBank = event.getBank("REC::Particle"); + for (int row = 0; row < recBank.rows(); row++) { + if (recBank.getInt("pid", row) == 11) { + vz_electron = 10*recBank.getFloat("vz",row); // conversion in mm + IsVertexDefined = true; + + + //double px = recBank.getFloat("px",row); + //double py = recBank.getFloat("py",row); + //double pz = recBank.getFloat("pz",row); + //double p = Math.sqrt(px*px+py*py+pz*pz); + //double theta = Math.acos(pz/p); + + // set the resolutions on r and z! to be done + vz_error2[0] = 0.09; // should depend on p and theta + vz_error2[2] = 64; // should depend on p and theta + + break; // only look at the first electron + } + } + } + + /// Read the list of tracks/hits from the banks AHDC::track and AHDC::hits DataBank trackBank = event.getBank("AHDC::track"); DataBank hitBank = event.getBank("AHDC::hits"); ArrayList AHDC_tracks = new ArrayList<>(); @@ -562,24 +601,155 @@ public boolean processDataEventUser(DataEvent event) { newTrack.set_trackId(trackid); AHDC_tracks.add(newTrack); } - // intialise the Kalman Filter + + /// Associate the electron vertex (the beamline hit) to each track + boolean IsMC = event.hasBank("MC::Particle"); + double vz_constraint = vz_electron + (IsMC ? 0 : clas_alignement); // we don't have the misalignment in simulation + for (Track track : AHDC_tracks) { + RadialKFHit hit_beam = new RadialKFHit(0, 0, vz_constraint); + RealMatrix measurementNoise = new Array2DRowRealMatrix( + new double[][]{ + {vz_error2[0], 0.0000 , 0.0000}, + {0.0000 , vz_error2[1], 0.0000}, + {0.0000 , 0.0000 , vz_error2[2]} + });//3x3; + hit_beam.setMeasurementNoise(measurementNoise); + track.setBeamlineHit(hit_beam); + } + + /// Look for ATOF wedge hits predicted by the AI + HashMap map_ATOF_hits = new HashMap<>(); + for (Pair pair : matched_ATOF_hit_id) { + int trackid = pair.getKey(); + int atofid = pair.getValue(); + if (trackid > 0 && atofid > 0) { + // recover the wedge + for (int row = 0; row < bank_ATOFHits.rows(); row++) { + if (bank_ATOFHits.getShort("id", row) == atofid) { + double x = bank_ATOFHits.getFloat("x", row); + double y = bank_ATOFHits.getFloat("y", row); + double z = bank_ATOFHits.getFloat("z", row); + z += atof_alignement; // there is a shift between AHDC and ATOF (still don't know why) ! + RadialKFHit hit = new RadialKFHit(x, y, z); + // error on r + double wedge_width = 20; //mm + double dr2 = Math.pow(wedge_width, 2)/12; // mm^2 + // error on phi + double open_angle = Math.toRadians(6); // deg + double dphi2 = Math.pow(open_angle, 2)/12; + // error on z + double wedge_length = 27.7; //mm + double dz2 = Math.pow(wedge_length, 2)/12; + + RealMatrix measurementNoise = new Array2DRowRealMatrix( + new double[][]{ + {dr2, 0.0000, 0.0000}, + {0.00, dphi2, 0.0000}, + {0.00, 0.0000, dz2} + });//3x3; + hit.setMeasurementNoise(measurementNoise); + map_ATOF_hits.put(trackid, hit); + } + } + } + } + + /// Associate the ATOF hits to each track + for (Track track : AHDC_tracks) { + RadialKFHit hit = map_ATOF_hits.get(track.get_trackId()); + ArrayList list = new ArrayList<>(); + if (hit != null) list.add(hit); // for now, we only consider one hit in the ATOF + track.setATOFHits(list); + } + + /// Intialise the Kalman Filter double magfieldfactor = runBank.getFloat("solenoid", 0); double magfield = 50*magfieldfactor; - boolean IsMC = event.hasBank("MC::Particle"); PDGParticle proton = PDGDatabase.getParticleById(2212); - int Niter = 40; + int Niter = 25; KalmanFilter KF = new KalmanFilter(proton, Niter); - /////////////////////////////////////////////////////// - // first propagation : each AHDC_tracks will be fitted - /////////////////////////////////////////////////////// - KF.propagation(AHDC_tracks, event, magfield, IsMC); - ///////////////////////////////////////////// - // write the AHDC::kftrack bank in the event - ///////////////////////////////////////////// + //KF.set_ATOF_detector(null); + KF.set_ATOF_detector(ATOF); // Reference the ATOF geometry in the Kalman Filter + KF.set_atof_alignement(atof_alignement); + KF.set_vz_constraint(vz_constraint); + KF.set_vertex_flag(IsVertexDefined); + + /// Do a first propagation + KF.propagation(AHDC_tracks, magfield, IsMC); + + /// Look at the new ATOF hits predicted after projection of the track on the lower surface of the ATOF wedges + HashMap> ATOF_hits_predicted = KF.get_ATOF_hits_predicted(); + for (Track track : AHDC_tracks) { + int trackid = track.get_trackId(); + ArrayList possible_wedges = ATOF_hits_predicted.get(trackid); + boolean IsHitSelected = false; + if (possible_wedges != null) { + for (int[] id : possible_wedges) { + int sector = id[0]; + int layer = id[1]; + int wedge = id[2]; + // check if this hit exist in ATOF::hits + for (int row = 0; row < bank_ATOFHits.rows(); row++) { + if (bank_ATOFHits.getInt("sector", row) == sector && bank_ATOFHits.getInt("layer", row) == layer && bank_ATOFHits.getInt("component", row) == wedge) { + // create a RadialKFHit + double x = bank_ATOFHits.getFloat("x", row); + double y = bank_ATOFHits.getFloat("y", row); + double z = bank_ATOFHits.getFloat("z", row); + z += atof_alignement; // there is a shift between AHDC and ATOF (still don't know why) ! + RadialKFHit hit = new RadialKFHit(x, y, z); + // error on r + double wedge_width = 20; //mm + double dr2 = Math.pow(wedge_width, 2)/12; // mm^2 + // error on phi + double open_angle = Math.toRadians(6); // deg + double dphi2 = Math.pow(open_angle, 2)/12; + // error on z + double wedge_length = 27.7; //mm + double dz2 = Math.pow(wedge_length, 2)/12; + + RealMatrix measurementNoise = new Array2DRowRealMatrix( + new double[][]{ + {dr2, 0.0000, 0.0000}, + {0.00, dphi2, 0.0000}, + {0.00, 0.0000, dz2} + });//3x3; + hit.setMeasurementNoise(measurementNoise); + + ArrayList list = new ArrayList<>(); + list.add(hit); // for now, we only consider one hit in the ATOF + track.setATOFHits(list); // update the list of the ATOF hit (i.e override AI ATOF hit if it exist) + + IsHitSelected = true; + break; + } // end id matching + } // end loop over atof hit + if (IsHitSelected) break; + } + } + } + + /// Clean AHDC bad hits + double sigma = 0.5; // mm + for (Track track : AHDC_tracks) { + ArrayList AHDC_hits = track.getHits(); + Iterator it = AHDC_hits.iterator(); + while (it.hasNext()) { + Hit hit = it.next(); + if (Math.abs(hit.getResidual()) > 3*sigma) { + it.remove(); + } + } + } + + /// Second propagation : each AHDC_tracks will be fitted + KF.set_Niter(15); + KF.propagation(AHDC_tracks, magfield, IsMC); + + /// Write the AHDC::kftrack bank in the event org.jlab.rec.ahdc.Banks.RecoBankWriter ahdc_writer = new org.jlab.rec.ahdc.Banks.RecoBankWriter(); DataBank recoKFTracksBank = ahdc_writer.fillAHDCKFTrackBank(event, AHDC_tracks); event.appendBank(recoKFTracksBank); - // update the AHDC::hits bank : fill the residuals + /// Update the AHDC::hits bank : fill the residuals event.removeBank("AHDC::hits"); ArrayList AHDC_hits = new ArrayList<>(); for (Track track : AHDC_tracks) { From 2ca6784f20153c2798a642d7615398a700133b68 Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Mon, 15 Jun 2026 23:45:32 +0200 Subject: [PATCH 184/190] Implement Layer and Wire alignment (#1310) * extends the bank AHDC::kftrack and allow re-cooking of AHDC only * convenient use of PID in RK4 * create KFHit and refactor the kalman filter * activate atof hit * rename methods * use layer and wire alignment in AHDC geometry * use raw adc in the Kalman Filter * store residual LR in AHDC::hits * cleaning * update comment * fix alignment correction of the wire line * fix bug in the constructor of AlertDCWireIdentifier --- .../detector/alert/AHDC/AlertDCDetector.java | 30 +++ .../detector/alert/AHDC/AlertDCFactory.java | 29 ++ .../alert/AHDC/AlertDCWireIdentifier.java | 248 ++++++++++++++++++ etc/bankdefs/hipo4/alert.json | 4 + .../jlab/rec/ahdc/Banks/RecoBankWriter.java | 2 +- .../main/java/org/jlab/rec/ahdc/Hit/Hit.java | 59 +++-- .../jlab/rec/ahdc/KalmanFilter/KFitter.java | 15 ++ .../rec/ahdc/KalmanFilter/KalmanFilter.java | 1 + .../org/jlab/service/ahdc/AHDCEngine.java | 9 +- .../org/jlab/service/alert/ALERTEngine.java | 11 +- 10 files changed, 371 insertions(+), 37 deletions(-) create mode 100644 common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCWireIdentifier.java diff --git a/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCDetector.java b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCDetector.java index 14f2220b49..cf570a7f6a 100644 --- a/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCDetector.java +++ b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCDetector.java @@ -7,6 +7,8 @@ import org.jlab.geom.DetectorId; import org.jlab.geom.abs.AbstractDetector; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; /** * @author sergeyeva @@ -26,4 +28,32 @@ public String getType() { return "ALERT DC Detector"; } + public void print() { + System.out.println("/////////////////////////"); + System.out.println("AHDC geometry"); + System.out.println(""); + System.out.println("s : sector"); + System.out.println("sl : super layer"); + System.out.println("l : layer"); + System.out.println("c : component"); + System.out.println("/////////////////////////"); + System.out.println("------------------------------------------------------------------------------"); + System.out.println(" | origin | end"); + System.out.println("------------------------------------------------------------------------------"); + System.out.println("s sl l c | x y z | x y z"); + System.out.println("------------------------------------------------------------------------------"); + for (int s = 1; s <= getNumSectors(); s++) { + for (int sl = 1; sl <= getSector(s).getNumSuperlayers(); sl++) { + for (int l = 1; l <= getSector(s).getSuperlayer(sl).getNumLayers(); l++) { + for (int c = 1; c <= getSector(s).getSuperlayer(sl).getLayer(l).getNumComponents(); c++) { + Line3D line = getSector(s).getSuperlayer(sl).getLayer(l).getComponent(c).getLine(); + Point3D end = line.end(); + Point3D origin = line.origin(); + System.out.printf("%2d %2d %2d %2d | %7.3f %7.3f %7.3f | %7.3f %7.3f %7.3f\n", s, sl, l, c, origin.x(), origin.y(), origin.z(), end.x(), end.y(), end.z()); + } + } + } + } + } + } diff --git a/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java index 3cc32878cd..44587ff0f5 100644 --- a/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java +++ b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCFactory.java @@ -205,6 +205,35 @@ public AlertDCLayer createLayer(ConstantProvider cp, int sectorId, int superlaye Point3D p_9 = new Point3D(px_9, py_9, z_end); Point3D p_10 = new Point3D(px_10, py_10, z_end); Point3D p_11 = new Point3D(px_11, py_11, z_end); + + // !!! Alignment correction + int layer_row = AlertDCWireIdentifier.layer2number((superlayerId+1)*10 + (layerId+1)); + double upstream_rotZ = Math.toRadians(cp.getDouble("/geometry/alert/ahdc/layer_alignment/upstream_rotZ", layer_row)); + double downstream_rotZ = Math.toRadians(cp.getDouble("/geometry/alert/ahdc/layer_alignment/downstream_rotZ", layer_row)); + int wire_row = AlertDCWireIdentifier.slc2wire(sectorId+1, (superlayerId+1)*10 + (layerId+1), wireId+1); + double wire_rotZ = Math.toRadians(cp.getDouble("/geometry/alert/ahdc/wire_alignment/rotZ", wire_row)); + + //System.out.printf("%d %d %d, %f , %f, %f\n",sectorId+1, (superlayerId+1)*10 + (layerId+1), wireId+1, Math.toDegrees(upstream_rotZ), Math.toDegrees(downstream_rotZ), Math.toDegrees(wire_rotZ)); + + p_0.rotateZ(wire_rotZ + upstream_rotZ); + p_1.rotateZ(wire_rotZ + upstream_rotZ); + p_2.rotateZ(wire_rotZ + upstream_rotZ); + p_3.rotateZ(wire_rotZ + upstream_rotZ); + p_4.rotateZ(wire_rotZ + upstream_rotZ); + p_5.rotateZ(wire_rotZ + upstream_rotZ); + + p_6.rotateZ(wire_rotZ + downstream_rotZ); + p_7.rotateZ(wire_rotZ + downstream_rotZ); + p_8.rotateZ(wire_rotZ + downstream_rotZ); + p_9.rotateZ(wire_rotZ + downstream_rotZ); + p_10.rotateZ(wire_rotZ + downstream_rotZ); + p_11.rotateZ(wire_rotZ + downstream_rotZ); + + lPoint.rotateZ(wire_rotZ + upstream_rotZ); + rPoint.rotateZ(wire_rotZ + downstream_rotZ); + wireLine = new Line3D(lPoint, rPoint); + + // defining a cell around a wireLine, must be counter-clockwise! firstF.add(p_0); firstF.add(p_5); diff --git a/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCWireIdentifier.java b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCWireIdentifier.java new file mode 100644 index 0000000000..fcf4caad2f --- /dev/null +++ b/common-tools/clas-geometry/src/main/java/org/jlab/geom/detector/alert/AHDC/AlertDCWireIdentifier.java @@ -0,0 +1,248 @@ +package org.jlab.geom.detector.alert.AHDC; + +public class AlertDCWireIdentifier { + /** Number between 0 and 575 */ + private int num; + + /** Always 1 */ + private int sector; + + /** Can be 11, 21, 22, 31, 32, 41, 42, 51 */ + private int layer; + + /** component id on a given layer, numerotation starting at 1 */ + private int component; + + /** + * Ahdc wire id defined with a num ranging from 0 to 575 + * @param _num + */ + public AlertDCWireIdentifier(int _num) { + num = _num; + int[] res = wire2slc(_num); + sector = res[0]; + layer = res[1]; + component = res[2]; + } + + /** + * Ahdc wire id defined with sector, layer, component identifiers + * @param _sector + * @param _layer can be 11, 21, 22, 31, 32, 41, 51 + * @param _component + */ + public AlertDCWireIdentifier(int _sector, int _layer, int _component) { + sector = _sector; + layer = _layer; + component = _component; + num = slc2wire(_sector, _layer, _component); + } + + /** Get unique number id. Number between 0 and 575 */ + public int getNumber() { return num;} + + /** Get sector id. Numbering start at 1 */ + public int getSectorId() {return sector;} + + /** Get layer id. Numbering start at 1 */ + public int getLayerId() {return layer;} + + /** Get component id. Numbering start at 1 */ + public int getComponentId() {return component;} + + /** + * Convert wire number (number from 0 to 575) to (sector,layer,component) ids + * + * This is the invert operation of {@link #slc2wire(int, int, int)} + * + * @param wire wire number between 0 and 575 + * @return a triplet (sector, layer, component) in int[] + */ + public static int[] wire2slc(int wire) { + int layer = -1; + int component = -1; + if (wire < 47) { + layer = 11; + component = wire + 1; + } + else if ((47 <= wire) && (wire < 47 + 56)) { + layer = 21; + component = wire - 47 + 1; + } + else if ((47 + 56 <= wire) && (wire < 47 + 56 + 56)) { + layer = 22; + component = wire - 47 - 56 + 1; + } + else if ((47 + 56 + 56 <= wire) && (wire < 47 + 56 + 56 + 72)) { + layer = 31; + component = wire - 47 - 56 - 56 + 1; + } + else if ((47 + 56 + 56 + 72 <= wire) && (wire < 47 + 56 + 56 + 72 + 72)) { + layer = 32; + component = wire - 47 - 56 - 56 - 72 + 1; + } + else if ((47 + 56 + 56 + 72 + 72 <= wire) && (wire < 47 + 56 + 56 + 72 + 72 + 87)) { + layer = 41; + component = wire - 47 - 56 - 56 - 72 - 72 + 1; + } + else if ((47 + 56 + 56 + 72 + 72 + 87 <= wire) && (wire < 47 + 56 + 56 + 72 + 72 + 87 + 87)) { + layer = 42; + component = wire - 47 - 56 - 56 - 72 - 72 - 87 + 1; + } + else { // ((47 + 56 + 56 + 72 + 72 + 87 + 87 <= wire) && (wire < 47 + 56 + 56 + 72 + 72 + 87 + 87 + 99)) { + layer = 51; + component = wire - 47 - 56 - 56 - 72 - 72 - 87 - 87 + 1; + } + return new int[] {1, layer, component}; + } + + /** + * Convert (sector, layer, component) to a unique wire id (number betwwen 0 and 575) + * + * @param sector (not used) + * @param layer + * @param component + * @return unique wire id + */ + public static int slc2wire(int sector, int layer, int component) { + if (layer == 11) { + return component - 1; + } + else if (layer == 21) { + return 47 + component - 1; + } + else if (layer == 22) { + return 47 + 56 + component - 1; + } + else if (layer == 31) { + return 47 + 56 + 56 + component - 1; + } + else if (layer == 32) { + return 47 + 56 + 56 + 72 + component - 1; + } + else if (layer == 41) { + return 47 + 56 + 56 + 72 + 72 + component - 1; + } + else if (layer == 42) { + return 47 + 56 + 56 + 72 + 72 + 87 + component - 1; + } + else if (layer == 51) { + return 47 + 56 + 56 + 72 + 72 + 87 + 87 + component - 1; + } else { + return -1; // not a ahdc wire + } + } + + /** + * Convert the layer digits (11,21,...,51) to layer number between 0 and 7 + * + * @param digit + * @return layer number + */ + public static int layer2number(int digit) { + if (digit == 11) { + return 0; + } + else if (digit == 21) { + return 1; + } + else if (digit == 22) { + return 2; + } + else if (digit == 31) { + return 3; + } + else if (digit == 32) { + return 4; + } + else if (digit == 41) { + return 5; + } + else if (digit == 42) { + return 6; + } + else if (digit == 51) { + return 7; + } else { + return -1; + } + } + + /** + * Convert layer number (from 0 to 7) to the superlayer-layer id (11,21,...,51) + * + * @param digit between 0 and 7 + * @return layer number between (11,21,...,51) + */ + public static int number2layer(int num) { + if (num == 0) { + return 11; + } + else if (num == 1) { + return 21; + } + else if (num == 2) { + return 22; + } + else if (num == 3) { + return 31; + } + else if (num == 4) { + return 32; + } + else if (num == 5) { + return 41; + } + else if (num == 6) { + return 42; + } + else if (num == 7) { + return 51; + } else { + return -1; + } + } + + /** + * + * @param _layer (number 11, 21, 22, ..., 51) + * @return the radius of the _layer + */ + public static double layer2Radius(int _layer) { + if (_layer == 11) { + return 32.0; + } + else if (_layer == 21) { + return 38.0; + } + else if (_layer == 22) { + return 42.0; + } + else if (_layer == 31) { + return 48.0; + } + else if (_layer == 32) { + return 52.0; + } + else if (_layer == 41) { + return 58.0; + } + else if (_layer == 42) { + return 62.0; + } + else if (_layer == 51) { + return 68.0; + } else { + return 0.0; + } + } + + /** + * + * @param _layer_num between 0 and 7 + * @return the radius of the _layer. See {@link #layer2Radius(int)} + */ + public static double layerNum2Radius(int _layer_num) { + return layer2Radius(number2layer(_layer_num)); + } +} diff --git a/etc/bankdefs/hipo4/alert.json b/etc/bankdefs/hipo4/alert.json index 580a54aecc..96c8b1666c 100644 --- a/etc/bankdefs/hipo4/alert.json +++ b/etc/bankdefs/hipo4/alert.json @@ -228,6 +228,10 @@ "name": "residual", "type": "D", "info": "residual (mm) calculated by the Kalman Filter" + }, { + "name": "residual_LR", + "type": "D", + "info": "residual Left-Right (mm) calculated by the Kalman Filter and used for the AHDC alignment" }, { "name": "time", "type": "D", diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java index b276e4b605..82f0461748 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Banks/RecoBankWriter.java @@ -12,7 +12,6 @@ import org.jlab.rec.alert.Track.Track; import java.util.ArrayList; -import java.util.List; public class RecoBankWriter { @@ -29,6 +28,7 @@ public DataBank fillAHDCHitsBank(DataEvent event, ArrayList hitList) { bank.setInt("wire", i, hitList.get(i).getWireId()); bank.setDouble("doca", i, hitList.get(i).getDoca()); bank.setDouble("residual", i, hitList.get(i).getResidual()); + bank.setDouble("residual_LR", i, hitList.get(i).getResidual_LR()); bank.setDouble("time", i, hitList.get(i).getTime()); bank.setInt("adc", i, (int) hitList.get(i).getADC()); bank.setDouble("timeOverThreshold", i, hitList.get(i).getToT()); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java index 3d9482b5a8..f1a6e7a9f7 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Hit/Hit.java @@ -32,6 +32,7 @@ public class Hit implements Comparable, KFHit { private double x; private double y; private double residual; + private double residual_LR; private int trackId; //updated constructor with ADC @@ -160,6 +161,14 @@ public void setResidual(double resid) { this.residual = resid; } + public double getResidual_LR() { + return residual_LR; + } + + public void setResidual_LR(double resid) { + this.residual_LR = resid; + } + /** Set calibrated ToT */ public void setToT(double _tot) { this.tot = _tot; @@ -257,13 +266,32 @@ public double distance(Point3D point3D) { } public static void main(String[] args) { - AlertDCDetector factory = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider()); + int run = 22712; + String variation = "default"; + DatabaseConstantProvider cp = new DatabaseConstantProvider(run, variation); + cp.loadTable("/geometry/alert/ahdc/layer_alignment"); + cp.loadTable("/geometry/alert/ahdc/wire_alignment"); + String upstream_rotZ = "/geometry/alert/ahdc/layer_alignment/upstream_rotZ"; + + System.out.println(cp.getDouble(upstream_rotZ, 0)); + System.out.println(cp.getDouble(upstream_rotZ, 1)); + System.out.println(cp.getDouble(upstream_rotZ, 2)); + System.out.println(cp.getDouble(upstream_rotZ, 3)); + System.out.println(cp.getDouble(upstream_rotZ, 4)); + System.out.println(cp.getDouble(upstream_rotZ, 5)); + System.out.println(cp.getDouble(upstream_rotZ, 6)); + System.out.println(cp.getDouble(upstream_rotZ, 7)); + + + AlertDCDetector AHDCdet = (new AlertDCFactory()).createDetectorCLAS(cp); + //AHDCdet.print(); + System.out.println("Run test: comparison between two hits."); Hit h1 = new Hit(1,1,1,1,0,0,0); Hit h2 = new Hit(1,1,1,47,0,0,0); Hit h3 = new Hit(1,2,1,47,0,0,0); - h1.setWirePosition(factory); - h2.setWirePosition(factory); + h1.setWirePosition(AHDCdet); + h2.setWirePosition(AHDCdet); System.out.println("h1 : " + h1); System.out.println("h2 : " + h2); System.out.println("h3 : " + h3); @@ -272,31 +300,6 @@ public static void main(String[] args) { System.out.println("h2 compare to h1 : " + h2.compareTo(h1)); System.out.println("h1 compare to h3 : " + h1.compareTo(h3)); - System.out.println("/////////////////////////"); - System.out.println("Test AHDC geometry"); - System.out.println(""); - System.out.println("s : sector"); - System.out.println("sl : super layer"); - System.out.println("l : layer"); - System.out.println("c : component"); - System.out.println("/////////////////////////"); - System.out.println("------------------------------------------------------------------------------"); - System.out.println(" | origin | end"); - System.out.println("------------------------------------------------------------------------------"); - System.out.println("s sl l c | x y z | x y z"); - System.out.println("------------------------------------------------------------------------------"); - for (int s = 1; s <= factory.getNumSectors(); s++) { - for (int sl = 1; sl <= factory.getSector(s).getNumSuperlayers(); sl++) { - for (int l = 1; l <= factory.getSector(s).getSuperlayer(sl).getNumLayers(); l++) { - for (int c = 1; c <= factory.getSector(s).getSuperlayer(sl).getLayer(l).getNumComponents(); c++) { - Line3D line = factory.getSector(s).getSuperlayer(sl).getLayer(l).getComponent(c).getLine(); - Point3D end = line.end(); - Point3D origin = line.origin(); - System.out.printf("%2d %2d %2d %2d | %7.3f %7.3f %7.3f | %7.3f %7.3f %7.3f\n", s, sl, l, c, origin.x(), origin.y(), origin.z(), end.x(), end.y(), end.z()); - } - } - } - } } } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java index 08b468522a..01007a63e2 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KFitter.java @@ -7,6 +7,7 @@ import org.apache.commons.math3.linear.RealVector; import org.jlab.clas.pdg.PhysicsConstants; import org.jlab.clas.tracking.kalmanfilter.Material; +import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; import org.jlab.rec.ahdc.Hit.Hit; @@ -120,6 +121,20 @@ public double residual(Hit hit) { return hit.getDoca()-d; } + // specific to AHDC hits + public double residual_LR(Hit hit) { + Line3D line = hit.getLine().distance( new Point3D( stateEstimation.getEntry(0), stateEstimation.getEntry(1), stateEstimation.getEntry(2) ) ); + //Point3D A = line.origin(); // point on the wire line + Point3D B = line.end(); // point on the track + Point3D C = line.lerpPoint(hit.getDoca()/line.length()); // measurement point on [AB) + + double phiC = Math.atan2(C.y(), C.x()); // between -pi and pi rad + double phiB = Math.atan2(B.y(), B.x()); + //double phiA = Math.atan2(A.y(), A.x()); + + return Math.signum(phiC - phiB)*Math.abs(hit.getDoca()-line.length()); + } + public void ResetErrorCovariance(final RealMatrix initialErrorCovariance){ this.errorCovariance = initialErrorCovariance; } diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java index 7380ccefd6..3c65ae7cfb 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/KalmanFilter/KalmanFilter.java @@ -145,6 +145,7 @@ public void propagation(ArrayList tracks, final double magfield, boolean for (Hit hit : AHDC_hits) { PostFitPropagator.predict(hit, true); hit.setResidual(PostFitPropagator.residual(hit)); // output: residual + hit.setResidual_LR(PostFitPropagator.residual_LR(hit)); // output: residual LR } // Fill values for AHDC::kftrack diff --git a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java index d01d7385ad..104fc000a2 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java @@ -30,7 +30,7 @@ public class AHDCEngine extends ReconstructionEngine { static final Logger LOGGER = Logger.getLogger(AHDCEngine.class.getName()); - private AlertDCDetector factory = null; + private AlertDCDetector AHDCdet = null; private ModeAHDC ahdcExtractor = new ModeAHDC(); // AHDC calibration tables (instance-level, refreshed on run change) @@ -46,7 +46,10 @@ public class AHDCEngine extends ReconstructionEngine { @Override public void detectorChanged(int run) { - factory = (new AlertDCFactory()).createDetectorCLAS(new DatabaseConstantProvider(run,"default")); + DatabaseConstantProvider cp = new DatabaseConstantProvider(run, "default"); + cp.loadTable("/geometry/alert/ahdc/layer_alignment"); + cp.loadTable("/geometry/alert/ahdc/wire_alignment"); + AHDCdet = (new AlertDCFactory()).createDetectorCLAS(cp); } @Override @@ -90,7 +93,7 @@ public boolean processDataEventUser(DataEvent event) { if (event.hasBank("AHDC::adc")) { boolean simulation = event.hasBank("MC::Particle"); - HitReader hitReader = new HitReader(event, factory, simulation, + HitReader hitReader = new HitReader(event, AHDCdet, simulation, ahdcRawHitCutsTable, ahdcTimeOffsetsTable, ahdcTimeToDistanceWireTable, ahdcTimeOverThresholdTable, ahdcAdcGainsTable); ArrayList AHDC_Hits = hitReader.get_AHDCHits(); diff --git a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java index 5f891a99c4..4a8f580f65 100644 --- a/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java +++ b/reconstruction/alert/src/main/java/org/jlab/service/alert/ALERTEngine.java @@ -16,7 +16,6 @@ import org.jlab.clas.swimtools.Swim; import org.jlab.detector.calib.utils.DatabaseConstantProvider; import org.jlab.utils.groups.IndexedTable; -import org.jlab.geom.base.Detector; import org.jlab.geom.detector.alert.ATOF.AlertTOFDetector; import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; import org.jlab.io.base.DataBank; @@ -141,6 +140,8 @@ public ALERTEngine() { @Override public void detectorChanged(int run) { DatabaseConstantProvider cp = new DatabaseConstantProvider(run, "default"); + cp.loadTable("/geometry/alert/ahdc/layer_alignment"); + cp.loadTable("/geometry/alert/ahdc/wire_alignment"); ATOF = (new AlertTOFFactory()).createDetectorCLAS(cp); AHDC = (new AlertDCFactory()).createDetectorCLAS(cp); } @@ -352,7 +353,6 @@ public boolean processDataEventUser(DataEvent event) { /// --------------------------------------------------------------------------------------- /// Track matching using AI --------------------------------------------------------------- - if (event == null) return false; // TODO: is it useful? if (!event.hasBank("AHDC::track")) return false; DataBank bank_AHDCtracks = event.getBank("AHDC::track"); @@ -572,8 +572,9 @@ public boolean processDataEventUser(DataEvent event) { double doca = hitBank.getDouble("doca", hit_row); double time = hitBank.getDouble("time", hit_row); double tot = hitBank.getDouble("timeOverThreshold", hit_row); - // warning : adc is the calibrated one, we need the adc for the Kalman filter - Hit hit = new Hit(id, superlayer, layer, wire, doca, adc, time); + // use raw adc in the Kalman Filter + double gainCorr = ahdcAdcGainsTable.getDoubleValue("gainCorr", 1, 10*superlayer+layer, wire); + Hit hit = new Hit(id, superlayer, layer, wire, doca, adc/gainCorr, time); hit.setWirePosition(AHDC); hit.setTrackId(trackid); hit.setADC(adc); @@ -796,7 +797,7 @@ public static void main(String[] args) { int nEvent = 0; int maxEvent = 1000; - int myEvent = 3; + //int myEvent = 3; String inputFile = "alert_out_update.hipo"; String outputFile = "output.hipo"; From c73a1f579bddc9d575e082872877ebed066a5ec4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:19:14 +0000 Subject: [PATCH 185/190] build(deps): bump com.github.spotbugs:spotbugs-maven-plugin (#1314) Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.9.8.3 to 4.10.2.0. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.9.8.3...spotbugs-maven-plugin-4.10.2.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-version: 4.10.2.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2d516f2ad3..a4725a6aa6 100644 --- a/pom.xml +++ b/pom.xml @@ -267,7 +267,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.9.8.3 + 4.10.2.0 spotbugs-exclude.xml From 26e505234d6a05c284ad92a98c6e163d8e51cdb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:37:01 +0000 Subject: [PATCH 186/190] build(deps): bump com.github.spotbugs:spotbugs from 4.9.8 to 4.10.2 (#1315) Bumps [com.github.spotbugs:spotbugs](https://github.com/spotbugs/spotbugs) from 4.9.8 to 4.10.2. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.8...4.10.2) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs dependency-version: 4.10.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4725a6aa6..5454d99e13 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ com.github.spotbugs spotbugs - 4.9.8 + 4.10.2 From 243ba989cecd253015e9aeb50f8bb541e87db7aa Mon Sep 17 00:00:00 2001 From: silvianic Date: Tue, 16 Jun 2026 22:22:44 +0200 Subject: [PATCH 187/190] RGH recoil (trk and tof) (#1312) * Here we (Nilanga and Silvia) include all the recent comment to previous pull requests (PR921 and PR504), as well as the new directory structure and code naming scheme requested by Raffaella * fix package names, remove unused imports * fix formatting, remove empty mains * Changed trk to TRK everywhere * fixed bank structure and a couple of bugs following the naming changes * addressed the comment about the constants already defined in the geometry service * Included engine for RTOF * remove unused imports and variables --------- Co-authored-by: Nathan Baltzell Co-authored-by: niwgit --- .../org/jlab/detector/base/DetectorType.java | 3 +- .../geant4/v2/recoil/RecoilConstants.java | 108 ----- .../geant4/v2/recoil/RecoilGeant4Factory.java | 307 ------------- .../geant4/v2/recoil/tof/RTOFConstants.java | 43 ++ .../v2/recoil/tof/RTOFGeant4Factory.java | 129 ++++++ .../geant4/v2/recoil/trk/RTRKConstants.java | 106 +++++ .../v2/recoil/trk/RTRKGeant4Factory.java | 293 ++++++++++++ .../RTRKStripFactory.java} | 416 +++++++++--------- etc/bankdefs/hipo4/rtof.json | 35 ++ etc/bankdefs/hipo4/{recoil.json => rtrk.json} | 24 +- .../service/recoil/tof/ClusterFinder.java | 163 +++++++ .../jlab/service/recoil/tof/HitFinder.java | 113 +++++ .../jlab/service/recoil/tof/Parameters.java | 25 ++ .../jlab/service/recoil/tof/RTOFCluster.java | 240 ++++++++++ .../jlab/service/recoil/tof/RTOFEngine.java | 63 +++ .../org/jlab/service/recoil/tof/RTOFHit.java | 140 ++++++ .../jlab/service/recoil/tof/RTOFRawHit.java | 398 +++++++++++++++++ .../service/recoil/tof/RecoBankWriter.java | 115 +++++ .../RTRKCluster.java} | 94 ++-- .../{RecoilCross.java => trk/RTRKCross.java} | 49 +-- .../RTRKEngine.java} | 144 +++--- .../RTRKParameters.java} | 13 +- .../{RecoilStrip.java => trk/RTRKStrip.java} | 119 +++-- 23 files changed, 2284 insertions(+), 856 deletions(-) delete mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java delete mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFConstants.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFGeant4Factory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKConstants.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKGeant4Factory.java rename common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/{RecoilStripFactory.java => trk/RTRKStripFactory.java} (54%) create mode 100644 etc/bankdefs/hipo4/rtof.json rename etc/bankdefs/hipo4/{recoil.json => rtrk.json} (77%) create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/ClusterFinder.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/HitFinder.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/Parameters.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFCluster.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFEngine.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFHit.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFRawHit.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RecoBankWriter.java rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{RecoilCluster.java => trk/RTRKCluster.java} (72%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{RecoilCross.java => trk/RTRKCross.java} (68%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{RecoilEngine.java => trk/RTRKEngine.java} (76%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{RecoilConstants.java => trk/RTRKParameters.java} (83%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{RecoilStrip.java => trk/RTRKStrip.java} (69%) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java index 4ee7c44cf8..a07cbc2452 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java @@ -33,7 +33,8 @@ public enum DetectorType { URWT (23, "URWT"), AHDC (24, "AHDC"), ATOF (25, "ATOF"), - RECOIL (26, "RECOIL"), + RTRK (26, "RTRK"), + RTOF (27, "RTOF"), MUCAL (28, "MUCAL"), MUVT (29, "MUVT"), MURT (30, "MURT"), diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java deleted file mode 100644 index 805407434e..0000000000 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.jlab.detector.geant4.v2.recoil; - - -import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.geom.prim.Point3D; - - -public class RecoilConstants { - - private final static String CCDBPATH = "/geometry/recoil/"; - - public final static int NMAXREGIONS = 3; //max number of regions - public final static int NREGIONS = 3; //number of regions - public final static int NSECTORS = 2; //number of sectors - public final static int NLAYERS = 2; //number of layers - public final static int NCHAMBERS = 1; //number of chambers in a sector - - public final static double HORIZONTHAL_OPENING_ANGLE = 34.; - public final static double VERTICAL_OPENING_ANGLE = 50.; - public final static double RADIUS[] = {33.5,55.5,79.5}; - public final static double WIDTH[] = new double[NMAXREGIONS]; - public final static double HEIGHT[] = new double[NMAXREGIONS]; - - public final static double THTILT = 0; // theta tilt (deg) - /* public final static double XENLARGEMENT = 0.5; // cm - public final static double YENLARGEMENT = 1.; // cm - public final static double ZENLARGEMENT = 0.1; // cm - - // Sector geometrical parameters - public final static double THOPEN = 34.; // opening angle between endplate planes (deg) - public final static double THTILT = 0; // theta tilt (deg) - public final static double THMIN = 4.694; // polar angle to the base of first chamber (deg) - public final static double SECTORHEIGHT = 146.21; //height of each sector (cm) - public final static double DX0CHAMBER0 = 5.197; // halfbase of chamber 1 (cm)*/ - - // Chamber volumes and materials (units are cm) - public final static double[] CHAMBERVOLUMESTHICKNESS = {0.0025, 0.0005,0.3, // window - 0.0025, 0.0005,0.4, // cathode - 0.0005, 0.005, 0.0005, // uRWell + DlC - 0.0005, 0.005, 0.0005, // Capacitive sharing layer1 - 0.0005, 0.005, 0.0005, // Capacitive sharing layer2 - 0.005, 0.0005,0.005, 0.005, 0.0005,0.005, 0.005, // Readout - 0.0127, 0.3, 0.0125}; // support - public final static String[] CHAMBERVOLUMESNAME = {"window_kapton", "window_Al", "window_gas", - "cathode_kapton", "cathode_Al", "cathode_gas", - "muRwell_Cu", "muRwell_kapton", "muRwell_dlc", - "capa_sharing_layer1_glue","capa_sharing_layer1_Cr","capa_sharing_layer1_kapton", - "capa_sharing_layer2_glue","capa_sharing_layer2_Cr","capa_sharing_layer2_kapton", - "readout1_glue", "readout1_Cu", "readout1_kapton", "readout2_glue", "readout2_Cu", "readout2_kapton", "readout3_glue", - "support_skin1_g10", "support_honeycomb_nomex", "support_skin2_g10"}; - - // URWELL position in the CLAS12 frame - /* public final static double TGT2DC0 = 228.078; // cm - // public final static double URWELL2DC0 = 2; // cm - public final static double URWELL2DC0[] = new double[NMAXREGIONS]; - public final static double DIST2TGT[] = new double[NMAXREGIONS]; - public final static double W2TGT[] = new double[NMAXREGIONS];; - public final static double YMIN[] = new double[NMAXREGIONS]; - public final static double ZMIN[] = new double[NMAXREGIONS];*/ - - public final static double PITCH = 0.1 ; // cm - public final static double STEREOANGLE = 90; // deg - - /* - * @return String a path to a directory in CCDB of the format {@code "/geometry/detector/"} - */ - public static String getCcdbPath() - { - return CCDBPATH; - } - - /** - * Loads the the necessary tables for the URWELL geometry for a given DatabaseConstantProvider. - * - * @return DatabaseConstantProvider the same thing - */ - public static DatabaseConstantProvider connect( DatabaseConstantProvider cp ) - { - // cp.loadTable( CCDBPATH +"RWELL"); - - load(cp ); - return cp; - } - - /** - * Reads all the necessary constants from CCDB into static variables. - * Please use a DatabaseConstantProvider to access CCDB and load the following tables: - * @param cp a ConstantProvider that has loaded the necessary tables - */ - - public static synchronized void load( DatabaseConstantProvider cp ) - { - // read constants from svt table -// NREGIONS = cp.getInteger( CCDBPATH+"svt/nRegions", 0 ); - - for (int i=0; i (volume.getName().contains(volumeName))) - .findAny() - .orElse(null); - } - - /** - * Returns the sector volume for the given sector number - * - * @param sector (1-6) - * @return the sector volume - */ - public Geant4Basic getSectorVolume(int region, int sector) { - - int r = region; - int s = sector; - - String volName = "region_Recoil_" + r + "_s" + s; - return this.getAllVolumes().stream() - .filter(volume -> (volume.getName().contains(volName))) - .findAny() - .orElse(null); - } - - public static void main(String[] args) { - DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); - - RecoilConstants.connect(cp); - - RecoilGeant4Factory factory = new RecoilGeant4Factory(cp, 1); - - factory.getAllVolumes().forEach(volume -> { - System.out.println(volume.gemcString()); - }); - - } -} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFConstants.java new file mode 100644 index 0000000000..5ef906db7b --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFConstants.java @@ -0,0 +1,43 @@ +package org.jlab.detector.geant4.v2.recoil.tof; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; + +public class RTOFConstants { + + public final static int NSECTORS = 2; //number of sectors + public final static int NROWS = 5; //number of rows of bars in a sector + public final static int NCOLUMNS = 63; //number of columns of bars in a sector + + public final static double LONG_BAR_LENGTH = 27.5; // cm + public final static double SHORT_BAR_LENGTH = 4; // cm + + public final static double BAR_WIDTH = 1; // cm + public final static double BAR_THICKNESS = 0.5; // cm + + public final static double HORIZONTAL_STARTING_ANGLE = 40.; + public final static double HORIZONTAL_OPENING_ANGLE = 29.; + public final static double RADIUS = 122.; // cm + + public final static double WIDTH = NCOLUMNS * BAR_WIDTH; + public final static double LENGTH = (NROWS-1) * LONG_BAR_LENGTH + SHORT_BAR_LENGTH; + public final static double THICKNESS = 0.5; // cm + + public static DatabaseConstantProvider connect( DatabaseConstantProvider cp ) + { + load(cp ); + return cp; + } + + /** + * Reads all the necessary constants from CCDB into static variables. + * Please use a DatabaseConstantProvider to access CCDB and load the following tables: + * @param cp a ConstantProvider that has loaded the necessary tables + */ + public static synchronized void load( DatabaseConstantProvider cp ) + { + //WIDTH = NCOLUMNS * BAR_WIDTH; + //LENGTH = (NROWS-1) * LONG_BAR_LENGTH + SHORT_BAR_LENGTH; + //THICKNESS = 0.5; // cm + } + +} \ No newline at end of file diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFGeant4Factory.java new file mode 100644 index 0000000000..82926db40a --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/tof/RTOFGeant4Factory.java @@ -0,0 +1,129 @@ +package org.jlab.detector.geant4.v2.recoil.tof; + +import eu.mihosoft.vrl.v3d.Vector3d; +import org.jlab.detector.geant4.v2.Geant4Factory; +import org.jlab.detector.volume.G4World; +import org.jlab.detector.volume.G4Box; +import org.jlab.detector.volume.Geant4Basic; +import org.jlab.detector.calib.utils.DatabaseConstantProvider; + +/** + * Generate GEANT4 volume for the RECOIL TOF detector + * + * @author Nilanga Wickramaarachchi + */ +public final class RTOFGeant4Factory extends Geant4Factory { + + private int nSectors = RTOFConstants.NSECTORS; + private int nRows = RTOFConstants.NROWS; + private int nCols = RTOFConstants.NCOLUMNS; + + public RTOFGeant4Factory( DatabaseConstantProvider cp) { + RTOFConstants.connect(cp ); + this.init(cp); + } + + public void init(DatabaseConstantProvider cp) { + motherVolume = new G4World("root"); + for (int isector = 0; isector < nSectors; isector++) { + Geant4Basic sectorVolume = createSector(isector, nRows, nCols); + sectorVolume.setName("recoil_tof_sector" + (isector + 1)); + sectorVolume.setMother(motherVolume); + } + } + + public Vector3d getCenterCoordinate(int isector) + { + int is=isector; + Vector3d vCenter = new Vector3d(0, 0, 0); + vCenter.x = (-1+is*2)*(RTOFConstants.RADIUS)*Math.sin(Math.toRadians(RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE)); + vCenter.y = 0; + vCenter.z =RTOFConstants.RADIUS*Math.cos(Math.toRadians(RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE)); + return vCenter; + } + + public Geant4Basic createSector(int isector, int nRows, int nCols ) { + + double hlx = RTOFConstants.WIDTH/2+1; + double hly = RTOFConstants.LENGTH/2+1; + double hlz = RTOFConstants.THICKNESS/2+1; + + Vector3d vCenter = this.getCenterCoordinate(isector); + + Geant4Basic sectorVolume = new G4Box("recoil_tof_sector" + (isector + 1), hlx, hly, hlz); + + if(isector==0) sectorVolume.rotate("yxz",Math.toRadians((RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE)),0,0); + if(isector==1) sectorVolume.rotate("yxz",Math.toRadians(-(RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE)),0,0); + sectorVolume.translate(vCenter.x, vCenter.y, vCenter.z); + sectorVolume.setId(isector + 1, 0, 0); + + // Bars construction + for (int row = 0; row < nRows; row++) { + for (int col = 0; col < nCols; col++) { + + Geant4Basic barVolume = this.createBar(isector, row, col); + + barVolume.setName("bar_sector" + (isector + 1) + "_row" + (row + 1) + "_column" + (col + 1)); + + barVolume.setMother(sectorVolume); + + barVolume.setId(isector + 1, row +1, col+1, 0); + } + } + + return sectorVolume; + } + + public Geant4Basic createBar(int iSector, int iRow, int iCol) { + + int nCols = RTOFConstants.NCOLUMNS; + + double barDX = RTOFConstants.BAR_WIDTH/2; + double barDY; + + if (iRow == (nRows - 1) / 2) barDY = RTOFConstants.SHORT_BAR_LENGTH/2; + else barDY = RTOFConstants.LONG_BAR_LENGTH/2; + + double barDZ = RTOFConstants.BAR_THICKNESS/2; + + Geant4Basic barVolume = new G4Box("bar_sector" + (iSector + 1) + "_row" + (iRow + 1) + "_column" + (iCol + 1), barDX, barDY, barDZ); + + // Constants for positioning + double y_start = -(RTOFConstants.LENGTH - RTOFConstants.LONG_BAR_LENGTH)/2; // Starting Y position + double x_spacing = RTOFConstants.BAR_WIDTH; + double x_start = -(RTOFConstants.WIDTH - x_spacing)/2; // starting X position + double dy_long = RTOFConstants.LONG_BAR_LENGTH; + double dy_short = RTOFConstants.SHORT_BAR_LENGTH; + + //Position calculation + double z_pos = 0; + double x_pos = x_start + (iCol * x_spacing); + + double y_pos; + if (iRow < (nRows - 1) / 2) { + y_pos = y_start + (iRow * dy_long); + } + else if (iRow == (nRows - 1) / 2) {// middle row + y_pos = 0; + } + else { + y_pos = y_start + (iRow -1) * dy_long + dy_short; + } + + barVolume.setPosition(x_pos, y_pos, z_pos); + + return barVolume; + } + + public static void main(String[] args) { + DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); + + RTOFConstants.connect(cp); + + RTOFGeant4Factory factory = new RTOFGeant4Factory(cp); + + factory.getAllVolumes().forEach(volume -> { + System.out.println(volume.gemcString()); + }); + } +} \ No newline at end of file diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKConstants.java new file mode 100644 index 0000000000..5df67bf460 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKConstants.java @@ -0,0 +1,106 @@ +package org.jlab.detector.geant4.v2.recoil.trk; + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; + +public class RTRKConstants { + + private final static String CCDBPATH = "/geometry/recoil/trk/"; + + public final static int NMAXREGIONS = 3; //max number of regions + public final static int NREGIONS = 3; //number of regions + public final static int NSECTORS = 2; //number of sectors + public final static int NLAYERS = 2; //number of layers + public final static int NCHAMBERS = 1; //number of chambers in a sector + + public final static double HORIZONTHAL_OPENING_ANGLE = 34.; + public final static double VERTICAL_OPENING_ANGLE = 50.; + public final static double RADIUS[] = {33.5,55.5,79.5}; + public final static double WIDTH[] = new double[NMAXREGIONS]; + public final static double HEIGHT[] = new double[NMAXREGIONS]; + + public final static double THTILT = 0; // theta tilt (deg) + /* public final static double XENLARGEMENT = 0.5; // cm + public final static double YENLARGEMENT = 1.; // cm + public final static double ZENLARGEMENT = 0.1; // cm + + // Sector geometrical parameters + public final static double THOPEN = 34.; // opening angle between endplate planes (deg) + public final static double THTILT = 0; // theta tilt (deg) + public final static double THMIN = 4.694; // polar angle to the base of first chamber (deg) + public final static double SECTORHEIGHT = 146.21; //height of each sector (cm) + public final static double DX0CHAMBER0 = 5.197; // halfbase of chamber 1 (cm)*/ + + // Chamber volumes and materials (units are cm) + public final static double[] CHAMBERVOLUMESTHICKNESS = { + 0.0025, 0.0005,0.3, // window + 0.0025, 0.0005,0.4, // cathode + 0.0005, 0.005, 0.0005, // uRWell + DlC + 0.0005, 0.005, 0.0005, // Capacitive sharing layer1 + 0.0005, 0.005, 0.0005, // Capacitive sharing layer2 + 0.005, 0.0005,0.005, 0.005, 0.0005,0.005, 0.005, // Readout + 0.0127, 0.3, 0.0125}; // support + public final static String[] CHAMBERVOLUMESNAME = { + "window_kapton", "window_Al", "window_gas", + "cathode_kapton", "cathode_Al", "cathode_gas", + "muRwell_Cu", "muRwell_kapton", "muRwell_dlc", + "capa_sharing_layer1_glue","capa_sharing_layer1_Cr","capa_sharing_layer1_kapton", + "capa_sharing_layer2_glue","capa_sharing_layer2_Cr","capa_sharing_layer2_kapton", + "readout1_glue", "readout1_Cu", "readout1_kapton", "readout2_glue", "readout2_Cu", "readout2_kapton", "readout3_glue", + "support_skin1_g10", "support_honeycomb_nomex", "support_skin2_g10"}; + + // URWELL position in the CLAS12 frame + /* public final static double TGT2DC0 = 228.078; // cm + // public final static double URWELL2DC0 = 2; // cm + public final static double URWELL2DC0[] = new double[NMAXREGIONS]; + public final static double DIST2TGT[] = new double[NMAXREGIONS]; + public final static double W2TGT[] = new double[NMAXREGIONS];; + public final static double YMIN[] = new double[NMAXREGIONS]; + public final static double ZMIN[] = new double[NMAXREGIONS];*/ + + public final static double PITCH = 0.1 ; // cm + public final static double STEREOANGLE = 90; // deg + + /* + * @return String a path to a directory in CCDB of the format {@code "/geometry/detector/"} + */ + public static String getCcdbPath() + { + return CCDBPATH; + } + + /** + * Loads the the necessary tables for the URWELL geometry for a given DatabaseConstantProvider. + * + * @return DatabaseConstantProvider the same thing + */ + public static DatabaseConstantProvider connect( DatabaseConstantProvider cp ) + { + // cp.loadTable( CCDBPATH +"RWELL"); + + load(cp ); + return cp; + } + + /** + * Reads all the necessary constants from CCDB into static variables. + * Please use a DatabaseConstantProvider to access CCDB and load the following tables: + * @param cp a ConstantProvider that has loaded the necessary tables + */ + public static synchronized void load( DatabaseConstantProvider cp ) + { + // read constants from svt table +// NREGIONS = cp.getInteger( CCDBPATH+"svt/nRegions", 0 ); + + for (int i=0; i (volume.getName().contains(volumeName))) + .findAny() + .orElse(null); + } + + /** + * Returns the sector volume for the given sector number + * + * @param sector (1-6) + * @return the sector volume + */ + public Geant4Basic getSectorVolume(int region, int sector) { + + int r = region; + int s = sector; + + String volName = "region_rtrk_" + r + "_s" + s; + return this.getAllVolumes().stream() + .filter(volume -> (volume.getName().contains(volName))) + .findAny() + .orElse(null); + } + + public static void main(String[] args) { + DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); + RTRKConstants.connect(cp); + RTRKGeant4Factory factory = new RTRKGeant4Factory(cp, 1); + factory.getAllVolumes().forEach(volume -> { + System.out.println(volume.gemcString()); + }); + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKStripFactory.java similarity index 54% rename from common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java rename to common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKStripFactory.java index 9a4144f2a6..7368335c7e 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/trk/RTRKStripFactory.java @@ -1,4 +1,4 @@ -package org.jlab.detector.geant4.v2.recoil; +package org.jlab.detector.geant4.v2.recoil.trk; import eu.mihosoft.vrl.v3d.Vector3d; import java.util.List; @@ -15,12 +15,12 @@ /** * Creates and handles the URWELL detector strips as 3D lines - * + * * @author bondi, niccolai */ -public final class RecoilStripFactory { - - private RecoilGeant4Factory factory; +public final class RTRKStripFactory { + + private RTRKGeant4Factory factory; private IndexedList globalStrips = new IndexedList(3); private IndexedList localStrips = new IndexedList(3); private IndexedList planeStrips = new IndexedList(3); @@ -29,16 +29,16 @@ public final class RecoilStripFactory { private int nChambers; private int nLayers; - public RecoilStripFactory() { + public RTRKStripFactory() { } /** * Create the strip factory based on constants from CCDB. - * Currently constants are defined in the RecoilConstants class. + * Currently constants are defined in the RTRKConstants class. * They will be moved to CCDB when finalized). * @param cp database provide */ - public RecoilStripFactory(DatabaseConstantProvider cp) { + public RTRKStripFactory(DatabaseConstantProvider cp) { this.init(cp); } @@ -49,15 +49,15 @@ public RecoilStripFactory(DatabaseConstantProvider cp) { public void init(DatabaseConstantProvider cp) { this.init(cp, 1); } - + /** * Create the strip factory based on constants from CCDB. - * Currently constants are defined in the URWellConstants class. + * Currently constants are defined in the RTRKConstants class. * They will be moved to CCDB when finalized). * @param cp database provide * @param regions */ - public RecoilStripFactory(DatabaseConstantProvider cp, int regions) { + public RTRKStripFactory(DatabaseConstantProvider cp, int regions) { this.init(cp, regions); } @@ -67,45 +67,45 @@ public RecoilStripFactory(DatabaseConstantProvider cp, int regions) { * @param regions */ public void init(DatabaseConstantProvider cp, int regions) { - factory = new RecoilGeant4Factory(cp, regions); - nRegions = Math.min(RecoilConstants.NMAXREGIONS, regions); - nSectors = RecoilConstants.NSECTORS; - nChambers = RecoilConstants.NCHAMBERS; - nLayers = RecoilConstants.NLAYERS; + factory = new RTRKGeant4Factory(cp, regions); + nRegions = Math.min(RTRKConstants.NMAXREGIONS, regions); + nSectors = RTRKConstants.NSECTORS; + nChambers = RTRKConstants.NCHAMBERS; + nLayers = RTRKConstants.NLAYERS; this.fillStripLists(); - // this.fillPlaneLists(); + // this.fillPlaneLists(); } - + /** * Calculates the total number of strips in a sector - * + * * @return the strip number */ public int getNStripSector() { int nStrips = 0; for (int i = 0; i < nChambers; i++) { - for (int j = 0; j < nRegions; j++) { - nStrips += getNStripChamber(i,j); - } - } + for (int j = 0; j < nRegions; j++) { + nStrips += getNStripChamber(i,j); + } + } return nStrips; } - + /** * Calculates the number of strips in the given chamber - * + * * @param ichamber (0, 1, 2) * @return the strip number (1-N) */ public int getNStripChamber(int ichamber, int regions) { - - int iregion = regions; - int chamber = ichamber; + + int iregion = regions; + int chamber = ichamber; double[] dim = factory.getChamber_daughter_Dimensions(iregion,chamber); - + double yHalf = dim[1]; - double xHalf = dim[0]; - + double xHalf = dim[0]; + // C-------------D // // ------------- // // ------------- // @@ -113,56 +113,56 @@ public int getNStripChamber(int ichamber, int regions) { /** * * number of strip in AB** */ - - int nAB = (int) (2 * xHalf / RecoilConstants.PITCH); - int nAC = (int) (2 * yHalf / RecoilConstants.PITCH); - - int nStrips = nAB + nAC; - + + int nAB = (int) (2 * xHalf / RTRKConstants.PITCH); + int nAC = (int) (2 * yHalf / RTRKConstants.PITCH); + + int nStrips = nAB + nAC; + return nStrips; } - + /** * Provides the index of the chamber containing the strip with the given ID - * + * * @param strip (1 to N) * @return the chamber index (0, 1, 2) */ public int getChamberIndex(int strip) { int nStripTotal = 0; - + for(int i=0; i strip ID chamber (from 1 to getNStripChamber) int nStripTotal = 0; if (chamberIndex > 0) { for (int i = 0; i < chamberIndex; i++) { - for (int j = 0; j < nRegions; j++) { - nStripTotal += this.getNStripChamber(i,j); - } - } + for (int j = 0; j < nRegions; j++) { + nStripTotal += this.getNStripChamber(i,j); + } + } } - - //Strip ID: from 1 to getNStripChamber + + //Strip ID: from 1 to getNStripChamber int cStrip = strip - nStripTotal; return cStrip; } - + /** * Builds the given strip line in the CLAS12 frame * @param sector (1-6) @@ -171,79 +171,79 @@ private int getLocalStripId(int strip) { * @return the 3D strip line as a Line3d */ private Line3d createStrip(int sector, int region, int layer, int strip) { - + int chamberIndex = getChamberIndex(strip); int cStrip = this.getLocalStripId(strip); - + // CHAMBER reference frame // new numeration with stri ID_strip=0 crossing (0,0,0) of chamber double[] dim = factory.getChamber_daughter_Dimensions(region-1,chamberIndex); double yHalf = dim[1]; - double xHalf = dim[0]; - - double DY = -xHalf; //v strip - + double xHalf = dim[0]; + + double DY = -xHalf; //v strip + // Y coordinate of the intersection point between the x=0 and the strip line crossing for B - - if (layer % 2 != 0) { //u strip - DY = -yHalf; - } - // ID of the strip - int nS = (int) (DY / RecoilConstants.PITCH); + + if (layer % 2 != 0) { //u strip + DY = -yHalf; + } + // ID of the strip + int nS = (int) (DY / RTRKConstants.PITCH); int nCStrip = nS + (cStrip - 1); - double c = nCStrip * RecoilConstants.PITCH; - - // Take 2 points in the strip straight line. They needs to define Line object + double c = nCStrip * RTRKConstants.PITCH; + + // Take 2 points in the strip straight line. They needs to define Line object //u strips double oX = -xHalf; double oY = c; double oZ = 0; - + double eX = xHalf; double eY = c; double eZ = 0; - + if (layer % 2 == 0) { //v strips - oX = c; - oY = -yHalf; - oZ = 0; - - eX = c; - eY = yHalf; - eZ = 0; - } - - Vector3d origin = new Vector3d(oX, oY, oZ); - Vector3d end = new Vector3d(eX, eY, eZ); - + oX = c; + oY = -yHalf; + oZ = 0; + + eX = c; + eY = yHalf; + eZ = 0; + } + + Vector3d origin = new Vector3d(oX, oY, oZ); + Vector3d end = new Vector3d(eX, eY, eZ); + // Get Chamber Volume Geant4Basic chamberVolume = factory.getChamberVolume(sector, region, chamberIndex+1, layer); - - // 2 point defined before wrt the GLOBAL frame + + // 2 point defined before wrt the GLOBAL frame Vector3d globalOrigin = chamberVolume.getGlobalTransform().transform(origin); - + Vector3d globalEnd = chamberVolume.getGlobalTransform().transform(end); - + Straight line = new Line3d(globalOrigin, globalEnd); - + // CHECK intersections between line and volume chamberVolume.makeSensitive(); List Hits = chamberVolume.getIntersections(line); - + if (Hits.size() >= 1) { - - Vector3d TestOrigin = Hits.get(0).origin(); - Vector3d TestEnd = Hits.get(0).end(); - + + Vector3d TestOrigin = Hits.get(0).origin(); + Vector3d TestEnd = Hits.get(0).end(); + return new Line3d(Hits.get(0).origin(), Hits.get(0).end()); - + } else { return null; } } - - /** + + /** * Provides the given strip line in the Chamber local frame * @param region (1-2) * @param sector (1-6) @@ -251,19 +251,19 @@ private Line3d createStrip(int sector, int region, int layer, int strip) { * @param strip (1-N) * @return the 3D strip line as a Line3d */ - private Line3d getChamberStrip(int region, int sector, int chamber, int layer, int strip) { - - Line3d globalStrip = createStrip(sector, region, layer, strip); - Geant4Basic chamberVolume = factory.getChamberVolume(sector, region, chamber, layer); - - Vector3d origin = chamberVolume.getGlobalTransform().invert().transform(globalStrip.origin()); - Vector3d end = chamberVolume.getGlobalTransform().invert().transform(globalStrip.end()); - - Line3d localStrip = new Line3d(origin, end); - - return localStrip; + + Line3d globalStrip = createStrip(sector, region, layer, strip); + Geant4Basic chamberVolume = factory.getChamberVolume(sector, region, chamber, layer); + + Vector3d origin = chamberVolume.getGlobalTransform().invert().transform(globalStrip.origin()); + Vector3d end = chamberVolume.getGlobalTransform().invert().transform(globalStrip.end()); + + Line3d localStrip = new Line3d(origin, end); + + return localStrip; } + /** * Provides the given strip line in the sector local frame * @param sector (1-6) @@ -272,20 +272,18 @@ private Line3d getChamberStrip(int region, int sector, int chamber, int layer, i * @return the 3D strip line as a Line3d */ private Line3d getLocalStrip(int region, int sector, int layer, int strip) { - - + Line3d globalStrip = createStrip(sector, region, layer, strip); Geant4Basic sVolume = factory.getSectorVolume(region, sector); - + Vector3d origin = sVolume.getGlobalTransform().invert().transform(globalStrip.origin()); Vector3d end = sVolume.getGlobalTransform().invert().transform(globalStrip.end()); - + Line3d localStrip = new Line3d(origin, end); - + return localStrip; } - private void fillStripLists() { for(int ir=0; ir-xHalf && c-yHalf && c-xHalf && c-yHalf && c-xHalf && c-yHalf && c-xHalf && c-yHalf && c + * Uses found hits information. Creates a {@link RTOFCluster} matching them. + *

+ * + * @author pilleux, Nilanga Wickramaarachchi + */ +public class ClusterFinder { + + /** + * list of clusters. + */ + private ArrayList clusters; + + /** + * Sets the list of clusters. + * + * @param clusters a {@link ArrayList} of {@link RTOFCluster}. + * + */ + public void setClusters(ArrayList clusters) { + this.clusters = clusters; + } + + /** + * Gets the list of clusters. + * + * @return a {@link ArrayList} of {@link RTOFCluster}. + * + */ + public ArrayList getClusters() { + return clusters; + } + + + /** + * Cluster hits around a given hit, based on the time and geometric + * proximity. + * + * Hits are compared based on their y difference, which + * is distance in cm and time difference. + * + * If the hit satisfies all conditions, it is marked as clustered and added + * to the cluster hit list. + * + * + * @param The type of the hit objects, which must extend + * {@link RTOFRawHit}. This allows the method to work with different types of + * hits that are subclasses of {@link RTOFRawHit} (e.g., {@link RTOFHit}). + * @param i The index from which hits are read in the list to compare + * against the current hit. + * @param hits The list of hits to be clustered, can be any subclass of + * {@link RTOFRawHit}. + * @param this_hit The hit currently being considered for clustering. + * @param sigma_y The threshold for the y-distance [cm] between the hits. + * @param sigma_t The threshold for the time difference [ns] between the + * hits. + * @param cluster_id The ID of the cluster being formed. + * @param this_cluster_hits The list that will store the clustered hits. + * This list can accept hits of type RTOFRawHit or RTOFHit. Clustered hits are + * added to this list. + * + */ + public void clusterHits(int i, ArrayList hits, RTOFRawHit this_hit, Number sigma_y, double sigma_t, int cluster_id, ArrayList this_cluster_hits) { + // Loop through less energetic clusters + for (int j = i + 1; j < hits.size(); j++) { + T other_hit = hits.get(j); + // Skip already clustered hits + if (other_hit.getIsInACluster()) { + continue; + } + // Check the distance between the hits + double delta_T = Math.abs(this_hit.getTime() - other_hit.getTime()); + //The y distance is a distance in cm + Boolean condition_y; + double delta_Y = Math.abs(this_hit.getY() - other_hit.getY()); + condition_y = (delta_Y <= sigma_y.doubleValue()); + + //If hit is within limits, it is clustered + if (condition_y) { + if (delta_T < sigma_t) { + other_hit.setIsInACluster(true); + other_hit.setAssociatedClusterIndex(cluster_id); + this_cluster_hits.add(other_hit); + } + } + } + } + + + /** + * Builds clusters in the {@link DateEvent} using hits found and stored in a + * {@link HitFinder}. + * + * @param hitfinder the {@link HitFinder} containing the hits that were + * found + * + * @param sigma_y the tolerance for clustering in y [cm] + * + * @param sigma_t the tolerance for clustering in time [ns] + * + */ + public void makeClusters(HitFinder hitfinder, double sigma_y, double sigma_t, DataEvent event) { + + //A list of clusters is built for each event + clusters.clear(); + int cluster_id = 1; + + //Getting the list of hits, they must have been ordered by energy already + ArrayList rtof_hits = hitfinder.getRTOFHits(); + + //Loop through all bar hits + for (int i_bar = 0; i_bar < rtof_hits.size(); i_bar++) { + RTOFHit this_rtof_hit = rtof_hits.get(i_bar); + //Skip hits that have already been clustered + if (this_rtof_hit.getIsInACluster()) { + continue; + } + + ArrayList this_cluster_rtof_hits = new ArrayList<>(); + this_rtof_hit.setIsInACluster(true); + this_rtof_hit.setAssociatedClusterIndex(cluster_id); + this_cluster_rtof_hits.add(this_rtof_hit); + + //Matching bar hits in clusters + clusterHits(i_bar, rtof_hits, this_rtof_hit, sigma_y, sigma_t, cluster_id, this_cluster_rtof_hits); + + RTOFCluster cluster = new RTOFCluster(this_cluster_rtof_hits, event); + clusters.add(cluster); + cluster_id++; + } + } + + /** + * Builds clusters in the {@link DataEvent} using hits found and stored in a + * {@link HitFinder}. + * + * @param event the {@link DataEvent} containing the clusters to be built + * + * @param hitfinder the {@link HitFinder} containing the hits that were + * found + * + */ + public void makeClusters(DataEvent event, HitFinder hitfinder) { + makeClusters(hitfinder, + Parameters.SIGMA_Y_CLUSTERING, + Parameters.SIGMA_T_CLUSTERING, event); + } + + /** + * Default constructor that initializes the list clusters as new empty list. + */ + public ClusterFinder() { + clusters = new ArrayList<>(); + } +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/HitFinder.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/HitFinder.java new file mode 100644 index 0000000000..d79024693c --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/HitFinder.java @@ -0,0 +1,113 @@ +package org.jlab.service.recoil.tof; + +import java.util.ArrayList; +import java.util.Collections; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; + +/** + * The {@code HitFinder} class finds hits in the recoil tof. + * + *

+ * Uses recoil tof tdc bank information + * + * Creates a {@link ArrayList} of {@link RTOFHit} for rtof hits read. + * + *

+ * + * @author pilleux, Nilanga Wickramaarachchi + */ +public class HitFinder { + + /** + * list of rtof hits + */ + private ArrayList rtofHits; + + /** + * Default constructor that initializes the list of hits as new empty lists. + */ + public HitFinder() { + this.rtofHits = new ArrayList<>(); + } + + // Getter and Setter for rtofHits + public ArrayList getRTOFHits() { + return rtofHits; + } + + public void setRTOFHits(ArrayList rtof_hits) { + this.rtofHits = rtof_hits; + } + + /** + * + * @param event the {@link DataEvent} containing hits. + * + */ + public void findHits(DataEvent event) { + //For each event a list of rtof hits is filled + this.rtofHits.clear(); + //They are read from the RTOF TDC bank + DataBank bank = event.getBank("RTOF::tdc"); + int nt = bank.rows(); // number of hits + //Hits in the bar downstream and upstream will be matched + ArrayList hit_up = new ArrayList<>(); + ArrayList hit_down = new ArrayList<>(); + + //Looping through all hits + for (int i = 0; i < nt; i++) { + //Getting their properties + int sector = bank.getByte("sector", i); + int layer = bank.getByte("layer", i); + int component = bank.getByte("component", i); + int order = bank.getShort("order", i); + int tdc = bank.getShort("TDC", i); + int tot = bank.getShort("ToT", i); + + //Building a Hit + RTOFRawHit hit = new RTOFRawHit(sector, layer, component, order, tdc, tot); + if (hit.getEnergy() < 0.01) { + continue; //energy threshold + } + + //Sorting the hits into upstream and downstream bar hits + //Lists are built for up/down bar to match them after + if (null == hit.getType()) { + System.out.print("Undefined hit type \n"); + } else { + switch (hit.getType()) { + case "bar up" -> + hit_up.add(hit); + case "bar down" -> + hit_down.add(hit); + default -> + System.out.print("Undefined hit type \n"); + } + } + }//End loop through all hits + + //Starting loop through up hits in the bar + for (int i_up = 0; i_up < hit_up.size(); i_up++) { + RTOFRawHit this_hit_up = hit_up.get(i_up); + int countMatches = 0; + //Starting loop through down hits in the bar + for (int i_down = 0; i_down < hit_down.size(); i_down++) { + RTOFRawHit this_hit_down = hit_down.get(i_down); + //Matching the hits: if same bar and different order, they make up a rtof hit + if (this_hit_up.matchBar(this_hit_down)) { + if (countMatches > 0) { + //If the up hit was already involved in a match, do not make an additionnal match + //Chosing to ignore double matches for now because it happened for <1% of events in cosmic runs + continue; + } + RTOFHit this_rtof_hit = new RTOFHit(this_hit_down, this_hit_up); + this.rtofHits.add(this_rtof_hit); + countMatches++; + } + } + } + //Once all has been listed, hits are sorted by energy + Collections.sort(this.rtofHits, (hit1, hit2) -> Double.compare(hit2.getEnergy(), hit1.getEnergy())); + } +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/Parameters.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/Parameters.java new file mode 100644 index 0000000000..c6b8f7f9fc --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/Parameters.java @@ -0,0 +1,25 @@ +package org.jlab.service.recoil.tof; + +/** + * + * @author npilleux, Nilanga Wickramaarachchi + */ +public class Parameters { + + public static final double VEFF = 20.0;//cm/ns + public static final double TDC2TIME = 0.015625;//ns per channel bin + public static final double ATT_L = 160.0;//cm + public static final double TOT2ENERGY = 1.956 * 0.5 /1000;//to MeV + + //public static double SIGMA_Y_TRACK_MATCHING_BAR = 20.0;//in cm + public static double SIGMA_Y_CLUSTERING = 4.0;//in cm + public static double SIGMA_T_CLUSTERING = 100;// in ns + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + // TODO code application logic here + } + +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFCluster.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFCluster.java new file mode 100644 index 0000000000..a5cf256a59 --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFCluster.java @@ -0,0 +1,240 @@ +package org.jlab.service.recoil.tof; + +import java.util.ArrayList; +import org.jlab.io.base.DataEvent; + +/** + * The {@code RTOFCluster} represents clusters in the recoil tof + * + *

+ * Create clusters and compute their basic properties from the hits composing + * them. + *

+ * + * @author pilleux, Nilanga Wickramaarachchi + */ +public class RTOFCluster { + + /** + * list of hits in the bars. + */ + ArrayList rtofHits; + /** + * cluster properties:position [cm], time [ns], energy[MeV], + * type of the maximum hit (to set resolutions) and index and sector of the maximum hit. + */ + double x, y, z, time, energy; + String typeMaxHit; + int indexMaxHit, sectorMaxHit; + + public ArrayList getRTOFHits() { + return rtofHits; + } + + public void setRTOFHits(ArrayList rtof_hits) { + this.rtofHits = rtof_hits; + } + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getZ() { + return z; + } + + public void setZ(double z) { + this.z = z; + } + + public double getTime() { + return time; + } + + public void setTime(double time) { + this.time = time; + } + + public double getEnergy() { + return energy; + } + + public void setEnergy(double energy) { + this.energy = energy; + } + + + public String getTypeMaxHit() { + return typeMaxHit; + } + + public void setTypeMaxHit(String typeMaxHit) { + this.typeMaxHit = typeMaxHit; + } + + public int getIndexMaxHit() { + return indexMaxHit; + } + + public void setIndexMaxHit(int indexMaxHit) { + this.indexMaxHit = indexMaxHit; + } + + public int getSectorMaxHit() { + return sectorMaxHit; + } + + public void setSectorMaxHit(int sectorMaxHit) { + this.sectorMaxHit = sectorMaxHit; + } + + /** + * Compute the cluster properties. + * + * Cluster coordinates and time are defined as the coordinates and time of + * the max energy hit. + * + * TO DO: Test other choices for the definitions. + * + */ + public final void computeClusterProperties() { + this.energy = 0; + double max_energy = -1; + RTOFRawHit max_energy_hit = new RTOFRawHit(); + + for (int i_bar = 0; i_bar < this.rtofHits.size(); i_bar++) { + RTOFHit this_rtof_hit = this.rtofHits.get(i_bar); + double this_energy = this_rtof_hit.getEnergy(); + this.energy += this_energy; + if (this_energy > max_energy) { + max_energy_hit = this_rtof_hit; + max_energy = this_energy; + } + } + + this.time = max_energy_hit.getTime(); + this.x = max_energy_hit.getX(); + this.y = max_energy_hit.getY(); + this.z = max_energy_hit.getZ(); + this.typeMaxHit = max_energy_hit.getType(); + this.sectorMaxHit = max_energy_hit.getSector(); + } + + + /** + * Computes the energy deposited in the bars. + * + * @return the energy deposited in the bars. + * + */ + public double getEdepBar() { + double energy = 0; + for (int i = 0; i < this.rtofHits.size(); i++) { + RTOFRawHit this_hit = this.rtofHits.get(i); + energy += this_hit.getEnergy(); + } + return energy; + } + + /** + * Compute the cluster phi angle in radians. + * + * @return a double that is angle in radians + * + */ + public double getPhi() { + return Math.atan2(this.y, this.x); + } + + + /** + * Retrieve the hit with maximal energy in the cluster. It must have been + * computed previously. + * + * @return a RTOFRawHit that is the maximal energy hit in the cluster + * + */ + public final RTOFRawHit getMaxHit() { + if (this.typeMaxHit == null) { + System.out.print("You did not compute the maximal hit! \n"); + return null; + } + if (null == this.typeMaxHit) { + System.out.print("Unrecognized type! \n"); + return null; + } else { + switch (this.typeMaxHit) { + case "bar" -> { + return this.rtofHits.get(this.indexMaxHit); + } + default -> { + System.out.print("Unrecognized type! \n"); + return null; + } + } + } + } + + /** + * Computes the sum of TOT in the cluster. + * + * @return an int representing the summed TOT + * + */ + public int getTot() { + int tot = 0; + for (int i = 0; i < this.rtofHits.size(); i++) { + RTOFHit this_hit = this.rtofHits.get(i); + tot += this_hit.getTot(); + } + return tot; + } + + /** + * Returns the TDC of the maximal hit in the cluster. + * + * @return an int representing the TDC of the maximal hit. + * + */ + public int getTdc() { + return this.getMaxHit().getTdc(); + } + + /** + * Constructor that initializes the list of bar hits + * and computes the cluster properties. + * + * @param rtof_hits a {@link ArrayList} of {@link RTOFHit}. + * + */ + public RTOFCluster(ArrayList rtof_hits) { + this.rtofHits = rtof_hits; + this.computeClusterProperties(); + } + + /** + * Constructor that initializes the list of bar hits + * and computes the cluster properties. + * + * @param rtof_hits a {@link ArrayList} of {@link RTOFHit}. + * @param event a {@link DataEvent} with which track matching will be done. + * + */ + public RTOFCluster(ArrayList rtof_hits, DataEvent event) { + this.rtofHits = rtof_hits; + this.computeClusterProperties(); + } + +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFEngine.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFEngine.java new file mode 100644 index 0000000000..f091d90dcd --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFEngine.java @@ -0,0 +1,63 @@ +package org.jlab.service.recoil.tof; + +import java.util.ArrayList; +import org.jlab.io.base.DataEvent; +import org.jlab.clas.reco.ReconstructionEngine; + +/** + * Service to return reconstructed RTOF hits and clusters + * + * @author npilleux, Nilanga Wickramaarachchi + * + */ +public class RTOFEngine extends ReconstructionEngine { + + public RTOFEngine() { + super("RTOF", "Nilanga Wickramaarachchi", "1.0"); + } + + RecoBankWriter rbc; + + @Override + public boolean processDataEventUser(DataEvent event) { + + if (!event.hasBank("RUN::config")) { + return true; + } + + //Hit finder init + HitFinder hitfinder = new HitFinder(); + hitfinder.findHits(event); + + ArrayList RTOFHits = hitfinder.getRTOFHits(); + + //Exit if hit list is empty + if (RTOFHits.isEmpty()) { + // System.out.println("No hits : "); + // event.show(); + return true; + } + + ClusterFinder clusterFinder = new ClusterFinder(); + clusterFinder.makeClusters(event,hitfinder); + ArrayList Clusters = clusterFinder.getClusters(); + + if (RTOFHits.size() != 0) { + rbc.appendRTOFBanks(event, RTOFHits, Clusters); + } + return true; + } + + @Override + public boolean init() { + rbc = new RecoBankWriter(); + + this.registerOutputBank("RTOF::hits", "RTOF::clusters"); + + return true; + } + + @Override + public void detectorChanged(int run) {} +} + diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFHit.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFHit.java new file mode 100644 index 0000000000..87330bc1ce --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFHit.java @@ -0,0 +1,140 @@ +package org.jlab.service.recoil.tof; + +import org.jlab.detector.geant4.v2.recoil.tof.RTOFConstants; + +/** + * + * Represents a hit in the recoil tof bar. Extends class RTOFRawHit. Is further defined + * by the two hits upstream and downstream composing a full rtof hit. y position, + * time and energy are defined from the up/down hits. + * + * @author npilleux, Nilanga Wickramaarachchi + */ +public class RTOFHit extends RTOFRawHit { + + //A rtof hit is the combination of a downstream and upstream hits + private RTOFRawHit hitUp, hitDown; + + public RTOFRawHit getHitUp() { + return hitUp; + } + + public void setHitUp(RTOFRawHit hit_up) { + this.hitUp = hit_up; + } + + public RTOFRawHit getHitDown() { + return hitDown; + } + + public void setHitDown(RTOFRawHit hit_down) { + this.hitDown = hit_down; + } + + /** + * Computes rtof hit y local coordinate from up/downstream hit times. + * + */ + public final void computeLocalY() { + this.setLocalY(Parameters.VEFF/2. * (hitUp.getTime() - hitDown.getTime())); + } + + /** + * Computes rtof hit y coordinate in the global coordinate system. + * + */ + public final void computeGlobalY() { + double localY = this.getLocalY(); + int nRows = RTOFConstants.NROWS; + double y_start = -(RTOFConstants.LENGTH - RTOFConstants.LONG_BAR_LENGTH)/2; // Starting Y position + double dy_long = RTOFConstants.LONG_BAR_LENGTH; + double dy_short = RTOFConstants.SHORT_BAR_LENGTH; + + double y_pos; // y coordinate of the center of bar wrt to the global coordinate system + if(hitUp.getRow()-1 < (nRows - 1)/2) + { + y_pos = y_start + ((hitUp.getRow()-1) * dy_long); + } + else if (hitUp.getRow()-1 == (nRows-1) / 2) // middle row + { + y_pos = 0; + } + else + { + y_pos = y_start + (hitUp.getRow()-2) * dy_long + dy_short; + } + + this.setY(y_pos + localY); + } + + /** + * Computes rtof hit time from up/downstream hit times. + * The time is set as the time of the most energetic hit. + * It is corrected for propagation time. + * + */ + public final void computeTime() { + //We pick the most energetic signal as the timing signal + double time_at_sipm, distance_to_sipm; + if(this.hitDown.getEnergy() > this.hitUp.getEnergy()) { + time_at_sipm = this.hitDown.getTime(); + if(this.hitDown.getRow() == 3) distance_to_sipm = RTOFConstants.SHORT_BAR_LENGTH/2. - this.getLocalY(); + else distance_to_sipm = RTOFConstants.LONG_BAR_LENGTH/2. - this.getLocalY(); + } + else { + time_at_sipm = this.hitUp.getTime(); + if(this.hitUp.getRow() == 3) distance_to_sipm = RTOFConstants.SHORT_BAR_LENGTH/2. + this.getLocalY(); + else distance_to_sipm = RTOFConstants.LONG_BAR_LENGTH/2. + this.getLocalY(); + } + this.setTime(time_at_sipm - distance_to_sipm/Parameters.VEFF); + } + + /** + * Computes rtof hit energy from up/downstream hits. + * The energy of the up/downstream hits is corrected for attenuation now that y is known. + * The energy of the rtof hit is the sum of the energy of the up/downstream hits. + * + */ + public final void computeEnergy() { + this.computeLocalY(); + double distance_hit_to_sipm_up, distance_hit_to_sipm_down; + + if (hitUp.getRow() == 3) distance_hit_to_sipm_up = RTOFConstants.SHORT_BAR_LENGTH / 2. + this.getLocalY(); + else distance_hit_to_sipm_up = RTOFConstants.LONG_BAR_LENGTH / 2. + this.getLocalY(); + + if (hitDown.getRow() == 3) distance_hit_to_sipm_down = RTOFConstants.SHORT_BAR_LENGTH / 2. - this.getLocalY(); + else distance_hit_to_sipm_down = RTOFConstants.LONG_BAR_LENGTH / 2. - this.getLocalY(); + + double Edep_up = hitUp.getEnergy() * Math.exp(distance_hit_to_sipm_up / Parameters.ATT_L); + double Edep_down = hitDown.getEnergy() * Math.exp(distance_hit_to_sipm_down / Parameters.ATT_L); + this.setEnergy(Edep_up + Edep_down); + } + + public RTOFHit(RTOFRawHit hit_down, RTOFRawHit hit_up) { + boolean hits_match = hit_down.matchBar(hit_up); + if (!hits_match) { + throw new UnsupportedOperationException("Hits do not match \n"); + } + this.setType("bar"); + this.setOrder(2);//Fake order for bar hits + this.hitUp = hit_up; + this.hitDown = hit_down; + this.setSector(hit_up.getSector()); + this.setRow(hit_up.getRow()); + this.setColumn(hit_up.getColumn()); + this.setX(hit_up.getX()); + this.setZ(hit_up.getZ()); + this.computeLocalY(); + this.computeGlobalY(); + this.computeTime(); + this.computeEnergy(); + this.setTdc((hit_down.getTdc() + hit_up.getTdc())/2); + this.setTot((hit_down.getTot() + hit_up.getTot())); + } + + public RTOFHit() { + super(); + this.setType("bar"); + this.setOrder(2);//Fake order for rtof hits + } +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFRawHit.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFRawHit.java new file mode 100644 index 0000000000..3feabdc5ac --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RTOFRawHit.java @@ -0,0 +1,398 @@ +package org.jlab.service.recoil.tof; + +import org.jlab.detector.geant4.v2.recoil.tof.RTOFConstants; + +/** + * + * Represents a hit in the recoil tof. Stores info about the sector, row, column, + * order, TDC, ToT. Type is bar up/bar down/ bar. Stores whether + * the hit is part of a cluster. Calculates time, energy based on TDC/ToT. + * + * @author npilleux, Nilanga Wickramaarachchi + */ +public class RTOFRawHit { + + private int sector, row, column, order; + private int tdc, tot; + private double time, energy, x, y, z, local_y; + private String type; + private boolean isInACluster; + private int associatedClusterIndex; + int idTDC; + + /** + * Constructor for a hit in the recoil tof. Initializes the hit's sector, row, + * column, order, TDC, ToT. Sets the hit's initial state regarding + * clustering. Set up the hit's type, time, energy, and spatial coordinates. + * + * @param sector The sector of the detector where the hit occurred. + * @param row The row of the detector where the hit was detected. + * @param column The column within the row that registered the hit. + * @param order Order of the hit. + * @param tdc TDC value. + * @param tot ToT value. + * + */ + public RTOFRawHit(int sector, int row, int column, int order, int tdc, int tot) { + this.sector = sector; + this.row = row; + this.column = column; + this.order = order; + this.tdc = tdc; + this.tot = tot; + this.isInACluster = false; + + this.makeType(); + this.convertTdcToTime(); + this.convertTotToEnergy(); + this.calculateXYZ(); + } + + public RTOFRawHit() { + } + + public int getSector() { + return sector; + } + + public void setSector(int sector) { + this.sector = sector; + } + + public int getRow() { + return row; + } + + public void setRow(int row) { + this.row = row; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + public int getColumn() { + return column; + } + + public void setColumn(int column) { + this.column = column; + } + + public int getTdc() { + return tdc; + } + + public void setTdc(int tdc) { + this.tdc = tdc; + } + + public int getTot() { + return tot; + } + + public void setTot(int tot) { + this.tot = tot; + } + + public double getTime() { + return time; + } + + public void setTime(double time) { + this.time = time; + } + + public double getEnergy() { + return energy; + } + + public void setEnergy(double energy) { + this.energy = energy; + } + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getLocalY() { + return local_y; + } + + public void setLocalY(double local_y) { + this.local_y = local_y; + } + + public double getZ() { + return z; + } + + public void setZ(double z) { + this.z = z; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean getIsInACluster() { + return isInACluster; + } + + public void setIsInACluster(boolean is_in_a_cluster) { + this.isInACluster = is_in_a_cluster; + } + + public int getAssociatedClusterIndex() { + return associatedClusterIndex; + } + + public void setAssociatedClusterIndex(int index) { + this.associatedClusterIndex = index; + } + + public int getIdTDC() { + return idTDC; + } + + public void setIdTDC(int index) { + this.idTDC = index; + } + + + /** + * Assigns a type to the hit. + * + */ + public final String makeType() { + //Type of hit can be bar up, bar down or bar. + //Avoids testing components and order every time. + String itype = "undefined"; + if (this.order == 0) { + itype = "bar down"; + } else if (this.order == 1) { + itype = "bar up"; + } + this.type = itype; + return itype; + } + + /** + * Converts TDC to time (ns). Sets the hit time parameter to a raw time for + * up/down bar hits. + * + * @return 0 if the time was successfully set, or 1 if the hit type is + * unsupported. + */ + public final int convertTdcToTime() { + double tdc2time, veff, distance_to_sipm; + if (null == this.type) { + System.out.print("Null hit type, cannot convert tdc to time."); + return 1; + } else { + switch (this.type) { + case "bar up" -> { + tdc2time = Parameters.TDC2TIME; + veff = Parameters.VEFF; + //The distance will be computed at barhit level when y information is available + distance_to_sipm = 0; + } + case "bar down" -> { + tdc2time = Parameters.TDC2TIME; + veff = Parameters.VEFF; + //The distance will be computed at barhit level when y information is available + distance_to_sipm = 0; + } + case "bar" -> { + System.out.print("Bar hit type, cannot convert tdc to time."); + return 1; + } + default -> { + System.out.print("Undefined hit type, cannot convert tdc to time."); + return 1; + } + } + } + //Hit time. Will need implementation of offsets. + this.time = tdc2time * this.tdc - distance_to_sipm / veff; + return 0; + } + + /** + * Converts ToT to energy (MeV). Sets the hit energy parameter to a raw + * energy for up/down bar hits. + * + * @return 0 if the energy was successfully set, or 1 if the hit type is + * unsupported. + */ + public final int convertTotToEnergy() { + double tot2energy; + if (null == this.type) { + System.out.print("Null hit type, cannot convert tot to energy."); + return 1; + } else { + switch (this.type) { + case "bar up" -> { + tot2energy = Parameters.TOT2ENERGY; + //only half the information in the bar, + //the attenuation will be computed when the full hit is formed + this.energy = tot2energy * this.tot; + } + case "bar down" -> { + tot2energy = Parameters.TOT2ENERGY; + //only half the information in the bar, + //the attenuation will be computed when the full hit is formed + this.energy = tot2energy * this.tot; + } + case "bar" -> { + System.out.print("Bar hit type, cannot convert tot to energy."); + return 1; + } + default -> { + System.out.print("Undefined hit type, cannot convert tot to energy."); + return 1; + } + } + } + return 0; + } + + /** + * Calculates spatial coordinates (cm) for the hit based on row and column number of the bar within a sector. + * The row and column variables are obtained from the bank information. + * + * @return 0 if the coordinates were successfully set, or 1 if the hit type + * is undefined or unsupported. + */ + public final int calculateXYZ() { + + // Constants for positioning + int nRows = RTOFConstants.NROWS; + double y_start = -(RTOFConstants.LENGTH - RTOFConstants.LONG_BAR_LENGTH)/2; // Starting Y position + double x_spacing = RTOFConstants.BAR_WIDTH; + double x_start = -(RTOFConstants.WIDTH - x_spacing)/2; // starting X position + double dy_long = RTOFConstants.LONG_BAR_LENGTH; + double dy_short = RTOFConstants.SHORT_BAR_LENGTH; + + //Position calculation + double z_pos = 0; + double x_pos = x_start + ((this.column-1) * x_spacing); + + double y_pos; + if(this.row-1 < (nRows - 1) / 2) + { + y_pos = y_start + ((this.row-1) * dy_long); + } + else if (this.row-1 == (nRows - 1) / 2) // middle row + { + y_pos = 0; + } + else + { + y_pos = y_start + (this.row -2) * dy_long + dy_short; + } + + double[] localCoords = {x_pos, y_pos, z_pos}; + + // Calculate center coordinates for the sector + double sector_x = (-1+(this.sector-1)*2)*(RTOFConstants.RADIUS)*Math.sin(Math.toRadians(RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE)); + double sector_y = 0; + double sector_z = RTOFConstants.RADIUS*Math.cos(Math.toRadians(RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE)); + + // Global coordinates of the sector + double[] globalCoordsSector = {sector_x, sector_y, sector_z}; + + // Rotation angle in radians + double thetaY = 0; + + if(this.sector==1) thetaY = Math.toRadians(-(RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE)); + if(this.sector==2) thetaY = Math.toRadians(RTOFConstants.HORIZONTAL_OPENING_ANGLE/2+RTOFConstants.HORIZONTAL_STARTING_ANGLE); + + // Rotation matrix around the Y-axis + double[][] Ry = { + {Math.cos(thetaY), 0, Math.sin(thetaY)}, + {0, 1, 0}, + {-Math.sin(thetaY), 0, Math.cos(thetaY)} + }; + + // Rotate local coordinates + double[] rotatedCoords = new double[3]; + for (int i = 0; i < 3; i++) { + rotatedCoords[i] = Ry[i][0] * localCoords[0] + Ry[i][1] * localCoords[1] + Ry[i][2] * localCoords[2]; + } + + // Calculate global coordinates for the hit + double[] globalCoordsBar = new double[3]; + for (int i = 0; i < 3; i++) { + globalCoordsBar[i] = globalCoordsSector[i] + rotatedCoords[i]; + } + + + this.x = globalCoordsBar[0]; + this.y = globalCoordsBar[1]; + this.z = globalCoordsBar[2]; + return 0; + } + + /** + * Compares two RTOFRawHit objects to check if they match in the bar. + *
    + *
  • If the sector or row or column of the two hits do not match, the method + * returns {@code false}.
  • + *
  • If both hits are in the same SiPM (i.e., their order is the same), or + * have incorrect order, the method returns {@code false}.
  • + *
+ * If none of these conditions are violated, the method returns + * {@code true}, indicating the two hits match. + * + * @param hit2match The RTOFRawHit object to compare with the current instance. + * @return {@code true} if the hits match; {@code false} otherwise. + */ + public boolean matchBar(RTOFRawHit hit2match) { + if (this.getSector() != hit2match.getSector()) { + //Two hits in different sectors + return false; + } else if (this.getRow() != hit2match.getRow()) { + //Two hits in different rows + return false; + } else if (this.getColumn() != hit2match.getColumn()) { + //Two hits in different columns + return false; + } else if (this.getOrder() > 1 || hit2match.getOrder() > 1) { + //At least one hit has incorrect order + return false; + } else { + //Match if one is order 0 and the other is order 1 + return this.getOrder() != hit2match.getOrder(); + } + } + + /** + * Computes the azimuthal angle (phi) of the hit in rad. + * + * @return The azimuthal angle (phi) in radians, in the range [-π, π]. + */ + public double getPhi() { + return Math.atan2(this.y, this.x); + } +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RecoBankWriter.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RecoBankWriter.java new file mode 100644 index 0000000000..1383871435 --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/tof/RecoBankWriter.java @@ -0,0 +1,115 @@ +package org.jlab.service.recoil.tof; + +import java.util.ArrayList; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; + +/** + * The {@code RecoBankWriter} writes the banks needed for the recoil tof + * reconstruction: hits and clusters info. + * + * @author pilleux, Nilanga Wickramaarachchi + */ +public class RecoBankWriter { + + /** + * Writes the bank of recoil tof hits. + * + * @param event the {@link DataEvent} in which to add the bank + * @param rtofHits the {@link ArrayList} of {@link RTOFHit} containing the rtof + * hits to be added to the bank + * + * @return {@link DataBank} the bank with all the hits read in the event. + * + */ + public static DataBank fillRTOFRawHitBank(DataEvent event, ArrayList rtofHits) { + + ArrayList hitList = new ArrayList<>(); + hitList.addAll(rtofHits); + + DataBank bank = event.createBank("RTOF::hits", hitList.size()); + + if (bank == null) { + System.err.println("COULD NOT CREATE A RTOF::hits BANK!!!!!!"); + return null; + } + + for (int i = 0; i < hitList.size(); i++) { + bank.setShort("id", i, (short) (i + 1)); + bank.setShort("clusterid", i, (short) hitList.get(i).getAssociatedClusterIndex()); + bank.setByte("sector", i, (byte) hitList.get(i).getSector()); + bank.setByte("layer", i, (byte) hitList.get(i).getRow()); + bank.setByte("component", i, (byte) hitList.get(i).getColumn()); + bank.setFloat("time", i, (float) hitList.get(i).getTime()); + bank.setFloat("x", i, (float) (hitList.get(i).getX())); + bank.setFloat("y", i, (float) (hitList.get(i).getY())); + bank.setFloat("z", i, (float) (hitList.get(i).getZ())); + bank.setFloat("energy", i, (float) hitList.get(i).getEnergy()); + } + return bank; + } + + /** + * Writes the bank of rtof clusters. + * + * @param event the {@link DataEvent} in which to add the bank + * @param clusterList the {@link ArrayList} of {@link RTOFCluster} + * containing the clusters info to be added to the bank + * + * @return {@link DataBank} the bank with all the clusters built in the + * event. + * + */ + public static DataBank fillRTOFClusterBank(DataEvent event, ArrayList clusterList) { + + DataBank bank = event.createBank("RTOF::clusters", clusterList.size()); + + if (bank == null) { + System.err.println("COULD NOT CREATE A RTOF::clusters BANK!!!!!!"); + return null; + } + + for (int i = 0; i < clusterList.size(); i++) { + bank.setShort("id", i, (short) (i + 1)); + bank.setShort("size", i, (short) clusterList.get(i).getRTOFHits().size()); + bank.setByte("sector", i, (byte) clusterList.get(i).getSectorMaxHit()); + bank.setFloat("time", i, (float) clusterList.get(i).getTime()); + bank.setFloat("x", i, (float) (clusterList.get(i).getX())); + bank.setFloat("y", i, (float) (clusterList.get(i).getY())); + bank.setFloat("z", i, (float) (clusterList.get(i).getZ())); + bank.setFloat("energy", i, (float) clusterList.get(i).getEnergy()); + } + return bank; + } + + /** + * Appends the rtof banks to an event. + * + * @param event the {@link DataEvent} in which to append the banks + * @param clusterList the {@link ArrayList} of {@link RTOFCluster} + * containing the clusters info to be added to the bank + * @param rtofHits the {@link ArrayList} of {@link RTOFHit} containing the bar + * hits info to be added + * + * @return 0 if it worked, 1 if it failed + * + */ + public int appendRTOFBanks(DataEvent event, ArrayList rtofHits, ArrayList clusterList) { + + DataBank hitbank = this.fillRTOFRawHitBank(event, rtofHits); + if (hitbank != null) { + event.appendBank(hitbank); + } else { + return 1; + } + + DataBank clusterbank = fillRTOFClusterBank(event, clusterList); + if (clusterbank != null) { + event.appendBank(clusterbank); + } else { + return 1; + } + + return 0; + } +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCluster.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKCluster.java similarity index 72% rename from reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCluster.java rename to reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKCluster.java index 66a6a5d914..c8c2ac152f 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCluster.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKCluster.java @@ -1,7 +1,8 @@ -package org.jlab.service.recoil; +package org.jlab.service.recoil.trk; import java.util.ArrayList; import java.util.List; +import org.jlab.detector.geant4.v2.recoil.trk.RTRKConstants; import org.jlab.detector.base.DetectorDescriptor; import org.jlab.detector.base.DetectorType; import org.jlab.geom.prim.Line3D; @@ -9,21 +10,21 @@ /** * recoil in-layer cluster - * + * * @author bondi, devita, niccolai */ -public class RecoilCluster extends ArrayList { - +public class RTRKCluster extends ArrayList { - private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.RECOIL); - private int id; + + private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.RTRK); + private int id; private Line3D clusterLine = new Line3D(); public int indexMaxStrip = -1; private byte clusterStatus = 1; - public RecoilCluster(RecoilStrip strip){ - this.desc.setSectorLayerComponent(strip.getDescriptor().getSector(), - strip.getDescriptor().getLayer(), 0); + public RTRKCluster(RTRKStrip strip){ + this.desc.setSectorLayerComponent(strip.getDescriptor().getSector(), + strip.getDescriptor().getLayer(), 0); this.add(strip); this.clusterLine.copy(strip.getLine()); this.indexMaxStrip = 0; @@ -49,11 +50,11 @@ public int getChamber() { return this.get(0).getChamber(); } - public Line3D getLine() {return this.clusterLine;} + public Line3D getLine() {return this.clusterLine;} public double getEnergy(){ double energy = 0.0; - for(RecoilStrip strip : this){ + for(RTRKStrip strip : this){ energy += strip.getEnergy(); } return energy; @@ -61,7 +62,7 @@ public double getEnergy(){ public double getTime(){ double time = 0.0; - for(RecoilStrip strip : this){ + for(RTRKStrip strip : this){ time += strip.getTime()*strip.getEnergy(); } time /= this.getEnergy(); @@ -72,19 +73,19 @@ public double getSeedTime(){ if(this.indexMaxStrip >= 0 && this.indexMaxStrip < this.size()){ return this.get(indexMaxStrip).getTime(); } - return 0.0; + return 0.0; } - - public RecoilStrip getSeedStrip() { - return this.get(this.indexMaxStrip); + + public RTRKStrip getSeedStrip() { + return this.get(this.indexMaxStrip); } public int getMaxStrip(){ return this.get(this.indexMaxStrip).getDescriptor().getComponent(); } - public boolean addStrip(RecoilStrip strip){ - for(RecoilStrip s : this){ + public boolean addStrip(RTRKStrip strip){ + for(RTRKStrip s : this){ if(s.isNeighbour(strip)){ this.add(strip); if(strip.getEnergy()>this.get(indexMaxStrip).getEnergy()){ @@ -99,7 +100,7 @@ public boolean addStrip(RecoilStrip strip){ public int getADC(){ int adc = 0; - for(RecoilStrip s : this){ + for(RTRKStrip s : this){ adc+= s.getADC(); } return adc; @@ -107,15 +108,15 @@ public int getADC(){ public void setStatus(int val) {this.clusterStatus+=val;} - public byte getStatus() {return clusterStatus;} + public byte getStatus() {return clusterStatus;} public void setClusterId(int id){ this.id = id; - for(RecoilStrip strip : this){ + for(RTRKStrip strip : this){ strip.setClusterId(id); } } - + public void redoClusterLine(){ Point3D pointOrigin = new Point3D(0.0,0.0,0.0); @@ -138,37 +139,36 @@ public void redoClusterLine(){ pointEnd.setX(pointEnd.x()+line.end().x()*le); pointEnd.setY(pointEnd.y()+line.end().y()*le); pointEnd.setZ(pointEnd.z()+line.end().z()*le); - + logSumm += le; summE += energy; } - + this.clusterLine.set( - pointOrigin.x()/logSumm, - pointOrigin.y()/logSumm, - pointOrigin.z()/logSumm, - pointEnd.x()/logSumm, - pointEnd.y()/logSumm, - pointEnd.z()/logSumm + pointOrigin.x()/logSumm, + pointOrigin.y()/logSumm, + pointOrigin.z()/logSumm, + pointEnd.x()/logSumm, + pointEnd.y()/logSumm, + pointEnd.z()/logSumm ); } - - public static List createClusters(List stripList){ - - List clusterList = new ArrayList<>(); + public static List createClusters(List stripList){ + + List clusterList = new ArrayList<>(); if(!stripList.isEmpty()){ - for(int loop = 0; loop < stripList.size(); loop++){ //Loop over all strips - boolean stripAdded = false; - for(RecoilCluster cluster : clusterList) { + for(int loop = 0; loop < stripList.size(); loop++){ //Loop over all strips + boolean stripAdded = false; + for(RTRKCluster cluster : clusterList) { if(cluster.addStrip(stripList.get(loop))){ //Add adjacent strip to newly seeded peak stripAdded = true; } } if(!stripAdded){ - RecoilCluster newPeak = new RecoilCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak + RTRKCluster newPeak = new RTRKCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak clusterList.add(newPeak); } } @@ -178,11 +178,11 @@ public static List createClusters(List stripList){ clusterList.get(loop).redoClusterLine(); } return clusterList; - } + } - public static List getClusters(List clusters, int sector, int layer) { - List selectedClusters = new ArrayList<>(); - for(RecoilCluster cluster : clusters) { + public static List getClusters(List clusters, int sector, int layer) { + List selectedClusters = new ArrayList<>(); + for(RTRKCluster cluster : clusters) { if(cluster.getSector()==sector && cluster.getLayer()==layer) selectedClusters.add(cluster); } @@ -192,11 +192,11 @@ public static List getClusters(List clusters, int @Override public String toString(){ StringBuilder str = new StringBuilder(); - str.append(String.format("----> cluster ( %3d %3d ) ENERGY = %12.5f\n", - this.desc.getSector(),this.desc.getLayer(), this.getEnergy())); + str.append(String.format("----> cluster ( %3d %3d ) ENERGY = %12.5f\n", + this.desc.getSector(),this.desc.getLayer(), this.getEnergy())); str.append(this.clusterLine.toString()); str.append("\n"); - for(RecoilStrip strip : this){ + for(RTRKStrip strip : this){ str.append("\t\t"); str.append(strip.toString()); str.append("\n"); @@ -204,9 +204,5 @@ public String toString(){ return str.toString(); } - - - - } diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKCross.java similarity index 68% rename from reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java rename to reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKCross.java index a2a2ba85e5..4ff69ec157 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKCross.java @@ -1,7 +1,8 @@ -package org.jlab.service.recoil; +package org.jlab.service.recoil.trk; import java.util.ArrayList; import java.util.List; +import org.jlab.detector.geant4.v2.recoil.trk.RTRKConstants; import org.jlab.geom.prim.Plane3D; import org.jlab.geom.prim.Point3D; import org.jlab.geom.prim.Vector3D; @@ -10,8 +11,8 @@ * recoil V-W clusters * @author devita, niccolai */ -public class RecoilCross { - +public class RTRKCross { + private int id; private int sector; @@ -26,17 +27,15 @@ public class RecoilCross { private double time; private int status; - - - public RecoilCross(RecoilCluster c1, RecoilCluster c2) { + public RTRKCross(RTRKCluster c1, RTRKCluster c2) { - Vector3D dir = c1.getLine().direction().cross(c2.getLine().direction()); + Vector3D dir = c1.getLine().direction().cross(c2.getLine().direction()); Plane3D plane = new Plane3D(c1.getLine().origin(), c1.getLine().direction().cross(dir)); Point3D point = new Point3D(); int nint = plane.intersectionSegment(c2.getLine(), point); if(nint==1) { this.sector = c1.getSector(); - this.region = (c1.getLayer()-1)/(RecoilConstants.NLAYER/RecoilConstants.NREGION)+1; + this.region = (c1.getLayer()-1)/(RTRKConstants.NLAYERS/RTRKConstants.NREGIONS)+1; this.cross = point; this.energy = c1.getEnergy() + c2.getEnergy(); this.time = (c1.getTime() + c2.getTime())/2; @@ -44,11 +43,11 @@ public RecoilCross(RecoilCluster c1, RecoilCluster c2) { this.cluster2 = c2.getId(); } } - + public void setId(int id) { this.id = id; } - + public int getId() { return id; } @@ -68,19 +67,19 @@ public int getChamber() { public int getCluster1() { return cluster1; } - + public int getCluster2() { return cluster2; } - + public Point3D point() { return cross; - } - + } + public double getEnergy() { return energy; } - + public double getTime() { return time; } @@ -88,21 +87,21 @@ public double getTime() { public int getStatus() { return status; } - - public static List createCrosses(List clusters) { + + public static List createCrosses(List clusters) { - List crosses = new ArrayList<>(); + List crosses = new ArrayList<>(); - for(int is=0; is clustersV = RecoilCluster.getClusters(clusters, is+1, (RecoilConstants.NLAYER/RecoilConstants.NREGION)*ir+1); - List clustersW = RecoilCluster.getClusters(clusters, is+1, (RecoilConstants.NLAYER/RecoilConstants.NREGION)*ir+2); + for(int is=0; is clustersV = RTRKCluster.getClusters(clusters, is+1, (RTRKConstants.NLAYERS/RTRKConstants.NREGIONS)*ir+1); + List clustersW = RTRKCluster.getClusters(clusters, is+1, (RTRKConstants.NLAYERS/RTRKConstants.NREGIONS)*ir+2); - for(RecoilCluster v : clustersV) { - for(RecoilCluster w : clustersW) { + for(RTRKCluster v : clustersV) { + for(RTRKCluster w : clustersW) { if(v.getChamber()==w.getChamber()) { - RecoilCross cross = new RecoilCross(v, w); + RTRKCross cross = new RTRKCross(v, w); if(cross.point()!=null) crosses.add(cross); cross.setId(crosses.size()); } diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKEngine.java similarity index 76% rename from reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java rename to reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKEngine.java index bbb1bc8bfc..e8263b3533 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/trk/RTRKEngine.java @@ -1,4 +1,4 @@ -package org.jlab.service.recoil; +package org.jlab.service.recoil.trk; import java.util.List; import java.util.Optional; @@ -8,7 +8,8 @@ import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.detector.base.DetectorType; import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.detector.geant4.v2.recoil.RecoilStripFactory; +import org.jlab.detector.geant4.v2.recoil.trk.RTRKConstants; +import org.jlab.detector.geant4.v2.recoil.trk.RTRKStripFactory; import org.jlab.geom.prim.Point3D; import org.jlab.groot.data.H1F; import org.jlab.groot.fitter.DataFitter; @@ -22,69 +23,65 @@ /** * * recoil reconstruction engine - * + * * @author bondi, devita, niccolai */ -public class RecoilEngine extends ReconstructionEngine { - - public static Logger LOGGER = Logger.getLogger(RecoilEngine.class.getName()); - - public static RecoilStripFactory factory = new RecoilStripFactory(); - - public RecoilEngine() { - super("Recoil","niccolai","1.0"); +public class RTRKEngine extends ReconstructionEngine { + + public static Logger LOGGER = Logger.getLogger(RTRKEngine.class.getName()); + + public static RTRKStripFactory factory = new RTRKStripFactory(); + + public RTRKEngine() { + super("RTRK","niccolai","1.0"); } - + @Override public boolean init() { - + // init ConstantsManager to read constants from CCDB String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); DatabaseConstantProvider cp = new DatabaseConstantProvider(11, variationName); - factory.init(cp, RecoilConstants.NREGION); - // register output banks for drop option - this.registerOutputBank("RECOIL::hits"); - this.registerOutputBank("RECOIL::clusters"); - this.registerOutputBank("RECOIL::crosses"); - + factory.init(cp, RTRKConstants.NREGIONS); + // register output banks for drop option + this.registerOutputBank("RTRK::hits"); + this.registerOutputBank("RTRK::clusters"); + this.registerOutputBank("RTRK::crosses"); + LOGGER.log(Level.INFO, "--> recoil is ready..."); return true; } - - - - + @Override public boolean processDataEventUser(DataEvent event) { - List strips = RecoilStrip.getStrips(event, factory, this.getConstantsManager()); - List clusters = RecoilCluster.createClusters(strips); - List crosses = RecoilCross.createCrosses(clusters); + List strips = RTRKStrip.getStrips(event, factory, this.getConstantsManager()); + List clusters = RTRKCluster.createClusters(strips); + List crosses = RTRKCross.createCrosses(clusters); this.writeHipoBanks(event, strips, clusters, crosses); return true; } - - private void writeHipoBanks(DataEvent de, - List strips, - List clusters, - List crosses){ - - DataBank bankS = de.createBank("RECOIL::hits", strips.size()); + private void writeHipoBanks(DataEvent de, + List strips, + List clusters, + List crosses){ + + DataBank bankS = de.createBank("RTRK::hits", strips.size()); for(int h = 0; h < strips.size(); h++){ bankS.setShort("id", h, (short) strips.get(h).getId()); bankS.setByte("sector", h, (byte) strips.get(h).getDescriptor().getSector()); bankS.setByte("layer", h, (byte) strips.get(h).getDescriptor().getLayer()); bankS.setShort("strip", h, (short) strips.get(h).getDescriptor().getComponent()); bankS.setFloat("energy", h, (float) strips.get(h).getEnergy()); - bankS.setFloat("time", h, (float) strips.get(h).getTime()); + bankS.setFloat("time", h, (float) strips.get(h).getTime()); bankS.setShort("status", h, (short) strips.get(h).getStatus()); bankS.setShort("clusterId", h, (short) strips.get(h).getClusterId()); } - DataBank bankC = de.createBank("RECOIL::clusters", clusters.size()); + DataBank bankC = de.createBank("RTRK::clusters", clusters.size()); for(int c = 0; c < clusters.size(); c++){ bankC.setShort("id", c, (short) clusters.get(c).getId()); bankC.setByte("sector", c, (byte) clusters.get(c).get(0).getDescriptor().getSector()); @@ -99,10 +96,10 @@ private void writeHipoBanks(DataEvent de, bankC.setFloat("ye", c, (float) clusters.get(c).getLine().end().y()); bankC.setFloat("ze", c, (float) clusters.get(c).getLine().end().z()); bankC.setShort("size", c, (short) clusters.get(c).size()); - bankC.setShort("status", c, (short) clusters.get(c).getStatus()); - } + bankC.setShort("status", c, (short) clusters.get(c).getStatus()); + } - DataBank bankX = de.createBank("RECOIL::crosses", crosses.size()); + DataBank bankX = de.createBank("RTRK::crosses", crosses.size()); for(int c = 0; c < crosses.size(); c++){ bankX.setShort("id", c, (short) crosses.get(c).getId()); bankX.setByte("sector", c, (byte) crosses.get(c).getSector()); @@ -112,13 +109,12 @@ private void writeHipoBanks(DataEvent de, bankX.setFloat("x", c, (float) crosses.get(c).point().x()); bankX.setFloat("y", c, (float) crosses.get(c).point().y()); bankX.setFloat("z", c, (float) crosses.get(c).point().z()); - bankX.setShort("cluster1", c, (short) crosses.get(c).getCluster1()); - bankX.setShort("cluster2", c, (short) crosses.get(c).getCluster2()); - bankX.setShort("status", c, (short) crosses.get(c).getStatus()); - } + bankX.setShort("cluster1", c, (short) crosses.get(c).getCluster1()); + bankX.setShort("cluster2", c, (short) crosses.get(c).getCluster2()); + bankX.setShort("status", c, (short) crosses.get(c).getStatus()); + } de.appendBanks(bankS,bankC,bankX); } - public static void fitGauss(H1F histo) { double mean = histo.getMean(); @@ -135,7 +131,7 @@ public static void fitGauss(H1F histo) { f1.setParameter(0, amp); f1.setParameter(1, mean); f1.setParameter(2, sigma); - + if(amp>5) { f1.setParLimits(0, amp*0.2, amp*1.2); f1.setParLimits(1, mean*0.5, mean*1.5); @@ -149,36 +145,36 @@ public static void fitGauss(H1F histo) { f1.setRange(mean-2.0*sigma,mean+2.0*sigma); DataFitter.fit(f1, histo, "Q"); } - } + } public static void main (String arg[]) { - - RecoilEngine engine = new RecoilEngine(); + + RTRKEngine engine = new RTRKEngine(); engine.init(); - + String input = "/Users/devita/urwell3d.hipo"; - + DataGroup dg = new DataGroup(3, 2); String[] axes = {"x", "y"}; - for(int il=0; il this.desc.getSector()) return -1; if(ob.getDescriptor().getLayer() < this.desc.getLayer()) return 1; @@ -161,46 +160,46 @@ public int compareTo(Object o) { return -1; } - public static List getStrips(DataEvent event, RecoilStripFactory factory, ConstantsManager ccdb) { + public static List getStrips(DataEvent event, RTRKStripFactory factory, ConstantsManager ccdb) { - List strips = new ArrayList<>(); + List strips = new ArrayList<>(); - if(event.hasBank("RECOIL::adc")){ - RawDataBank bank = new RawDataBank("RECOIL::adc"); + if(event.hasBank("RTRK::adc")){ + RawDataBank bank = new RawDataBank("RTRK::adc"); bank.read(event); - //DataBank bank = event.getBank("RECOIL::adc"); + //DataBank bank = event.getBank("RTRK::adc"); for(int i = 0; i < bank.rows(); i++){ int sector = bank.getByte("sector", i); int layer = bank.getByte("layer", i); int comp = bank.getShort("component", i); int adc = bank.getInt("ADC", i); double time = bank.getFloat("time", i); - - RecoilStrip strip = new RecoilStrip(sector, layer, comp); -// strip.setTriggerPhase(triggerPhase); - strip.setId(bank.trueIndex(i)+1); - strip.setADC(adc); - strip.setTDC((int) time); - strip.setEnergy(strip.ADC*RecoilConstants.ADCTOENERGY); - strip.setTime(strip.TDC*RecoilConstants.TDCTOTIME); - strip.setLine(factory.getStrip(sector, layer, comp)); - strip.setChamber(factory.getChamberIndex(comp)+1); - strip.setStatus(0); + RTRKStrip strip = new RTRKStrip(sector, layer, comp); - if(strip.getEnergy()>RecoilConstants.THRESHOLD) strips.add(strip); +// strip.setTriggerPhase(triggerPhase); +strip.setId(bank.trueIndex(i)+1); +strip.setADC(adc); +strip.setTDC((int) time); +strip.setEnergy(strip.ADC*RTRKParameters.ADCTOENERGY); +strip.setTime(strip.TDC*RTRKParameters.TDCTOTIME); +strip.setLine(factory.getStrip(sector, layer, comp)); +strip.setChamber(factory.getChamberIndex(comp)+1); +strip.setStatus(0); + +if(strip.getEnergy()>RTRKParameters.THRESHOLD) strips.add(strip); } - } + } return strips; } @Override public String toString(){ StringBuilder str = new StringBuilder(); - str.append(String.format("----> strip (%3d %3d %3d) ADC/TDC %5d %5d ENERGY = %8.5f TIME = %8.5f ", - this.desc.getSector(),this.desc.getLayer(),this.desc.getComponent(), - this.ADC,this.TDC,this.getEnergy(),this.getTime())); + str.append(String.format("----> strip (%3d %3d %3d) ADC/TDC %5d %5d ENERGY = %8.5f TIME = %8.5f ", + this.desc.getSector(),this.desc.getLayer(),this.desc.getComponent(), + this.ADC,this.TDC,this.getEnergy(),this.getTime())); return str.toString(); } } From 1d85c44c6e49bf5cec88c11002bd4e2c41d9f395 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 17 Jun 2026 19:59:51 -0400 Subject: [PATCH 188/190] cleanup fastmc (#1299) --- .../src/main/java/org/jlab/clas/fastmc/Clas12FastMC.java | 5 ----- .../org/jlab/clas/fastmc/ParticleResolutionCentralOut.java | 5 ----- .../main/java/org/jlab/clas/fastmc/ParticleSwimmer.java | 7 ------- 3 files changed, 17 deletions(-) diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/Clas12FastMC.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/Clas12FastMC.java index 84dd1b2717..7396e099e1 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/Clas12FastMC.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/Clas12FastMC.java @@ -1,8 +1,3 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package org.jlab.clas.fastmc; import java.util.ArrayList; diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleResolutionCentralOut.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleResolutionCentralOut.java index 487787e48b..69e69c2f30 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleResolutionCentralOut.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleResolutionCentralOut.java @@ -1,8 +1,3 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package org.jlab.clas.fastmc; import java.util.HashMap; diff --git a/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleSwimmer.java b/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleSwimmer.java index 9cca51c49b..e2838baf26 100644 --- a/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleSwimmer.java +++ b/common-tools/clas-reco/src/main/java/org/jlab/clas/fastmc/ParticleSwimmer.java @@ -1,11 +1,5 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package org.jlab.clas.fastmc; -import cnuphys.magfield.CompositeField; import cnuphys.magfield.MagneticFieldInitializationException; import cnuphys.magfield.MagneticFields; import cnuphys.magfield.Solenoid; @@ -15,7 +9,6 @@ import cnuphys.swim.DefaultSwimStopper; import cnuphys.swim.SwimTrajectory; import cnuphys.swim.Swimmer; -import java.io.File; import java.io.FileNotFoundException; import java.util.logging.Level; import java.util.logging.Logger; From fb3393c86a34e735657f00cd2d18f74d34490dc5 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 17 Jun 2026 20:08:46 -0400 Subject: [PATCH 189/190] feat: remove ClasMath from clas-analysis (#1298) * remove unused ClasMath methods * switch to a "better" sector getter * remove ClasMath --- .../java/org/jlab/analysis/math/ClasMath.java | 68 ------------------- .../cvt/services/CVTReconstructionTest.java | 17 +++-- .../jlab/service/dc/DCReconstructionTest.java | 19 ++++-- .../jlab/service/eb/EBReconstructionTest.java | 11 ++- .../advanced-tests/src/eb/EBTwoTrackTest.java | 8 +-- 5 files changed, 35 insertions(+), 88 deletions(-) delete mode 100644 common-tools/clas-analysis/src/main/java/org/jlab/analysis/math/ClasMath.java diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/math/ClasMath.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/math/ClasMath.java deleted file mode 100644 index b4855e4f56..0000000000 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/math/ClasMath.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.jlab.analysis.math; - -/** - * - * @author naharrison - * - * all angles in radians - */ -public class ClasMath { - - public static double getRelativePhi(double phi) { - int sector = ClasMath.getSectorFromPhi(phi); - if(sector == 1) { - return ClasMath.getAnglePiConvention(phi); - } - else { - double newPhi = ClasMath.getAngle2PiConvention(phi); - return newPhi - ((double) sector - 1.0)*(2.0*Math.PI/6.0); - } - } - - - public static int getSectorFromPhi(double phi) { - double newPhi = ClasMath.getAngle2PiConvention(phi); - int sector = (int) Math.ceil((newPhi + (2.0*Math.PI/12.0))/Math.toRadians(60.0)); - if(sector == 7) sector = 1; - return sector; - } - - - /** 0 to 2pi convention */ - public static double getAngle2PiConvention(double angle) { - double newAngle = 0.0; - double twoPi = 2.0*Math.PI; - - if(angle >= 0.0 && angle < twoPi) newAngle = angle; - else if(angle >= twoPi) { - double nFullRotations = Math.floor(angle/twoPi); - newAngle = angle - twoPi*nFullRotations; - } - else if(angle < 0.0) { - double nFullRotations = Math.floor((-1.0*angle)/twoPi); - newAngle = (nFullRotations + 1.0)*twoPi + angle; - } - - return newAngle; - } - - - /** negative pi to pi convention */ - public static double getAnglePiConvention(double angle) { - double tempAngle = ClasMath.getAngle2PiConvention(angle); - double newAngle = 0.0; - - if(tempAngle <= Math.PI) newAngle = tempAngle; - else newAngle = tempAngle - 2.0*Math.PI; - - return newAngle; - } - - - public static boolean isWithinXPercent(double X, double val, double standard) { - if(standard >= 0 && val > (1.0 - (X/100.0))*standard && val < (1.0 + (X/100.0))*standard) return true; - else if(standard < 0 && val < (1.0 - (X/100.0))*standard && val > (1.0 + (X/100.0))*standard) return true; - return false; - } - -} diff --git a/reconstruction/cvt/src/test/java/org/jlab/rec/cvt/services/CVTReconstructionTest.java b/reconstruction/cvt/src/test/java/org/jlab/rec/cvt/services/CVTReconstructionTest.java index 8fea0c57de..8ffc78cbee 100644 --- a/reconstruction/cvt/src/test/java/org/jlab/rec/cvt/services/CVTReconstructionTest.java +++ b/reconstruction/cvt/src/test/java/org/jlab/rec/cvt/services/CVTReconstructionTest.java @@ -9,7 +9,6 @@ import org.jlab.service.eb.EBTBEngine; import org.jlab.analysis.physics.TestEvent; -import org.jlab.analysis.math.ClasMath; import org.jlab.clas.swimtools.MagFieldsEngine; import org.jlab.detector.base.DetectorType; import org.jlab.utils.CLASResources; @@ -19,7 +18,13 @@ * @author naharrison */ public class CVTReconstructionTest { - + + public static boolean isWithinXPercent(double X, double val, double standard) { + if(standard >= 0 && val > (1.0 - (X/100.0))*standard && val < (1.0 + (X/100.0))*standard) return true; + else if(standard < 0 && val < (1.0 - (X/100.0))*standard && val > (1.0 + (X/100.0))*standard) return true; + return false; + } + @Test public void testCVTReconstruction() { @@ -62,10 +67,10 @@ public void testCVTReconstruction() { assertEquals(testEvent.hasBank("REC::Particle"), true); assertEquals(testEvent.getBank("REC::Particle").rows(), 1); assertEquals(testEvent.getBank("REC::Particle").getByte("charge", 0), 1); - assertEquals(ClasMath.isWithinXPercent(10.0, testEvent.getBank("REC::Particle").getFloat("px", 0), 1.9504), true); - assertEquals(ClasMath.isWithinXPercent(10.0, testEvent.getBank("REC::Particle").getFloat("py", 0), 0.2741), true); - assertEquals(ClasMath.isWithinXPercent(10.0, testEvent.getBank("REC::Particle").getFloat("pz", 0), 0.3473), true); - assertEquals(ClasMath.isWithinXPercent(30.0, testEvent.getBank("REC::Particle").getFloat("vz", 0), -1.95444), true); + assertEquals(isWithinXPercent(10.0, testEvent.getBank("REC::Particle").getFloat("px", 0), 1.9504), true); + assertEquals(isWithinXPercent(10.0, testEvent.getBank("REC::Particle").getFloat("py", 0), 0.2741), true); + assertEquals(isWithinXPercent(10.0, testEvent.getBank("REC::Particle").getFloat("pz", 0), 0.3473), true); + assertEquals(isWithinXPercent(30.0, testEvent.getBank("REC::Particle").getFloat("vz", 0), -1.95444), true); } diff --git a/reconstruction/dc/src/test/java/org/jlab/service/dc/DCReconstructionTest.java b/reconstruction/dc/src/test/java/org/jlab/service/dc/DCReconstructionTest.java index 888d26197c..ea6ebd92c2 100644 --- a/reconstruction/dc/src/test/java/org/jlab/service/dc/DCReconstructionTest.java +++ b/reconstruction/dc/src/test/java/org/jlab/service/dc/DCReconstructionTest.java @@ -7,7 +7,6 @@ import org.jlab.io.base.DataEvent; import org.jlab.analysis.physics.TestEvent; -import org.jlab.analysis.math.ClasMath; import org.jlab.clas.swimtools.MagFieldsEngine; import org.jlab.detector.base.DetectorType; @@ -19,6 +18,12 @@ */ public class DCReconstructionTest { + static boolean isWithinXPercent(double X, double val, double standard) { + if(standard >= 0 && val > (1.0 - (X/100.0))*standard && val < (1.0 + (X/100.0))*standard) return true; + else if(standard < 0 && val < (1.0 - (X/100.0))*standard && val > (1.0 + (X/100.0))*standard) return true; + return false; + } + @Test public void testDCReconstruction() { @@ -52,10 +57,10 @@ public void testDCReconstruction() { assertEquals(testEvent.hasBank("HitBasedTrkg::HBTracks"), true); assertEquals(testEvent.getBank("HitBasedTrkg::HBTracks").rows(), 1); assertEquals(testEvent.getBank("HitBasedTrkg::HBTracks").getByte("q", 0), -1); - assertEquals(ClasMath.isWithinXPercent(16.0, testEvent.getBank("HitBasedTrkg::HBTracks").getFloat("p0_x", 0), 1.057), true); + assertEquals(isWithinXPercent(16.0, testEvent.getBank("HitBasedTrkg::HBTracks").getFloat("p0_x", 0), 1.057), true); assertEquals(testEvent.getBank("HitBasedTrkg::HBTracks").getFloat("p0_y", 0) > -0.1, true); assertEquals(testEvent.getBank("HitBasedTrkg::HBTracks").getFloat("p0_y", 0) < 0.1, true); - assertEquals(ClasMath.isWithinXPercent(16.0, testEvent.getBank("HitBasedTrkg::HBTracks").getFloat("p0_z", 0), 2.266), true); + assertEquals(isWithinXPercent(16.0, testEvent.getBank("HitBasedTrkg::HBTracks").getFloat("p0_z", 0), 2.266), true); //TB reconstruction DCTBEngine engineTB = new DCTBEngine(); @@ -69,10 +74,10 @@ public void testDCReconstruction() { assertEquals(testEvent.getBank("TimeBasedTrkg::TBTracks").rows(), 1); assertEquals(testEvent.getBank("TimeBasedTrkg::TBTracks").getByte("q", 0), -1); - assertEquals(ClasMath.isWithinXPercent(27.9, testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("p0_x", 0), 0.997), true); + assertEquals(isWithinXPercent(27.9, testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("p0_x", 0), 0.997), true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("p0_y", 0) > -0.0702, true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("p0_y", 0) < 0.0438, true); - assertEquals(ClasMath.isWithinXPercent(17.5, testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("p0_z", 0), 2.04), true); + assertEquals(isWithinXPercent(17.5, testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("p0_z", 0), 2.04), true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("Vtx0_x", 0) < 0.2, true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("Vtx0_x", 0) > -0.2, true); @@ -82,7 +87,7 @@ public void testDCReconstruction() { assertEquals(testEvent.getBank("TimeBasedTrkg::TBTracks").getFloat("Vtx0_z", 0) > -0.0753, true); //Region 1 - assertEquals(ClasMath.isWithinXPercent(155, testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("x", 0), 4.02), true); + assertEquals(isWithinXPercent(155, testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("x", 0), 4.02), true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("y", 0 ) < 9.25, true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("y", 0 ) > -11.78, true); @@ -93,7 +98,7 @@ public void testDCReconstruction() { assertEquals(testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("y", 1 ) > -17.8, true); //Region 3 - assertEquals(ClasMath.isWithinXPercent(127, testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("x", 2), -11.0), true); + assertEquals(isWithinXPercent(127, testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("x", 2), -11.0), true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("y", 2 ) < 17.96, true); assertEquals(testEvent.getBank("TimeBasedTrkg::TBCrosses").getFloat("y", 2 ) > -23.66, true); diff --git a/reconstruction/eb/src/test/java/org/jlab/service/eb/EBReconstructionTest.java b/reconstruction/eb/src/test/java/org/jlab/service/eb/EBReconstructionTest.java index 64f1dcd6cc..ac6f85615a 100644 --- a/reconstruction/eb/src/test/java/org/jlab/service/eb/EBReconstructionTest.java +++ b/reconstruction/eb/src/test/java/org/jlab/service/eb/EBReconstructionTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.*; import org.jlab.analysis.physics.TestEvent; -import org.jlab.analysis.math.ClasMath; import org.jlab.clas.swimtools.MagFieldsEngine; import cnuphys.magfield.MagneticFields; import org.jlab.detector.base.DetectorType; @@ -105,6 +104,12 @@ public boolean hasValidRefs(DataEvent ev, return true; } + static boolean isWithinXPercent(double X, double val, double standard) { + if(standard >= 0 && val > (1.0 - (X/100.0))*standard && val < (1.0 + (X/100.0))*standard) return true; + else if(standard < 0 && val < (1.0 - (X/100.0))*standard && val > (1.0 + (X/100.0))*standard) return true; + return false; + } + @Test public void testEBReconstruction() { System.setProperty("CLAS12DIR", "../../"); @@ -120,10 +125,10 @@ public void testEBReconstruction() { assertEquals(hasValidRefs(photonEvent,"REC::Calorimeter","REC::Particle","pindex"),true); // additional EC reco. tests: assertEquals(photonEvent.getBank("RECHB::Particle").rows(), 1); - assertEquals(ClasMath.isWithinXPercent(25.0, photonEvent.getBank("RECHB::Particle").getFloat("px", 0), 1.057), true); + assertEquals(isWithinXPercent(25.0, photonEvent.getBank("RECHB::Particle").getFloat("px", 0), 1.057), true); assertEquals(photonEvent.getBank("RECHB::Particle").getFloat("py", 0) > -0.15, true); assertEquals(photonEvent.getBank("RECHB::Particle").getFloat("py", 0) < 0.15, true); - assertEquals(ClasMath.isWithinXPercent(25.0, photonEvent.getBank("RECHB::Particle").getFloat("pz", 0), 2.266), true); + assertEquals(isWithinXPercent(25.0, photonEvent.getBank("RECHB::Particle").getFloat("pz", 0), 2.266), true); DataEvent electronEvent = TestEvent.get(DetectorType.DC); processAllEngines(electronEvent); diff --git a/validation/advanced-tests/src/eb/EBTwoTrackTest.java b/validation/advanced-tests/src/eb/EBTwoTrackTest.java index 996df8b43f..6db80ed2dd 100644 --- a/validation/advanced-tests/src/eb/EBTwoTrackTest.java +++ b/validation/advanced-tests/src/eb/EBTwoTrackTest.java @@ -13,7 +13,7 @@ import org.jlab.detector.base.DetectorType; import org.jlab.clas.pdg.PDGDatabase; -import org.jlab.analysis.math.ClasMath; +import org.jlab.clas.detector.DetectorResponse; /** * @@ -554,7 +554,7 @@ private void processEventFT(DataEvent event) { if (pid==hadronPDG) { final double px=recPartBank.getFloat("px",ii); final double py=recPartBank.getFloat("py",ii); - final int sector = ClasMath.getSectorFromPhi(Math.atan2(py,px)); + final int sector = DetectorResponse.getSector(Math.atan2(py,px)); nHadronsSector[sector-1]++; if (sector==hadronSector || (pid==11 && sector==electronSector)) { nFtFd++; @@ -601,7 +601,7 @@ else if (!isCentral && trkBank.getInt("sector",ii)==hadronSector) { for (int ii=0; ii0) { final double phi0 = ctrkBank.getFloat("phi0",ii); - final int sector = ClasMath.getSectorFromPhi(phi0); + final int sector = DetectorResponse.getSector(phi0); if (sector == hadronSector) nPosTracks++; } @@ -645,7 +645,7 @@ else if (!isCentral && trkBank.getInt("sector",ii)==hadronSector) { px = recSciBank.getFloat("x",recSciMap.get(ii).get(0)); py = recSciBank.getFloat("y",recSciMap.get(ii).get(0)); } - final int sector = ClasMath.getSectorFromPhi(Math.atan2(py,px)); + final int sector = DetectorResponse.getSector(Math.atan2(py,px)); if (pid==11 && sector==electronSector) { if (!foundElectron) nElectronsSector[sector-1]++; From c4ed90d02ce2040154ff59f749ff4158451020c7 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 18 Jun 2026 11:11:59 -0400 Subject: [PATCH 190/190] build: bump version number to 14.1.1 (#1322) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 20 ++++++------- common-tools/clas-decay-tools/pom.xml | 24 +++++++-------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 6 ++-- common-tools/clas-jcsg/pom.xml | 10 +++---- common-tools/clas-logging/pom.xml | 4 +-- common-tools/clas-math/pom.xml | 4 +-- common-tools/clas-physics/pom.xml | 4 +-- common-tools/clas-reco/pom.xml | 18 ++++++------ common-tools/clas-tracking/pom.xml | 12 ++++---- common-tools/clas-utils/pom.xml | 6 ++-- common-tools/cnuphys/magfield/pom.xml | 4 +-- common-tools/cnuphys/pom.xml | 4 +-- common-tools/cnuphys/snr/pom.xml | 4 +-- common-tools/cnuphys/splot/pom.xml | 4 +-- common-tools/cnuphys/swimmer/pom.xml | 8 ++--- common-tools/coat-libs/pom.xml | 34 +++++++++++----------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 22 +++++++------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 28 +++++++++--------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 32 ++++++++++---------- reconstruction/ec/pom.xml | 18 ++++++------ reconstruction/fmt/pom.xml | 18 ++++++------ reconstruction/ft/pom.xml | 16 +++++----- reconstruction/htcc/pom.xml | 12 ++++---- reconstruction/ltcc/pom.xml | 14 ++++----- reconstruction/mc/pom.xml | 12 ++++---- reconstruction/mltn/pom.xml | 8 ++--- reconstruction/mu/pom.xml | 20 ++++++------- reconstruction/pom.xml | 4 +-- reconstruction/raster/pom.xml | 12 ++++---- reconstruction/recoil/pom.xml | 14 ++++----- reconstruction/rich/pom.xml | 18 ++++++------ reconstruction/rtpc/pom.xml | 18 ++++++------ reconstruction/swaps/pom.xml | 10 +++---- reconstruction/tof/pom.xml | 18 ++++++------ reconstruction/uber/pom.xml | 42 +++++++++++++-------------- reconstruction/urwt/pom.xml | 14 ++++----- reconstruction/vtx/pom.xml | 14 ++++----- 49 files changed, 336 insertions(+), 336 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index 7136fcf222..2243088c19 100644 --- a/common-tools/clara-io/pom.xml +++ b/common-tools/clara-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clara-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index f3190aa11e..6d18992f2b 100644 --- a/common-tools/clas-analysis/pom.xml +++ b/common-tools/clas-analysis/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -38,49 +38,49 @@ org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 6c33a538c0..ad2d812a2d 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-decay-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,54 +21,54 @@ org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar cnuphys swimmer - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index 645cd24051..685329f5c1 100644 --- a/common-tools/clas-detector/pom.xml +++ b/common-tools/clas-detector/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-logging - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index 2bfeb75509..f3dbd5162f 100644 --- a/common-tools/clas-geometry/pom.xml +++ b/common-tools/clas-geometry/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index fc4e724199..3fb626ae20 100644 --- a/common-tools/clas-io/pom.xml +++ b/common-tools/clas-io/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -50,7 +50,7 @@ org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 05ac2e8a42..0ae5b89efe 100644 --- a/common-tools/clas-jcsg/pom.xml +++ b/common-tools/clas-jcsg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index 0919c02c40..4bdf9dc0d9 100644 --- a/common-tools/clas-logging/pom.xml +++ b/common-tools/clas-logging/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-logging - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 19eea1d82c..479a797ae2 100644 --- a/common-tools/clas-math/pom.xml +++ b/common-tools/clas-math/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-math - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index f10d001d54..e97b267c80 100644 --- a/common-tools/clas-physics/pom.xml +++ b/common-tools/clas-physics/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 0d096dd439..a68bc70739 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -50,43 +50,43 @@ cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys swimmer - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 6bcd371610..0e777d414a 100644 --- a/common-tools/clas-tracking/pom.xml +++ b/common-tools/clas-tracking/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-tracking - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 9996f605ed..99cd9efe59 100644 --- a/common-tools/clas-utils/pom.xml +++ b/common-tools/clas-utils/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 177425c177..5c58a4e7c8 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar cnuphys clas12 - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index 7588dd6b15..1532127320 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT pom org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index a9f89bb95d..248c22495f 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar cnuphys clas12 - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index e184a898c4..15b9a9cd21 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar cnuphys clas12 - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 67bc29acfa..cc5032197b 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar cnuphys clas12 - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys splot - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 639bcab4a8..874fb32a52 100644 --- a/common-tools/coat-libs/pom.xml +++ b/common-tools/coat-libs/pom.xml @@ -4,13 +4,13 @@ org.jlab.coat coat-libs - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -66,91 +66,91 @@ org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clara-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-logging - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-math - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-tracking - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-decay-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys snr - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index f66e67930c..ca2f2f2c42 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT pom org.jlab.clas coatjava - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index d2303819c2..b4f19c79a9 100644 --- a/common-tools/swim-tools/pom.xml +++ b/common-tools/swim-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas common-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys swimmer - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 5454d99e13..59a7aa4bbb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index caae55a959..ef243e4014 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index ab33d41515..0e34524527 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -30,54 +30,54 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test org.jlab.clas clas-tracking - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 47bb0d0bdd..cc06dc680b 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index 9fb4cc2875..360c136cdf 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 2cdf71d77f..2ba75c40bd 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 82d9aa8f8a..2831d0385d 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index c834ea6ee4..cef64f6532 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -26,63 +26,63 @@ cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test org.jlab.clas clas-tracking - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 7407eb9ce8..fac5fe04e5 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test org.jlab.clas clas-tracking - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ai - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test org.jlab.clas clas-math - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys snr - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 9c4a0e5086..92f865fa1f 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,74 +21,74 @@ cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index c5dc344cbe..daceece19d 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,38 +21,38 @@ org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-analysis - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT test org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 8b3834ab30..8dfec1400d 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 4c0637dc8d..261c3ed21c 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index 66bec2df71..881769e49f 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index ae6f0a6298..d07a735f2d 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -30,27 +30,27 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index 929c6ce06c..a3388ba108 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 9289f20df6..e6f238e656 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/mu/pom.xml b/reconstruction/mu/pom.xml index bad81724c0..3390637082 100644 --- a/reconstruction/mu/pom.xml +++ b/reconstruction/mu/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mu - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -25,42 +25,42 @@ org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index 8cf061fb7d..611e37a527 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT pom org.jlab.clas coatjava - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index a3007aad78..342f9dbfc5 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index 6e639a177b..1aa8401dbe 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index 27af9c1071..55705ac826 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 18a1976e1b..d67a95215a 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT cnuphys magfield - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-tracking - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT compile org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index bec94374f6..516913ef89 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index 7c9fe2a296..12bf5fc13c 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-physics - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-utils - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index c287321618..5dbd7d4f2f 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT diff --git a/reconstruction/urwt/pom.xml b/reconstruction/urwt/pom.xml index 356218f55c..9293c4773d 100644 --- a/reconstruction/urwt/pom.xml +++ b/reconstruction/urwt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwt - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-jcsg - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT clas12detector-urwt diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index c2cdb105f5..e4a2788c22 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas swim-tools - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT jar cnuphys swimmer - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-reco - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-io - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT org.jlab.clas clas-geometry - 14.1.0-SNAPSHOT + 14.1.1-SNAPSHOT