-
Notifications
You must be signed in to change notification settings - Fork 8
/
Phaser.py
136 lines (112 loc) · 8.48 KB
/
Phaser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""
Basic Python module for phasing Bragg CDI data
Siddharth Maddali
Argonne National Laboratory
2017-2018
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@ %@ %@ *@ #@ /@ *@ #@ ,@ ,@ #@ @ &@@@@@@@
@@@@@@@* ,&@@( @. @ @( @. @. @( @, @/ @# @, (@@ * @@@@@@
@@@@@ @@@@@@@@ #@ /@ ,@ (@ ,@ ,@ (@ @ .@ *@ &@@@ @@@ (@@@
,@@@@@@@@@@ ,@. @. @* ,@. @, @* .@. @* @* @. @@@ (@@@@@/
(@@@@@@@@@@@ %% (& (& #% /@ /@ (% /@ /@ /& @( @@@@@@@@%
@@@@@@@@@@@. @@@% *@ @ @ ,@ @ @ .@ @ @ ,@@@,@ @@@@@@@@@@@@/
/@@@@@@@/ &@@@@@@@@* @/ @& @& @( @@ @& &# @@ @@@@@@@..@% @@ /@@@@@@@/
@@@@@@@@@@@* .@ @ @ .@ @ @ @ @ @ @@@@@ @@@@@ @
&@@@@@@@@@@@@# @# @@ @@ &% @@ @@ %& @@ @@ .@@@* @@@@@ @
@@@@@@@@@@@@@ @ .%@@@ * @ @ @ @ @. * @@@&. @ %@ %@@@@@ @@@
@@@@@@@@@@ %.@@@@@ @@ @@ #& &@ @@ (@ @. @@@@@. /@@@@@@. @@@
&&&&* /@ @@@@@@ @@@( @ @. @ @ @, #@ @@@@@@ @@@% @* (&.%&
@@@* @@@@@. @@@ @@ /@ %@ %@ /@ . @@@@@/ @@@@@#& %@
@@@@@ %@@@@@ &@ @@@@@@@ @. @ @@@ (@& @.@@@@@ &@@@@@ /@ @.
@@@@@# @@@@@,, (, @@@@@# @@% #@ /@@@@@@# @@@@@%@ #@% @@@@@% @@@ #@
@@@@ #@@@@*@. @@@ @@@@@@ /@@@ @. @,@@@@@ /@@@@@ %@ %(@@@@@ *@@ @,
*& #@%@@@@( @@@@@% @@@. (@ .@ @@@% @@@@@/ @@@@& @ ,& *@
@/ .,%@@@@@ &@@@@@ /@& / %@@@@@ #* %@ /@@@@@ %@@@@@ , @( @,
#& ,*@@@@@*,@@@@@*.% @@,*@@@@@/.@@@@ #(@@@@@*,@@@@@/ @@ #& (%
@. * @@@@@@ &@@@@@&.,@@@% @@@@@@ &@@@@@ % @@& &@@@@@ &@@ @. @.
@& @/#@@@@ .@@@ @.@@@@@ /@@@@@ @@@@@ .@@@ %*@@@@@ @% @& %%
@ .@ .& &@ @@@@@& @@@@@@ @@@@@@ @@@@@@, ..& @ @
@& @# @@ @@ @@@@@.,@@@@@ @@@@@ @@@@@,.@ @@ @@ #@
@ @ @ @@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ &@@ @ @ @.
@@ %% &@ %@ @@@@@*.@@@@@. @@@@@ @@@@@/ @@/ &@ &@ /@
@ @ @ @@@@@@ &@@@@@ @@@@@@ @@@@@@ %@ @ @ @*
@@ (@ %. @@@@@@@ @@@@( @@@@@. @@@@@. @@@@@( @@, @@@@ (@ *@
@ @. @@@ @@@@@@ @@# @ #@@@@@ &@@@@@ @@@@@,@&@@@@@ &@@@@@ . @/
@@ *@ @@, @@@@@, @@@@@*@#@@@@* @@@@@/ @@& # @@@@@* @@@@@% ,@
@ @* @ &@@@@@ @@@@@@ /. .@@ %@@@@@ % @@ /@@@@@ %@@@@@ / @#
#@ ,@ ##@@@@@( @@@@@% @@@ (@/@@@/.@ @@@% @@@@@/ @@@@@/@ .@
@ @@ *@@@@ @, @@@ %@@@@@ *@@@@ @* @/ @@@@ *@@@@@ #@@@ @% @@@@ ,@@*
%( @@@,.@@@@@.*@. #,@@@@@*.@@@@&%# #& @@@*.@@@@@,*@ # @@@@@*.@@@@@
@. @@ %@@@@% &@@@# @. *@@@ %@@@..@. @, @ #@@@@&#. (@ #@@@@@ #@@@@.
@( .@@@@@ /@@@@@ @& @( @@ @& &# %@@ @@@@@ @@@@
@ @ .@@@% @@@@@@ @( @ .@ @ @ @ #@@@ @@@@@@ @@*
@@@ .@@@@@@& % *@@@@@ @( @@ &% @@ @@ %& #@@ @@@@@ %@@@@@@@@@
#@@@ @@@@@@ @% @ @@@@@ @ @ @ @ @ @. @ @@@@@ @ *@@@@@@@@@@@@&
@ @@@@@ @@@, %% &@ @@ #& &@ @@ (@ &@ &@ @@@@@@@@@@@@@
@@@@@@@ @@@@@/@ @ @ @. @ @ @, @ @ @@@@@@@@@@@@
/@@@@@* &@ ,@@ @@@@@@@ &@ @@ /@ %@ %@ /@ %@ (@ @@@@@@@@@. *@@@@@%
@@@@@@@@@@@/@ ,@@@@@/@. @ @ @* @. @ @/ @. @. .@@@@@# ,@@@@@@@@@@@
.@@@@@@@@@, @ @@ *@ %@ %@ *@ #@ /@ *@ #@ ,@ @@@@@@@@@@@@(
&@@@@@@ &@@ @ @* @. @ @( @. @. @( @, @/ &@@@@@@@@@@
@@@/ (@@@* @@@ #@ ,@ #@ /@ ,@ (@ .@ .@ (@ @ @@@@@@@@/ *@@
@@@@@@# @ %@@ @ @# @, @, @# @* @/ @# @* @% @@@@@ ,@@@@@
@@@@@@@@/ #& (& *@ #& *& *@ (& ,@ *@ /& ,@ .@@@@@@@
"""
import numpy as np
import GPUModule as accelerator
import os
try:
from pyfftw.interfaces.numpy_fft import fftshift, fftn, ifftn
except:
from numpy.fft import fftshift, fftn, ifftn
# plugin modules
import Core, RecipeParser
import ER, HIO, SF
import GaussPCC, Morphology
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # suppresses all Tensorflow terminal messages
class Phaser(
Morphology.Mixin, # Routines to manipulate object support
GaussPCC.Mixin, # New ER accounting for partial coherence
Core.Mixin, # core CPU algorithms and routines
RecipeParser.Mixin, # for handling recipe strings
ER.Mixin, # error reduction
HIO.Mixin, # hybrid input/output
SF.Mixin # solvent flipping
):
def __init__( self,
modulus,
support=None, # if None, use default support
beta=0.9,
binning=1, # for high-energy CDI. Set to 1 for regular phase retrieval.
gpu=False,
pcc=False,
pcc_params=None, # user-defined coherence function parameters
random_start=True
):
self.BEStruct = np.ones( ( 3, 3, 3 ) ) # default structuring element for 3D binary erosion
self.BinaryErosion = self.__CPUErosion__
self._modulus = fftshift( modulus )
self._arraySize = tuple( this*shp for this, shp in zip( [ binning, binning, 1 ], self._modulus.shape ) )
if support is None:
self._initializeSupport()
else:
self._support = fftshift( support )
self._support_comp = 1. - self._support
self._beta = beta
if random_start:
self._cImage = np.exp( 2.j * np.pi * np.random.random_sample( self._arraySize ) ) * self._support
else:
self._cImage = 1. * self._support
self._cachedImage = np.zeros( self._cImage.shape ).astype( complex )
self._cImage_fft_mod = np.absolute( fftn( self._cImage ) )
self._error = []
self._UpdateError()
self.generateAlgoDict()
if gpu==True:
gpack = self.generateGPUPackage( pcc=pcc, pcc_params=pcc_params )
self.gpusolver = accelerator.Solver( gpack )
#if pcc==True:
# self._pccSolver = PCSolver( np.absolute( self._modulus )**2, gpack )
# self._kernel_f = self._pccSolver.getBlurKernel()
# self._ModProject = self._ModProjectPC
return