Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions tedana/gscontrol.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ def minimum_image_regression(
# Tedana has removed the "ignored" classification,
# so we must separate "accepted" components based on the classification tag(s).
ignore_tags = ["low variance", "accept borderline"]
if not any(tag in classification_tags for tag in ignore_tags):
if not any(tag in [c.lower() for c in classification_tags] for tag in ignore_tags):
LGR.warning(
"Decision tree does not contain classification tags indicating low variance "
f"components ({', '.join(ignore_tags)})."
Expand All @@ -232,7 +232,9 @@ def minimum_image_regression(

# Select rows where the 'classification_tags' column contains any of the ignore tags
ign = component_table[
component_table.classification_tags.str.contains(pattern, na=False, regex=True)
component_table.classification_tags.str.lower().str.contains(
pattern, na=False, regex=True
)
].index.values

acc = component_table[component_table.classification == "accepted"].index.values
Expand Down
20 changes: 6 additions & 14 deletions tedana/reporting/data/html/report_body_template.html
Original file line number Diff line number Diff line change
Expand Up @@ -283,33 +283,25 @@ <h2>
<div class="carpet-plots">
<h2>Global Signal Control</h2>
{% if gsr %}
<h3>Global Signal Regression Weights</h3>
<h3>Global Signal Regression</h3>
<div class="carpet-plots-image">
<img
id="gsrBrainPlot"
src="{{ gsrBrainPlot }}"
id="gsrPlot"
src="{{ gsrPlot }}"
style="width: 95%; max-width: 1200px; height: auto"
/>
</div>
{% endif %}
{% if mir %}
<h3>Minimum Image Regression Weights</h3>
<h3>Minimum Image Regression</h3>
<div class="carpet-plots-image">
<img
id="mirBrainPlot"
src="{{ mirBrainPlot }}"
id="mirPlot"
src="{{ mirPlot }}"
style="width: 95%; max-width: 1200px; height: auto"
/>
</div>
{% endif %}
<h3>Global Signal Timeseries</h3>
<div class="carpet-plots-image">
<img
id="gsrTimeseries"
src="{{ gsrTimeseries }}"
style="width: 95%; max-width: 1200px; height: auto"
/>
</div>
</div>
{% endif %}
{% if externalRegressorsExist %}
Expand Down
19 changes: 8 additions & 11 deletions tedana/reporting/html_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,14 +190,12 @@ def _update_template_bokeh(
rmse_timeseries = f"./figures/{rmse_timeseries_filename}"

# Check for gscontrol images
gsr_brain_filename = f"{prefix}gsr_boldmap.svg"
mir_brain_filename = f"{prefix}T1likeEffect_boldmap.svg"
gsr_timeseries_filename = f"{prefix}gscontrol_bold.svg"
gsr_brain = f"./figures/{gsr_brain_filename}"
mir_brain = f"./figures/{mir_brain_filename}"
gsr_timeseries = f"./figures/{gsr_timeseries_filename}"
gsr = gsr_brain_filename in files_in_figures and gsr_timeseries_filename in files_in_figures
mir = mir_brain_filename in files_in_figures and gsr_timeseries_filename in files_in_figures
gsr_filename = f"{prefix}gsr_boldmap.svg"
mir_filename = f"{prefix}mir_boldmap.svg"
gsr_file = f"./figures/{gsr_filename}"
mir_file = f"./figures/{mir_filename}"
gsr = gsr_filename in files_in_figures
mir = mir_filename in files_in_figures

# Check if each set of images exists
t2star_exists = (
Expand Down Expand Up @@ -256,9 +254,8 @@ def _update_template_bokeh(
rmseExists=rmse_exists,
gsr=gsr,
mir=mir,
gsrBrainPlot=gsr_brain,
mirBrainPlot=mir_brain,
gsrTimeseries=gsr_timeseries,
gsrPlot=gsr_file,
mirPlot=mir_file,
externalRegressorsExist=external_regressors_exist,
externalRegressorCorrelations=external_regressor_correlations,
references=references,
Expand Down
111 changes: 45 additions & 66 deletions tedana/reporting/static_figures.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import nibabel as nb
import numpy as np
import pandas as pd
import scipy.stats as sstats

matplotlib.use("AGG")
import matplotlib.pyplot as plt
Expand Down Expand Up @@ -825,6 +824,7 @@ def plot_gscontrol(
*,
io_generator: io.OutputGenerator,
gscontrol: list,
png_cmap: str,
):
"""Plot the results of the gscontrol steps.

Expand All @@ -837,78 +837,57 @@ def plot_gscontrol(
"""
import pandas as pd

if "gsr" in gscontrol:
gsr_img = io_generator.get_name("gs img")
gsr_plot = f"{io_generator.prefix}gsr_boldmap.svg"
with warnings.catch_warnings():
warnings.filterwarnings(
"ignore",
message="A non-diagonal affine.*",
category=UserWarning,
)
plotting.plot_stat_map(
gsr_img,
bg_img=None,
display_mode="mosaic",
symmetric_cbar=True,
black_bg=True,
cmap="coolwarm",
annotate=False,
output_file=os.path.join(io_generator.out_dir, "figures", gsr_plot),
resampling_interpolation="nearest",
)

if "mir" in gscontrol:
mir_img = io_generator.get_name("t1 like img")
mir_plot = f"{io_generator.prefix}T1likeEffect_boldmap.svg"
with warnings.catch_warnings():
warnings.filterwarnings(
"ignore",
message="A non-diagonal affine.*",
category=UserWarning,
)
plotting.plot_stat_map(
mir_img,
bg_img=None,
display_mode="mosaic",
symmetric_cbar=True,
black_bg=True,
cmap="coolwarm",
annotate=False,
output_file=os.path.join(io_generator.out_dir, "figures", mir_plot),
resampling_interpolation="nearest",
)

if "gsr" in gscontrol or "mir" in gscontrol:
confounds_file = io_generator.get_name("confounds tsv")
confounds_df = pd.read_table(confounds_file)

# Get repetition time from reference image
tr = io_generator.reference_img.header.get_zooms()[-1]
time_arr = np.arange(confounds_df.shape[0]) * tr

fig, ax = plt.subplots(figsize=(10, 6))
if "gsr" in gscontrol:
gs = confounds_df["global_signal"].values
gs_z = sstats.zscore(gs)
ax.plot(time_arr, gs_z, label="GSR", color="red")

if "mir" in gscontrol:
mir = confounds_df["mir_global_signal"].values
mir_z = sstats.zscore(mir)
ax.plot(time_arr, mir_z, label="MIR", color="blue")

ax.legend()
ax.set_title("Global Signals")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Signal (z-scored)")
ax.set_xlim(0, time_arr[-1])
fig.savefig(
os.path.join(
io_generator.out_dir,
"figures",
f"{io_generator.prefix}gscontrol_bold.svg",
)
if "gsr" in gscontrol:
gsr_img = nb.load(io_generator.get_name("gs img"))

# Get fft and freqs for this component
# adapted from @dangom
timeseries = confounds_df["global_signal"].values
spectrum, freqs = utils.get_spectrum(timeseries, tr)

plot_name = f"{io_generator.prefix}gsr_boldmap.svg"
plot_name = os.path.join(io_generator.out_dir, "figures", plot_name)

plot_component(
stat_img=gsr_img,
component_timeseries=timeseries,
power_spectrum=spectrum,
frequencies=freqs,
tr=tr,
classification_color="red",
png_cmap=png_cmap,
title="Global Signal Regression",
out_file=plot_name,
)

if "mir" in gscontrol:
mir_img = nb.load(io_generator.get_name("t1 like img"))

# Get fft and freqs for this component
# adapted from @dangom
timeseries = confounds_df["mir_global_signal"].values
spectrum, freqs = utils.get_spectrum(timeseries, tr)

plot_name = f"{io_generator.prefix}mir_boldmap.svg"
plot_name = os.path.join(io_generator.out_dir, "figures", plot_name)

plot_component(
stat_img=mir_img,
component_timeseries=timeseries,
power_spectrum=spectrum,
frequencies=freqs,
tr=tr,
classification_color="red",
png_cmap=png_cmap,
title="Minimum Image Regression",
out_file=plot_name,
)


Expand Down
3 changes: 1 addition & 2 deletions tedana/tests/data/fiu_four_echo_outputs.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,7 @@ figures/sub-01_carpet_rejected.svg
figures/sub-01_carpet_optcom_nogsr.svg
figures/sub-01_carpet_denoised_mir.svg
figures/sub-01_carpet_accepted_mir.svg
figures/sub-01_T1likeEffect_boldmap.svg
figures/sub-01_gscontrol_bold.svg
figures/sub-01_mir_boldmap.svg
figures/sub-01_gsr_boldmap.svg
figures/sub-01_comp_000.png
figures/sub-01_comp_001.png
Expand Down
1 change: 1 addition & 0 deletions tedana/workflows/tedana.py
Original file line number Diff line number Diff line change
Expand Up @@ -1211,6 +1211,7 @@ def tedana_workflow(
reporting.static_figures.plot_gscontrol(
io_generator=io_generator,
gscontrol=gscontrol,
png_cmap=png_cmap,
)

if external_regressors is not None:
Expand Down
Loading