Skip to content

Commit 742d7a8

Browse files
author
Oier Lauzirika Zarrabeitia
committed
Added difference output
1 parent fe10654 commit 742d7a8

File tree

1 file changed

+44
-13
lines changed

1 file changed

+44
-13
lines changed

src/xmipp/applications/scripts/volume_consensus/volume_consensus.py

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@
2828
**************************************************************************
2929
"""
3030
import math
31+
import os
32+
import itertools
3133
import numpy as np
3234
import pywt
3335
import pywt.data
36+
3437
from scipy.ndimage import zoom
3538
from xmipp_base import XmippScript
3639
import xmippLib
@@ -53,6 +56,25 @@ def run(self):
5356
outVolFn = self.getParam('-o')
5457
self.computeVolumeConsensus(inputFile, outVolFn)
5558

59+
def resize(self, image, dim):
60+
imageFt = np.fft.rfftn(image)
61+
resultFt = np.zeros(dim[:-1] + (dim[-1]//2+1,), dtype=imageFt.dtype)
62+
63+
copyExtent = np.minimum(image.shape, dim) // 2
64+
srcCornerStart = image.shape-copyExtent
65+
dstCornerStart = dim-copyExtent
66+
for corners in itertools.product(range(2), repeat=len(dim)-1):
67+
corners = np.array(corners + (0, ))
68+
srcStart = np.where(corners, srcCornerStart, 0)
69+
srcEnd = srcStart + copyExtent
70+
dstStart = np.where(corners, dstCornerStart, 0)
71+
dstEnd = dstStart + copyExtent
72+
srcSlices = [slice(s, e) for s, e in zip(srcStart, srcEnd)]
73+
dstSlices = [slice(s, e) for s, e in zip(dstStart, dstEnd)]
74+
resultFt[tuple(dstSlices)] = imageFt[tuple(srcSlices)]
75+
76+
return np.fft.irfftn(resultFt)
77+
5678
def computeVolumeConsensus(self, inputFile, outVolFn, wavelet='sym11'):
5779
outputWt = None
5880
outputMin = None
@@ -77,7 +99,8 @@ def computeVolumeConsensus(self, inputFile, outVolFn, wavelet='sym11'):
7799
zdim2 = 2**(math.ceil(math.log2(zdimOrig))) # Next power of 2
78100

79101
if xdimOrig!=xdim2 or ydimOrig!=ydim2 or zdimOrig!=zdim2:
80-
volume = zoom(volume, (xdim2/xdimOrig,ydim2/ydimOrig,zdim2/zdimOrig))
102+
#volume = zoom(volume, (xdim2/xdimOrig,ydim2/ydimOrig,zdim2/zdimOrig))
103+
volume = self.resize(volume, (zdim2, ydim2, xdim2))
81104

82105
nlevel = pywt.dwtn_max_level(volume.shape, wavelet=wavelet)
83106
wt = pywt.wavedecn(
@@ -88,8 +111,14 @@ def computeVolumeConsensus(self, inputFile, outVolFn, wavelet='sym11'):
88111

89112
if outputWt == None:
90113
outputWt = wt
91-
#outputMin = np.zeros_like(wt[1]['aaa'])
114+
outputMin = np.zeros_like(volume)
92115
else:
116+
diff = np.abs(np.abs(wt[0]) - np.abs(outputWt[0]))
117+
diff = self.resize(diff, outputMin.shape)
118+
np.maximum(
119+
diff, outputMin,
120+
out=outputMin
121+
)
93122
outputWt[0] = np.where(
94123
np.abs(wt[0]) > np.abs(outputWt[0]),
95124
wt[0], outputWt[0]
@@ -102,28 +131,30 @@ def computeVolumeConsensus(self, inputFile, outVolFn, wavelet='sym11'):
102131
wtLevelDetail = wtLevel[detail]
103132
outputWtLevelDetail = outputWtLevel[detail]
104133

105-
outputWtLevelDetail[...] = np.where(
106-
np.abs(wtLevelDetail) > np.abs(outputWtLevelDetail),
107-
wtLevelDetail, outputWtLevelDetail
108-
)
109-
110-
"""
111134
diff = np.abs(np.abs(wtLevelDetail) - np.abs(outputWtLevelDetail))
135+
diff = self.resize(diff, outputMin.shape)
112136
np.maximum(
113137
diff, outputMin,
114138
out=outputMin
115139
)
116-
"""
117140

141+
outputWtLevelDetail[...] = np.where(
142+
np.abs(wtLevelDetail) > np.abs(outputWtLevelDetail),
143+
wtLevelDetail, outputWtLevelDetail
144+
)
145+
146+
118147
f.close()
119148
consensus = pywt.waverecn(outputWt, wavelet)
120149
if xdimOrig!=xdim2 or ydimOrig!=ydim2 or zdimOrig!=zdim2:
121-
consensus = zoom(consensus, (xdimOrig/xdim2,ydimOrig/ydim2,zdimOrig/zdim2))
150+
consensus = self.resize(consensus, (zdimOrig, ydimOrig, xdimOrig))
122151
image.setData(consensus)
123152
image.write(outVolFn)
124-
#image.setData(outputMin)
125-
#outVolFn2 = splitext(outVolFn)[0] + '_diff.mrc'
126-
#image.write(outVolFn2)
153+
if xdimOrig!=xdim2 or ydimOrig!=ydim2 or zdimOrig!=zdim2:
154+
outputMin = self.resize(outputMin, (zdimOrig, ydimOrig, xdimOrig))
155+
image.setData(outputMin)
156+
outVolFn2 = os.path.splitext(outVolFn)[0] + '_diff.mrc'
157+
image.write(outVolFn2)
127158

128159

129160
if __name__=="__main__":

0 commit comments

Comments
 (0)