Files
MiPi_TEST/__pycache__/explode_h5.cpython-312.pyc

89 lines
11 KiB
Plaintext
Raw Normal View History

2026-05-07 12:10:02 +01:00
<EFBFBD>
2m<32>i <00><01><><00>dZddlmZddlZddlZddlmZddlZddlZ ejdej<00>Z ddd<06>Z dd<07>Zdd<08>Zdd <09>dd
<EFBFBD>Z d dd <0B>Z dd <0C>Zd d <0A>Zedk(r<>ej*ddZesee<00>ej0d<01>eddk(r6eddD]Zede<19>d<12><03>eee<19><00><00>ej0d<01>eD]7Z eee<19>d<13><14>Zeee<19>j6<00>dee<1A><00>d<16><04><00>9yy#e$r'Zeee<19>j6<00>de<1E><00><03>YdZ[<1E>cdZ[wwxYw)!uX
explode_h5.py — split a Keysight segmented H5 file into per-segment CSVs.
When the scope is in segmented memory mode, a single :DISK:SAVE:WAVeform
call dumps all N segments into one .h5 file (much faster than saving N CSVs
sequentially). This script splits that file back into individual CSVs whose
names match the lp_ pattern that csv_preprocessor.analyze_lp_file() expects:
{ts}_lp_{cap_id}_seg{NNN}_{clk|dat}.csv
Usage:
python3 explode_h5.py <file.h5> [<file.h5> ...]
Or import explode() from this module.
Notes on Keysight Infiniium H5 layout:
The format used by :DISK:SAVE:WAVeform ... ,H5 nests waveform datasets
inside a "Waveforms"/"Channel N" group, with attributes XInc, XOrg,
YInc, YOrg, NumSegments, NumPoints, etc. We probe the structure
dynamically because slight variations exist between firmware versions.
<EFBFBD>)<01> annotationsN)<01>PathzA(?P<ts>\d{8}_\d{6})_lp_(?P<id>c\d+_\d+|\d+)_(?P<chan>clk|dat)\.h5c<01>.<00>|j|fg}||k\r|St|tj<00>rU|j <00>D]B} ||}t|tj<00>s<01>$|j t||dz|<02><00><00>D|S#t
$rY<00>RwxYw)zEReturn all groups under `grp` up to max_depth, with their full paths.<2E>)<08>name<6D>
isinstance<EFBFBD>h5py<70>Group<75>keys<79> Exception<6F>extend<6E>_walk)<06>grp<72>depth<74> max_depth<74>out<75>k<>childs <20>//home/david-rice/Python/MiPi_Test/explode_h5.pyrr's<><00><00> <0F>H<EFBFBD>H<EFBFBD>c<EFBFBD>?<3F>
<1B>C<EFBFBD> <0C> <09><19><12>
<EFBFBD><11>#<23>t<EFBFBD>z<EFBFBD>z<EFBFBD>"<22><14><18><18><1A> ?<3F>A<EFBFBD> <19><1B>A<EFBFBD><06><05><1A>%<25><14><1A><1A>,<2C><13>
<EFBFBD>
<EFBFBD>5<EFBFBD><15><05><01> <09>9<EFBFBD>=<3D>><3E>  ?<3F> <0F>J<EFBFBD><4A> <1D> <19><18> <19>s<00>B<02> B<05>Bc <01>R<00>t|<00>}d}d}|D]<5D>\}}t|tj<00>s<01>!|j <00>D<00>cgc]"}t||tj
<00>s<01>!|<06><02>$}}|D<00>cgc](}||j dk(r||jdkDr|<06><02>*}}t|<07>|kDs<01><>t|<07>}||f}<02><>|<02>|dk(r<>|D]<5D>\}}t|tj<00>r|j <00>ngD]l}||}t|tj
<00>s<01>#|j dk(s<01>3|jddkDs<01>F|jddkDs<01>Y||gt|||<08>fccS<00><>td<06><00>|\}}|jd<07><00><08>||t||<05>fScc}wcc}w) a
Locate the group that contains per-segment waveform datasets.
Returns (group, sorted_dataset_keys, attrs_dict). The attrs dict merges
attributes from the root, parent, and target group so we can find
XInc / XOrg / YInc / YOrg wherever Keysight chose to put them.
Nrr<00>d<00>zNo segment datasets found in H5c<01><><00>tjd|<00>r-ttjd|<00>j<00><00>SdS)Nz\d+r)<04>re<72>search<63>int<6E>group)<01>ss r<00><lambda>z _find_segments.<locals>.<lambda>^s8<00><00>-/<2F>Y<EFBFBD>Y<EFBFBD>v<EFBFBD>q<EFBFBD>-A<><03>B<EFBFBD>I<EFBFBD>I<EFBFBD>f<EFBFBD>a<EFBFBD> <20> &<26> &<26> (<28>)<29><01>GH<47><01>)<01>key) rrr r
r <00>Dataset<65>ndim<69>size<7A>len<65>shape<70>_collect_attrs<72>
ValueError<EFBFBD>sort) <09>h5_root<6F>groups<70>best<73>
best_count<EFBFBD>pathrr<00>ds_keys<79>dss r<00>_find_segmentsr17s<><00><00><13>7<EFBFBD>^<5E>F<EFBFBD>
<10>D<EFBFBD><12>J<EFBFBD><1B> "<22> <09><04>c<EFBFBD><19>#<23>t<EFBFBD>z<EFBFBD>z<EFBFBD>*<2A> <14>!<21>h<EFBFBD>h<EFBFBD>j<EFBFBD>M<><11>J<EFBFBD>s<EFBFBD>1<EFBFBD>v<EFBFBD>t<EFBFBD>|<7C>|<7C>,L<>1<EFBFBD>M<><07>M<><1F>
<EFBFBD><13><12>1<EFBFBD>v<EFBFBD>{<7B>{<7B>a<EFBFBD><1F>C<EFBFBD><01>F<EFBFBD>K<EFBFBD>K<EFBFBD>#<23>$5<> <0E>
<EFBFBD><07>
<EFBFBD> <0F>w<EFBFBD><<3C>*<2A> $<24><1C>W<EFBFBD><1C>J<EFBFBD><17><17>><3E>D<EFBFBD> "<22> <0C>|<7C>z<EFBFBD>Q<EFBFBD><EFBFBD><1F> F<01>I<EFBFBD>D<EFBFBD>#<23>#-<2D>c<EFBFBD>4<EFBFBD>:<3A>:<3A>#><3E>S<EFBFBD>X<EFBFBD>X<EFBFBD>Z<EFBFBD>B<EFBFBD> F<01><01><18><11>V<EFBFBD><02><1D>b<EFBFBD>$<24>,<2C>,<2C>/<2F>B<EFBFBD>G<EFBFBD>G<EFBFBD>q<EFBFBD>L<EFBFBD>R<EFBFBD>X<EFBFBD>X<EFBFBD>a<EFBFBD>[<5B>ST<53>_<EFBFBD>Y[<5B>Ya<59>Ya<59>bc<62>Yd<59>gj<67>Yj<59><1E><11><03>^<5E>G<EFBFBD>S<EFBFBD>"<22>%E<>E<>E<> F<01> F<01>
<19>:<3A>;<3B>;<3B><17>L<EFBFBD>C<EFBFBD><17> <0B>L<EFBFBD>L<EFBFBD><06>L<EFBFBD><07> <0F><07><1E><07><13>5<> 5<>5<><35>1N<01><>
s<00>"F<06>(F<06>2-F$c <01><><00>i}|D]:} |j|jD<00>cic]}||j|<00><02>c}<03><00><|Scc}w#t$rY<00>OwxYw)z?Merge attrs from multiple HDF5 nodes (later overrides earlier).)<03>update<74>attrsr )<04>scopesrrrs rr'r'ds`<00><00>
<0C>C<EFBFBD> <13><11><01> <11> <0F>J<EFBFBD>J<EFBFBD>q<EFBFBD>w<EFBFBD>w<EFBFBD>7<>!<21><01>1<EFBFBD>7<EFBFBD>7<EFBFBD>1<EFBFBD>:<3A> <0A>7<> 8<><11>
<0F>J<EFBFBD><4A>8<><38><18> <11> <10> <11>s!<00>A <02>A
<EFBFBD>A <02>A <02> A<05>A<05><01>defaultc<01><><00>|D]d}||vs<01>||} t|ttf<02>r|jd<01><02>}t |d<03>r t |dd<05>dk(r|j <00>}|cS|S#t$rY|cSwxYw)zFReturn the first attribute that exists from a list of candidate names.<2E>ignore)<01>errors<72>itemr$r)r<00>bytes<65> bytearray<61>decode<64>hasattr<74>getattrr;r )r4r7<00>names<65>n<>vs r<00>_attrrDos<><00><00> <12> <15><01> <0C><05>:<3A><15>a<EFBFBD><08>A<EFBFBD> <15><1D>a<EFBFBD>%<25><19>!3<>4<><19><08><08><08><08>1<>A<EFBFBD><1A>1<EFBFBD>f<EFBFBD>%<25>'<27>!<21>V<EFBFBD>Q<EFBFBD>*?<3F>1<EFBFBD>*D<><19><06><06><08>A<EFBFBD><15>H<EFBFBD> <15> <13>N<EFBFBD><4E><1D> <15><14><14>H<EFBFBD> <15>s<00>AA,<02>, A;<05>:A;c<01>D<00>t|<00>}|r t|<01>n |j}|jdd<01><02>tj |j
<00>}|st d|j
<00><00><02><00>|d}|d}|d}g}tj|d<07>5}t|<08>\} }
} tt| dd d
d <0B> <0C><00>} tt| d ddd<10> <0C><00>} t| dddd<14> <0C>}t| dddd<14> <0C>}|r2td| j
<00>dt|
<EFBFBD><00>d| d<1B>d| d<1B>d|<0E>d|<0F><00> <0C>t|
<EFBFBD>dk(r<>| |
d jd!k(r<>| |
d dd}t|j d <00>D]b}t#j$||t<00>"<22>}|<0E>|<0F>|t|<0E>zt|<0F>z}|j't)|||||dz| | |<12><00><00>d|cddd<14>St+|
d<1F>#<23>D]<5D>\}}t#j$| |ddt<00>"<22>}|<0E>M|<0F>Kt#j,| |j.t"j0<00>r|t|<0E>zt|<0F>z}|j't)|||||| | |<12><00><00><> ddd<14>|S#1swY|SxYw)$z<>
Split `h5_path` into per-segment CSVs.
Returns the list of CSV paths written. CSVs are placed in `out_dir`
(default: same dir as h5_path).
T)<02>parents<74>exist_okzNot an LP H5 filename: <20>ts<74>id<69>chan<61>r<>XInc<6E>
XIncrement<EFBFBD> x_incrementg<74><67><EFBFBD><EFBFBD><EFBFBD>|<7C>=r6<00>XOrg<72>XOrigin<69>x_origing<00>YInc<6E>
YIncrement<EFBFBD> y_incrementN<74>YOrg<72>YOrigin<69>y_originz group: z segments: z XInc=z.3ez XOrg=z YInc=z YOrg=rrr)<01>dtype)<01>start)r<00>parent<6E>mkdir<69>
LP_NAME_RE<EFBFBD>matchrr(r <00>Filer1<00>floatrD<00>printr%r#<00>ranger&<00>np<6E>asarray<61>append<6E>_write_segment_csv<73> enumerate<74>
issubdtyperX<00>integer)<14>h5_path<74>out_dir<69>verbose<73>
name_matchrH<00>cap_idrJ<00>csvs<76>frr/r4<00>x_inc<6E>x_org<72>y_inc<6E>y_orgr0<00>i<>voltsr!s r<00>exploderv<00>s<><00><00><13>7<EFBFBD>m<EFBFBD>G<EFBFBD>&<26>d<EFBFBD>7<EFBFBD>m<EFBFBD>G<EFBFBD>N<EFBFBD>N<EFBFBD>G<EFBFBD> <0B>M<EFBFBD>M<EFBFBD>$<24><14>M<EFBFBD>.<2E><1B>!<21>!<21>'<27>,<2C>,<2C>/<2F>J<EFBFBD> <15><18>2<>7<EFBFBD><<3C><<3C>.<2E>A<>B<>B<> <17><04> <1D>B<EFBFBD> <17><04> <1D>F<EFBFBD> <17><06> <1F>D<EFBFBD><19>D<EFBFBD> <0A><19><19>7<EFBFBD>C<EFBFBD> <20> <0F>A<EFBFBD>,<2C>Q<EFBFBD>/<2F><1B><03>W<EFBFBD>e<EFBFBD><15>e<EFBFBD>E<EFBFBD>6<EFBFBD><<3C><1D>PU<50>V<>W<><05><15>e<EFBFBD>E<EFBFBD>6<EFBFBD>9<EFBFBD>j<EFBFBD>#<23>N<>O<><05><15>e<EFBFBD>V<EFBFBD>\<5C>=<3D>$<24>O<><05><15>e<EFBFBD>V<EFBFBD>Y<EFBFBD>
<EFBFBD>D<EFBFBD>I<><05> <12> <11>I<EFBFBD>c<EFBFBD>h<EFBFBD>h<EFBFBD>Z<EFBFBD>|<7C>C<EFBFBD><07>L<EFBFBD>><3E>B<1A><1F><03><1B>G<EFBFBD>E<EFBFBD>#<23>;<3B>g<EFBFBD>e<EFBFBD>W<EFBFBD>G<EFBFBD>E<EFBFBD>7<EFBFBD>T<01> U<01> <0F>w<EFBFBD><<3C>1<EFBFBD> <1C><13>W<EFBFBD>Q<EFBFBD>Z<EFBFBD><1F>!5<>!5<><11>!:<3A><14>W<EFBFBD>Q<EFBFBD>Z<EFBFBD><1F><11>#<23>B<EFBFBD><1A>2<EFBFBD>8<EFBFBD>8<EFBFBD>A<EFBFBD>;<3B>'<27> <13><01><1A>
<EFBFBD>
<EFBFBD>2<EFBFBD>a<EFBFBD>5<EFBFBD><05>6<><05><18>$<24><15>):<3A>!<21>E<EFBFBD>%<25>L<EFBFBD>0<>5<EFBFBD><15><<3C>?<3F>E<EFBFBD><14> <0B> <0B>.<2E><1B>R<EFBFBD><16><14>q<EFBFBD>1<EFBFBD>u<EFBFBD>e<EFBFBD>U<EFBFBD>E<EFBFBD><12><13>  <13><18>+ <0F> <0F>0 <20><07>q<EFBFBD>1<> <0F>F<EFBFBD>A<EFBFBD>s<EFBFBD><16>J<EFBFBD>J<EFBFBD>s<EFBFBD>3<EFBFBD>x<EFBFBD><01>{<7B>%<25>8<>E<EFBFBD><14> <20>U<EFBFBD>%6<><15>=<3D>=<3D><13>S<EFBFBD><18><1E><1E><12><1A><1A><<3C>!<21>E<EFBFBD>%<25>L<EFBFBD>0<>5<EFBFBD><15><<3C>?<3F>E<EFBFBD> <10>K<EFBFBD>K<EFBFBD>*<2A><17><12>V<EFBFBD>T<EFBFBD>1<EFBFBD>e<EFBFBD>U<EFBFBD>E<EFBFBD><0E> <0F>  <0F>1 <0F>B <10>K<EFBFBD>C <0F>B <10>K<EFBFBD>s<00>EJ<03>$B&J<03>Jc <01><><00>t|<07>}tj|<08>|z|z} ||<01>d|<02>d|d<03>d|<03>d<05>z }
tj|
tj| |g<02>dd<07><08>|
S) N<>_lp_<70>_seg<65>03d<33>_z.csv<73>,z%.6e)<02> delimiter<65>fmt)r%rb<00>arange<67>savetxt<78> column_stack) rjrHrmrJ<00>seg_idxrprqrurB<00>times<65>csv_paths rrere<00>su<00><00> <0C>E<EFBFBD>
<EFBFBD>A<EFBFBD> <0E>I<EFBFBD>I<EFBFBD>a<EFBFBD>L<EFBFBD>5<EFBFBD> <20>5<EFBFBD> (<28>E<EFBFBD><16>B<EFBFBD>4<EFBFBD>t<EFBFBD>F<EFBFBD>8<EFBFBD>4<EFBFBD><07><03>}<7D>A<EFBFBD>d<EFBFBD>V<EFBFBD>4<EFBFBD>H<>H<>H<EFBFBD><06>J<EFBFBD>J<EFBFBD><10>
<EFBFBD><0F><0F><15><05><0E>'<27><15> <12> <06> <14>Or c<01><><00>tj|d<01>5}d<02>}|j|<02>ddd<03>y#1swYyxYw)zDPrint the H5 hierarchy + attrs. Useful for debugging unknown files.rKc<01>&<00>t|tj<00>rd}d}nd}d|j<00>d|j<00><00>}t d|<02>d|<00>|<03><00><05>|j j<00>D]$\}}t|<05>dd}t d |<04>d
|<06><00><04><00>&y) N<>GROUP<55><00>DSETz shape=z dtype=z z /<2F><z attr z = ) rr r
r&rXr`r4<00>items<6D>str)r<00>obj<62>kindr&rrC<00>vss r<00>visitzinspect.<locals>.visit<69>s<><00><00><19>#<23>t<EFBFBD>z<EFBFBD>z<EFBFBD>*<2A><1E><04><1A><05><1D><04>!<21>#<23>)<29>)<29><1B>G<EFBFBD>C<EFBFBD>I<EFBFBD>I<EFBFBD>;<3B>?<3F><05> <11>B<EFBFBD>t<EFBFBD>f<EFBFBD>B<EFBFBD>t<EFBFBD>f<EFBFBD>U<EFBFBD>G<EFBFBD>,<2C> -<2D><1B> <09> <09><0F><0F>)<29> 0<><04><01>1<EFBFBD><18><11>V<EFBFBD>C<EFBFBD>R<EFBFBD>[<5B><02><15> <0B>A<EFBFBD>3<EFBFBD>c<EFBFBD>"<22><14>.<2E>/<2F> 0r N)r r^<00>
visititems)riror<>s r<00>inspectr<74><00>s:<00><00> <0A><19><19>7<EFBFBD>C<EFBFBD> <20> <1C>A<EFBFBD>
0<>
<EFBFBD> <0C> <0C>U<EFBFBD><1B> <1C> <1C> <1C>s<00>5<03>><07>__main__rz --inspectz
=== z ===T)rkz: u segment(s) → CSVsu : ERROR — )r<00>)rrrr<00>returnzlist[tuple[str, h5py.Group]])r<>z"tuple[h5py.Group, list[str], dict])r<><00>dict)r4r<>)NF)rirrjz Path | Nonerk<00>boolr<6C>z
list[Path])rjrrHr<>rmr<>rJr<>r<>rrpr_rqr_ruz
np.ndarrayr<79>r)rirr<><00>None)<1F>__doc__<5F>
__future__rr<00>sys<79>pathlibrr <00>numpyrb<00>compile<6C>
IGNORECASEr\rr1r'rDrvrer<><00>__name__<5F>argv<67>argsr`<00>exit<69>p<>outsrr%r <00>e<>r r<00><module>r<>s<><00><01><04>,#<23> <09>
<EFBFBD><18> <0B><12> <17>R<EFBFBD>Z<EFBFBD>Z<EFBFBD>H<><06>M<EFBFBD>M<EFBFBD><02>
<EFBFBD> <0F> *6<>Z<0F>(,<2C><13>"37<33>!<21>5<10><19>5<10>&0<>5<10>p <14> #<23> <14>,1<> <14>:?<3F> <14>(<28> <14>-1<> <14><1C>" <0C>z<EFBFBD><19> <0E>8<EFBFBD>8<EFBFBD>A<EFBFBD>B<EFBFBD><<3C>D<EFBFBD> <0F> <0A>g<EFBFBD><0E><10><03><08><08><11> <0B> <0B>A<EFBFBD>w<EFBFBD>+<2B><1D><15>a<EFBFBD>b<EFBFBD><18> <1D>A<EFBFBD> <11>F<EFBFBD>1<EFBFBD>#<23>T<EFBFBD>"<22> #<23> <13>D<EFBFBD><11>G<EFBFBD> <1C> <1D> <11><03><08><08><11> <0B> <11>4<><01> 4<><1A>4<EFBFBD><01>7<EFBFBD>D<EFBFBD>1<>D<EFBFBD> <11>T<EFBFBD>!<21>W<EFBFBD>\<5C>\<5C>N<EFBFBD>"<22>S<EFBFBD><14>Y<EFBFBD>K<EFBFBD>/C<>D<> E<>4<><1A><><19> 4<> <11>T<EFBFBD>!<21>W<EFBFBD>\<5C>\<5C>N<EFBFBD>,<2C>q<EFBFBD>c<EFBFBD>2<> 3<> 3<><33> 4<>s<00> 4D<02>E<05>D?<05>?E