Skip to content

Commit 495e84b

Browse files
committed
could provide an extra mask when integrating
1 parent f0435bf commit 495e84b

File tree

3 files changed

+133
-120
lines changed

3 files changed

+133
-120
lines changed

diffpy/srxplanar/calculate.py

+19-18
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ def prepareCalculation(self):
6262
self.xr = (np.arange(self.xdimension, dtype=float) - self.xbeamcenter + 0.5) * self.xpixelsize
6363
self.yr = (np.arange(self.ydimension, dtype=float) - self.ybeamcenter + 0.5) * self.ypixelsize
6464
self.dmatrix = self.genDistanceMatrix()
65-
self.azimuthmatrix = np.arctan2(self.yr.reshape(self.ydimension,1),
66-
self.xr.reshape(1,self.xdimension))
65+
self.azimuthmatrix = np.arctan2(self.yr.reshape(self.ydimension, 1),
66+
self.xr.reshape(1, self.xdimension))
6767
self.genTTHorQMatrix()
6868
return
6969

@@ -72,14 +72,14 @@ def genTTHorQMatrix(self):
7272
generate a twotheta matrix or q matrix which stores the tth or q value
7373
or each pixel
7474
'''
75-
#set tth or q grid
75+
# set tth or q grid
7676
if self.integrationspace == 'twotheta':
77-
self.bin_edges = np.r_[0, np.arange(self.tthstep/2, self.tthmax, self.tthstep)]
78-
self.xgrid = np.degrees(self.bin_edges[1:] - self.tthstep/2)
77+
self.bin_edges = np.r_[0, np.arange(self.tthstep / 2, self.tthmax, self.tthstep)]
78+
self.xgrid = np.degrees(self.bin_edges[1:] - self.tthstep / 2)
7979
self.tthorqmatrix = self.genTTHMatrix()
8080
elif self.integrationspace == 'qspace':
81-
self.bin_edges = np.r_[0, np.arange(self.qstep/2, self.qmax, self.qstep)]
82-
self.xgrid = self.bin_edges[1:] - self.qstep/2
81+
self.bin_edges = np.r_[0, np.arange(self.qstep / 2, self.qmax, self.qstep)]
82+
self.xgrid = self.bin_edges[1:] - self.qstep / 2
8383
self.tthorqmatrix = self.genQMatrix()
8484
return
8585

@@ -97,7 +97,7 @@ def genIntegrationInds(self, mask=None):
9797
self.maskedmatrix[mask] = 1000.0
9898

9999
self.bin_number = np.array(np.histogram(self.maskedmatrix, self.bin_edges)[0], dtype=float)
100-
self.bin_number[self.bin_number<=0] = 1
100+
self.bin_number[self.bin_number <= 0] = 1
101101
return self.bin_number
102102

103103
def intensity(self, pic):
@@ -125,8 +125,9 @@ def calculateIntensity(self, pic):
125125
126126
:retrun: 1d array, 1D integrated intensity
127127
'''
128+
128129
intensity = np.histogram(self.maskedmatrix, self.bin_edges, weights=pic)[0]
129-
return intensity/self.bin_number
130+
return intensity / self.bin_number
130131

131132
def calculateVariance(self, pic):
132133
'''
@@ -138,7 +139,7 @@ def calculateVariance(self, pic):
138139
'''
139140
picvar = self.calculateVarianceLocal(pic)
140141
variance = np.histogram(self.maskedmatrix, self.bin_edges, weights=picvar)[0]
141-
return variance/self.bin_number
142+
return variance / self.bin_number
142143

143144
def calculateVarianceLocal(self, pic):
144145
'''
@@ -151,10 +152,10 @@ def calculateVarianceLocal(self, pic):
151152
'''
152153

153154
picavg = snf.uniform_filter(pic, 5, mode='wrap')
154-
pics2 = (pic - picavg)**2
155-
pvar = snf.uniform_filter(pics2, 5, mode = 'wrap')
155+
pics2 = (pic - picavg) ** 2
156+
pvar = snf.uniform_filter(pics2, 5, mode='wrap')
156157

157-
gain = pvar/pic
158+
gain = pvar / pic
158159
gain[np.isnan(gain)] = 0
159160
gain[np.isinf(gain)] = 0
160161
gainmedian = np.median(gain)
@@ -197,7 +198,7 @@ def genTTHMatrix(self):
197198
sourceyr = self.distance * sint * sinr
198199
sourcezr = self.distance * cost
199200

200-
tthmatrix1 = np.zeros((self.ydimension,self.xdimension), dtype=float)
201+
tthmatrix1 = np.zeros((self.ydimension, self.xdimension), dtype=float)
201202
tthmatrix1 += ((-self.xr + sourcexr) * sourcexr).reshape(1, self.xdimension)
202203
tthmatrix1 += ((-self.yr + sourceyr) * sourceyr).reshape(self.ydimension, 1)
203204
tthmatrix1 += sourcezr * sourcezr
@@ -218,7 +219,7 @@ def genQMatrix(self):
218219
sourceyr = self.distance * sint * sinr
219220
sourcezr = self.distance * cost
220221

221-
tthmatrix1 = np.zeros((self.ydimension,self.xdimension), dtype=float)
222+
tthmatrix1 = np.zeros((self.ydimension, self.xdimension), dtype=float)
222223
tthmatrix1 += ((-self.xr + sourcexr) * sourcexr).reshape(1, self.xdimension)
223224
tthmatrix1 += ((-self.yr + sourceyr) * sourceyr).reshape(self.ydimension, 1)
224225
tthmatrix1 += sourcezr * sourcezr
@@ -259,9 +260,9 @@ def _polarizationCorrection(self):
259260
if self.polcorrectionenable:
260261
tthmatrix = self.tthorqmatrix if self.integrationspace == 'twotheta' else self.genTTHMatrix()
261262
azimuthmatrix = self.azimuthmatrix
262-
p = 0.5 * (1 + (np.cos(tthmatrix))**2)
263-
p1 = 0.5 * self.polcorrectf * np.cos(2*azimuthmatrix) * (np.sin(tthmatrix))**2
264-
p = 1.0 / (p-p1)
263+
p = 0.5 * (1 + (np.cos(tthmatrix)) ** 2)
264+
p1 = 0.5 * self.polcorrectf * np.cos(2 * azimuthmatrix) * (np.sin(tthmatrix)) ** 2
265+
p = 1.0 / (p - p1)
265266
else:
266267
p = np.ones((self.ydimension, self.xdimension))
267268
return p

diffpy/srxplanar/mask.py

+47-47
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def __init__(self, p):
4141
self.config = p
4242
return
4343

44-
def staticMask(self, addmask = None):
44+
def staticMask(self, addmask=None):
4545
'''
4646
create a static mask according existing mask file. This mask remain unchanged for different images
4747
@@ -53,40 +53,40 @@ def staticMask(self, addmask = None):
5353
5454
:return: 2d array of boolean, 1 stands for masked pixel
5555
'''
56-
addmask = self.addmask if addmask==None else addmask
56+
addmask = self.addmask if addmask == None else addmask
5757

5858
rv = np.zeros((self.ydimension, self.xdimension))
59-
#fit2d mask
59+
# fit2d mask
6060
maskfit2ds = filter(lambda msk: msk.endswith('.msk'), addmask)
61-
if len(maskfit2ds)>0:
61+
if len(maskfit2ds) > 0:
6262
for maskfit2d in maskfit2ds:
6363
if os.path.exists(maskfit2d):
6464
immask = fabio.openimage.openimage(maskfit2d)
65-
#rv += self.flipImage(immask.data)
65+
# rv += self.flipImage(immask.data)
6666
rv += immask.data
67-
#.npy mask
67+
# .npy mask
6868
npymasks = filter(lambda msk: msk.endswith('.npy'), addmask)
69-
if len(npymasks)>0:
69+
if len(npymasks) > 0:
7070
for npymask in npymasks:
7171
if os.path.exists(npymask):
7272
rv += np.load(npymask)
73-
#.tif mask
73+
# .tif mask
7474
tifmasks = filter(lambda msk: msk.endswith('.tif'), addmask)
75-
if len(tifmasks)>0:
75+
if len(tifmasks) > 0:
7676
for tifmask in tifmasks:
7777
if os.path.exists(tifmask):
7878
immask = fabio.openimage.openimage(tifmask)
7979
rv += self.flipImage(immask.data)
80-
#edge mask
80+
# edge mask
8181
edgemask = filter(lambda msk: msk.startswith('edge'), addmask)
82-
if len(edgemask)>0:
83-
if np.sum(self.maskedges)!=0:
82+
if len(edgemask) > 0:
83+
if np.sum(self.maskedges) != 0:
8484
rv += self.edgeMask(self.maskedges)
8585

8686
self.staticmask = (rv > 0)
8787
return self.staticmask
8888

89-
def dynamicMask(self, pic, addmask = None):
89+
def dynamicMask(self, pic, addmask=None):
9090
'''
9191
create a dynamic mask according to image array. This mask changes for different images
9292
@@ -98,22 +98,22 @@ def dynamicMask(self, pic, addmask = None):
9898
:return: 2d array of boolean, 1 stands for masked pixel
9999
'''
100100

101-
addmask = self.addmask if addmask==None else addmask
101+
addmask = self.addmask if addmask == None else addmask
102102
rv = np.zeros((self.ydimension, self.xdimension))
103103
flag = False
104-
#deadpixel mask
104+
# deadpixel mask
105105
dpmask = filter(lambda msk: msk.startswith('dead'), addmask)
106-
if len(dpmask)>0:
106+
if len(dpmask) > 0:
107107
rv += self.deadPixelMask(pic)
108108
flag = True
109-
#bright pixel mask
109+
# bright pixel mask
110110
bpmask = filter(lambda msk: msk.startswith('bright'), addmask)
111-
if len(bpmask)>0:
111+
if len(bpmask) > 0:
112112
rv += self.brightPixelMask(pic)
113113
flag = True
114-
#return None if none mask applied
114+
# return None if none mask applied
115115
if flag:
116-
self.dynamicmask = (rv>0)
116+
self.dynamicmask = (rv > 0)
117117
else:
118118
self.dynamicmask = None
119119
return self.dynamicmask
@@ -127,14 +127,14 @@ def deadPixelMask(self, pic):
127127
:return: 2d array of boolean, 1 stands for masked pixel
128128
'''
129129
avgpic = np.average(pic)
130-
ks = np.ones((5,5))
131-
ks1 = np.ones((7,7))
132-
picb = snf.percentile_filter(pic, 5, 3) < avgpic/10
130+
ks = np.ones((5, 5))
131+
ks1 = np.ones((7, 7))
132+
picb = snf.percentile_filter(pic, 5, 3) < avgpic / 10
133133
picb = snm.binary_dilation(picb, structure=ks)
134134
picb = snm.binary_erosion(picb, structure=ks1)
135135
return picb
136136

137-
def brightPixelMask(self, pic, size=5, r = 1.2):
137+
def brightPixelMask(self, pic, size=5, r=1.2):
138138
'''
139139
pixels with much higher intensity compare to adjacent pixels will be masked,
140140
this mask is used when there are some bright spots/pixels whose intensity is higher
@@ -152,7 +152,7 @@ def brightPixelMask(self, pic, size=5, r = 1.2):
152152
:return: 2d array of boolean, 1 stands for masked pixel
153153
'''
154154
rank = snf.rank_filter(pic, -size, size)
155-
ind = snm.binary_dilation(pic>rank*r, np.ones((3,3)))
155+
ind = snm.binary_dilation(pic > rank * r, np.ones((3, 3)))
156156
return ind
157157

158158
def edgeMask(self, edges=None):
@@ -164,27 +164,27 @@ def edgeMask(self, edges=None):
164164
165165
:return: 2d array of boolean, 1 stands for masked pixel
166166
'''
167-
edges = self.maskedges if edges==None else edges
167+
edges = self.maskedges if edges == None else edges
168168
rv = np.zeros((self.ydimension, self.xdimension))
169-
if edges[0]!=0:
170-
rv[:,:edges[0]] = 1
171-
if edges[1]!=0:
172-
rv[:,-edges[1]:] = 1
173-
if edges[2]!=0:
174-
rv[-edges[2]:,:] = 1
175-
if edges[3]!=0:
176-
rv[:edges[3]:,:] = 1
169+
if edges[0] != 0:
170+
rv[:, :edges[0]] = 1
171+
if edges[1] != 0:
172+
rv[:, -edges[1]:] = 1
173+
if edges[2] != 0:
174+
rv[:edges[2], :] = 1
175+
if edges[3] != 0:
176+
rv[-edges[3]::, :] = 1
177177

178178
ra = edges[4]
179-
ball = np.zeros((ra*2, ra*2))
180-
radi = (np.arange(ra*2)-ra).reshape((1, ra*2))**2 + \
181-
(np.arange(ra*2)-ra).reshape((ra*2, 1)) ** 2
179+
ball = np.zeros((ra * 2, ra * 2))
180+
radi = (np.arange(ra * 2) - ra).reshape((1, ra * 2)) ** 2 + \
181+
(np.arange(ra * 2) - ra).reshape((ra * 2, 1)) ** 2
182182
radi = np.sqrt(radi)
183183
ind = radi > ra
184-
rv[edges[3]:edges[3]+ra, edges[0]:edges[0]+ra] = ind[:ra,:ra]
185-
rv[edges[3]:edges[3]+ra, -edges[1]-ra:-edges[1]] = ind[:ra,-ra:]
186-
rv[-edges[2]-ra:-edges[2], edges[0]:edges[0]+ra] = ind[-ra:, :ra]
187-
rv[-edges[2]-ra:-edges[2], -edges[1]-ra:-edges[1]] = ind[-ra:,-ra:]
184+
rv[-edges[3] - ra:-edges[3], edges[0]:edges[0] + ra] = ind[-ra:, :ra]
185+
rv[-edges[3] - ra:-edges[3], -edges[1] - ra:-edges[1]] = ind[-ra:, -ra:]
186+
rv[edges[2]: edges[2] + ra, edges[0]:edges[0] + ra] = ind[:ra, :ra]
187+
rv[edges[2]: edges[2] + ra, -edges[1] - ra:-edges[1]] = ind[:ra, -ra:]
188188
return rv
189189

190190
def undersample(self, undersamplerate):
@@ -207,9 +207,9 @@ def flipImage(self, pic):
207207
:return: 2d array, flipped image array
208208
'''
209209
if self.fliphorizontal:
210-
pic = pic[:,::-1]
210+
pic = pic[:, ::-1]
211211
if self.flipvertical:
212-
pic = pic[::-1,:]
212+
pic = pic[::-1, :]
213213
return pic
214214

215215
def saveMask(self, filename, pic=None, addmask=None):
@@ -226,11 +226,11 @@ def saveMask(self, filename, pic=None, addmask=None):
226226
'''
227227
if not hasattr(self, 'mask'):
228228
self.normalMask(addmask)
229-
if (not hasattr(self, 'dynamicmask')) and (pic!=None):
229+
if (not hasattr(self, 'dynamicmask')) and (pic != None):
230230
self.dynamicMask(pic, addmask=addmask)
231231
tmask = self.mask
232232
if hasattr(self, 'dynamicmask'):
233-
if self.dynamicmask!=None:
234-
tmask = np.logical_or(self.mask, self.dynamicmask) if pic!=None else self.mask
233+
if self.dynamicmask != None:
234+
tmask = np.logical_or(self.mask, self.dynamicmask) if pic != None else self.mask
235235
np.save(filename, tmask)
236-
return tmask
236+
return tmask

0 commit comments

Comments
 (0)