juglab / cryoCARE_pip

PIP package of cryoCARE
BSD 3-Clause "New" or "Revised" License
25 stars 14 forks source link

incorrectly stitched denoised tomogram.mrc #29

Open jychoi0616 opened 1 year ago

jychoi0616 commented 1 year ago

Dear the team,

I get errors to open denoised tomogram.mrc file (as the attached) using 3dmod. I managed to open the denoised tomogram using a command 3dmod -J 1, but the tomogram seemed it has been stitched together incorrectly. And also it seems this issue was specific to tomograms generated by AreTomo. I guess this issue could be connected the issue #26.

Best wishes, Joy

Screenshot 2022-09-06 at 15 16 35

jychoi0616 commented 1 year ago

For your information, I'm attaching how the denoised tomogram looks like in the flipped view.

The first one is the denoised tomogram output when I used tomogram with flipped volume, and the second one is the tomogram with non flipped volume. Screenshot 2022-09-12 at 15 19 52 Screenshot 2022-09-12 at 15 20 20

tibuch commented 1 year ago

This is confusing. Could you post the installed packages? You can get the list by running conda list inside the activate environment.

jychoi0616 commented 1 year ago

Hi, below is the list. It works well with the tomogram generated by eTomo.

Name Version Build Channel

_libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 2_gnu conda-forge absl-py 0.15.0 pypi_0 pypi bzip2 1.0.8 h7f98852_4 conda-forge ca-certificates 2022.6.15 ha878542_0 conda-forge cachetools 5.2.0 pypi_0 pypi cudatoolkit 11.0.3 h88f8997_10 conda-forge cudnn 8.0.5.39 ha5ca753_1 conda-forge flatbuffers 1.12 pypi_0 pypi gast 0.3.3 pypi_0 pypi google-auth 2.11.0 pypi_0 pypi grpcio 1.32.0 pypi_0 pypi h5py 2.10.0 pypi_0 pypi keras 2.3.1 pypi_0 pypi ld_impl_linux-64 2.36.1 hea4e1c9_2 conda-forge libffi 3.4.2 h7f98852_5 conda-forge libgcc-ng 12.1.0 h8d9b700_16 conda-forge libgomp 12.1.0 h8d9b700_16 conda-forge libnsl 2.0.0 h7f98852_0 conda-forge libsqlite 3.39.3 h753d276_0 conda-forge libstdcxx-ng 12.1.0 ha89aaad_16 conda-forge libuuid 2.32.1 h7f98852_1000 conda-forge libzlib 1.2.12 h166bdaf_2 conda-forge ncurses 6.3 h27087fc_1 conda-forge numpy 1.19.5 pypi_0 pypi openssl 3.0.5 h166bdaf_2 conda-forge pip 22.2.2 pyhd8ed1ab_0 conda-forge python 3.8.13 ha86cf86_0_cpython conda-forge readline 8.1.2 h0f457ee_0 conda-forge setuptools 65.3.0 pyhd8ed1ab_1 conda-forge sqlite 3.39.3 h4ff8645_0 conda-forge tensorboard 2.10.0 pypi_0 pypi tensorflow 2.4.0 pypi_0 pypi tensorflow-estimator 2.4.0 pypi_0 pypi tifffile 2022.8.12 pypi_0 pypi tk 8.6.12 h27826a3_0 conda-forge typing-extensions 3.7.4.3 pypi_0 pypi wheel 0.37.1 pyhd8ed1ab_0 conda-forge xz 5.2.6 h166bdaf_0 conda-forge

jychoi0616 commented 1 year ago

Hi again,

I think it may have something to do with the map mode and no density information of the Aretomo-generated tomogram..? Below is the header of the tomogram generated by Aretomo. (c.f. tomogram generated by eTomo contains information for the density and map mode is 1 (16-bit).)

Number of columns, rows, sections ..... 682 682 200 Map mode .............................. 2 (32-bit real)
Start cols, rows, sects, grid x,y,z ... 0 0 0 682 682 200 Pixel spacing (Angstroms).............. 11.64 11.64 11.64
Cell angles ........................... 90.000 90.000 90.000 Fast, medium, slow axes ............... X Y Z Origin on x,y,z ....................... 0.000 0.000 0.000
Minimum density ....................... 0.0000
Maximum density ....................... 0.0000
Mean density .......................... 0.0000
RMS deviation from mean................ 0.0000
tilt angles (original,current) ........ 0.0 0.0 0.0 90.0 90.0 90.0 Space group,# extra bytes,idtype,lens . 0 25600 5 0

0 Titles :

     Tilt axis rotation angle =     0.0
xujweth commented 1 year ago

Hi, we also met the same problem when using the tomograms reconstructed by AreTomo. The filtered tomograms were stitched incorrectly and the 3dmod failed to open them except adding additional option "-J 1".

Here is the list of corresponding building channel.

packages in environment at /scopem/prog/anaconda3-5.3.1: Name Version Build Channel _ipyw_jlab_nb_ext_conf 0.1.0 py37_0
_libgcc_mutex 0.1 main
alabaster 0.7.11 py37_0
anaconda 5.3.1 py37_0
anaconda-client 1.7.2 py37_0
anaconda-navigator 1.9.2 py37_0
anaconda-project 0.8.2 py37_0
appdirs 1.4.3 py37h28b3542_0
asn1crypto 0.24.0 py37_0
astroid 2.0.4 py37_0
astropy 3.0.4 py37h14c3975_0
atomicwrites 1.2.1 py37_0
attrs 18.2.0 py37h28b3542_0
automat 0.7.0 py37_0
babel 2.6.0 py37_0
backcall 0.1.0 py37_0
backports 1.0 py37_1
backports.shutil_get_terminal_size 1.0.0 py37_2
beautifulsoup4 4.6.3 py37_0
bitarray 0.8.3 py37h14c3975_0
bkcharts 0.2 py37_0
blas 1.0 mkl
blaze 0.11.3 py37_0
bleach 2.1.4 py37_0
blosc 1.14.4 hdbcaa40_0
bokeh 0.13.0 py37_0
boto 2.49.0 py37_0
bottleneck 1.2.1 py37h035aef0_1
brotlipy 0.7.0 py39h27cfd23_1003
bzip2 1.0.6 h14c3975_5
ca-certificates 2021.7.5 h06a4308_1
cairo 1.14.12 h8948797_3
certifi 2021.5.30 py39h06a4308_0
cffi 1.14.6 py39h400218f_0
chardet 3.0.4 py37_1
charset-normalizer 2.0.4 pyhd3eb1b0_0
click 6.7 py37_0
cloudpickle 0.5.5 py37_0
clyent 1.2.2 py37_1
colorama 0.3.9 py37_0
conda 4.10.3 py39h06a4308_0
conda-build 3.15.1 py37_0
conda-env 2.6.0 1
conda-package-handling 1.7.3 py39h27cfd23_1
constantly 15.1.0 py37h28b3542_0
contextlib2 0.5.5 py37_0
cryptography 3.4.7 py39hd23ed53_0
curl 7.61.0 h84994c4_0
cycler 0.10.0 py37_0
cython 0.28.5 py37hf484d3e_0
cytoolz 0.9.0.1 py37h14c3975_1
dask 0.19.1 py37_0
dask-core 0.19.1 py37_0
datashape 0.5.4 py37_1
dbus 1.13.2 h714fa37_1
decorator 4.3.0 py37_0
defusedxml 0.5.0 py37_1
distributed 1.23.1 py37_0
docutils 0.14 py37_0
entrypoints 0.2.3 py37_2
et_xmlfile 1.0.1 py37_0
expat 2.2.6 he6710b0_0
fastcache 1.0.2 py37h14c3975_2
filelock 3.0.8 py37_0
flask 1.0.2 py37_1
flask-cors 3.0.6 py37_0
fontconfig 2.13.0 h9420a91_0
freetype 2.9.1 h8a8886c_1
fribidi 1.0.5 h7b6447c_0
get_terminal_size 1.0.0 haa9412d_0
gevent 1.3.6 py37h7b6447c_0
glib 2.56.2 hd408876_0
glob2 0.6 py37_0
gmp 6.1.2 h6c8ec71_1
gmpy2 2.0.8 py37h10f8cd9_2
graphite2 1.3.12 h23475e2_2
greenlet 0.4.15 py37h7b6447c_0
gst-plugins-base 1.14.0 hbbd80ab_1
gstreamer 1.14.0 hb453b48_1
h5py 2.8.0 py37h989c5e5_3
harfbuzz 1.8.8 hffaf4a1_0
hdf5 1.10.2 hba1933b_1
heapdict 1.0.0 py37_2
html5lib 1.0.1 py37_0
hyperlink 18.0.0 py37_0
icu 58.2 h9c2bf20_1
idna 3.2 pyhd3eb1b0_0
imageio 2.4.1 py37_0
imagesize 1.1.0 py37_0
incremental 17.5.0 py37_0
intel-openmp 2019.0 118
ipykernel 4.9.0 py37_1
ipython 6.5.0 py37_0
ipython_genutils 0.2.0 py37_0
ipywidgets 7.4.1 py37_0
isort 4.3.4 py37_0
itsdangerous 0.24 py37_1
jbig 2.1 hdba287a_0
jdcal 1.4 py37_0
jedi 0.12.1 py37_0
jeepney 0.3.1 py37_0
jinja2 2.10 py37_0
jpeg 9b h024ee3a_2
jsonschema 2.6.0 py37_0
jupyter 1.0.0 py37_7
jupyter_client 5.2.3 py37_0
jupyter_console 5.2.0 py37_1
jupyter_core 4.4.0 py37_0
jupyterlab 0.34.9 py37_0
jupyterlab_launcher 0.13.1 py37_0
keyring 13.2.1 py37_0
kiwisolver 1.0.1 py37hf484d3e_0
lazy-object-proxy 1.3.1 py37h14c3975_2
ld_impl_linux-64 2.35.1 h7274673_9
libcurl 7.61.0 h1ad7b7a_0
libedit 3.1.20170329 h6b74fdf_2
libffi 3.3 he6710b0_2
libgcc-ng 9.1.0 hdf63c60_0
libgfortran-ng 7.3.0 hdf63c60_0
libpng 1.6.34 hb9fc6fc_0
libsodium 1.0.16 h1bed415_0
libssh2 1.8.0 h9cfc8f7_4
libstdcxx-ng 8.2.0 hdf63c60_1
libtiff 4.0.9 he85c1e1_2
libtool 2.4.6 h544aabb_3
libuuid 1.0.3 h1bed415_2
libxcb 1.13 h1bed415_1
libxml2 2.9.8 h26e45fe_1
libxslt 1.1.32 h1312cb7_0
llvmlite 0.24.0 py37hdbcaa40_0
locket 0.2.0 py37_1
lxml 4.2.5 py37hefd8a0e_0
lzo 2.10 h49e0be7_2
markupsafe 1.0 py37h14c3975_1
matplotlib 2.2.3 py37hb69df0a_0
mccabe 0.6.1 py37_1
mistune 0.8.3 py37h14c3975_1
mkl 2019.0 118
mkl-service 1.1.2 py37h90e4bf4_5
mkl_fft 1.0.4 py37h4414c95_1
mkl_random 1.0.1 py37h4414c95_1
more-itertools 4.3.0 py37_0
mpc 1.1.0 h10f8cd9_1
mpfr 4.0.1 hdf1c602_3
mpmath 1.0.0 py37_2
msgpack-python 0.5.6 py37h6bb024c_1
multipledispatch 0.6.0 py37_0
navigator-updater 0.2.1 py37_0
nbconvert 5.4.0 py37_1
nbformat 4.4.0 py37_0
ncurses 6.2 he6710b0_1
networkx 2.1 py37_0
nltk 3.3.0 py37_0
nose 1.3.7 py37_2
notebook 5.6.0 py37_0
numba 0.39.0 py37h04863e7_0
numexpr 2.6.8 py37hd89afb7_0
numpy 1.15.1 py37h1d66e8a_0
numpy-base 1.15.1 py37h81de0dd_0
numpydoc 0.8.0 py37_0
odo 0.5.1 py37_0
olefile 0.46 py37_0
openpyxl 2.5.6 py37_0
openssl 1.1.1l h7f8727e_0
packaging 17.1 py37_0
pandas 0.23.4 py37h04863e7_0
pandoc 1.19.2.1 hea2e7c5_1
pandocfilters 1.4.2 py37_1
pango 1.42.4 h049681c_0
parso 0.3.1 py37_0
partd 0.3.8 py37_0
patchelf 0.9 hf484d3e_2
path.py 11.1.0 py37_0
pathlib2 2.3.2 py37_0
patsy 0.5.0 py37_0
pcre 8.42 h439df22_0
pep8 1.7.1 py37_0
pexpect 4.6.0 py37_0
pickleshare 0.7.4 py37_0
pillow 5.2.0 py37heded4f4_0
pip 21.2.4 py37h06a4308_0
pixman 0.34.0 hceecf20_3
pkginfo 1.4.2 py37_1
pluggy 0.7.1 py37h28b3542_0
ply 3.11 py37_0
prometheus_client 0.3.1 py37h28b3542_0
prompt_toolkit 1.0.15 py37_0
psutil 5.4.7 py37h14c3975_0
ptyprocess 0.6.0 py37_0
py 1.6.0 py37_0
pyasn1 0.4.4 py37h28b3542_0
pyasn1-modules 0.2.2 py37_0
pycodestyle 2.4.0 py37_0
pycosat 0.6.3 py39h27cfd23_0
pycparser 2.20 py_2
pycrypto 2.6.1 py37h14c3975_9
pycurl 7.43.0.2 py37hb7f436b_0
pyflakes 2.0.0 py37_0
pygments 2.2.0 py37_0
pylint 2.1.1 py37_0
pyodbc 4.0.24 py37he6710b0_0
pyopenssl 20.0.1 pyhd3eb1b0_1
pyparsing 2.2.0 py37_1
pyqt 5.9.2 py37h05f1152_2
pysocks 1.7.1 py39h06a4308_0
pytables 3.4.4 py37ha205bf6_0
pytest 3.8.0 py37_0
pytest-arraydiff 0.2 py37h39e3cac_0
pytest-astropy 0.4.0 py37_0
pytest-doctestplus 0.1.3 py37_0
pytest-openfiles 0.3.0 py37_0
pytest-remotedata 0.3.0 py37_0
python 3.9.7 h12debd9_1
python-dateutil 2.7.3 py37_0
pytz 2018.5 py37_0
pywavelets 1.0.0 py37hdd07704_0
pyyaml 3.13 py37h14c3975_0
pyzmq 17.1.2 py37h14c3975_0
qt 5.9.6 h8703b6f_2
qtawesome 0.4.4 py37_0
qtconsole 4.4.1 py37_0
qtpy 1.5.0 py37_0
readline 8.1 h27cfd23_0
requests 2.26.0 pyhd3eb1b0_0
rope 0.11.0 py37_0
ruamel_yaml 0.15.100 py39h27cfd23_0
scikit-image 0.14.0 py37hf484d3e_1
scikit-learn 0.19.2 py37h4989274_0
scipy 1.1.0 py37hfa4b5c9_1
seaborn 0.9.0 py37_0
secretstorage 3.1.0 py37_0
send2trash 1.5.0 py37_0
service_identity 17.0.0 py37h28b3542_0
setuptools 58.0.4 py39h06a4308_0
simplegeneric 0.8.1 py37_2
singledispatch 3.4.0.3 py37_0
sip 4.19.8 py37hf484d3e_0
six 1.16.0 pyhd3eb1b0_0
snappy 1.1.7 hbae5bb6_3
snowballstemmer 1.2.1 py37_0
sortedcollections 1.0.1 py37_0
sortedcontainers 2.0.5 py37_0
sphinx 1.7.9 py37_0
sphinxcontrib 1.0 py37_1
sphinxcontrib-websupport 1.1.0 py37_1
spyder 3.3.1 py37_1
spyder-kernels 0.2.6 py37_0
sqlalchemy 1.2.11 py37h7b6447c_0
sqlite 3.36.0 hc218d9a_0
statsmodels 0.9.0 py37h035aef0_0
sympy 1.2 py37_0
tblib 1.3.2 py37_0
terminado 0.8.1 py37_1
testpath 0.3.1 py37_0
tk 8.6.11 h1ccaba5_0
toolz 0.9.0 py37_0
tornado 5.1 py37h14c3975_0
tqdm 4.62.2 pyhd3eb1b0_1
traitlets 4.3.2 py37_0
twisted 18.7.0 py37h14c3975_1
tzdata 2021a h5d7bf9c_0
unicodecsv 0.14.1 py37_0
unixodbc 2.3.7 h14c3975_0
urllib3 1.26.6 pyhd3eb1b0_1
wcwidth 0.1.7 py37_0
webencodings 0.5.1 py37_1
werkzeug 0.14.1 py37_0
wheel 0.37.0 pyhd3eb1b0_1
widgetsnbextension 3.4.1 py37_0
wrapt 1.10.11 py37h14c3975_2
xlrd 1.1.0 py37_1
xlsxwriter 1.1.0 py37_0
xlwt 1.3.0 py37_0
xz 5.2.5 h7b6447c_0
yaml 0.2.5 h7b6447c_0
zeromq 4.2.5 hf484d3e_1
zict 0.1.3 py37_0
zlib 1.2.11 h7b6447c_3
zope 1.0 py37_1
zope.interface 4.5.0 py37h14c3975_0

Best,

Jingwei

brisvag commented 1 year ago

Hi, I also can reproduce the same issue. Some extra info: using the mrcfile library to open the file, it seems that the image data ends too early:

mrc = mrcfile.open('denoised.mrc')
File .../mrcfile/mrcinterpreter.py:342, in MrcInterpreter._read_data(self)
    340         return
    341     else:
--> 342         raise ValueError(msg)
    344 self._data = np.frombuffer(data_arr, dtype=dtype).reshape(shape)
    345 self._data.flags.writeable = not self._read_only

ValueError: Expected 1383888480 bytes in data block but could only read 1383838560

However, header_only mode shows a reasonably formatted header, as far as I can tell.

rec.array((958, 926, 390, 2, 0, 0, 0, 958, 926, 390, (16443.111, 15893.863, 6693.96), (90., 90., 90.), 1, 2, 3, 0., 0., 0., 0, 49920, b'\xA0\xC0\x00\x00\x00\x00\x00\x00', b'AGAR', 20140, b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xB4\x42\x00\x00\xB4\x42\x00\x00\xB4\x42', (0., 0., 0.), b'MAP', [68, 68,  0,  0], 0., 0, [b'', b'', b'', b'', b'', b'', b'', b'', b'cryoCARE                                                29-Sep-22  17:28:47     ', b'']),
          dtype=[('nx', '<i4'), ('ny', '<i4'), ('nz', '<i4'), ('mode', '<i4'), ('nxstart', '<i4'), ('nystart', '<i4'), ('nzstart', '<i4'), ('mx', '<i4'), ('my', '<i4'), ('mz', '<i4'), ('cella', [('x', '<f4'), ('y', '<f4'), ('z', '<f4')]), ('cellb', [('alpha', '<f4'), ('beta', '<f4'), ('gamma', '<f4')]), ('mapc', '<i4'), ('mapr', '<i4'), ('maps', '<i4'), ('dmin', '<f4'), ('dmax', '<f4'), ('dmean', '<f4'), ('ispg', '<i4'), ('nsymbt', '<i4'), ('extra1', 'V8'), ('exttyp', 'S4'), ('nversion', '<i4'), ('extra2', 'V84'), ('origin', [('x', '<f4'), ('y', '<f4'), ('z', '<f4')]), ('map', 'S4'), ('machst', 'u1', (4,)), ('rms', '<f4'), ('nlabl', '<i4'), ('label', 'S80', (10,))])
brisvag commented 1 year ago

I tried to fix the headers of the halfmaps with:

with mrcfile.mmap('odd.mrc', mode='r+') as mrc:
    mrc.update_header_from_data()
    mrc.update_header_stats()

But it did't help.

JorMaister commented 1 year ago

Hi Tim-Oliver and Thorsten,

I've made the cryoCARE workflow inside Scipion using two different algorithms for the even/odd tomograms reconstruction: aretomo and imod. With the first one, I experienced the problems reported here (see details below), but I had no problem regarding the predicted denoised tomogram if working with imod. I hope it helps.

This is what I get when I try to load it with Imod 3dmod: image

And with xmipp: image

It seems that a very small portion of the data is lost, but I don't know if there's a relation with the aretomo reconstruction.

Best,

Jorge

thorstenwagner commented 1 year ago

Can you share such a corrupted halfmap?

Best, Thorsten

JorMaister commented 1 year ago

Hi @thorstenwagner,

These are the links for:

  1. The even tomogram reconstructed with aretomo --> https://saco.csic.es/index.php/s/7eHFRFASfKMY2KA
  2. The result of the prediction --> https://saco.csic.es/index.php/s/RNb5XySKiddt4Qr

I hope that helps!

jychoi0616 commented 1 year ago

Now with the Aretomo 1.3 version, this bug was fixed. So now the density information doesn't get lost. However, the incorrectly stitched tomogram issue still exists.

Could that be cryoCARE was designed to be used with tomograms of 16 bits rather than 32 bits? That's the only difference between etomo- or aretomo- generated tomograms for now that I can find.

frosinastojanovska commented 1 year ago

Hi, The problem that I noticed here arises from copying parts of the mrc header that are not the same as the newly saved data. In the aretomo generated tomograms, there are some extra bytes in the mrc files, but in cryoCARE output, those bytes are not written into the file, we only have the necessary data. Still, the header indicates those bytes are there and should be skipped when we open the file which means we cannot read the file properly since then we miss data. I managed to solve the problem by skipping to save the information of extra bytes in the header.

jychoi0616 commented 8 months ago

Hi, thank you! Could you share how you did to skip to save the extra bytes in the header please?

Hi, The problem that I noticed here arises from copying parts of the mrc header that are not the same as the newly saved data. In the aretomo generated tomograms, there are some extra bytes in the mrc files, but in cryoCARE output, those bytes are not written into the file, we only have the necessary data. Still, the header indicates those bytes are there and should be skipped when we open the file which means we cannot read the file properly since then we miss data. I managed to solve the problem by skipping to save the information of extra bytes in the header.

frosinastojanovska commented 8 months ago

Hi @jychoi0616, this is the modified denoise function that worked (from the file https://github.com/juglab/cryoCARE_pip/blob/master/cryocare/scripts/cryoCARE_predict.py):

def denoise(config: dict, mean: float, std: float, even: str, odd: str, output_file: str):
    model = CryoCARE(None, config['model_name'], basedir=config['path'])

    even = mrcfile.mmap(even, mode='r', permissive=True)
    odd = mrcfile.mmap(odd, mode='r', permissive=True)
    shape_before_pad = even.data.shape
    even_vol = even.data
    odd_vol = odd.data
    even_vol = even_vol
    odd_vol = odd_vol

    div_by = model._axes_div_by('XYZ')

    even_vol = pad(even_vol, div_by=div_by)
    odd_vol = pad(odd_vol, div_by=div_by)

    denoised = np.zeros(even_vol.shape)

    even_vol.shape += (1,)
    odd_vol.shape += (1,)
    denoised.shape += (1,)

    model.predict(even_vol, odd_vol, denoised, axes='ZYXC', normalizer=None, mean=mean, std=std,
                  n_tiles=config['n_tiles'] + [1, ])

    denoised = denoised[slice(0, shape_before_pad[0]), slice(0, shape_before_pad[1]), slice(0, shape_before_pad[2])]
    mrc = mrcfile.new_mmap(output_file, denoised.shape, mrc_mode=2, overwrite=True)
    mrc.data[:] = denoised

    important_info = ['nx', 'ny', 'nz', 'mode', 'nxstart', 'nystart', 'nzstart', 'mx', 'my', 'mz']
    for l in even.header.dtype.names:
        if l == 'label':
            new_label = np.concatenate((even.header[l][1:-1], np.array([
                'cryoCARE                                                ' + datetime.datetime.now().strftime(
                    "%d-%b-%y  %H:%M:%S") + "     "]),
                                        np.array([''])))
            print(new_label)
            mrc.header[l] = new_label
        elif l not in important_info:
            continue
        else:
            mrc.header[l] = even.header[l]
    mrc.header['mode'] = 2
jychoi0616 commented 8 months ago

Hi @jychoi0616, this is the modified denoise function that worked (from the file https://github.com/juglab/cryoCARE_pip/blob/master/cryocare/scripts/cryoCARE_predict.py):

def denoise(config: dict, mean: float, std: float, even: str, odd: str, output_file: str):
    model = CryoCARE(None, config['model_name'], basedir=config['path'])

    even = mrcfile.mmap(even, mode='r', permissive=True)
    odd = mrcfile.mmap(odd, mode='r', permissive=True)
    shape_before_pad = even.data.shape
    even_vol = even.data
    odd_vol = odd.data
    even_vol = even_vol
    odd_vol = odd_vol

    div_by = model._axes_div_by('XYZ')

    even_vol = pad(even_vol, div_by=div_by)
    odd_vol = pad(odd_vol, div_by=div_by)

    denoised = np.zeros(even_vol.shape)

    even_vol.shape += (1,)
    odd_vol.shape += (1,)
    denoised.shape += (1,)

    model.predict(even_vol, odd_vol, denoised, axes='ZYXC', normalizer=None, mean=mean, std=std,
                  n_tiles=config['n_tiles'] + [1, ])

    denoised = denoised[slice(0, shape_before_pad[0]), slice(0, shape_before_pad[1]), slice(0, shape_before_pad[2])]
    mrc = mrcfile.new_mmap(output_file, denoised.shape, mrc_mode=2, overwrite=True)
    mrc.data[:] = denoised

    important_info = ['nx', 'ny', 'nz', 'mode', 'nxstart', 'nystart', 'nzstart', 'mx', 'my', 'mz']
    for l in even.header.dtype.names:
        if l == 'label':
            new_label = np.concatenate((even.header[l][1:-1], np.array([
                'cryoCARE                                                ' + datetime.datetime.now().strftime(
                    "%d-%b-%y  %H:%M:%S") + "     "]),
                                        np.array([''])))
            print(new_label)
            mrc.header[l] = new_label
        elif l not in important_info:
            continue
        else:
            mrc.header[l] = even.header[l]
    mrc.header['mode'] = 2

Thanks a lot! This worked :)