Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
titleDetector/examples/test-scaling-mpi-epix10ka2m.py
collapsetrue
def  def calib_epix10ka_any(det, evt, cmpars=None, **kwa): # cmpars=(7,2,10,10), mbits=None, mask=None, nda_raw=None
    """
    Returns calibrated epix10ka data

    - gets constants
    - gets raw data
    - evaluates (code - pedestal - offset)
    - applys common mode correction if turned on
    - apply gain factor

    Parameters

    - det (psana.Detector) - Detector object
    - evt (psana.Event)    - Event object
    - cmpars (tuple) - common mode parameters
          = None - use pars from calib directory
          = cmpars=(<alg>, <mode>, <maxcorr>)
            alg is not used
            mode =0-correction is not applied, =1-in rows, =2-in cols-WORKS THE BEST
            i.e: cmpars=(7,0,100) or (7,2,100)
    - **kwa - used here and passed to det.mask_comb
      - nda_raw - substitute for det.raw(evt)
      - mbits - deprecated parameter of the det.mask_comb(...), det.mask_v2 is used by default
      - mask - user defined mask passed as optional parameter
    """

    t00 = time()

    logger.debug('In calib_epix10ka_any')

    nda_raw = kwa.get('nda_raw', None)
    raw = det.raw(evt) if nda_raw is None else nda_raw # shape:(352, 384) or suppose to be later (<nsegs>, 352, 384) dtype:uint16
    if raw is None: return None

    t01 = time()

    cmp  = det.common_mode(evt) if cmpars is None else cmpars
    gain = det.gain(evt)      # - 4d gains  (7, <nsegs>, 352, 384)
    peds = det.pedestals(evt) # - 4d pedestals
    if gain is None: return None # gain = np.ones_like(peds)  # - 4d gains
    if peds is None: return None # peds = np.zeros_like(peds) # - 4d gains

    t02 = time()

    store = ue.dic_store.get(det.name, None)

    if store is None:
        logger.debug('create store for detector %s' % det.name)
        store = ue.dic_store[det.name] = ue.Storage()

        # do ONCE this initialization
        logger.debug(info_ndarr(raw,  '\n  raw ')\
                    +info_ndarr(gain, '\n  gain')\
                    +info_ndarr(peds, '\n  peds'))

        store.gfac = divide_protected(np.ones_like(gain), gain)
        store.arr1 = np.ones_like(raw, dtype=np.int8)

        logger.debug(info_ndarr(store.gfac,  '\n  gfac '))

        # 'FH','FM','FL','AHL-H','AML-M','AHL-L','AML-L'
        #store.gf4 = np.ones_like(raw, dtype=np.int32) * 0.25 # 0.3333 # M - perefierial
        #store.gf6 = np.ones_like(raw, dtype=np.int32) * 1    # L - center

    t03 = time()

    gfac = store.gfac

    gmaps = ue.gain_maps_epix10ka_any(det, raw)
    if gmaps is None: return None
    gr0, gr1, gr2, gr3, gr4, gr5, gr6 = gmaps

    factor = np.select(gmaps,\
                       (gfac[0,:], gfac[1,:], gfac[2,:], gfac[3,:],\
                        gfac[4,:], gfac[5,:], gfac[6,:]), default=1) # 2msec

    #==================== TEST RETURN MAP OF PIXEL GAIN MODES
    #return map_pixel_gain_mode1(gmaps)
    #====================

    pedest = np.select(gmaps,\
                       (peds[0,:], peds[1,:], peds[2,:], peds[3,:],\
                        peds[4,:], peds[5,:], peds[6,:]), default=0)

    t04 = time()

    store.counter += 1
    if not store.counter%100:
        logger.debug(ue.info_gain_mode_arrays1(gmaps)\
               +'\n'+ue.info_pixel_gain_mode_statistics1(gmaps))

    arrf = np.array(raw & ue.M14, dtype=np.float32) - pedest

    t05 = time()

    if store.mask is None:
       store.mask = det.mask_total(evt, **kwa)
    mask = store.mask

    t06 = time()

    logger.debug('common-mode correction pars cmp: %s' % str(cmp))

    if cmp is not None:
      mode, cormax = int(cmp[1]), cmp[2]
      npixmin = cmp[3] if len(cmp)>3 else 10
      if mode>0:

        t07 = t0_sec_cm = time()

        #t2_sec_cm = time()
        arr1 = store.arr1 # np.ones_like(mask, dtype=np.uint8)
        grhm = np.select((gr0,  gr1,  gr3,  gr4), (arr1, arr1, arr1, arr1), default=0)
        gmask = np.bitwise_and(grhm, mask) if mask is not None else grhm
        if gmask.ndim == 2: gmask.shape = (1,gmask.shape[-2],gmask.shape[-1])

        #logger.debug(info_ndarr(arr1, '\n  arr1'))
        #logger.debug(info_ndarr(grhm, 'XXXX grhm'))
        logger.debug(info_ndarr(gmask, 'gmask')\
                     + '\n  per panel statistics of cm-corrected pixels: %s'%
                     str(np.sum(gmask, axis=(1,2), dtype=np.uint32) if gmask is not None else None))
        #logger.debug('common-mode mask massaging (sec) = %.6f' % (time()-t2_sec_cm)) # 5msec

        t08 = time()

        #sh = (nsegs, 352, 384)
        hrows = 176 # int(352/2)
        for s in range(arrf.shape[0]):

          t09 = time()

          if mode & 4: # in banks: (352/2,384/8)=(176,48) pixels
            ue.common_mode_2d_hsplit_nbanks(arrf[s,:hrows,:], mask=gmask[s,:hrows,:], nbanks=8, cormax=cormax, npix_min=npixmin)
            ue.common_mode_2d_hsplit_nbanks(arrf[s,hrows:,:], mask=gmask[s,hrows:,:], nbanks=8, cormax=cormax, npix_min=npixmin)

          t10 = time()

          if mode & 1: # in rows per bank: 384/8 = 48 pixels # 190ms
            ue.common_mode_rows_hsplit_nbanks(arrf[s,], mask=gmask[s,], nbanks=8, cormax=cormax, npix_min=npixmin)

          t11 = time()

          if mode & 2: # in cols per bank: 352/2 = 176 pixels # 150ms
            ue.common_mode_cols(arrf[s,:hrows,:], mask=gmask[s,:hrows,:], cormax=cormax, npix_min=npixmin)
            ue.common_mode_cols(arrf[s,hrows:,:], mask=gmask[s,hrows:,:], cormax=cormax, npix_min=npixmin)

        logger.debug('TIME common-mode correction = %.6f sec for cmp=%s' % (time()-t0_sec_cm, str(cmp)))

        t12 = time()
        res = arrf * factor if mask is None else arrf * factor * mask # gain correction

    t07t13 = time()

    logger.debug('TOTAL consumed time (sec) = %.6f' % (t07t13-t00)\
                +info_ndarr(factor, '\n  calib_epix10ka factor')\
                +info_ndarr(pedest, '\n  calib_epix10ka pedest'))

    timesreturn =res, (t00, t01, t02, t03, t04, t05, t06, t07
, t08, t09, t10, returnt11, rest12, times

 t13)          

Timing points

  • t00:   at the entrance
  • t01:   det.raw
  • t02:   gain and pedestals - NEEDS TO BE CALLED ONCE, DO NOT NEED IN gain USE factor ONLY!!!
  • t03:  access access constants at store - 1-st event consumption
  • t04: factor and pedestals for gain ranges using np.select
  • t05: apply data-bit mask to raw and subtract pedestals
  • t06: access mask - SHOULD BE DONE ONCE
  • t07: apply begin common mode correction if on

List of commands

  • algorithm
  • t08: define mask for common mode
  • t09: beginning of the loop over panels for cm
  • t10: cmc in banks: (352/2,384/8)=(176,48) pixels
  • t11: cmc in rows per bank: 384/8 = 48 pixels 
  • t12: cmc  in cols per bank: 352/2 = 176 pixels
  • t13: apply gain and mask to output array

List of commands

Code Block
titleList of test commands
collapsetrue
> s3dflogin
Code Block
titleList of test commands
collapsetrue
> s3dflogin
> psana
srun --partition milano --account lcls:prjdat21 -n 1 --time=01:00:00 --exclusive --pty /bin/bash
...
[dubrovin@sdfmilan050:~/LCLS/con-py3]$


In other window
===============
> s3dflogin
ssh -Y sdfmilan050
cd LCLS/con-py3
source /sdf/group/lcls/ds/ana/sw/conda1/manage/bin/psconda.sh
source /sdf/group/lcls/ds/ana/sw/conda1/manage/bin/setup_testrel

mpirun -n  1 python Detector/examples/test-scaling-mpi-epix10ka2m.py 1
mpirun -n  1 python Detector/examples/test-scaling-mpi-epix10ka2m.py 1
OR:
mpirun -n  1 python Detector/examples/test-scaling-mpi-epix10ka2m.py 2
mpirun -n 80 python Detector/examples/test-scaling-mpi-epix10ka2m.py 2

...

per event time difference betwee points in msecbetwee points in msec

                           t01       t02       t03      t04         t05       t06       t07       t08     t09           t10      t11        t12        t13

1-core:                            t01       t02   1.000     t03      t04         t05       t06     t070.035   0.003  27.343   3.861   0.002   0.024   7.988 553.949   7.998  16.733  12.358   4.704

80-core: 1-core:               0.333 373   0.025 024   0.002  10 12.906 639   1.438 674   0.001 140.30480-core:             0.673   0.039   0.003  17.535   2.406   0.003 178.890017   4.744 384.576   4.154  11.336  10.108   2.100

References