-
Notifications
You must be signed in to change notification settings - Fork 51
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added creation of bvec and bval files when creating NIfTI files #335
Merged
cmadjar
merged 5 commits into
aces:20.1-dev
from
cmadjar:creation_bvec_bval_after_mnc2nii_conversion
Sep 13, 2018
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
27141d8
added creation of bvec and bval files when creating NIfTI files for D…
cmadjar 7cce1e5
script to back populate bval/bvec files
cmadjar c5d2e41
Corrected a typo
cmadjar a926eb8
Nicolas' feedback
cmadjar f849c42
harmonization of the 'die' statement
cmadjar File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# NAME | ||
|
||
create\_nifti\_bval\_bvec.pl -- a script that creates the missing bval and bvec | ||
files for DWI NIfTI acquisitions. | ||
|
||
# SYNOPSIS | ||
|
||
perl tools/create\_nifti\_bval\_bvec.pl `[options]` | ||
|
||
Available options are: | ||
|
||
\-profile: name of the config file in `../dicom-archive/.loris_mri` | ||
\-verbose: be verbose | ||
|
||
# DESCRIPTION | ||
|
||
This script will create the missing NIfTI bval and bvec files for DWI | ||
acquisitions. | ||
|
||
# LICENSING | ||
|
||
License: GPLv3 | ||
|
||
# AUTHORS | ||
|
||
LORIS community <loris.info@mcin.ca> and McGill Centre for Integrative | ||
Neuroscience |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,204 @@ | ||
#! /usr/bin/perl | ||
|
||
=pod | ||
|
||
=head1 NAME | ||
|
||
create_nifti_bval_bvec.pl -- a script that creates the missing bval and bvec | ||
files for DWI NIfTI acquisitions. | ||
|
||
|
||
=head1 SYNOPSIS | ||
|
||
perl tools/create_nifti_bval_bvec.pl C<[options]> | ||
|
||
Available options are: | ||
|
||
-profile: name of the config file in C<../dicom-archive/.loris_mri> | ||
-verbose: be verbose | ||
|
||
|
||
=head1 DESCRIPTION | ||
|
||
This script will create the missing NIfTI bval and bvec files for DWI | ||
acquisitions. | ||
|
||
|
||
=head1 LICENSING | ||
|
||
License: GPLv3 | ||
|
||
|
||
=head1 AUTHORS | ||
|
||
LORIS community <loris.info@mcin.ca> and McGill Centre for Integrative | ||
Neuroscience | ||
|
||
=cut | ||
|
||
|
||
|
||
use strict; | ||
use warnings; | ||
use Getopt::Tabular; | ||
|
||
use NeuroDB::File; | ||
use NeuroDB::MRI; | ||
use NeuroDB::DBI; | ||
use NeuroDB::ExitCodes; | ||
|
||
|
||
|
||
|
||
### Set up Getopt::Tabular | ||
|
||
my $profile; | ||
my $verbose = 0; | ||
my $profile_desc = "Name of the config file in ../dicom-archive/.loris_mri"; | ||
|
||
my @opt_table = ( | ||
[ "-profile", "string", 1, \$profile, $profile_desc ], | ||
[ "-verbose", "boolean", 1, \$verbose, "Be verbose" ] | ||
); | ||
|
||
my $Help = <<HELP; | ||
****************************************************************************** | ||
CREATE NIFTI BVAL BVEC DWI FILES | ||
****************************************************************************** | ||
|
||
This will check if the configuration flag for NIfTI files creation is set to | ||
'yes' and will create .bvec and .bval files for the DWI acquisitions that | ||
need to accompany the NIfTI DWI files (bug in mnc2nii that do not create | ||
those files so we create them ourselves based on values present in the MINC | ||
header for acquisition:bvalues, acquisition:direction_x, | ||
acquisition:direction_y and acquisition:direction_z). | ||
|
||
Documentation: perldoc create_nifti_bval_bvec.pl | ||
|
||
HELP | ||
|
||
my $Usage = <<USAGE; | ||
Usage: $0 [options] | ||
$0 -help to list options | ||
USAGE | ||
|
||
&Getopt::Tabular::SetHelp($Help, $Usage); | ||
&Getopt::Tabular::GetOptions(\@opt_table, \@ARGV) | ||
|| exit $NeuroDB::ExitCodes::GETOPT_FAILURE; | ||
|
||
|
||
|
||
## input error checking | ||
|
||
if (!$ENV{LORIS_CONFIG}) { | ||
print STDERR "\n\tERROR: Environment variable 'LORIS_CONFIG' not set\n\n"; | ||
exit $NeuroDB::ExitCodes::INVALID_ENVIRONMENT_VAR; | ||
} | ||
|
||
if (!defined $profile || !-e "$ENV{LORIS_CONFIG}/.loris_mri/$profile") { | ||
print $Help; | ||
print STDERR "$Usage\n\tERROR: You must specify a valid and existing profile.\n\n"; | ||
exit $NeuroDB::ExitCodes::PROFILE_FAILURE; | ||
} | ||
|
||
{ package Settings; do "$ENV{LORIS_CONFIG}/.loris_mri/$profile" } | ||
|
||
if ( !@Settings::db ) { | ||
print STDERR "\n\tERROR: You don't have a \@db setting in the file " | ||
. "$ENV{LORIS_CONFIG}/.loris_mri/$profile \n\n"; | ||
exit $NeuroDB::ExitCodes::DB_SETTINGS_FAILURE; | ||
} | ||
|
||
|
||
|
||
## establish database connection | ||
|
||
my $dbh = &NeuroDB::DBI::connect_to_db(@Settings::db); | ||
print "\n==> Successfully connected to the database \n" if $verbose; | ||
|
||
|
||
|
||
## get config settings | ||
|
||
my $data_dir = NeuroDB::DBI::getConfigSetting(\$dbh, 'dataDirBasepath'); | ||
my $create_nii = NeuroDB::DBI::getConfigSetting(\$dbh, 'create_nii'); | ||
|
||
|
||
|
||
## exit if create_nii is set to No | ||
|
||
unless ($create_nii) { | ||
print "\nConfig option 'create_nii' set to no. bvec/bval files will not be " | ||
. "created as NIfTI files are not created by the imaging pipeline\n\n"; | ||
exit $NeuroDB::ExitCodes::SUCCESS; | ||
} | ||
|
||
|
||
|
||
## grep all FileIDs for which acquisition:bvalues are set | ||
|
||
print "\n==> Fetching all FileIDs with acquisition:bvalues. \n" if $verbose; | ||
|
||
( my $query = <<QUERY ) =~ s/\n/ /g; | ||
SELECT | ||
FileID | ||
FROM | ||
parameter_file | ||
JOIN parameter_type USING (ParameterTypeID) | ||
WHERE | ||
parameter_type.Name=? | ||
QUERY | ||
|
||
my $sth = $dbh->prepare($query); | ||
$sth->execute('acquisition:bvalues'); | ||
|
||
my @file_ids = map { $_->{'FileID'} } @{ $sth->fetchall_arrayref( {} ) }; | ||
|
||
unless (@file_ids) { | ||
print "\n No files were found with header 'acquisition:bvalues' so no need " | ||
. "to create bval/bvec files \n"; | ||
exit $NeuroDB::ExitCodes::SUCCESS; | ||
} | ||
|
||
|
||
|
||
## loop through all FileIDs and create bvec/bval files | ||
foreach my $file_id (@file_ids) { | ||
|
||
# load the file based on the FileID | ||
my $file = NeuroDB::File->new(\$dbh); | ||
$file->loadFile($file_id); | ||
|
||
# determine paths for bval/bvec files | ||
my $minc = $file->getFileDatum('File'); | ||
my ($bval_file, $bvec_file) = ($minc) x 2; | ||
$bval_file =~ s/mnc$/bval/; | ||
$bvec_file =~ s/mnc$/bvec/; | ||
|
||
# create complementary nifti files for DWI acquisitions | ||
my $bval_success = NeuroDB::MRI::create_dwi_nifti_bval_file( | ||
\$file, "$data_dir/$bval_file" | ||
); | ||
my $bvec_success = NeuroDB::MRI::create_dwi_nifti_bvec_file( | ||
\$file, "$data_dir/$bvec_file" | ||
); | ||
|
||
# check if bval/bvec created & update parameter_file table with their paths | ||
if ($bval_success) { | ||
print "\n==> Successfully created bval file for $minc \n"; | ||
# update parameter_file table with bval path | ||
$file->setParameter('check_bval_filename', $bval_file); | ||
} | ||
if ($bvec_success) { | ||
print "\n==> Successfully created bvec file for $minc \n"; | ||
# update parameter_file table with bvec path | ||
$file->setParameter('check_bvec_filename', $bvec_file); | ||
} | ||
|
||
} | ||
|
||
|
||
|
||
## disconnect from the database and exit the script with SUCCESS exit code | ||
$dbh->disconnect(); | ||
exit $NeuroDB::ExitCodes::SUCCESS; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think
@bvecs
will always contain 3 elements and so will always evaluate to true.return undef unless @bvecs
is unnecessary IMHO. Have you ever come across such a case?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, for T1W acquisitions for example, those 3 elements are not there and it will return
undef
, skipping the bval/bvec creation since there are no fields to create them. This avoids having to add another config setting to specify the scan type for which to create bval/bvec files (which would be a config setting a bit obscure). So if those headers are present, continue in this function to create the bvec file, if they are not present, then return from the function and don't create bvec file. Does that make more sense?