Skip to content

Support ingesting ACA L0 image telemetry into cheta archive#291

Merged
taldcroft merged 20 commits into
masterfrom
aca-images-telemetry
Jul 6, 2026
Merged

Support ingesting ACA L0 image telemetry into cheta archive#291
taldcroft merged 20 commits into
masterfrom
aca-images-telemetry

Conversation

@taldcroft

@taldcroft taldcroft commented Jun 7, 2026

Copy link
Copy Markdown
Member

Description

This is a long-time idea to ingest ACA L0 image telemetry into the cheta archive. Carrying out analysis for the Sampled Background patch has required heavy use of large volumes ACA pixel data, so this idea has become a higher priority.

The data are maintained as a separate content type by slot since each slot is independent in terms of time sampling. Only readouts with complete 8x8 images are ingested, starting from just before 2022:305. This coincides approximately with the start of always commanding 8x8 for all guide and acq stars.

This patch takes the L0 data directly from the mica ACA L0 archive instead of re-downloading it from the CXC archive. To keep cheta data most up to date it might be useful to have mica ACA L0 run before cheta, but mostly if the user cares about the most recent data they should be using MAUDE.

Follow-on PRs in chandra_aca make this more convenient by reassembling the per-slot MSIDs into the usual table of L0 image rows.

Promotion process

On HEAD as aca, copy the data and set up links. This can be done prior to ska3-flight promotion since cheta only knows about content types in the filetypes.dat file that is bundled in the installed package.

rsync -av /data/baffin/tom/data-cheta-aca0-pr291/data/aca? \
  /proj/sot/ska/data/eng_archive/data/ [--dry-run]
rsync -av /data/baffin/tom/data-cheta-aca0-pr291/sync/aca? \
  /proj/sot/ska/data/eng_archive/sync/ [--dry-run]
cd /proj/sot/ska/data/eng_archive/1999/data
ln -s ../../data/aca? ./

On GRETA as sot:

rsync -av <user>@kady:/proj/sot/ska/data/eng_archive/data/aca? \
  /proj/sot/ska/data/eng_archive/data/ [--dry-run]
cd /proj/sot/ska/data/eng_archive/1999/data
ln -s ../../data/aca? ./

Clean-up (for @taldcroft)

After ska3 release is completed and first automated updates are successful:

  • Remove dev cheta cron job on kady
  • Update ska cron tasks sheet
  • rm -rf /data/baffin/tom/data-cheta-aca0-pr291
  • rm -rf /export/tom/cheta-aca0-pr291

Archive creation on HEAD

This creates an archive that contains data starting at about 2022:305.

cd ~/git/cheta
mkdir data
mkdir 1999; cd 1999; ln -s ../data data; cd ..
export ENG_ARCHIVE=$PWD
python -m cheta.update_archive --date-now=2023:010 --date-start=2023:001 --create --content=ACA
python -m cheta.update_archive --content=ACA --date-start=2023:001 >& run.log &

Create cheta_sync archive

python -m cheta.update_server_sync --content=aca0 --content=aca1 --content=aca2 --content=aca3 --date-start=-60d
python -m cheta.update_server_sync --content=aca4 --content=aca5 --content=aca6 --content=aca7 --date-start=-60d

Update cheta_sync archive

python -m cheta.update_server_sync --content=aca0 --content=aca1 --content=aca2 --content=aca3 
python -m cheta.update_server_sync --content=aca4 --content=aca5 --content=aca6 --content=aca7

Interface impacts

Adds 280 new MSIDs to the cheta telemetry archive providing ACA image telemetry starting around 2022:305. The new data files currently require about 14 Gb of disk space.

Testing

Unit tests

  • Mac (using flight cheta archive, not the new one with ACA L0 data included)
(ska3-dev) ➜  cheta git:(aca-images-telemetry) git rev-parse --short HEAD
94b5fa3
(ska3-dev) ➜  cheta git:(aca-images-telemetry) pytest
========================================= test session starts ==========================================
platform darwin -- Python 3.13.11, pytest-9.0.2, pluggy-1.6.0
rootdir: /Users/aldcroft/git
configfile: pytest.ini
plugins: anyio-4.12.1, timeout-2.4.0, doctestplus-1.7.1
collected 204 items                                                                                    

cheta/tests/test_comps.py ..............s....................................................... [ 34%]
                                                                                                 [ 34%]
cheta/tests/test_data_source.py ...........                                                      [ 39%]
cheta/tests/test_fetch.py ..................................................                     [ 64%]
cheta/tests/test_intervals.py .........................                                          [ 76%]
cheta/tests/test_orbit.py .                                                                      [ 76%]
cheta/tests/test_remote_access.py ......                                                         [ 79%]
cheta/tests/test_sync.py ........                                                                [ 83%]
cheta/tests/test_units.py ...........                                                            [ 89%]
cheta/tests/test_units_reversed.py ...........                                                   [ 94%]
cheta/tests/test_utils.py ...........                                                            [100%]

============================== 203 passed, 1 skipped in 110.46s (0:01:50) ==============================

Independent check of unit tests by Jean - just run with the new ACA0 data in my local archive

  • OSX
(ska3-latest) flame:cheta jean$ git merge --ff origin/aca-images-telemetry
Already up to date.
(ska3-latest) flame:cheta jean$ git rev-parse HEAD
4612ec3ca2c0df019d8696b2088ead63219c8cb7
(ska3-latest) flame:cheta jean$ pytest
============================================================================================== test session starts ==============================================================================================
platform darwin -- Python 3.13.11, pytest-9.0.2, pluggy-1.6.0
rootdir: /Users/jean/git
configfile: pytest.ini
plugins: anyio-4.12.1, timeout-2.4.0
collected 204 items                                                                                                                                                                                             

cheta/tests/test_comps.py ..............s.......................................................                                                                                                          [ 34%]
cheta/tests/test_data_source.py ...........                                                                                                                                                               [ 39%]
cheta/tests/test_fetch.py ..................................................                                                                                                                              [ 64%]
cheta/tests/test_intervals.py .........................                                                                                                                                                   [ 76%]
cheta/tests/test_orbit.py .                                                                                                                                                                               [ 76%]
cheta/tests/test_remote_access.py ......                                                                                                                                                                  [ 79%]
cheta/tests/test_sync.py ........                                                                                                                                                                         [ 83%]
cheta/tests/test_units.py ...........                                                                                                                                                                     [ 89%]
cheta/tests/test_units_reversed.py ...........                                                                                                                                                            [ 94%]
cheta/tests/test_utils.py ...........                                                                                                                                                                     [100%]

=============================================================================================== warnings summary

Functional tests

Test cheta_sync locally

This assumes the same setup as above, running from git repo.

python -m cheta.update_archive --content=aca0 --truncate=2026:140
export SYNC_ROOT=https://icxc.cfa.harvard.edu/aspect/cheta/aca
python -m cheta.update_client_archive --sync-root=$SYNC_ROOT --content=aca0
# Then confirm that cheta telemetry times match corresponding 
# mica.aca_l0.get_slot_data() output.

Soak test in dev ska

Installed ska3-aca and ska3-flight to a newly created conda env in /export/tom/cheta-aca0-pr291:

conda install ska3-aca ska3-perl --override-channels -c https://icxc.cfa.harvard.edu/aspect/ska3-conda/flight
source /export/tom/cheta-aca0-pr291/bin/ska_envs.sh
cd $HOME/git/cheta
pip install --no-build-isolation .
# Set up $SKA/data and link to ACA L0 data, sync files in /data/baffin/tom/data-cheta-aca0-pr291/

Test run by hand:

env HDF5_USE_FILE_LOCKING=FALSE cheta_update_server_archive --data-root ${SKA}/data/eng_archive 
cheta_check_integrity --data-root ${SKA}/data/eng_archive
cheta_update_server_sync --sync-root ${SKA}/data/eng_archive

Install as a cron job running as aldcroft on kady and add to Ska cron jobs sheet:

# Cheta updates for PR 291 ACA L0 data soak test at 10:01am after mica at 9am
26 08 * * * /export/tom/cheta-aca0-pr291/bin/skare task_schedule3.pl -package cheta

Using and maintaining the ACA files prior to promotion

Install this version of cheta into a non-flight Ska environment with:

pip install --no-build-isolation git+https://github.com/sot/cheta.git@aca-images-telemetry

Update local Ska archive on a non-HEAD platform

Rsync the 14Gb of data files (dry-run first):

rsync -av kady:/data/baffin/tom/data-cheta-aca0-pr291/data/ $SKA/data/eng_archive/data/ [--dry-run]

Make some necessary soft links:

cd $SKA/data/eng_archive/1999/data
ln -s ../../data/aca? ./

Using on non-HEAD

It should just work in your dev Ska environment.

>>> from cheta import fetch_sci
>>> aca0_imgs = fetch_sci.Msid("aca0_imgtlm", "2026:001", "2026:002")
>>> len(aca0_imgs)
21022

You can sync new data with:

cheta_sync --sync-root=https://icxc.cfa.harvard.edu/aspect/cheta/aca \
  --content=aca0 --content=aca1 --content=aca2 --content=aca3 \
  --content=aca4 --content=aca5 --content=aca6 --content=aca7

Using on HEAD

On kady you can use a dev ska or the existing environment with this branch of cheta already installed:

source /export/tom/cheta-aca0-pr291/bin/ska_envs.sh

This will only have access to the ACA L0 cheta telemetry, so you need to tell it to find all the rest as well:

export ENG_ARCHIVE=/proj/sot/ska/data/eng_archive:$SKA/data/eng_archive

@taldcroft taldcroft marked this pull request as ready for review June 19, 2026 13:25
@taldcroft taldcroft requested review from javierggt and jeanconn June 19, 2026 13:25

@jeanconn jeanconn left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In addition to the TODO items in the description it seems like this should have at least a couple of new unit tests.

@taldcroft taldcroft requested a review from jeanconn June 26, 2026 14:15
@taldcroft

Copy link
Copy Markdown
Member Author

@jeanconn - I added a unit test and wrote a promotion plan. AFAIK this is fully ready now.

@taldcroft taldcroft changed the title Support ingesting ACA L0 telemetry into cheta archive Support ingesting ACA L0 image telemetry into cheta archive Jun 26, 2026
@taldcroft taldcroft requested a review from Copilot June 29, 2026 16:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds support for ingesting ACA Level-0 (L0) image telemetry into the cheta archive, sourcing the raw FITS files from the mica ACA L0 archive (per slot) and validating that cheta’s ingested values match mica’s L0 content. It also updates tooling/config to support the new content type and modernizes a few maintenance notes and lint settings.

Changes:

  • Add new ACA L0 content types (ACA0–ACA7) and an ACA-specific FITS retrieval path that copies files from the mica archive instead of using arc5gl.
  • Add an ACA L0 converter that normalizes per-slot columns and stores the 8×8 image telemetry in a compact archive-friendly representation.
  • Add validation artifacts (notebook + pytest coverage) and update ruff config / notes / sync behavior for content naming.

Reviewed changes

Copilot reviewed 12 out of 15 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
validate/PR291-aca-level0-telemetry.ipynb Notebook demonstrating ACA L0 ingest validity vs mica and unit handling.
setup.py Improves error messaging when ska_helpers is missing during setup.
ruff.toml Refines exclude list for linting specific dev/legacy files.
ruff-base.toml Updates Ruff target Python version and excludes .eggs.
NOTES/NOTES.add_derived Updates legacy instructions to modern python -m cheta... invocation.
NOTES/NOTES.add_content Adds a modern-reference note and updates archive update command usage.
cheta/update_server_sync.py Normalizes content names to lowercase when updating sync repos.
cheta/update_archive.py Implements ACA FITS acquisition via mica, adjusts stats handling, and updates ingest behavior for ACA gaps and N-D concatenation.
cheta/tests/test_fetch.py Adds tests validating cheta ACA L0 content against mica L0 content.
cheta/filetypes.dat Registers ACA0–ACA7 as new L0 content types.
cheta/derived/base.py Adds a brief docstring to DerivedParameter.__call__.
cheta/converters.py Adds ACA L0 conversion logic and type annotations for FITS conversion entrypoints.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread cheta/update_archive.py
Comment on lines 468 to +473
# Predeclare numpy arrays of correct type and sufficient size for accumulating results.
out = OrderedDict()
out = {}
out["index"] = np.ndarray((n_out,), dtype=np.int32)
out["n"] = np.ndarray((n_out,), dtype=np.int32)
out["val"] = np.ndarray((n_out,), dtype=msid_dtype)
if msid_is_1d:
out["val"] = np.ndarray((n_out,), dtype=msid_dtype)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good point that I had noticed earlier but forgot to fix. There is little practical value in the representative val sample and regenerating the archive would be a large effort. But I think one safe option is to change __len__ to use len(self.times), which is always defined.

Comment thread cheta/update_archive.py
Comment on lines 497 to +501
out["index"][i] = index
out["n"][i] = n_vals
out["val"][i] = vals[n_vals // 2]
if msid_is_numeric:
if msid_is_1d:
out["val"][i] = vals[n_vals // 2]
if msid_is_numeric and msid_is_1d:

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair point, but as before the out["val"] is not that useful.

Comment thread cheta/update_archive.py
Comment thread cheta/update_archive.py
Comment thread cheta/converters.py Outdated
Comment thread cheta/tests/test_fetch.py Outdated
taldcroft and others added 3 commits June 29, 2026 13:50
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
self.vals might not exist, e.g. for stats on a 2-d MSID.

@javierggt javierggt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are Claudio's findings.

  1. I verified this one
  2. No idea where it got the idea that "thousands" of files would pile up after an outage. I'm guessing this is not an issue, but you can decide.
  3. this is a code-duplication comment. Do we care?
  4. not sure I understood this one
  5. he's got a point
  6. also got a point
  7. 50/32 is everywhere in our codebase. I guess we ignore this one.

Findings (7, most-severe first)

1. Fetching 5min/daily stats for any ACA{n}_IMGTLM MSID crashes (correctness, confirmed)
calc_stats_vals stores only index+n for N-d MSIDs, but the stats loop at update_archive.py:300-311 still runs for IMGTLM, writing a real stats file. On read, fetch.py:_get_stat_data only sets self.vals when a means/val column exists — it doesn't here — so len(dat)/repr/plot/interpolation hit fetch.py:620 return len(self.vals)AttributeError. Propagates to synced clients via update_server_sync.

2. get_archive_files_aca ignores opt.max_arch_files (efficiency/memory)
update_archive.py:1406 returns every mica file in [datestart, datestop] uncapped, unlike the other two return paths (1325 slices [:opt.max_arch_files]; the arc5gl path is chunked with the comment "Don't allow arbitrary arch files at once because of memory issues"). On --create or after an outage, thousands of 8×8 image files get copied and held in dats for a single np.concatenate → OOM risk.

3. aca_converter re-implements generic_converter's prefix + quality tail (reuse)
converters.py:237-244 rebuilds the "all-False QUALITY of width len(colnames)" array and the "prefix every column except TIME/QUALITY" loop that generic_converter (converters.py:63-78) already provides. Two copies of the quality-width/prefix convention to keep in sync.

4. Three ACA special-cases keyed on two different attributes; IMGTLM kept by a fragile regex (altitude)
update_archive.py:1138 re.match(r"ACA\d_IMGTLM", colname) is the only thing keeping the N-d column in colnames. A second N-d ACA column or a rename is silently dropped (info-log only). Combined with the instrum=="ACA" branches for max_gap and file-fetch, ACA support is spread across 3 functions keyed on colname-regex vs instrum-string.

5. Eight hand-numbered aca0..aca7 lambdas (simplification)
converters.py:247-254. The slot is already in the content name (ACA0..ACA7), and convert() dispatches via getattr(MODULE, content.lower()). A single converter that parses int(content[-1]) removes the boilerplate and the mis-numbering risk (e.g. aca6 = lambda dat: aca_converter(dat, slot=5) would silently mislabel a slot). Note: E731 is ignored in ruff-base.toml, so this is not a lint violation.

6. test_aca_l0_content rebuilds all 8 slots on every parametrization (efficiency, test)
test_fetch.py:771-773 builds dat_micas for range(8) inside a test parametrized over 8 slots → 64 get_slot_data calls for 8 slots of coverage. The comprehension's slot also shadows the parametrized slot, making the intent ambiguous.

7. The packet↔DN constants 50/32 are hard-coded inline in both converter and test (reuse)
converters.py:231 and test_fetch.py:786 each re-encode the transform. Because the test hard-codes the exact inverse, it cannot catch a converter error in the same constants — both would have to be edited together, and a shared/named helper (ideally beside mica's forward decom) would prevent drift.

@jeanconn

jeanconn commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

For 1), I think the stat handling does still need work and a trivial test.

@jeanconn

jeanconn commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Regarding 4), what is "altitude"?

@javierggt

javierggt commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Regarding 4), what is "altitude"?

Ha! While you were asking, I was asking the same question, and this was the answer:

"Altitude" is about whether a change is made at the right level/depth in the code — the metaphor is how high up you're operating: down in the weeds patching one specific case, vs. up at the level of the general mechanism.

It comes from the review's angles. The question it asks: is this fix addressing the underlying thing, or is it a special case bolted onto shared infrastructure because the real fix would've been deeper? A pile of narrow special-cases is the classic "wrong altitude" smell — each one works, but the general mechanism that should have absorbed them didn't, so knowledge gets scattered and the next change has to touch all of them.

Finding #4 in your review is the altitude one. ACA support is added as three separate special-cases in three different functions, keyed on two different things:

  • update_archive.py:1138 — a regex re.match(r"ACA\d_IMGTLM", colname) to keep the N-d column
  • the instrum == "ACA" branch for max_gap
  • the instrum == "ACA" branch that routes to get_archive_files_aca

The "too low altitude" critique: instead of ACA-ness being a property the system reads (e.g. a flag on the filetype, or the converter declaring "this content has N-d columns"), it's re-detected ad hoc in each spot — one place by matching a colname string, others by matching the instrument string. So enabling/disabling/renaming means hunting down all three, and a second N-d column silently falls through the regex. A "higher altitude" fix would generalize the underlying mechanism once so those special-cases disappear.

Contrast: the actual N-d storage support in that same PR (calc_stats_vals's msid_is_1d branch, hstackconcatenate) is at the right altitude — it generalizes the shared code path rather than special-casing ACA. So altitude isn't "this is hacky," it's specifically "this belongs deeper in the shared mechanism than where it was put."

@taldcroft

Copy link
Copy Markdown
Member Author

@javierggt - Sorry, for some reason I had two commits locally from a few days ago that I had not pushed. Usually VS code shows those commits with a button to push / sync, but not this morning. Anyway, I just pushed. I think they fix (1) and (6) (more or less). Basically the 5min or daily stats for ACA images is useless, so this is mostly a "don't care" in the sense that there is no reason to every fetch that.

@taldcroft

Copy link
Copy Markdown
Member Author
  1. Fetching 5min/daily stats for any ACA{n}_IMGTLM MSID crashes (correctness, confirmed)
    calc_stats_vals stores only index+n for N-d MSIDs, but the stats loop at update_archive.py:300-311 still runs for IMGTLM, writing a real stats file. On read, fetch.py:_get_stat_data only sets self.vals when a means/val column exists — it doesn't here — so len(dat)/repr/plot/interpolation hit fetch.py:620 return len(self.vals) → AttributeError. Propagates to synced clients via update_server_sync.

With 4612ec3 this is no longer completely broken. But the real point is that I made a deliberate decision to not support statistics for IMGTLM. I actually spent more time than I should have initially trying to make it work, including mean rms percentiles. But having done that, I made the too-late realization that IMGTLM is the 10-bit value from 0-1023, so all of those values are almost completely useless. Only the scaled version of IMGTLM has any real meaning.

Upshot: we don't care and it doesn't even matter if the stat value for IMGTLM is completely broken as long as it doesn't get in the way of any other machinery like syncing. In my functional testing, that is the case.

@taldcroft

Copy link
Copy Markdown
Member Author
  1. get_archive_files_aca ignores opt.max_arch_files (efficiency/memory)
    update_archive.py:1406 returns every mica file in [datestart, datestop] uncapped, unlike the other two return paths (1325 slices [:opt.max_arch_files]; the arc5gl path is chunked with the comment "Don't allow arbitrary arch files at once because of memory issues"). On --create or after an outage, thousands of 8×8 image files get copied and held in dats for a single np.concatenate → OOM risk.

This is not an issue in practice. The initial -create process worked as expected and outages are never long enough to create a memory problem.

@taldcroft

Copy link
Copy Markdown
Member Author
  1. aca_converter re-implements generic_converter's prefix + quality tail (reuse)
    converters.py:237-244 rebuilds the "all-False QUALITY of width len(colnames)" array and the "prefix every column except TIME/QUALITY" loop that generic_converter (converters.py:63-78) already provides. Two copies of the quality-width/prefix convention to keep in sync.

This does sound like a code duplication comment, but I'm not going to fix it. The existing code works and is tested. Refactoring to avoid duplication is definitely not worth the effort here.

@taldcroft

Copy link
Copy Markdown
Member Author
  1. Three ACA special-cases keyed on two different attributes; IMGTLM kept by a fragile regex (altitude)
    update_archive.py:1138 re.match(r"ACA\d_IMGTLM", colname) is the only thing keeping the N-d column in colnames. A second N-d ACA column or a rename is silently dropped (info-log only). Combined with the instrum=="ACA" branches for max_gap and file-fetch, ACA support is spread across 3 functions keyed on colname-regex vs instrum-string.

I think this is arguing to introduce some abstractions at a higher level to avoid special-case code in low-level functions. I agree with the concept in principle, but in practice here it is just not worth the effort for this mostly-legacy and highly-specialized processing code.

@taldcroft

Copy link
Copy Markdown
Member Author
  1. Eight hand-numbered aca0..aca7 lambdas (simplification)
    converters.py:247-254. The slot is already in the content name (ACA0..ACA7), and convert() dispatches via getattr(MODULE, content.lower()). A single converter that parses int(content[-1]) removes the boilerplate and the mis-numbering risk (e.g. aca6 = lambda dat: aca_converter(dat, slot=5) would silently mislabel a slot). Note: E731 is ignored in ruff-base.toml, so this is not a lint violation.

A single converter that parses int(content[-1]) removes the boilerplate

This just seems completely off base and I don't understand it. The new code in this PR works within the expected API of this module.

mis-numbering risk (e.g. aca6 = lambda dat: aca_converter(dat, slot=5) would silently mislabel a slot).

That's just silly, the correct numbering is evident by inspection.

@taldcroft

Copy link
Copy Markdown
Member Author
  1. test_aca_l0_content rebuilds all 8 slots on every parametrization (efficiency, test)
    test_fetch.py:771-773 builds dat_micas for range(8) inside a test parametrized over 8 slots → 64 get_slot_data calls for 8 slots of coverage. The comprehension's slot also shadows the parametrized slot, making the intent ambiguous.

Valid point and fixed.

@taldcroft

Copy link
Copy Markdown
Member Author
  1. The packet↔DN constants 50/32 are hard-coded inline in both converter and test (reuse)
    converters.py:231 and test_fetch.py:786 each re-encode the transform. Because the test hard-codes the exact inverse, it cannot catch a converter error in the same constants — both would have to be edited together, and a shared/named helper (ideally beside mica's forward decom) would prevent drift.

As noted earlier, those magic numbers are fixed in the ACA spec and won't ever change. Hardcoding like this is consistent with practice in the rest of our codebase.

Comment thread cheta/converters.py
Comment thread cheta/converters.py
@taldcroft

Copy link
Copy Markdown
Member Author

@javierggt @jeanconn - I think I have addressed all the review comments thus far.

@taldcroft

Copy link
Copy Markdown
Member Author

I do think that some independent functional testing of the cheta image telemetry would be valuable.

@jeanconn

jeanconn commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

"I do think that some independent functional testing of the cheta image telemetry would be valuable." What did you have in mind? I was actually thinking that the chandra_aca kinda does some of the actual user-related testing.

@taldcroft

Copy link
Copy Markdown
Member Author

I just meant that somebody besides me pokes around at the data and tries using the functions here. No big agenda, but just actually use it.

@jeanconn

jeanconn commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

It is still a little weird that "Fetching 5min/daily stats for any ACA{n}_IMGTLM MSID crashes (correctness, confirmed)" gives us an Msid with times but no vals, but if we're comfortable with that, it seems passable to me.

@jeanconn

jeanconn commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Should this include a list of the common level0 columns in the fetch pseudo-msids docs page (or do we consider them not-pseudo-msids)?

@jeanconn

jeanconn commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

And in the testing "imgraw = aca_imgtlm.vals * (aca_imgscale.vals[:, None, None] / 32.0) - 50.0" suggested to me that maybe the 8 imgraw msids should be computed msids in cheta, but probably the chandra_aca PR fills in that gap.

@jeanconn jeanconn left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm satisfied in our discussion that we're going to define the interface to this as the follow-on chandra_aca PR. So no need to extend docs etc.

@taldcroft taldcroft merged commit 7af1ab2 into master Jul 6, 2026
2 checks passed
@taldcroft taldcroft deleted the aca-images-telemetry branch July 6, 2026 15:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants