pro go_ssc_batch, time0, time1, days=days, year=year,                   $
   release=release, online=online, submit=submit, debug=debug,          $ 
   prefix=prefix, nimages=nimages, beta=beta, ssc_topdir=ssc_topdir,    $ 
   job_description=job_description,                                     $
;         ---- mk_ssc processing options ---
   scatter=scatter, vignettee=vignette, destreak=destreak,  $
   second=second  , nonormalize=nonormalize, synsfc=synsfc, $

;         ---- optional $ydb beta dbase use flags ---     
   sdc_beta=sdc_beta, sfc_beta=sfc_beta, att_beta=att_beta, $
   fem_beta=fem_beta, syncoeff_beta=syncoeff_beta

;+
;   Name: mk_ssc_batch
;
;   Purpose: generate and optionally submit a customized mk_ssc batch job
;
;   Input Paramters:
;      time0 - start day of desired time range 
;      time1 - stop day of desired time range 
;      
;   Keyword Paramters:
;      DAYS - vector of one or more days (in leiu of time0/time1 range)
;      SUBMIT - (switch) - if set, submit the job ~now via ssw_batch
;      YEAR   - do full year (ex: YEAR=1991) in leiu of time range or DAYS
;      nimages - for testing only, number of images/day to process
;                (generally used for infrastructure TESTING only)
;                For example, NIMAGES=5 only does 1st 5 images of each DAY
;      beta - (switch) - use $YOARCH/ssc_beta instead of $YOARCH/ssc
;                        (only software/yohkoh accounts - ignored for others)
;      ssc_topdir - optional full path for output SSC parents - defaults
;                   derived from $SSW_YOARCH and user info 
;      release - (switch) if set, use 'release' online area instead of user-personal area
;      online  - (siwtch) - synonym for /RELEASE (only authorized users allowed)
;      prefix - optional prefix for output files; default is 'ssc'
;      JOB_DESCRIPTION - optional descriptive buzzword to innclude in job/log
;                        derived JobNames (used for *pro and *log names)
;         JobName> USER_yyyymmdd_hhmm +  _JOB_DESCRIPTION   + {.pro,.log}
;                  |                |    |^^^^^^^^^^^^^^^              
;                  | --Derived------|    |-- Optional --|     
;                  |user+time of run|    | Default=null |
;    
;      ---- mk_ssc processing control ----
;      vignette - (switch)     if set, ENABLE vignette
;      scatter  - (switch)     if set, ENABLE scatter correction
;      destreak - (switch)     if set, ENABLE destreak
;      second   - (switch)     if set, ENABLE second order leak correction
;      nonormalize - (switch)  if set, DISABLE SSC normalization (DN/S/Pixel)
;      clean - (switch)        if set, ENABLE despiking
;      --------------------------------------------------------
;
;      ------ xxx_beta switches for overriding released ydb input dbases
;      sfc_beta -      NN -> version of $SSWDB/ydb_beta/sfc_NN
;      sdc_beta -      NN -> version of $SSWDB/ydb_beta/sdc_NN
;      att_beta -      NN -> version of $SSWDB/ydb_beta/att_NN
;      fem_beta -      NN -> version of $SSWDB/ydb_beta/fem_NN
;      syncoeff_beta - NN -> version of $SSWDB/ydb_beta/synsfc_NN
;      ----------------------------------------------------------
;
;   Calling Sequence:
;   IDL> go_ssc_batch,t0,t1 [,processing flags] [,B-ydb flags][,SUBMIT]      
;
;   Calling Examples:
;        ------ defaults for time range & run -----
;   IDL> go_ssc_batch,'1-mar-1997','10-mar-1997',/SUBMIT     - all defaults
;
;        -----  add 2nd order leak, use ydb_beta SFC version 2   
;   IDL> go_ssc_batch,'1-mar-1997','10-mar-1997',/SECOND, SFC_BETA=2,/SUB

;        ----- discrete DAYS vector instead of contiguious time range ---
;   IDL> go_ssc_batch,DAYS=['1-sep-2000','15-nov-1999'],/SUBMIT
;
;   IDL> go_ssc_batch,YEAR=1992,/SUBMIT,/SECOND         ; do full year
;
;        ----- mission long run --------------
;   IDL> go_ssc_batch,get_yo_dates(/launch), $
;           last_nelem(get_yo_dates(/ent)),/sub,/second,job_desc='MISSION'
;
;   History:
;      5-Mar-2003 - S.L.Freeland 
;      7-Mar-3003 - S.L.Freeland add OUT param to batch cmd spawn
;                   (avoid some kind of frozen pipe on some Linux)
;                   Add YEAR keyword and function
;     18-Apr-2003 - S.L.Freeland added /ONLINE and /RELEASE (synonyms)
; 
;-
beta=keyword_set(beta)                   ; ssc beta subdir
debug=keyword_set(debug)
online=keyword_set(online) or keyword_set(release)  ; override user check for ->release?

; verify authorized user
user=(get_user())(0)
release_users=str2arr('software,yohkoh' + (['',',slater,freeland'])(online))
private_users=str2arr('acton,freeland,lemen,nitta,metcalf,slater')

if online then begin
   if is_member(user,release_users) then box_message,'Using released SSC area' else $
      box_message,'User: ' + user(0) + ' is not authorized to write to release ssc area'
endif

; define user dependent subdirectory
case 1 of 
   is_member(user,release_users): subdir='ssc' + (['','_beta'])(beta)
   is_member(user,private_users): subdir='ssc_'+user
   else: begin
      box_message,['User> ' + user + ' is not authorized to run this driver;', $
                   'Contact software@isass0.solar.isas.ac.jp for permission']
      return
   endelse
endcase

fscat   =(['',',/scatter'])(keyword_set(scatter))          ; def NO
fvign   =(['',',/vignette'])(keyword_set(vignette))        ; def NO
f2nd    =(['',',/no_second'])(1-keyword_set(second))       ; def YES
fnonorm =(['',',/nonormalize'])(keyword_set(nonormalize))  ; def YES
fclean  =(['',',/clean'])(keyword_set(clean))              ; def YES
fscat   =(['',',/destreak'])(keyword_set(destreak))        ; def NO

sscflags=arr2str([fscat,fvign,f2nd,fnonorm,fclean,fscat],'')

if data_chk(job_description,/string) then begin  
   job_desc='_'+strcompress(str_replace(job_description,' ','_'),/remove)
endif else begin  
   if keyword_set(year) then job_desc='_YEAR_'+string(year,format='(i4.4)') else $
   job_desc=''
endelse

jobname=user+'_'+time2file(ut_time()) + job_desc

     
yoarch=get_logenv('SSW_YOARCH')
if yoarch eq '' then yoarch=curdir()
if n_elements(ssc_topdir) eq 0 then ssc_topdir=concat_dir(yoarch,subdir)
ssc_topdir=ssc_topdir(0)

if not file_exist(ssc_topdir) then begin 
   box_message,'SSC output directory> ' + ssc_topdir + ' does not exist...'
   yesnox,'Try to create it now?',resp
   if resp then begin
      spawn,['mkdir','-p',ssc_topdir],/noshell
      if not file_exist(ssc_topdir) then begin 
         box_message,'Problem with directory creation, returning...'
      endif
   endif  else begin
      box_message,'Returning with no action...
      return
   endelse
endif
 
if not write_access(ssc_topdir) then begin 
   box_message,'You do not have write permission to ' + ssc_topdir(0)
   return
endif 

sscsubdirs=[string(indgen(11)+1991,format='(i4.4)'),'jobs','logs']
fulldirs=concat_dir(ssc_topdir,sscsubdirs)

for i=0,n_elements(fulldirs)-1 do begin 
   spawn,['mkdir','-p',fulldirs(i)],/noshell
endfor

probdirs=where(1-file_exist(fulldirs),pcnt)

if pcnt gt 0 then begin 
   box_message,['Problem creating on or more subdirectories:',$
        fulldirs(probdirs), 'Contact software@isass0.solar.isas.ac.jp']
   return
endif 

jobdir=concat_dir(ssc_topdir,'jobs')
logdir=concat_dir(ssc_topdir,'logs')

case 1 of 
   keyword_set(year): begin 
      yyyy=string(year,format='(I4.4)')
      t0='1-jan-'+ yyyy
      t1='31-dec-'+ yyyy
   endcase
   n_params() eq 2: begin
      t0=anytim(time0,/vms,/date_only)
      t1=anytim(time1,/vms,/date_only)
   endcase
   n_params() eq 1: begin 
      t0=anytim(time0,/vms,/date_only)
      t1=anytim(reltime(time0,/days),/vms,/date_only)
   endcase 
   keyword_set(days): begin 
      daydata=anytim(days,/vms,/date_only)
   endcase
   else: begin 
      box_message,'Must supply either time, time-range or DAYS keyword'
      return
   endcase
endcase 

   
; generate beta-dbase lines
bdbs=''
ydbb=concat_dir('$SSWDB','ydb_beta')

benv=str2arr('DIR_GEN_ATT,DIR_GEN_FEM,DIR_SXT_SFC,DIR_SXT_SDC,DIR_SXT_SYNSFC')
bsets=strlowcase(str2cols(benv,'_',/trim))    
strtab2vect,bsets,a,b,bset

bdbstr=''
for i=0,n_elements(bset)-1 do begin
   btest=bset(i)+'_beta' 
   estat=execute('chkbeta=keyword_set('+btest+')')
   if chkbeta then begin 
       estat=execute('version='+btest)
       bpath=concat_dir(ydbb,bset(i)+'_'+string(version,format='(i2.2)'))
       bdbstr=[bdbstr,$
          "set_logenv,'"+benv(i)+"','" + bpath+"'" ]
   endif
endfor
 
;set_logenv,'DIR_SXT_SSC',sscdir             ; SSC OUTPUT parent 
badlog=logdir

level0_locs=[concat_dir(yoarch,'weekdirs'),             $  ; environmental? 
             '/net/castor/db1/sswarch/yoarch/weekdirs' , $  ; lmsal 
             '/disk/pd1/weekdirs']                         ; msu

whichl0=where(file_exist(level0_locs),sscnt)
if sscnt eq 0 then begin              
   box_message,'Cannot find Level0 ($SSW_YOARCH) - please set and retry'
   return
endif

level0_parent=level0_locs(whichl0(0))
 
; define day vector setup
case 1 of
   n_elements(daydata) gt 0: begin                ; make/use day-data file
      dayfile=concat_dir(logdir,jobname+'_days.dat')
      pr_status,caller='go_ssc_batch',info,/idlcomment
      file_append,dayfile,info,/new
      file_append,dayfile, daydata
      tinfo='DAYFILE="'+dayfile+'"'
   endcase
   else: begin 
      tinfo=["time0='" + t0 + "'", "time1='" + t1 + "'"]
   endcase
endcase

ssctemp='$SSW/yohkoh/gen/galileo/idl/lmsal/go_mk_ssc_temp.pro'

if not file_exist(ssctemp) then begin 
   box_message,'Cannot find SSC batch template file...'
   return
endif

if not data_chk(prefix,/string,/scaler) then prefix='ssc'

tempdata=rd_tfile(ssctemp)
synsfc=(['','1'])(keyword_set(synsfc))
newdata=str_replace(tempdata,'LEVEL0_PARENT',level0_parent)
newdata=str_replace(newdata,'SYNSFC',synsfc)
newdata=str_replace(newdata,'SSC_TOPDIR',ssc_topdir)
newdata=str_replace(newdata,'PREFIX',prefix)
newdata=str_replace(newdata,'MK_SSC,','mk_ssc'+sscflags+',') 

box_message,'mk_ssc flags>> ' + sscflags

pr_status,caller='go_ssc_batch',info,/idlcomment
ssinfo=''
if n_elements(nimages) gt 0 then ssinfo='ss='+strtrim(nimages(0),2)
envinfo='pr_env,/gen_fem,/gen_att,/sxt_sdc,/sxt_sfc'
pre_curpath='ssw_path,"'+curdir()+'",/prepend'           ; include pwd SW 
newdata=[info,pre_curpath,bdbstr,tinfo,ssinfo,envinfo,newdata]

; write job file
jobfile=concat_dir(jobdir,jobname+'.pro')
file_append,jobfile,newdata,/new
if file_exist(jobfile) then begin
   box_message,['Wrote jobfile: ', jobfile]
endif else begin 
   box_message,['Problem writing jobfile',jobfile]
   return 
endelse

; Optionally submit job via ssw_batch
if keyword_set(submit) then begin 
   logfile=concat_dir(logdir,jobname+'.log')
   sswbatch=concat_dir('$SSW_BIN','ssw_batch')
   cdir=curdir()
   ssw_path,cdir,/prepend          ; assume you want current path
   pushd,cdir                      ; save current pwd
   cd,jobdir                       ; move to new job location
   batch_cmd=arr2str(['nohup',sswbatch,jobname,logfile,'&'],' ')
   spawn,batch_cmd,out             ; spawn the command
   popd

   print,"============================================================"
   print,"Job Submitted"
   print,jobname
   print,''
   print,'Output Logging to:'
   print,logfile
   print,"=============================================================" 
endif
   
   
if debug then stop,'before return'
;                                                         


end
