Content
Mask
To create mask use Mask Editor command med
or launch it through the calibman
.
Geometry center
ix_cent, iy_cent = det.point_indexes(runnum)
879, 871 (then x and y are swapped to Cartesian system).
Equatorial mask
Mask parameters
Wedge 871 879 454 387 148 196 1 k False False Wedge 871 879 454 387 -27 21 1 k False False
Wedge parameters
t = pars[0] # figure type, ex. 'Wedge' x = float(pars[1]) # x coordinate of the wedge center y = float(pars[2]) # y coordinate of the wedge center r = float(pars[3]) # 1-st radius of the wedge w = float(pars[4]) # radial width of the wedge t1 = float(pars[5]) # 1-st angle t2 = float(pars[6]) # 2-nd angle lw = int(pars[7]) # line width col = str(pars[8]) # color s = self.dicBool[pars[9].lower()] # isSelected boolean parameter rem = self.dicBool[pars[10].lower()] # isRemoved - helper parameter
Involved sensors in adopted cxif5315 geometry: 0, 1, 9,15, 16,17, 25,31
Quads numeration in cxif5315 geometry
--------- | 1 | 0 | ----+---- | 2 | 3 | ---------
Arc mask
Wedge 871 879 454 26 -174 186 1 k False False
Involved sensors in the top part of the image in adopted cxif5315 geometry: 0, (1), 7, 8, (9), 15
Equatorial and arc combined mask
Masks for segments
Code below shows how to generate mask n-d arrays for particular set of segments (2x1s)
shape_cspad = (32,185,388) seg1 = np.ones((185,388)) mask_winds_all = np.zeros(shape_cspad, dtype=np.int16) mask_winds_equ = np.zeros(shape_cspad, dtype=np.int16) mask_winds_arc = np.zeros(shape_cspad, dtype=np.int16) mask_winds_all[(0,1,7,8,9,15,16,17,23,24,25,31),:,:] = seg1 mask_winds_equ[(0,1,9,15,16,17,25,31),:,:] = seg1 mask_winds_arc[(0,7,8,15),:,:] = seg1
Only listed segments are highlighted on plots:
Background
Averaged background shape
Background shape evaluated in exp=cxif5315:run=162 with common mode correction - central segments got offset to higher intensity
Background shape evaluated evaluated in exp=cxif5315:run=162 without common mode correction - common mode offsets averaged out to zero and image represents true background shape.
Command to average data with options for processing algorithms:
det_ndarr_average -d exp=cxif5315:run=162 -s CxiDs2.0:Cspad.0 -n 10000 -m 5000 -a 3 -f nda-bkgd -p -v
skips 5000 and averages next 10000 events.
Deployed as: /reg/d/psdm/cxi/cxif5315/calib/CsPad::CalibV1/CxiDs2.0:Cspad.0/pixel_bkgd/95-end.data
Radial background subtraction
polarization correction factor map orientation should be consistent with geometry file - in cxif5315 it should be rotated by 90°.
from pyimgalgos.RadialBkgd import RadialBkgd, polarization_factor X, Y, Z = geo.get_pixel_coords() rb = RadialBkgd(X, Y, mask, nradbins=500, nphibins=1) pf = polarization_factor(rb.pixel_rad(), rb.pixel_phi()+90, 91.33e3) # in event loop: nda, title = rb.subtract_bkgd_interpol(arr * pf) * mask
For example we apply this algorithm to the water background averaged sample from exp=cxif5315:run=162:
Radial background fails to work in the region of shadow, where image miss symmetry. This region can be removed by constraining the range of angles phiedges=(40, 325).
In the next plot the radial range is also constrained as radedges=(5000,100000) for the purpose of example:
# the same as in previous case, but rb = RadialBkgd(X, Y, mask, nradbins=500, nphibins=1, phiedges=(40, 325), radedges=(5000,100000))
SIngle angular bin still works fine in our ROI defined by both masks.
Background subtraction examples
Subtract background shape evaluated in run 192
from pyimgalgos.GlobalUtils import subtract_bkgd # once per run: nda_peds = det.pedestals(runnum) nda_bkgd = det.bkgd(runnum) # get n-d array with averaged background from calib/.../pixel_bkgd nda_smask = det.mask(evt, calib=False, status=True, edges=True, central=True, unbond=True, unbondnbrs=True) # windows for background normalization winds_bkgd = [(s, 10, 100, 270, 370) for s in (4,12,20,28)] # use part of segments 4,12,20,28 to subtr bkg # in the event loop nda_raw = det.raw(evt) if nda_raw is not None : nda = np.array(nda_raw, dtype=np.float32, copy=True) nda -= nda_peds # Subtract background shape averaged for pure water nda = subtract_bkgd(nda, nda_bkgd, mask=nda_smask, winds=winds_bkgd)
Radial background subtraction
Image corrected up to 80mm, rings span for entire phi
Image corrected up to 80mm, 40<phi< 320:
OLD IMAGE PROCESSING
Subtract background shape evaluated in run 192.
Background shape was evaluated WITH common mode correction; central 2x1s got offset due to non-uniform water background shape.
Averaged Fraser- transformed image using angles from fit to 2 arc peaks
Spectrum of intensities
Spectrum of intensities of all quad 2x1-segment 0 (close to beam) and 4 (water ring region)
before background subtraction
after background subtraction
- masked pixels contributes to peak at 0
- 1-, 2- and 3- photon peaks are seen
- common mode correction before background subtraction does not work well in this data sample due to significant fraction of 1-photon peak next to noise peak, which makes an offset due to illumination.
- common mode correction after background subtraction does not work - it moves noise peak to 0 and destroys background subtraction results.
Potentially any non-dark data spectra can be used to calibrate pixel gain.