FUNCTION xrt_rollangle, index, db_file=db_file

;+
; PROJECT:
;       Solar-B / XRT
;
; NAME:
;       XRT_ROLLANGLE
;
; CATEGORY:
;       Data calibration
;
; PURPOSE:
;       Calculate Roll Angle difference between XRT and SDO
;
; CALLING SEQUENCE:
;       roll_angle = xrt_rollangle(xrt_index)
;
; INPUTS:
;       XRT_INDEX  - [Mandatory] XRT index structure
;
; OUTPUTS:
;       ROLL_ANGLE - Difference of roll angle between XRT and SDO (in degree)
;
;
; EXAMPLES:
;
;   Correct Index Structure
;   IDL> roll_angle = xrt_rollangle(xrt_index)
;   IDL> xrt_index.crota1=roll_angle
;   IDL> xrt_index.crota2=roll_angle
;
;   Correct image (xrt_img0) for coalignment with SDO images
;   IDL> xrt_img = rot(xrt_img0,-roll_angle)
;
; MODIFICATION HISTORY:
;
progver = 'v2014.09.??' ;--- (KY) Written.
progver = 'v2022.02.04' ;--- (KY) Modified for R.A. anomaly in 2021/12/27
progver = 'v2022.09.06' ;--- (KY) read from database "xrt_rollangle.geny"
;-

sz0=size(index)
if sz0(sz0(0)+1) eq 8 then tt=anytim(index.date_obs) $
                    else tt=index

nn=n_elements(index)
roll_ang0=fltarr(nn)

time1=anytim('10-mar-12')
time2=anytim(' 8-jun-12')
time3=anytim('21-jan-13')
;
;; for R.A. anomaly in 2021/12/27
time4=anytim('2021/12/27 13:00')
time5=anytim('2021/12/27 13:28')
time6=anytim('2021/12/27 14:40')
time7=anytim('2021/12/27 15:10')


; Case-1 (tt < time1)
tmp_ss=where(tt le time1,tmp_nn)
if tmp_nn ne 0 then roll_ang0(tmp_ss)= $
         0.314067+0.0850355*sin(1.99892e-07*tt(tmp_ss)+3.45231)
; Case-2 (time1 < tt < time2 or time3 < tt < time4)
tmp_ss=where((tt gt time1 and tt lt time2) or $
           (tt gt time3 and tt le time4),tmp_nn)
if tmp_nn ne 0 then roll_ang0(tmp_ss)= $
         0.314457-0.0712843*sin(1.99474e-07*tt(tmp_ss)+0.445648)
; Case-3 (time2 < tt < time3)
tmp_ss=where(tt gt time2 and tt le time3,tmp_nn)
if tmp_nn ne 0 then roll_ang0(tmp_ss)= $
         0.314457-0.0712843*sin(1.99474e-07*tt(tmp_ss)+0.445648) + $
         0.00833730+0.0472532*sin(7.27225e-05*tt(tmp_ss)+0.661514)

; Case-4 (time4 < tt < time5)
;  # use quadratic curve for smoother connection at time4 and time5
tmp_ss=where(tt gt time4 and tt le time5,tmp_nn)
if tmp_nn ne 0 then roll_ang0(tmp_ss)= $
   5.2946095e-07*(tt(tmp_ss)-time4)^2. $
  +0.0038027661*(tt(tmp_ss)-time4) +0.26089384
; Case-5 (time5 < tt < time6)
tmp_ss=where(tt gt time5 and tt le time6,tmp_nn)
if tmp_nn ne 0 then roll_ang0(tmp_ss)= $
   0.0015707323*(tt(tmp_ss)-time4) +5.6717680
; Case-6 (time6 < tt < time7)
tmp_ss=where(tt gt time6 and tt le time7,tmp_nn)
if tmp_nn ne 0 then roll_ang0(tmp_ss)= $
   0.0062752709*(tt(tmp_ss)-time4) -22.536388

; Case-7 ( tt > time7) ; read DB
tmp_ss=where(tt gt time7,tmp_nn)
if tmp_nn ne 0 then begin
if not keyword_set(db_file) then begin
 ps = path_sep()
 db_file=getenv('SSWDB')+ps+'hinode'+ps+'xrt'+ps+ $
                 'xrt_msu_coalign'+ps+'xrt_rollangle_db.geny'
endif
restgenx, a_times, ang_val, file=db_file

roll_ang0(tmp_ss)=interpol(ang_val,a_times,tt(tmp_ss))
endif

if nn eq 1 then roll_ang0=roll_ang0(0)

return,-roll_ang0

END
