Cortical Contributions to Attentional Orienting and Response Cancellation in Action Stopping.
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Jupyter notebook · 577 lines · 21 KB · no license
- # %%
- ############################
- ## import modules
- ############################
- import numpy as np, os, glob, pandas as pd, warnings
- import scipy as sp, seaborn as sns, matplotlib.pyplot as plt
- import statsmodels.api as sm, statsmodels.formula.api as smf
- from scipy.stats import iqr
- from sklearn import preprocessing
- # %%
- # set directories
- workdir = 'F:/projects/okapi/fnirs/fnirs data/homer3/2024-averaging/'
- savedir = 'C:/Users/sarah/OneDrive - University of Tasmania/projects/okapi/data/'
- ## define some variables for the response window
- f=7.8125 # sampling frequency
- ETL=9.5 # trial length
- time = np.arange(0, ETL + 1/f, 1/f)
- # this for some reason is 1 longer than matlab so let's remove the last number
- # (first 75 values line up)
- new_time = time[:-1]
- # find segments of the column that's within the time window
- time_window = (new_time >= 2) & (new_time <= 7)
- print(time_window)
- print(time_window.astype(int))
- # so this is the time window in which we will look for peaks
- # %%
- ##
- ## create foldies
- ##
- # Want some nice subfolders to save this data into to keep it organised
- # If these folders don't exist, this module creates them
- # NB the next module assumes they exist with this structure - if you don't have your data organised this way, the saving at the end
- # will not work and that module will need to be modified (they're in subfolders because I was playing around with different ways
- # to do outlier removal). I do think this is a nice clean folder structure and lets you keep the raw + normalised data without risking
- # confusion.
- for subject in os.listdir(savedir):
- if 'sub-0' in subject:
- iqr_folder = 'iqr3'
- behav = 'behav'
- emg = 'emg'
- path = os.path.join(savedir, subject, iqr_folder)
- path1 = os.path.join(savedir, subject, iqr_folder, behav)
- path2 = os.path.join(savedir, subject, iqr_folder, emg)
- if not os.path.exists(path):
- os.makedirs(path)
- os.makedirs(path1)
- os.makedirs(path2)
- # %% [markdown]
- # ## Behavioural data crunching
- # %%
- # for each participant and region, we need to go through and the files that are relevant
- # then need to find the IQR and exclude, and probably let's save all the images
- # this is the BEHAVIOURAL DATA, ie this does not access the dataframes that have
- # information about partial burst splits
- # go through each participant and exclude the IQR per region
- regions = ['LIFG', 'RIFG', 'preSMA']
- for subject in os.listdir(workdir):
- if 'sub-0' in subject: # if it's an actual subject
- print('Processing', subject, '...')
- for region in regions:
- # load the files
- alltrials = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_ALL.csv')
- alltrials = alltrials.dropna(axis=1) # get rid of nans
- fs = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_FS.csv')
- ss = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_SS.csv')
- ig = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_I.csv')
- go = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_GO.csv')
- stops = pd.concat([ss, fs], axis=1)
- stops = stops.dropna(axis=1)
- ig = ig.dropna(axis=1)
- go = go.dropna(axis=1)
- dfs = [stops, go, ig]
- df_names = ['stops', 'go', 'ig']
- # dictionary to store filtered dfs
- filtered_dfs = {}
- for i, df in enumerate(dfs):
- # Find the IQR - find the highest absolute value in each column and IQR from there
- highest_abs = [df[column].abs().max() for column in df.columns]
- iqr_value = iqr(highest_abs)
- # Filter columns
- filtered_columns = [column for column in df.columns if not (df[column].abs() > 3 * iqr_value).any()]
- filtered_dfs[df_names[i]] = df[filtered_columns]
- # print(f"{df_names[i].capitalize()}:")
- # print(f"Original number of columns: {len(df.columns)}")
- # print(f"Filtered number of columns: {len(filtered_dfs[df_names[i]].columns)}\n")
- stops_filtered = filtered_dfs['stops']
- go_filtered = filtered_dfs['go']
- ig_filtered = filtered_dfs['ig']
- # separate stops out again
- fs_columns = [col for col in stops_filtered.columns if "FS" in col]
- fs_filtered = stops[fs_columns]
- ss_columns = [col for col in stops_filtered.columns if "SS" in col]
- ss_filtered = stops[ss_columns]
- ## NORMALISE
- # Now each trial is going to get normalised by that person's average SD
- # First finds the SD of each trial, then finds the average SD, then divides all values by that avg SD
- individual_sds = alltrials.apply(np.std)
- avg_sd = np.mean(individual_sds)
- alltrials_normalised = alltrials.div(avg_sd)
- ## GET TRIALS
- # now we've normalised all the data, we want to retain only the columns that weren't outliers
- # Really tediously the headings aren't named consistently so let's rename them.
- fs_filtered.columns = fs_filtered.columns.str.replace('FS', 'ALL')
- ss_filtered.columns = ss_filtered.columns.str.replace('SS', 'ALL')
- ig_filtered.columns = ig_filtered.columns.str.replace('_I', '_ALL')
- go_filtered.columns = go_filtered.columns.str.replace('GO', 'ALL')
- #extract which headings are which trial type
- fs_headings = fs_filtered.columns
- ss_headings = ss_filtered.columns
- ig_headings = ig_filtered.columns
- go_headings = ig_filtered.columns
- # now grab the trials we want from the big normalised dataframe
- fs_norm = alltrials_normalised[[col for col in fs_headings if col in alltrials_normalised.columns]]
- ss_norm = alltrials_normalised[[col for col in ss_headings if col in alltrials_normalised.columns]]
- ig_norm = alltrials_normalised[[col for col in ig_headings if col in alltrials_normalised.columns]]
- go_norm = alltrials_normalised[[col for col in go_headings if col in alltrials_normalised.columns]]
- fs_norm.to_csv(savedir + subject + '/iqr3/behav/' + region + '_FS_norm.csv', index=False)
- ss_norm.to_csv(savedir + subject + '/iqr3/behav/' + region + '_SS_norm.csv', index=False)
- ig_norm.to_csv(savedir + subject + '/iqr3/behav/' + region + '_IG_norm.csv', index=False)
- go_norm.to_csv(savedir + subject + '/iqr3/behav/' + region + '_GO_norm.csv', index=False)
- print('finito')
- # %%
- ## EXTRACT PEAK VALUES >>>
- # for each trial, we want to get the value of the local maximum
- ## now let's find all the peaks and save them to a df
- warnings.filterwarnings("ignore")
- behavpeaks = pd.DataFrame(columns=['subject', 'region', 'peak_value'])
- timeseries = pd.DataFrame()
- for subject in os.listdir(savedir):
- number = 1
- if 'sub-0' in subject:
- print('Getting peaks for ', subject)
- # look through the subject's folder and find any CSV files
- csvs = glob.glob(savedir + subject +'/iqr3/behav/*norm.csv')
- for csv in csvs:
- # find the filename
- filename = os.path.basename(csv)
- filename = os.path.splitext(filename)[0]
- # load the file
- df = pd.read_csv(str(csv))
- # now look through the file
- for column in df.columns:
- if df[column].isnull().all(): # check it's not a null
- continue
- elif (df[column] == 0).all():
- continue
- # if the column has stuff in it, find the peak :)
- else:
- # find relevant segment in the time window
- relevant_segment = df.loc[time_window, column].values
- # find the peak of this
- peak_location = sp.signal.find_peaks(relevant_segment)
- # need to add an if statement checking that PL[0] is not empty
- # then find the value of the peak
- if not peak_location[0].any():
- peak_value = np.nan
- else:
- # this can either grab the largest of multiple points, or it can grab the first peak
- # I've got it getting the first peak but you might want to change it
- # just comment out the right bit
- first_peak = peak_location[0][0]
- peak_value = relevant_segment[first_peak]
- # highest_peak_index = np.argmax(relevant_segment[peak_location[0]])
- # highest_peak = peak_location[0][highest_peak_index]
- # peak_value = relevant_segment[highest_peak]
- # and grab that column for graphing later by appending time series
- timeseries[f'{subject}_{filename}_{number}'] = df[column]
- number = number + 1
- # save peak_value and add this new row to allpeaks
- new_row = pd.DataFrame({
- 'subject': [subject],
- 'region': [filename],
- 'peak_value': [peak_value]})
- behavpeaks = pd.concat([behavpeaks, new_row], ignore_index=True)
- #behavpeaks.to_csv(savedir + 'fnirs_behav.csv', index=False)
- # let's make the file called behavpeaks a bit prettier so we can analyse it
- def findTrialType (s):
- if 'SS' in s:
- return 'Successful stop'
- elif 'FS' in s:
- return 'Failed stop'
- elif 'IG' in s:
- return 'Ignore'
- elif 'GO' in s:
- return 'Go'
- else:
- return 'error'
- behavpeaks['trial'] = behavpeaks['region'].apply(findTrialType)
- behavpeaks['roi'] = behavpeaks['region'].apply(lambda x: x.split('_')[0]) # get the name before the first _
- behavpeaks.to_csv(savedir + 'fnirs_behav_norm.csv', index=False)
- print('done')
- # %% [markdown]
- # # graph data
- # %%
- fs = pd.read_csv(savedir + 'sub-009/behav/LIFG_FS_raw.csv')
- ss = pd.read_csv(savedir + 'sub-009/behav/LIFG_SS_raw.csv')
- ig = pd.read_csv(savedir + 'sub-009/behav/LIFG_IG_raw.csv')
- go = pd.read_csv(savedir + 'sub-009/behav/LIFG_GO_raw.csv')
- data_list = [(fs, 'Failed stops'),
- (ss, 'Successful stops'),
- (ig, 'Ignore trials'),
- (go, 'Go')]
- # Loop through each dataset and create a new figure for each plot
- for data, label in data_list:
- plt.figure()
- #plt.plot(data, linewidth=0.7)
- data.iloc[:, :8].plot()
- plt.title(label) # Optionally, add a title to each figure
- plt.show()
- # %%
- fs = pd.read_csv(savedir + 'sub-022/LIFG_FS_norm.csv')
- ss = pd.read_csv(savedir + 'sub-022/LIFG_SS_norm.csv')
- ig = pd.read_csv(savedir + 'sub-022/LIFG_IG_norm.csv')
- go = pd.read_csv(savedir + 'sub-022/LIFG_GO_norm.csv')
- data_list = [(fs, 'Failed stops'),
- (ss, 'Successful stops'),
- (ig, 'Ignore trials'),
- (go, 'Go')]
- # Loop through each dataset and create a new figure for each plot
- for data, label in data_list:
- plt.figure()
- plt.plot(data, linewidth=0.7)
- plt.title(label) # Optionally, add a title to each figure
- plt.show()
- # %% [markdown]
- # # EMG contrast
- # Now do the same thing I just did with the behavioural contrast, but using the EMG
- #
- # So in this instance we are just going to have successful stop and ignore trials and split them by partial burst presence
- # %%
- # I don't want this to rely on the behavioural portion of this script - want to be able to do this individually
- # therefore have some repetition here but we'll live with this
- # note to self probably an idea to try and use process at some point, this is a bit slow
- regions = ['LIFG', 'RIFG', 'preSMA']
- for subject in os.listdir(workdir):
- if 'sub-0' in subject: # if it's an actual subject
- print('Processing', subject, '...')
- for region in regions:
- # trial types:
- # s_pr > stop with partial response
- # s_nr > stop no partial response
- # i_pr > ignore with partial response
- # i_nr > ignore no partial response
- # load the files
- alltrials = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_ALL.csv')
- alltrials = alltrials.dropna(axis=1) # get rid of nans
- s_pr = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_SS_PB.csv')
- s_nr = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_SS_NB.csv')
- i_pr = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_I_PB.csv')
- i_nr = pd.read_csv(workdir + subject + '/derivatives/homer/' + region + '_I_NB.csv')
- # put stops and ignores together
- stops = pd.concat([s_pr, s_nr], axis=1)
- ignores = pd.concat([i_pr, i_nr], axis=1)
- stops = stops.dropna(axis=1)
- ignores = ignores.dropna(axis=1)
- dfs = [stops, ignores]
- df_names = ['stops', 'ignores']
- filtered_dfs = {}
- for i, df in enumerate(dfs):
- highest_abs = [df[column].abs().max() for column in df.columns]
- iqr_value = iqr(highest_abs)
- filtered_columns = [column for column in df.columns if not (df[column].abs() > 3 * iqr_value).any()]
- filtered_dfs[df_names[i]] = df[filtered_columns]
- stops_filtered = filtered_dfs['stops']
- ig_filtered = filtered_dfs['ignores']
- s_pr_columns = [col for col in stops_filtered.columns if "_PB" in col]
- s_pr_filtered = stops[s_pr_columns]
- s_nr_columns = [col for col in stops_filtered.columns if "_NB" in col]
- s_nr_filtered = stops[s_nr_columns]
- i_pr_columns = [col for col in ig_filtered.columns if "_PB" in col]
- i_pr_filtered = ignores[i_pr_columns]
- i_nr_columns = [col for col in ig_filtered.columns if "_NB" in col]
- i_nr_filtered = ignores[i_nr_columns]
- ## NORMALISE
- # First finds the SD of each trial (for that ROI)
- # then calculates the average SD, then divides all values by that avg SD
- individual_sds = alltrials.apply(np.std)
- avg_sd = np.mean(individual_sds)
- alltrials_normalised = alltrials.div(avg_sd)
- ## GET TRIALS
- # Rename the columns first
- s_pr_filtered.columns = s_pr_filtered.columns.str.replace('SS_PB', 'ALL')
- s_nr_filtered.columns = s_nr_filtered.columns.str.replace('SS_NB', 'ALL')
- i_pr_filtered.columns = i_pr_filtered.columns.str.replace('I_PB', 'ALL')
- i_nr_filtered.columns = i_nr_filtered.columns.str.replace('I_NB', 'ALL')
- #extract which headings are which trial type
- s_pr_heads = s_pr_filtered.columns
- s_nr_heads = s_nr_filtered.columns
- i_pr_heads = i_pr_filtered.columns
- i_nr_heads = i_nr_filtered.columns
- # now grab the trials we want from the now-normalised data
- s_pr_norm = alltrials_normalised[[col for col in s_pr_heads if col in alltrials_normalised.columns]]
- s_nr_norm = alltrials_normalised[[col for col in s_nr_heads if col in alltrials_normalised.columns]]
- i_pr_norm = alltrials_normalised[[col for col in i_pr_heads if col in alltrials_normalised.columns]]
- i_nr_norm = alltrials_normalised[[col for col in i_nr_heads if col in alltrials_normalised.columns]]
- # now save the normed data
- s_pr_norm.to_csv(savedir + subject + '/iqr3/emg/' + region + '_S_PR_norm.csv', index=False)
- s_nr_norm.to_csv(savedir + subject + '/iqr3/emg/' + region + '_S_NR_norm.csv', index=False)
- i_pr_norm.to_csv(savedir + subject + '/iqr3/emg/' + region + '_I_PR_norm.csv', index=False)
- i_nr_norm.to_csv(savedir + subject + '/iqr3/emg/' + region + '_I_NR_norm.csv', index=False)
- print('done!')
- # %%
- ## EXTRACT PEAK VALUES >>>
- # for each trial, we want to get the value of the local maximum
- ## now let's find all the peaks and save them to a df
- warnings.filterwarnings("ignore")
- emgpeaks = pd.DataFrame(columns=['subject', 'region', 'peak_value'])
- timeseries = pd.DataFrame()
- for subject in os.listdir(savedir):
- number = 1
- if 'sub-0' in subject:
- print('Getting peaks for ', subject)
- # look through the subject's folder and find any CSV files
- csvs = glob.glob(savedir + subject +'/iqr3/emg/*norm.csv')
- for csv in csvs:
- # find the filename
- filename = os.path.basename(csv)
- filename = os.path.splitext(filename)[0]
- # load the file
- df = pd.read_csv(str(csv))
- # now look through the file
- for column in df.columns:
- if df[column].isnull().all(): # check it's not a null
- continue
- elif (df[column] == 0).all():
- continue
- # if the column has stuff in it, find the peak :)
- else:
- # find relevant segment in the time window
- relevant_segment = df.loc[time_window, column].values
- # find the peak of this
- peak_location = sp.signal.find_peaks(relevant_segment)
- # need to add an if statement checking that PL[0] is not empty
- # then find the value of the peak
- if not peak_location[0].any():
- peak_value = np.nan
- else:
- # highest_peak_index = np.argmax(relevant_segment[peak_location[0]])
- # highest_peak = peak_location[0][highest_peak_index]
- # peak_value = relevant_segment[highest_peak]
- first_peak = peak_location[0][0]
- peak_value = relevant_segment[first_peak]
- # and grab that column for graphing later by appending time series
- timeseries[f'{subject}_{filename}_{number}'] = df[column]
- number = number + 1
- # save peak_value and add this new row to allpeaks
- new_row = pd.DataFrame({
- 'subject': [subject],
- 'region': [filename],
- 'peak_value': [peak_value]})
- emgpeaks = pd.concat([emgpeaks, new_row], ignore_index=True)
- # emgpeaks.to_csv(savedir + 'fnirs_emg_firstpeak.csv', index=False)
- # print('saved - now beautifying')
- # let's make the file called emgpeaks a bit prettier so we can analyse it
- def findTrialType (s):
- if '_S_' in s:
- return 'Stop'
- elif '_I_' in s:
- return 'Ignore'
- else:
- return 'error'
- def findPartialResponse (s):
- if '_PR_' in s:
- return 'Present'
- elif '_NR_' in s:
- return 'Absent'
- else:
- return 'error'
- emgpeaks['trial'] = emgpeaks['region'].apply(findTrialType)
- emgpeaks['partial_response'] = emgpeaks['region'].apply(findPartialResponse)
- emgpeaks['roi'] = emgpeaks['region'].apply(lambda x: x.split('_')[0]) # get the name before the first _
- emgpeaks.to_csv(savedir + 'fnirs_emg_norm.csv', index=False)
- print('done')
- # %% [markdown]
- # # graph data
- # %%
- # let's see if we have data
- s_pr = pd.read_csv(savedir + 'sub-002/emg/LIFG_S_PR_norm.csv')
- s_nr = pd.read_csv(savedir + 'sub-002/emg/LIFG_S_NR_norm.csv')
- i_pr = pd.read_csv(savedir + 'sub-002/emg/LIFG_I_PR_norm.csv')
- i_nr = pd.read_csv(savedir + 'sub-002/emg/LIFG_I_NR_norm.csv')
- data_list = [(s_pr, 'Stop partial resp'),
- (s_nr, 'Stop no resp'),
- (i_pr, 'Ignore partial resp'),
- (i_nr, 'Ignore no resp')]
- # Loop through each dataset and create a new figure for each plot
- for data, label in data_list:
- plt.figure()
- data.iloc[:, :8].plot()
- plt.title(label) # Optionally, add a title to each figure
- plt.show()
- # %%
- emgpeaks.groupby(['roi', 'trial'])['peak_value'].median()
- #emgpeaks
- # %%
- # let's do some visualising
- sns.displot(behavpeaks, x='peak_value', hue='subject', kind='kde', col='trial')
- #plt.show()
- # %%
- # presma
- sns.set_theme('paper')
- sns.pointplot(data=emgpeaks[emgpeaks['roi'] == 'preSMA'],
- x='trial', y='peak_value', errorbar='se')
- # %%
- sns.pointplot(data=behavpeaks[behavpeaks['roi'] == 'preSMA'],
- x='trial', y='peak_value', errorbar='se')
- # %%
- sns.pointplot(data=allpeaks[allpeaks['roi'] == 'LIFG'],
- x='trial', y='peak_value', errorbar='se')
- # %%
- # let's look at everyone's raw data
- for subject in os.listdir(savedir):
- number = 1
- if 'sub-0' in subject:
- print('Getting peaks for ', subject)
- # look through the subject's folder and find any CSV files
- csvs = glob.glob(savedir + subject +'/*_norm.csv')
- for csv in csvs:
- print('hello')
- # %% [markdown]
- # # checking stuff
fnirs peaks and figures.ipynb, no license · at the source
Overview
- School of Psychological Sciences, College of Health and Medicine, University of Tasmania, Hobart, Australia
- Department of Psychology, University of Amsterdam, Amsterdam, the Netherlands
- Wicking Dementia and Research Education Centre, University of Tasmania, Hobart, Australia
- Full Brain Picture Analytics, Leiden, the Netherlands
Abstract
Action cancellation involves the termination of planned or ongoing movement, likely initiated in the cortex by the pre‐supplementary motor area (preSMA) and inferior frontal gyrus (IFG). It is frequently examined using the stop‐signal task; electromyography (EMG) studies have shown action cancellation (in stop trials) can involve the partial activation of the responding muscles, which does not result in an overt behavioral response. The neural correlates of these partial responses are not well understood. Here, we combined functional near‐infrared spectroscopy (fNIRS) and EMG to examine the neural correlates of terminated actions (partial responses) in a response‐ and stimulus‐selective stop signal task, controlling for attentional confounds by comparing neural activity in stop and ignore trials. fNIRS analyses revealed increased preSMA activity in successful stop compared to ignore trials, but no such differences in the IFG, consistent with postulations that the preSMA is involved uniquely in action cancellation, while the IFG responds generically to unexpected stimuli. Critically, preSMA activity was greater in trials without partial muscle activation, potentially due to proactive inhibitory processes pre‐emptively suppressing motor output in these trials. These findings advance understanding of some of the neurophysiological dynamics involved in action cancellation and highlight the utility of combining fNIRS with EMG in this domain.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above.
OSF ztb5m
Availability: 1 check, the latest on 26 September 2026: the link answers (HTTP 200)
- 26 September 2026: the link answers (HTTP 200)
1 file
- code/
fnirs peaks and figures.ipynb , Jupyter, 577 lines
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 1 script, each with its path and the digest of its content;
- no match between paragraphs and code yet;
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data Availability Statement
The data that support the findings of this study are available on request from the corresponding author. The data are not publicly available due to privacy or ethical restrictions.
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 3, 28 September 2026
- Publisher: n/a → Wiley
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 13 MeSH terms, 1 funder, 93 references.
Cite
This paper
Kemp, S. A., Salomoni, S., Bazin, P., Pash, L., St George, R. J., & Hinder, M. R. (2026). Cortical Contributions to Attentional Orienting and Response Cancellation in Action Stopping. Psychophysiology, 63(9), e70397. https://
BibTeX
@article{kemp2026cortica
author = {Kemp, Sarah A and Salomoni, Sauro and Bazin, Pierre‐Louis and Pash, Luke and St George, Rebecca J and Hinder, Mark R},
title = {{Cortical Contributions to Attentional Orienting and Response Cancellation in Action Stopping}},
journal = {Psychophysiology},
year = {2026},
month = sep,
volume = {63},
number = {9},
pages = {e70397},
publisher = {Wiley},
issn = {0048-5772},
doi = {10.1111/
url = {https://
pmid = {42704230},
pmcid = {PMC13548964}
}
RIS
TY - JOUR
AU - Kemp, Sarah A
AU - Salomoni, Sauro
AU - Bazin, Pierre‐Louis
AU - Pash, Luke
AU - St George, Rebecca J
AU - Hinder, Mark R
TI - Cortical Contributions to Attentional Orienting and Response Cancellation in Action Stopping
T2 - Psychophysiology
J2 - Psychophysiology
PY - 2026
DA - 2026/
VL - 63
IS - 9
SP - e70397
SN - 0048-5772
PB - Wiley
DO - 10.1111/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1111/
"type": "article-journal",
"title": "Cortical Contributions to Attentional Orienting and Response Cancellation in Action Stopping",
"container-title": "Psychophysiology",
"author": [
{
"family": "Kemp",
"given": "Sarah A"
},
{
"family": "Salomoni",
"given": "Sauro"
},
{
"family": "Bazin",
"given": "Pierre‐Louis"
},
{
"family": "Pash",
"given": "Luke"
},
{
"family": "St George",
"given": "Rebecca J"
},
{
"family": "Hinder",
"given": "Mark R"
}
],
"container-title-short":
"volume": "63",
"issue": "9",
"page": "e70397",
"DOI": "10.1111/
"PMID": "42704230",
"PMCID": "PMC13548964",
"ISSN": "0048-5772",
"publisher": "Wiley",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
9,
1
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1371/journal.pbio.3003635 [code]
- A cortico-subthalamic circuit rapidly engages and releases inhibition of specific movements depending on the environmental context.Journal: PLoS biologyIn common: 14 references
- [2] doi:10.1016/j.isci.2026.116034
- Distinct temporal patterns of beta bursts differentiate successful and failed movement cancellation.Journal: iScienceIn common: cognitive, 10 references
- [3] doi:10.1038/s41467-026-71404-0 [code]
- Nonergodicity and Simpson's paradox in neurocognitive dynamics of cognitive control.Journal: Nature communicationsIn common: statsmodels, seaborn, scikit-learn, 4 other tools, cognitive, 5 references
- [4] doi:10.1162/imag.a.1208 [code]
- Brain network analysis in Alzheimer's disease and mild cognitive impairment using high-density diffuse optical tomography.Journal: Imaging neuroscience (Cambridge, Mass.)In common: statsmodels, seaborn, scikit-learn, 4 other tools, fNIRS, 3 references
- [5] doi:10.1117/1.nph.13.2.025001 [code]
- Surface-based image reconstruction optimization for high-density functional near-infrared spectroscopy.Journal: NeurophotonicsIn common: statsmodels, seaborn, scikit-learn, 4 other tools, fNIRS, 2 references
- [6] doi:10.1162/imag.a.1279 [code]
- Multimodal laminar characterization of visual areas along the cortical hierarchy.Journal: Imaging neuroscience (Cambridge, Mass.)In common: statsmodels, pandas, SciPy, 2 other tools, author Pierre‐Louis Bazin
- [7] doi:10.1371/journal.pcbi.1012966 [code]
- How the dynamic interplay of cortico-basal ganglia-thalamic pathways shapes the time course of deliberation and commitment.Journal: PLoS computational biologyIn common: seaborn, pandas, SciPy, 2 other tools, cognitive, 3 references
- [8] doi:10.1002/ana.78203 [code]
- AI-Driven Mapping of Seizure Spread Patterns.Journal: Annals of neurologyIn common: statsmodels, seaborn, scikit-learn, 4 other tools, 2 references
- [9] doi:10.1002/advs.202523009 [code]
- Personalized Network-Guided Neuromodulation Enhances Human Working Memory.Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)In common: statsmodels, seaborn, scikit-learn, 4 other tools, other, cognitive, 1 reference
- [10] doi:10.1371/journal.pone.0358044 [code]
- An exploratory fNIRS study on directional asymmetry in segmental discrimination: Lateral-rhotic (/
la-ra/ ) and labial-dorsal (/ ba-ga/ ) contrasts tested in 5- and 9-month-old Japanese infants. Journal: PloS oneIn common: seaborn, pandas, SciPy, 2 other tools, fNIRS, 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 1 script, and 0 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:aaf7c8c101164015…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
