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.

References

  • No labels