;--- pro memu PRO MENU, BUT_DESC, OPTION, TITLE=TITLE, XOFFSET=XOFFSET, YOFFSET=YOFFSET, $ ROW=ROW, BUTSIZE=BUTSIZE, BASE=BASE, BUTTONS=BUTTONS, FONT=FONT, $ frame=frame, ypad=ypad, no_release = no_release, $ scroll=scroll, space=space, xpad=xpad, exclusive=exclusive, $ uvalue=uvalue, x_scroll_size=x_scroll_size, $ y_scroll_size=y_scroll_size parent = 0 if (not keyword_set(TITLE)) then TITLE = 'MENU' s = size(but_desc) value_type = s(s(0) + 1) if ((value_type ne 1) and (value_type ne 7)) then $ message, 'values must be a string vector or 3-d byte array.` if (value_type eq 1) then begin if (s(0) ne 3) then message, 'type byte values must be 3-d' n_buttons = s(3) endif else begin n_buttons = n_elements(but_desc) endelse ; sort out the keywords if (not keyword_set(butsize)) then butsize=100 if (not keyword_set(xoffset)) then xoffset=5 if (not keyword_set(yoffset)) then yoffset=25 if (not keyword_set(row)) then begin row=0 column=1 endif else begin row=1 column=0 endelse if (not keyword_set(font)) then font = '' if (not keyword_set(exclusive)) then exclusive=0 if (not keyword_set(nonexclusive)) then nonexclusive=0 if (keyword_set(scroll) or keyword_set(x_scroll_size) or $ keyword_set(y_scroll_size)) then begin scroll = 1; if (not keyword_set(x_scroll_size)) then x_scroll_size=0 if (not keyword_set(y_scroll_size)) then y_scroll_size=0 endif else begin scroll=0 endelse if (not keyword_set(frame)) then frame = 0 if (not keyword_set(space)) then space = 0 if (not keyword_set(xpad)) then xpad = 0 if (not keyword_set(ypad)) then ypad = 0 if (not keyword_set(uvalue)) then begin uvalue=lindgen(n_buttons) endif else begin s = size(uvalue) if (s(s(0) + 2) ne n_buttons) then $ message, 'uvalue must have the same number of elements as values' endelse ; create the base if (parent eq 0) then begin if (scroll) then $ base = widget_base(column=column, exclusive=exclusive, $ frame=frame, nonexclusive=nonexclusive, row=row, scroll=scroll, $ space=space, xpad=xpad, ypad=ypad, x_scroll_size=x_scroll_size, $ y_scroll_size=y_scroll_size, title = title) $ else $ base = widget_base(column=column, exclusive=exclusive, $ frame=frame, nonexclusive=nonexclusive, row=row, $ space=space, xpad=xpad, ypad=ypad, title = title) endif else begin if (keyword_set(title)) then begin theparent = widget_base(parent, /column, /frame) thelabel = widget_label(theparent, value = title) endif else theparent = parent if (scroll) then $ base = widget_base(theparent, column=column, exclusive=exclusive, $ frame=frame, nonexclusive=nonexclusive, row=row, scroll=scroll, $ space=space, xpad=xpad, ypad=ypad, x_scroll_size=x_scroll_size, $ y_scroll_size=y_scroll_size) $ else $ base = widget_base(theparent, column=column, exclusive=exclusive, $ frame=frame, nonexclusive=nonexclusive, row=row, $ space=space, xpad=xpad, ypad=ypad) endelse ; create the buttons buttons = lindgen(n_buttons) if (value_type eq 1) then begin for i = 0, n_buttons-1 do $ buttons(i) = widget_button(base, value=but_desc(*, *, i), $ no_release = no_release, uvalue=uvalue(i), $ font = font, xsize=butsize) endif else begin for i = 0, n_buttons-1 do $ buttons(i) = widget_button(base, value=but_desc(i), $ no_release = no_release, uvalue=uvalue(i), $ font = font, xsize=butsize) endelse ; realizacja na ekranie widget_control, /realize, base, tlb_set_xoffset=xoffset, tlb_set_yoffset=yoffset event=widget_event(base) kl= fix ( where (buttons eq event.id) + 1 ) widget_control, base, /destroy option=kl(0) end ;--- end of pro menu ---------------------------------------- ;--------- FLAT FIELDING DATA IMAGES ------------------------------ dir=dialog_pickfile(/DIRECTORY) sub_dir = 'resources\' file_mkdir, 'reduced_data' cam_index = strarr(6) litt = strarr(6) ;in this case first calculate size of file: CLOSE,/ALL ON_IOERROR, B223 A1=' ' OPENR,1,dir+sub_dir+'cameras.txt' FOR I=0,9 DO READF,1,A1 B223: no_cam=I CLOSE,1 ON_IOERROR,NULL cam_index = strarr(no_cam) openr,1,dir+sub_dir+'cameras.txt' ;for i=0,no_cam-1 do readf,1,cam_index;,format='(a2/)' close,1 ;find data frames: ;number of data frames no_N = intarr(6) for j=0,no_cam-1 do begin filelist_N = FINDFILE(dir+'*'+cam_index(j)+'_N*.fit') no_N(j) = size(filelist_N,/N_ELEMENTS) endfor ;control if number of data images are equal for all cameras: control=0 for j=1,no_cam-1 do begin if no_N(0) ne no_N(j) then control=control+1 endfor filelist_N = strarr(6,no_N(0)) for j=0,no_cam-1 do begin print, 'CAMERA: ',strupcase(cam_index(j)),' NO. IMAGES:',no_n(j) endfor IF control NE 0 THEN BEGIN PRINT, '------------------ ' PRINT, '------------------ NUMBER OF IMAGES OF ALL CAMERAS HAVE TO BE THE SAME' PRINT, '------------------ DELETE THESE OBSERVATIONS WHICH ARE NOT COMPLETE' PRINT, '------------------ I.E.: THESE WHICH NOT CONSIST ALL CAMERAS' PRINT, '------------------ ' ENDIF for j=0,no_cam-1 do begin filelist_N(j,*) = FINDFILE(dir+'*'+cam_index(j)+'_N*.fit') endfor name_length=strlen(filelist_N(0,*)) slash_pos=strpos(filelist_N(0,*),'\', /REVERSE_SEARCH ) rev_slash_pos = name_length - slash_pos write_name=strmid(filelist_N(0,*),slash_pos+1, rev_slash_pos) write_len =strlen(write_name) write_name=strmid(write_name,0, write_len) write_name=strcompress(write_name) ;print,'write_name ',write_name data_time = strmid(write_name,9,10) ;print,'data_time ',data_time ;print,data_name(0) if control eq 0 then begin MENU,['YES','NO'],LETR,TITLE='NUMBER OF DATA IMAGES:'+ string(no_N(0)) + ' DO YOU WANT TO CONTINUE?',BUTSIZE=600 ; IF (LETR EQ 1) THEN IF (LETR EQ 2) THEN GOTO,KONIEC endif else begin MENU,['YES','NO'],LETR,TITLE='NUMBER OF DATA IMAGES ARE NOT EQUAL IN ALL CAMERAS, DO YOU WANT TO CONTINUE?',BUTSIZE=600 ; IF (LETR EQ 1) THEN IF (LETR EQ 2) THEN GOTO,KONIEC endelse ;reading master dark frame ma_dark=fltarr(1280,512,no_cam) PRINT, 'reading master dark frames' for j=0,no_cam-1 do begin ma_dark(*,*,j)=readfits(dir+sub_dir+'master_dark_'+cam_index(j)+'.fit',header) endfor ;reading flat frames nol_flat=fltarr(1280,512,no_cam) PRINT, 'reading master flat field frames' for j=0,no_cam-1 do begin nol_flat(*,*,j)=readfits(dir+sub_dir+'nol_flat_'+cam_index(j)+'.fit',header) endfor hard_flat = FLTARR(1280,512,NO_CAM) PRINT, 'reading hard flat field frames' for j=0,no_cam-1 do begin hard_flat(*,*,j)=readfits(dir+sub_dir+'hard_flat_'+cam_index(j)+'.fit',header) endfor ;reading slit(row) flat row_flat=fltarr(1280,512,no_cam) PRINT, 'reading slit flat field frames' for j=1,no_cam-1 do begin row_flat(*,*,j)=readfits(dir+sub_dir+'row_flat_'+cam_index(j)+'.fit',header) endfor ;reading coefficients from files: ;hair_pos_coef=fltarr(3,no_cam) ;;;;;aidhgjkahsdjkhasvcd hair_pos_up_coef=fltarr(3,no_cam) hair_pos_down_coef=fltarr(3,no_cam) line_pos_coef=fltarr(3,no_cam) pxl_shift = fltarr(no_cam) openr,1,dir+sub_dir+'coefficients_hair.txt' ;readf,1,hair_pos_coef readf,1,hair_pos_up_coef readf,1,hair_pos_down_coef close,1 openr,1,dir+sub_dir+'coefficients_line.txt' readf,1,line_pos_coef close,1 ;-------- LOOP FOR ALL DATA IMAGES ------------------------ ;image_index means data image index ;reading data: PROCESS_ALL = 0 FIRST_FILE_INDEX = 0 LAST_FILE_INDEX = no_N(0) NO_FILES = no_N(0) for image_index=0,no_N(0)-1 do begin IF PROCESS_ALL NE 1 THEN BEGIN MENU,['NEXT IMAGE','QUIT','PROCESS ALL IMAGES','CHOOSE MANUALLY'],LETR,TITLE='CONTINUE?',BUTSIZE=400 ; IF (LETR EQ 1) THEN IF (LETR EQ 2) THEN GOTO,KONIEC IF (LETR EQ 3) THEN PROCESS_ALL = 1 IF (LETR EQ 4) THEN BEGIN PROCESS_ALL = 1 MENU,DATA_TIME,FIRST_FILE_INDEX,TITLE='CHOOSE .:: THE FIRST ::. FILE TO PROCESS',$ BUTSIZE=400,/scroll,Y_scroll_size=N_ELEMENTS(DATA_TIME)*22<600 IMAGE_INDEX = FIRST_FILE_INDEX-1 ;CHANGING GLOBAL VALUE MENU,DATA_TIME(FIRST_FILE_INDEX-1:*),NO_FILES,TITLE='CHOOSE .:: THE LAST ::. FILE TO PROCESS',$ BUTSIZE=400,/scroll,Y_scroll_size=(N_ELEMENTS(DATA_TIME)-FIRST_FILE_INDEX+1)*22<600 LAST_FILE_INDEX = FIRST_FILE_INDEX-1 + NO_FILES ENDIF ENDIF data = fltarr(1280,512,no_cam) HEADER = STRARR(9,NO_CAM) for j=0,no_cam-1 do begin data[*,*,j]=readfits(filelist_N[j,image_index],header(J)) ; LOOK INTO HEADER IF NUMBER OF POSITIONS ARE CORRECT print,'reading data images',j endfor for j=0,no_cam-1 do begin window,j,ypos=j*150,xpos=800-640,xsize=320,ysize=128,title=DATA_TIME(image_index) +' ' + cam_index(j)+' RAW DATA' tvscl,rebin(data(*,*,j),320,128) ;WDELETE,J+6 ;WAIT,0.01 endfor ;--------- SUBTRACTION OF DARK CURRENT --------------------------- ;subtracting darks from data: data_sub=fltarr(1280,512,no_cam) for j=0,no_cam-1 do begin data_sub(*,*,j) = data(*,*,j) - ma_dark(*,*,j) endfor ;--------- END OF SUBTRACTION OF DARK CURRENT ----------------------- ;--------- BAD PIXELS CORRECTION MODULE --------------------------- ;--- replacing bad pixels value with mean of 4 nearby pixels with indices: [-1,-1],[-1,+1],[+1,-1],[+1,+1] for j=0,no_cam-1 do begin ;another trick ;in this case first calculate size of file: CLOSE,/ALL ON_IOERROR, B222 A1=' ' OPENR,1,dir+sub_dir+'bad_pxl_'+cam_index(j)+'.txt' FOR I=0,999 DO READF,1,A1 B222: no_bad=I CLOSE,1 ;PRINT,no_bad ON_IOERROR,NULL ;then creating array with corresponding size: bad_pxl = lonarr(no_bad) ;finally read the file again: openr,1,dir+sub_dir+'bad_pxl_'+cam_index(j)+'.txt' readf,1,bad_pxl close,1 if size(bad_pxl,/n_elements) ne 1 and bad_pxl(0) ne -1 then begin bad_col = bad_pxl mod 1280 bad_row = bad_pxl / 1280 ;bad_sj = [[bad_col_sj],[bad_row_sj]] print,'no_bad:',no_bad,' cam_index:',j ;print,'bad_col',bad_col ;print,'bad_row',bad_row ;jj=replicate(j,no_bad) ;print,'median values of FF:',median(ma_flat(*,*,j)) ;print,'values of bad pxls on FF:',ma_flat_ave(bad_col,bad_row,jj) ;for in=0,no_bad-1 do print,'values of bad pxls on DATA IMAGE:',data_sub(ii,bad_col(in),bad_row(in),j) ;in=0 ;print,data_sub [ ii, bad_col(in)-1:bad_col(in)+1, bad_row(in)-1:bad_row(in)+1 ,j ] ;data_calc=fltarr(1280,512) ;data_calc = data_sub(ii,*,*,j) for in=0,no_bad-1 do begin ;replacing bad pixels by the mean value of four nearby only if this is NOT the pixel on the edge ;pixels on the edge (index_col eq 0 or 1279, index_row eq 0 or 511 ) are NOT corrected IF (bad_col(in) NE 0) AND (bad_col(in) NE 1279) AND (bad_row(in) NE 0) AND (bad_row(in) NE 511) THEN BEGIN data_sub(bad_col(in),bad_row(in),j)=$ (data_sub(bad_col(in)-1,bad_row(in)+1,j)+$ data_sub(bad_col(in)-1,bad_row(in)-1,j)+$ data_sub(bad_col(in)+1,bad_row(in)+1,j)+$ data_sub(bad_col(in)+1,bad_row(in)-1,j))/4. ENDIF endfor endif else begin print,'no bad: 0 cam_index:',j ;print,'no bad pixels detected' endelse endfor ;--------- END OF BAD PIXEL CORRECTION MODULE --------------------- ;creating polynomials from coefficients x_coord = findgen(512) y_coord = findgen(1280) line_pos_poly = fltarr(512,no_cam) hair_pos_up_poly = fltarr(1280,no_cam) hair_pos_down_poly = fltarr(1280,no_cam) for i=0, no_cam-1 do begin line_pos_poly(*,i) = line_pos_coef(0,i) + x_coord*line_pos_coef(1,i) + x_coord*x_coord*line_pos_coef(2,i) hair_pos_up_poly(*,i) = hair_pos_up_coef(0,i) + y_coord*hair_pos_up_coef(1,i) + y_coord*y_coord*hair_pos_up_coef(2,i) hair_pos_down_poly(*,i) = hair_pos_down_coef(0,i) + y_coord*hair_pos_down_coef(1,i) + y_coord*y_coord*hair_pos_down_coef(2,i) endfor ;--------- CORRECTION OF SPECTRAL LINE POSITION MODULE ------------ ;--- shifting individual rows of pixels in horizontal direction to make spectral lines strictly vertical: ;note that from this moment pixels near the edge of images are not correct because they came from shifting procedure row_calc = dblarr(1280*20.) ;row_calc = dblarr(1280) row_data_sub = dblarr(1280,512,no_cam) for i=0,no_cam-1 do begin ff=0 print,'shifting rows...' for j=0,511 do begin row_calc=rebin(data_sub(*,j,i),1280*100.) j_float = double(j) ;row_shift=dblarr() ;difference = (line_pos_coef(0,i) + j_float*line_pos_coef(1,i)) - (line_pos_coef_data(0,i) + j_float*line_pos_coef_data(1,i)) ;difference = line_pos_poly ;row_shift=shift(row_calc,(-100.* difference)) ;+j_float*j_float*line_pos_coef(2,i)) ));<<<<<<<<<<<<<<<<<< row_shift=shift ( row_calc, round(-100.* (line_pos_poly(j,i)-line_pos_poly(0,i) ) ) ) row_write=rebin( row_shift,1280.) row_data_sub(*,j,i)=row_write ff=ff+1 if ff eq 100 then begin ;print,'scale:',scale,' scale_shift',scale_shift print,' difference', line_pos_poly(j,i)-line_pos_poly(0,i) ff=0 endif endfor print,'camera',i,' complete' endfor for j=0,no_cam-1 do begin window,j+6,ypos=j*150,xpos=800-320,xsize=320,ysize=128,title=cam_index(j)+' AFTER SHIFTING ROWS' tvscl,rebin(row_data_sub(*,*,j),320,128) endfor ;--------- END OF CORRECTION OF SPECTRAL LINE POSITION MODULE ----- ;--------- CORRECTION OF HAIRS POSITION MODULE ------------ ;--- tu je shiftng: ;here there is correction due to inequal coefficients in shifting columns ;coefficiets on ff and data may be different ;corrections lays in corr_pos variable hair_pos_poly = FLTARR(1280, NO_CAM) for ii=0, no_cam-1 do begin hair_pos_poly(*,ii) = (hair_pos_up_poly(*,ii) + hair_pos_down_poly(*,ii)) / 2. endfor col_calc = fltarr(512*20.) col_row_data_sub = dblarr(1280,512,no_cam) for i=0,no_cam-1 do begin ff=0 for j=0,1279 do begin col_calc=rebin(total(row_data_sub(j,*,i),1),512*20.) scale_shift = round( -20* (hair_pos_poly(j,i) - hair_pos_poly(0,i)) ) ff=ff+1 if ff eq 100 then begin ;print,'scale:',scale,' scale_shift',scale_shift print,' scale_shift',scale_shift, ' pxl shift', scale_shift / 20. ff=0 endif col_shift=shift(col_calc,scale_shift) col_cut = fltarr(512.*20.) col_cut = col_shift ;if scale le 1. then col_cut(0:size(col_shift,/n_elements)-1) = col_shift ;if scale gt 1. then col_cut = col_shift(0:512*20-1) ;print,20.*j*line_pos_coef(1,i) col_write=rebin(col_cut,512) col_row_data_sub(j,*,i)=col_write endfor print,'camera',i,' complete' endfor wait,0.5 for j=0,no_cam-1 do begin window,j+6,ypos=j*150,xpos=800-320,xsize=320,ysize=128,title=cam_index(j)+' AFTER SHIFTING ROWS AND COLS' tvscl,rebin(col_row_data_sub(*,*,j),320,128) endfor ;--------- HARD FLAT FIELDING ---------------------------------------: ;SET VALUE ON FF OF SJ TO 0 OF EACH COLUMN IN THE PLACES OF HAIRS DUE TO FURTHER EXISTENCE OF DARK HAIR ON REDUCTED DATA: FOR J=0, 1279 DO BEGIN POS_OF_HAIR_DOWN = hair_pos_down_coef(0,0) ;+ J*hair_pos_down_coef(1,0) POS_OF_HAIR_UP = hair_pos_up_coef(0,0) ;+ J*hair_pos_up_coef(1,0) col_row_data_sub(J,POS_OF_HAIR_DOWN:POS_OF_HAIR_DOWN,0) = 0. col_row_data_sub(J,POS_OF_HAIR_UP :POS_OF_HAIR_UP,0) = 0. ENDFOR FOR I=0,511 DO BEGIN LINE_POS = ROUND(LINE_POS_COEF(0,0));+ I*LINE_POS_COEF(1,0) col_row_data_sub(LINE_POS-1:LINE_POS+1,I,0) = 0. ENDFOR HARD_DATA = FLTARR(1280,512,NO_CAM) PXL_SHIFT_ROUND = fltarr(NO_CAM) for j=0,no_cam-1 do begin PXL_SHIFT_ROUND(j) = ceil ( max ( abs ( x_coord*line_pos_coef(1,j) + x_coord*x_coord*line_pos_coef(2,j) ) ) ) endfor for j=0,no_cam-1 do begin HARD_DATA(PXL_SHIFT_ROUND(J):1279-PXL_SHIFT_ROUND(J),*,J) = $ col_row_data_sub(PXL_SHIFT_ROUND(J):1279-PXL_SHIFT_ROUND(J),*,J) / $ hard_flat(PXL_SHIFT_ROUND(J):1279-PXL_SHIFT_ROUND(J),*,J) endfor for j=0,no_cam-1 do begin window,j+6,ypos=j*150,xpos=800-320,xsize=320,ysize=128,title=cam_index(j)+' AFTER HARD FLAT' tvscl,rebin(HARD_DATA(*,*,j),320,128) endfor ;for j=0,no_cam-1 do begin ;window,j,ypos=j*150,xpos=j*75,xsize=320*4,ysize=128*4,title=cam_index(j)+' AFTER HARD FLAT' ;tvscl,HARD_DATA(*,*,j) ;endfor ;------------------------------ ;--------- END OF CORRECTION OF HAIRS POSITIONS MODULE ------------ ;--------- (ROW) FLAT FIELDING DATA IMAGES ------------------------------ ;SET VALUE ON FF TO 4095 OF EACH COLUMN IN THE PLACES OF HAIRS DUE TO FURTHER EXISTENCE OF DARK HAIR ON REDUCTED DATA: FOR I=1,NO_CAM-1 DO BEGIN POS_OF_HAIR_DOWN = hair_pos_down_coef(0,I) POS_OF_HAIR_UP = hair_pos_up_coef(0,I) ROW_FLAT(*,POS_OF_HAIR_DOWN,I) = 4095. ROW_FLAT(*,POS_OF_HAIR_UP ,I) = 4095. ENDFOR row_hard_data = dblarr(1280,512,no_cam) row_hard_data_full = dblarr(1280,512,no_cam) ;comfort: row_hard_data(*,*,0) = hard_data(*,*,0) for j=1,no_cam-1 do begin row_hard_data_full(*,*,j) = hard_data(*,*,j) / row_flat(*,*,j) ;;;tutu null_edge = 3*ceil(abs(pxl_shift(j))) row_hard_data(null_edge:1279-null_edge,*,j)=row_hard_data_full(null_edge:1279-null_edge,*,j) print,'camera:', j, ' complete' endfor for j=0,no_cam-1 do begin window,j+12,ypos=j*150,xpos=800,xsize=320,ysize=128,title=cam_index(j)+' FF-ED DATA '+ $ STRCOMPRESS( string(image_index+2-first_FILE_INDEX) +'/'+ string( last_file_INDEX - first_FILE_INDEX+1),/REMOVE_ALL) tvscl,rebin(row_hard_data(*,*,j),320,128) endfor ;for j=1,no_cam-1 do begin ;window,j,ypos=j*150,xpos=j*75,xsize=320*4,ysize=128*4,title=cam_index(j)+$ ;' .:: AFTER HARD AND ROW FLAT ::. '+'CURRENT IMAGE:'+string(image_index)+'/'+string(no_N(0)-1) ;tvscl,row_hard_data(*,*,j) ;endfor ;MENU,['YES','QUIT'],LETR,TITLE='CONTINUE?',BUTSIZE=800 ; IF (LETR EQ 1) THEN ; IF (LETR EQ 2) THEN GOTO,KONIEC ;--------- END OF (1) FLAT FIELDING IMAGES ---------------------------- ; SAVING IMAGES: for j=0, no_cam-1 do begin name_length=strlen(filelist_N[j,image_index]) slash_pos=strpos(filelist_N[j,image_index],'\', /REVERSE_SEARCH ) rev_slash_pos = name_length - slash_pos write_name=strmid(filelist_N[j,image_index],slash_pos+1, rev_slash_pos) write_path=strmid(filelist_N[j,image_index],0,slash_pos)+'\reduced_data\' write_len =strlen(write_name) write_name=strmid(write_name,0, write_len-4) write_name=strcompress(write_name + '_R.fit') write_name=write_path + write_name to_write = float(row_hard_data(*,*,j)) fff = READFITS(filelist_N[j,image_index],header) UPH = HAIR_POS_UP_COEF(0,J); + PXL_SHIFT_ROUND(J) DOH = HAIR_POS_DOWN_COEF(0,J); + PXL_SHIFT_ROUND(J) ;45678901234567890123456789012345678901234567890 FXADDPAR,HEADER,'UPHAIR',UPH, 'y position of top hair on the image [pxl] MZ' FXADDPAR,HEADER,'DOWNHAIR',DOH,'y position of bottom hair on the image [pxl]MZ' ;stop writefits,write_name,to_write,HEADER ;writefits, filelist_N[j,image_index], ff_2_data(*,*,j) endfor ;--------- END OF (2) FLAT FIELDING IMAGES ---------------------------- print, 'PXL_SHIFT_ROUND: ', PXL_SHIFT_ROUND print, 'CURRENT IMAGE:',image_index,'/',no_N(0)-1 IF PROCESS_ALL EQ 1 THEN BEGIN IF IMAGE_INDEX EQ LAST_FILE_INDEX-1 THEN GOTO, KONIEC ENDIF endfor print,'SUCCES' KONIEC: MENU,['OK'],LETR_METHOD,TITLE='The end of job of --- 1_DATA --- program. Execute --- 2_ANAL --- program',BUTSIZE=600, YOFFSET=400, XOFFSET=200 FOR I=0,NO_CAM-1 DO WDELETE,I FOR I=0+6,NO_CAM-1+6 DO WDELETE,I FOR I=0+12,NO_CAM-1+12 DO WDELETE,I print,'END OF JOB' end