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

Switch to unified view

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