Выше я добавил несколько общих комментариев по проблемам с вашим кодом, которые вы, возможно, захотите решить. Я бы предложил вам переписать ваш код, за исключением того, что я не уверен на 100%, что это означает для достижения sh. Похоже, что, помимо прочего, вы хотите, чтобы он брал 2D-срезы 3D или 4D массивов, но, как я отмечал выше, на самом деле это не достигает этой цели.
В любом случае причина вашей ошибки конкретно в случае, когда данные уже 2D, в вашем операторе if / elif / else у вас есть:
if he["NAXIS"] == 4:
...
hdu = fits.PrimaryHDU(da, he)
print('WCS=',WCS(he))
elif he["NAXIS"] == 3:
...
hdu = fits.PrimaryHDU(da, he)
else:
hdu = hdu[0]
В первых двух случаях вы читаете данные из файла перед закрытием файла (da = hdu[0].data[:,:]
) и создал из него новый объект HDU. Однако в последнем случае вы этого не сделали, а просто передали исходный объект HDU из закрытого файла (hdu = hdu[0]
). Поскольку файл, из которого он сделан, закрыт, данные в этом HDU больше не могут быть готовы, поэтому вы получите «операцию ввода-вывода для закрытого файла», когда вы передадите его в aplpy.FITSFigure
, и он попытается прочитать данные HDU.
Один из способов обойти это - изменить последнюю строку на hdu = fits.PrimaryHDU(da, he)
, как и в других случаях, чтобы создать новый HDU из уже загруженных данных.
Лучший способ, который в соответствии с вашим комментарием, я думаю, вы, возможно, нашли, это рефакторинг вашего кода, чтобы вместо передачи fix_fitshead
имени файла передать ему уже открытый объект HDUList
и использовать его как:
with fits.open(filename) as hdul:
maxvalue1, spec1, d1, he1, hdu_gray, coord1 = fix_fitshead(hdul)
...
и не закрывайте файл, пока не закончите его использовать. В целом это более гибкий подход, поскольку он также позволяет вам использовать ваш код для файлов FITS, которые не были открыты напрямую из файлов на диске (например, для написания тестов).