diff --git a/analysis_only.py b/analysis_only.py
index 840e603c24535935856591e3850aa12d270e50ba..648d2c8c91d83a07bc7e38583016d81cb3b0dcfe 100755
--- a/analysis_only.py
+++ b/analysis_only.py
@@ -6,12 +6,12 @@ import datetime as dt
 from dartwrf.workflows import WorkFlows
 
 
-prior_path_exp = '/users/students/lehre/advDA_s2023/data/sample_ensemble/'
+prior_path_exp = '/lehre/advDA_s2023/data/sample_ensemble/'
 prior_init_time = dt.datetime(2008,7,30,12)
 prior_valid_time = dt.datetime(2008,7,30,13)
 assim_time = prior_valid_time
 
-w = WorkFlows(exp_config='exp_template.py', server_config='srvx1.py')
+w = WorkFlows(exp_config='exp_template.py', server_config='teaching.py')
 
 id = w.assimilate(assim_time, prior_init_time, prior_valid_time, prior_path_exp)
 
diff --git a/config/exp_template.py b/config/exp_template.py
index 07247d7bc7265df4acae16e4800290dedc84b9b2..1aaa091a4303f6d1d2ba8424de1ed56ac9b2fe86 100755
--- a/config/exp_template.py
+++ b/config/exp_template.py
@@ -5,13 +5,13 @@ Copy and customize it as you wish.
 from dartwrf.utils import Experiment
 
 exp = Experiment()
-exp.expname = "exp_test"
+exp.expname = "exp_2"
 exp.model_dx = 2000
-exp.n_ens = 4
+exp.n_ens = 40
 exp.do_quality_control = False
 
 # Path to the nature run. From there, observations are generated. Wildcards "*" are allowed in this path.
-exp.nature_wrfout_pattern = '/users/students/lehre/advDA_s2023/data/sample_nature/wrfout_d01_%Y-%m-%d_%H:%M:%S'
+exp.nature_wrfout_pattern = '/lehre/advDA_s2023/data/sample_nature/wrfout_d01_%Y-%m-%d_%H:%M:%S'
 
 # Path to sounding profiles for ensemble initialization. Not used in the Advanced DA course.
 exp.input_profile = '/mnt/jetfs/home/lkugler/data/initial_profiles/wrf/ens/2022-03-31/raso.fc.<iens>.wrfprof'
@@ -31,7 +31,7 @@ exp.dart_nml = {'&assim_tools_nml':
                             output_members='.true.',
                             output_mean='.true.',
                             output_sd='.true.',
-                            stages_to_write='output',
+                            stages_to_write=['output', 'preassim', 'postassim'],
                         ),
                 '&quality_control_nml':
                     dict(outlier_threshold='-1',
diff --git a/config/original_exp_template.py b/config/original_exp_template.py
new file mode 100755
index 0000000000000000000000000000000000000000..9fb12c4e45335746aa699dadde52f072dc7e1edc
--- /dev/null
+++ b/config/original_exp_template.py
@@ -0,0 +1,178 @@
+"""
+This configuration file is designed for the course Advanced Data Assimilation at the University of Vienna.
+Copy and customize it as you wish.
+"""
+from dartwrf.utils import Experiment
+
+exp = Experiment()
+exp.expname = "exp_test11"
+exp.model_dx = 2000
+exp.n_ens = 10
+exp.do_quality_control = False
+
+# Path to the nature run. From there, observations are generated. Wildcards "*" are allowed in this path.
+exp.nature_wrfout_pattern = '/lehre/advDA_s2023/data/sample_nature/wrfout_d01_%Y-%m-%d_%H:%M:%S'
+
+# Path to sounding profiles for ensemble initialization. Not used in the Advanced DA course.
+exp.input_profile = '/mnt/jetfs/home/lkugler/data/initial_profiles/wrf/ens/2022-03-31/raso.fc.<iens>.wrfprof'
+
+# Configuration of DART. For details see the DART or DART-WRF documentation.
+exp.dart_nml = {'&assim_tools_nml':
+                    dict(filter_kind='1',
+                        sampling_error_correction='.true.',
+                        ),
+                '&filter_nml':
+                    dict(   ens_size=exp.n_ens,
+                            num_output_state_members=exp.n_ens,
+                            num_output_obs_members=exp.n_ens,
+                            inf_flavor=['0', '4'],
+                            inf_initial=[1.04, 0.5],
+                            inf_initial_from_restart='.false.',
+                            output_members='.true.',
+                            output_mean='.true.',
+                            output_sd='.true.',
+                            stages_to_write='output',
+                        ),
+                '&quality_control_nml':
+                    dict(outlier_threshold='-1',
+                        ),
+                '&obs_def_radar_mod_nml':
+                    dict(apply_ref_limit_to_obs      =  '.true.',
+                         reflectivity_limit_obs      =  5.0,
+                         lowest_reflectivity_obs     =  5.0,
+                         apply_ref_limit_to_fwd_op   =  '.true.',
+                         reflectivity_limit_fwd_op   =  5.0,
+                         lowest_reflectivity_fwd_op  =  5.0,
+                         microphysics_type           =  '5',
+                         ),
+                '&location_nml':
+                    dict(horiz_dist_only='.false.',
+                        ),
+                '&model_nml':
+                    dict(wrf_state_variables = 
+                        [['U',     'QTY_U_WIND_COMPONENT',     'TYPE_U',    'UPDATE','999',],
+                         ['V',     'QTY_V_WIND_COMPONENT',     'TYPE_V',    'UPDATE','999',],
+                         ['W',     'QTY_VERTICAL_VELOCITY',    'TYPE_W',    'UPDATE','999',],
+                         ['PH',    'QTY_GEOPOTENTIAL_HEIGHT',  'TYPE_GZ',   'UPDATE','999',],
+                         ['THM',   'QTY_POTENTIAL_TEMPERATURE','TYPE_T',    'UPDATE','999',],
+                         ['MU',    'QTY_PRESSURE',             'TYPE_MU',   'UPDATE','999',],
+
+                         ['QVAPOR','QTY_VAPOR_MIXING_RATIO',   'TYPE_QV',   'UPDATE','999',],
+                         ['QCLOUD','QTY_CLOUDWATER_MIXING_RATIO','TYPE_QC', 'UPDATE','999',],
+                         ['QICE',  'QTY_ICE_MIXING_RATIO',     'TYPE_QI',   'UPDATE','999',],
+                        #  ['QRAIN','QTY_RAINWATER_MIXING_RATIO','TYPE_QR', 'UPDATE','999',],
+                        #  ['QSNOW','QTY_SNOW_MIXING_RATIO','TYPE_QS', 'UPDATE','999',],
+                        #  ['QGRAUP','QTY_GRAUPEL_MIXING_RATIO','TYPE_QG', 'UPDATE','999',],
+
+                         ['CLDFRA','QTY_CLOUD_FRACTION',       'TYPE_CFRAC','UPDATE','999',],
+                         ['PSFC',  'QTY_SURFACE_PRESSURE',     'TYPE_PSFC', 'UPDATE','999',],
+                         ['T2',    'QTY_2M_TEMPERATURE',       'TYPE_T',    'UPDATE','999',],
+                         ['TSK',   'QTY_SKIN_TEMPERATURE',     'TYPE_T',    'UPDATE','999',],
+                         ['REFL_10CM','QTY_RADAR_REFLECTIVITY','TYPE_REFL', 'UPDATE','999',]],
+                         
+                        wrf_state_bounds = 
+                        [['QVAPOR','0.0','NULL','CLAMP'],
+                         ['QCLOUD','0.0','NULL','CLAMP'],
+                         ['QICE','0.0','NULL','CLAMP'],
+                         ['CLDFRA','0.0','1.0','CLAMP'],
+                         
+                        #  ['QRAIN','0.0','NULL','CLAMP'],
+                        #  ['QSNOW','0.0','NULL','CLAMP'],
+                        #  ['QGRAUP','0.0','NULL','CLAMP'],
+                         ],
+                        ),
+                '&ensemble_manager_nml':
+                   dict(layout = 1,
+                        tasks_per_node = 12,
+                        communication_configuration = 1,
+                        ),
+                }
+
+
+
+# n_obs is the number of observations
+# currently allowed values are 22500 for one observation approximately every 2km; 5776 for 4km, and 961 for 10km resolution; 256 for 20km; 121 for 30km 
+# Note for radar, n_obs is the number of observations at each observation height level
+
+# oeinf is the observation inflation factor (1 means no inflation)
+oeinf = 1
+
+vis = dict(var_name='VIS 0.6µm', unit='[1]',
+           kind='MSG_4_SEVIRI_BDRF', sat_channel=1, 
+           n_obs=961, obs_locations='square_array_evenly_on_grid',
+           # n_obs=1, obs_locations=[(44.141, -0.99)],
+           error_generate=0.03, error_assimilate=0.03*oeinf,
+           loc_horiz_km=20, 
+           #height=4000, loc_vert_km=3
+           )
+
+wv73 = dict(var_name='Brightness temperature WV 7.3µm', unit='[K]',
+            kind='MSG_4_SEVIRI_TB', sat_channel=6, 
+            n_obs=961, obs_locations='square_array_evenly_on_grid',
+            error_generate=1, error_assimilate=1*oeinf, 
+            loc_horiz_km=20, 
+            #height=7000, loc_vert_km=3
+            )
+
+wv62 = dict(var_name='Brightness temperature WV 6.2µm', unit='[K]',
+            kind='MSG_4_SEVIRI_TB', sat_channel=5, 
+            n_obs=961,  obs_locations='square_array_evenly_on_grid',
+            # n_obs=1, obs_locations=[(44.141, -0.99)],
+            error_generate=1, error_assimilate=1*oeinf, 
+            loc_horiz_km=20, 
+            #height=10000, loc_vert_km=3
+            )
+
+ir108 = dict(var_name='Brightness temperature IR 10.8µm', unit='[K]',
+             kind='MSG_4_SEVIRI_TB', sat_channel=9, 
+             n_obs=1, obs_locations='square_array_evenly_on_grid',
+             error_generate=5., error_assimilate=10.,
+             loc_horiz_km=32)
+
+radar = dict(var_name='Radar reflectivity', unit='[dBz]',
+             kind='RADAR_REFLECTIVITY', 
+             n_obs=961, obs_locations='square_array_evenly_on_grid',
+             # n_obs=2, obs_locations=[(45.332, 0.4735), (45.332, 0.53)],
+             heights=range(2000, 14001, 2000),
+             error_generate=2.5, error_assimilate=2.5*oeinf,
+             loc_horiz_km=20, loc_vert_km=3)
+
+t = dict(var_name='Temperature', unit='[K]',
+         kind='RADIOSONDE_TEMPERATURE', 
+         #n_obs=22500, obs_locations='square_array_evenly_on_grid',
+         n_obs=1, obs_locations=[(45., 0.)],
+         error_generate=0.2, error_assimilate=0.2,
+         heights=[1000,], #range(1000, 17001, 2000),
+         loc_horiz_km=50, loc_vert_km=2.5)
+
+q = dict(var_name='Specific humidity', unit='[kg/kg]',
+         kind='RADIOSONDE_SPECIFIC_HUMIDITY', n_obs=1,
+         error_generate=0., error_assimilate=5*1e-5,
+         heights=[1000], #range(1000, 17001, 2000),
+         loc_horiz_km=50, loc_vert_km=2.5)
+
+t2m = dict(var_name='SYNOP Temperature', unit='[K]',
+           kind='SYNOP_TEMPERATURE', 
+           n_obs=256, obs_locations='square_array_evenly_on_grid',
+           error_generate=0.3, error_assimilate=0.3,
+           loc_horiz_km=10, loc_vert_km=2)
+
+psfc = dict(var_name='SYNOP Pressure', unit='[Pa]',
+            kind='SYNOP_SURFACE_PRESSURE', n_obs=1, 
+            error_generate=50., error_assimilate=100.,
+            loc_horiz_km=32, loc_vert_km=5)
+
+exp.observations = [t]
+
+# the variables which will be replaced in the WRF initial conditions file
+exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'PSFC']
+#exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'PSFC']
+#exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'QRAIN', 'QSNOW', 'QGRAUP', 'PSFC']
+#exp.update_vars = ['QVAPOR', 'QCLOUD', 'QICE', 'PSFC']
+
+exp.use_existing_obsseq = False
+# exp.use_existing_obsseq='/jetfs/home/lkugler/data/sim_archive/exp_v1.22_P2_rr_WV73_obs10_loc20_oe1/obs_seq_out/%Y-%m-%d_%H:%M_obs_seq.out'
+
+
+
+
diff --git a/config/teaching.py b/config/teaching.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae45fc058670f42c22e28e6b296b7c1ffa824f7c
--- /dev/null
+++ b/config/teaching.py
@@ -0,0 +1,35 @@
+"""Cluster configuration file, see docstring of ClusterConfig class in dartwrf/utils.py for details"""
+from dartwrf import utils
+from dartwrf.exp_config import exp
+
+cluster = utils.ClusterConfig(exp)
+cluster.name = 'teaching'
+cluster.max_nproc = 6
+cluster.use_slurm = False
+
+# binaries
+cluster.python = 'python'
+cluster.python_verif = '/users/staff/lkugler/miniconda3/bin/python'
+cluster.ncks = '/headless/envs/rttov/bin/ncks'
+cluster.ideal = '' #/jetfs/home/lkugler/bin/ideal-v4.3_v1.22.exe'
+cluster.wrfexe = '' #/jetfs/home/lkugler/bin/wrf-v4.3_v1.22.exe'
+cluster.dart_modules = 'pip install scipy; '
+cluster.wrf_modules = ''
+
+# paths for data output
+cluster.wrf_rundir_base = utils.userhome+'/AdvDA/run_WRF/'  # path for temporary files
+cluster.dart_rundir_base = utils.userhome+'/AdvDA/run_DART/'  # path for temporary files
+cluster.archive_base = utils.userhome+'/data/sim_archive/'
+
+# paths used as input
+cluster.srcdir = '/users/staff/lkugler/AdvDA23/DART/WRF-4.3/run'
+cluster.dart_srcdir = '/headless/envs/DART/models/wrf/work'
+cluster.rttov_srcdir = '/headless/envs/rttov/rtcoef_rttov13/'
+cluster.dartwrf_dir = utils.userhome+'/AdvDA/DART-WRF/'
+cluster.geo_em_for_WRF_ideal = '/lehre/advDA_s2023/data/geo_em.d01.nc'
+
+# templates/run scripts
+cluster.namelist = cluster.dartwrf_dir+'/../templates/namelist.input'
+cluster.run_WRF = cluster.dartwrf_dir+'/run_ens.jet.sh'
+
+cluster.slurm_cfg = None
diff --git a/dartwrf/exp_config.py b/dartwrf/exp_config.py
index 58e71ed1b177b6febad8ad637033066a0816b91f..1aaa091a4303f6d1d2ba8424de1ed56ac9b2fe86 100644
--- a/dartwrf/exp_config.py
+++ b/dartwrf/exp_config.py
@@ -1,43 +1,52 @@
-from dartwrf import utils
-
-exp = utils.Experiment()
-exp.expname = "template_experiment"
+"""
+This configuration file is designed for the course Advanced Data Assimilation at the University of Vienna.
+Copy and customize it as you wish.
+"""
+from dartwrf.utils import Experiment
+
+exp = Experiment()
+exp.expname = "exp_2"
 exp.model_dx = 2000
 exp.n_ens = 40
-exp.superob_km = False  # False or int (spatial averaging of observations, unit: km)
-exp.do_quality_control = False  # bool
-
-# Use existing observations (path to obs_seq.out) or generate observations (False)
-exp.use_existing_obsseq = False
-#exp.use_existing_obsseq = '/users/students/lehre/advDA_s2023/dartwrf_tutorial/very_cold_observation.out'
+exp.do_quality_control = False
 
-# path from where observations can be generated
-exp.nature_wrfout_pattern = '/jetfs/home/lkugler/data/sim_archive/exp_v1.19_P3_wbub7_nat/*/1/wrfout_d01_%Y-%m-%d_%H:%M:%S'
+# Path to the nature run. From there, observations are generated. Wildcards "*" are allowed in this path.
+exp.nature_wrfout_pattern = '/lehre/advDA_s2023/data/sample_nature/wrfout_d01_%Y-%m-%d_%H:%M:%S'
 
-# for initialization profiles
+# Path to sounding profiles for ensemble initialization. Not used in the Advanced DA course.
 exp.input_profile = '/mnt/jetfs/home/lkugler/data/initial_profiles/wrf/ens/2022-03-31/raso.fc.<iens>.wrfprof'
 
-
+# Configuration of DART. For details see the DART or DART-WRF documentation.
 exp.dart_nml = {'&assim_tools_nml':
                     dict(filter_kind='1',
-                        sampling_error_correction='.false.',
-                        # obs_impact_filename='/jetfs/home/lkugler/DART-WRF/templates/impactfactor_T.txt',
+                        sampling_error_correction='.true.',
                         ),
                 '&filter_nml':
-                    dict(ens_size=exp.n_ens,
+                    dict(   ens_size=exp.n_ens,
                             num_output_state_members=exp.n_ens,
                             num_output_obs_members=exp.n_ens,
-                            inf_flavor=['0', '0'],
+                            inf_flavor=['0', '4'],
+                            inf_initial=[1.04, 0.5],
+                            inf_initial_from_restart='.false.',
                             output_members='.true.',
                             output_mean='.true.',
                             output_sd='.true.',
-                            stages_to_write='output',
+                            stages_to_write=['output', 'preassim', 'postassim'],
                         ),
-                '&quality_control_nml': 
+                '&quality_control_nml':
                     dict(outlier_threshold='-1',
                         ),
+                '&obs_def_radar_mod_nml':
+                    dict(apply_ref_limit_to_obs      =  '.true.',
+                         reflectivity_limit_obs      =  5.0,
+                         lowest_reflectivity_obs     =  5.0,
+                         apply_ref_limit_to_fwd_op   =  '.true.',
+                         reflectivity_limit_fwd_op   =  5.0,
+                         lowest_reflectivity_fwd_op  =  5.0,
+                         microphysics_type           =  '5',
+                         ),
                 '&location_nml':
-                    dict(horiz_dist_only='.true.',
+                    dict(horiz_dist_only='.false.',
                         ),
                 '&model_nml':
                     dict(wrf_state_variables = 
@@ -47,38 +56,72 @@ exp.dart_nml = {'&assim_tools_nml':
                          ['PH',    'QTY_GEOPOTENTIAL_HEIGHT',  'TYPE_GZ',   'UPDATE','999',],
                          ['THM',   'QTY_POTENTIAL_TEMPERATURE','TYPE_T',    'UPDATE','999',],
                          ['MU',    'QTY_PRESSURE',             'TYPE_MU',   'UPDATE','999',],
+
                          ['QVAPOR','QTY_VAPOR_MIXING_RATIO',   'TYPE_QV',   'UPDATE','999',],
-                         ['QICE',  'QTY_ICE_MIXING_RATIO',     'TYPE_QI',   'UPDATE','999',],
                          ['QCLOUD','QTY_CLOUDWATER_MIXING_RATIO','TYPE_QC', 'UPDATE','999',],
+                         ['QICE',  'QTY_ICE_MIXING_RATIO',     'TYPE_QI',   'UPDATE','999',],
+                        #  ['QRAIN','QTY_RAINWATER_MIXING_RATIO','TYPE_QR', 'UPDATE','999',],
+                        #  ['QSNOW','QTY_SNOW_MIXING_RATIO','TYPE_QS', 'UPDATE','999',],
+                        #  ['QGRAUP','QTY_GRAUPEL_MIXING_RATIO','TYPE_QG', 'UPDATE','999',],
+
                          ['CLDFRA','QTY_CLOUD_FRACTION',       'TYPE_CFRAC','UPDATE','999',],
                          ['PSFC',  'QTY_SURFACE_PRESSURE',     'TYPE_PSFC', 'UPDATE','999',],
                          ['T2',    'QTY_2M_TEMPERATURE',       'TYPE_T',    'UPDATE','999',],
                          ['TSK',   'QTY_SKIN_TEMPERATURE',     'TYPE_T',    'UPDATE','999',],
-                         ['REFL_10CM','QTY_RADAR_REFLECTIVITY','TYPE_REFL', 'UPDATE','999',]]),
+                         ['REFL_10CM','QTY_RADAR_REFLECTIVITY','TYPE_REFL', 'UPDATE','999',]],
+                         
+                        wrf_state_bounds = 
+                        [['QVAPOR','0.0','NULL','CLAMP'],
+                         ['QCLOUD','0.0','NULL','CLAMP'],
+                         ['QICE','0.0','NULL','CLAMP'],
+                         ['CLDFRA','0.0','1.0','CLAMP'],
+                         
+                        #  ['QRAIN','0.0','NULL','CLAMP'],
+                        #  ['QSNOW','0.0','NULL','CLAMP'],
+                        #  ['QGRAUP','0.0','NULL','CLAMP'],
+                         ],
+                        ),
+                '&ensemble_manager_nml':
+                   dict(layout = 1,
+                        tasks_per_node = 12,
+                        communication_configuration = 1,
+                        ),
                 }
 
 
-# n_obs can be 22500: 2km, 5776: 4km, 121: 30km, 256:16x16 (20km); 961: 10km resoltn 
-# if radar: then n_obs is for each observation height level
+
+# n_obs is the number of observations
+# currently allowed values are 22500 for one observation approximately every 2km; 5776 for 4km, and 961 for 10km resolution; 256 for 20km; 121 for 30km 
+# Note for radar, n_obs is the number of observations at each observation height level
+
+# oeinf is the observation inflation factor (1 means no inflation)
+oeinf = 1
 
 vis = dict(var_name='VIS 0.6µm', unit='[1]',
            kind='MSG_4_SEVIRI_BDRF', sat_channel=1, 
-           n_obs=256, obs_locations='square_array_evenly_on_grid',
+           n_obs=961, obs_locations='square_array_evenly_on_grid',
            # n_obs=1, obs_locations=[(44.141, -0.99)],
-           error_generate=0.03, error_assimilate=0.03,
-           loc_horiz_km=10)
-
-wv62 = dict(var_name='Brightness temperature WV 6.2µm', unit='[K]',
-            kind='MSG_4_SEVIRI_TB', sat_channel=5, 
-            n_obs=961,  obs_locations='square_array_evenly_on_grid',
-            error_generate=1., error_assimilate=2., 
-            loc_horiz_km=20)
+           error_generate=0.03, error_assimilate=0.03*oeinf,
+           loc_horiz_km=20, 
+           #height=4000, loc_vert_km=3
+           )
 
 wv73 = dict(var_name='Brightness temperature WV 7.3µm', unit='[K]',
             kind='MSG_4_SEVIRI_TB', sat_channel=6, 
             n_obs=961, obs_locations='square_array_evenly_on_grid',
-            error_generate=1., error_assimilate=3., 
-            loc_horiz_km=20)
+            error_generate=1, error_assimilate=1*oeinf, 
+            loc_horiz_km=20, 
+            #height=7000, loc_vert_km=3
+            )
+
+wv62 = dict(var_name='Brightness temperature WV 6.2µm', unit='[K]',
+            kind='MSG_4_SEVIRI_TB', sat_channel=5, 
+            n_obs=961,  obs_locations='square_array_evenly_on_grid',
+            # n_obs=1, obs_locations=[(44.141, -0.99)],
+            error_generate=1, error_assimilate=1*oeinf, 
+            loc_horiz_km=20, 
+            #height=10000, loc_vert_km=3
+            )
 
 ir108 = dict(var_name='Brightness temperature IR 10.8µm', unit='[K]',
              kind='MSG_4_SEVIRI_TB', sat_channel=9, 
@@ -88,10 +131,11 @@ ir108 = dict(var_name='Brightness temperature IR 10.8µm', unit='[K]',
 
 radar = dict(var_name='Radar reflectivity', unit='[dBz]',
              kind='RADAR_REFLECTIVITY', 
-             n_obs=5776, obs_locations='square_array_evenly_on_grid',
-             error_generate=2.5, error_assimilate=2.5,
+             n_obs=961, obs_locations='square_array_evenly_on_grid',
+             # n_obs=2, obs_locations=[(45.332, 0.4735), (45.332, 0.53)],
              heights=range(2000, 14001, 2000),
-             loc_horiz_km=20, loc_vert_km=2.5)
+             error_generate=2.5, error_assimilate=2.5*oeinf,
+             loc_horiz_km=20, loc_vert_km=3)
 
 t = dict(var_name='Temperature', unit='[K]',
          kind='RADIOSONDE_TEMPERATURE', 
@@ -102,25 +146,33 @@ t = dict(var_name='Temperature', unit='[K]',
          loc_horiz_km=50, loc_vert_km=2.5)
 
 q = dict(var_name='Specific humidity', unit='[kg/kg]',
-         kind='RADIOSONDE_SPECIFIC_HUMIDITY', 
-         n_obs=961,  obs_locations='square_array_evenly_on_grid',
+         kind='RADIOSONDE_SPECIFIC_HUMIDITY', n_obs=1,
          error_generate=0., error_assimilate=5*1e-5,
          heights=[1000], #range(1000, 17001, 2000),
-         loc_horiz_km=0.1, loc_vert_km=2.5)
+         loc_horiz_km=50, loc_vert_km=2.5)
 
 t2m = dict(var_name='SYNOP Temperature', unit='[K]',
            kind='SYNOP_TEMPERATURE', 
-           n_obs=961,  obs_locations='square_array_evenly_on_grid',
-           error_generate=0.1, error_assimilate=0.1,
-           loc_horiz_km=40, loc_vert_km=2.5)
+           n_obs=256, obs_locations='square_array_evenly_on_grid',
+           error_generate=0.3, error_assimilate=0.3,
+           loc_horiz_km=10, loc_vert_km=2)
 
 psfc = dict(var_name='SYNOP Pressure', unit='[Pa]',
-            kind='SYNOP_SURFACE_PRESSURE', 
-            n_obs=961,  obs_locations='square_array_evenly_on_grid',
+            kind='SYNOP_SURFACE_PRESSURE', n_obs=1, 
             error_generate=50., error_assimilate=100.,
             loc_horiz_km=32, loc_vert_km=5)
 
-exp.observations = [vis]
+exp.observations = [t]
+
+# the variables which will be replaced in the WRF initial conditions file
 exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'PSFC']
+#exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'PSFC']
+#exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'QRAIN', 'QSNOW', 'QGRAUP', 'PSFC']
+#exp.update_vars = ['QVAPOR', 'QCLOUD', 'QICE', 'PSFC']
+
+exp.use_existing_obsseq = False
+# exp.use_existing_obsseq='/jetfs/home/lkugler/data/sim_archive/exp_v1.22_P2_rr_WV73_obs10_loc20_oe1/obs_seq_out/%Y-%m-%d_%H:%M_obs_seq.out'
+
+
 
 
diff --git a/dartwrf/server_config.py b/dartwrf/server_config.py
index bd9c6b174c46f698408e0759df8241ef430fad5d..ae45fc058670f42c22e28e6b296b7c1ffa824f7c 100755
--- a/dartwrf/server_config.py
+++ b/dartwrf/server_config.py
@@ -3,39 +3,33 @@ from dartwrf import utils
 from dartwrf.exp_config import exp
 
 cluster = utils.ClusterConfig(exp)
-cluster.name = 'jet'
-cluster.max_nproc = 12
-cluster.use_slurm = True
-cluster.size_jobarray = 40
+cluster.name = 'teaching'
+cluster.max_nproc = 6
+cluster.use_slurm = False
 
 # binaries
-cluster.python = '/jetfs/home/lkugler/miniconda3/envs/DART/bin/python'
-cluster.python_verif = '/jetfs/home/lkugler/miniconda3/envs/enstools/bin/python'
-cluster.ncks = '/jetfs/spack/opt/spack/linux-rhel8-skylake_avx512/intel-2021.7.1/nco-5.1.0-izrhxv24jqco5epjhf5ledsqwanojc5m/bin/ncks'
-cluster.ideal = '/jetfs/home/lkugler/bin/ideal-v4.3_v1.22.exe'
-cluster.wrfexe = '/jetfs/home/lkugler/bin/wrf-v4.3_v1.22_ifort_20230413.exe'
-cluster.dart_modules = 'module purge; module load netcdf-fortran/4.5.3-gcc-8.5.0-qsqbozc;'
-cluster.wrf_modules = """module purge; module load intel-oneapi-compilers/2022.2.1-zkofgc5 hdf5/1.12.2-intel-2021.7.1-w5sw2dq netcdf-fortran/4.5.3-intel-2021.7.1-27ldrnt netcdf-c/4.7.4-intel-2021.7.1-lnfs5zz intel-oneapi-mpi/2021.7.1-intel-2021.7.1-pt3unoz
-export HDF5=/jetfs/spack/opt/spack/linux-rhel8-skylake_avx512/intel-2021.7.1/hdf5-1.12.2-w5sw2dqpcq2orlmeowleamoxr65dhhdc
-"""
+cluster.python = 'python'
+cluster.python_verif = '/users/staff/lkugler/miniconda3/bin/python'
+cluster.ncks = '/headless/envs/rttov/bin/ncks'
+cluster.ideal = '' #/jetfs/home/lkugler/bin/ideal-v4.3_v1.22.exe'
+cluster.wrfexe = '' #/jetfs/home/lkugler/bin/wrf-v4.3_v1.22.exe'
+cluster.dart_modules = 'pip install scipy; '
+cluster.wrf_modules = ''
 
 # paths for data output
-cluster.wrf_rundir_base = '/jetfs/home/lkugler/data/run_WRF/'  # path for temporary files
-cluster.dart_rundir_base = '/jetfs/home/lkugler/data/run_DART/'  # path for temporary files
-cluster.archive_base = '/jetfs/home/lkugler/data/sim_archive/'
+cluster.wrf_rundir_base = utils.userhome+'/AdvDA/run_WRF/'  # path for temporary files
+cluster.dart_rundir_base = utils.userhome+'/AdvDA/run_DART/'  # path for temporary files
+cluster.archive_base = utils.userhome+'/data/sim_archive/'
 
 # paths used as input
-cluster.srcdir = '/jetfs/home/lkugler/data/compile/WRF-4.3/run'
-cluster.dart_srcdir = '/jetfs/home/lkugler/data/compile/DART/DART-10.5.3/models/wrf/work'
-cluster.rttov_srcdir = '/jetfs/home/lkugler/data/compile/RTTOV13/rtcoef_rttov13/'
-cluster.dartwrf_dir = '/jetfs/home/lkugler/DART-WRF/'
+cluster.srcdir = '/users/staff/lkugler/AdvDA23/DART/WRF-4.3/run'
+cluster.dart_srcdir = '/headless/envs/DART/models/wrf/work'
+cluster.rttov_srcdir = '/headless/envs/rttov/rtcoef_rttov13/'
+cluster.dartwrf_dir = utils.userhome+'/AdvDA/DART-WRF/'
+cluster.geo_em_for_WRF_ideal = '/lehre/advDA_s2023/data/geo_em.d01.nc'
 
-# other inputs
-cluster.geo_em_for_WRF_ideal = '/jetfs/home/lkugler/data/geo_em.d01.nc'
-cluster.obs_impact_filename = cluster.dartwrf_dir+'/templates/impactfactor_T.txt'
-cluster.namelist = cluster.dartwrf_dir+'/templates/namelist.input'
-cluster.run_WRF = '/jetfs/home/lkugler/DART-WRF/dartwrf/run_ens.jet.sh'
+# templates/run scripts
+cluster.namelist = cluster.dartwrf_dir+'/../templates/namelist.input'
+cluster.run_WRF = cluster.dartwrf_dir+'/run_ens.jet.sh'
 
-cluster.slurm_cfg = {"account": "lkugler", "partition": "compute", #"nodelist": "jet07",
-                 "ntasks": "1", "ntasks-per-core": "1", "mem": "50G",
-                 "mail-type": "FAIL", "mail-user": "lukas.kugler@univie.ac.at"}
+cluster.slurm_cfg = None