# 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 )