1. 09 May, 2026 2 commits
    • Andrey Filippov's avatar
      Fix DoubleFHT header and add ImageJ attribution to both FHT and GaussianBlur · bd321050
      Andrey Filippov authored
      DoubleFHT.java had a copy-paste error in its GPL header (wrong description
      and wrong filename from MatchSimulatedPattern). Fixed both and added
      attribution to the ImageJ FHT.java source (Wayne Rasband, NIH, public domain).
      
      DoubleGaussianBlur.java already had an in-class attribution comment; added
      a matching note in the GPL header for consistency.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      bd321050
    • Andrey Filippov's avatar
      Add GPL headers to 115 Java files missing them · e77ff2a8
      Andrey Filippov authored
      All Elphel-authored files in the cuas, ims, mcp, gpu, orthomosaic,
      tileprocessor, vegetation, calibration, cameras, common, correction,
      dct, readers, and x3d packages. Dates derived from git log (first and
      last commit year); mtimes restored with git-restore-mtime before
      generating copyright year ranges.
      
      Third-party files excluded: epfl/Differentials_.java (EPFL code),
      gpu/JCuda_ImageJ_Example_Plugin.java (JCuda example, (c) Marco Hutter).
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      e77ff2a8
  2. 08 May, 2026 3 commits
    • Andrey Filippov's avatar
      Claude: Demote INDX_VX/VY/STRENGTH/FRAC to method-local constants · 0868da8a
      Andrey Filippov authored
      These four constants described the layout of TDCorrTile.getMismatchVector()
      return values and had no business being class-level statics in CuasMotion.
      Moved to local scope in the two methods that use them: getTargetsFromCorr2d
      and refineMotionVectors.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      0868da8a
    • Andrey Filippov's avatar
      Claude: Remove dead code from cuas package + fix targetsAnalyzeMCP · 115acc78
      Andrey Filippov authored
      Dead method/constant removal (21 methods across 5 files):
      - CuasMotion: addMotionVectors, clearFailByStrongerNeighbor, cloneTargetsSequence,
        filterByHorizon, filterMotionScans, findMatchingTarget, getKeyFrameVelocityScale,
        getTargetImages, getTargetsFromHyperAugment_2025, getVectorFieldHyper, showPxPyDs,
        subtractTargetSequence, trimSuffix; constants INDX_SPEED, INDX_CONFIDENCE, VF_TOP_TITLES
      - CorrectionFPN: calculateFPN_old
      - CuasCenterLma: getAverageRoll
      - CuasMotionLMA: applyWindowToData, copyMotion, getRR0, getFullParametersVector
      - CuasTile: setParentIndex, getParentIndex (were already commented out)
      
      targetsAnalyzeMCP fixes:
      - Correct PAR constants (add PAR_PXYAR=-2, shift others)
      - params array now accepts strings ("pxy","pxyar","vpxy","upxy", or LMA_TITLES names)
        in addition to integer indices; default remains ["pxy"]
      - Add missing PAR_PXYAR case (px, py, a, rmse, r)
      - Add amplitude to PAR_PXY case
      - Default case uses LMA_TITLES[npar] key instead of String.valueOf(npar)
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      115acc78
    • Andrey Filippov's avatar
      debugging · 5defee61
      Andrey Filippov authored
      5defee61
  3. 07 May, 2026 7 commits
    • Andrey Filippov's avatar
      Claude: Add temporal LPF to shiftAndRenderAccumulate and refineMotionVectors inputs · aac34c6a
      Andrey Filippov authored
      - Extract precorr_ra, accum_ra, cuas_gaussian_ra in locateAndFreezeTargetsMulti
      - Compute fpixels_accum (LPF with cuas_accum_ra) for shiftAndRenderAccumulate in both loops
      - Compute fpixels_refine (LPF with cuas_precorr_ra) for refineMotionVectors
      - Both use Gaussian or running-average depending on cuas_gaussian_ra flag
      - When ra==1, LPF is a no-op (passes fpixels_tum through unchanged)
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      aac34c6a
    • Andrey Filippov's avatar
      Claude: Fix NPE in refineMotionVectors debug CORR2D visualization · 7f0ce136
      Andrey Filippov authored
      corr_partial_dbg() NPEs on null layers when sequences are skipped
      (has_centered=false or no valid frame pairs). Fill null slots with
      empty double[num_tiles][] before calling the visualizer.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      7f0ce136
    • Andrey Filippov's avatar
      Claude: FAIL_PENDING refactoring — migrate first loop from motion_sequence to target_sequence_multi · 1dfb402e
      Andrey Filippov authored
      - Add FAIL_PENDING=-1 sentinel constant to CuasMotionLMA
      - Add initFromMotionSequence(): clones motion entries into target_sequence_multi as sentinels
        (RSLT_FAIL=FAIL_PENDING, RSLT_CENTERED=CENTERED_NO, RSLT_QSCORE=initial RSLT_MSCORE)
      - Add syncMotionScoreToSentinels(): keeps sentinel QSCORE current after each getEffectiveStrengthMV
      - Decouple use_motion/select_new flags in filter5Targets from motion_sequence==null
      - Add motion==null paths in filter5Targets: prohibit setup and is-max ranking for FAIL_PENDING sentinels
      - Extend filter5Targets marking step to cover FAIL_PENDING sentinels (use_motion=true, motion==null)
      - Update extendMotionScan center-detection to accept FAIL_PENDING as valid center state
      - First loop in locateAndFreezeTargetsMulti: call initFromMotionSequence, syncMotionScoreToSentinels;
        pass null to filter5Targets; use applyFilter(target_sequence_multi); use getRemain(target_sequence_multi)
      - getRemain(target_sequence_multi): count FAIL_PENDING+CENTERED_NO in num_noncentered
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      1dfb402e
    • Andrey Filippov's avatar
      Claude: Fix filter5Targets select_new silently forced to false when motion_sequence=null · 70e96522
      Andrey Filippov authored
      Line 8734 was: select_new = (motion_sequence != null) ? select_new_in : false
      This caused pass 2 (filter5(null, tsm, false, true, ...)) to enter the
      !select_new path — finding best existing good tiles instead of untested
      non-centered tiles — so nothing was ever selected and the centered-mode
      loop was a no-op.
      
      Fix: decouple select_new from motion_sequence null-check; only use_motion
      is forced false when motion_sequence is null.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      70e96522
    • Andrey Filippov's avatar
      Tested code that Claude fixed, minor additional fix. Still not fully · c9316c55
      Andrey Filippov authored
      operational because of filter5Targets().
      c9316c55
    • Andrey Filippov's avatar
      Claude: Fix correlatePairs to use per-tile motion-tracking TpTask centers · 4b7711ef
      Andrey Filippov authored
      Add targets_mv / frame_center_mv / corr_offset_mv overloads to
      correlatePairs() and correlatePair().  When targets_mv is non-null,
      GpuQuad.setRectilinearMovingTasks() generates per-tile TpTask centers
      that follow the target at each frame (cx0 + vx*offset_scale), so the
      GPU correlates tiles centered on the moving object and the result is the
      residual velocity rather than the full VX displacement.
      
      Callers that don't need this pass through the old uniform-grid overload
      unchanged.  Also reverts the wrong "fixed-destination / shifted-read"
      masking edit from the previous session; the masking was already correct
      (mask tracks the target per frame) before that edit.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      4b7711ef
    • Andrey Filippov's avatar
      Claude: refineMotionVectors() — improved debug images · a57f2dfc
      Andrey Filippov authored
      - Masked frames: replace single-frame display with full fmin..fmax stack
        (scene_titles used as slice labels; scroll to watch target stay in place)
      - Source frame display removed (not needed alongside masked stack)
      - Single-tile corr2d block removed; replaced by full CORR2D multi-slice image
        after the nseq loop — one slice per keyframe, same tiled layout as *CORR2D.tiff,
        slice-labeled from scene_titles, uses corr_border_contrast from CLTParameters
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      a57f2dfc
  4. 06 May, 2026 3 commits
  5. 05 May, 2026 1 commit
  6. 04 May, 2026 3 commits
  7. 03 May, 2026 1 commit
  8. 01 May, 2026 3 commits
  9. 30 Apr, 2026 4 commits
  10. 28 Apr, 2026 1 commit
  11. 26 Apr, 2026 1 commit
  12. 25 Apr, 2026 5 commits
  13. 23 Apr, 2026 1 commit
  14. 19 Apr, 2026 1 commit
  15. 17 Apr, 2026 3 commits
    • Andrey Filippov's avatar
      Remove attic/CLAUDE/bin scripts from main repo (moved to attic/codex-claude) · b3b6fdf5
      Andrey Filippov authored
      These files belong in the private codex-claude repo, not in imagej-elphel.
      Reverts the file additions from 6821f865; the scripts are preserved on disk
      in attic/CLAUDE/bin/ and committed to the codex-claude private repo.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      b3b6fdf5
    • Andrey Filippov's avatar
      Add attic/CLAUDE/bin scripts and Gemini integration · 6821f865
      Andrey Filippov authored
      - ask_gemini.sh: non-interactive Gemini CLI wrapper (-f for context
        files, -m flash/pro model shorthand, auto @-reference for PNG/PDF)
      - dual-opinion.sh: extended with -g/-G flags for optional Gemini third
        agent; produces 4-section "Triple Opinion Synthesis" when enabled
      - ask_claude.sh, claude_daemon.sh, dual-opinion.sh, export scripts,
        backfill_center_ims.py: force-tracked (attic/ is gitignored globally,
        git add -f used to persist these helper scripts in the repo)
      - gemini.md: Gemini team integration instructions
      
      Gemini CLI setup: npm install -g @google/gemini-cli, GEMINI_API_KEY in
      ~/.bashrc. Default model gemini-2.5-flash; Pro requires billing enabled
      on the Google Cloud project backing the API key.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      6821f865
    • Andrey Filippov's avatar
      UAS projection fixes: center LLA persistence, ATR sign, logging · 1cece288
      Andrey Filippov authored
      - Cuas.createCenterClt(): average LLA from sequence scenes and save to
        center IMS XML file (did_ins_2 only, no EventLogger dependency)
      - QuadCLTCPU.restoreCenterClt(): load averaged LLA from center IMS file
        so addUasData() has a valid camera reference position
      - CuasRanging.addUasData(): log camera ATR, LLA, uas_home_alt, ned_corr
        before per-sequence loop; add cam_az/cam_tilt/cam_roll columns to TSV
      - UasLogReader: log ATR and LLA values when set; add getCameraLLA(),
        getUasHomeAlt(), getNedCorr() accessors
      - TwoQuadCLT: add comment explaining deferred setCameraLLA() design
      - CuasMotion: log UAS tile count and px/py/range per sequence
      
      Root cause found: camera_atr[0] (azimuth) in .list file is the
      ErsCorrection Y-frame-rotation angle, not compass bearing — they have
      opposite signs. Rule: az_list = -(compass_bearing_rad). Confirmed by
      comparison with working Eagle Mountain 2025 data (+2.7595 for SSW camera).
      Calibrated Latvia value: 2.0396, 0.0702, 0.0.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      1cece288
  16. 16 Apr, 2026 1 commit