Commit 3921c5a8 authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

working version of q mask issue #18

usage:
  set a q-vector mask
	mask q set [qx <val>]  [qy <val>]  [qz <val>]  [dqx <val>]  [dqy <val>]  [dqz <val>]  [run <irun>]
  clear q-vector mask
	mask q clear [run <irun>]
  shows the mask
	mask q

example
	mask q set run 1234 qy 0.065/A dqy 0.005/A
parent bb6e678d
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -1484,7 +1484,7 @@ CONTAINS
  !!       use: mask pix ring 8 8 0 4 val -1
  !!
  !! mask tau
  !!     - show tau mask (equivalent to 'dir details')
  !!     - shows tau mask (equivalent to 'dir details')
  !! mask tau [set|clear] <itau> [run <numor>]
  !!     - mask <itau> tau in a given run
  !!       if clear is given, the tau is "restored"
@@ -1502,8 +1502,8 @@ CONTAINS
    integer :: ival, itau, irun
    integer :: inew, i
    real(kind=SGL), dimension(4) :: xmask   ! pixel mask limits
    real(kind=DBL), dimension(6) :: qmask  ! q-vector mask qx,  qy,  qz
    real(kind=DBL), dimension(3) :: dqmask ! q-vector mask dqx, dqy,dqz
    real(kind=DBL), dimension(3) :: qmask
    real(kind=DBL), dimension(3) :: dqmask
    !
    !do_pix  = .false.
    !do_tau  = .false.
@@ -1516,6 +1516,8 @@ CONTAINS
    itau    = 0
    irun    = int(program_param%last_run)
    xmask   = 0
    qmask   = 0
    dqmask  = HUGE(1d0)

    iwhat = parse_command_flags('pix,tau,q')
    if (iwhat<0) then               ! error both are present
@@ -1593,10 +1595,9 @@ CONTAINS
                call mask_tau_clear(data_scan(i), itau)
            enddo
        else
            do i=1, data_manager_size()
                if ( .not. is_valid_scan(data_scan(i)) ) cycle
                call mask_tau_list(data_scan(i), i)
            enddo
            ! list
            call push_cmd_line("dir details")
            return
        end if
    !! -------------------------------------------------------------------------
    !! process q vector mask
@@ -1613,14 +1614,15 @@ CONTAINS
            call msg_warning("drspine/mask", 'mask - set and clear are mutually exclusive')
            exit case_what
        end if
        irun = get_named_value('run', irun, inew)

        if (do_set) then
            qmask(1)  = rparf(1)
            dqmask(1) = rparf(2)
            qmask(2)  = rparf(3)
            dqmask(2) = rparf(4)
            qmask(3)  = rparf(5)
            dqmask(3) = rparf(6)
            qmask(1)  = get_named_value('qx',  qmask(1),  inew)
            qmask(2)  = get_named_value('qy',  qmask(2),  inew)
            qmask(3)  = get_named_value('qz',  qmask(3),  inew)
            dqmask(1) = get_named_value('dqx', dqmask(1), inew)
            dqmask(2) = get_named_value('dqy', dqmask(2), inew)
            dqmask(3) = get_named_value('dqz', dqmask(3), inew)
            do i=1, data_manager_size()
                if ( .not. is_valid_scan(data_scan(i)) ) cycle
                if ( data_scan(i)%id /= irun ) cycle
@@ -1635,6 +1637,7 @@ CONTAINS
        else
            do i=1, data_manager_size()
                if ( .not. is_valid_scan(data_scan(i)) ) cycle
                if ( data_scan(i)%id /= irun ) cycle
                call mask_qvec_list(data_scan(i))
            enddo
        end if
+43 −25
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ module reduce_data
  public :: direct_bgr_subtraction
  public :: collect_stats
  !
  public :: mask_tau_set,  mask_tau_clear,  mask_tau_list
  public :: mask_tau_set,  mask_tau_clear
  public :: mask_qvec_set, mask_qvec_clear, mask_qvec_list

contains
@@ -666,20 +666,6 @@ bgr_pixel_bin(l)
    end associate
  end subroutine mask_tau_clear

  subroutine mask_tau_list(data_scan, id)
    type(scan_struct), intent(in) :: data_scan
    integer, intent(in) :: id
    write(output_unit,'(i3,":",i8,1x,a,"(",i3,") |",a,"| mode=",a9," role=",a10)')   &
    id,&
    data_scan%id, &
    data_scan%file(1:12), &
    data_scan%number_of_points, &
    data_scan%name(1:12), &
    cformat_mode(data_scan%mode), &
    cformat_role(data_scan%role)
    call print_details(data_scan, output_unit)
  end subroutine mask_tau_list

  subroutine mask_qvec_set(data_scan, qmask, dqmask)
    type(scan_struct), intent(inout) :: data_scan
    real(kind=DBL), dimension(3), intent(in) :: qmask
@@ -687,14 +673,22 @@ bgr_pixel_bin(l)
    !
    real(kind=DBL), dimension(3) :: dq
    integer :: iscan, it, ix, iy

    call msg_debug("mask_qvec_set", '==> qmask: '//&
                                   trim(msg_fmt('("run=",i0)',data_scan%id))//' '//&
                                   trim(msg_fmt('(" q=(",3(g12.6,1x),")")',qmask*ANGSTROEM))//' '//&
                                   trim(msg_fmt('("dq=(",3(g12.6,1x),")")',dqmask*ANGSTROEM)))
    do iscan=1, data_scan%number_of_points
       associate(scan_point => data_scan%scan_point(iscan))
       !FIXME: do we need it=1,.. or it=0,... (paz)
       do it=1, scan_point%no_lam
          do ix=1, scan_point%no_xpix
             do iy=1, scan_point%no_ypix
                dq = ABS(scan_point%pixelbin(it, ix, iy)%Q_vec - qmask)
                if ( ANY( dq .gt. dqmask) ) &
                if ( ANY(dq > dqmask) ) then
                    scan_point%pixelbin(it, ix, iy)%status = IOR(scan_point%pixelbin(it, ix, iy)%status, PIXEL_MASKED_Q)
                    !write(*,*) data_scan%id, it,ix,iy, dq, dqmask
                end if
             end do
          end do
       end do
@@ -713,20 +707,44 @@ bgr_pixel_bin(l)
    end do
  end subroutine mask_qvec_clear

  subroutine print_detector_qmask(this, it, outunit)
    type(scan_data_struct), intent(in) :: this
    integer, intent(in) :: it
    integer, intent(in), optional :: outunit
    !
    integer :: i,j
    integer :: iunit
    !
    iunit   = output_unit
    if (present(outunit)) iunit = outunit
    write(iunit, '(1x,a,2i3)') 'detector pixels:   ', this%no_xpix, this%no_ypix
    write(iunit,'(5x)', advance='no')
    do i=1, this%no_xpix
       write(iunit,'(i2)', advance='no') i
    end do
    write(iunit,*)
    do j=1, this%no_ypix
       write(iunit, '(1x,i3,1x)', advance='no') j
       do i=1, this%no_xpix
          if (IAND(this%pixelbin(it, i, j)%status, PIXEL_MASKED_Q) /= 0 ) then
             write(iunit,'(a2)', advance='no') 'XX'
          else
             write(iunit,'(a2)', advance='no') '--'
          end if
       end do
       write(iunit,*)
    end do
  end subroutine print_detector_qmask

  subroutine mask_qvec_list(data_scan)
    type(scan_struct), intent(inout) :: data_scan
    !
    integer :: iscan, it, ix, iy
    do iscan=1, data_scan%number_of_points
    integer :: iscan, it
    do iscan=1, min(data_scan%number_of_points,1)
       associate(scan_point => data_scan%scan_point(iscan))
       do it=1, scan_point%no_lam
          do ix=1, scan_point%no_xpix
             do iy=1, scan_point%no_ypix
                if (IAND(scan_point%pixelbin(it, ix, iy)%status, PIXEL_MASKED_Q) /= 0 ) then
                    print *, data_scan%id, iscan, it, ix, iy, 'is masked'
                end if
             end do
          end do
        write (*,*) data_scan%id, iscan, it
        call print_detector_qmask(scan_point, it)
       end do
       end associate
    end do