2828**************************************************************************
2929"""
3030import math
31+ import os
32+ import itertools
3133import numpy as np
3234import pywt
3335import pywt .data
36+
3437from scipy .ndimage import zoom
3538from xmipp_base import XmippScript
3639import 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
129160if __name__ == "__main__" :
0 commit comments