Autonomic indicators of self-transcendence: insights from the numadelic VR paradigm.
The 3 matches
- [1] § Materials and Methods › Physiological data collection › Data preprocessing ↔ 3ECG_RespProcessing_UPDATED.ipynb, lines 452–498 · score 0.66 · moving median, signal envelope, outliers, window, amplitude
- [2] § Materials and Methods › Physiological data collection › Data preprocessing ↔ 3ECG_RespProcessing_UPDATED.ipynb, lines 43–46 · score 0.65 · ecg_process, peak detection, ECG signal, preprocessing
- [3] § Materials and Methods › Physiological data collection › Data preprocessing ↔ 3ECG_RespProcessing_UPDATED.ipynb, lines 43–46 · score 0.53 · peak detection, ECG signals, preprocessed, quality
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 · 521 lines · 16 KB · no license · 3 matches
- # %%
- #pip install
- #pip install
- #pip install neurokit2 hrv-analysis PyWavelets mne astropy numpy
- # %%
- import neurokit2 as nk
- import pandas as pd
- import matplotlib.pyplot as plt
- import numpy as np
- import os
- import scipy.io
- from pathlib import Path
- from scipy.stats import variation
- import multiprocessing
- plt.rcParams['figure.figsize'] = 15, 5
- f=180 #sampling frequency
- # %% [markdown]
- # ## ECG data preprocessing ##
- # %%
- Type = 'VR' # VR or Control
- Session = 'Session4'
- Shimmer = 'S4'
- Section = 'Baseline'
- #Section= 'Medit'
- #Section ='PostMedit'
- relative_dir = os.path.join('..', 'Ripple','Processed_data', Type, Session, Shimmer, Section)
- # Read the CSV file using the relative path
- csv_file_path = os.path.join(relative_dir, f'{Section}.csv')
- data = pd.read_csv(csv_file_path)
- data.columns = data.columns.str.extract(r'(ECG.*)', expand=False)
- ecg=data['ECG_LA_RA_24BIT_BPF_CAL'] # NB: change to LL_RA instaed of LA_RA for Session 4, S3 due to inverted electrodes
- # %%
- #This function runs different preprocessing steps: Cleaning (using ecg_clean()), peak detection (using ecg_peaks()), heart rate calculation (using signal_rate()), signal quality assessment (using ecg_quality()), QRS complex delineation (using ecg_delineate()), and cardiac phase determination (using ecg_phase()).
- ecg_signals, info = nk.ecg_process(ecg, sampling_rate=f) # default method 'neurokit'
- nk.ecg_plot(ecg_signals, info)
- # %%
- #Zhao et al. (2018) method of quality assessment
- ecg_clean=ecg_signals['ECG_Clean']
- nk.ecg_quality(ecg_clean,
- sampling_rate=f,
- method="zhao2018",
- approach="fuzzy")
- # %% [markdown]
- # ## Extract HR and RR times ##
- # %%
- #detect ECG R peaks and check data
- Rpeaks, info = nk.ecg_peaks(ecg_signals['ECG_Clean'], sampling_rate=f, method='neurokit', correct_artifacts=True, show=True)
- # %%
- #Identify and Correct Peaks using "Kubios" Method
- rpeaks_uncorrected = nk.ecg_findpeaks(ecg_signals['ECG_Clean'], method="pantompkins", sampling_rate=f)
- info, rpeaks_corrected = nk.signal_fixpeaks(
- rpeaks_uncorrected, sampling_rate=f, iterative=True, method="Kubios", show=True)
- # %%
- # Visualize Artifact Correction
- rate_corrected = nk.signal_rate(rpeaks_corrected, desired_length=len(ecg))
- rate_uncorrected = nk.signal_rate(rpeaks_uncorrected, desired_length=len(ecg))
- nk.signal_plot(
- [rate_uncorrected, rate_corrected],
- labels=["Heart Rate Uncorrected", "Heart Rate Corrected"]
- )
- # %%
- # Extract R peaks indices
- r_peak_indices = rpeaks_corrected
- r_peak_times = r_peak_indices / f # Convert indices to time by dividing by the sampling rate
- r_peak_amplitudes = ecg_signals['ECG_Clean'].iloc[r_peak_indices]
- HR = ecg_signals['ECG_Rate'].iloc[r_peak_indices]
- # Refine R peak amplitudes, in case some R peaks are not detected at maximum peak amplitude
- for i, index in enumerate(r_peak_indices):
- window_start = max(0, index - int(0.3 * f)) # 0.3 seconds before
- window_end = min(len(ecg_signals['ECG_Clean']), index + int(0.3 * f)) # 0.3 seconds after
- local_maxima = np.max(ecg_signals['ECG_Clean'].iloc[window_start:window_end])
- if r_peak_amplitudes.iloc[i] < local_maxima:
- r_peak_amplitudes.iloc[i] = local_maxima
- # Create a DataFrame
- df_rpeaks = pd.DataFrame({
- 'Time': r_peak_times,
- 'Amplitude': r_peak_amplitudes,
- 'HR': HR
- })
- # Calculate RR intervals
- df_rpeaks['rri'] = df_rpeaks['Time'].diff()
- # Function to filter R peaks based on local median RR intervals
- def filter_r_peaks(df, window_size=10, threshold=0.5):
- filtered_indices = []
- for i in range(len(df)):
- if i < window_size:
- filtered_indices.append(i)
- continue
- local_median_rri = df['rri'].iloc[i-window_size:i].median()
- if df['rri'].iloc[i] >= threshold * local_median_rri:
- filtered_indices.append(i)
- return df.iloc[filtered_indices].reset_index(drop=True)
- # Apply the filtering function
- df_rpeaks_filtered = filter_r_peaks(df_rpeaks)
- # Update r_peak_indices based on the filtered DataFrame
- filtered_indices = df_rpeaks_filtered.index.to_list()
- r_peak_indices_filtered = r_peak_indices[filtered_indices]
- # %%
- # apply R peaks correction to ECG_R_peaks column in ECG signal
- ecg_signals['ECG_R_Peaks']=0
- # Set the values to 1 at the R-peaks indices
- ecg_signals.loc[r_peak_indices_filtered, 'ECG_R_Peaks'] = 1
- # %%
- # Plotting in 1-minute chunks for visualiation of R peaks detection
- chunk_size = f * 60 # Number of samples per 1 minute
- num_chunks = int(len(ecg_signals['ECG_Clean']) / chunk_size)
- time = np.linspace(0, len(ecg_signals['ECG_Clean']) / f, len(ecg_signals['ECG_Clean']))
- plt.figure(figsize=(12, 6 * num_chunks))
- for i in range(num_chunks):
- start = i * chunk_size
- end = (i + 1) * chunk_size
- chunk_time = time[start:end]
- chunk_signal = ecg_signals['ECG_Clean'][start:end]
- chunk_r_peaks = df_rpeaks_filtered[(df_rpeaks_filtered['Time'] >= chunk_time[0]) & (df_rpeaks_filtered['Time'] < chunk_time[-1])]
- plt.subplot(num_chunks, 1, i + 1)
- plt.plot(chunk_time, chunk_signal, label='ECG Signal')
- plt.plot(chunk_r_peaks['Time'], chunk_r_peaks['Amplitude'], 'ro', label='R Peaks')
- plt.xlabel('Time (s)')
- plt.ylabel('Amplitude')
- plt.legend()
- plt.title(f'ECG Signal with R Peaks (Minute {i + 1})')
- plt.tight_layout()
- plt.show()
- # %%
- #Visualise RR intervals after correction
- plt.plot(df_rpeaks_filtered['rri'], label='RR intervals')
- # %%
- #save Rpeaks files
- csv_file_path = os.path.join(relative_dir, 'HRV', 'Rpeaks_time_HR_rri.csv')
- df_rpeaks_filtered.to_csv(csv_file_path, index=False)
- #save Rpeaks time in text format for SAI/PAI indexes estimation
- Rpeaks_time= df_rpeaks_filtered['Time'].values # delete the first nan value before saving as txt
- txt_file_path = os.path.join(relative_dir, 'HRV', 'RPeaks.txt')
- np.savetxt(txt_file_path, Rpeaks_time, fmt='%f', header='', comments='')
- # %% [markdown]
- # ## Estimate HRV parameters ##
- # %%
- import statistics
- HR=df_rpeaks['HR']
- hrv_indices = nk.hrv(ecg_signals['ECG_R_Peaks'], sampling_rate=f, show=True)
- hrv_indices['HR'] = statistics.mean(HR)
- hrv_indices['SD HR']=statistics.stdev(HR)
- hrv_indices
- # %%
- csv_file_path = os.path.join(relative_dir,'HRV', 'HRVmetrics.csv')
- hrv_indices.to_csv(csv_file_path, index=False)
- # %% [markdown]
- # ## Preprocessing of respiratory signal ##
- # %%
- resp=data['ECG_RESP_24BIT_LPF_CAL'] # name to be updated
- #def normalize_resp(resp_series):
- #return (resp_series - np.mean(resp_series)) / np.std(resp_series)
- #resp_norm = normalize_resp(resp)
- # %%
- #This is the processing of Respiratory signal
- Resp, info = nk.rsp_process(resp, sampling_rate=f, method='khodadad2018', method_rvt='harrison2021', report="text")
- fig = nk.rsp_plot(Resp, info)
- # %%
- nk.signal_plot(Resp['RSP_Raw'])
- nk.signal_plot(Resp['RSP_Clean'])
- # %%
- csv_file_path = os.path.join(relative_dir, 'Resp', 'RespTimeserie.csv')
- Resp.to_csv(csv_file_path, index=False)
- # %% [markdown]
- # ## Analysis of repiratory signal parameters ##
- # %%
- # for Baseline and post Baseline/riple analysis is done on 5 min readings and 1 min epochs
- # for Ripple / Baseline, analysis on 1min epochs
- rsp_analysis= nk.rsp_analyze(Resp, sampling_rate=f)
- #rsp_analysis= nk.rsp_intervalrelated(Resp, sampling_rate=f)
- RespAmp=Resp['RSP_Amplitude']
- rsp_analysis['RSP_Amplitude'] = statistics.mean(RespAmp)
- csv_file_path = os.path.join(relative_dir, 'Resp', 'RespParameters.csv')
- rsp_analysis.to_csv(csv_file_path, index=False)
- rsp_analysis
- # %% [markdown]
- # ## Repiratory sinus Arythmia (RSA) ##
- # %%
- #Run only if respiratory signal is good quality
- rsa_metrics= nk.hrv_rsa(ecg_signals, Resp, sampling_rate=f, continuous=False) #
- rsa_metrics_df=pd.DataFrame({'RSA_P2T_Mean': rsa_metrics['RSA_P2T_Mean'],
- 'RSA_P2T_Mean_log': rsa_metrics['RSA_P2T_Mean_log'],
- 'RSA_P2T_SD': rsa_metrics['RSA_P2T_SD'],
- 'RSA_P2T_NoRSA': rsa_metrics['RSA_P2T_NoRSA'],
- 'RSA_PorgesBohrer': rsa_metrics['RSA_PorgesBohrer'],
- 'RSA_Gates_Mean': rsa_metrics['RSA_Gates_Mean'],
- 'RSA_Gates_Mean_log':rsa_metrics['RSA_Gates_Mean_log'],
- 'RSA_Gates_SD':rsa_metrics['RSA_Gates_SD']
- }, index=[0])
- rsa_metrics_df
- # %%
- # Get RSA as a continuous signal
- rsa = nk.hrv_rsa(ecg_signals, Resp, sampling_rate=f, continuous=True)
- # %%
- csv_file_path = os.path.join(relative_dir,'HRV', 'rsa_average.csv')
- rsa_metrics_df.to_csv(csv_file_path, index=False)
- csv_file_path = os.path.join(relative_dir,'HRV', 'rsa_continuous.csv')
- rsa.to_csv(csv_file_path, index=False)
- # %% [markdown]
- # ## Combine data of interest into 1 dataframe ##
- # %%
- Resp_REvents= Resp.iloc[r_peak_indices_filtered]
- Resp_REvents=Resp_REvents.reset_index(drop=True)
- rsa_REvents= rsa.iloc[r_peak_indices_filtered]
- rsa_REvents=rsa_REvents.reset_index(drop=True)
- # %%
- #Create a data frame for R events with R time, (RRI), HR, Resp, Resp ecg (EDR), resp rate, RSA
- Index= np.arange(len(Resp_REvents))
- rsa_REvents_df= pd.DataFrame(rsa_REvents)
- REvents_variables=[]
- REvents_variables=pd.DataFrame({'HR': df_rpeaks_filtered['HR'],
- 'Rpeaks_time': df_rpeaks_filtered['Time'],
- 'Rpeaks_amplitude': df_rpeaks_filtered['Amplitude'],
- 'rri': df_rpeaks_filtered['rri'],
- 'Resp': Resp_REvents['RSP_Clean'],
- 'Resp rate': Resp_REvents['RSP_Rate'],
- 'Resp amp': Resp_REvents['RSP_Amplitude'],
- 'RSA_P2T': rsa_REvents_df['RSA_P2T'],
- 'RSA_Gates': rsa_REvents_df['RSA_Gates'] })
- REvents_variables = REvents_variables.reset_index(drop=True)
- REvents_variables
- # %%
- # Step added to filter out resp data out of normal range (i.e points >1)
- # Replace values in 'Column1' that are greater than 1 with NaN
- REvents_variables['Resp amp'] = REvents_variables['Resp amp'].apply(lambda x: np.nan if x > 1 else x)
- # %%
- nk.signal_plot([REvents_variables['rri'], REvents_variables['Resp'], REvents_variables['RSA_Gates']], standardize=True)
- # %% [markdown]
- # ## CALCULATE RMSSD WITH SLIDING WINDOWS ##
- # %%
- #RMMSSD computed on 30 data points (R peaks), with a step of one R peak
- window_size = 30 # 30
- step_size = 1 # 1
- rri=REvents_variables['rri']
- def calculate_rmssd(rr, window_size, step_size):
- rmssd = {}
- hr = 60000/rr
- for start in range(0, len(rr) - window_size, step_size):
- window = rr[start:start + window_size]
- rmssd[start]= np.sqrt(np.mean(np.square(np.diff(window*1000))))
- return rmssd
- RMSSD_windowed=calculate_rmssd(rri, 30, 1)
- RMSSD_windowed_df=pd.DataFrame({'RMSSD':RMSSD_windowed})
- RMSSD_windowed_df
- # Add 30 Nan values at the begining
- # Create a DataFrame of 30 NaN values
- nan_values = pd.DataFrame(np.nan, index=range(30), columns=RMSSD_windowed_df.columns)
- # Concatenate the NaN values DataFrame with the original DataFrame
- RMSSD_windowed_df_nan = pd.concat([nan_values, RMSSD_windowed_df], ignore_index=True)
- RMSSD_windowed_df_nan
- # %%
- # Add RMSSD time serie to R events variables of interest
- REvents_variables['RMSSD']=RMSSD_windowed_df_nan['RMSSD']
- REvents_variables
- # %% [markdown]
- # ## Code to calculate the SAI/ PAI indexes ##
- # %%
- import requests
- import re
- import time
- # Define the relative directory and the input/output file paths
- txt_file_path = os.path.join(relative_dir, 'HRV', 'RPeaks.txt')
- output_file_path = os.path.join(relative_dir,'HRV', 'SAI_PAI.txt')
- url = 'https://neurostat-mit.appspot.com/'
- values = {'worker': 'saipai'}
- # Step 1: Open and read the input file
- with open(txt_file_path, 'r') as file:
- files = {'myFile': file}
- # Step 2: Upload the file and get the response URL
- r = requests.post(url + 'upload', files=files, data=values)
- if not r.ok:
- raise Exception("Failed to upload the file.")
- resp_url = re.findall(r'url=([^"]*)"', r.text)
- if len(resp_url) != 1:
- raise Exception("Failed to retrieve the response URL.")
- # Step 3: Poll the server to get the result
- while True:
- r = requests.get(url + resp_url[0])
- if not r.ok:
- raise Exception("Failed to retrieve the result.")
- if not r.text.startswith('<'):
- result = r.text
- break
- time.sleep(1)
- # Step 4: Save the result to the output file
- with open(output_file_path, 'w') as output_file:
- output_file.write(result)
- print(f"Result saved to: {output_file_path}")
- # %%
- ## add SAI and PAI to the key variables
- file_path = os.path.join(relative_dir,'HRV', 'SAI_PAI.txt')
- # Read the text file into a DataFrame
- # Adjust the delimiter parameter if your file has a different delimiter (e.g., ',' for comma-separated values)
- df = pd.read_csv(file_path, delimiter='\t', header=None)
- # Rename the columns
- df.columns = ['SAI', 'PAI', 'SAI/PAI']
- #add a first row of nan vaulues to match the format of REvents variable
- # Create a DataFrame with a single row of NaN values
- nan_row = pd.DataFrame([[np.nan, np.nan, np.nan]], columns=df.columns)
- # Concatenate the NaN row with the original DataFrame
- df = pd.concat([nan_row, df], ignore_index=True)
- df
- # %%
- REvents_variables['SAI']= df['SAI']
- REvents_variables['PAI']= df['PAI']
- REvents_variables['SAI/PAI']= df['SAI/PAI']
- REvents_variables
- # %% [markdown]
- # ## Code to Calculate HRV amplitude ##
- # %%
- #resample sample every 1 s
- # Convert 'Rpeaks_time' to datetime and set it as the index
- REvents_variables['Timestamp']= REvents_variables['Rpeaks_time']
- REvents_variables['Timestamp'] = pd.to_datetime(REvents_variables['Timestamp'], unit='s')
- REvents_variables.set_index('Timestamp', inplace=True)
- # Resample the DataFrame to have a 1-second sampling frequency
- resampled_df = REvents_variables.resample('1s').mean()
- # Interpolate to fill missing values
- resampled_df = resampled_df.interpolate(method='linear')
- resampled_df
- # %%
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy.signal import find_peaks
- # Generate a sample signal (sinusoidal with some noise)
- signal = resampled_df['rri'].values
- t = resampled_df.index
- # Find local maxima and minima
- peaks, _ = find_peaks(signal)
- troughs, _ = find_peaks(-signal)
- # Calculate the median of 5 local maxima and minima to avoid outliers
- def moving_median(data, window_size=5):
- medians = []
- for i in range(len(data)):
- window = data[max(0, i - window_size // 2):min(len(data), i + window_size // 2 + 1)]
- medians.append(np.median(window))
- return np.array(medians)
- upper_envelope = moving_median(signal[peaks])
- lower_envelope = moving_median(signal[troughs])
- # Interpolate the envelopes to match the length of the original signal
- upper_envelope_interp = np.interp(t, t[peaks], upper_envelope)
- lower_envelope_interp = np.interp(t, t[troughs], lower_envelope)
- # Compute the width of the envelope at each time point
- envelope_width = upper_envelope_interp - lower_envelope_interp
- resampled_df['RRIEnveloppe']=envelope_width
- resampled_df['LowerEnveloppe']=lower_envelope_interp
- resampled_df['UpperEnloppe']= upper_envelope_interp
- # Plot the original signal, envelope, and width
- plt.figure(figsize=(12, 6))
- plt.plot(t, signal, label='Original Signal')
- plt.plot(t, upper_envelope_interp, label='Upper Envelope', linestyle='--')
- plt.plot(t, lower_envelope_interp, label='Lower Envelope', linestyle='--')
- plt.fill_between(t, lower_envelope_interp, upper_envelope_interp, color='gray', alpha=0.3, label='Envelope Width')
- plt.xlabel('Time')
- plt.ylabel('Amplitude')
- plt.legend()
- plt.title('Signal Envelope and Width')
- plt.show()
- # %%
- resampled_df
- # %%
- csv_file_path = os.path.join(relative_dir,'REvents_ALLvariables.csv')
- resampled_df.to_csv(csv_file_path, index=False)
- # %%
- # %%
- # %%
- # %%
- # %%
3ECG_RespProcessing_UPDATED.ipynb at commit 4614383, no license · at the source
Overview
- Intangible Realities Laboratory, Centro Singular de Investigación en Tecnoloxías Intelixentes, Rúa de Jenaro de la Fuente Domínguez, Campus Vida of the Universidade de Santiago de Compostela (USC), 15782 Santiago de Compostela, A Coruña, Spain
- Numadelic Labs, 2253 Carquinez Avenue, El Cerrito, CA 94530, United States
- Polibienestar Research Institute, University of Valencia, Edificio de Institutos de Investigación Calle Serpis, 2946022 Valencia, Spain
- aNUma, Inc., 4040 Civic Center Dr., San Rafael, CA 94903, United States
- Department of Experimental Psychology, University College London, 26 Bedford Way, London WC1H 0AP, United Kingdom
- Centre for Psychedelic Research, Department of Brain Sciences, Imperial College London, The Commonwealth Building, Hammersmith Hospital, Du Cane Road, London W12 0NN, United Kingdom
- Department of Personality, Evaluation and Psychological Treatments, University of Valencia, Avenida Blasco Ibáñez, 21, 46010 Valencia, Spain
Abstract
Self-transcendent experiences (STEs) offer profound and beneficial shifts in perspective, yet remain largely inaccessible outside elite contemplative or pharmacological contexts. Although neural measures have advanced our understanding of these states, their cost and limited ecological validity restrict broader application. This study evaluates heart rate variability (HRV) amplitude, a measure reflecting dynamic sympathovagal engagement, as a cost-effective and sustainable physiological marker of STE during ‘numadelic’ virtual reality (VR) experiences designed to dissolve self-boundaries and foster embodied presence. Building on previous work showing (i) associations between non-ordinary states of consciousness (NOSC) and autonomic activity during psychedelic administration, and (ii) comparable STE intensity in non-drug numadelic VR, we tested whether HRV amplitude reflects STE depth and relates to affective and relational outcomes during numadelic VR. Ninety-six participants engaged in guided meditation either in numadelic VR or a non-VR audio-guided group format. Cardiac and respiratory data were recorded during the session, alongside pre- and post-meditation psychological assessments. Findings show that HRV amplitude measured during numadelic VR correlates with subjective STE ratings, as well as compassion traits, and emotional improvement following practice. Reanalysis of data from a prior psychedelic study further supports the relevance of this measure across different methods of inducing NOSCs. These results advance the psychophysiological mapping of STEs and identify HRV amplitude as a promising real-time biomarker that may help guide participants toward self-transcendent states within adaptive environments. By integrating contemplative science with immersive design, this work contributes to scalable tools that broaden access to and deepen understanding of STEs.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 3 matches between paragraphs and lines of code.
vbonnelle/Ripple_Study_Bonnelle2025
4614383aea0274a035651fae3fa067aa4cab4ea2, 16 December 2025Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
1 file
- 3ECG_RespProcessing_UPDA
TED.ipynb , Jupyter, 521 lines, 3 matches
The paper's code and data availability statement is in the Data section.
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;
- 3 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- 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
Datasets cited
- osf:ynpck, at OSF; found in the text, “Study design”
- zenodo:17061627, at Zenodo; found in “Data availability”
Data availability
ECG data and audio file of the audio of the pre-recorded meditation ‘Ripple’ in English are available at https://
Code for data-preprocessing, final dataset for statistical analyses (with questionnaires and subjective ratings as well as physiological measures of interest) and VR experience chapters video snapshots are available at https://
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 1, 29 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 9 authors, 3 keywords, 1 funder, 127 references.
Cite
This paper
Bonnelle, V., Parola, G., Andreu, C., Hardy, J. L., Wall, J., Timmermann, C., Cebolla, A., Wrzesien, M., & Glowacki, D. R. (2026). Autonomic indicators of self-transcendence: insights from the numadelic VR paradigm. Neuroscience of consciousness, 2026(1), niag009. https://
BibTeX
@article{bonnelle2026aut
author = {Bonnelle, Valerie and Parola, Giulia and Andreu, Catherine and Hardy, Joseph L and Wall, Justin and Timmermann, Christopher and Cebolla, Ausiàs and Wrzesien, Maja and Glowacki, David R},
title = {{Autonomic indicators of self-transcendence: insights from the numadelic VR paradigm}},
journal = {Neuroscience of consciousness},
year = {2026},
month = apr,
volume = {2026},
number = {1},
pages = {niag009},
publisher = {Oxford University Press},
issn = {2057-2107},
doi = {10.1093/
url = {https://
pmid = {42028122},
pmcid = {PMC13099402}
}
RIS
TY - JOUR
AU - Bonnelle, Valerie
AU - Parola, Giulia
AU - Andreu, Catherine
AU - Hardy, Joseph L
AU - Wall, Justin
AU - Timmermann, Christopher
AU - Cebolla, Ausiàs
AU - Wrzesien, Maja
AU - Glowacki, David R
TI - Autonomic indicators of self-transcendence: insights from the numadelic VR paradigm
T2 - Neuroscience of consciousness
J2 - Neurosci Conscious
PY - 2026
DA - 2026/
VL - 2026
IS - 1
SP - niag009
SN - 2057-2107
PB - Oxford University Press
DO - 10.1093/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1093/
"type": "article-journal",
"title": "Autonomic indicators of self-transcendence: insights from the numadelic VR paradigm",
"container-title": "Neuroscience of consciousness",
"author": [
{
"family": "Bonnelle",
"given": "Valerie"
},
{
"family": "Parola",
"given": "Giulia"
},
{
"family": "Andreu",
"given": "Catherine"
},
{
"family": "Hardy",
"given": "Joseph L"
},
{
"family": "Wall",
"given": "Justin"
},
{
"family": "Timmermann",
"given": "Christopher"
},
{
"family": "Cebolla",
"given": "Ausiàs"
},
{
"family": "Wrzesien",
"given": "Maja"
},
{
"family": "Glowacki",
"given": "David R"
}
],
"container-title-short":
"volume": "2026",
"issue": "1",
"page": "niag009",
"DOI": "10.1093/
"PMID": "42028122",
"PMCID": "PMC13099402",
"ISSN": "2057-2107",
"publisher": "Oxford University Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
22
]
]
}
}
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.1038/s42003-026-10156-5 [code]
- Brain-heart interactions in late-onset major depressive disorder revealed by multimodal HRV-driven fMRI.Journal: Communications biologyIn common: 10 references
- [2] doi:10.1093/nc/niag044 [code]
- Aquahenosis: a non-pharmacological altered state of consciousness induced by floatation-REST in individuals with anxiety and depression.Journal: Neuroscience of consciousnessIn common: cognitive, 6 references
- [3] doi:10.1038/s41586-026-10910-z [code]
- Psychedelics align brain activity with context.Journal: NatureIn common: SciPy, NumPy, cognitive, 4 references
- [4] doi:10.3389/fnsys.2026.1880737
- Autonomic-salience stability as a candidate Gate for awake low-dose ketamine: a systems neuroscience framework with a clinical anchor.Journal: Frontiers in systems neuroscienceIn common: 6 references
- [5] doi:10.1038/s41467-026-71604-8 [code]
- Respiration as a dynamic modulator of sensory sampling.Journal: Nature communicationsIn common: cognitive, 5 references
- [6] doi:10.1093/braincomms/fcag120 [code]
- The heartbeat evoked potential and the prediction of functional seizure semiology.Journal: Brain communicationsIn common: NeuroKit2, pandas, SciPy, 2 other tools, 1 reference
- [7] doi:10.1016/j.isci.2026.116151 [code]
- Impaired sleep resilience underlies transient neural instability in insomnia disorder.Journal: iScienceIn common: NeuroKit2, pandas, SciPy, 2 other tools, 1 reference
- [8] doi:10.1038/s41398-026-04333-7
- Cardiac vagal activity during in-vivo threat exposure is associated with within-session inhibition of fear and avoidance.Journal: Translational psychiatryIn common: 5 references
- [9] doi:10.3389/fnhum.2026.1874178
- Longitudinal neural and psychological changes following psilocybin under compassion imagery priming.Journal: Frontiers in human neuroscienceIn common: cognitive, 4 references
- [10] doi:10.1111/psyp.70385 [code]
- Exploring EEG and ECG in Music Listening: A Scoping Review.Journal: PsychophysiologyIn common: cognitive, 4 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 3 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:0f35414421811a4b…
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
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
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.
