# This software and supporting documentation are distributed by
# Institut Federatif de Recherche 49
# CEA/NeuroSpin, Batiment 145,
# 91191 Gif-sur-Yvette cedex
# France
#
# This software is governed by the CeCILL license version 2 under
# French law and abiding by the rules of distribution of free software.
# You can use, modify and/or redistribute the software under the
# terms of the CeCILL license version 2 as circulated by CEA, CNRS
# and INRIA at the following URL "http://www.cecill.info".
#
# As a counterpart to the access to the source code and rights to copy,
# modify and redistribute granted by the license, users are provided only
# with a limited warranty and the software's author, the holder of the
# economic rights, and the successive licensors have only limited
# liability.
#
# In this respect, the user's attention is drawn to the risks associated
# with loading, using, modifying and/or developing or reproducing the
# software by the user in light of its specific status of free software,
# that may mean that it is complicated to manipulate, and that also
# therefore means that it is reserved for developers and experienced
# professionals having in-depth computer knowledge. Users are therefore
# encouraged to load and test the software's suitability as regards their
# requirements in conditions enabling the security of their systems and/or
# data to be ensured and, more generally, to use and operate it in the
# same conditions as regards security.
#
# The fact that you are presently reading this means that you have had
# knowledge of the CeCILL license version 2 and that you accept its terms.
from brainvisa.processes import *
import shfjGlobals
try:
from connectomist.GemsOrientationSets import gemsOrientationSets
except:
pass
from registration import getTransformationManager
name='Import Diffusion SHFJ (GEMS scanner)'
userLevel=0
def validation():
try:
from connectomist.GemsOrientationSets import gemsOrientationSets
except:
raise ValidationError( 'connectomist.GemsOrientationSets module is not present or does not work.' )
signature = Signature(
'fileList', ListOf( ReadDiskItem( 'Raw DW Diffusion MR',
shfjGlobals.aimsVolumeFormats ) ),
'bValue', Float(),
'orientationCount', Integer(),
'nex', Integer(),
't2_diffusion', WriteDiskItem( 'Raw T2 Diffusion MR', 'GIS image' ),
'raw_dw_diffusion', WriteDiskItem( 'Raw DW Diffusion MR', 'GIS image' ),
'ignoreFileIndices', ListOf( Integer() ),
)
def initialization( self ):
self.nex = 1
self.linkParameters( 'raw_dw_diffusion', 't2_diffusion' )
self.setOptional( 'ignoreFileIndices' )
self.signature[ 'ignoreFileIndices' ].userLevel = 2
self.signature[ 'fileList' ].databaseUserLevel = 2
self.signature[ 't2_diffusion' ].browseUserLevel = 3
self.signature[ 'raw_dw_diffusion' ].browseUserLevel = 3
def execution( self, context ):
volumeDimension = self.fileList[ 0 ].get( 'volume_dimension' )
#print 'volumeDimension'
#print volumeDimension
sliceCount = int( volumeDimension[ 2 ] )
maxOrientationCountByStep = int( 512 ) / sliceCount - 1
# case with only one image in list
if maxOrientationCountByStep >= self.orientationCount:
if len( self.fileList ) != 1:
raise RuntimeError( _t_('There should be exactly one image in fileList' ) )
image = self.fileList[ 0 ]
header = context.temporary( 'Text file' )
bValues = [ 0 ] + [ self.bValue ] * self.orientationCount
orientations = [ [ 0, 0, 0 ] ] + gemsOrientationSets[
self.orientationCount ]
context.write( _t_('Building meta-info for data %s') % image.fullName() )
header.setMinf( 'bvalues', bValues )
header.setMinf( 'diffusion_gradient_orientations', orientations )
header.setMinf( 'nex', self.nex )
command = [ 'comistConcatenation',
'-verbose',
'-t2', self.t2_diffusion,
'-dw', self.raw_dw_diffusion,
'-i', image,
'-m', header.minfFileName() ]
# there are several images corresponding to several subset(s) of orientations
else:
if self.ignoreFileIndices:
files = string.join( \
map( lambda x, fileList=self.fileList: fileList[ x ].fullPath()+'
',
self.ignoreFileIndices ) )
answer = context.ask( _t_( 'The following images will be ignored :
%s
') % files, _t_('Ok'),_t_('Cancel') )
if answer != 0:
return
acqStepCount = self.orientationCount / maxOrientationCountByStep
if self.orientationCount % maxOrientationCountByStep != 0:
acqStepCount = acqStepCount + 1
if len( self.fileList ) != acqStepCount:
raise RuntimeError( _t_('There should be excatly %d image in fileList' ) %
acqStepCount )
headers = []
fileList = []
for step in range( acqStepCount ):
image = self.fileList[ step ]
if self.ignoreFileIndices and step in self.ignoreFileIndices:
context.warning( _t_( 'Image %s ignored' ) % image.fullPath() )
else:
fileList.append( image )
header = context.temporary( 'Text file' )
headers.append( header )
orientationCountForStep =maxOrientationCountByStep
if ( step == acqStepCount - 1 ) and ( self.orientationCount %
maxOrientationCountByStep != 0 ):
orientationCountForStep = ( self.orientationCount -
maxOrientationCountByStep *
( acqStepCount - 1 ) )
firstOrientationIndex = step * maxOrientationCountByStep
bValues = [ 0 ] + [ self.bValue ] * orientationCountForStep
orientations = [ [ 0, 0, 0 ] ] + gemsOrientationSets[
self.orientationCount ][
firstOrientationIndex:
firstOrientationIndex + orientationCountForStep]
context.write( _t_('Building meta-info for data %s') % image.fullName() )
header.setMinf( 'bvalues', bValues )
header.setMinf( 'diffusion_gradient_orientations', orientations )
header.setMinf( 'nex', self.nex )
command = [ 'comistConcatenation',
'-verbose',
'-t2', self.t2_diffusion,
'-dw', self.raw_dw_diffusion,
'-i' ] + fileList + [
'-m' ] + map( lambda x: x.minfFileName(), headers )
context.write( _t_('Concatenating data') )
apply( context.system, command )
transformManager = getTransformationManager()
transformManager.createNewReferentialFor( self.t2_diffusion )
transformManager.copyReferential( self.t2_diffusion,
self.raw_dw_diffusion )