Skip to content

Instantly share code, notes, and snippets.

@d3v-null
Created November 3, 2023 03:24
Show Gist options
  • Save d3v-null/c6c4e7ce3fb0cdab0c01557ce1900150 to your computer and use it in GitHub Desktop.
Save d3v-null/c6c4e7ce3fb0cdab0c01557ce1900150 to your computer and use it in GitHub Desktop.
#!/bin/zsh -eux
export obsid="1090359520"
export outdir="/data/dev"
## preprocessing settings
#### time resolution to average to in seconds
export timeres_s=2
#### frequency resolution to average to in kHz
export freqres_khz=40
#### edge width to flag in kHz
export edgewidth_khz=80
#### extra birli args if any
export birli_args=""
## calibration settings
export hyp_srclist_args='--source-dist-cutoff=90 --veto-threshold 0.005'
export hyp_dical_args="--max-iterations 300 --stop-thresh 1e-20"
export dical_name="30l_src4k_"
export dical_args="--uvw-min 30l -n 4000 ${hyp_srclist_args} ${hyp_dical_args}"
## apply settings
export apply_name="2s_40kHz_trunc"
export apply_args="--time-average 2s --freq-average 40kHz --timesteps 32 33 34 35"
## peel settings
export ionosub_name="i1000"
export ionosub_args="--iono-sub 1000"
export OPENBLAS_NUM_THREADS=1
mkdir -p "${outdir}/${obsid}/raw"
export metafits="${outdir}/${obsid}/raw/${obsid}.metafits"
mkdir -p "${outdir}/${obsid}/prep"
export prep_uvfits="${outdir}/${obsid}/prep/birli_${obsid}_${timeres_s}s_${freqres_khz}kHz.uvfits"
export prep_ms="${outdir}/${obsid}/prep/birli_${obsid}_${timeres_s}s_${freqres_khz}kHz.ms"
export cotter_ms="${outdir}/${obsid}/prep/cotter_${obsid}_${timeres_s}s_${freqres_khz}kHz.ms"
mkdir -p "${outdir}/${obsid}/cal"
mkdir -p "${outdir}/${obsid}/ionoqa"
mkdir -p "${outdir}/${obsid}/img"
export MWA_BEAM_FILE="/opt/cal/mwa_full_embedded_element_pattern.h5"
export full_srclist="/opt/cal/srclist_pumav3_EoR0LoBESv2_fixedEoR1pietro+ForA_phase1+2_edit.txt"
export rts_patch_srclist="${outdir}/${obsid}/rts/srclist_pumav3_EoR0aegean_EoR1pietro+ForA_1090359520_patch1000.txt"
export rts_peel_srclist="${outdir}/${obsid}/rts/srclist_pumav3_EoR0aegean_EoR1pietro+ForA_1090359520_peel1000.txt"
# export hyp_srclist="${outdir}/${obsid}/cal/hyp_srclist_${obsid}_${dical_name}.fits"
export hyp_srclist="${outdir}/${obsid}/cal/${obsid}_reduced_n8000.yaml"
export hyp_soln="${outdir}/${obsid}/cal/hyp_soln_${obsid}_${dical_name}.fits"
export cal_uvfits="${outdir}/${obsid}/cal/hyp_${obsid}_${dical_name}_${apply_name}.uvfits"
export cal_ms="${outdir}/${obsid}/cal/hyp_${obsid}_${dical_name}_${apply_name}.ms"
export cal_ms_trunc="${outdir}/${obsid}/cal/hyp_${obsid}_${dical_name}_${apply_name}_trunc.ms"
export cal_model="${outdir}/${obsid}/cal/hyp_model_${obsid}_${dical_name}.ms"
export sub_ms="${outdir}/${obsid}/cal/hyp_sub_${obsid}_${dical_name}_${apply_name}.ms"
export residual_ms="${outdir}/${obsid}/cal/hyp_residual_${obsid}_${dical_name}_${apply_name}.ms"
export ionosub_ms="${outdir}/${obsid}/cal/hyp_ionosub_${obsid}_${dical_name}_${apply_name}.ms"
# export ionosub_ms_trunc="${outdir}/${obsid}/cal/hyp_ionosub_${obsid}_${dical_name}_${apply_name}_trunc.ms"
export ionosub_json="${outdir}/${obsid}/cal/hyp_ionosub_consts_${obsid}_${dical_name}_${apply_name}.json"
export ionosub_qa="${outdir}/${obsid}/ionoqa/hyp_ionosub_${obsid}_${dical_name}_${apply_name}.json"
# export ionosub_json_trunc="${outdir}/${obsid}/cal/hyp_ionosub_consts_${obsid}_${dical_name}_${apply_name}_trunc.json"
export ionosub_cpu_ms="${outdir}/${obsid}/cal/hyp_ionosub_cpu_${obsid}_${dical_name}_${apply_name}.ms"
export ionosub_cpu_json="${outdir}/${obsid}/cal/hyp_ionosub_cpu_consts_${obsid}_${dical_name}_${apply_name}.json"
export ionosub_cpu_qa="${outdir}/${obsid}/ionoqa/hyp_ionosub_cpu_${obsid}_${dical_name}_${apply_name}.json"
export ionosub_old_uvfits="${outdir}/${obsid}/cal-old/hyp_${obsid}_ionosub_${dical_name}_${apply_name}_${ionosub_name}.uvfits"
export ionosub_old_ms="${outdir}/${obsid}/cal-old/hyp_${obsid}_ionosub_${dical_name}_${apply_name}_${ionosub_name}.ms"
export ionosub_old_json="${outdir}/${obsid}/cal-old/hyp_peel_${obsid}_ionosub_${dical_name}_${apply_name}_${ionosub_name}_uv.json"
export ionosub_oldsim_ms="${outdir}/${obsid}/cal/hyp_ionosub_oldsim_${obsid}.ms"
export ionosub_oldsim_json="${outdir}/${obsid}/cal/hyp_ionosub_consts_oldsim_${obsid}.json"
export ionosub_oldsim_qa="${outdir}/${obsid}/ionoqa/hyp_ionosub_oldsim_${obsid}.json"
export hyp_test_peel_gpu_multi_ms=/tmp/hypertest/test_peel_gpu_multi_source.ms
# ###### #
# IMPORT #
# ###### #
# [ ! -d "$ionosub_old_ms" ] && [ -f "$ionosub_old_uvfits" ] && \
# docker run -it \
# -v /data:/data \
# d3vnull0/casa:latest \
# casa -c "importuvfits('${ionosub_old_uvfits}', '${ionosub_old_ms}')"
# ########## #
# PREPROCESS #
# ########## #
# there are two options here:
## option 1: download raw vis, manual Birli processing
# giant-squid submit-vis --wait "${obsid}" --delivery acacia
# pushd "${outdir}/${obsid}/raw"
# giant-squid download ${obsid}
# popd
pushd "${outdir}/${obsid}/prep"
# for uvfits
[ -f ${prep_uvfits} ] || birli ${birli_args} \
--avg-freq-res ${freqres_khz} --avg-time-res ${timeres_s} \
--flag-edge-width ${edgewidth_khz} \
-u "${prep_uvfits}" \
-m "${metafits}" \
${outdir}/${obsid}/raw/${obsid}_2*.fits
# for ms
# birli ${birli_args} \
# --avg-freq-res ${freqres_khz} --avg-time-res ${timeres_s} \
# --flag-edge-width ${edgewidth_khz} \
# -M "${prep_ms}" \
# -m "${metafits}" \
# ${outdir}/${obsid}/raw/${obsid}_2*.fits
# cotter equivalent
# cotter \
# -freqres ${freqres_khz} -timeres ${timeres_s} \
# -edgewidth ${edgewidth_khz} \
# -o "${cotter_ms}" \
# -m "${metafits}" \
# -allowmissing \
# -noantennapruning \
# -noflagautos \
# -nostats \
# -norfi \
# ${outdir}/${obsid}/raw/${obsid}_2*.fits
popd
## option 2: use birli from ASVO
# pushd "${outdir}/${obsid}/raw"
# wget -O "${obsid}.metafits" "http://ws.mwatelescope.org/metadata/fits?obs_id=${obsid}&include_ppds=1"
# popd
# pushd "${outdir}/${obsid}/prep"
# giant-squid submit-conv --wait "${obsid}" \
# --parameters timeres=${timeres_s},freqres=${freqres_khz},conversion=uvfits,processor=birli
# giant-squid download ${obsid}
# mv "${obsid}.uvfits" "${prep_uvfits}"
# popd
# ####### #
# PREP QA #
# ####### #
# ######### #
# CALIBRATE #
# ######### #
# model shitlist
# hyperdrive di-calibrate --uvw-min 30l -n 1 \
# --data "${metafits}" "${cal_ms}" \
# --source-list /data/dev/1090359520/cal/shitlist.txt \
# --model-filenames "${cal_model}"
pushd "${outdir}/${obsid}/cal"
[ -f "${hyp_srclist}" ] || hyperdrive srclist-by-beam \
-m "${metafits}" \
-n 8000 \
"${full_srclist}" \
"${hyp_srclist}"
[ -f "${hyp_soln}" ] || hyperdrive di-calibrate ${=dical_args} \
--data "${metafits}" "${prep_uvfits}" \
--source-list "${full_srclist}" \
--outputs "${hyp_soln}" \
--model-filenames "${cal_model}"
hyperdrive solutions-plot -m "${metafits}" "${hyp_soln}" --no-ref-tile
[ -d "${cal_ms}" ] || hyperdrive solutions-apply ${=apply_args} \
--data "${metafits}" "${prep_uvfits}" \
--solutions "${hyp_soln}" \
--outputs "${cal_ms}"
# "${cal_uvfits}"
#
# // truncated ms
# casa -c $(cat <<EoF
# print('hi')
# tb.open('$cal_ms')
# times=tb.taql('SELECT UNIQUE TIME FROM ' + tb.name()).getcol('TIME')
# mid_idx = len(times)/2
# tb.query('TIME >= ' + str(times[mid_idx]) + ' AND TIME < ' + str(times[mid_idx+1])).copy('$cal_ms_trunc', deep=True)
# tb.close()
# print('bye')
# EoF
# )
# ######## #
# SUBTRACT #
# ######## #
[ -d $sub_ms ] || hyperdrive vis-subtract \
--data "${cal_ms}" \
--source-list "${full_srclist}" \
--outputs "${sub_ms}" \
--invert \
--num-sources 1000
# #### #
# PEEL #
# #### #
# just residual
[ -d $residual_ms ] || hyperdrive peel \
--data "${cal_ms}" "${metafits}" \
--source-list "${full_srclist}" \
--outputs "${residual_ms}" \
--sub 1000 --iono-sub 0 \
2>&1 | tee residual.log
[ -d $ionosub_ms ] || hyperdrive peel -v \
--data "${cal_ms}" "${metafits}" \
--source-list "${full_srclist}" \
--outputs "${ionosub_ms}" "${ionosub_json}" \
--sub 8000 ${=ionosub_args} \
2>&1 | tee peel.log
# our best peel attempt
# --sub 1000 --iono-sub 1000 \
# --iono-freq-average-factor 1 \
# --low-res-iono-freq-average 1 \
# --short-baseline-sigma 100 \
# --uvw-min 50l \
# --convergence 0.5 \
# debugging
# export RUST_BACKTRACE=full
# cargo build --release --features=cuda,gpu-single \
# && target/release/hyperdrive peel -vvv --no-progress-bars \
# --data "${cal_ms}" "${metafits}" \
# --source-list "${hyp_srclist}" \
# --outputs "${ionosub_ms}" "${ionosub_json}" \
# --sub 8000 \
# --num-passes 2 \
# --num-loops 2 \
# --iono-sub 10 2>&1 | tee peel-debug.log
# iono-freq-average-factor 1
# hyperdrive peel \
# --data "${cal_ms_trunc}" \
# --beam-file "${MWA_BEAM_FILE}" \
# --source-list "${hyp_srclist}" \
# --outputs "${ionosub_ms_trunc}" "${ionosub_json_trunc}" \
# --sub 8000 \
# --iono-sub 1000
# cargo build --no-default-features --features=hdf5-static
# target/debug/hyperdrive peel -vvv --no-progress-bars \
# --data "${cal_ms}" "${metafits}" \
# --source-list "${hyp_srclist}" \
# --outputs "${ionosub_cpu_ms}" "${ionosub_cpu_json}" \
# --sub 8000 \
# --num-passes 2 \
# --num-loops 2 \
# --iono-sub 10 2>&1 | tee peel-cpu.log
# simulate hyperdrive old
# hyperdrive-old peel --source-dist-cutoff=90 --veto-threshold 0.005 --data 1090359520.metafits hyp_1090359520_30l_src4k_8s_80kHz.uvfits --beam-file /pawsey/mwa/mwa_full_embedded_element_pattern.h5 --source-list srclist_pumav3_EoR0LoBESv2_fixedEoR1pietro+ForA_phase1+2_edit.txt --iono-sub 1000 --sub 8000 --outputs hyp_1090359520_ionosub_30l_src4k_8s_80kHz_i1000.uvfits hyp_peel_1090359520_ionosub_30l_src4k_8s_80kHz_i1000_uv.json
# [ -f $ionosub_oldsim_ms ] || hyperdrive peel \
# --source-dist-cutoff=90 --veto-threshold 0.005 \
# --data "${cal_ms}" "${metafits}" \
# --source-list "${full_srclist}" \
# --iono-sub 1000 --sub 8000 \
# --short-baseline-sigma 0.0001 \
# --convergence 1.0 \
# --outputs "$ionosub_oldsim_ms" "$ionosub_oldsim_json"
popd
# ###### #
# IONOQA #
# ###### #
# 2s timestamps:
# 0 1090359521
# 32 1090359585
# 33 1090359587
# 34 1090359589
# 35 1090359591
# avg 1090359588
docker run -it \
-v ~/src/MWAEoR-Pipeline/templates/:/templates \
-v /data:/data \
--entrypoint /usr/bin/python \
d3vnull0/mwa_qa:latest \
/templates/cthulhuplot.py \
--offsets "${ionosub_json}" \
--obs-frequency 182000000 \
--obs-radec 0 -27 \
--obsid 1090359588 \
--time-res 8 \
--show-axes \
--json "${ionosub_qa%%.json}.json" \
--csv "${ionosub_qa%%.json}.csv" \
--tec "${ionosub_qa%%.json}_tec.png" \
--plot "${ionosub_qa%%.json}.png"
docker run -it \
-v ~/src/MWAEoR-Pipeline/templates/:/templates \
-v /data:/data \
--entrypoint /usr/bin/python \
d3vnull0/mwa_qa:latest \
/templates/cthulhuplot.py \
--offsets "${ionosub_oldsim_json}" \
--obs-frequency 182000000 --obs-radec 0 -27 \
--json "${ionosub_oldsim_qa%%.json}.json" \
--csv "${ionosub_oldsim_qa%%.json}.csv" \
--plot "${ionosub_oldsim_qa%%.json}.png" \
--tec "${ionosub_oldsim_qa%%.json}_tec.png"
# unzip /data/dev/rts_offsets/rts.zip ${obsid}.yaml && cp ${obsid}.yaml ${outdir}/${obsid}/rts/
export rts_offsets="${outdir}/${obsid}/rts/${obsid}.yaml"
export rts_tec="${outdir}/${obsid}/rts/tec_${obsid}.png"
export rts_qa="${outdir}/${obsid}/rts/qa_${obsid}.png"
docker run -it \
-v ~/src/MWAEoR-Pipeline/templates/:/templates \
-v /data:/data \
--entrypoint /usr/bin/python \
d3vnull0/mwa_qa:latest \
/templates/cthulhuplot.py \
--offsets ${rts_offsets} \
--obs-frequency 182000000 --obs-radec 0 -27 \
--timestep 8 \
--json "${rts_offsets%%.yaml}_qa.json" \
--csv "${rts_offsets%%.yaml}.csv" \
--plot "${rts_qa}" \
--tec "${rts_tec}"
# ##### #
# IMAGE #
# ##### #
export img_base=""
# export img_base="-parallel-gridding 4"
# export img_base="-parallel-gridding 24 -interval 4 5"
# export img_base="-parallel-gridding 24 -interval 3 7"
# export img_base="-gridder idg -idg-mode hybrid"
# export img_base="-parallel-gridding 4 -intervals-out 14"
unset imgs
if [[ -n "$ZSH_VERSION" ]]; then
typeset -A imgs
else
declare -A imgs
fi
# imgs["fast"]="$img_base -weight briggs -1.0 -size 2048 2048 -scale 40asec -niter 0"
# imgs["primary"]="$img_base -weight briggs -1.0 -size 2048 2048 -scale 1amin -niter 100 -channels-out 4 -join-channels"
# imgs[points]="$img_base -weight uniform -size 4096 4096 -scale 40asec -niter 0 -channels-out 4 -join-channels"
imgs[uni]="$img_base -weight uniform -size 4096 4096 -scale 40asec -niter 0"
# imgs[uni_24ch]="$img_base -weight uniform -size 4096 4096 -scale 40asec -niter 1000 -channels-out 24 -join-channels"
# imgs[nat]="$img_base -weight natural -size 4096 4096 -scale 40asec -niter 0 -channels-out 4 -join-channels"
# imgs[nat100]="$img_base -weight natural -minuv-l 100 -size 4096 4096 -scale 40asec -niter 0 -channels-out 4 -join-channels"
# imgs["allsky-wb0-4096x105as-24ch-tg10am-nodc"]="$img_base -weight briggs +0.5 -size 4096 4096 -scale 105asec -channels-out 24 -join-channels -taper-gaussian 10amin -niter 0"
# imgs["allsky-wb+.5-1024x420as-96ch-nodc"]="$img_base -weight briggs +0.5 -size 1024 1024 -scale 420asec -channels-out 96 -join-channels -niter 0"
# imgs["allsky-wb+0-1024x420as-96ch-nodc"]="$img_base -weight briggs +0.0 -size 1024 1024 -scale 420asec -channels-out 96 -join-channels -niter 0"
# imgs["allsky-wb-.5-1024x420as-96ch-nodc"]="$img_base -weight briggs -0.5 -size 1024 1024 -scale 420asec -channels-out 96 -join-channels -niter 0"
# imgs["allsky-wb+.5-1024x420as-96ch-tg10am-nodc"]="$img_base -weight briggs +0.5 -size 1024 1024 -scale 420asec -channels-out 96 -join-channels -taper-gaussian 10amin -niter 0"
# imgs["allsky-wb+0-1024x420as-96ch-tg10am-nodc"]="$img_base -weight briggs +0.0 -size 1024 1024 -scale 420asec -channels-out 96 -join-channels -taper-gaussian 10amin -niter 0"
# imgs["allsky-wb-.5-1024x420as-96ch-tg10am-nodc"]="$img_base -weight briggs -0.5 -size 1024 1024 -scale 420asec -channels-out 96 -join-channels -taper-gaussian 10amin -niter 0"
# export img_name="fast"
# export img_args="$img_base -weight briggs -1.0 -size 2048 2048 -scale 40asec -niter 0"
# export img_name="primary"
# export img_args="$img_base -weight briggs -1.0 -size 2048 2048 -scale 1amin -niter 100 -parallel-deconvolution 512 -channels-out 96 -join-channels"
# export img_name="allsky-wb+.5-4096x90as-96ch-tg10am-nodc"
# export img_args="$img_base -weight briggs +0.5 -size 4096 4096 -scale 90asec -channels-out 96 -join-channels -taper-gaussian 10amin -niter 0"
# export img_name="allsky-wb+.5-1024x420as-24ch-tg10am-nodc"
# export img_args="$img_base -weight briggs +0.5 -size 1024 1024 -scale 420asec -channels-out 24 -join-channels -taper-gaussian 10amin -niter 0"
# export img_name="allsky-wb+0-1024x420asec-24ch-tg10am-nodc"
# export img_args="$img_base -weight briggs +0.0 -size 1024 1024 -scale 420asec -channels-out 24 -join-channels -taper-gaussian 10amin -niter 0"
# export img_name="allsky-wb-.5-1024x420asec-24ch-tg10am-nodc"
# export img_args="$img_base -weight briggs -0.5 -size 1024 1024 -scale 420asec -channels-out 24 -join-channels -taper-gaussian 10amin -niter 0"
# for img_name in ("${!imgs[@]}"); do
# export img_args="${imgs[$img_name]}"
for img_name img_args in ${(kv)imgs}; do
mkdir -p "${outdir}/${obsid}/img-${img_name}"
pushd "${outdir}/${obsid}/img-${img_name}"
wsclean ${=img_args} \
-name wsclean_hyp_${obsid}_${dical_name}_${apply_name}_${img_name} \
"${cal_ms}"
wsclean ${=img_args} \
-name wsclean_hyp_sub_${obsid}_${dical_name}_${apply_name}_${img_name} \
"${sub_ms}"
wsclean ${=img_args} \
-name wsclean_hyp_residual_${obsid}_${dical_name}_${apply_name}_${img_name} \
"${residual_ms}"
time wsclean ${=img_args} \
-name wsclean_hyp_ionosub_${obsid}_${dical_name}_${apply_name}_${img_name} \
"${ionosub_ms}"
# wsclean ${=img_args} \
# -name wsclean_hyp_ionosub_oldsim_${obsid}_${dical_name}_${apply_name}_${img_name} \
# "${ionosub_oldsim_ms}"
# wsclean ${=img_args} \
# -name wsclean_hyp_ionosub_old_${obsid}_${dical_name}_${apply_name}_${img_name} \
# "${ionosub_old_ms}"
# wsclean ${=img_args} \
# -name wsclean_hyp_ionosub_cpu_${obsid}_${dical_name}_${apply_name}_${img_name} \
# "${ionosub_cpu_ms}"
wsclean ${=img_args} \
-name wsclean_hyp_model_${obsid}_${dical_name}_${apply_name}_${img_name} \
"${cal_model}"
popd
done
# make thumbnails
mkdir -p "${outdir}/${obsid}/img_qa"
for img_name img_args in ${(kv)imgs}; do
for fits in $(cd ${outdir}/${obsid}/img-${img_name}; ls *-{psf,image}.fits); do
docker run -it -v /home/dev/src/MWAEoR-Pipeline/templates:/templates -v /data:/data --entrypoint python d3vnull0/mwa_qa:latest \
/templates/thumbnail.py \
--fits="${outdir}/${obsid}/img-${img_name}/${fits}" \
--thumb="${outdir}/${obsid}/img_qa/${fits}.png" \
--title="${obsid} ${dical_name} ${apply_name}"$'\n'"${img_name} MFS"
done
done
exit 0
# [2023-10-11T15:05:51Z DEBUG] peel loop finished: p0 SNG002646-3655 @ r +0.12 d -0.64 |o a+0.00e0 b+0.00e0 g1.00 |n a+2.81e-4 b+5.04e-4 g-0.14
# #### #
# GIFS #
# #### #
ffmpeg -y -framerate 5 -pattern_type glob \
-i ${ionosub_plot%%.png}'-t*.png' \
-lavfi 'palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1' "${ionosub_plot%%.png}".gif
# ##### #
# TESTS #
# ##### #
export test=test_peel_cpu_multi_source
cargo test --no-default-features --features=hdf5-static --release -- $test --nocapture 2>&1 \
| tee $test.log;
mkdir -p "${outdir}/${obsid}/img-test"
export test=test_peel_gpu_multi_source
cargo test --features=cuda --release -- $test --nocapture 2>&1 \
| tee $test.log;
pushd "${outdir}/${obsid}/img-test" && \
wsclean -name $test \
-size 4096 4096 -scale 32asec \
-weight uniform -niter 0 \
/tmp/hypertest/$test.ms && \
[ -d "/tmp/hypertest/${test}_prec.ms" ] && wsclean -name ${test}_prec \
-size 4096 4096 -scale 32asec \
-weight uniform -niter 0 \
/tmp/hypertest/${test}_prec.ms
popd
# #####
# DEBUGGING MITCH
# #####
cargo install --path . --features=cuda,gpu-single \
&& hyperdrive peel -v \
--data "${cal_ms}" "${metafits}" \
--source-list "${rts_peel_srclist}" \
--outputs "${ionosub_ms}" "${ionosub_json}" \
--sub 1000 --iono-sub 3 \
2>&1 | tee peel.log
pushd "${outdir}/${obsid}/img-uni"
export img_name="uni"
export img_args="$img_base -weight uniform -size 4096 4096 -scale 40asec -niter 0"
wsclean ${=img_args} \
-name wsclean_hyp_ionosub_${obsid}_${dical_name}_${apply_name}_${img_name} \
"${ionosub_ms}"
popd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment