From 142515a960a6518ab2765b15a16d2c7d7a0c84a4 Mon Sep 17 00:00:00 2001 From: N-Plx <66355299+N-Plx@users.noreply.github.com> Date: Tue, 4 Nov 2025 09:47:13 -0600 Subject: [PATCH 01/17] feat: applying wedge to wedge phi alignment (#929) --- .../java/org/jlab/rec/atof/hit/ATOFHit.java | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 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 d168120ef7..44ba98feda 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,8 +4,6 @@ import org.jlab.geom.prim.Point3D; import org.jlab.rec.atof.constants.Parameters; import java.util.logging.Logger; -import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.geom.detector.alert.ATOF.AlertTOFFactory; import org.jlab.rec.constants.CalibrationConstantsLoader; /** @@ -21,14 +19,6 @@ public class ATOFHit { static final Logger LOGGER = Logger.getLogger(ATOFHit.class.getName()); - //For aligning bar together, take module 0, component 10 as the reference - //For now the table is full of things with order = 0 or order = 1 for the bars - //However these offsets are defined uniquely for order 0 and order 1 - //Eventually the table will need to be revisited, either by adding another table - //That does not index the order or by indexing things with order 2 (or another number) - private int referenceModuleKey = 0*10000 + 0*1000 + 10*10 + 0; - double[] timeOffsetsRef = CalibrationConstantsLoader.ATOF_TIME_OFFSETS.get(referenceModuleKey); - private int sector, layer, component, order; private int tdc, tot; private float startTime; @@ -198,19 +188,25 @@ public final int convertTdcToTime() { //Converting tdc to ns, event start time correction this.time = Parameters.TDC2TIME*this.tdc - this.startTime; - - //For now we use order 0 to read everything because the current calib constants - //are not for a specific bar channel - //Eventually this will need to be adjusted - int key = this.sector*10000 + this.layer*1000 + this.component*10 + 0;//this.order; + //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); + //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 alignment + //For now let's say t0 is used to store the bar-to-bar and wedge-to-wedge alignments double t0 = timeOffsets[0]; - double tB2B = (t0 - timeOffsetsRef[0])/2; + double tChannelToChannelPhiAlignment = (t0 - timeOffsetsRef[0]); + 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]; //The rest of the constants are not used for now @@ -243,19 +239,19 @@ 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 = 0; //To be replaced with w2w time and eventual other offsets + timeOffset = - tChannelToChannelPhiAlignment; } 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. - tB2B; + timeOffset = - tud/2. - tChannelToChannelPhiAlignment; } 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. - tB2B; + timeOffset = + tud/2. - tChannelToChannelPhiAlignment; } case "bar" -> { LOGGER.finest("Bar hit type, cannot convert tdc to time."); From b119a407582b0a204e1eee7d1f8e612810874103 Mon Sep 17 00:00:00 2001 From: raffaelladevita Date: Fri, 7 Nov 2025 14:37:55 -0500 Subject: [PATCH 02/17] mc for DC2 reconstruction (#906) * switched EB tests to new gemc files generated with t2d from rg variations, ficed issue with electrongammaFT test * updated DC unit test event, now can be ggemc output file --- .../org/jlab/analysis/physics/TestEvent.java | 31 +++++++++++++----- etc/data/test/dc.hipo | Bin 355936 -> 29456 bytes validation/advanced-tests/run-eb-tests.sh | 2 +- .../advanced-tests/src/eb/EBTwoTrackTest.java | 4 +-- .../advanced-tests/src/eb/scripts/gen.groovy | 2 +- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/physics/TestEvent.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/physics/TestEvent.java index de2a465184..88551876b5 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/physics/TestEvent.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/physics/TestEvent.java @@ -21,13 +21,20 @@ public static void main(String args[]) { } public static HipoDataEvent get(DetectorType t) { + SchemaFactory sf = new SchemaFactory(); + sf.initFromDirectory(CLASResources.getResourcePath("etc/bankdefs/hipo4")); + HipoReader reader = new HipoReader(); String dir = CLASResources.getResourcePath("etc/data/test"); String stub = t.getName().toLowerCase(); reader.open(String.format("%s/%s.hipo",dir,stub)); + Event e = new Event(); reader.getEvent(e, 0); - return new HipoDataEvent(e,reader.getSchemaFactory()); + if(t==DetectorType.DC) + return getDCSector1ElectronEvent(e); + else + return new HipoDataEvent(e,sf); } private static void write() { @@ -47,15 +54,21 @@ private static void write(String path, Event e) { } } - public static HipoDataEvent getDCSector1ElectronEvent(int event) { - HipoReader reader = new HipoReader(); - reader.open(CLASResources.getResourcePath("etc/data/test/dc.hipo")); - Event e = new Event(); - reader.getEvent(e, event); - return new HipoDataEvent(e,reader.getSchemaFactory()); + public static HipoDataEvent getDCSector1ElectronEvent(Event e) { + SchemaFactory sf = new SchemaFactory(); + sf.initFromDirectory(CLASResources.getResourcePath("etc/bankdefs/hipo4")); + + Bank mcPart = new Bank(sf.getSchema("MC::Particle")); + e.read(mcPart); + Bank recEvent = new Bank(sf.getSchema("RECHB::Event"), 1); + recEvent.putFloat("startTime", 0, mcPart.getByte("vt", 0)); + e.write(recEvent); + + return new HipoDataEvent(e,sf); } - - public static HipoDataEvent getDCSector1ElectronEvent(SchemaFactory schemaFactory) { + + @Deprecated + public static HipoDataEvent getDCSector1ElectronEvent(SchemaFactory schemaFactory) { Event testEvent = new Event(); // this event is based on a gemc event with diff --git a/etc/data/test/dc.hipo b/etc/data/test/dc.hipo index 97de698439c0cbad911643b285551ae700b8b8e2..0f15629fa16266ec46ea6b937d9ead1e62d929f6 100644 GIT binary patch literal 29456 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 literal 355936 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 diff --git a/validation/advanced-tests/run-eb-tests.sh b/validation/advanced-tests/run-eb-tests.sh index bbd5f7b921..748d7a5b97 100755 --- a/validation/advanced-tests/run-eb-tests.sh +++ b/validation/advanced-tests/run-eb-tests.sh @@ -1,7 +1,7 @@ #!/bin/bash webDir=http://clasweb.jlab.org/clas12offline/distribution/coatjava/validation_files/eb -webVersion=5.11-fid-tm-r11 +webVersion=5.11-fid-tm-dc2-r11 webDir=$webDir/$webVersion # coatjava must already be built at ../../coatjava/ diff --git a/validation/advanced-tests/src/eb/EBTwoTrackTest.java b/validation/advanced-tests/src/eb/EBTwoTrackTest.java index 41061a2568..a0e4b26f40 100644 --- a/validation/advanced-tests/src/eb/EBTwoTrackTest.java +++ b/validation/advanced-tests/src/eb/EBTwoTrackTest.java @@ -155,9 +155,7 @@ else if (ss.equals("electrondeuteronC")) { hadronPDG=45; } else if (ss.equals("electrongammaFT")) { - isForwardTagger=true; - ftPDG=22; - hadronPDG=11; + hadronPDG=22; } else udfFileType=true; diff --git a/validation/advanced-tests/src/eb/scripts/gen.groovy b/validation/advanced-tests/src/eb/scripts/gen.groovy index 4bf9b846db..c5ea774d58 100644 --- a/validation/advanced-tests/src/eb/scripts/gen.groovy +++ b/validation/advanced-tests/src/eb/scripts/gen.groovy @@ -111,7 +111,7 @@ if (isForwardTagger) { pgen2.setRange( 3.0, 8.0, 2.5, 4.5, - -10.0, 10.0); + 110.0, 130.0); } else if (pid==-22 || pid==-211 || pid==-2212 || pid==-321) { // electron in FT From 091ef7a5dea8e9e5dac714c0844d91b9c2a83d67 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Nov 2025 10:46:30 -0500 Subject: [PATCH 03/17] fix gitlab ci, max 2 GB archive (#937) --- .gitlab-ci.yml | 57 +++++++++++++++++++++++-------------------------- bin/run-clara | 4 +++- libexec/scaling | 4 +++- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d796ce2370..616a7d5b7f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,6 +14,13 @@ workflow: default: interruptible: true + before_script: + - 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 + - echo $PATH stages: - build @@ -43,15 +50,11 @@ depana: download: stage: build script: - - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/clas_005038.evio.00000 ./ - - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-l/clas_021559.evio.00001 ./ - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-d/clas_018779.evio.00001 ./ artifacts: when: always expire_in: 1 day paths: - - clas_005038.evio.00000 - - clas_021559.evio.00001 - clas_018779.evio.00001 spotbugs: @@ -59,19 +62,17 @@ spotbugs: needs: [build] dependencies: [build] script: - - > - tar -xzf coatjava.tar.gz && - ./build-coatjava.sh -T$JL_RUNNER_AVAIL_CPU --spotbugs --quiet --no-progress + - tar -xzf coatjava.tar.gz + - ./build-coatjava.sh -T$JL_RUNNER_AVAIL_CPU --spotbugs --quiet --no-progress unit_tests: stage: test needs: [build] dependencies: [build] script: - - > - tar -xzf coatjava.tar.gz && - ./build-coatjava.sh -T$JL_RUNNER_AVAIL_CPU --unittests --quiet --no-progress && - ./validation/jacoco-aggregate.sh + - tar -xzf coatjava.tar.gz + - ./build-coatjava.sh -T$JL_RUNNER_AVAIL_CPU --unittests --quiet --no-progress + - ./validation/jacoco-aggregate.sh artifacts: when: always expire_in: 1 day @@ -83,16 +84,15 @@ docs: needs: [build,unit_tests] dependencies: [build,unit_tests] script: - - > - tar -xzf coatjava.tar.gz && - python3 -m venv venv && - source venv/bin/activate && - python3 -m pip install -r docs/mkdocs/requirements.txt && - ./docs/mkdocs/generate.sh pages && - libexec/build-javadocs.sh && - ls -l && ls -l pages && ls -l publish && - mv target/reports/apidocs pages/javadoc && - cp -r publish pages/jacoco + - tar -xzf coatjava.tar.gz + - python3 -m venv venv + - source venv/bin/activate + - python3 -m pip install -r docs/mkdocs/requirements.txt + - ./docs/mkdocs/generate.sh pages + - libexec/build-javadocs.sh + - ls -l && ls -l pages && ls -l publish + - mv target/reports/apidocs pages/javadoc + - cp -r publish pages/jacoco artifacts: when: always expire_in: 7 days @@ -119,14 +119,11 @@ eb: clara: allow_failure: true stage: test - needs: [build] - dependencies: [build] + needs: [build,download] + dependencies: [build,download] script: - - > - tar -xzf clara.tar.gz && - ./clara/plugins/clas12/bin/run-clara -c ./clara - -t $JL_RUNNER_AVAIL_CPU -y ./etc/services/rgd-clarode.yml - -n 100 -o ./out clas_018779.evio.00001 + - tar -xzf clara.tar.gz && ls -l + - 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 profile: stage: test @@ -140,10 +137,10 @@ profile: deploy: stage: deploy script: - - echo DEPLOY!!! + - echo DEPLOY! release: stage: deploy script: - - echo RELEASE!!! + - echo RELEASE! diff --git a/bin/run-clara b/bin/run-clara index 152d218326..c85d672f0d 100755 --- a/bin/run-clara +++ b/bin/run-clara @@ -15,6 +15,7 @@ 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-h print this help and exit\n\n Merging outputs (-m) requires hipo-utils and yq (https://github.com/mikefarah/yq).' @@ -26,7 +27,7 @@ function error() { threads=2 prefix=rec_ CLARA_USER_DATA=. -while getopts y:o:p:c:t:n:lqmh opt +while getopts y:o:p:c:t:n:lqmvh opt do case $opt in y) yaml=$OPTARG ;; @@ -38,6 +39,7 @@ do l) large=1 ;; m) merge=1 ;; q) quiet=1 ;; + v) set -o xtrace ;; h) echo -e "\n$usage" && echo -e $info && exit 0 ;; esac done diff --git a/libexec/scaling b/libexec/scaling index 909b85631f..149f5d821b 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -26,7 +26,9 @@ def run(cmd): pass def benchmark(cfg, threads): - import collections + import sys,shutil,collections + if not shutil.which('run-clara'): + sys.exit('run-clara is not in $PATH') exiting,benchmarks = False,collections.OrderedDict() cmd = ['run-clara', '-c',cfg.c, From 76480cd3293cbd2191f7eaada05bce52c2e038de Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Nov 2025 11:50:29 -0500 Subject: [PATCH 04/17] create a tag1 schema (#938) --- 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 801902b9ca..9340d248f5 100755 --- a/etc/bankdefs/util/bankSplit.py +++ b/etc/bankdefs/util/bankSplit.py @@ -116,6 +116,7 @@ def create(dirname, banklist): mon.extend(rgl) dst.extend(rgl) +create("tag1/", set(tag1)) create("dst/", set(dst)) create("dsthb/", set(dsthb)) create("calib/", set(calib)) From dc0e7e0c8189051ceadfec6320b61f9dca8eb5da Mon Sep 17 00:00:00 2001 From: N-Plx <66355299+N-Plx@users.noreply.github.com> Date: Mon, 10 Nov 2025 18:34:23 -0600 Subject: [PATCH 05/17] feat: reading out ccdb values for atof bar hits effective velocity (#941) --- .../src/main/java/org/jlab/rec/atof/hit/BarHit.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 87b186eb50..ec96cbddc0 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,6 +1,7 @@ package org.jlab.rec.atof.hit; import org.jlab.rec.atof.constants.Parameters; +import org.jlab.rec.constants.CalibrationConstantsLoader; /** * @@ -14,6 +15,8 @@ public class BarHit extends ATOFHit { //A bar hit is the combination of a downstream and upstream hits private ATOFHit hitUp, hitDown; + //Effective velocity read from CCDB + double vEff; public ATOFHit getHitUp() { return hitUp; @@ -36,7 +39,7 @@ public void setHitDown(ATOFHit hit_down) { * */ public final void computeZ() { - this.setZ(Parameters.VEFF/2. * (hitUp.getTime() - hitDown.getTime())); + this.setZ(this.vEff/2. * (hitUp.getTime() - hitDown.getTime())); } /** @@ -56,7 +59,7 @@ public final void computeTime() { time_at_sipm = this.hitUp.getTime(); distance_to_sipm = Parameters.LENGTH_ATOF/2. + this.getZ(); } - this.setTime(time_at_sipm - distance_to_sipm/Parameters.VEFF); + this.setTime(time_at_sipm - distance_to_sipm/this.vEff); } /** @@ -88,6 +91,11 @@ 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.computeZ(); this.computeTime(); this.computeEnergy(); From 082c9776eec91c6799d6efc895050deef43d0e02 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 11 Nov 2025 10:28:13 -0500 Subject: [PATCH 06/17] Add asprof script and CI job (#939) * rename * profiling * add decoder+recon-util job * fix --- .gitlab-ci.yml | 32 +++++++++++++++++++++----------- libexec/profile | 46 ++++++++++++++++++++++++++++++++++++++++++++++ libexec/profile.sh | 16 ---------------- 3 files changed, 67 insertions(+), 27 deletions(-) create mode 100755 libexec/profile delete mode 100755 libexec/profile.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 616a7d5b7f..0c6f901f21 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -104,10 +104,9 @@ eb: needs: [build] dependencies: [build] script: - - > - tar -xzf coatjava.tar.gz && - cd validation/advanced-tests && - ./run-eb-tests.sh -100 ${ARG} + - tar -xzf coatjava.tar.gz + - cd validation/advanced-tests + - ./run-eb-tests.sh -100 ${ARG} parallel: matrix: - ARG: electronproton @@ -116,23 +115,34 @@ eb: - ARG: electronneutronC - ARG: electronFTpion +decoder: + stage: test + needs: [build,download] + dependencies: [build,download] + script: + - tar -xzf clara.tar.gz + - decoder -n 1000 -o clas_018779_00001.hipo clas_018779.evio.00001 + artifacts: + when: always + expire_in: 1 day + paths: + - clas_018779_00001.hipo + clara: - allow_failure: true stage: test needs: [build,download] dependencies: [build,download] script: - - tar -xzf clara.tar.gz && ls -l + - 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 profile: stage: test - needs: [build] - dependencies: [build] + needs: [build,decoder] + dependencies: [build,decoder] script: - - > - tar -xzf coatjava.tar.gz && - libexec/profile.sh + - tar -xzf coatjava.tar.gz + - libexec/profile -e cpu clas_018779_00001.hipo deploy: stage: deploy diff --git a/libexec/profile b/libexec/profile new file mode 100755 index 0000000000..a301fee52e --- /dev/null +++ b/libexec/profile @@ -0,0 +1,46 @@ +#!/bin/bash + +# configure: +event=cpu #nativemem +format=flat +nevents=1000 +seconds=12 +yaml=etc/services/data-ai-uber.yml +while getopts y:n:f:e:s: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 ;; + esac +done +shift $((OPTIND-1)) +data=$1 +stub=$(basename $data) + +which asprof >& /dev/null +[ "$?" -ne 0 ] && echo 'ERROR: asprof is not in $PATH.' && exit 9 + +recon-util -y $yaml -n $nevents -o pro_$stub.hipo -i $data >& pro_$stub.log & +pid_bash=$! + +echo PID1=$pid_bash +sleep 5 +pid_java=$(pgrep -P "$pid_bash") + +echo PID2=$pid_java + +ps waux && ps -p $pid + +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 + +cat pro_$stub.log + +asprof -e $event -d $seconds -o $format -f pro_${format}_${event}_$stub.html $pid_java + +kill -9 $pid_java + diff --git a/libexec/profile.sh b/libexec/profile.sh deleted file mode 100755 index 0b1538d7ba..0000000000 --- a/libexec/profile.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -echo PROFILE!!! - -#asprof -e cpu -d 120 \ -# -o tree -f results/$1_tree_cpu.html \ -# $(pidof java) - -#asprof -e nativemem -d 120 \ -# -o tree -f results/$1_tree_nativemem.html \ -# $(pidof java) - -#asprof -e nativemem -d 120 \ -# -f results/$1_mem.jfr \ -# $(pidof java) - From 87dc69f883f093084154ff27abc64cd587bed1aa Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Nov 2025 11:19:03 -0500 Subject: [PATCH 07/17] sync git repos, github->jlab, in ci (#943) --- .gitlab-ci.yml | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c6f901f21..d033548056 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == "merge_request_event" auto_cancel: on_new_commit: interruptible + - if: $CI_PIPELINE_SOURCE == "schedule" - if: $CI_COMMIT_BRANCH == "main" auto_cancel: on_new_commit: conservative @@ -20,15 +21,35 @@ default: - export PATH=$CLARA_HOME/plugins/clas12/bin:$PATH - export PATH=$CLARA_HOME/bin:$PATH - export PATH=$COATJAVA/bin:$PATH - - echo $PATH stages: + - mirror - build - test - deploy +mirror: + stage: mirror + rules: + - if: $CI_PIPELINE_SOURCE == "schedule" + script: + - git config --global --add safe.directory $CI_PROJECT_DIR + - git config --global user.email "ci-bot@code.jlab.org" + - git config --global user.name "GitLab CI" + - git checkout development + - git config pull.rebase true + - git remote get-url origin + - git remote set-url origin https://github.com/jeffersonlab/coatjava + - git pull + - git remote set-url origin https://gitlab-ci-token:${CI_JOB_TOKEN}@code.jlab.org/hallb/clas12/coatjava/coatjava.git +# - git remote set-url origin git@code.jlab.org:hallb/clas12/coatjava/coatjava + - git push + build: stage: build + needs: + - job: mirror + optional: true script: - ./build-coatjava.sh --clara -T$JL_RUNNER_AVAIL_CPU --quiet --no-progress - tar -czf coatjava.tar.gz coatjava From 4e8227ec619173736e388c0bb9b63bcd0a6104c0 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Nov 2025 13:35:14 -0500 Subject: [PATCH 08/17] Cleanup benchmark/progress utility (#942) * cleanup * add benchmark addition * cleanup * cleanup * use seconds --- .../org/jlab/utils/benchmark/Benchmark.java | 180 +++++++----------- .../jlab/utils/benchmark/BenchmarkTimer.java | 20 +- .../utils/benchmark/ProgressPrintout.java | 24 +-- 3 files changed, 82 insertions(+), 142 deletions(-) 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 dddbfaf69c..011a9d81d5 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 @@ -1,18 +1,11 @@ -/* - * 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.utils.benchmark; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.Collection; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Timer; import java.util.TimerTask; -import java.util.TreeMap; /** * @@ -20,136 +13,99 @@ */ public class Benchmark { - private static Benchmark benchmarkInstance = new Benchmark(); - - private final Map timerStore = new HashMap(); + private static final Benchmark benchmarkInstance = new Benchmark(); + private final Map timerStore = new LinkedHashMap<>(); private Timer updateTimer = null; + + public Benchmark(){} - - public Benchmark(){ - + public static Benchmark getInstance(){ + return benchmarkInstance; } - public void printTimer(int interval){ - TimerTask timerTask = new TimerTask() - { - public void run() - { - //what to do at each excecution - System.out.println(benchmarkStringValue()); - } - }; + public void printTimer(int seconds){ + TimerTask timerTask = new TimerTask() { + @Override + public void run() { System.out.println(getInstance()); } + }; updateTimer = new Timer("Benchmark"); - updateTimer.scheduleAtFixedRate(timerTask, 0, interval); + updateTimer.scheduleAtFixedRate(timerTask, 0, 1000*seconds); } - public void reset(){ - for(Map.Entry entry : this.timerStore.entrySet()){ - entry.getValue().reset(); - } - } - - public static Benchmark getInstance(){ - return benchmarkInstance; + for (BenchmarkTimer bt : timerStore.values()) + bt.reset(); } public void addTimer(String name){ - if(timerStore.containsKey(name)==true){ - System.err.println("[Benchmark] -----> error. timer with name (" - + name + ") already exists"); - } else { - BenchmarkTimer timer = new BenchmarkTimer(name); - timerStore.put(timer.getName(), timer); - } + if (!timerStore.containsKey(name)) + timerStore.put(name, new BenchmarkTimer(name)); + else + System.err.println("[Benchmark] -----> error. timer with name ("+ name + ") already exists"); } public void pause(String name){ - if(timerStore.containsKey(name)==false){ - addTimer(name); - } else { + if (!timerStore.containsKey(name)) + timerStore.put(name, new BenchmarkTimer(name)); + else timerStore.get(name).pause(); - } } public void resume(String name){ - if(timerStore.containsKey(name)==false){ - //System.err.println("[Benchmark] -----> error. no timer defined with name (" - //+ name + ")"); - addTimer(name); - timerStore.get(name).resume(); - } else { - timerStore.get(name).resume(); - } + if (!timerStore.containsKey(name)) + timerStore.put(name, new BenchmarkTimer(name)); + timerStore.get(name).resume(); } - public BenchmarkTimer getTimer(String name){ - if(timerStore.containsKey(name)==true){ - return timerStore.get(name); - } - return null; + public BenchmarkTimer getTimer(String name){ + return timerStore.getOrDefault(name, null); } - - - public String benchmarkStringValue(){ - StringBuilder str = new StringBuilder(); - ArrayList timerStrings = new ArrayList(); - for(Map.Entry timer : timerStore.entrySet()){ - timerStrings.add(timer.getValue().toString()); - //str.append(timer.getValue().toString()); - //str.append("\n"); - } - - if(timerStrings.size()>0){ - int len = timerStrings.get(0).length(); - char[] asterix = new char[len+8]; - Arrays.fill(asterix,'*'); - String margins = new String(asterix); - str.append(margins); - str.append("\n"); - str.append("* BENCHMARK RESULTS \n"); - str.append(margins); - str.append("\n"); - for(String lines : timerStrings){ - str.append("* "); - str.append(lines); - str.append(" *\n"); - } - str.append(margins); - str.append("\n"); - } - - return str.toString(); + + public BenchmarkTimer getTotal(String name) { + BenchmarkTimer total = new BenchmarkTimer(name); + for (BenchmarkTimer b : timerStore.values()) + total.add(b); + return total; } + @Override public String toString(){ - StringBuilder str = new StringBuilder(); - ArrayList timerStrings = new ArrayList(); - for(Map.Entry timer : timerStore.entrySet()){ - timerStrings.add(timer.getValue().toString()); - //str.append(timer.getValue().toString()); - //str.append("\n"); - } - - if(timerStrings.size()>0){ - int len = timerStrings.get(0).length(); - char[] asterix = new char[len+8]; + StringBuilder s = new StringBuilder(); + Collection timers = timerStore.values(); + if (!timers.isEmpty()) { + int len = timers.iterator().next().toString().length(); + char[] asterix = new char[len+8]; Arrays.fill(asterix,'*'); String margins = new String(asterix); - str.append(margins); - str.append("\n"); - str.append("* BENCHMARK RESULTS \n"); - str.append(margins); - str.append("\n"); - for(String lines : timerStrings){ - str.append("* "); - str.append(lines); - str.append(" *\n"); + s.append(margins); + s.append("\n"); + s.append("* BENCHMARK RESULTS \n"); + s.append(margins); + s.append("\n"); + for (BenchmarkTimer b : timers) { + s.append("* "); + s.append(b); + s.append(" *\n"); } - str.append(margins); - str.append("\n"); + s.append("* "); + s.append(getTotal("")); + s.append(" *\n"); + s.append(margins); + s.append("\n"); + } + return s.toString(); + } + + public static void main(String[] args){ + Benchmark b = getInstance(); + b.printTimer(10); + int loop = 0; + while(true){ + b.resume("COUNT"); + loop++; + b.pause("COUNT"); + try { Thread.sleep(2000); } + catch (InterruptedException ex) {} } - - return str.toString(); } } 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 74c712d008..0f824ea6ba 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 @@ -1,9 +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.utils.benchmark; /** @@ -13,16 +7,12 @@ public class BenchmarkTimer { private String timerName = "generic"; - - private long lastStartTime = 0; private long totalTime = 0; private long timeAtResume = 0; private int numberOfCalls = 0; private Boolean isPaused = true; - public BenchmarkTimer(){ - - } + public BenchmarkTimer(){} public BenchmarkTimer(String name){ timerName = name; @@ -47,9 +37,13 @@ public void pause(){ isPaused = true; } } - + + public void add(BenchmarkTimer b) { + totalTime += b.totalTime; + numberOfCalls += b.numberOfCalls; + } + public void reset(){ - lastStartTime = 0; totalTime = 0; timeAtResume = 0; numberOfCalls = 0; diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/ProgressPrintout.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/ProgressPrintout.java index 0ceef4269c..2737572550 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/ProgressPrintout.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/benchmark/ProgressPrintout.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.utils.benchmark; -import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.logging.Level; @@ -17,12 +11,9 @@ */ public class ProgressPrintout { - private TreeMap items = new TreeMap(); - private TreeMap itemMax = new TreeMap(); - - private Long previousPrintoutTime = (long) 0; - private Long startPrintoutTime = (long) 0; - + private TreeMap items = new TreeMap<>(); + private Long previousPrintoutTime = (long) 0; + private Long startPrintoutTime = (long) 0; private double printoutIntervalSeconds = 10.0; private String printoutLeadingString = ">>>>> progress : "; private Integer numberOfCalls = 0; @@ -83,12 +74,12 @@ public void setAsDouble(String name, Double value){ public String getItemString(String itemname){ StringBuilder str = new StringBuilder(); - if(this.items.get(itemname) instanceof Integer){ - str.append(String.format(" %s : %5d",itemname,(Integer)this.items.get(itemname))); + if(this.items.get(itemname) instanceof Integer integer){ + str.append(String.format(" %s : %5d",itemname, integer)); } - if(this.items.get(itemname) instanceof Double){ - str.append(String.format(" %s : %8.3f",itemname,(Double)this.items.get(itemname))); + if(this.items.get(itemname) instanceof Double aDouble){ + str.append(String.format(" %s : %8.3f",itemname, aDouble)); } return str.toString(); } @@ -103,7 +94,6 @@ public static void main(String[] args){ } catch (InterruptedException ex) { Logger.getLogger(ProgressPrintout.class.getName()).log(Level.SEVERE, null, ex); } - //System.out.println("cycle " + loop); progress.updateStatus(); } } From 2b202bc82fa4e245130cd20986e4a1411e1e92ef Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 12 Nov 2025 19:59:27 -0500 Subject: [PATCH 09/17] Add script for scaling testing (#945) * make names better for plotting * add plotter * limit fit range, add another total metric * cleanup * more flexible thread configuration * use real filenamt * columning * better service choices * fix header name * remove duplicate * plot it too * add test data * cleanup * Delete libexec/scaling.txt --- libexec/scaling | 120 ++++++++++++++++++++++++++++++++++---------- libexec/scaling.gpl | 51 +++++++++++++++++++ 2 files changed, 145 insertions(+), 26 deletions(-) create mode 100644 libexec/scaling.gpl diff --git a/libexec/scaling b/libexec/scaling index 149f5d821b..0de022937d 100755 --- a/libexec/scaling +++ b/libexec/scaling @@ -1,21 +1,27 @@ #!/usr/bin/env python3 def cli(): - import os,argparse + import os,sys,argparse cli = argparse.ArgumentParser(description='CLARA scaling test') - cli.add_argument('-y',help='YAML file',required=True) + cli.add_argument('-P',help='plot only',action='store_true') + cli.add_argument('-y',help='YAML file',default=None) cli.add_argument('-c',help='CLARA_HOME path',default=os.getenv('CLARA_HOME',None)) - cli.add_argument('-t',help='threads',default=[2,4],type=int,action='append') + 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('input',help='input data file') + cli.add_argument('-i',help='input data file',default=None) cfg = cli.parse_args() - import sys - if cfg.c is None: sys.exit('-c or $CLARA_HOME is required') + 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') return cfg def run(cmd): import subprocess - print('scaling >>> '+' '.join(cmd)) + print('run >>> '+' '.join(cmd)) p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,universal_newlines=True,encoding='latin-1') for line in iter(p.stdout.readline, ''): line = line.strip() @@ -47,38 +53,38 @@ def benchmark(cfg, threads): exiting = False elif len(cols) > 20: if line.find('Processed') >= 0: - benchmarks['event'] = float(cols[12]) + benchmarks['Event'] = float(cols[12]) elif exiting: # catch-all for services: if len(cols) > 14: - if 'services' not in benchmarks: - benchmarks['services'] = collections.OrderedDict() - benchmarks['services'][cols[2]] = float(cols[14]) + if 'Services' not in benchmarks: + benchmarks['Services'] = collections.OrderedDict() + benchmarks['Services'][cols[2]] = float(cols[14]) # FIXME: what are these, why don't they add up? elif line.find('Average processing time') >= 0: - benchmarks['avg'] = float(cols[6]) + benchmarks['Avg'] = float(cols[6]) elif line.find('Total processing time') >= 0: - benchmarks['total'] = float(cols[6]) + benchmarks['Total'] = float(cols[6]) elif line.find('Total orchestrator time') >= 0: - benchmarks['orch'] = float(cols[6]) + benchmarks['Orch'] = float(cols[6]) except ValueError: pass return benchmarks def table(benchmarks): table = [] - header = [ 'threads' ] + header = [ 'Threads' ] b = benchmarks[0][1] - header.extend([x for x in b if x != 'services']) - if 'services' in b: - header.extend(b['services'].keys()) + header.extend([x for x in b if x != 'Services']) + 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 ['Event','Avg','Total','Orch','Services']: if k in benchmark: - if k == 'services': + if k == 'Services': row.extend(benchmark[k].values()) else: row.append(benchmark[k]) @@ -92,13 +98,75 @@ def show(benchmarks): def save(benchmarks): with open('scaling.txt','w') as f: for row in table(benchmarks): - f.write(' '.join([str(x) for x in row])) + 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() - benchmarks = [] - for threads in cfg.t: - benchmarks.append([threads, benchmark(cfg, threads)]) - show(benchmarks) - save(benchmarks) + if not cfg.P: + benchmarks = [] + for threads in cfg.t: + benchmarks.append([threads, benchmark(cfg, threads)]) + show(benchmarks) + save(benchmarks) + plot() diff --git a/libexec/scaling.gpl b/libexec/scaling.gpl new file mode 100644 index 0000000000..14db409d70 --- /dev/null +++ b/libexec/scaling.gpl @@ -0,0 +1,51 @@ + +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) + From 0a9564448570a98026d5dba66091211a0bf929d8 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Nov 2025 10:39:28 -0500 Subject: [PATCH 10/17] Disable some GitLab tests, and make asprof artifacts (#944) * cleanup * disable unneeded jobs * fix printouts * remove suffix * save profile artifact * debug * fix * add another * cleanup --- .gitlab-ci.yml | 27 +++++++++++++++++---------- libexec/profile | 11 ++++++++--- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d033548056..7cb5764b5b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,11 +38,9 @@ mirror: - git config --global user.name "GitLab CI" - git checkout development - git config pull.rebase true - - git remote get-url origin - git remote set-url origin https://github.com/jeffersonlab/coatjava - - git pull + - git pull origin development - git remote set-url origin https://gitlab-ci-token:${CI_JOB_TOKEN}@code.jlab.org/hallb/clas12/coatjava/coatjava.git -# - git remote set-url origin git@code.jlab.org:hallb/clas12/coatjava/coatjava - git push build: @@ -61,7 +59,7 @@ build: - coatjava.tar.gz - clara.tar.gz -depana: +.depana: allow_failure: true stage: build script: @@ -78,7 +76,7 @@ download: paths: - clas_018779.evio.00001 -spotbugs: +.spotbugs: stage: test needs: [build] dependencies: [build] @@ -86,7 +84,7 @@ spotbugs: - tar -xzf coatjava.tar.gz - ./build-coatjava.sh -T$JL_RUNNER_AVAIL_CPU --spotbugs --quiet --no-progress -unit_tests: +.unit_tests: stage: test needs: [build] dependencies: [build] @@ -100,7 +98,7 @@ unit_tests: paths: - publish -docs: +.docs: stage: test needs: [build,unit_tests] dependencies: [build,unit_tests] @@ -163,14 +161,23 @@ profile: dependencies: [build,decoder] script: - tar -xzf coatjava.tar.gz - - libexec/profile -e cpu clas_018779_00001.hipo + - 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 + 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 -deploy: +.deploy: stage: deploy script: - echo DEPLOY! -release: +.release: stage: deploy script: - echo RELEASE! diff --git a/libexec/profile b/libexec/profile index a301fee52e..fefe609977 100755 --- a/libexec/profile +++ b/libexec/profile @@ -1,5 +1,7 @@ #!/bin/bash +set -e + # configure: event=cpu #nativemem format=flat @@ -20,6 +22,7 @@ done shift $((OPTIND-1)) data=$1 stub=$(basename $data) +stub=${stub%%.*} which asprof >& /dev/null [ "$?" -ne 0 ] && echo 'ERROR: asprof is not in $PATH.' && exit 9 @@ -33,14 +36,16 @@ pid_java=$(pgrep -P "$pid_bash") echo PID2=$pid_java -ps waux && ps -p $pid +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 -cat pro_$stub.log +tail -n 42 pro_$stub.log -asprof -e $event -d $seconds -o $format -f pro_${format}_${event}_$stub.html $pid_java +asprof --title "Coatjava - asprof - $event" -e $event \ + -d $seconds -o $format -f pro_${format}_${event}_$stub $pid_java kill -9 $pid_java +rm -f pro_$stub.hipo From 997b461990ea5809e317d3133aac3c713e34e49b Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Thu, 13 Nov 2025 16:45:37 -0500 Subject: [PATCH 11/17] feat(scalers): warn if `RUN::scaler` has more than 1 row (#919) --- .../org/jlab/detector/scalers/DaqScalers.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 108458acbc..57262c6a27 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 @@ -9,6 +9,8 @@ import org.jlab.jnp.hipo4.data.Event; import org.jlab.jnp.hipo4.data.SchemaFactory; import org.jlab.utils.groups.IndexedTable; +import java.util.logging.Logger; +import org.jlab.logging.SplitLogger; /** * @@ -51,6 +53,8 @@ public class DaqScalers { private long timestamp=0; private int evnum=0; + private static final Logger logger = SplitLogger.create(DaqScalers.class.getName()); + public DaqScalers setTimestamp(long timestamp) { this.timestamp=timestamp; return this; @@ -95,11 +99,13 @@ public static double getSeconds(Date rst,Date uet) { public static DaqScalers create(Bank runScalerBank) { DaqScalers ds=new DaqScalers(); ds.dsc2=new Dsc2Scaler(); - for (int ii=0; ii 0) { + ds.dsc2.setLivetime(runScalerBank.getFloat("livetime", 0)); + ds.dsc2.setBeamCharge(runScalerBank.getFloat("fcup",0)); + ds.dsc2.setBeamChargeGated(runScalerBank.getFloat("fcupgated",0)); + } + if (runScalerBank.getRows() > 1) { + logger.warning("found event where RUN::scaler bank has more than 1 row"); } return ds; } From 690fa363080a5d9b246dff8cc0fefdc7cb281f03 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Thu, 13 Nov 2025 16:57:20 -0500 Subject: [PATCH 12/17] fix: use consistent JDK version for CI and POM (#918) --- .github/workflows/ci.yml | 39 +++++++++++++++++++++++++++++---------- pom.xml | 2 +- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da4d0f3e27..22d5e885fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,8 +21,10 @@ defaults: shell: bash env: - java_version: 25 + JAVA_VERSION: 21 # must be consistent with POM; see also dependabot config for any version limits + JAVA_VERSION_LATEST: 25 # the latest `JAVA_VERSION` that we test with CI java_distribution: zulu + javadoc_version: 25 # newer than `JAVA_VERSION` for better javadoc groovy_version: 4.x CCDB_CONNECTION: 'sqlite:////cvmfs/oasis.opensciencegrid.org/jlab/hallb/clas12/sw/noarch/data/ccdb/ccdb_latest.sqlite' nthreads: 1 @@ -71,7 +73,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - name: install xrootd-client (linux) @@ -108,13 +110,28 @@ jobs: # tests ############################################################################# + java_matrix: # make JSON job matrix, to workaround GitHub's lack of `env` var support in job matrix params + runs-on: ubuntu-latest + outputs: + versions: ${{ steps.matrix.outputs.versions }} + steps: + - name: matrix + id: matrix + run: echo versions="[\"${{ env.JAVA_VERSION }}\",\"${{ env.JAVA_VERSION_LATEST }}\"]" | tee -a $GITHUB_OUTPUT + unit_tests: + needs: + - java_matrix + strategy: + fail-fast: false + matrix: + JAVA_VERSION: ${{ fromJson(needs.java_matrix.outputs.versions) }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ matrix.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - name: install xrootd-client @@ -127,8 +144,10 @@ jobs: - name: unit tests run: ./build-coatjava.sh --xrootd --unittests --no-progress -T${{ env.nthreads }} - name: collect jacoco report + if: ${{ matrix.JAVA_VERSION == env.JAVA_VERSION }} run: validation/jacoco-aggregate.sh - name: publish jacoco report + if: ${{ matrix.JAVA_VERSION == env.JAVA_VERSION }} uses: actions/upload-artifact@v5 with: name: jacoco_report @@ -143,7 +162,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - uses: cvmfs-contrib/github-action-cvmfs@v5 @@ -165,7 +184,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - uses: cvmfs-contrib/github-action-cvmfs@v5 @@ -202,7 +221,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - name: setup cvmfs @@ -258,7 +277,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - uses: actions/download-artifact@v6 @@ -283,7 +302,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - name: setup groovy @@ -306,7 +325,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - uses: actions/download-artifact@v6 @@ -342,7 +361,7 @@ jobs: - name: set up JDK uses: actions/setup-java@v5 with: - java-version: ${{ env.java_version }} + java-version: ${{ env.javadoc_version }} distribution: ${{ env.java_distribution }} cache: maven - name: build coatjava javadocs # javadoc:aggregate output dir cannot be controlled, so assume the latest "standard" path and `mv` it diff --git a/pom.xml b/pom.xml index b3bce791ef..9cfc4e7dec 100644 --- a/pom.xml +++ b/pom.xml @@ -279,7 +279,7 @@ maven-compiler-plugin 3.14.1 - 21 + 21 UTF-8 From 40fc3182efaa65f7869b4e8faaed0cd02b408ad0 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 13 Nov 2025 17:48:12 -0500 Subject: [PATCH 13/17] build: bump version number to 13.4.1 (#946) --- common-tools/clara-io/pom.xml | 12 ++++---- common-tools/clas-analysis/pom.xml | 22 +++++++------- common-tools/clas-decay-tools/pom.xml | 26 ++++++++--------- common-tools/clas-detector/pom.xml | 12 ++++---- common-tools/clas-geometry/pom.xml | 4 +-- common-tools/clas-io/pom.xml | 8 ++--- 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 | 32 ++++++++++---------- common-tools/pom.xml | 4 +-- common-tools/swim-tools/pom.xml | 18 ++++++------ pom.xml | 2 +- reconstruction/ai/pom.xml | 10 +++---- reconstruction/alert/pom.xml | 24 +++++++-------- reconstruction/band/pom.xml | 12 ++++---- reconstruction/bg/pom.xml | 10 +++---- reconstruction/calib/pom.xml | 10 +++---- reconstruction/cnd/pom.xml | 16 +++++----- reconstruction/cvt/pom.xml | 30 +++++++++---------- reconstruction/dc/pom.xml | 32 ++++++++++---------- reconstruction/eb/pom.xml | 34 +++++++++++----------- reconstruction/ec/pom.xml | 20 ++++++------- 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, 337 insertions(+), 337 deletions(-) diff --git a/common-tools/clara-io/pom.xml b/common-tools/clara-io/pom.xml index bb3ebb8630..26e476f6c1 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -44,25 +44,25 @@ org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-analysis/pom.xml b/common-tools/clas-analysis/pom.xml index 8e6c9433ed..e4afd3eae3 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -38,55 +38,55 @@ org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index c638444283..27957457ff 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,59 +21,59 @@ org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar cnuphys swimmer - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-detector/pom.xml b/common-tools/clas-detector/pom.xml index fe2478525b..634547dd45 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -43,19 +43,19 @@ org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-geometry/pom.xml b/common-tools/clas-geometry/pom.xml index b34f2b4035..c1a36dc594 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-io/pom.xml b/common-tools/clas-io/pom.xml index 9c6ba04f01..a4f6fadaa1 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -50,13 +50,13 @@ org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile diff --git a/common-tools/clas-jcsg/pom.xml b/common-tools/clas-jcsg/pom.xml index 41db98b7f2..70baa827b5 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -32,17 +32,17 @@ org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT java3d diff --git a/common-tools/clas-logging/pom.xml b/common-tools/clas-logging/pom.xml index c301922eca..9b654e4d22 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-math/pom.xml b/common-tools/clas-math/pom.xml index 920327b64e..0aa9bc60c1 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-physics/pom.xml b/common-tools/clas-physics/pom.xml index db348121ea..62e7806ffe 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index 027e9e95a1..a262ce45af 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -45,43 +45,43 @@ cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys swimmer - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-tracking/pom.xml b/common-tools/clas-tracking/pom.xml index 5bc3eafe6c..4fe9b5befc 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -33,23 +33,23 @@ org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/clas-utils/pom.xml b/common-tools/clas-utils/pom.xml index 400129c17e..078aca5183 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -22,7 +22,7 @@ org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/cnuphys/magfield/pom.xml b/common-tools/cnuphys/magfield/pom.xml index 82ede3b27e..c91c69bd53 100644 --- a/common-tools/cnuphys/magfield/pom.xml +++ b/common-tools/cnuphys/magfield/pom.xml @@ -4,13 +4,13 @@ cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar cnuphys clas12 - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/cnuphys/pom.xml b/common-tools/cnuphys/pom.xml index f0b697bbf1..9bcb5c3966 100644 --- a/common-tools/cnuphys/pom.xml +++ b/common-tools/cnuphys/pom.xml @@ -4,13 +4,13 @@ cnuphys clas12 - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT pom org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/cnuphys/snr/pom.xml b/common-tools/cnuphys/snr/pom.xml index 3af4da04ea..a89dfb7bcb 100644 --- a/common-tools/cnuphys/snr/pom.xml +++ b/common-tools/cnuphys/snr/pom.xml @@ -4,13 +4,13 @@ cnuphys snr - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar cnuphys clas12 - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/cnuphys/splot/pom.xml b/common-tools/cnuphys/splot/pom.xml index 646b89b314..2b54e2828f 100644 --- a/common-tools/cnuphys/splot/pom.xml +++ b/common-tools/cnuphys/splot/pom.xml @@ -4,13 +4,13 @@ cnuphys splot - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar cnuphys clas12 - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/cnuphys/swimmer/pom.xml b/common-tools/cnuphys/swimmer/pom.xml index 3bbbde17e8..d8e1edd592 100644 --- a/common-tools/cnuphys/swimmer/pom.xml +++ b/common-tools/cnuphys/swimmer/pom.xml @@ -4,26 +4,26 @@ cnuphys swimmer - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar cnuphys clas12 - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys splot - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/coat-libs/pom.xml b/common-tools/coat-libs/pom.xml index 2b700f3101..337f3d20a5 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -66,85 +66,85 @@ org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clara-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-math - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-tracking - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-decay-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys snr - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/pom.xml b/common-tools/pom.xml index 014b8f6560..7157834db7 100644 --- a/common-tools/pom.xml +++ b/common-tools/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT pom org.jlab.clas coatjava - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/common-tools/swim-tools/pom.xml b/common-tools/swim-tools/pom.xml index 543d01cfef..52b628fe23 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.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas common-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys swimmer - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 9cfc4e7dec..074926a901 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jlab.clas coatjava - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT pom diff --git a/reconstruction/ai/pom.xml b/reconstruction/ai/pom.xml index 7ea1e834fe..321966b416 100644 --- a/reconstruction/ai/pom.xml +++ b/reconstruction/ai/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ai - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index 54a84bc809..c339d2063d 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-alert - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -30,60 +30,60 @@ org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile diff --git a/reconstruction/band/pom.xml b/reconstruction/band/pom.xml index 8a474cf5c7..5efef7aa1c 100644 --- a/reconstruction/band/pom.xml +++ b/reconstruction/band/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-band - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/bg/pom.xml b/reconstruction/bg/pom.xml index ba3f61ba25..2b8aeef189 100644 --- a/reconstruction/bg/pom.xml +++ b/reconstruction/bg/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-bg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/calib/pom.xml b/reconstruction/calib/pom.xml index 58613a7937..0b14438379 100644 --- a/reconstruction/calib/pom.xml +++ b/reconstruction/calib/pom.xml @@ -6,13 +6,13 @@ org.jlab.clas12.detector clas12detector-calib - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -20,19 +20,19 @@ org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/cnd/pom.xml b/reconstruction/cnd/pom.xml index 3e83a58a40..3e645ee151 100644 --- a/reconstruction/cnd/pom.xml +++ b/reconstruction/cnd/pom.xml @@ -4,45 +4,45 @@ org.jlab.clas12.detector clas12detector-cnd - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/cvt/pom.xml b/reconstruction/cvt/pom.xml index 5978c74303..dfe02abdd9 100644 --- a/reconstruction/cvt/pom.xml +++ b/reconstruction/cvt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-cvt - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -26,68 +26,68 @@ cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test jar diff --git a/reconstruction/dc/pom.xml b/reconstruction/dc/pom.xml index 9cb9add642..c597653a2a 100644 --- a/reconstruction/dc/pom.xml +++ b/reconstruction/dc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-dc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -33,69 +33,69 @@ cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-tracking - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-math - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys snr - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.plugins @@ -105,7 +105,7 @@ org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT junit diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 3ee2374ed2..74544f1124 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-eb - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,80 +21,80 @@ cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT junit diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index 51503511aa..b0e3509b9a 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ec - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,44 +21,44 @@ org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-logging - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT test org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT junit diff --git a/reconstruction/fmt/pom.xml b/reconstruction/fmt/pom.xml index 0aaf83fe09..13dad22f7d 100644 --- a/reconstruction/fmt/pom.xml +++ b/reconstruction/fmt/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-fmt - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/ft/pom.xml b/reconstruction/ft/pom.xml index 8983fe53c1..d777ff6395 100644 --- a/reconstruction/ft/pom.xml +++ b/reconstruction/ft/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ft - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,32 +21,32 @@ org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/htcc/pom.xml b/reconstruction/htcc/pom.xml index f019b0d7af..6d27d53359 100644 --- a/reconstruction/htcc/pom.xml +++ b/reconstruction/htcc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-htcc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/ltcc/pom.xml b/reconstruction/ltcc/pom.xml index 588d3fc3e2..d6153bdd7f 100644 --- a/reconstruction/ltcc/pom.xml +++ b/reconstruction/ltcc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-ltcc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -26,27 +26,27 @@ org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/mc/pom.xml b/reconstruction/mc/pom.xml index 2d373b5840..0b1acea0d1 100644 --- a/reconstruction/mc/pom.xml +++ b/reconstruction/mc/pom.xml @@ -4,35 +4,35 @@ org.jlab.clas12.detector clas12detector-mc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 9f0962e4ff..cb6faa2b1a 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-mltn - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -38,13 +38,13 @@ org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/pom.xml b/reconstruction/pom.xml index fa66d6feb0..9017da037c 100644 --- a/reconstruction/pom.xml +++ b/reconstruction/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT pom org.jlab.clas coatjava - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/postproc/pom.xml b/reconstruction/postproc/pom.xml index d8d172193f..0a994f3b26 100644 --- a/reconstruction/postproc/pom.xml +++ b/reconstruction/postproc/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-postproc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-analysis - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/raster/pom.xml b/reconstruction/raster/pom.xml index d8274dd5af..2bca450a86 100644 --- a/reconstruction/raster/pom.xml +++ b/reconstruction/raster/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-raster - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,22 +21,22 @@ org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/recoil/pom.xml b/reconstruction/recoil/pom.xml index c6ba248e97..18b7c40238 100644 --- a/reconstruction/recoil/pom.xml +++ b/reconstruction/recoil/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-recoil - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/rich/pom.xml b/reconstruction/rich/pom.xml index c39521b56b..8e95941087 100644 --- a/reconstruction/rich/pom.xml +++ b/reconstruction/rich/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-rich - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,37 +21,37 @@ org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/rtpc/pom.xml b/reconstruction/rtpc/pom.xml index 3a3dfc3e3f..0e6429f3eb 100644 --- a/reconstruction/rtpc/pom.xml +++ b/reconstruction/rtpc/pom.xml @@ -4,20 +4,20 @@ org.jlab.clas12.detector clas12detector-rtpc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT cnuphys magfield - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.apache.commons @@ -26,33 +26,33 @@ org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-tracking - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT compile org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/swaps/pom.xml b/reconstruction/swaps/pom.xml index 0416f077b1..4b7b7b3fe4 100644 --- a/reconstruction/swaps/pom.xml +++ b/reconstruction/swaps/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-swaps - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -18,19 +18,19 @@ org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/tof/pom.xml b/reconstruction/tof/pom.xml index c5b9065bb0..874898c0d5 100644 --- a/reconstruction/tof/pom.xml +++ b/reconstruction/tof/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-tof - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -18,43 +18,43 @@ org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-physics - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-utils - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/uber/pom.xml b/reconstruction/uber/pom.xml index c34d7815df..ccf8ab2350 100644 --- a/reconstruction/uber/pom.xml +++ b/reconstruction/uber/pom.xml @@ -4,110 +4,110 @@ org.jlab.clas12.detector clas12detector-uber - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-dc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ec - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-tof - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-htcc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ltcc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-ft - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cnd - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-band - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-cvt - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-raster - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-vtx - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-calib - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rtpc - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-rich - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-eb - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-mltn - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas12.detector clas12detector-fmt - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/urwell/pom.xml b/reconstruction/urwell/pom.xml index 9bb7bd1538..b68999b7ce 100644 --- a/reconstruction/urwell/pom.xml +++ b/reconstruction/urwell/pom.xml @@ -4,13 +4,13 @@ org.jlab.clas12.detector clas12detector-urwell - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT @@ -21,27 +21,27 @@ org.jlab.clas clas-detector - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-jcsg - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT diff --git a/reconstruction/vtx/pom.xml b/reconstruction/vtx/pom.xml index db28d4f17f..25e1c66a93 100644 --- a/reconstruction/vtx/pom.xml +++ b/reconstruction/vtx/pom.xml @@ -4,41 +4,41 @@ org.jlab.clas12.detector clas12detector-vtx - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar org.jlab.clas12 reconstruction - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas swim-tools - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT jar cnuphys swimmer - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-reco - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-io - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT org.jlab.clas clas-geometry - 13.4.0-SNAPSHOT + 13.4.1-SNAPSHOT From 9ae47c349cd3707341c6536138bd15355e734ab9 Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Fri, 21 Nov 2025 19:10:45 -0500 Subject: [PATCH 14/17] fix(ci): use cvmfs instead of xrootd, for field maps (#954) --- .github/workflows/ci.yml | 46 +++++++------------ .gitlab-ci.yml | 9 +++- .gitmodules | 6 +++ build-coatjava.sh | 30 ++++++++++-- etc/data/magfield | 1 + install-clara | 19 +++++--- validation/advanced-tests/data | 1 + .../advanced-tests/run-advanced-tests.sh | 17 +++---- validation/advanced-tests/run-eb-tests.sh | 8 ++-- 9 files changed, 85 insertions(+), 52 deletions(-) create mode 100644 .gitmodules create mode 160000 etc/data/magfield create mode 160000 validation/advanced-tests/data diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 22d5e885fe..f46eba9093 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,8 +42,6 @@ jobs: with: key: raw_test_data # fixed key will always hit; clear cache to trigger cache miss path: | - clas_005038.evio.00000 - clas_021559.evio.00001 clas_018779.evio.00001 lookup-only: true - name: install xrootd-client @@ -53,10 +51,12 @@ jobs: sudo apt -y install xrootd-client - name: download if: ${{ steps.cache.outputs.cache-hit != 'true' }} +# run: | +# xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-d/clas_018779.evio.00001 ./ run: | - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/clas_005038.evio.00000 ./ - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-l/clas_021559.evio.00001 ./ - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-d/clas_018779.evio.00001 ./ + git lfs install + git clone --depth 1 https://code.jlab.org/hallb/clas12/validation-data + cp validation-data/raw/rg-d/clas_018779.evio.00001 . # build ############################################################################# @@ -76,14 +76,6 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - name: install xrootd-client (linux) - if: ${{ matrix.runner == 'ubuntu-latest' }} - run: | - sudo apt -y update - sudo apt -y install xrootd-client - - name: install xrootd-client (macos) - if: ${{ matrix.runner == 'macos-latest' }} - run: brew install xrootd - name: setup cvmfs uses: cvmfs-contrib/github-action-cvmfs@v5 with: @@ -94,7 +86,11 @@ jobs: if: ${{ github.ref_type == 'tag' }} run: libexec/version-bump.sh ${{ github.ref_name }} - name: build - run: ./build-coatjava.sh --clara --xrootd --no-progress -T${{ env.nthreads }} + run: | + git lfs install + git submodule update --init ./etc/data/magfield + ./build-coatjava.sh --cvmfs --no-progress -T${{ env.nthreads }} + ./install-clara -b -c ./coatjava ./clara - name: tar # tarball to preserve permissions run: | tar czvf coatjava.tar.gz coatjava @@ -134,15 +130,11 @@ jobs: java-version: ${{ matrix.JAVA_VERSION }} distribution: ${{ env.java_distribution }} cache: maven - - name: install xrootd-client - run: | - sudo apt -y update - sudo apt -y install xrootd-client - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: unit tests - run: ./build-coatjava.sh --xrootd --unittests --no-progress -T${{ env.nthreads }} + run: ./build-coatjava.sh --cvmfs --unittests --no-progress -T${{ env.nthreads }} - name: collect jacoco report if: ${{ matrix.JAVA_VERSION == env.JAVA_VERSION }} run: validation/jacoco-aggregate.sh @@ -190,10 +182,6 @@ jobs: - uses: cvmfs-contrib/github-action-cvmfs@v5 with: cvmfs_repositories: 'oasis.opensciencegrid.org' - - name: install xrootd-client - run: | - sudo apt -y update - sudo apt -y install xrootd-client - uses: actions/download-artifact@v6 with: name: build_ubuntu-latest @@ -201,15 +189,13 @@ jobs: with: key: raw_test_data path: | - clas_005038.evio.00000 - clas_021559.evio.00001 clas_018779.evio.00001 - name: untar build run: tar xzvf coatjava.tar.gz - name: run test run: | ls -lhtr - ./coatjava/bin/decoder -n 10000 -o dog.hipo ./clas_005038.evio.00000 + ./coatjava/bin/decoder -n 10000 -o dog.hipo ./clas_018779.evio.00001 test_clara: needs: [ build, download_test_data ] @@ -235,8 +221,6 @@ jobs: with: key: raw_test_data path: | - clas_005038.evio.00000 - clas_021559.evio.00001 clas_018779.evio.00001 - name: untar build run: | @@ -287,9 +271,13 @@ jobs: with: cvmfs_repositories: 'oasis.opensciencegrid.org' - name: untar build - run: tar xzvf coatjava.tar.gz + 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 echo "COMMAND: ${{ matrix.cmd }}" ${{ matrix.cmd }} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7cb5764b5b..d2ac1c03a2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -49,6 +49,8 @@ build: - job: mirror optional: true script: + - git lfs install + - git submodule update --init etc/data/magfield - ./build-coatjava.sh --clara -T$JL_RUNNER_AVAIL_CPU --quiet --no-progress - tar -czf coatjava.tar.gz coatjava - tar -czf clara.tar.gz clara @@ -69,7 +71,9 @@ build: download: stage: build script: - - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-d/clas_018779.evio.00001 ./ +# - xrdcp xroot://sci-xrootd.jlab.org///osgpool/hallb/clas12/validation/raw/rg-d/clas_018779.evio.00001 ./ + - git clone https://code.jlab.org/hallb/clas12/validation-data + - cp validation-data/raw/rg-d/clas_018779.evio.00001 . artifacts: when: always expire_in: 1 day @@ -124,6 +128,9 @@ eb: dependencies: [build] script: - tar -xzf coatjava.tar.gz + - tar -xzf clara.tar.gz + - git lfs install + - git submodule update --init validation/advanced-tests/data - cd validation/advanced-tests - ./run-eb-tests.sh -100 ${ARG} parallel: diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..b5a2f825c4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "etc/data/magfield"] + path = etc/data/magfield + url = https://code.jlab.org/hallb/clas12/magfield +[submodule "validation/advanced-tests/data"] + path = validation/advanced-tests/data + url = https://code.jlab.org/hallb/clas12/coatjava/advanced-tests diff --git a/build-coatjava.sh b/build-coatjava.sh index 22559520f0..c29676e1d4 100755 --- a/build-coatjava.sh +++ b/build-coatjava.sh @@ -23,8 +23,10 @@ usage='''build-coatjava.sh [OPTIONS]... [MAVEN_OPTIONS]... --xrootd use xrootd to download field maps --cvmfs use cvmfs to download field maps + --lfs use lfs for field maps and test data --clara install clara too + --data download test data (requires lfs) --help show this message @@ -40,7 +42,9 @@ downloadMaps="yes" runUnitTests="no" useXrootd=false useCvmfs=false +useLfs=false installClara=false +downloadData=false mvnArgs=() wgetArgs=() for xx in $@ @@ -61,8 +65,10 @@ do wgetArgs+=(--no-verbose) ;; --xrootd) useXrootd=true ;; - --cvmfs) useCvmfs=true ;; - --clara) installClara=true ;; + --cvmfs) useCvmfs=true ;; + --lfs) useLfs=true ;; + --clara) installClara=true ;; + --data) downloadData=true ;; -h|--help) echo "$usage" exit 2 @@ -71,6 +77,18 @@ do esac done +if $downloadData && ! $useLfs; then + echo "$usage" + echo "ERROR::::::::::: --data requires --lfs" + exit 2 +fi + +# Currently only git-lfs works from offsite: +if ! [[ $(hostname) == *.jlab.org ]]; then + echo "INFO: using --lfs for offsite usage" + useLfs=true +fi + src_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" prefix_dir=$src_dir/coatjava clara_home=$src_dir/clara @@ -91,8 +109,13 @@ download () { if $useXrootd; then xrdcp $1 ./ ret=$? + elif $useLfs; then + cd $src_dir + git submodule update --init etc/data/magfield + if $downloadData; then git submodule update --init validation/advanced-tests/data; fi + cd - > /dev/null elif $useCvmfs; then - cp $1 ./ + cp -v $1 ./ ret=$? elif command_exists wget ; then $wget $1 @@ -116,6 +139,7 @@ magfield_dir=$src_dir/etc/data/magfield if [ $cleanBuild == "no" ] && [ $downloadMaps == "yes" ]; then echo 'Retrieving field maps ...' webDir=https://clasweb.jlab.org/clas12offline/magfield + if $useLfs; then webDir=${magfield_dir##$src_dir}; fi if $useXrootd; then webDir=xroot://sci-xrootd.jlab.org//osgpool/hallb/clas12/coatjava/magfield; fi if $useCvmfs; then webDir=/cvmfs/oasis.opensciencegrid.org/jlab/hallb/clas12/sw/noarch/data/magfield; fi mkdir -p $magfield_dir diff --git a/etc/data/magfield b/etc/data/magfield new file mode 160000 index 0000000000..a0e899ea96 --- /dev/null +++ b/etc/data/magfield @@ -0,0 +1 @@ +Subproject commit a0e899ea96c86609ea36f5111ed7c319e8463673 diff --git a/install-clara b/install-clara index 876d0c408a..ec5d65f5f0 100755 --- a/install-clara +++ b/install-clara @@ -56,10 +56,17 @@ function cleanup() { } function build_clara { - git clone --branch $clara --depth 1 https://code.jlab.org/hallb/clas12/clara-java + #git clone --branch $clara --depth 1 https://code.jlab.org/hallb/clas12/clara-java + git clone --depth 1 https://code.jlab.org/hallb/clas12/clara-java cd clara-java && CLARA_HOME=$1 ./gradlew deploy && cd - } +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 + cd grapes && mvn package && cd - +} + trap cleanup EXIT # Configure: @@ -133,14 +140,14 @@ fi if ! compgen -G "$coatjava/lib/clas/coat-libs-*.jar" > /dev/null then echo -e "\nRetrieving COATJAVA version $coatjava ..." - get https://clasweb.jlab.org/clas12offline/distribution/coatjava/coatjava-$coatjava.tar.gz - coatjava=./coatjava + get https://github.com/JeffersonLab/coatjava/releases/download/$coatjava/coatjava-$coatjava.tar.gz + coatjava=./coatjava-$coatjava fi mkdir -p clara-cre/plugins/clas12/config cp -Lr $coatjava/etc $coatjava/bin $coatjava/lib* clara-cre/plugins/clas12 # GRAPES: echo -e "\nRetrieving GRAPES version $grapes ..." -get https://clasweb.jlab.org/clas12offline/distribution/grapes/grapes-$grapes.tar.gz -mv grapes-$grapes clara-cre/plugins/grapes - +build_grapes $PWD/grapes +mkdir -p clara-cre/plugins/grapes/lib/core/ +cp grapes/target/grapes-*core*.jar clara-cre/plugins/grapes/lib/core/ diff --git a/validation/advanced-tests/data b/validation/advanced-tests/data new file mode 160000 index 0000000000..cebf632bbd --- /dev/null +++ b/validation/advanced-tests/data @@ -0,0 +1 @@ +Subproject commit cebf632bbd0a5b45ee3e1f34ee1b24903a0a1013 diff --git a/validation/advanced-tests/run-advanced-tests.sh b/validation/advanced-tests/run-advanced-tests.sh index d763f7ec12..240822351e 100755 --- a/validation/advanced-tests/run-advanced-tests.sh +++ b/validation/advanced-tests/run-advanced-tests.sh @@ -1,27 +1,24 @@ #!/bin/bash -f -# coatjava must already be built at ../../coatjava/ +# coatjava and clara must already be built at ../../coatjava/ +# 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_installation/ ; export CLARA_HOME +CLARA_HOME=$PWD/../../clara/ ; export CLARA_HOME COAT=$CLARA_HOME/plugins/clas12/ -# install clara -../../install-clara -c ../../coatjava $CLARA_HOME -[ $? -ne 0 ] && echo "clara installation error" && exit 1 - # source coatjava environment source $COAT/libexec/env.sh classPath="${COATJAVA_CLASSPATH}:../lib/*:src/" # download test files -wget --no-check-certificate http://clasweb.jlab.org/clas12offline/distribution/coatjava/validation_files/twoTrackEvents_809_raw.evio.tar.gz -[ $? -ne 0 ] && echo "wget validation files failure" && exit 2 -tar -zxvf twoTrackEvents_809_raw.evio.tar.gz +#wget --no-check-certificate http://clasweb.jlab.org/clas12offline/distribution/coatjava/validation_files/twoTrackEvents_809_raw.evio.tar.gz +#[ $? -ne 0 ] && echo "wget validation files failure" && exit 2 +#tar -zxvf twoTrackEvents_809_raw.evio.tar.gz # run decoder -$COAT/bin/decoder -t -0.5 -s 0.0 -i ./twoTrackEvents_809_raw.evio -o ./twoTrackEvents_809.hipo -c 2 +$COAT/bin/decoder -t -0.5 -s 0.0 -i ./data/twoTrackEvents_809_raw.evio -o ./twoTrackEvents_809.hipo -c 2 [ $? -ne 0 ] && echo "decoder failure" && exit 3 # take a peek diff --git a/validation/advanced-tests/run-eb-tests.sh b/validation/advanced-tests/run-eb-tests.sh index 748d7a5b97..43ca6e6ed4 100755 --- a/validation/advanced-tests/run-eb-tests.sh +++ b/validation/advanced-tests/run-eb-tests.sh @@ -3,8 +3,10 @@ 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 @@ -121,8 +123,8 @@ then 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 + #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 @@ -134,7 +136,7 @@ then then GEOMDBVAR=$geoDbVariation export GEOMDBVAR - ../../coatjava/bin/recon-util -i ${stub}.hipo -o out_${stub}.hipo -c 2 + ../../coatjava/bin/recon-util -i ${webDir}/${stub}.hipo -o out_${stub}.hipo -c 2 else echo "set inputDir $PWD/" > cook.clara echo "set outputDir $PWD/" >> cook.clara From a1da7a4a9fc8fcd2651dd6106854ca51e32be187 Mon Sep 17 00:00:00 2001 From: Felix Touchte Codjo <119527892+ftouchte@users.noreply.github.com> Date: Sat, 22 Nov 2025 02:52:07 +0100 Subject: [PATCH 15/17] Fix fully qualified class name for alert constants (#957) --- .../alert/src/main/java/org/jlab/rec/ahdc/Hit/HitReader.java | 2 +- .../jlab/rec/alert/constants/CalibrationConstantsLoader.java | 2 +- .../alert/src/main/java/org/jlab/rec/atof/hit/ATOFHit.java | 2 +- .../alert/src/main/java/org/jlab/rec/atof/hit/BarHit.java | 2 +- .../alert/src/main/java/org/jlab/service/ahdc/AHDCEngine.java | 2 +- .../alert/src/main/java/org/jlab/service/atof/ATOFEngine.java | 2 +- 6 files changed, 6 insertions(+), 6 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 54a8c047a6..e30adafce3 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 @@ -6,7 +6,7 @@ import org.jlab.io.base.DataEvent; import org.jlab.detector.banks.RawDataBank; import org.jlab.geom.detector.alert.AHDC.AlertDCDetector; -import org.jlab.rec.constants.CalibrationConstantsLoader; +import org.jlab.rec.alert.constants.CalibrationConstantsLoader; public class HitReader { 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 df966352d4..032c72a066 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 @@ -1,4 +1,4 @@ -package org.jlab.rec.constants; +package org.jlab.rec.alert.constants; import org.jlab.detector.calib.utils.ConstantsManager; import org.jlab.detector.calib.utils.DatabaseConstantProvider; 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 44ba98feda..895faeb015 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.constants.CalibrationConstantsLoader; +import org.jlab.rec.alert.constants.CalibrationConstantsLoader; /** * 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 ec96cbddc0..fd46440c27 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,7 @@ package org.jlab.rec.atof.hit; import org.jlab.rec.atof.constants.Parameters; -import org.jlab.rec.constants.CalibrationConstantsLoader; +import org.jlab.rec.alert.constants.CalibrationConstantsLoader; /** * 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 522f04f534..14f138ed34 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 @@ -27,7 +27,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.constants.CalibrationConstantsLoader; +import org.jlab.rec.alert.constants.CalibrationConstantsLoader; import org.jlab.detector.pulse.ModeAHDC; /** AHDCEngine reconstruction service. 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 c7c83e3b8b..b65f7886d6 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 @@ -19,7 +19,7 @@ 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.constants.CalibrationConstantsLoader; +import org.jlab.rec.alert.constants.CalibrationConstantsLoader; //import org.jlab.rec.alert.projections.TrackProjector; /** From 16c8d115ad9b4370ee1d7e9f1deef65d10e924ab Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Fri, 21 Nov 2025 22:50:30 -0500 Subject: [PATCH 16/17] fix: unify the loggers (#951) * refactor!: remove `DefaultLogger` * feat: propagate log level of `OptionParser` to its owner's class instances * refactor: rename and document * fix: sync levels for all classes in `postprocess` * fix: just apply the level to all new `SplitLogger`s * fix: syncing * fix: depana * doc: singleton --- .../analysis/eventmerger/EventMerger.java | 5 +- .../eventmerger/RandomTriggerFilter.java | 3 - .../eventmerger/RandomTriggerSplit.java | 3 - .../jlab/analysis/postprocess/Processor.java | 2 - .../analysis/postprocess/Tag1ToEvent.java | 3 +- .../analysis/roads/DictionaryCreator.java | 5 +- .../analysis/roads/DictionaryGenerator.java | 3 - .../jlab/analysis/roads/DictionaryMerger.java | 5 +- .../analysis/roads/DictionaryValidator.java | 5 +- common-tools/clas-decay-tools/pom.xml | 5 -- .../clas/decay/analysis/AnalysisEngine.java | 3 - .../jlab/detector/decode/CLASDecoder4.java | 4 -- .../detector/examples/RawEventViewer.java | 2 - .../org/jlab/detector/swaps/SwapManager.java | 3 - .../main/java/org/jlab/io/utils/EvioCure.java | 5 +- .../java/org/jlab/logging/DefaultLogger.java | 58 ------------------- .../java/org/jlab/logging/SplitLogger.java | 15 ++++- .../org/jlab/logging/SplitLoggerConfig.java | 36 ++++++++++++ .../org/jlab/logging/fine.properties | 29 ---------- .../org/jlab/logging/finer.properties | 29 ---------- .../org/jlab/logging/finest.properties | 29 ---------- .../org/jlab/logging/info.properties | 29 ---------- .../org/jlab/logging/silent.properties | 51 ---------------- .../org/jlab/logging/warning.properties | 29 ---------- common-tools/clas-reco/pom.xml | 6 ++ .../org/jlab/clas/reco/EngineProcessor.java | 5 +- .../org/jlab/utils/options/OptionParser.java | 29 +++++++--- reconstruction/alert/pom.xml | 6 -- .../java/org/jlab/service/alert/AHDCTest.java | 2 - .../java/org/jlab/service/alert/ATOFTest.java | 2 - .../main/java/org/jlab/rec/cvt/Geometry.java | 6 +- .../cvt/services/CVTReconstructionTest.java | 2 - .../java/org/jlab/service/dc/DCEngine.java | 3 +- .../service/dc/LayerEfficiencyAnalyzer.java | 4 +- .../jlab/service/dc/DCReconstructionTest.java | 3 - reconstruction/eb/pom.xml | 6 -- .../jlab/service/eb/EBReconstructionTest.java | 2 - reconstruction/ec/pom.xml | 6 -- .../jlab/service/ec/ECReconstructionTest.java | 2 - 39 files changed, 93 insertions(+), 352 deletions(-) delete mode 100644 common-tools/clas-logging/src/main/java/org/jlab/logging/DefaultLogger.java create mode 100644 common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLoggerConfig.java delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/fine.properties delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/finer.properties delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/finest.properties delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/info.properties delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/silent.properties delete mode 100644 common-tools/clas-logging/src/main/resources/org/jlab/logging/warning.properties diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java index 7d9e62c623..7b64087430 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java @@ -15,7 +15,6 @@ import org.jlab.io.hipo.HipoDataSource; import org.jlab.io.hipo.HipoDataSync; import org.jlab.jnp.hipo4.data.SchemaFactory; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.benchmark.ProgressPrintout; import org.jlab.utils.options.OptionParser; import org.jlab.utils.system.ClasUtilsFile; @@ -346,8 +345,6 @@ private boolean mergeEvents(DataEvent event, int scale) { public static void main(String[] args) { - DefaultLogger.debug(); - OptionParser parser = new OptionParser("bg-merger"); parser.addRequired("-o" ,"merged file"); parser.addRequired("-i" ,"signal event file"); @@ -418,4 +415,4 @@ public static void main(String[] args) { } -} \ No newline at end of file +} diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerFilter.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerFilter.java index c2b4073b19..e7465408cb 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerFilter.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerFilter.java @@ -6,7 +6,6 @@ import org.jlab.jnp.hipo4.io.HipoReader; import org.jlab.jnp.hipo4.io.HipoWriterSorted; import org.jlab.jnp.utils.json.JsonObject; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.benchmark.ProgressPrintout; import org.jlab.utils.options.OptionParser; import org.jlab.utils.system.ClasUtilsFile; @@ -141,8 +140,6 @@ public static long readTriggerMask(String mask) { public static void main(String[] args){ - DefaultLogger.debug(); - OptionParser parser = new OptionParser("trigger-filter"); parser.addRequired("-o" ,"output file"); parser.addRequired("-b" ,"trigger bit mask (e.g. 0x0000008000000000 to select the FC trigger"); diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerSplit.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerSplit.java index 388120b731..56e700b242 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerSplit.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/RandomTriggerSplit.java @@ -3,7 +3,6 @@ import org.jlab.jnp.hipo4.data.*; import org.jlab.jnp.hipo4.io.HipoReader; import org.jlab.jnp.hipo4.io.HipoWriterSorted; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.benchmark.ProgressPrintout; import org.jlab.utils.options.OptionParser; import org.jlab.utils.system.ClasUtilsFile; @@ -37,8 +36,6 @@ private HipoWriterSorted openOutputFile(String outputfile){ public static void main(String[] args){ - DefaultLogger.debug(); - OptionParser parser = new OptionParser("trigger-splitter"); parser.addOption("-o" ,"", "output file prefix"); parser.addOption("-n" ,"-1", "maximum number of events to process"); 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 91e53d2e45..f5f4ca1cee 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,7 +8,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.jlab.logging.DefaultLogger; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -223,7 +222,6 @@ private static void replace(Map files) { } public static void main(String args[]) { - DefaultLogger.debug(); Processor p = new Processor(System.getenv("HOME")+"/tmp","r*.hipo",false,false); } 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 5ac8763c65..eb93cc67d6 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 @@ -36,13 +36,12 @@ public class Tag1ToEvent { public static void main(String[] args) { OptionParser parser = new OptionParser("postprocess"); - parser.useExternalLogger(); // necessary, since we have `LOGGER` here parser.addOption("-q","0","do beam charge and livetime (0/1=false/true)"); parser.addOption("-d","0","do delayed helicity (0/1=false/true)"); parser.addOption("-f","0","rebuild the HEL::flip banks (0/1=false/true)"); parser.addRequired("-o","output.hipo"); parser.parse(args); - SplitLogger.configureLevel(LOGGER, parser.getLogLevel()); + parser.syncLogLevel(LOGGER); if (parser.getInputList().isEmpty()) { parser.printUsage(); LOGGER.severe("No input file(s) specified."); diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryCreator.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryCreator.java index 0f5a25e052..f34b219b29 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryCreator.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryCreator.java @@ -7,7 +7,6 @@ import java.util.List; import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.benchmark.ProgressPrintout; import org.jlab.utils.options.OptionParser; @@ -69,8 +68,6 @@ public void createDictionary(String inputFileName, String dictName, int maxEvent public static void main(String[] args) { - - DefaultLogger.debug(); OptionParser parser = new OptionParser("dict-maker"); parser.setRequiresInputList(false); @@ -130,4 +127,4 @@ public static void main(String[] args) { } -} \ No newline at end of file +} diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryGenerator.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryGenerator.java index 4f3c158539..d2ea228f20 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryGenerator.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryGenerator.java @@ -24,7 +24,6 @@ import org.jlab.geom.prim.Path3D; import org.jlab.geom.prim.Point3D; import org.jlab.geometry.prim.Line3d; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.benchmark.ProgressPrintout; import org.jlab.utils.options.OptionParser; @@ -339,8 +338,6 @@ private int swimtoLayer(int sector, int l, int sl, Swim sw) { public static void main(String[] args) { - DefaultLogger.debug(); - OptionParser parser = new OptionParser("dict-generator"); parser.setRequiresInputList(false); parser.addRequired("-torus", "torus scale"); diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryMerger.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryMerger.java index d7aeb8f276..f15378ff63 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryMerger.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryMerger.java @@ -7,7 +7,6 @@ import java.io.FileWriter; import java.io.IOException; import java.util.List; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.benchmark.ProgressPrintout; import org.jlab.utils.options.OptionParser; @@ -30,8 +29,6 @@ public boolean init() { public static void main(String[] args) { - - DefaultLogger.debug(); OptionParser parser = new OptionParser("dict-merger"); parser.addOption("-o","output.txt", "output dictionary file"); @@ -104,4 +101,4 @@ public static void main(String[] args) { } -} \ No newline at end of file +} diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryValidator.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryValidator.java index 98a5c8a82f..880fb2964f 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryValidator.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/roads/DictionaryValidator.java @@ -16,7 +16,6 @@ import org.jlab.groot.group.DataGroup; import org.jlab.io.base.DataEvent; import org.jlab.io.hipo.HipoDataSource; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.benchmark.ProgressPrintout; import org.jlab.utils.options.OptionParser; @@ -303,8 +302,6 @@ public void processFile(String fileName, int wireBin, int pcalBin, int sectorDep public static void main(String[] args) { - - DefaultLogger.debug(); OptionParser parser = new OptionParser("dict-validator"); parser.setRequiresInputList(false); @@ -401,4 +398,4 @@ public static void main(String[] args) { } -} \ No newline at end of file +} diff --git a/common-tools/clas-decay-tools/pom.xml b/common-tools/clas-decay-tools/pom.xml index 27957457ff..557ffe9ec2 100644 --- a/common-tools/clas-decay-tools/pom.xml +++ b/common-tools/clas-decay-tools/pom.xml @@ -45,11 +45,6 @@ clas-reco 13.4.1-SNAPSHOT - - org.jlab.clas - clas-logging - 13.4.1-SNAPSHOT - org.jlab.clas clas-utils diff --git a/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/AnalysisEngine.java b/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/AnalysisEngine.java index f49b5a1fc7..d357268c73 100644 --- a/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/AnalysisEngine.java +++ b/common-tools/clas-decay-tools/src/main/java/org/jlab/clas/decay/analysis/AnalysisEngine.java @@ -5,7 +5,6 @@ package org.jlab.clas.decay.analysis; import org.jlab.clas.swimtools.MagFieldsEngine; -import org.jlab.logging.DefaultLogger; /** * @@ -20,8 +19,6 @@ public AnalysisEngine() { public static void main(String[] args) { - DefaultLogger.debug(); - MagFieldsEngine enf = new MagFieldsEngine(); enf.init(); 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 5821f8df29..799b260188 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 @@ -17,8 +17,6 @@ import org.jlab.detector.helicity.HelicityState; import org.jlab.detector.pulse.ModeAHDC; -import org.jlab.logging.DefaultLogger; - import org.jlab.io.base.DataEvent; import org.jlab.io.evio.EvioDataEvent; import org.jlab.io.evio.EvioSource; @@ -59,7 +57,6 @@ public CLASDecoder4(boolean development){ hipoEvent = (HipoDataEvent) writer.createEvent(); String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); schemaFactory.initFromDirectory(dir); - DefaultLogger.debug(); } public CLASDecoder4(){ @@ -69,7 +66,6 @@ public CLASDecoder4(){ hipoEvent = (HipoDataEvent) writer.createEvent(); String dir = ClasUtilsFile.getResourceDir("CLAS12DIR", "etc/bankdefs/hipo4"); schemaFactory.initFromDirectory(dir); - DefaultLogger.debug(); } public SchemaFactory getSchemaFactory(){ diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/examples/RawEventViewer.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/examples/RawEventViewer.java index e3e02903cd..acddb64458 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/examples/RawEventViewer.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/examples/RawEventViewer.java @@ -20,7 +20,6 @@ import org.jlab.io.evio.EvioDataEvent; import org.jlab.io.task.DataSourceProcessorPane; import org.jlab.io.task.IDataEventListener; -import org.jlab.logging.DefaultLogger; /** * @@ -174,7 +173,6 @@ public void processShape(DetectorShape2D shape) { } public static void main(String[] args){ - DefaultLogger.debug(); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); RawEventViewer viewer = new RawEventViewer(); diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/swaps/SwapManager.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/swaps/SwapManager.java index 96a5c82c7e..f8acf56675 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/swaps/SwapManager.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/swaps/SwapManager.java @@ -10,7 +10,6 @@ import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.jnp.hipo4.data.SchemaFactory; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.groups.IndexedTable; /** @@ -267,8 +266,6 @@ private void initDetectors(List detectorNames) { public static void main(String[] args) { - DefaultLogger.debug(); - SwapManager man1 = new SwapManager(Arrays.asList("DC"),"08/10/2020","10/13/2024"); System.err.println(man1.banksToTables.get("DC::tot")); 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 d62a828cb7..5f5f902cb2 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,7 @@ import org.jlab.coda.jevio.EventWriter; import org.jlab.coda.jevio.EvioException; import org.jlab.coda.jevio.EvioReader; -import org.jlab.logging.DefaultLogger; +import org.jlab.logging.SplitLogger; /** * @@ -15,10 +15,9 @@ */ public class EvioCure { - private static final Logger LOGGER = Logger.getLogger(EvioCure.class.getName()); + private static final Logger LOGGER = SplitLogger.create(EvioCure.class.getName()); public static void main(String[] args) { - DefaultLogger.debug(); String inputFile = args[0]; String outputFile = args[1]; diff --git a/common-tools/clas-logging/src/main/java/org/jlab/logging/DefaultLogger.java b/common-tools/clas-logging/src/main/java/org/jlab/logging/DefaultLogger.java deleted file mode 100644 index e3ae831470..0000000000 --- a/common-tools/clas-logging/src/main/java/org/jlab/logging/DefaultLogger.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.jlab.logging; - -import java.io.IOException; -import java.io.InputStream; -import java.util.logging.Level; -import java.util.logging.LogManager; -import java.util.logging.Logger; - -/** - * Read a logging configuration and load it into the global log manager. - * - * @author Nick Tyler, UofSC - * - * Modified from hps-java logging - * @author Jeremy McCormick, SLAC - */ -public class DefaultLogger { - - private static void init(String resource) { - // if already set, don't override - if (System.getProperty("java.util.logging.config.file") == null) { - InputStream inputStream = DefaultLogger.class.getResourceAsStream(resource); - try { - LogManager.getLogManager().readConfiguration(inputStream); - Logger.getLogger(DefaultLogger.class.getName()).log(Level.INFO, "Reading logging properties from org/jlab/logging/{0}", resource); - } catch (SecurityException | IOException e) { - throw new RuntimeException("Initialization of default logging configuration failed.", e); - } - } - } - - private static void init(Level level){ - init(level.toString().toLowerCase()+".properties"); - } - - public static void initialize() { - init(Level.FINE); - } - - public static void initialize(Level level) { - init(level); - } - - public static void debug() { - init(Level.FINE); - } - - public static void silent() { - init("silent.properties"); - } - - public static void main(String[] args) { - DefaultLogger.initialize(); - Logger.getLogger(DefaultLogger.class.getName()).log(Level.INFO,"Info"); - Logger.getLogger(DefaultLogger.class.getName()).log(Level.WARNING,"Warning"); - Logger.getLogger(DefaultLogger.class.getName()).log(Level.SEVERE,"Severe"); - } -} 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/SplitLogger.java index a41a29417b..51492b29c3 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/SplitLogger.java @@ -81,8 +81,19 @@ public synchronized void publish(java.util.logging.LogRecord record) { logger.addHandler(errorHandler); // set the log level, since the handlers need to know it too - Level thisLevel = logger.getLevel(); - if(thisLevel==null) { // caller did not set log level, use parent + Level thisLevel = null; + // if a system property named '.level' is set, use that + 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 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(); if(thisLevel==null) { // should never happen, but just in case, fall back to default and complain directly to `stderr` thisLevel = Level.INFO; 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/SplitLoggerConfig.java new file mode 100644 index 0000000000..515b3a9a21 --- /dev/null +++ b/common-tools/clas-logging/src/main/java/org/jlab/logging/SplitLoggerConfig.java @@ -0,0 +1,36 @@ +package org.jlab.logging; + +import java.util.logging.Level; + +/** Configuration singleton for {@code SplitLogger} */ +public enum SplitLoggerConfig { + + /** singleton instance */ + INSTANCE; + + private volatile Level defaultLevel = Level.INFO; + 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. + * @param level the log level + */ + public synchronized void setDefaultLevel(Level level) { + this.defaultLevel = 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. + */ + public Level getDefaultLevel() { + return this.defaultLevel; + } + + /** @return true if {@code setDefaultLevel} was called */ + public boolean defaultLevelWasSet() { + return this.calledSetDefaultLevel; + } + +} diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/fine.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/fine.properties deleted file mode 100644 index 533518ce90..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/fine.properties +++ /dev/null @@ -1,29 +0,0 @@ -# -# Global logging configuration for clas -# Nick Tyler, UofSC -# -# Modified from hps-java logging -# Jeremy McCormick, SLAC -# - -# default global level -.level = FINE - -# default handler which prints to console -handlers = java.util.logging.ConsoleHandler - -# Old detailed format -# prints timestamp (1$), level (4$), source ($2), message (5$), and (optionally) an exception (6$). -#java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tT [%4$s] %2$s :: %5$s%6$s%n - -# New simplified format -# MESSAGE -java.util.logging.SimpleFormatter.format = %5$s%6$s%n - -# configure the console handler -java.util.logging.ConsoleHandler.level = ALL -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - - - - diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/finer.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/finer.properties deleted file mode 100644 index 6b4ae22e3c..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/finer.properties +++ /dev/null @@ -1,29 +0,0 @@ -# -# Global logging configuration for clas -# Nick Tyler, UofSC -# -# Modified from hps-java logging -# Jeremy McCormick, SLAC -# - -# default global level -.level = FINER - -# default handler which prints to console -handlers = java.util.logging.ConsoleHandler - -# Old detailed format -# prints timestamp (1$), level (4$), source ($2), message (5$), and (optionally) an exception (6$). -#java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tT [%4$s] %2$s :: %5$s%6$s%n - -# New simplified format -# MESSAGE -java.util.logging.SimpleFormatter.format = %5$s%6$s%n - -# configure the console handler -java.util.logging.ConsoleHandler.level = ALL -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - - - - diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/finest.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/finest.properties deleted file mode 100644 index 42fe7a21c0..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/finest.properties +++ /dev/null @@ -1,29 +0,0 @@ -# -# Global logging configuration for clas -# Nick Tyler, UofSC -# -# Modified from hps-java logging -# Jeremy McCormick, SLAC -# - -# default global level -.level = FINEST - -# default handler which prints to console -handlers = java.util.logging.ConsoleHandler - -# Old detailed format -# prints timestamp (1$), level (4$), source ($2), message (5$), and (optionally) an exception (6$). -#java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tT [%4$s] %2$s :: %5$s%6$s%n - -# New simplified format -# MESSAGE -java.util.logging.SimpleFormatter.format = %5$s%6$s%n - -# configure the console handler -java.util.logging.ConsoleHandler.level = ALL -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - - - - diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/info.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/info.properties deleted file mode 100644 index 3f312f06ae..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/info.properties +++ /dev/null @@ -1,29 +0,0 @@ -# -# Global logging configuration for clas -# Nick Tyler, UofSC -# -# Modified from hps-java logging -# Jeremy McCormick, SLAC -# - -# default global level -.level = INFO - -# default handler which prints to console -handlers = java.util.logging.ConsoleHandler - -# Old detailed format -# prints timestamp (1$), level (4$), source ($2), message (5$), and (optionally) an exception (6$). -#java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tT [%4$s] %2$s :: %5$s%6$s%n - -# New simplified format -# MESSAGE -java.util.logging.SimpleFormatter.format = %5$s%6$s%n - -# configure the console handler -java.util.logging.ConsoleHandler.level = ALL -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - - - - diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/silent.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/silent.properties deleted file mode 100644 index 508704d952..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/silent.properties +++ /dev/null @@ -1,51 +0,0 @@ -# -# Global logging configuration for clas -# Nick Tyler, UofSC -# -# Modified from hps-java logging -# Jeremy McCormick, SLAC -# - -# default global level -.level = WARNING - -# default handler which prints to console -handlers = java.util.logging.ConsoleHandler - -# Old detailed format -# prints timestamp (1$), level (4$), source ($2), message (5$), and (optionally) an exception (6$). -#java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tT [%4$s] %2$s :: %5$s%6$s%n - -# New simplified format -# [LEVEL][LOGGER] MESSAGE -java.util.logging.SimpleFormatter.format = %1$tT [%4$s] %5$s%6$s%n - -# configure the console handler -java.util.logging.ConsoleHandler.level = ALL -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - -# turn minuit logging off -org.freehep.math.minuit.level = OFF - -# calibration logging -org.jlab.detector.calib.level = OFF - -# Reconstruction level -org.jlab.clas.reco.level = OFF - -# Hipo io level -org.jlab.io.hipo = OFF - -# Magnetic Field level -cnuphys.magfield.level = OFF - -# Log level for each service -org.jlab.service.ec.level = OFF -org.jlab.service.eb.level = OFF -org.jlab.rec.cvt.services.level = OFF -org.jlab.service.htcc.level = OFF -org.jlab.rec.dc.level = OFF - - - - diff --git a/common-tools/clas-logging/src/main/resources/org/jlab/logging/warning.properties b/common-tools/clas-logging/src/main/resources/org/jlab/logging/warning.properties deleted file mode 100644 index 2254d698cd..0000000000 --- a/common-tools/clas-logging/src/main/resources/org/jlab/logging/warning.properties +++ /dev/null @@ -1,29 +0,0 @@ -# -# Global logging configuration for clas -# Nick Tyler, UofSC -# -# Modified from hps-java logging -# Jeremy McCormick, SLAC -# - -# default global level -.level = WARNING - -# default handler which prints to console -handlers = java.util.logging.ConsoleHandler - -# Old detailed format -# prints timestamp (1$), level (4$), source ($2), message (5$), and (optionally) an exception (6$). -#java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tT [%4$s] %2$s :: %5$s%6$s%n - -# New simplified format -# MESSAGE -java.util.logging.SimpleFormatter.format = %5$s%6$s%n - -# configure the console handler -java.util.logging.ConsoleHandler.level = ALL -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - - - - diff --git a/common-tools/clas-reco/pom.xml b/common-tools/clas-reco/pom.xml index a262ce45af..af09f0d37c 100644 --- a/common-tools/clas-reco/pom.xml +++ b/common-tools/clas-reco/pom.xml @@ -84,6 +84,12 @@ 13.4.1-SNAPSHOT + + org.jlab.clas + clas-logging + 13.4.1-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 71c9a8d1ea..0e9d61551f 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,7 @@ import java.util.Arrays; import org.jlab.jnp.hipo4.data.SchemaFactory; import org.json.JSONObject; -import org.jlab.logging.DefaultLogger; +import org.jlab.logging.SplitLogger; import org.jlab.utils.ClaraYaml; /** @@ -30,7 +30,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 = Logger.getLogger(EngineProcessor.class.getPackage().getName()); + private static final Logger LOGGER = SplitLogger.create(EngineProcessor.class.getPackage().getName()); private boolean updateDictionary = true; private SchemaFactory banksToKeep = null; private final List schemaExempt = Arrays.asList("RUN::config","DC::tdc"); @@ -365,6 +365,7 @@ public static void main(String[] args){ parser.addOption("-H","0","restream helicity"); parser.parse(args); + parser.syncLogLevel(LOGGER); List services = parser.getInputList(); 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 c8533f20e8..780e031317 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 @@ -8,8 +8,10 @@ import java.util.Properties; import java.util.Set; import java.util.TreeMap; +import java.util.logging.Logger; import java.util.logging.Level; -import org.jlab.logging.DefaultLogger; +import org.jlab.logging.SplitLogger; +import org.jlab.logging.SplitLoggerConfig; /** * @@ -25,8 +27,7 @@ public class OptionParser { private String program = "undefined"; private boolean requiresInputList = true; private String programDescription = ""; - private Level logLevel = Level.FINE; // default log level - private boolean usingExternalLogger = false; // if true, do not use `DefaultLogger` here + private Level logLevel = Level.INFO; // default log level public OptionParser(){ init(); @@ -191,8 +192,7 @@ else if(this.containsOptions(arguments,"-v","-version")==true){ private void setVerbosity(String level) { try { this.logLevel = Level.parse(level); - if (!usingExternalLogger) - DefaultLogger.initialize(this.logLevel); // do not do this if using SplitLogger externally, otherwise you get NO log printouts whatsoever + SplitLoggerConfig.INSTANCE.setDefaultLevel(this.logLevel); } catch (IllegalArgumentException e) { System.err.println("Invalid -l java.util.logging.Level: "+level); @@ -222,8 +222,23 @@ public Level getLogLevel() { return this.logLevel; } - public void useExternalLogger() { - this.usingExternalLogger = true; // FIXME: if we get rid of `DefaultLogger`, we can get rid of this kluge + /** + * Set the log level of a list of classes to your preferred level. + * Use this to override the user's choice of logging level for certain classes. + * @param level the log level + * @param classList string names of the classes + */ + public static void overrideLogLevel(String level, String... classList) { + for(var className : classList) + System.setProperty(className + ".level", level); + } + + /** + * Set the log level to be consistent with the level set by the user's {@code -l} option + * @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); } public static void main(String[] args){ diff --git a/reconstruction/alert/pom.xml b/reconstruction/alert/pom.xml index c339d2063d..c0961d69f6 100644 --- a/reconstruction/alert/pom.xml +++ b/reconstruction/alert/pom.xml @@ -56,12 +56,6 @@ 13.4.1-SNAPSHOT compile - - org.jlab.clas - clas-logging - 13.4.1-SNAPSHOT - test - org.jlab.clas clas-utils 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 f9ce42c9b0..292f5f57d2 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 @@ -5,7 +5,6 @@ import org.jlab.io.base.DataEvent; import org.jlab.detector.base.DetectorType; -import org.jlab.logging.DefaultLogger; import org.jlab.analysis.physics.TestEvent; import org.jlab.service.ahdc.AHDCEngine; import org.jlab.rec.ahdc.Mode; @@ -20,7 +19,6 @@ public class AHDCTest { @Test public void run() { System.setProperty("CLAS12DIR", "../../"); - DefaultLogger.debug(); DataEvent event = TestEvent.get(DetectorType.AHDC); diff --git a/reconstruction/alert/src/test/java/org/jlab/service/alert/ATOFTest.java b/reconstruction/alert/src/test/java/org/jlab/service/alert/ATOFTest.java index cd53cb33c6..e275fffc9c 100644 --- a/reconstruction/alert/src/test/java/org/jlab/service/alert/ATOFTest.java +++ b/reconstruction/alert/src/test/java/org/jlab/service/alert/ATOFTest.java @@ -5,7 +5,6 @@ import org.jlab.io.base.DataEvent; import org.jlab.detector.base.DetectorType; -import org.jlab.logging.DefaultLogger; import org.jlab.analysis.physics.TestEvent; import org.jlab.service.atof.ATOFEngine; @@ -17,7 +16,6 @@ public class ATOFTest { @Test public void run() { System.setProperty("CLAS12DIR", "../../"); - DefaultLogger.debug(); DataEvent event = TestEvent.get(DetectorType.ATOF); 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 dd14ef47c7..f925f3974e 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,7 @@ import org.jlab.groot.data.GraphErrors; import org.jlab.groot.graphics.EmbeddedCanvasTabbed; import org.jlab.groot.group.DataGroup; -import org.jlab.logging.DefaultLogger; +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 +94,7 @@ public class Geometry { private static boolean LOADED; - private final static Logger LOGGER = Logger.getLogger(Geometry.class.getName()); + private final static Logger LOGGER = SplitLogger.create(Geometry.class.getName()); // private constructor for a singleton @@ -513,13 +513,13 @@ public static DataGroup compareStrips(List geo1, List geo2, Poin * @param args */ public static void main(String[] args) { - DefaultLogger.debug(); OptionParser parser = new OptionParser("Compare CVT geometries from two variations"); parser.setRequiresInputList(false); parser.addOption("-var1", "default", "geometry variation 1"); parser.addOption("-var2", "rgb_spring2019", "geometry variation 2"); parser.addOption("-offset", "0", "compensate for the average offset of SVT-R1 strip upstream end (1)"); parser.parse(args); + parser.syncLogLevel(LOGGER); int run = 11; String var1 = parser.getOption("-var1").stringValue(); 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 6bbe902913..8fea0c57de 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 @@ -12,7 +12,6 @@ import org.jlab.analysis.math.ClasMath; import org.jlab.clas.swimtools.MagFieldsEngine; import org.jlab.detector.base.DetectorType; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.CLASResources; /** @@ -24,7 +23,6 @@ public class CVTReconstructionTest { @Test public void testCVTReconstruction() { - DefaultLogger.debug(); System.setProperty("CLAS12DIR", "../../"); 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..2f0add9508 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,6 +4,7 @@ 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; @@ -39,7 +40,7 @@ public class DCEngine extends ReconstructionEngine { private String dafChi2Cut = null; private String dafAnnealingFactorsTB = null; - public static final Logger LOGGER = Logger.getLogger(ReconstructionEngine.class.getName()); + public static final Logger LOGGER = SplitLogger.create(ReconstructionEngine.class.getName()); public DCEngine(String name) { 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 1a2d7002e1..300ed153c1 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 @@ -26,7 +26,6 @@ import org.jlab.io.base.DataEvent; import org.jlab.io.task.DataSourceProcessorPane; import org.jlab.io.task.IDataEventListener; -import org.jlab.logging.DefaultLogger; import org.jlab.rec.dc.banks.HitReader; import org.jlab.rec.dc.cluster.ClusterCleanerUtilities; import org.jlab.rec.dc.cluster.ClusterFinder; @@ -420,8 +419,6 @@ public void saveHistosToFile(String fileName) { public static void main(String[] args) { - DefaultLogger.debug(); - JFrame frame = new JFrame("DC ANALYSIS"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Dimension screensize = null; @@ -440,6 +437,7 @@ public static void main(String[] args) { OptionParser parser = new OptionParser("dclayereffs-anal"); parser.addOption("-i",""); parser.parse(args); + parser.syncLogLevel(LOGGER); if(parser.hasOption("-i")==true){ String inputFile = parser.getOption("-i").stringValue(); 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 cfcf56a608..888d26197c 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 @@ -11,7 +11,6 @@ import org.jlab.clas.swimtools.MagFieldsEngine; import org.jlab.detector.base.DetectorType; -import org.jlab.logging.DefaultLogger; import org.jlab.utils.CLASResources; /** @@ -23,8 +22,6 @@ public class DCReconstructionTest { @Test public void testDCReconstruction() { - DefaultLogger.debug(); - System.setProperty("CLAS12DIR", "../../"); String mapDir = CLASResources.getResourcePath("etc")+"/data/magfield"; diff --git a/reconstruction/eb/pom.xml b/reconstruction/eb/pom.xml index 74544f1124..60b161a05d 100644 --- a/reconstruction/eb/pom.xml +++ b/reconstruction/eb/pom.xml @@ -45,12 +45,6 @@ 13.4.1-SNAPSHOT test - - org.jlab.clas - clas-logging - 13.4.1-SNAPSHOT - test - org.jlab.clas clas-detector 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 e35a1dec27..64f1dcd6cc 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 @@ -11,7 +11,6 @@ import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; -import org.jlab.logging.DefaultLogger; import org.jlab.service.dc.DCHBEngine; import org.jlab.service.dc.DCTBEngine; import org.jlab.service.ec.ECEngine; @@ -108,7 +107,6 @@ public boolean hasValidRefs(DataEvent ev, @Test public void testEBReconstruction() { - DefaultLogger.debug(); System.setProperty("CLAS12DIR", "../../"); DataEvent photonEvent = TestEvent.get(DetectorType.ECAL); diff --git a/reconstruction/ec/pom.xml b/reconstruction/ec/pom.xml index b0e3509b9a..4f561157ea 100644 --- a/reconstruction/ec/pom.xml +++ b/reconstruction/ec/pom.xml @@ -29,12 +29,6 @@ 13.4.1-SNAPSHOT test - - org.jlab.clas - clas-logging - 13.4.1-SNAPSHOT - test - org.jlab.clas clas-reco diff --git a/reconstruction/ec/src/test/java/org/jlab/service/ec/ECReconstructionTest.java b/reconstruction/ec/src/test/java/org/jlab/service/ec/ECReconstructionTest.java index 503b6cf226..ab55de260f 100644 --- a/reconstruction/ec/src/test/java/org/jlab/service/ec/ECReconstructionTest.java +++ b/reconstruction/ec/src/test/java/org/jlab/service/ec/ECReconstructionTest.java @@ -7,7 +7,6 @@ import org.jlab.analysis.physics.TestEvent; import org.jlab.detector.base.DetectorType; -import org.jlab.logging.DefaultLogger; /** * @@ -17,7 +16,6 @@ public class ECReconstructionTest { @Test public void testECReconstruction() { - DefaultLogger.debug(); System.setProperty("CLAS12DIR", "../../"); From 53d05e66dac074af6a8696724132be755bd184fb Mon Sep 17 00:00:00 2001 From: Christopher Dilks Date: Sat, 22 Nov 2025 21:01:13 -0500 Subject: [PATCH 17/17] build(deps): disable clasweb registry for dependabot (#948) - see https://github.com/JeffersonLab/coatjava/issues/915 --- .github/dependabot.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bf5bb420ac..a98a416e9e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,21 +1,18 @@ version: 2 -registries: - clas12maven: - type: maven-repository - url: https://clasweb.jlab.org/clas12maven - jhep: - type: maven-repository - url: https://clasweb.jlab.org/jhep/maven +# registries: FIXME: disabled, see +# clas12maven: +# type: maven-repository +# url: https://clasweb.jlab.org/.clas12maven +# jhep: +# type: maven-repository +# url: https://clasweb.jlab.org/.jhep/maven updates: - package-ecosystem: "maven" directory: "/" schedule: interval: "weekly" - registries: - - clas12maven - - jhep ignore: - dependency-name: "org.jlab:groot" # since version numbers are not in order - dependency-name: "org.ejml:ejml-simple" # keep version the same as `j4ml:j4ml-clas12:jar:0.9-SNAPSHOT`; see pull requests #636 and #632