diff --git a/config/cfg.py b/config/cfg.py
index 95cb111b70eed47eb67a2d05e88ec95728ab46e3..bc05e618aa9cb709cb8453bda0b17caf0b315382 100755
--- a/config/cfg.py
+++ b/config/cfg.py
@@ -17,24 +17,31 @@ exp.n_nodes = 10
 
 n_obs = 1600  # radar: n_obs for each observation height level
 
-vis = dict(kind='MSG_4_SEVIRI_BDRF',
+vis = dict(plotname='VIS 0.6µm',  plotunits='[1]',
+           kind='MSG_4_SEVIRI_BDRF',
            sat_channel=1, n_obs=n_obs, err_std=0.03,
            cov_loc_radius_km=20)
-wv73 = dict(kind='MSG_4_SEVIRI_TB',
-          sat_channel=6, n_obs=n_obs, err_std=False,
-          cov_loc_radius_km=20)
-ir108 = dict(kind='MSG_4_SEVIRI_TB',
+wv73 = dict(plotname='Brightness temperature WV 7.3µm',  plotunits='[K]',
+            kind='MSG_4_SEVIRI_TB',
+            sat_channel=6, n_obs=n_obs, err_std=False,
+            cov_loc_radius_km=20)
+ir108 = dict(plotname='Brightness temperature IR 10.8µm', plotunits='[K]',
+             kind='MSG_4_SEVIRI_TB',
              sat_channel=9, n_obs=n_obs, err_std=5.,
              cov_loc_radius_km=20)
 
-radar = dict(kind='RADAR', n_obs=n_obs, err_std=5.,
+radar = dict(plotname='Radar reflectivity', plotunits='[dBz]',
+             kind='RADAR', 
+             n_obs=n_obs, err_std=5.,
              heights=np.arange(1000, 15001, 1000),
              cov_loc_radius_km=10, cov_loc_vert_km=2)
 
-t2m = dict(kind='SYNOP_TEMPERATURE', n_obs=n_obs, err_std=1.0, 
+t2m = dict(plotname='SYNOP Temperature', plotunits='[K]',
+           kind='SYNOP_TEMPERATURE', n_obs=n_obs, err_std=1.0, 
            cov_loc_radius_km=32, cov_loc_vert_km=1)
-psfc = dict(kind='SYNOP_SURFACE_PRESSURE', n_obs=n_obs, err_std=50.,
-           cov_loc_radius_km=32, cov_loc_vert_km=5)
+psfc = dict(plotname='SYNOP Pressure', plotunits='[dBz]',
+            kind='SYNOP_SURFACE_PRESSURE', n_obs=n_obs, err_std=50.,
+            cov_loc_radius_km=32, cov_loc_vert_km=5)
 
 
 exp.observations = [ir108, wv73, vis]
diff --git a/scheduler.py b/scheduler.py
index 632a25d628a16f33ce81ce5723fefa15899c576f..8e4e93059d1c817eed3e635bab683831da3b390c 100755
--- a/scheduler.py
+++ b/scheduler.py
@@ -58,7 +58,7 @@ def backup_scripts():
 
     # reproducibility
     for f in ['scheduler.py', 'config/clusters.py', 'config/cfg.py']:
-        func(current+'/../'+f,  main_a+'/scheduler.py', shutil.copy)
+        func(current+'/../'+f,  main_a+f, shutil.copy)
         
     for f in os.listdir(current):
         func(os.path.join(current, f), main_a+'/', shutil.copy)
@@ -230,7 +230,7 @@ timedelta_btw_assim = dt.timedelta(minutes=30)
 backup_scripts()
 id = None
 
-start_from_existing_state = True
+start_from_existing_state = False
 is_new_run = not start_from_existing_state
 
 if is_new_run:
diff --git a/scripts/apply_obs_op_dart.py b/scripts/apply_obs_op_dart.py
old mode 100644
new mode 100755
index f235ad67f97e548b707bf639a4f9070d2a6f799f..23367ecd1bb5a2395254e8cd35c1e1ce3ffd0c17
--- a/scripts/apply_obs_op_dart.py
+++ b/scripts/apply_obs_op_dart.py
@@ -27,12 +27,10 @@ if __name__ == '__main__':
     pre_assim.run(time, prev_forecast_init, exppath_firstguess)
 
     savedir = cluster.archivedir()+'/obs_seq_final_1min/'
-    mkdir(savedir)
 
     n_stages = len(exp.observations)
     for istage, obscfg in enumerate(exp.observations):
 
-        kind = obscfg['kind']
         n_obs = obscfg['n_obs']
         sat_channel = obscfg.get('sat_channel', False)
         obscfg['folder_obs_coords'] = False
@@ -50,9 +48,10 @@ if __name__ == '__main__':
         wrfout_add_geo.run(cluster.dartrundir+'/geo_em.d01.nc',
                            cluster.dartrundir+'/wrfout_d01')
         aso.run_perfect_model_obs()
-        aso.assimilate(nproc=48)
+        aso.assimilate(nproc=96)
 
-        archive_stage = savedir+kind
         # only the prior state values are of interest in this file
-        aso.archive_diagnostics(archive_stage, time.strftime('/%Y-%m-%d_%H:%M_obs_seq.final'))
+        # observation and truth is wrong in this file (dummy)
+        archive_stage = savedir+'/assim_stage'+str(istage)
+        aso.archive_diagnostics(archive_stage, time)
 
diff --git a/scripts/assim_synth_obs.py b/scripts/assim_synth_obs.py
index e97d3b73394a6033fb179c7f5f66731ae249c297..585b41c98722555f0ad517036b827758feeffd21 100755
--- a/scripts/assim_synth_obs.py
+++ b/scripts/assim_synth_obs.py
@@ -106,7 +106,7 @@ def set_DART_nml(sat_channel=False, cov_loc_radius_km=32, cov_loc_vert_km=False,
         rttov_nml = cluster.scriptsdir+'/../templates/obs_def_rttov.IR.nml'
         append_file(cluster.dartrundir+'/input.nml', rttov_nml)
 
-def obs_operator_ensemble():
+def obs_operator_ensemble(istage):
     # assumes that prior ensemble is already linked to advance_temp<i>/wrfout_d01
     print('running obs operator on ensemble forecast')
     os.chdir(cluster.dartrundir)
@@ -122,8 +122,9 @@ def obs_operator_ensemble():
             # DART may need a wrfinput file as well, which serves as a template for dimension sizes
             symlink(cluster.dartrundir+'/wrfout_d01', cluster.dartrundir+'/wrfinput_d01')
             
-            # add geodata
-            wrfout_add_geo.run(cluster.dartrundir+'/geo_em.d01.nc', cluster.dartrundir+'/wrfout_d01')
+            # add geodata, if istage>0, wrfout is DART output (has coords)
+            if istage == 0:
+                wrfout_add_geo.run(cluster.dartrundir+'/geo_em.d01.nc', cluster.dartrundir+'/wrfout_d01')
 
             # run perfect_model obs (forward operator)
             os.system('mpirun -np 12 ./perfect_model_obs > /dev/null')
@@ -182,7 +183,7 @@ def run_perfect_model_obs():
     try_remove(cluster.dartrundir+'/obs_seq.out')
     if not os.path.exists(cluster.dartrundir+'/obs_seq.in'):
         raise RuntimeError('obs_seq.in does not exist in '+cluster.dartrundir)
-    os.system('mpirun -np 12 ./perfect_model_obs')
+    os.system('mpirun -np 12 ./perfect_model_obs > log.perfect_model_obs')
 
 def assimilate(nproc=96):
     print('running filter')
@@ -190,13 +191,14 @@ def assimilate(nproc=96):
     try_remove(cluster.dartrundir+'/obs_seq.final')
     if not os.path.exists(cluster.dartrundir+'/obs_seq.out'):
         raise RuntimeError('obs_seq.out does not exist in '+cluster.dartrundir)
-    os.system('mpirun -genv I_MPI_PIN_PROCESSOR_LIST=0-'+str(int(nproc)-1)+' -np '+str(int(nproc))+' ./filter')
+    os.system('mpirun -genv I_MPI_PIN_PROCESSOR_LIST=0-'+str(int(nproc)-1)+' -np '+str(int(nproc))+' ./filter > log.filter')
 
 def archive_diagnostics(archive_dir, time):
     print('archive obs space diagnostics')
     mkdir(archive_dir)
-    copy(cluster.dartrundir+'/obs_seq.final', 
-         archive_dir+time.strftime('/%Y-%m-%d_%H:%M_obs_seq.final'))
+    fout = archive_dir+time.strftime('/%Y-%m-%d_%H:%M_obs_seq.final')
+    copy(cluster.dartrundir+'/obs_seq.final', fout)
+    print(fout, 'saved.')
 
     # try:  # what are regression diagnostics?!
     #     print('archive regression diagnostics')
@@ -258,8 +260,7 @@ if __name__ == "__main__":
     n_stages = len(exp.observations)
     for istage, obscfg in enumerate(exp.observations):
 
-        kind = obscfg['kind']
-        archive_stage = archive_time + '/assim_stage'+str(istage)+'_'+kind
+        archive_stage = archive_time + '/assim_stage'+str(istage)
         n_obs = obscfg['n_obs']
         sat_channel = obscfg.get('sat_channel', False)
         obscfg['folder_obs_coords'] = archive_stage+'/obs_coords.pkl'
@@ -276,7 +277,7 @@ if __name__ == "__main__":
             osq.create_obsseq_in(time, obscfg, zero_error=True)  # zero error to get truth vals
 
             Hx_nat = obs_operator_nature(time) 
-            Hx_prior = obs_operator_ensemble()  # files are already linked to DART directory
+            Hx_prior = obs_operator_ensemble(istage)  # files are already linked to DART directory
             
             obscfg['err_std'] = calc_obserr_WV73(Hx_nat, Hx_prior)
         else:
@@ -287,7 +288,7 @@ if __name__ == "__main__":
         run_perfect_model_obs()
 
         assimilate()
-        dir_obsseq = cluster.archivedir()+'/obs_seq_final/assim_stage'+str(istage)+'_'+kind
+        dir_obsseq = cluster.archivedir()+'/obs_seq_final/assim_stage'+str(istage)
         archive_diagnostics(dir_obsseq, time)
 
         if istage < n_stages-1:
diff --git a/scripts/run_obs_diag.py b/scripts/run_obs_diag.py
index 4710f5bf5c7b8fbddb1041bd59934bb55f369d37..f3e82c4621508ed09f196a8b7e4d043ea3d69488 100644
--- a/scripts/run_obs_diag.py
+++ b/scripts/run_obs_diag.py
@@ -45,11 +45,11 @@ def run_obsdiag(filepaths, f_out='./obsdiag.nc'):
         os.system('./obs_diag >& obs_diag.log')  # caution, this overwrites obs_seq_to_netcdf
 
         # move output to archive
-        #outdir = outdir #'/'.join(folder_obs_seq_final.split('/')[:-1])
+        #outdir = os.path.dirname(f_out)  #'/'.join(folder_obs_seq_final.split('/')[:-1])
         if obserr_iszero == '.true.':
-            fout = outdir+'/'+f_out[:-3]+'_wrt_truth.nc'   
+            fout = f_out[:-3]+'_wrt_truth.nc'   
         elif obserr_iszero == '.false.':
-            fout = outdir+'/'+f_out[:-3]+'_wrt_obs.nc' 
+            fout = f_out[:-3]+'_wrt_obs.nc' 
         shutil.move(rundir_program+'/obs_diag_output.nc', fout)
         print(fout, 'saved.')
 
@@ -59,6 +59,7 @@ def run_obs_seq_to_netcdf(filepaths, f_out='./obs_epoch.nc'):
     write_input_filelist(filepaths)
     print('------ running obs_seq_to_netcdf program')
     shutil.copy(cluster.dart_srcdir+'/obs_seq_to_netcdf-bak', rundir_program+'/obs_seq_to_netcdf')
+    os.chdir(rundir_program)
     os.system('./obs_seq_to_netcdf  >& obs_seq_to_netcdf.log')  # caution, overwrites its own binary?!
     shutil.move(rundir_program+'/obs_epoch_001.nc', f_out)
     print(f_out, 'saved.')
diff --git a/scripts/wrfout_add_geo.py b/scripts/wrfout_add_geo.py
index 81dfb4c091dff5df343a256123a1315fd4bd5b9a..14b9c177c301bc1d577ee08a0ff57883979a224d 100755
--- a/scripts/wrfout_add_geo.py
+++ b/scripts/wrfout_add_geo.py
@@ -23,9 +23,9 @@ def run(geo_data_file, wrfout_file):
 
     for old, new in zip(fields_old, fields_new):
         print('moving old field', old, 'into new field', new)
-        print(geo_ds.variables[old][:].shape, wrfinp_ds.variables[new][:].shape)
+        #print(geo_ds.variables[old][:].shape, wrfinp_ds.variables[new][:].shape)
         wrfinp_ds.variables[new][:] = geo_ds.variables[old][:]
-        print(wrfinp_ds.variables[new][:])
+        #print(wrfinp_ds.variables[new][:])
 
     wrfinp_ds.close()
     geo_ds.close()
diff --git a/templates/input.nml b/templates/input.nml
index 7051e4188c82a1e5c0462639068c8a0856d2fda0..5519f6d7829c7fb65596571b896b57889563e291 100644
--- a/templates/input.nml
+++ b/templates/input.nml
@@ -284,7 +284,7 @@
    layout = 1,
    tasks_per_node = 96
    communication_configuration = 1
-   debug                       = .true.
+   debug                       = .false.
    /
 
 &obs_def_gps_nml