	pro f_a_f_switch_block,Fileformat,Block,attr,I_EW,I_SN

; Reading data from a block of the initial file

	IF equiv(Fileformat, ['aor','0']) or equiv(Fileformat, ['aor','-1']) $
		THEN BEGIN
I_EW=	[[total((Block.Set32.I)(0:47,*),1)],	$
	[total((Block.Set32.I)(48:95,*),1)],	$
	[total((Block.Set32.I)(96:143,*),1)],	$
	[total((Block.Set32.I)(144:*,*),1)]]/48.
attr=Block.set32.attr
		ENDIF ELSE IF equiv(Fileformat, ['aor','1']) THEN BEGIN

I_EW=	[[total((Block.Set32.LEW)(0:47,*),1)],	$
	[total((Block.Set32.LEW)(48:95,*),1)],	$
	[total((Block.Set32.LEW)(96:143,*),1)],	$
	[total((Block.Set32.LEW)(144:*,*),1)]]/48.

I_SN=	[[total((Block.Set32.LSN)(0:47,*),1)],	$
	[total((Block.Set32.LSN)(48:95,*),1)],	$
	[total((Block.Set32.LSN)(96:143,*),1)],	$
	[total((Block.Set32.LSN)(144:*,*),1)]]/48.


attr=[[Block.set32.AttrEW],[Block.set32.AttrSN]]

		ENDIF ELSE IF Fileformat(0) eq 'fdas' THEN BEGIN

attr=Block.Descriptor_R

	CASE !version.OS OF

'windows':

'Win32':

ELSE:		byteorder, Block, /sswap

	ENDCASE


I_EW= -[[total((Block.Right)(0:44))],	$
	[total((Block.Right)(45:89))],	$
	[total((Block.Right)(90:134))],	$
	[total((Block.Right)(135:*))]]/45.

		ENDIF
	end



	function get_switch_points,X,sigma=sigma

;	Searches for switch points by calculating derivative

if n_elements(sigma) le 0 then sigma=3.

I_der=deriv(X)
Std=stdev(I_der)
Abs_I_der=abs(I_der)
I_der1=I_der(where(Abs_I_der lt sigma*Std))
Std=stdev(I_der1)

	return,where(Abs_I_der gt sigma*Std)

end


pro f_a_find_switch,FileName=FileName, Iew=Iew, ISN=ISN, attr=attr, $
	date=date,Points_EW=Points_EW,Points_SN=Points_SN, $
	print_info=print_info, sigma=sigma

;	Searches switching points in a whole file and calculates total
;	among partial bands

common file_align_Exch,Data,Array0,Array1,Array2,	$
	xx,yy,xxx,yyy,current_state,Sc,Sw_Points


if n_elements(sigma) le 0 then sigma=3.
if n_elements(Filename) le 0 then  $
	Filename=pickfile(path=getenv('spk_dat'),/read)

WIDGET_CONTROL,/hourglass

	openr,LUN,FileName,/get_lun

Block=SSRT_file_struc(LUN,Fileformat=Fileformat, $
   Offset=Offset, Dt=Dt, Date=Date, Length=Length)


	IF Fileformat(0) eq 'fdas' THEN Block_length=1L else Block_length=32L

N_block0=0L   	  &      N_blocks=Length/Block_length

Blockset=assoc(LUN,Block,Offset)  &  attr_in=0B

IEW=intarr(Length,4)


	IF equiv(Fileformat, ['aor','1']) THEN BEGIN
ISN=IEW
attr=bytarr(2,Length)
	ENDIF ELSE attr=bytarr(Length)

widget_control,Data.Info_Label,/hour,set_val='Reading the file...'


		FOR  j=0L,N_blocks-1 DO BEGIN

f_a_f_switch_block,Fileformat,Blockset(j), attr_in,I_EW,I_SN

j0=j*Block_length	&	j1=j0+Block_length-1

IEW(j0:j1,*)=I_EW

	IF equiv(Fileformat, ['aor','1']) THEN BEGIN
ISN(j0:j1,*)=I_SN
attr(*,j0:j1)=attr_in
	ENDIF ELSE attr(j0:j1)=attr_in

Flag=((Block_length eq 32) or ((Block_length eq 1) and ((j mod 32) eq 0)))

if Flag then WIDGET_CONTROL, Data.slider0,set_val=j*Block_length+Block_length-1

		ENDFOR

free_lun,LUN

widget_control,Data.Info_Label,/hour,set_val='Analyzing the record...'

Points_EW_0=get_switch_points(IEW(*,0),sigma=sigma)
Points_EW_1=get_switch_points(IEW(*,1),sigma=sigma)
Points_EW_2=get_switch_points(IEW(*,2),sigma=sigma)
Points_EW_3=get_switch_points(IEW(*,3),sigma=sigma)

Points_EW=find_equal(Points_EW_0,Points_EW_1,Points_EW_2,Points_EW_3)

Index=Points_EW
Abs_I_der=abs(deriv(total(IEW,2)))



		IF Index(0) ge 0 THEN BEGIN
split_array,Index,Number=Number,first_subscript=F_s,last_subscript=L_s

Points_EW=lonarr(Number)

	FOR j=0,Number-1 DO BEGIN
amax=max(Abs_I_der(F_s(j):L_s(j)),imax)
Points_EW(j)=F_s(j)+imax
	ENDFOR

		ENDIF ELSE Points_EW=-1

IF equiv(Fileformat, ['aor','1']) THEN BEGIN

Points_SN_0=get_switch_points(ISN(*,0),sigma=sigma)
Points_SN_1=get_switch_points(ISN(*,1),sigma=sigma)
Points_SN_2=get_switch_points(ISN(*,2),sigma=sigma)
Points_SN_3=get_switch_points(ISN(*,3),sigma=sigma)

Points_SN=find_equal(Points_SN_0,Points_SN_1,Points_SN_2,Points_SN_3)

Index=Points_SN
Abs_I_der=abs(deriv(total(ISN,2)))

		IF Index(0) ge 0 THEN BEGIN
split_array,Index,Number=Number,first_subscript=F_s,last_subscript=L_s

Points_SN=lonarr(Number)

	FOR j=0,Number-1 DO BEGIN
amax=max(Abs_I_der(F_s(j):L_s(j)),imax)
Points_SN(j)=F_s(j)+imax
	ENDFOR

		ENDIF ELSE Points_SN=-1

ENDIF

WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)


end


	pro f_a_file_prepare,index,top,	$
	Offset_I,header_I,Offset_V,header_V,comments,type, cancel

;	Opens output files and writes their headers

common file_align_Exch,Data,Array0,Array1,Array2,	$
	xx,yy,xxx,yyy,current_state,Sc,Sw_Points

WIDGET_CONTROL,/hour

cancel=0


Name=name_extract(Data.Fname)
path=subdir(Data.Fname)
model=strmid(Name(1),Name(4)-6,6)

	CASE !version.OS OF

'windows':	Delim='\'

'Win32':	Delim='\'

ELSE:		Delim='/'

	ENDCASE

	if Data.Stokes(0) or Data.Stokes(1) then begin
Data.Interf=(Interferometer='E-W')
filter_I='*.awi'
filter_V='.awv'
	endif else begin
Data.Interf=(Interferometer='S-N')
filter_I='*.ani'
filter_V='.anv'
	endelse


New_Name_I=newfilename(model=model,filt=filter_I,path=path)

Channel=Data.Channel

Start_time=Time_Outvalue(Data.edges(0),time=Data.time, Dt=Data.Dt)

if Data.N_channels eq 192 then Receiver='AOR' else Receiver='FDAS'

New_File_I=pickfile(/write,path=path,file=New_Name_I)
New_File_V=subdir(New_File_I)+Delim+(name_extract(New_File_I))(1)+filter_V

widget_control,top,/show

	if New_File_I eq '' then begin
cancel=1
return
	endif

; *************** Writing of the output file headers ******************

	widget_control,/hour

Length=Data.edges(1)-Data.edges(0)+1

Sz=[2L,Data.N_channels,32L,2L,Data.N_channels*32L]

if Data.lun_I(index) ne 0 then free_lun,Data.lun_I(index)
if Data.lun_V(index) ne 0 then free_lun,Data.lun_V(index)

openw,lun_I,New_File_I,/get_lun
openw,lun_V,New_File_V,/get_lun

Data.lun_I(index)=lun_I
Data.lun_V(index)=lun_V

Length=Data.edges(1)-Data.edges(0)+1


	gr_header,lun_I,offset_I,header_I,/write,	$
	comments=comments,			$
	Parameter='Intensity', 			$
	Interferometer=Interferometer,		$
	source_file=(name_extract(Data.Fname))(0),$
	first_record=Data.edges(0),		$
	Date=Data.Date,	    			$
	Reference_time=Data.Reference_time,	$
	Reference_Channel=Channel, 		$
	Start_time=Start_time,			$
	Receiver=Receiver,     			$
	Dt=Data.Dt,  		       		$
	Length=Length, 				$
	N_channels=Data.N_channels,		$
	Creator='file_align.pro',		$
	Array_size=Array_size,			$
	Type=Type

	gr_header,lun_V,offset_V,header_V,/write,	$
	comments=comments,			$
	Parameter='Polarization',		$
	Interferometer=Interferometer,		$
	source_file=(name_extract(Data.Fname))(0),$
	first_record=Data.edges(0),		$
	Date=Data.Date,	    			$
	Reference_time=Data.Reference_time,	$
	Reference_Channel=Channel,		$
	Start_time=Start_time,			$
	Receiver=Receiver,     			$
	Dt=Data.Dt,  		       		$
	Length=Length, 				$
	N_channels=Data.N_channels,		$
	Creator='file_align.pro',		$
	Array_size=Array_size,			$
	Type=Type

	end

	pro f_a_file_read,index,top,	$
	Offset_I,header_I,Offset_V,header_V,comments,type

;	Opens output files and writes their headers

common file_align_Exch,Data,Array0,Array1,Array2,	$
	xx,yy,xxx,yyy,current_state,Sc,Sw_Points

WIDGET_CONTROL,/hour

Name=name_extract(Data.Fname)
path=subdir(Data.Fname)

File_I=(File_V=Data.Fname)
strput,File_I,'i',strlen(File_I)-1
strput,File_V,'v',strlen(File_V)-1

for j=0,1 do if Data.lun_I(j) ne 0L then free_lun,Data.lun_I(j)
for j=0,1 do if Data.lun_V(j) ne 0L then free_lun,Data.lun_V(j)

openr,lun_I,File_I,/get_lun
Data.lun_I(0)=lun_I

openr,lun_V,File_V,/get_lun
Data.lun_V(0)=lun_V


	gr_header,Data.lun_I(0),offset_I,header_I,/read,$
	comments=comments_I,			$
	Parameter=Parameter_I, 			$
	Interferometer=Interferometer,		$
	source_file=source_file,		$
	first_record=first_record,		$
	Date=Date,	    			$
	Reference_time=Reference_time, 		$
	Reference_Channel=Channel,		$
	Start_time=Start_time,			$
	Receiver=Receiver,     			$
	Dt=Dt,  		       		$
	Length=Length, 				$
	N_channels=N_channels,			$
	Creator=Creator, 			$
	Array_size=Array_size,			$
	Type=Type

	gr_header,Data.lun_V(0),offset_V,header_V,/read,$
	comments=comments_V, Parameter=Parameter_V


	Data.Dt=Dt
	Data.Date=Date
	Data.Length=Length
	Data.N_channels=N_channels
;	Data.Start_time=Start_time
	Data.Reference_time=Reference_time
	Data.Interf=Interferometer
	Data.Channel=Channel

Data.edges=[0,Length-1]

;	Data.edges(0)=first_record
;	Data.edges(1)=first_record+Length-1



;param_ssrt, Data.date, Data.Reference_time, Data.N_channels eq 192, par=par, /si,sun=sun

Data.threshold=(-1000.)*(Data.N_channels ne 192)

xx=assoc(Data.lun_I(0),	$
	make_array(N_channels, $
		type=array_size(n_elements(array_size)-2)),	$
			offset_I)

yy=assoc(Data.lun_V(0),	$
	make_array(N_channels, $
		type=array_size(n_elements(array_size)-2)),	$
			offset_V)





Array1=intarr(Data.N_channels,512)

for j=0,511 < (Data.Length/Data.factor(1)-1) do Array1(*,j)=xx(*,j*Data.factor(1))





















	end

	pro file_align_show

;	Displays arrays in the graphics window

common file_align_Exch,Data,Array0,Array1,Array2,	$
	xx,yy,xxx,yyy,current_state,Sc,Sw_Points

WIDGET_CONTROL,/hour


Iew=Data.Stokes(0)
Vew=Data.Stokes(1)
Isn=Data.Stokes(2)
Vsn=Data.Stokes(3)

WIDGET_CONTROL,/hour

if Data.factor(0) eq 1 then bounds=Data.tv_bounds else bounds=Data.edges

if bounds(1)-bounds(0) lt 255 then $
	bounds=(bounds(0)+bounds(1))/2+ $
		[-256,255] > 0 < (Data.Length-1)

readfile,FileName=Data.Fname,bounds=bounds, date=date,	$
	Iew=Iew, Vew=Vew, ISN=ISN, VSN=VSN, multi=Data.factor(0),sum=1

Data.date=date
if Data.factor(0) eq 1 then Data.tv_bounds=bounds

if Data.Tv_bounds(0) eq Data.Tv_bounds(1) then $
	Data.Tv_bounds(1)=Data.Tv_bounds(0)+2

Data.tv_bounds(1)=Data.tv_bounds(1) < (Data.tv_bounds(0)+511)


	CASE 1 OF

Data.Stokes(0): Array0=Iew
Data.Stokes(1): Array0=Vew
Data.Stokes(2): Array0=Isn
Data.Stokes(3): Array0=Vsn

	ENDCASE


Wset,Data.Win(0)
erase,0
tvscl,transpose(Array0)
empty

WIDGET_CONTROL,Data.Time_Label(0),set_val='  '+strtrim(bounds(0),2)+':'+$
	Time_Outvalue(bounds(0), time=Data.time, Dt=Data.Dt, space=3)+ $
	' ---   '+strtrim(bounds(1),2)+':'+				$
	Time_Outvalue(bounds(1), time=Data.time, Dt=Data.Dt, space=3)


	end





	pro file_align_event,ev

common file_align_Exch,Data,Array0,Array1,Array2,	$
	xx,yy,xxx,yyy,current_state,Sc,Sw_Points


IF ev.id eq Data.View(0) THEN BEGIN

device,/cursor_cross

	if ev.press then Data.press=1
	if ev.release then Data.press=0

	if Data.press then begin

wset,Data.Win(0)

Data.Reference=Data.tv_bounds(0)+ev.x*Data.factor(0)
Data.Channel=ev.y

WIDGET_CONTROL,Data.Slider2(1),set_val=Data.Reference
WIDGET_CONTROL,Data.Slider2(2),set_val=ev.y+1
Data.Reference_time=Time_Outvalue(Data.Reference,time=Data.time, Dt=Data.Dt)
WIDGET_CONTROL,Data.Ref_label(1),set_val='  '+Data.Reference_time


	endif

	if ev.release then begin
	wset,Data.Win(3)
plot,findgen(Data.N_channels)+1,	$
Array0(*,ev.X*Data.factor(0)),xmar=[6,2],ymar=[2,1]
	empty
	scale,temp,/mem
	Sc.W3=temp
	endif

RETURN

ENDIF

IF ev.id eq Data.View(1) THEN begin

wset,Data.Win(1)

WIDGET_CONTROL,Data.Time_Label(1),set_val=	$
	string(data.tv_bounds(0)+ev.X*Data.factor(1),ev.Y,format="(I6,', ',I6)")

w_box_cursor,ev,xy,init=Data.init,cur=current_state

Data.init=0
Data.xy=xy



	if ev.release then begin

widget_control,Data.QS_button,sens=1
widget_control,Data.Zero_button,sens=1


	wset,Data.Win(3)
plot,findgen(Data.N_channels)+1,	$
Array1(*,ev.X) > Data.threshold,xmar=[6,2],ymar=[2,1]

plots, [1,1]*Data.xy(0,1),!y.crange
plots, [1,1]*Data.xy(1,1),!y.crange

plots, [1,1]*Data.Zero(0),!y.crange,col=130
plots, [1,1]*Data.Zero(1),!y.crange,col=130

plots, [1,1]*Data.QS(0),!y.crange,col=200
plots, [1,1]*Data.QS(1),!y.crange,col=200






	empty
	scale,temp,/mem
	Sc.W3=temp
	endif


return
ENDIF

IF ev.id eq Data.View(2) THEN BEGIN
device,/cursor_cross
WIDGET_CONTROL,Data.Time_Label(2),set_val=	$
	string(data.tv_bounds(0)+ev.X*Data.factor(1),ev.Y,format="(I6,', ',I6)")

	if ev.release then begin
	wset,Data.Win(3)
plot,findgen(Data.N_channels)+1,	$
Array2(*,ev.X),xmar=[6,2],ymar=[2,1]
	empty
	scale,temp,/mem
	Sc.W3=temp
	endif


return
ENDIF

IF ev.id eq Data.View(3) THEN BEGIN
window_set,Data.Win(3),scale=Sc.W3
device,/cursor_cross

X=(convert_coord(ev.x,ev.y,/dev,/to_data))([0,1])

WIDGET_CONTROL,Data.R_Win_Label(0),set_val=	$
	string(X(0),X(1),format="(I6,', ',I6)")

return
ENDIF



IF ev.id eq Data.View(4) THEN BEGIN
window_set,Data.Win(4),scale=Sc.W4
device,/cursor_cross

X=(convert_coord(ev.x,ev.y,/dev,/to_data))([0,1])

WIDGET_CONTROL,Data.R_Win_Label(1),set_val=	$
	string(X(0),X(1),format="(I6,', ',I6)")

if Data.Switch then begin
	if ev.press then begin
	Data.Point=X(0)
WIDGET_CONTROL,Data.Goto_button,sens=1

Data.tv_bounds=Data.Point+[-256,255] > 0 < (Data.Length-1)
if Data.Tv_bounds(0) eq Data.Tv_bounds(1) then $
	Data.Tv_bounds(1)=Data.Tv_bounds(0)+2
Data.tv_bounds(1)=Data.tv_bounds(1) < (Data.tv_bounds(0)+511)
WIDGET_CONTROL,Data.Ref_Label(0),set_val=	$
	Time_Outvalue(Data.Point, time=Data.time, Dt=Data.Dt, space=2)
WIDGET_CONTROL, Data.slider2(0),set_val=Data.Point


if Data.tv_bounds(1)-Data.tv_bounds(0) lt 255 then $
	Data.tv_bounds=(Data.tv_bounds(0)+Data.tv_bounds(1))/2+ $
		[-256,255] > 0 < (Data.Length-1)

WIDGET_CONTROL,Data.Time_Label(0),set_val='  '+strtrim(Data.tv_bounds(0),2)+':'+$
	Time_Outvalue(Data.tv_bounds(0), time=Data.time, Dt=Data.Dt, space=3)+ $
	' ---   '+strtrim(Data.tv_bounds(1),2)+':'+			$
	Time_Outvalue(Data.tv_bounds(1), time=Data.time, Dt=Data.Dt, space=3)

wset,Data.Win(0)	&	erase,0		&	empty

file_align_show

	endif
endif

RETURN

ENDIF


WIDGET_CONTROL,ev.id,GET_UVALUE = uv

CASE uv OF


"Xloadct":	begin
	WIDGET_CONTROL,/hour
	Xloadct
		end

"Calculator":	begin
	WIDGET_CONTROL,/hour
	Wcalc
		end


"Scan":		for j=0,1 do WIDGET_CONTROL,Data.View_Base1(j),map=1-j

"Trend":	for j=0,1 do WIDGET_CONTROL,Data.View_Base1(j),map=j

"Last":	for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([1,0,0])(j)

"Aligned":	for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([0,1,0])(j)

"Calibrated":	for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([0,0,1])(j)


"List":		begin
	WIDGET_CONTROL,/hour
	a=xselect(string(Sw_Points),group=ev.top)
if a ge 0 then if Sw_Points(0) ge 0 then 	$
		Data.Point=Sw_Points(a)	else Data.Point=0
	WIDGET_CONTROL,Data.Goto_button,sens=1
		end

"Go to":	begin

Data.tv_bounds=Data.Point+[-256,255] > 0 < (Data.Length-1)
if Data.Tv_bounds(0) eq Data.Tv_bounds(1) then $
	Data.Tv_bounds(1)=Data.Tv_bounds(0)+2
Data.tv_bounds(1)=Data.tv_bounds(1) < (Data.tv_bounds(0)+511)
WIDGET_CONTROL,Data.Ref_Label(0),set_val=	$
	Time_Outvalue(Data.Point, time=Data.time, Dt=Data.Dt, space=2)
WIDGET_CONTROL, Data.slider2(0),set_val=Data.Point


if Data.tv_bounds(1)-Data.tv_bounds(0) lt 255 then $
	Data.tv_bounds=(Data.tv_bounds(0)+Data.tv_bounds(1))/2+ $
		[-256,255] > 0 < (Data.Length-1)

WIDGET_CONTROL,Data.Time_Label(0),set_val='  '+strtrim(Data.tv_bounds(0),2)+':'+$
	Time_Outvalue(Data.tv_bounds(0), time=Data.time, Dt=Data.Dt, space=3)+ $
	' ---   '+strtrim(Data.tv_bounds(1),2)+':'+			$
	Time_Outvalue(Data.tv_bounds(1), time=Data.time, Dt=Data.Dt, space=3)

wset,Data.Win(0)	&	erase,0		&	empty


		end

"Threshold":	begin
WIDGET_CONTROL,Data.thres,get_val=a,/hour
Data.threshold=fix(a(0))
wset,Data.Win(1)
erase
tvscl,transpose(Array1) > Data.threshold
empty
		end


"Both":	begin

WIDGET_CONTROL,/hour

	if Data.lun_I(0) eq 0 then begin
xwarning,'You should first make aligned file'
return
	endif

	if equiv(Data.Zero, fltarr(2)) or equiv(Data.QS, fltarr(2)) then begin
xwarning,'You should first indicate both reference areas - Zero and Quiet Sun'
return
	endif


Length=Data.edges(1)-Data.edges(0)+1

disk_free,tmp
Data.free=tmp
Space_required=Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,/hour,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '

	if Data.Free lt Space_required then begin
xwarning, 'There is not enough disk space!'
return
	endif

r_trend=(Zero=fltarr(Length))

widget_control,Data.Info_Label,/hour,set_val='Calculating gain factor...'

	for j=0,Length-1 do begin
r_trend(j)=total((xx(j))(Data.QS(0):Data.QS(1)))
Zero(j)=total((xx(j))(Data.Zero(0):Data.Zero(1)))
if j mod 32 eq 0 then WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)+j
	endfor

; *****************************************************************

wait,0.2
WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)

r_trend=r_trend/(Data.QS(1)-Data.QS(0)+1)
Zero=Zero/(Data.Zero(1)-Data.Zero(0)+1)

gain=(r_trend-Zero)/(r_trend(0)-Zero(0))
background=(Zero*r_trend(0)-Zero(0)*r_trend)/(r_trend(0)-Zero(0))

device,get_screen_size=scr

k=0.45

window,/free,tit='Gain', xsize=scr(0)*k, ysize=scr(1)*k,	$
	xpos=scr(0)*0.5, ypos=0

plot,gain

window,/free,tit='Zero level', xsize=scr(0)*k, ysize=scr(1)*k,	$
	xpos=scr(0)*0.5, ypos=scr(1)*0.5

plot,background

empty

;r_trend=r_trend/(Data.QS(1)-Data.Zero(1)-Data.QS(0)+1)

;comp_factor=r_trend(0)/r_trend

comp_factor=gain(0)/gain

kb_in_text,comments
comments=strtrim(comments)

type='Aligned and calibrated record'

f_a_file_prepare,1,ev.top,Offset_I,header_I,Offset_V,header_V,comments,type,cancel

if cancel then return

xxx=assoc(Data.lun_I(1),intarr(Data.N_channels),Offset_I)
yyy=assoc(Data.lun_V(1),intarr(Data.N_channels),Offset_V)

widget_control,Data.Info_Label,/hour,set_val='Calibrating gain ...'

	for j=0,Length-1 do begin

xxx(j)=replicate(comp_factor(j),Data.N_Channels)*(xx(j)-Zero(j)) > (-10)
yyy(j)=replicate(comp_factor(j),Data.N_Channels)*(yy(j))

if j mod 32 eq 0 then WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)+j
	endfor

; *****************************************************************

wait,0.2
WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)

Space_required=Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,/hour,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '


Data.factor(1)=Length/512+1

Array2=intarr(Data.N_channels,512)

for j=0,511 < (Length/Data.factor(1)-1) do Array2(*,j)=xxx(*,j*Data.factor(1))

for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([0,0,1])(j)

wset,Data.Win(2)
erase
tvscl,transpose(Array2) > Data.threshold
empty

		end

"Gain_only":	begin

WIDGET_CONTROL,/hour

	if Data.lun_I(0) eq 0 then begin
xwarning,'You should first make aligned file'
return
	endif

	if equiv(Data.Zero, fltarr(2)) or equiv(Data.QS, fltarr(2)) then begin
xwarning,'You should first indicate both reference areas - Zero and Quiet Sun'
return
	endif


Length=Data.edges(1)-Data.edges(0)+1

disk_free,tmp
Data.free=tmp
Space_required=Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,/hour,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '

	if Data.Free lt Space_required then begin
xwarning, 'There is not enough disk space!'
return
	endif

r_trend=(Zero=fltarr(Length))

widget_control,Data.Info_Label,/hour,set_val='Calculating gain factor...'

	for j=0,Length-1 do begin

r_trend(j)=total((xx(j))(Data.QS(0):Data.QS(1)))
Zero(j)=total((xx(j))(Data.Zero(0):Data.Zero(1)))

if j mod 32 eq 0 then WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)+j
	endfor

; *****************************************************************

wait,0.2
WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)

r_trend=r_trend/(Data.QS(1)-Data.QS(0)+1)
Zero=Zero/(Data.Zero(1)-Data.Zero(0)+1)

Zero=min(Zero)

gain=(r_trend-Zero)/(r_trend(0)-Zero(0))
background=(Zero*r_trend(0)-Zero(0)*r_trend)/(r_trend(0)-Zero(0))

device,get_screen_size=scr

k=0.45

window,/free,tit='Gain', xsize=scr(0)*k, ysize=scr(1)*k,	$
	xpos=scr(0)*0.5, ypos=0

plot,gain

window,/free,tit='Zero level', xsize=scr(0)*k, ysize=scr(1)*k,	$
	xpos=scr(0)*0.5, ypos=scr(1)*0.5

plot,background

empty


;r_trend=r_trend/(Data.QS(1)-Data.Zero(1)-Data.QS(0)+1)

;comp_factor=r_trend(0)/r_trend

comp_factor=gain(0)/gain

kb_in_text,comments
comments=strtrim(comments)

type='Aligned and calibrated record'

f_a_file_prepare,1,ev.top,Offset_I,header_I,Offset_V,header_V,comments,type,cancel

if cancel then return

xxx=assoc(Data.lun_I(1),intarr(Data.N_channels),Offset_I)
yyy=assoc(Data.lun_V(1),intarr(Data.N_channels),Offset_V)

widget_control,Data.Info_Label,/hour,set_val='Calibrating gain ...'

	for j=0,Length-1 do begin

xxx(j)=replicate(comp_factor(j),Data.N_Channels)*(xx(j)-Zero) > (-10)
yyy(j)=replicate(comp_factor(j),Data.N_Channels)*(yy(j))

if j mod 32 eq 0 then WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)+j
	endfor

; *****************************************************************

wait,0.2
WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)

Space_required=Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,/hour,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '


Data.factor(1)=Length/512+1

Array2=intarr(Data.N_channels,512)

for j=0,511 < (Length/Data.factor(1)-1) do Array2(*,j)=xxx(*,j*Data.factor(1))

for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([0,0,1])(j)

wset,Data.Win(2)
erase
tvscl,transpose(Array2) > Data.threshold
empty

		end

"Zero_0":	begin

WIDGET_CONTROL,/hour

	if Data.lun_I(0) eq 0 then begin
xwarning,'You should first make aligned file'
return
	endif

	if equiv(Data.QS, fltarr(2)) then begin
xwarning,'You should first indicate reference area - Quiet Sun'
return
	endif


Length=Data.edges(1)-Data.edges(0)+1

disk_free,tmp
Data.free=tmp
Space_required=Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,/hour,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '

	if Data.Free lt Space_required then begin
xwarning, 'There is not enough disk space!'
return
	endif

r_trend=(Zero=fltarr(Length))

widget_control,Data.Info_Label,/hour,set_val='Calculating gain factor...'

	for j=0,Length-1 do begin

r_trend(j)=total((xx(j))(Data.QS(0):Data.QS(1)))
;Zero(j)=total((xx(j))(Data.Zero(0):Data.Zero(1)))

if j mod 32 eq 0 then WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)+j
	endfor

; *****************************************************************

wait,0.2
WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)

r_trend=r_trend/(Data.QS(1)-Data.QS(0)+1)
Zero=Zero/(Data.Zero(1)-Data.Zero(0)+1)

Zero=min(Zero)

gain=(r_trend-Zero)/(r_trend(0)-Zero(0))
background=(Zero*r_trend(0)-Zero(0)*r_trend)/(r_trend(0)-Zero(0))


device,get_screen_size=scr

k=0.45

window,/free,tit='Gain', xsize=scr(0)*k, ysize=scr(1)*k,	$
	xpos=scr(0)*0.5, ypos=0

plot,gain

window,/free,tit='Zero level', xsize=scr(0)*k, ysize=scr(1)*k,	$
	xpos=scr(0)*0.5, ypos=scr(1)*0.5

plot,background

empty

;r_trend=r_trend/(Data.QS(1)-Data.Zero(1)-Data.QS(0)+1)

;comp_factor=r_trend(0)/r_trend

comp_factor=gain(0)/gain

kb_in_text,comments
comments=strtrim(comments)

type='Aligned and calibrated record'

f_a_file_prepare,1,ev.top,Offset_I,header_I,Offset_V,header_V,comments,type, cancel

if cancel then return

xxx=assoc(Data.lun_I(1),intarr(Data.N_channels),Offset_I)
yyy=assoc(Data.lun_V(1),intarr(Data.N_channels),Offset_V)

widget_control,Data.Info_Label,/hour,set_val='Calibrating gain ...'

	for j=0,Length-1 do begin

xxx(j)=replicate(comp_factor(j),Data.N_Channels)*(xx(j)-Zero) > (-10)
yyy(j)=replicate(comp_factor(j),Data.N_Channels)*(yy(j))

if j mod 32 eq 0 then WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)+j
	endfor

; *****************************************************************

wait,0.2
WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)

Space_required=Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,/hour,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '


Data.factor(1)=Length/512+1

Array2=intarr(Data.N_channels,512)

for j=0,511 < (Length/Data.factor(1)-1) do Array2(*,j)=xxx(*,j*Data.factor(1))

for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([0,0,1])(j)

wset,Data.Win(2)
erase
tvscl,transpose(Array2) > Data.threshold
empty

		end



"Switch":	begin
widget_control,Data.Info_Label,/hour,set_val='Searching for switch points...'
f_a_find_switch,FileName=Data.Fname,Iew=Iew,Points_EW=Points_EW
Sw_Points=Points_EW
Data.Switch=1

for j=0,1 do WIDGET_CONTROL,Data.View_Base1(j),map=j

wset,Data.Win(4)
plot,total(Iew,2),xmar=[6,3],ymar=[2,1],xticks=2,/xst
	scale,temp,/mem
	Sc.W4=temp
WIDGET_CONTROL,Data.Trend_button,sens=1

empty

Space_required=Data.Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,/hour,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '


WIDGET_CONTROL,Data.List_button,sens=1


		return
		end



"Iew":	begin
Data.Stokes(0)=ev.select
Data.Stokes(1)=1-Data.Stokes(0)
Data.Stokes(2)=(Data.Stokes(3)=0)

for j=0,3 do WIDGET_CONTROL,Data.But_Stokes(j),set_but=Data.Stokes(j)
	end

"Vew":	begin
Data.Stokes(1)=ev.select
Data.Stokes(0)=1-Data.Stokes(1)
Data.Stokes(2)=(Data.Stokes(3)=0)

for j=0,3 do WIDGET_CONTROL,Data.But_Stokes(j),set_but=Data.Stokes(j)
	end

"Isn":	begin
Data.Stokes(2)=ev.select
Data.Stokes(3)=1-Data.Stokes(2)
Data.Stokes(0)=(Data.Stokes(1)=0)

for j=0,3 do WIDGET_CONTROL,Data.But_Stokes(j),set_but=Data.Stokes(j)
	end

"Vsn":	begin
Data.Stokes(3)=ev.select
Data.Stokes(2)=1-Data.Stokes(3)
Data.Stokes(0)=(Data.Stokes(1)=0)

for j=0,3 do WIDGET_CONTROL,Data.But_Stokes(j),set_but=Data.Stokes(j)
	end

"Natural":	begin
	for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([1,0,0])(j)
Data.factor(0)=1
	file_align_show

		end

"Compressed":	begin
	for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([1,0,0])(j)
Data.factor(0)=Data.factor(1)
	file_align_show

		end

"HELP":		begin
WIDGET_CONTROL,/hour


	CASE !version.OS OF

'windows':	Delim='\'

'Win32':	Delim='\'

ELSE:		Delim='/'

	ENDCASE


xtext,file=getenv('help_dir')+Delim+'filesett.hlp',group=ev.top
		end


"START":	begin
	Data.edges(0)=ev.value
	WIDGET_CONTROL,Data.Txt1,set_val=Time_Outvalue(Data.edges(0),$
		time=Data.time, Dt=Data.Dt, space=5)
	WIDGET_CONTROL,Data.First_Block,	$
set_val=strtrim(Data.edges(0)/Data.N_scans,2)
	WIDGET_CONTROL,Data.First_Record,	$
set_val=strtrim(Data.edges(0) mod Data.N_scans,2)
	WIDGET_CONTROL,Data.Label,		$
set_val=strtrim(abs(Data.edges(1)-Data.edges(0))+1,2)

		end

"STOP":		begin
	Data.edges(1)=ev.value
	WIDGET_CONTROL,Data.Txt2,set_val=Time_Outvalue(Data.edges(1),$
time=Data.time, Dt=Data.Dt, space=5)
	WIDGET_CONTROL,Data.Last_Block,		$
set_val=strtrim(Data.edges(1)/Data.N_scans,2)
	WIDGET_CONTROL,Data.Last_Record,	$
set_val=strtrim(Data.edges(1) mod Data.N_scans,2)
	WIDGET_CONTROL,Data.Label,		$
set_val=strtrim(abs(Data.edges(1)-Data.edges(0))+1,2)
		end

"Open":		Data.New_file=1

"TV":		begin
Data.tv_bounds=ev.value+[-256,255] > 0 < (Data.Length-1)
if Data.Tv_bounds(0) eq Data.Tv_bounds(1) then $
	Data.Tv_bounds(1)=Data.Tv_bounds(0)+2
Data.tv_bounds(1)=Data.tv_bounds(1) < (Data.tv_bounds(0)+511)
WIDGET_CONTROL,Data.Ref_Label(0),set_val=	$
	Time_Outvalue(ev.value, time=Data.time, Dt=Data.Dt, space=2)


if Data.tv_bounds(1)-Data.tv_bounds(0) lt 255 then $
	Data.tv_bounds=(Data.tv_bounds(0)+Data.tv_bounds(1))/2+ $
		[-256,255] > 0 < (Data.Length-1)

WIDGET_CONTROL,Data.Time_Label(0),set_val='  '+strtrim(Data.tv_bounds(0),2)+':'+$
	Time_Outvalue(Data.tv_bounds(0), time=Data.time, Dt=Data.Dt, space=3)+ $
	' ---   '+strtrim(Data.tv_bounds(1),2)+':'+			$
	Time_Outvalue(Data.tv_bounds(1), time=Data.time, Dt=Data.Dt, space=3)

wset,Data.Win(0)	&	erase,0		&	empty
		end

"Channel":	Data.Channel=ev.value-1

"Time":		begin
	WIDGET_CONTROL,/hourglass

Data.Reference=ev.value

Data.Reference_time=	$
	Time_Outvalue(ev.value,time=Data.time, Dt=Data.Dt)

WIDGET_CONTROL,Data.Ref_label(1),set_val='  '+Data.Reference_time

	Wset,Data.Win(3)

Iew=Data.Stokes(0)
Vew=Data.Stokes(1)
Isn=Data.Stokes(2)
Vsn=Data.Stokes(3)

bounds=[1L,1L]*ev.value

readfile,FileName=Data.Fname,bounds=bounds, Iew=Iew, Vew=Vew, ISN=ISN, VSN=VSN

	CASE 1 OF

Data.Stokes(0): x=Iew
Data.Stokes(1): x=Vew
Data.Stokes(2): x=Isn
Data.Stokes(3): x=Vsn

	ENDCASE

	Wset,Data.Win(3)

	plot,findgen(Data.N_channels)+1,x,xmar=[6,2],ymar=[2,1]
	scale,temp,/mem
	Sc.W3=temp
	empty
		end


"Align":	begin
	widget_control,/hour


; ************************** Show settings ********************

Data.edges=Data.edges(sort(Data.edges))

Data.edges=[Data.edges(0)/32*32, (Data.edges(1)+1)/32*32-1]

Length=Data.edges(1)-Data.edges(0)+1

disk_free,tmp
Data.free=tmp
Space_required=Length*Data.N_channels*4+1000

widget_control,Data.Info_Label,set_val=	$
' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb '

	if Data.Free lt Space_required then begin
xwarning, 'There is not enough disk space!'
return
	endif


WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)
WIDGET_CONTROL, Data.slider1,set_val=Data.edges(1)


	WIDGET_CONTROL,Data.Txt1,set_val=Time_Outvalue(Data.edges(0),$
		time=Data.time, Dt=Data.Dt, space=5)
	WIDGET_CONTROL,Data.First_Block,	$
set_val=strtrim(Data.edges(0)/Data.N_scans,2)
	WIDGET_CONTROL,Data.First_Record,	$
set_val=strtrim(Data.edges(0) mod Data.N_scans,2)
	WIDGET_CONTROL,Data.Label,		$
set_val=strtrim(abs(Data.edges(1)-Data.edges(0))+1,2)

	WIDGET_CONTROL,Data.Txt2,set_val=Time_Outvalue(Data.edges(1),$
time=Data.time, Dt=Data.Dt, space=5)
	WIDGET_CONTROL,Data.Last_Block,		$
set_val=strtrim(Data.edges(1)/Data.N_scans,2)
	WIDGET_CONTROL,Data.Last_Record,	$
set_val=strtrim(Data.edges(1) mod Data.N_scans,2)
	WIDGET_CONTROL,Data.Label,		$
set_val=strtrim(abs(Data.edges(1)-Data.edges(0))+1,2)



; *************** Show the array around reference time ***************

Data.tv_bounds=Data.Reference+[-256,255] > 0 < (Data.Length-1)
if Data.Tv_bounds(0) eq Data.Tv_bounds(1) then $
	Data.Tv_bounds(1)=Data.Tv_bounds(0)+2
Data.tv_bounds(1)=Data.tv_bounds(1) < (Data.tv_bounds(0)+511)
WIDGET_CONTROL,Data.Ref_Label(0),set_val=	$
	Time_Outvalue(Data.Reference, time=Data.time, Dt=Data.Dt, space=2)

if Data.Length gt 512 then WIDGET_CONTROL, Data.slider2(0),set_val=Data.Reference

if Data.tv_bounds(1)-Data.tv_bounds(0) lt 255 then $
	Data.tv_bounds=(Data.tv_bounds(0)+Data.tv_bounds(1))/2+ $
		[-256,255] > 0 < (Data.Length-1)

file_align_show

Wset,Data.Win(0)

device,set_gr=6
plots,[1,1]*(Data.Reference-Data.tv_bounds(0)) > 0 < 511,[0,192],/dev
plots,[0,511],[1,1]*Data.Channel,/dev
device,set_gr=3
empty


Iew=Data.Stokes(0)
Vew=Data.Stokes(1)
Isn=Data.Stokes(2)
Vsn=Data.Stokes(3)

bounds=[1L,1L]*Data.Reference

readfile,FileName=Data.Fname,bounds=bounds, Iew=Iew, Vew=Vew, ISN=ISN, VSN=VSN

	CASE 1 OF

Data.Stokes(0): x=Iew
Data.Stokes(1): x=Vew
Data.Stokes(2): x=Isn
Data.Stokes(3): x=Vsn

	ENDCASE

	Wset,Data.Win(3)

	plot,findgen(Data.N_channels)+1,x,xmar=[6,2],ymar=[2,1]
	scale,temp,/mem
	Sc.W3=temp
	empty

; **************** Building of the output file names *************
; *************************** Is all OK ? ************************


xquestion,aaa,text='Are all the settings OK?',	$
	group=ev.top,sel=['OK','Cancel'],ypos=0
if aaa eq 'Cancel' then return

kb_in_text,comments
comments=strtrim(comments)

type='Aligned record'

f_a_file_prepare,0,ev.top,Offset_I,header_I,Offset_V,header_V,comments,type,cancel

if cancel then return

xx=assoc(Data.lun_I(0),intarr(Data.N_channels,32),Offset_I)
yy=assoc(Data.lun_V(0),intarr(Data.N_channels,32),Offset_V)

Channel=Data.Channel

if Data.N_channels eq 192 then Receiver='AOR' else Receiver='FDAS'

N_block=Data.edges/32

start_time=Data.reference_time

suneph,Data.date,start_time,SUN

Receiver=Receiver eq 'AOR'

; ****************** Aligning cycle *****************************

	for j=N_block(0),N_block(1) do begin


bounds0=[0L,31L]
bounds=bounds0+32*j

Iew=Data.Stokes(0) or Data.Stokes(1)
Vew=Data.Stokes(1) or Data.Stokes(0)
Isn=Data.Stokes(2) or Data.Stokes(3)
Vsn=Data.Stokes(3) or Data.Stokes(2)

dir=isn

readfile,FileName=Data.Fname,bounds=bounds,$
 IEW=IEW, VEW=VEW, ISN=ISN, VSN=VSN, time=time_sec, date=date,/fast

fast=(single=(interp=0))
interp=1

if dir then iew=isn

if not Receiver then time_sec=time_sec(0)

scan=s_align(iew,Date,time_sec,Receiver,Data.Dt,Dir,sin=single, $
	fast=fast,interp=interp,	$
		start=start_time,SUN=SUN,Channel=Channel)

xx(j-N_block(0))=scan

if dir then vew=vsn

scan=s_align(vew,Date,time_sec,Receiver,Data.Dt,Dir,sin=single, $
	fast=fast,interp=interp, /polar, $
		start=start_time,SUN=SUN,Channel=Channel)

yy(j-N_block(0))=scan


WIDGET_CONTROL, Data.slider0,set_val=bounds(1)

	endfor

; *****************************************************************

wait,0.4
WIDGET_CONTROL, Data.slider0,set_val=Data.edges(0)

Length=Data.edges(1)-Data.edges(0)+1

Data.factor(1)=Length/512+1

xx=assoc(Data.lun_I(0),intarr(Data.N_channels),Offset_I)
yy=assoc(Data.lun_V(0),intarr(Data.N_channels),Offset_V)

Array1=intarr(Data.N_channels,512)

for j=0,511 < (Length/Data.factor(1)-1) do Array1(*,j)=xx(*,j*Data.factor(1))

for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([0,1,0])(j)

wset,Data.Win(1)
erase
tvscl,transpose(Array1) > Data.threshold
empty

widget_control,Data.Compressed,sens=1
widget_control,Data.Natural,sens=1

	end


"Zero":		begin
	Data.Zero=Data.xy(*,1)

	window_set,Data.Win(3),scale=Sc.W3

plots, [1,1]*Data.Zero(0),!y.crange,col=130
plots, [1,1]*Data.Zero(1),!y.crange,col=130

	empty


		end

"Q.Sun":	begin
	Data.QS=Data.xy(*,1)

	window_set,Data.Win(3),scale=Sc.W3

plots, [1,1]*Data.QS(0),!y.crange,col=200
plots, [1,1]*Data.QS(1),!y.crange,col=200

	empty

		end


ELSE:
ENDCASE


if (uv eq "Cancel") or (uv eq "Open") or (uv eq "DONE") then begin
device,/cursor_cross
WIDGET_CONTROL,ev.top,/DEST,/hour
if Data.g_leader ne 0L then begin
if WIDGET_INFO(Data.g_leader,/valid) then g_leader=Data.g_leader else g_leader=0L
endif else g_leader=0L

New_file=Data.New_file eq 1

for j=0,1 do begin

if Data.lun_I(j) ne 0 then flush,Data.lun_I(j)
if Data.lun_V(j) ne 0 then flush,Data.lun_V(j)

if Data.lun_I(j) ne 0 then free_lun,Data.lun_I(j)
if Data.lun_V(j) ne 0 then free_lun,Data.lun_V(j)
endfor


Data=Data.Fname
Array0=(Array1=(Array2=0))
xx=(yy=(xxx=(yyy=(current_state=(Sc=(Sw_Points=0))))))

	if New_file then file_align,group_leader=g_leader else begin

if g_leader ne 0L then begin
if WIDGET_INFO(g_leader,/valid) then WIDGET_CONTROL,g_leader,/show $
	else g_leader=0L
endif else g_leader=0L

	endelse

endif


IF uv eq 'Iew' 		$
or uv eq 'Vew' 		$
or uv eq 'Isn'	 	$
or uv eq 'Vsn' 		$
or uv eq 'Redraw' 	$
or uv eq 'Go to' 	$

THEN 	file_align_show

		end





pro file_align, Filename=Filename, path=path, group_leader=group_leader

;	Selects bounds of an array to be read from the SSRT data file.


common file_align_Exch,Data,Array0,Array1,Array2,	$
	xx,yy,xxx,yyy,current_state,Sc,Sw_Points

if n_elements(group_leader) le 0 then group_leader = 0L

Ax={Axes, x:{!Axis}, y:{!Axis}, z:{!Axis}, map:!Map}

Sc={W3:Ax, W4:Ax}

Ax=0

if n_elements(Filename) gt 0 then begin
	if Filename ne '' then path=subdir(Filename)
	endif else begin
	if n_tags(data) eq 0 and n_elements(data) eq 1 $
		and equiv(size(data), [0L,7L,1L]) then Filename=data $
		else Filename=''
	endelse

if n_elements(path) le 0 then path=getenv('spk_dat')

Data={	slider0:0L, slider1:0L, slider2:[0L,0L,0L], 			$
	Txt1:0L, Txt2:0L, Fname:'', Slider_Base:lonarr(3), 		$
	But_stokes:lonarr(4), Time_label:lonarr(3),			$
	Ref_label:lonarr(3), N_channels:192, lun_I:lonarr(2), 		$
	lun_V:lonarr(2), edges:[0L,1000L-1], Length:0L, 		$
	time:[0d,0d], mul:1, sum:1, New_file:0, Canc:0, 		$
	Stokes:[1,0,0,0], Dt:0d, Date:'', First_Block:0L, Last_Block:0L,$
	First_Record:0L, Last_Record:0L, N_scans:0L, 			$
	g_leader:group_leader, Label:0L, View:lonarr(5), Win:lonarr(5), $
	tv_bounds:[0L,0L], press:0, free:0L, Channel:0, 		$
	Reference_time:'', Reference:0L, View_Base0:lonarr(3), 		$
	View_Base1:lonarr(2), Info_Label:0L, Point:0L, Scan_button:0L, 	$
	Trend_button:0L, init:1, xy:intarr(2,2), R_Win_Label:[0L,0L], 	$
	List_button:0L, Switch:0, Goto_button:0L, factor:[1,1], 	$
	threshold:(-100), thres:0L, Compressed:0L, Natural:0L, 		$
	Interf:'E-W', File_Type:'Original', Zero_button:0L, 		$
	QS_button:0L, Zero:[0,0], QS:[0,0]}


if xregistered('file_align') then return
if n_elements(Length) le 0 then Length=0L

device,get_scr=scr


Data.FName=Filename

ret:

Filename=Data.FName

	Data.FName=pickfile(/read,path=path,file=Filename)

		if Data.FName eq '' then begin
	Data.Canc=1
	print,'You have selected no file'
	goto,exit1
		endif

old:
Data.time=[0D,0D]
Data.mul=1		&	Data.sum=0

	WIDGET_CONTROL,/hour

Name=name_extract(Data.Fname)

if 	Name(2) eq 'awi' or 	$
	Name(2) eq 'awv' or 	$
	Name(2) eq 'ani' or 	$
	Name(2) eq 'anv' then begin
		f_a_file_read,index,top,	$
	Offset_I,header_I,Offset_V,header_V,comments,type

Data.File_Type='Processed'
Data.n_scans=32L

endif else begin

openr,lun,Data.Fname,/get_lun

Block=ssrt_file_struc(lun, Fileformat=Fileformat, $
  Offset=Offset, Blocklength=Blocklength, Length=Length, $
	Num_blocks=Num_blocks, Dt=Dt)

Data.Length=Length	&	Data.Dt=Dt

Receiver=fix(Fileformat(0) eq 'aor')

;if equiv(Fileformat, ['aor','1']) ne 1 then
Data.Interf='E-W'

Data.N_scans=1L+31L*Receiver
Data.N_channels=([176,192])(Receiver)

Data.time(0)=read_time(Lun, Blocknumber=0)
Data.time(1)=read_time(Lun, Blocknumber=Num_blocks-1)+(Data.N_scans-1)*Data.Dt

free_lun,lun

Data.edges=[0L,Data.Length-1]

	if keyword_set(current_file) then if current_file $
	then if n_elements(bounds) eq 2 then Data.edges=bounds

endelse

main=widget_base(tit='Alignment of the file '+Name(0),/colu)
Menu_Base=widget_base(main,/row)


 XPdMenu, ['"DONE"				DONE',	$

	   '"FILE"	{',				$
			'"Open"      Open',    		$
			'"1 Switch Points"      Switch',$
			'"2 Align"      Align',  	$
			'"3 Calibrate"  {',		$
			'"Calculate both gain and zero level"		Both',	$
			'"Calculate gain and subtract zero level"	Gain_only',$
			'"Calculate gain assuming zero of 0"		Zero_0',$
					'}',		$
				'}',			$
	   '"Tools"	{',				$
			'"Colors"      Xloadct',	$
			'"Calculator"      Calculator',	$
				'}',			$

	   '"HELP"				HELP'], $
		   Menu_Base

disk_free,tmp
Data.free=tmp

Space_required=Data.Length*Data.N_channels*4+1000

Data.Info_Label=widget_label(Menu_Base,	/frame,	$
val=' Disk space available:  '+		$
strtrim(string(0.001*Data.free,format="(F9.1)"),2)+' Kb,  required: '+ $
strtrim(string(0.001*Space_required,format="(F7.1)"),2)+' Kb ')

Upper_Base=widget_base(main,/row)

base1= widget_base(Upper_Base,/row,/excl,/fra)

val=['Iew','Vew','Isn','Vsn']

	for j=0,3 do begin
Data.But_Stokes(j)=WIDGET_BUTTON(base1,uval=val(j),val=val(j)+'   ')
WIDGET_CONTROL,Data.But_Stokes(j),set_but=([1,0,0,0])(j)
	endfor

	FOR j=2,3 DO BEGIN
		;if not equiv(Fileformat,['aor','1']) then begin
	if Data.File_Type ne 'Processed' then 	$
		if not equiv(Fileformat,['aor','1']) then begin
WIDGET_CONTROL,Data.But_Stokes(j),set_but=0
WIDGET_CONTROL,Data.But_Stokes(j),sens=0
Data.Stokes(j)=0
		endif
	ENDFOR

junk=WIDGET_LABEL(Upper_Base,val='       Total: ')

Number_of_Blocks=WIDGET_LABEL(Upper_Base,	$
	val=strtrim(Data.Length/Data.N_scans,2)+$
	' Blocks,   '+strtrim(Data.Length,2)+' Scans.')

EmptyString='        '

gap=WIDGET_LABEL(Upper_Base,val=EmptyString)
junk=WIDGET_LABEL(Upper_Base,val='Scans selected : ')
Data.Label=WIDGET_LABEL(Upper_Base,val=		$
''+strtrim(abs(Data.edges(1)-Data.edges(0))+1,2)+'    ')

Double_Base=widget_base(main,/row)
Left_Base=widget_base(Double_Base,/colu,/fra)
Right_Base=widget_base(Double_Base,/colu,/fra)

Data.slider0=WIDGET_SLIDER(Left_Base, MIN=0, MAX=Data.Length-1, $
	TIT='First  record', /FRA, $
	UVAL= 'START', VAL=Data.edges(0),/drag)

Slider_Base_0=WIDGET_BASE(Left_Base,/row)

Data.Txt1 = WIDGET_LABEL(Slider_Base_0, val=	$
Time_Outvalue(Data.edges(0), time=Data.time, Dt=Data.Dt, space=5)+EmptyString)

Info1 = WIDGET_LABEL(Slider_Base_0, val='First block:     ')

Data.First_Block = WIDGET_LABEL(Slider_Base_0, $
	val='    '+strtrim(Data.edges(0)/Data.N_scans,2)+'    ')

Info11 = WIDGET_LABEL(Slider_Base_0, val='Record:     ')

Data.First_Record = WIDGET_LABEL(Slider_Base_0, $
	val='  '+strtrim(Data.edges(0) mod Data.N_scans,2)+'  ')

line=widget_base(Left_Base,/frame,/row,ysiz=1)

Data.slider1=WIDGET_SLIDER(Left_Base, MIN=0, MAX=Data.Length-1,  $
	TIT='Last  record', /FRAME, $
	UVAL= 'STOP', VAL=Data.edges(1),/drag)

Slider_Base_1=WIDGET_BASE(Left_Base,/row)

Data.Txt2 = WIDGET_LABEL(Slider_Base_1,	val=	$
Time_Outvalue(Data.edges(1), time=Data.time, Dt=Data.Dt, space=5)+EmptyString)

Info2 = WIDGET_LABEL(Slider_Base_1, val='Last block:     ')

Data.Last_Block = WIDGET_LABEL(Slider_Base_1, $
	val='    '+strtrim(Data.edges(1)/Data.N_scans,2)+'    ')

Info21 = WIDGET_LABEL(Slider_Base_1, val='Record:     ')

Data.Last_Record = WIDGET_LABEL(Slider_Base_1, $
	val='  '+strtrim(Data.edges(1) mod Data.N_scans,2)+'  ')

Draw_base=widget_base(main,/row)
Left_Draw_base=widget_base(Draw_Base,/colu)
Right_Draw_base=widget_base(Draw_Base,/colu)

Plain_Base=widget_base(Left_Draw_Base)

	for j=0,2 do begin
Data.View_Base0(j) =widget_base(Plain_base,/colu)

Data.View(j)=WIDGET_DRAW(Data.View_Base0(j),/fra,	$
	xsi=256*2,ysi=192,/motion, /button)

Data.Time_Label(j)=widget_label(Data.View_Base0(j),val=Emptystring)

	endfor

Left_Button_Base=widget_base(Left_Draw_base,/row)

Parent_button=widget_button(Left_Button_Base,val='Initial',/menu)
Initial=widget_button(Parent_button,val='Last',uval='Last')
Data.Compressed=widget_button(Parent_button,val='Natural',uval='Natural')
Data.Natural=widget_button(Parent_button,val='Compressed',uval='Compressed')

widget_control,Data.Compressed,sens=0
widget_control,Data.Natural,sens=0

Aux_Base=widget_Base(Left_Button_Base,/row,/fra)
button=widget_button(Aux_Base,val='Aligned',uval='Aligned')


Label=widget_label(Aux_Base,val='Threshold: ')
Data.thres=widget_text(Aux_Base,/edit,xsize=6,/fra,uval='Threshold',	$
	val=string(Data.threshold,format="(I6)"))

button=widget_button(Left_Button_Base,val='Calibrated',uval='Calibrated')


Data.Zero_button=widget_button(Left_Button_Base,val='Zero',uval='Zero')
Data.QS_button=widget_button(Left_Button_Base,val='Q.Sun',uval='Q.Sun')

widget_control,Data.QS_button,sens=0
widget_control,Data.Zero_button,sens=0

Plain_Base=widget_base(Right_Draw_Base)

	for j=0,1 do begin

Data.View_Base1(j) =widget_base(Plain_base,/colu)

Data.View(3+j)=WIDGET_DRAW(Data.View_base1(j),/fra,	$
	xsi=scr(0)*0.95-256*2,ysi=192,/motion, /button)
Data.R_Win_Label(j)=widget_label(Data.View_Base1(j),val=Emptystring)
	endfor


Right_Button_Base=widget_base(Right_Draw_base,/row)

Data.List_button=widget_button(Right_Button_Base,val='List',uval='List')
Data.Goto_button=widget_button(Right_Button_Base,val='Go to',uval='Go to')
Data.Scan_button=widget_button(Right_Button_Base,val='Scan',uval='Scan')
Data.Trend_button=widget_button(Right_Button_Base,val='Trend',uval='Trend')

WIDGET_CONTROL,Data.List_button,sens=0
WIDGET_CONTROL,Data.Goto_button,sens=0
WIDGET_CONTROL,Data.Trend_button,sens=0


Setting_Base=widget_base(Right_Base,/row)
Reference_Base=widget_base(Setting_Base,/colu)

Label=widget_label(Reference_Base,val=Emptystring+'     Reference:')

Data.Tv_bounds=[256 < (Data.Length/2-1), 	$
		(Data.Length-256) > (Data.Length/2-1)]

if Data.Tv_bounds(0) eq Data.Tv_bounds(1) then $
	Data.Tv_bounds(1)=Data.Tv_bounds(0)+2

Label_values=[	$
Time_Outvalue(Data.tv_bounds(0), time=Data.time, Dt=Data.Dt,space=2)+'  ', $
Time_Outvalue(Data.tv_bounds(0), time=Data.time, Dt=Data.Dt,space=2)+'  ', $
Emptystring+Emptystring]

Column_Base=widget_base(Reference_Base,/colu)

Slider_Labels=lonarr(3)

	for j=0,2 do begin
Data.Slider_Base(j)= widget_base(Column_Base,/row)

Slider_Labels(j)=widget_label(Data.Slider_Base(j),val=Emptystring+Emptystring)

Data.slider2(j) = WIDGET_SLIDER(Data.Slider_Base(j), 	$
	MIN=([Data.tv_bounds(0),0,1])(j), 	$
	MAX=([Data.tv_bounds(1),Data.Length-1,Data.N_channels])(j), $
	val=([0 > Data.tv_bounds(0),0,1])(j), 			$
	UVAL= (['TV','Time', 'Channel'])(j),	$
	/drag)

Data.Ref_label(j)=widget_label(Data.Slider_Base(j),val=Label_values(j))

	endfor

Data.tv_bounds=Data.tv_bounds-256 > 0
Data.tv_bounds(1)=Data.tv_bounds(1) < (Data.tv_bounds(0)+511)

Redraw_button=widget_button(Data.Slider_Base(2),val='Redisplay',uval='Redraw' )

WIDGET_CONTROL,Data.Slider_Base(0),map=Data.Length gt 512
for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([1,0,0])(j)
for j=0,1 do WIDGET_CONTROL,Data.View_Base1(j),map=1-j

WIDGET_CONTROL,main,/real

	for j=0,4 do begin
WIDGET_CONTROL,Data.View(j),get_val=tmp
Data.Win(j)=tmp
	endfor

for j=0,2 do widget_control,Slider_Labels(j),set_val=$
	(['   TV   ',' Time ', 'Channel'])(j)

	if Data.File_type eq 'Original' then begin

file_align_show

Plotting_array=Array0(*,0)
Array1=(Array2=intarr(192,512))

	endif else begin


for j=0,2 do WIDGET_CONTROL,Data.View_Base0(j),map=([0,1,0])(j)

wset,Data.Win(1)

tvscl,transpose(Array1) > Data.threshold

Plotting_array=Array1(*,0)

widget_control,Data.Compressed,sens=1
widget_control,Data.Natural,sens=1

	endelse

Plotting_array=Plotting_array > Data.threshold

wset,Data.Win(3)
plot,findgen(Data.N_channels)+1,Plotting_array,xmar=[6,2],ymar=[2,1]
scale,tmp,/mem
Sc.W3=tmp
wset,Data.Win(4)
plot,findgen(Data.N_channels)+1,Plotting_array,/nodata,xst=4,yst=4
scale,tmp,/mem
Sc.W4=tmp

loadct,0,/si

device,/cursor_cross

empty

Data.Reference_time=	$
	Time_Outvalue(0,time=Data.time, Dt=Data.Dt)

xmanager,'file_align',main,group=group_leader

exit1:

if n_tags(Data) gt 1 then Filename=Data.Fname else Filename=Data

end