Diff of /code/p2processing.py [000000] .. [32d261]

Switch to unified view

a b/code/p2processing.py
1
import os
2
import numpy as np
3
from multiprocessing import Pool
4
from functools import partial
5
from image_utils import *  
6
7
def output3DRefinement(atlases, DLSeg, param_dir, tmps_dir, dofs_dir, subject_dir, savedInd, fr, mirtk):
8
   
9
    segstring = ''
10
    ind = 0
11
    atlasUsedNo = len(atlases)
12
        
13
    for i in range(atlasUsedNo):
14
         
15
        if mirtk:
16
            os.system('mirtk register '
17
                      '{0} '
18
                      '{1} '
19
                      '-parin {2}/ffd_label_1.cfg ' 
20
                      '-dofin {3}/shapelandmarks_{4}.dof.gz '
21
                      '-dofout {3}/shapeffd_{5}_{6}.dof.gz' 
22
                      .format(DLSeg, atlases[i], param_dir, dofs_dir, savedInd[i], i, fr))
23
            
24
            os.system('mirtk transform-image '
25
                      '{0} '
26
                      '{1}/seg_lvsa_SR_{4}_{5}.nii.gz ' 
27
                      '-dofin {2}/shapeffd_{4}_{5}.dof.gz '
28
                      '-target {3}/lvsa_SR_{5}.nii.gz -interp NN'  
29
                      .format(atlases[i], tmps_dir, dofs_dir, subject_dir, i, fr)) 
30
31
        else:
32
            os.system('nreg '
33
                      '{0} '
34
                      '{1} '
35
                      '-parin {2}/segreg.txt ' 
36
                      '-dofin {3}/shapelandmarks_{4}.dof.gz '
37
                      '-dofout {3}/shapeffd_{5}_{6}.dof.gz' 
38
                      .format(DLSeg, atlases[i], param_dir, dofs_dir, savedInd[i], i, fr))
39
                          
40
            os.system('transformation '
41
                      '{0} '
42
                      '{1}/seg_lvsa_SR_{4}_{5}.nii.gz ' 
43
                      '-dofin {2}/shapeffd_{4}_{5}.dof.gz '
44
                      '-target {3}/lvsa_SR_{5}.nii.gz -nn' 
45
                      .format(atlases[i], tmps_dir, dofs_dir, subject_dir, i, fr))    
46
47
        segstring += '{0}/seg_lvsa_SR_{1}_{2}.nii.gz '.format(tmps_dir, i, fr)
48
        
49
        ind += 1
50
        
51
    # apply label fusion    
52
    os.system('combineLabels {0}/seg_lvsa_SR_{1}.nii.gz {2} {3}'.format(subject_dir, fr, ind, segstring))
53
    
54
    
55
def apply_PC(subject, data_dir, param_dir, atlases_list, landmarks_list, mirtk):
56
       
57
    print('  registering {0}'.format(subject))    
58
    
59
    subject_dir = os.path.join(data_dir, subject)
60
        
61
    if os.path.isdir(subject_dir):
62
        
63
        tmps_dir = '{0}/tmps'.format(subject_dir)
64
65
        dofs_dir = '{0}/dofs'.format(subject_dir)
66
    
67
        segs_dir = '{0}/segs'.format(subject_dir)
68
        
69
        sizes_dir = '{0}/sizes'.format(subject_dir)
70
        
71
        subject_landmarks = '{0}/landmarks.vtk'.format(subject_dir)
72
                                  
73
        for fr in ['ED', 'ES']:
74
                
75
            DLSeg = '{0}/seg_lvsa_{1}.nii.gz'.format(segs_dir, fr)
76
            
77
            if not os.path.exists(DLSeg):
78
                
79
                print(' segmentation {0} does not exist. Skip.'.format(DLSeg))
80
                
81
                continue
82
                 
83
            topSimilarAtlases_list, savedInd = topSimilarAtlasShapeSelection(atlases_list[fr], landmarks_list[fr], 
84
                                               subject_landmarks, tmps_dir, dofs_dir, DLSeg, param_dir, 3) 
85
                      
86
            formHighResolutionImg(subject_dir, fr)
87
                
88
            output3DRefinement(topSimilarAtlases_list, DLSeg, param_dir, tmps_dir, dofs_dir, subject_dir, savedInd, fr, mirtk)
89
                   
90
            if mirtk:
91
                
92
                refineFusionResults(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr), 2)
93
            
94
#                clearBaseManbrance(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr)) 
95
#            
96
#                refineFusionResults(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr), 2) 
97
                
98
            else:
99
                
100
                refineFusionResults(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr), 2) 
101
            
102
            convertImageSegment(subject_dir, fr)
103
            
104
            outputVolumes(subject_dir, data_dir, subject, fr)
105
            
106
            moveVolumes(subject_dir, sizes_dir, fr)
107
                
108
        print('  finish 3D nonrigid-registering one subject {}'.format(subject))
109
    
110
    else:  
111
        print('  {0} is not a valid directory, do nothing'.format(subject_dir))
112
        
113
       
114
def multiatlasreg3D(dir_0, dir_1, dir_2, coreNo, parallel, mirtk):
115
               
116
    print('Select all the shape atlases for 3D multi-atlas registration')
117
    
118
    atlases_list, landmarks_list = allAtlasShapeSelection(dir_1)
119
120
    if parallel:
121
    
122
        print('Start 3D multi-atlas registration and program running on {0} cores'.format(coreNo))
123
        
124
        pool = Pool(processes = coreNo) 
125
        
126
        # partial only in Python 2.7+
127
        pool.map(partial(apply_PC, 
128
                         data_dir=dir_0,  
129
                         param_dir=dir_2, 
130
                         atlases_list=atlases_list, 
131
                         landmarks_list=landmarks_list,
132
                         mirtk=mirtk), 
133
                         sorted(os.listdir(dir_0)))       
134
                
135
    else:
136
        
137
        print('Start 3D multi-atlas registration and program running subsequently')
138
                
139
        data_dir, param_dir = dir_0, dir_2
140
                                     
141
        for subject in sorted(os.listdir(data_dir)):
142
            
143
            print('  registering {0}'.format(subject))   
144
            
145
            subject_dir = os.path.join(data_dir, subject)
146
147
            if not os.path.isdir(subject_dir):
148
                
149
                print('  {0} is not a valid folder, Skip'.format(subject_dir))
150
                
151
                continue 
152
                   
153
            tmps_dir = '{0}/tmps'.format(subject_dir)
154
155
            dofs_dir = '{0}/dofs'.format(subject_dir)
156
    
157
            segs_dir = '{0}/segs'.format(subject_dir)
158
            
159
            sizes_dir = '{0}/sizes'.format(subject_dir)
160
            
161
            subject_landmarks = '{0}/landmarks.vtk'.format(subject_dir)
162
            
163
            for fr in ['ED', 'ES']:
164
                    
165
                DLSeg = '{0}/seg_lvsa_{1}.nii.gz'.format(segs_dir, fr)
166
                
167
                if not os.path.exists(DLSeg):
168
                
169
                    print(' segmentation {0} does not exist. Skip.'.format(DLSeg))
170
                
171
                    continue
172
                 
173
                topSimilarAtlases_list, savedInd = topSimilarAtlasShapeSelection(atlases_list[fr], landmarks_list[fr], 
174
                                                   subject_landmarks, tmps_dir, dofs_dir, DLSeg, param_dir, 3) 
175
                      
176
                formHighResolutionImg(subject_dir, fr)
177
                
178
                output3DRefinement(topSimilarAtlases_list, DLSeg, param_dir, tmps_dir, dofs_dir, subject_dir, savedInd, fr, mirtk)
179
                
180
                if mirtk:
181
                    
182
                    refineFusionResults(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr), 2) 
183
            
184
#                    clearBaseManbrance(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr)) 
185
#            
186
#                    refineFusionResults(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr), 2) 
187
                else:
188
                    
189
                    refineFusionResults(subject_dir, 'seg_lvsa_SR_{0}.nii.gz'.format(fr), 2) 
190
            
191
                convertImageSegment(subject_dir, fr)
192
            
193
                outputVolumes(subject_dir, data_dir, subject, fr)
194
                
195
                moveVolumes(subject_dir, sizes_dir, fr)
196
                                
197
            print('  finish 3D nonrigid-registering one subject {}'.format(subject))