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