
  do i=1,nobs
     dtime=data(itime,i)

     call dtime_check(dtime, in_curbin, in_anybin)
     if(.not.in_anybin) cycle

     if(in_curbin) then
        dlat=data(ilat,i)
        dlon=data(ilon,i)
        dtime=data(itime,i)
!   ajl fix 12/28/2015 wrong position for if
!        if(i<100)then
          do k=1,nlevscatwt
            scatwt(k)=data(17+k,i)
!            write(500+mype,*)'psca',k,presscatwt(k),' wt ',scatwt(k)
          end do
!        endif
 
!       ajl add for omi apriori
        if(cmaq_regional)then
!         use obs ptrop for now
          ptropobs=data(itroppres,i)
          latob=data(ilate,i)
          lonob=data(ilone,i)
!         need to integrate scatter weight * delta pressure * mixing rato
!         and adjust for tropospheric air mass factor
!         need to get temperature from tv and q t=tv/(1+fv*q) to calculate alpha
          sumdp=0.0
          sumdpscatwt=0.0
          if(no2scatterweight)then
!           need to put no2dp and temperature on omi NO2 layers
!            write(6,*)'do no2 scatter weight omi way'
!            call flush(6)
            call tintrp2a1(ges_prsi,prsitmp,dlat,dlon,dtime,hrdifsig,&
                     nsig+1,mype,nfldsig)
            call tintrp2a1(ges_prsl,prstmp,dlat,dlon,dtime,hrdifsig,&
                     nsig,mype,nfldsig)
            call tintrp2a1(ges_tsen,ttmp,dlat,dlon,dtime,hrdifsig, nsig,mype,nfldsig)
!            write(500+mype,*)'get_prsl',maxval(ges_prsl),minval(ges_prsl)
!            do k=1,nsig+1
!              write(500+mype,*)'prsitmp',prsitmp(k)
!            end do
!            do k=1,nsig
!              write(500+mype,*)'prstmp',k,prstmp(k),' T ',ttmp(k)
!            end do
            do k=1,nlevscatwt
!             find kbot and ktop
              if(pintscatwtcb(k-1)>=prsitmp(1).and.pintscatwtcb(k)<prsitmp(1))then
                kbot=k
              endif
              if(pintscatwt(k-1)>=ptropobs.and.pintscatwt(k)<ptropobs)then
                ktop=k
              endif
              
!              write(6,*)k,'press',presscatwt(k),pintscatwt(k)
            end do
!            write(500+mype,*)'ktop',ktop,'ptropobs',ptropobs,'pintscatwt',pintscatwt(KTOP-1:KTOP)
!            write(500+mype,*)'kbot',kbot,pintscatwtcb(kbot-1:kbot)
!           ajl try calculating tmphatsw instead to compare with other way
            botks=1
            dptmpsw=0.0
            dpsumsw=0.0
            do ks=kbot,ktop
              ptopscat=max(ptropobs/r10,pintscatwtcb(ks))
              sumdplay=0.0
!              sumdpscatwtlay=0.0
DOK:          do k=botks,nsig-1
!                write(500+mype,*)'prsitmp k',k,prsitmp(k),'pintsw ks-1 ',ks-1,pintscatwtcb(ks-1)
                if(prsitmp(k+1) > pintscatwtcb(ks-1)) cycle DOK
                if(prsitmp(k) < ptopscat) exit DOK
                if(prsitmp(k) >= pintscatwtcb(ks-1))then
!                 case D or B bottom of layer below the scatter weight bottom
                  if(prsitmp(k+1) <= ptopscat)then
!                   case D top of k layer above scatter weight top
!                   whole scatter weight layer within k layer  
                    dpaddsw=pintscatwtcb(ks-1)-ptopscat
!                    sumdpscatwt=sumdpscatwt+dpaddsw*scatwt(ks)
!                    write(500+mype,*)'case d dpaddsw ',dpaddsw,'ttmp',k,ttmp(k)
!                    write(500+mype,*)'pintscatwtcb',ks-1,pintscatwtcb(ks-1:ks)
!                    write(500+mype,*)'dpscat',pintscatwtcb(ks-1)-pintscatwtcb(ks)
!                    write(500+mype,*)'prsitmp',k,prsitmp(k:k+1)
                    dpsumsw(ks)=dpsumsw(ks)+dpaddsw
                    dptmpsw(ks)=dptmpsw(ks)+dpaddsw*ttmp(k)
                    botks=k
!                    exit DOK
                  else
!                   case B top of k layer below scatter weight top
!                   top of k layer within scatter weight layer
                    dpaddsw=pintscatwtcb(ks-1)-prsitmp(k+1)
                    dpsumsw(ks)=dpsumsw(ks)+dpaddsw
                    dptmpsw(ks)=dptmpsw(ks)+dpaddsw*ttmp(k)
!                    sumdpscatwt=sumdpscatwt+dpaddsw*scatwt(ks)
                    sumdplay=sumdplay+dpaddsw
!                    write(500+mype,*)'case b dpaddsw ',dpaddsw,'ttmp',k,ttmp(k)
!                    write(500+mype,*)'pintscatwtcb',ks-1,pintscatwtcb(ks-1:ks)
!                    write(500+mype,*)'dpscat',pintscatwtcb(ks-1)-pintscatwtcb(ks)
!                    write(500+mype,*)'prsitmp',k,prsitmp(k:k+1)
                  endif
                else
!                 case A or C bottom of layer above the scatter weight bottom
!                   write(500+mype,*)'prsitmp k+1 ',k+1,prsitmp(k+1),'pintsw ks ',ks,pintscatwtcb(ks)
                  if(prsitmp(k+1) <= ptopscat) then
!                   case A top of k layer above scatter weight top
!                   bottom of k layer withing scatter weight layer
                    dpaddsw=prsitmp(k)-ptopscat
                    dpsumsw(ks)=dpsumsw(ks)+dpaddsw
                    dptmpsw(ks)=dptmpsw(ks)+dpaddsw*ttmp(k)
!                    sumdpscatwt=sumdpscatwt+dpaddsw*scatwt(ks)
                    sumdplay=sumdplay+dpaddsw
                    botks=k
!                    write(500+mype,*)'case A dpaddsw ',dpaddsw,'ttmp',k,ttmp(k)
!                    !write(500+mype,*)'pintscatwtcb',ks-1,pintscatwtcb(ks-1:ks)
!                    write(500+mype,*)'dpscat',pintscatwtcb(ks-1)-pintscatwtcb(ks)
!                    write(500+mype,*)'prsitmp',k,prsitmp(k:k+1)
!                    exit DOK
                  else
!                   case C top of k layer below scatter weight top whole layer
!                   within scatterweight layer
                    dpaddsw=prsitmp(k)-prsitmp(k+1)
                    dpsumsw(ks)=dpsumsw(ks)+dpaddsw
                    dptmpsw(ks)=dptmpsw(ks)+dpaddsw*ttmp(k)
!                    sumdpscatwt=sumdpscatwt+dpaddsw*scatwt(ks)
                    sumdplay=sumdplay+dpaddsw
!                    write(500+mype,*)'case c dpaddsw ',dpaddsw,'ttmp',k,ttmp(k)
!                    write(500+mype,*)'pintscatwtcb',ks-1,pintscatwtcb(ks-1:ks)
!                    write(500+mype,*)'dpscat',pintscatwtcb(ks-1)-pintscatwtcb(ks)
!                    write(500+mype,*)'prsitmp',k,prsitmp(k:k+1)
                  endif
                endif
              end do DOK
              sumdp=sumdp+sumdplay
              tmphatsw(ks)=dptmpsw(ks)/dpsumsw(ks)
              alphasw(ks)=1.-.003*(tmphatsw(ks)-220.)
              sumdpscatwt=sumdpscatwt+sumdplay*scatwt(ks)*alphasw(ks)
              if(dpsumsw(ks)>pintscatwtcb(ks-1)-ptopscat)then
              write(500+mype,*)'ERROR dpsumws',ks,dpsumsw(ks),pintscatwtcb(ks-1)-pintscatwtcb(ks)
              write(500+mype,*)'tmphatsw',ks,tmphatsw(ks)
              endif
            end do
            
!            write(500+mype,*)'kbot',kbot,'ktop',ktop,pintscatwt(ktop-1:ktop),'ptropobs',ptropobs
!            write(500+mype,*)'kbot',pintscatwt(kbot-1:kbot),'prsitmp1',prsitmp(1)
            nlno2_omi=ktop-kbot+1
            ntrop=nlno2_omi
            psi=one/prsitmp(1)
            no2p_omi(1)=prsitmp(1)
            no2p_omi(nlno2_omi+1)=ptropobs/r10
            do nz=2,nlno2_omi
!              write(500+mype,*)'nz',nz,'pintscatwtcb',pintscatwtcb(nz)
              if (pintscatwtcb(kbot+nz-2)*psi < one )then
                no2p_omi(nz)=pintscatwtcb(kbot+nz-2)
!                write(500+mype,*)'no2p',nz,no2p_omi(nz)
              else
                no2p_omi(nz)=prsitmp(1)
!                write(500+mype,*)'no2b bot ',nz,prsitmp(1),'p',pintscatwtcb(nz)
             
              endif
              call grdcrd1(no2p_omi(nz),prsitmp,nsig+1,-1)
            end do
            no2p_omi_mid(1)=1.
            no2p_omi_mid(nlno2_omi)=.5*(pintscatwt(ktop-1)+ptropobs)/r10
!            write(500+mype,*)ktop,'presscattop',pintscatwt(ktop-1),'ptropobs',ptropobs
            do nz=2,nlno2_omi-1
!              write(6,*)'presscatwt',kbot+nz-1,presscatwt(kbot+nz-1)
              no2p_omi_mid(nz)=presscatwt(kbot+nz-1)/r10
              call grdcrd1(no2p_omi_mid(nz),prstmp,nsig,-1)
            end do
            call grdcrd1(no2p_omi_mid(nlno2_omi),prstmp,nsig,-1)
!             write(500+mype,*)' i  ',i
!            call flush(500+mype)
            do k=1,nlno2_omi
!              write(500+mype,*)'ges_tsen',maxval(ges_tsen),minval(ges_tsen)
!              write(500+mype,*)'no2p',k,no2p_omi_mid(k),dlon,dlat,no2p_omi_mid(k),dtime,hrdifsig
              call flush(500+mype)
              call tintrp31(ges_tsen,ttmpsw(k),dlat,dlon,no2p_omi_mid(k),dtime,hrdifsig,mype,1)
!              write(500+mype,*)'ttmpsw',k,ttmpsw(k),'dz',no2p_omi_mid(k)
!              write(500+mype,*)'tmphatsw',kbot+k-1,tmphatsw(kbot+k-1),k,ttmpsw(k)
!              alphasw(nlno2_omi-k+1)=1.-.003*(ttmpsw(k)-220.)
              alphasw(nlno2_omi-k+1)=1.-.003*(tmphatsw(kbot+k-1)-220.)
!              write(500+mype,*)k,'ttmp',ttmpsw(k),'no2p',no2p_omi_mid(k),'alphasw',alphasw(nlno2_omi-k+1)
                
            enddo
            call grdcrd1(no2p_omi(nlno2_omi+1),prsitmp,nsig+1,-1)
            call grdcrd1(no2p_omi(1),prsitmp,nsig+1,-1)
!            do nz=1,nlno2_omi+1
!              write(500+mype,*)'no2p_omi',nz,no2p_omi(nz)
!            end do
!            call flush(500+mype)
            nlayers=nlno2_omi+1
            do k=1,nlayers
              no2p_omi_flip(k)=no2p_omi(nlayers-k+1)
            end do
            call intrp3no21sw(ges_no2,no2ges1,dlat,dlon,no2p_omi_flip,dtime,nlayers,mype)
!           note 1 is top no2 layer including ptrop
!           note 1 is now the top ktop and nlno2_omi is bottom kbot
!            call flush(500+mype)
            no2ges=0.0
            sumdpno2=0.0
            do k=1,nlayers-1
!             need to fold alpha into scatwt
!              write(500+mype,*)'no2ges',k,no2ges(1),'no2ges1',no2ges1(k),'alpha',alphasw(k),'scatwt',scatwt(ktop-k+1)
              scatwt(ktop-k+1)=alphasw(k)*scatwt(ktop-k+1)
!              write(500+mype,*)'satwtnew ',k,scatwt(ktop-k+1),' no2ges1 ',no2ges1(k)
              no2ges(1)=no2ges(1)+no2ges1(k)*scatwt(ktop-k+1)
              sumdpno2=sumdpno2+no2ges1(k)
            end do
!            do k=1,nlno2_omi
!              write(500+mype,*)k,'no2ges1',no2ges1(k),' sc ',scatwt(ktop-k+1),' alp ',alphasw(k),presscatwt(ktop-k+1)
!            end do
!           want to put dpno2 on scatwt layers and also temperature
!            call stop2(888)
          else
            nlayers=1
            call tintrp2a1(ges_tsen,ttmp,dlat,dlon,dtime,hrdifsig, nsig,mype,nfldsig)

            call tintrp2a1(ges_prsi,prsitmp,dlat,dlon,dtime,hrdifsig,&
                     nsig+1,mype,nfldsig)
            call intrp3no2dp1(ges_no2,dpno2,rno2conuse,dlat,dlon,dtime,mype)
!           this should return minidobson
!            if(i<10)then
!              write(6,*)mype,'dpno2',dpno2,'maxval',maxval(ges_no2)
            !endif
!            call raqmsno2col(dpno2,no2ges(1),mype,ptropobs,prsitmp,scatwt,data(iamftrop,i),nsig,ntrop,scatwtmodel)
!           ajl 3/23/2017 need to move alpha inside of raqmsno2col
!           ajl now calculate alpha at model layers
            do k=1,nsig
              alpha(k)=1.-.003*(ttmp(k)-220.)
!               write(500+mype,*)k,'ttmp',ttmp(k),' alpha ',alpha(k)
!              if(i<10)then
                !write(6,*)mype,'scatwtmodel ',k,scatwtmodel(k),'alpha',alpha(k),'temp',ttmp(k),'ntrop',ntrop,ptropobs
!                call flush(6)
!              endif
!              write(500+mype,*)'scatwtmodel bef ',scatwtmodel(k),' alpha ',alpha(k)
!              write(500+mype,*)'after scat',k,scatwtmodel(k)


            end do
            call raqmsno2col(dpno2,no2ges(1),mype,ptropobs,prsitmp,scatwt,nsig,ntrop,alpha,scatwtmodel)
            do k=1,ntrop
              dpaddsw=prsitmp(k)-prsitmp(k+1)
              sumdpscatwt=sumdpscatwt+dpaddsw*scatwtmodel(k)
              sumdp=sumdp+dpaddsw
            end do
!            if(scatwtmodel(16)>2.)then
              !write(600+mype,*)'i',i,'lon',lonob,latob,'dtime',dtime
!              call flush(600+mype)
!            endif
!            write(6,*)mype,'dpno2',dpno2,'ptropobs',ptropobs,'ntrop',ntrop
!            call flush(6)
!            if(i<10)then
!              write(6,*)mype,'prsitmp',prsitmp
!              write(6,*)mype,'ptropobs',ptropobs
!              write(6,*)'no2ges',no2ges(1)
!              call flush(6)
!            endif
          endif
        else if(raqms)then
!         need to integrate scatter weight * delta pressure * mixing rato
!         and adjust for tropospheric air mass factor
          call tintrp2a1(ges_prsi,prsitmp,dlat,dlon,dtime,hrdifsig,&
                   nsig+1,mype,nfldsig)
          call intrp3no2dp1(ges_no2,dpno2,rno2conuse,dlat,dlon,dtime,mype)
!          if(i<10)then
!            write(6,*)mype,'dpno2',dpno2,'maxval',maxval(ges_no2)
!          endif
!         this should return minidobson
!          dpno2=dpno2*rno2con ! make minidobson
!          if(i<10)then
           
!           write(500+mype,*)'dpno2',dpno2
!           write(500+mype,*)'prsitmp',prsitmp,'call raqmsno2col'
!          endif
              call intrp2a11(raqmsptrop,ptropobs,dlat,dlon,mype)
          latob=data(ilate,i)
          lonob=data(ilone,i)
!          call raqmsno2col(dpno2,no2ges(1),mype,ptropobs,prsitmp,scatwt,data(iamftrop,i),nsig,ntrop,scatwtmodel)
          call raqmsno2col(dpno2,no2ges(1),mype,ptropobs,prsitmp,scatwt,,nsig,ntrop,scatwtmodel)
!          if(i<10)then
!            write(6,*)mype,'prsitmp',prsitmp
!            write(6,*)mype,'ptropobs',ptropobs
!          endif
        else

          call intrp3no21(ges_no2,no2ges,dlat,dlon,ozp,dtime,&
             nlevs,mype)
        endif

        if(no2_diagsave .and. luse(i))then
           ii=ii+1
           idiagbuf(1,ii)=mype                  ! mpi task number
           diagbuf(1,ii) = data(ilate,i)        ! lat (degree)
           diagbuf(2,ii) = data(ilone,i)        ! lon (degree)
           diagbuf(3,ii) = data(itime,i)-time_offset ! time (hours relative to analysis)
        endif

!       Interpolate interface pressure to obs location
!       Calculate innovations, perform gross checks, and accumualte
!       numbers for statistics
!  if(mype.eq.0)write(6,*)'omi no2ges',no2ges,'nlev',nlev,'nlevs',nlevs
!  if(mype.eq.0)write(6,*)'dpno2',dpno2
!  if(mype.eq.0)write(6,*)'dp',dp
!  if(mype.eq.0)write(6,*)'sfcp',sfcp

!       For OMI/GOME, nlev=1 
        do k=1,nlev
           j=ipos(k)
           ioff=nreal+k

!          Compute innovation and load obs error into local array
!           no2obs = data(ioff,i)*1000. ! make minidobson
!          try no2trop instead
           no2obs=data(ino2trop,i)*1000.
!           no2_inv(k) = no2obs-no2ges(k)
!          ajl 3/15/2017 now switch to slant column being the variable instead
!          of vertical column
           no2_inv(k) = no2obs*data(iamftrop,i)-no2ges(k)
!           if(first)then
!           write(50+mype,*)i,no2_inv(k),no2ges(k)
!           endif
!           write(500+mype,*)i,'no2_inv',no2_inv(k),'no2ges',no2ges(k),'obs',no2obs*data(iamftrop,i)
          if(no2scatterweight)then
            write(500+mype,*)'amf',data(iamftrop,i),sumdpscatwt/sumdp
            write(500+mype,*)'sumdpno2',sumdpno2,'no2ges',no2ges(k),'amf',no2ges(k)/sumdpno2
          else
            write(500+mype,*)'amf',data(iamftrop,i),sumdpscatwt/sumdp
          endif
          write(500+mype,*)'sumdp ',sumdp,' sumdpscatwt ',sumdpscatwt,' no2ges ',k,no2ges(k)
           go to 777
