Add hippocampal fMRISurface processing - #412
orenpoliva wants to merge 7 commits into
Conversation
| "${WB}" -metric-math \ | ||
| '1' \ | ||
| "${OnesMetric}" \ | ||
| -var x \ | ||
| "${ThicknessMetric}" |
There was a problem hiding this comment.
For math commands, I typically use a more compact style due to the expected compactness of the variable names and the expression. Also, wb_command is on $PATH, we don't need a variable in the way.
| "${WB}" -metric-math \ | |
| '1' \ | |
| "${OnesMetric}" \ | |
| -var x \ | |
| "${ThicknessMetric}" | |
| wb_command -metric-math '1' "${OnesMetric}" \ | |
| -var x "${ThicknessMetric}" |
There was a problem hiding this comment.
Using a variable for wb_command would allow someone to specify a particular version of wb_command (e.g., in a CHPC-like environment). I usually have had a variable for that reason.
There was a problem hiding this comment.
Changing $PATH to point to it would do that just fine. There is also a place to do this in SetUpHCPPipeline.sh, which results in it being in $PATH. As currently written, it is hardcoded to use $CARET7DIR, which is the same as what SetUp... puts on $PATH anyway.
|
|
||
| opts_AddOptional '--goodvoxel' 'doGoodVoxels' 'YES OR NO' "Controls whether to do goodVoxel procedure (default = YES)" "YES" | ||
|
|
||
| opts_AddOptional '--factor' 'factor' 'number' "Scaling factor for eliminating high COV voxels" |
There was a problem hiding this comment.
This should probably have a default value.
Single stage with...apparently half a standard deviation threshold may have been chosen for cortex due to substantial outlier effects (multi-stage and/or dilation to isolate partial voxel effects would probably be a better approach). The single stage approach may work particularly poorly with a much smaller ROI like hippocampus.
There was a problem hiding this comment.
I agree. Oren did an analysis to figure this out, so we should use that as the default.
| "${CARET7DIR}/wb_command" -cifti-create-dense-timeseries \ | ||
| "${ResultsFolder}/${NameOffMRI}_AtlasHipp_${ProcString}.${Mesh}.dtseries.nii" \ | ||
| -metric HIPPOCAMPUS_LEFT "${WorkingDirectory}/${Subject}.L.hipp_fMRI_s${SmoothingFWHM}.${Mesh}.func.gii" \ | ||
| -roi "${WorkingDirectory}/${Subject}.L.hipp_ones.${Mesh}.func.gii" \ |
There was a problem hiding this comment.
If these are all-ones files, you don't need to use -roi at all. The reason the -roi option exists is because the cortical surfaces are topologically spheres, even though some of the sphere vertices don't actually represent cortex.
| MidSurface="${HippUnfoldFolder}/native/${Prefix}_midthickness.native.surf.gii" | ||
| OuterSurface="${HippUnfoldFolder}/native/${Prefix}_outer.native.surf.gii" | ||
|
|
||
| OnesMetric="${WorkingDirectory}/${Prefix}_ones.native.func.gii" |
There was a problem hiding this comment.
I don't think we need to keep any all-ones metrics around, I would use tempfiles.shlib to handle it instead (in the /tmp folder or wherever the standardized environment variables point), like this:
A file created this way gets deleted when the script exits, without any further code.
|
|
||
| opts_AddMandatory '--smoothingFWHM' 'SmoothingFWHM' 'number' 'smoothing FWHM (mm)' | ||
|
|
||
| opts_AddOptional '--fmri-qc' 'QCMode' 'YES OR NO OR ONLY' "Controls whether to generate a QC scene and snapshots (default=YES). ONLY executes just the QC script." "YES" |
There was a problem hiding this comment.
Is this implemented? If not, it should be taken out.
|
|
||
| opts_AddOptional '--fmri-qc' 'QCMode' 'YES OR NO OR ONLY' "Controls whether to generate a QC scene and snapshots (default=YES). ONLY executes just the QC script." "YES" | ||
|
|
||
| opts_AddOptional '--output-directory' 'OutputDirectory' 'path' 'Directory where pipeline outputs will be written' "" |
There was a problem hiding this comment.
| opts_AddOptional '--output-directory' 'OutputDirectory' 'path' 'Directory where pipeline outputs will be written' "" | |
| opts_AddOptional '--output-directory' 'OutputDirectory' 'path' 'Directory where pipeline outputs will be written for testing purposes' "" |
| QCMode="$(echo "${QCMode}" | tr '[:upper:]' '[:lower:]')" | ||
|
|
||
| doProcessing=1 | ||
| doQC=1 | ||
|
|
||
| case "${QCMode}" in | ||
| yes) | ||
| ;; | ||
| no) | ||
| doQC=0 | ||
| ;; | ||
| only) | ||
| doProcessing=0 | ||
| log_Warn "Only generating fMRI QC scene and snapshots from existing data" | ||
| ;; | ||
| *) | ||
| log_Err_Abort "Unrecognized value '${QCMode}' for --fmri-qc; use YES, NO, or ONLY" | ||
| ;; | ||
| esac |
There was a problem hiding this comment.
Remove if we are not doing this.
| if [ -n "${OutputDirectory}" ]; then | ||
| ResultsFolder="${OutputDirectory}/${Subject}/${NameOffMRI}" | ||
| else | ||
| ResultsFolder="${AtlasSpaceFolder}/${ResultsFolderName}/${NameOffMRI}" | ||
| fi |
There was a problem hiding this comment.
This seems specific to your testing.
| #Surface Smoothing | ||
| # ------------------------------------------------------------------------------ | ||
| # Hippocampal Surface Smoothing | ||
| # ------------------------------------------------------------------------------ | ||
|
|
||
| log_Msg "Hippocampal Surface Smoothing" | ||
|
|
||
| Sigma=`echo "$SmoothingFWHM / (2 * sqrt(2 * l(2)))" | bc -l` | ||
|
|
||
| Meshes=(native 512 2k 8k 18k) | ||
| Structures=(hipp dentate) | ||
|
|
||
| for Mesh in "${Meshes[@]}"; do | ||
| for Structure in "${Structures[@]}"; do | ||
| for Hemisphere in L R; do | ||
| "${CARET7DIR}/wb_command" -metric-smoothing \ | ||
| "${HippUnfoldFolder}/${Mesh}/${Subject}.${Hemisphere}.${Structure}_midthickness.${Mesh}.surf.gii" \ | ||
| "${WorkingDirectory}/${Subject}.${Hemisphere}.${Structure}_fMRI.${Mesh}.func.gii" \ | ||
| "${Sigma}" \ | ||
| "${WorkingDirectory}/${Subject}.${Hemisphere}.${Structure}_fMRI_s${SmoothingFWHM}.${Mesh}.func.gii" \ | ||
| -roi "${WorkingDirectory}/${Subject}.${Hemisphere}.${Structure}_ones.${Mesh}.func.gii" | ||
| done | ||
| done | ||
| done | ||
| # ------------------------------------------------------------------------------ |
There was a problem hiding this comment.
This will need to be moved into a module in the future for parallelism with fMRISurface (and eventual inclusion in fMRISurface). If you insist on keeping it in the main pipeline, please put it in a function with the appropriate I/O so that it can easily be copied into the appropriate fMRISurface module when the time comes.
| # Combining ROIs into a single CIFTI file | ||
| # ------------------------------------------------------------------------------ | ||
|
|
||
|
|
||
| for Mesh in ${Meshes[@]}; do | ||
| "${CARET7DIR}/wb_command" -cifti-create-dense-timeseries \ | ||
| "${ResultsFolder}/${NameOffMRI}_AtlasHipp_${ProcString}.${Mesh}.dtseries.nii" \ | ||
| -metric HIPPOCAMPUS_LEFT "${WorkingDirectory}/${Subject}.L.hipp_fMRI_s${SmoothingFWHM}.${Mesh}.func.gii" \ | ||
| -roi "${WorkingDirectory}/${Subject}.L.hipp_ones.${Mesh}.func.gii" \ | ||
| -metric HIPPOCAMPUS_RIGHT "${WorkingDirectory}/${Subject}.R.hipp_fMRI_s${SmoothingFWHM}.${Mesh}.func.gii" \ | ||
| -roi "${WorkingDirectory}/${Subject}.R.hipp_ones.${Mesh}.func.gii" \ | ||
| -metric HIPPOCAMPUS_DENTATE_LEFT "${WorkingDirectory}/${Subject}.L.dentate_fMRI_s${SmoothingFWHM}.${Mesh}.func.gii" \ | ||
| -roi "${WorkingDirectory}/${Subject}.L.dentate_ones.${Mesh}.func.gii" \ | ||
| -metric HIPPOCAMPUS_DENTATE_RIGHT "${WorkingDirectory}/${Subject}.R.dentate_fMRI_s${SmoothingFWHM}.${Mesh}.func.gii" \ | ||
| -roi "${WorkingDirectory}/${Subject}.R.dentate_ones.${Mesh}.func.gii" | ||
|
|
||
| log_Msg "Generated fMRI time series Cifti file: "${ResultsFolder}/${Subject}.${NameOffMRI}"_AtlasHipp_${ProcString}.${Mesh}.dtseries.nii" |
There was a problem hiding this comment.
This will also need to be moved into a module for parallelism with fMRISurface and eventual folding into fMRI surface. If you insist on keeping it in the main pipeline, please put it in a function with the appropriate I/O so that it can easily be copied into the appropriate fMRISurface module when the time comes.
| # if ((doQC)); then | ||
| # log_Msg "Generating fMRI QC scene and snapshots" | ||
| # "${PipelineScripts}/GenerateFMRIScenes.sh" \ | ||
| # --study-folder="${Path}" \ | ||
| # --subject="${Subject}" \ | ||
| # --fmriname="${NameOffMRI}${ProcString}" \ | ||
| # --output-folder="${ResultsFolder}/fMRIQC" | ||
| # fi |
| #Uncomment if want to remove the subfoler with intermediate files | ||
| #rm -rf "${WorkingDirectory}" |
| NeighborhoodSmoothing="5" # Distinguishes large vs small dropout | ||
| dilation_dist="10" | ||
|
|
||
| Meshes=(512 2k 8k 18k) |
There was a problem hiding this comment.
We don't need to run this on all meshes. Just the one we choose. Mesh density should be an input parameter to the overall pipeline.
| ThicknessMetric="${HippUnfoldFolder}/native/${Prefix}_thickness.native.shape.gii" | ||
|
|
||
| InnerSurface="${HippUnfoldFolder}/native/${Prefix}_inner.native.surf.gii" | ||
| MidSurface="${HippUnfoldFolder}/native/${Prefix}_midthickness.native.surf.gii" | ||
| OuterSurface="${HippUnfoldFolder}/native/${Prefix}_outer.native.surf.gii" |
There was a problem hiding this comment.
Native should be capitalized.
There was a problem hiding this comment.
Native should be capitalized - are you referring to folder name or substring in filename, or both?
| fi | ||
|
|
||
|
|
||
| NativeFolder="${HippUnfoldFolder}/native" |
| # ===================================================================== | ||
| # Map VN volume to native hippocampal surface | ||
| # ===================================================================== | ||
|
|
||
| VolumefMRIVN="${VolumefMRI}_vn.nii.gz" | ||
| NativefMRIVN="${WorkingDirectory}/${Prefix}_fMRI_vn.native.func.gii" | ||
|
|
||
| "${WB}" -volume-to-surface-mapping \ | ||
| "${VolumefMRIVN}" \ | ||
| "${MidSurface}" \ | ||
| "${NativefMRIVN}" \ | ||
| -cubic | ||
|
|
||
| "${WB}" -metric-mask \ | ||
| "${NativefMRIVN}" \ | ||
| "${NativeROI}" \ | ||
| "${NativefMRIVN}" | ||
|
|
||
| log_Msg "Generated VN file in native space at: ${NativefMRIVN}" | ||
|
|
||
| # ===================================================================== | ||
| # Resample complete fMRI timeseries to all densities | ||
| # ===================================================================== | ||
|
|
||
| for Mesh in ${Meshes[@]}; do | ||
|
|
||
| MeshFolder="${HippUnfoldFolder}/${Mesh}" | ||
|
|
||
| TargetFlat="${MeshFolder}/${Prefix}_flat.${Mesh}.surf.gii" | ||
| TargetMidSurface="${MeshFolder}/${Prefix}_midthickness.${Mesh}.surf.gii" | ||
| TargetROI="${WorkingDirectory}/${Prefix}_ones.${Mesh}.func.gii" | ||
|
|
||
| TargetfMRI="${WorkingDirectory}/${Prefix}_fMRI.${Mesh}.func.gii" | ||
|
|
||
|
|
||
| "${WB}" -metric-resample \ | ||
| "${NativefMRI}" \ | ||
| "${NativeFlat}" \ | ||
| "${TargetFlat}" \ | ||
| ADAP_BARY_AREA \ | ||
| "${TargetfMRI}" \ | ||
| -area-surfs \ | ||
| "${MidSurface}" \ | ||
| "${TargetMidSurface}" \ | ||
| -current-roi "${NativeROI}" \ | ||
| -bypass-sphere-check | ||
|
|
||
|
|
||
| "${WB}" -metric-dilate \ | ||
| "${TargetfMRI}" \ | ||
| "${TargetMidSurface}" \ | ||
| ${dilation_dist} \ | ||
| "${TargetfMRI}" \ | ||
| -nearest | ||
|
|
||
|
|
||
| "${WB}" -metric-mask \ | ||
| "${TargetfMRI}" \ | ||
| "${TargetROI}" \ | ||
| "${TargetfMRI}" | ||
|
|
||
|
|
||
| log_Msg "Generated fMRI file in ${Mesh} mesh at: ${TargetfMRI}" | ||
|
|
||
| # ===================================================================== | ||
| # Map VN volume to native hippocampal surface | ||
| # ===================================================================== | ||
|
|
||
| VolumefMRIVN="${VolumefMRI}_vn.nii.gz" | ||
| TargetfMRIVN="${WorkingDirectory}/${Prefix}_fMRI_vn.${Mesh}.func.gii" | ||
|
|
||
| "${WB}" -volume-to-surface-mapping \ | ||
| "${VolumefMRIVN}" \ | ||
| "${TargetMidSurface}" \ | ||
| "${TargetfMRIVN}" \ | ||
| -cubic | ||
|
|
||
| "${WB}" -metric-mask \ | ||
| "${TargetfMRIVN}" \ | ||
| "${TargetROI}" \ | ||
| "${TargetfMRIVN}" | ||
|
|
||
| log_Msg "Generated VN file in ${Mesh} mesh at: ${TargetfMRIVN}" | ||
| done | ||
| done |
There was a problem hiding this comment.
This is disorganized. The VN stuff should all be in a separate section by itself since it is a hack that will be removed in the future.
|
fMRI pipeline changes: GenericHippocampusfMRISurfaceProcessingPipeline.sh: Re-enabled pipedirguessed=1. Removed the output-folder and fmri-qc options. Added the --resample-mesh option. A validation loop was also added to allow only valid mesh values (512, 2k, 8k, 18k). The selected meshes are then passed to the child script HippocampalVolumeToSurfaceMapping.sh. Shifted to a more compact formatting style, including reducing unnecessary use of line-continuation backslashes. The native mesh is added internally to the requested resampling meshes so that native-space processing is always performed before resampling to the user-requested meshes. HippocampalVolumeToSurfaceMapping.sh: The script now receives the mesh list as an input parameter. Similar to its cortical counterpart, RibbonVolumeToSurfaceMapping.sh, intermediate volumetric files are generated inside the HippocampalVolumeToSurfaceMapping working subdirectory. Final surface-related files are generated in the parent fMRI results directory (e.g., rfMRI_REST1_LR). Previously, generation of the fMRI surface time series and VN surface files was intermixed. These are now handled in separate processing loops. VN is mapped once from the volume to the native hippocampal surface and then resampled from native to the requested meshes. Shifted to a more compact formatting style, including reducing unnecessary use of line-continuation backslashes. Questions:
|
|
|
A path to a test dataset is: Script was modified to reduce in size |
Defining the folder name only once would be better, yes. Hardcoding it in the top-level script is still good, in case we have a need for the intermediates later.
I use (and recommend) bare |
| #comment the line back in when done | ||
| #source "${HCPPIPEDIR}/global/scripts/debug.shlib" "$@" # Debugging functions; also sources log.shlib | ||
| source "${HCPPIPEDIR}/global/scripts/log.shlib" "$@" # Debugging functions; also sources log.shlib |
There was a problem hiding this comment.
If it runs with set -eu, then we should be sourcing debug.shlib. I'm not sure what commenting it out was intended to accomplish, as it should merely give more information than set -eu, but otherwise similar "exit on error" effects.
| #comment the line back in when done | |
| #source "${HCPPIPEDIR}/global/scripts/debug.shlib" "$@" # Debugging functions; also sources log.shlib | |
| source "${HCPPIPEDIR}/global/scripts/log.shlib" "$@" # Debugging functions; also sources log.shlib | |
| source "${HCPPIPEDIR}/global/scripts/debug.shlib" "$@" # Debugging functions; also sources log.shlib |
There was a problem hiding this comment.
Sorry about that. I'm writing my code on vs code using bashdb debugger. This specific script crashes my debug. I was planning to uncomment before committing to the PR.
| ########################################## PIPELINE OVERVIEW ########################################## | ||
|
|
||
| # TODO | ||
|
|
||
| ########################################## OUTPUT DIRECTORIES ########################################## | ||
|
|
||
| # TODO | ||
|
|
||
| ################################################ SUPPORT FUNCTIONS ################################################## | ||
|
|
||
| set -eu |
There was a problem hiding this comment.
Redundant set -eu. Also, if we aren't going to fill these documentation sections in, I wouldn't bother having them (yet).
| ########################################## PIPELINE OVERVIEW ########################################## | |
| # TODO | |
| ########################################## OUTPUT DIRECTORIES ########################################## | |
| # TODO | |
| ################################################ SUPPORT FUNCTIONS ################################################## | |
| set -eu |
| # Requirements for this script | ||
| # installed versions of: FSL, Connectome Workbench (wb_command) | ||
| # environment: HCPPIPEDIR, FSLDIR, CARET7DIR |
There was a problem hiding this comment.
I'm not sure how useful this list is, as all of these are always set up by SetUpHCP....
| @@ -0,0 +1,74 @@ | |||
| #!/bin/bash | |||
| set -eu | |||
| # -------------------------------------------------------------------------------- | |||
There was a problem hiding this comment.
| # -------------------------------------------------------------------------------- | |
| #based on fMRISurface/scripts/SurfaceSmoothing.sh | |
| # -------------------------------------------------------------------------------- |
| @@ -0,0 +1,82 @@ | |||
| #!/bin/bash | |||
| set -eu | |||
| # -------------------------------------------------------------------------------- | |||
There was a problem hiding this comment.
| # -------------------------------------------------------------------------------- | |
| #similar to fMRISurface/scripts/CreateDenseTimeseries.sh | |
| # -------------------------------------------------------------------------------- |
Okay if you think that we don't need to specify the wb_command location even for the user who wants to run a non-default wb_command, then we don't have to keep using it. |
|
fMRI Pipeline Updated the scripts to read data from the ‘Native’ directory instead of the previous ‘native' directory. Removed remnants of previous analyses from the test subjects' fMRI results directories so that they now contain outputs generated by the current version of the pipeline. Two datasets are available for review: /media/myelin/brainmappers/Connectome_Project/YA_HCP_Final/105923/MNINonLinear/Results/rfMRI_REST1_LR |
| fi | ||
|
|
||
| source "${HCPPIPEDIR}/global/scripts/debug.shlib" "$@" # Debugging functions; also sources log.shlib | ||
| #source "${HCPPIPEDIR}/global/scripts/log.shlib" "$@" # Debugging functions; also sources log.shlib |
There was a problem hiding this comment.
| #source "${HCPPIPEDIR}/global/scripts/log.shlib" "$@" # Debugging functions; also sources log.shlib |
Or at least remove the incorrect comment on the end.
Alternatively, it shouldn't actually be harmful to source log.shlib again (or before debug.shlib actually, since debug.shlib actually checks whether log.shlib has already been sourced), if we want to support the type of debugging that is improved by commenting out the debug line.
| ################################################ SUPPORT FUNCTIONS ################################################## | ||
| set -eu | ||
| pipedirguessed=0 | ||
| if [[ "${HCPPIPEDIR:-}" == "" ]] | ||
| then | ||
| pipedirguessed=1 | ||
| # Fix this if the script is more than one level below HCPPIPEDIR | ||
| export HCPPIPEDIR="$(dirname -- "$0")/.." | ||
| fi | ||
|
|
||
| source "${HCPPIPEDIR}/global/scripts/debug.shlib" "$@" # Debugging functions; also sources log.shlib | ||
| source "${HCPPIPEDIR}/global/scripts/log.shlib" "$@" # Debugging functions; also sources log.shlib | ||
|
|
There was a problem hiding this comment.
Why is this entire file indented now? This has made some of my previous comments no longer show up on the diff ("files") page (github thinks they are outdated because the lines were edited).
There was a problem hiding this comment.
I reformatted the indentation because I understood your earlier feedback to mean that all of my scripts should follow the same style, specifically four-space indentation. This script had previously been using two-space indentation. I did not realize that reformatting the entire file would cause some of your earlier comments to appear outdated in GitHub. I’ll avoid broad formatting changes like this in future revisions so that existing review comments and the substantive diff remain easier to track.
There was a problem hiding this comment.
To clarify, by "entire file indented", I meant that after this change, there are now 4 spaces before even the first line of the script. Anything that isn't in any conditional/loop/function/etc context should have zero spaces/tabs before the first character. Concretely:
| ################################################ SUPPORT FUNCTIONS ################################################## | |
| set -eu | |
| pipedirguessed=0 | |
| if [[ "${HCPPIPEDIR:-}" == "" ]] | |
| then | |
| pipedirguessed=1 | |
| # Fix this if the script is more than one level below HCPPIPEDIR | |
| export HCPPIPEDIR="$(dirname -- "$0")/.." | |
| fi | |
| source "${HCPPIPEDIR}/global/scripts/debug.shlib" "$@" # Debugging functions; also sources log.shlib | |
| source "${HCPPIPEDIR}/global/scripts/log.shlib" "$@" # Debugging functions; also sources log.shlib | |
| ################################################ SUPPORT FUNCTIONS ################################################## | |
| set -eu | |
| pipedirguessed=0 | |
| if [[ "${HCPPIPEDIR:-}" == "" ]] | |
| then | |
| pipedirguessed=1 | |
| # Fix this if the script is more than one level below HCPPIPEDIR | |
| export HCPPIPEDIR="$(dirname -- "$0")/.." | |
| fi | |
| source "${HCPPIPEDIR}/global/scripts/debug.shlib" "$@" # Debugging functions; also sources log.shlib | |
| source "${HCPPIPEDIR}/global/scripts/log.shlib" "$@" # Debugging functions; also sources log.shlib | |
I prefer four spaces per indentation level, so in any new scripts that would be appreciated. In existing scripts, following whatever convention is already present (as long as it is consistent) means that the per-line commit history remains more useful.
fMRI pipeline changes:
GenericHippocampusfMRISurfaceProcessingPipeline.sh:
Re-enabled pipedirguessed=1.
Removed the output-folder and fmri-qc options.
Added the --resample-mesh option. A validation loop was also added to allow only valid mesh values (512, 2k, 8k, 18k). The selected meshes are then passed to the child script HippocampalVolumeToSurfaceMapping.sh.
Moved surface smoothing into a separate child script, HippocampalSurfaceSmoothing.sh.
Moved CIFTI generation into a separate child script, HippocampalCreateCIFTIs.sh.
Shifted to a more compact formatting style, including reducing unnecessary use of line-continuation backslashes.
Removed the variable previously used for wb_command and now call wb_command directly.
The native mesh is added internally to the requested resampling meshes so that native-space processing is always performed before resampling to the user-requested meshes.
HippocampalVolumeToSurfaceMapping.sh:
The script now receives the mesh list as an input parameter.
Similar to its cortical counterpart, RibbonVolumeToSurfaceMapping.sh, intermediate volumetric files are generated inside the HippocampalVolumeToSurfaceMapping working subdirectory. Final surface-related files are generated in the parent fMRI results directory (e.g., rfMRI_REST1_LR).
Previously, generation of the fMRI surface time series and VN surface files was intermixed. These are now handled in separate processing loops.
VN is mapped once from the volume to the native hippocampal surface and then resampled from native to the requested meshes.
Shifted to a more compact formatting style, including reducing unnecessary use of line-continuation backslashes.
Removed the variable previously used for wb_command and now call wb_command directly.
Questions:
The HippocampalVolumeToSurfaceMapping working-directory name is currently hardcoded in both the parent and child scripts. Should the working-directory path instead be passed from the parent to the child as an input parameter?
If the long-term plan is to combine the cortical and hippocampal fMRISurface pipelines, would it make more sense to begin integrating them now rather than maintaining two parallel pipelines?
There is some inconsistency in how wb_command is called across HCP scripts. For example, some scripts, such as RSNRegression.sh, use wb_command, while others, such as SurfaceSmoothing.sh, use ${CARET7DIR}/wb_command. Which format should I use?