diff --git a/cycled_exp.py b/cycled_exp.py
index 90679efc3b1a6deda42bc2e376ac7eb2ee62b53f..b2173aaa6be30f0ff695e127f6c26822f727ad1e 100755
--- a/cycled_exp.py
+++ b/cycled_exp.py
@@ -14,7 +14,7 @@ if __name__ == "__main__":
 
     id = None
 
-    if False:  # warm bubble
+    if True:  # warm bubble
         prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.19_P3_wbub7_noDA'
 
         init_time = dt.datetime(2008, 7, 30, 12)
@@ -26,19 +26,18 @@ if __name__ == "__main__":
         # id = w.run_ideal(depends_on=id)
         # id = w.wrfinput_insert_wbubble(depends_on=id)    
 
-    if True:  # random
+    if False:  # random
         prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.19_P2_noDA'
 
-        init_time = dt.datetime(2008, 7, 30, 12)
-        time = dt.datetime(2008, 7, 30, 13)
-        last_assim_time = dt.datetime(2008, 7, 30, 13)
-        forecast_until = dt.datetime(2008, 7, 30, 13, 15)
+        init_time = dt.datetime(2008, 7, 30, 7)
+        time = dt.datetime(2008, 7, 30, 12)
+        last_assim_time = dt.datetime(2008, 7, 30, 14)
+        forecast_until = dt.datetime(2008, 7, 30, 18)
 
         w.prepare_WRFrundir(init_time)
         # id = w.run_ideal(depends_on=id)
 
     # prior_path_exp = w.cluster.archivedir
-    # prior_path_exp = '/gpfs/data/fs71386/lkugler/sim_archive/exp_v1.19_P5+su_noDA'
     
     prior_init_time = init_time
     prior_valid_time = time
@@ -69,10 +68,12 @@ if __name__ == "__main__":
         id = w.run_ENS(begin=time,  # start integration from here
                     end=time + timedelta_integrate,  # integrate until here
                     output_restart_interval=output_restart_interval,
+                    first_minutes=True,
                     depends_on=id)
         
         # as we have WRF output, we can use own exp path as prior
-        prior_path_exp = w.cluster.archivedir       
+        prior_path_exp = w.cluster.archivedir
+        # prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.19_P2_noDA/'
 
         id_sat = w.create_satimages(time, depends_on=id)
         
@@ -84,3 +85,16 @@ if __name__ == "__main__":
 
     w.verify_sat(id_sat)
     w.verify_wrf(id)
+
+
+# assim_times = [dt.datetime(2008,7,30,12,30), ] 
+# time range from 12:30 to 13:30 every 15 minutes
+assim_times = [dt.datetime(2008,7,30,12,30) + dt.timedelta(minutes=15*i) for i in range(5)]
+tuples = []
+for init in assim_times:
+    for s in range(30,3*60+1,30):
+        tuples.append((init, init+dt.timedelta(seconds=s)))
+
+
+# evaluate the forecast at +1 minute after the assimilation time
+w.evaluate_obs_posterior_after_analysis(tuples, depends_on=id)
diff --git a/dartwrf/exp_config.py b/dartwrf/exp_config.py
index 6d90a43f96cd3c435ed1b557f4ae9fd6aff29b31..58e71ed1b177b6febad8ad637033066a0816b91f 100644
--- a/dartwrf/exp_config.py
+++ b/dartwrf/exp_config.py
@@ -4,14 +4,17 @@ exp = utils.Experiment()
 exp.expname = "template_experiment"
 exp.model_dx = 2000
 exp.n_ens = 40
-exp.superob_km = False  # False or int (spatial averaging of observations)
+exp.superob_km = False  # False or int (spatial averaging of observations, unit: km)
+exp.do_quality_control = False  # bool
 
-exp.use_existing_obsseq = False  # False or pathname (use precomputed obs_seq.out files)
-#exp.use_existing_obsseq = '/jetfs/home/lkugler/data/sim_archive//exp_v1.18_P1_nature+1//obs_seq_out/%Y-%m-%d_%H:%M_obs_seq.out'
+# 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'
 
-# path to the nature run, where we take observations from
-exp.nature_expname = 'exp_v1.18_P1_nature+1'
+# 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'
 
+# for initialization profiles
 exp.input_profile = '/mnt/jetfs/home/lkugler/data/initial_profiles/wrf/ens/2022-03-31/raso.fc.<iens>.wrfprof'
 
 
@@ -30,7 +33,7 @@ exp.dart_nml = {'&assim_tools_nml':
                             output_sd='.true.',
                             stages_to_write='output',
                         ),
-                '&quality_control_nml':
+                '&quality_control_nml': 
                     dict(outlier_threshold='-1',
                         ),
                 '&location_nml':
@@ -73,9 +76,9 @@ wv62 = dict(var_name='Brightness temperature WV 6.2µm', unit='[K]',
 
 wv73 = dict(var_name='Brightness temperature WV 7.3µm', unit='[K]',
             kind='MSG_4_SEVIRI_TB', sat_channel=6, 
-            n_obs=256, obs_locations='square_array_evenly_on_grid',
-            error_generate=1., error_assimilate=1., 
-            loc_horiz_km=10)
+            n_obs=961, obs_locations='square_array_evenly_on_grid',
+            error_generate=1., error_assimilate=3., 
+            loc_horiz_km=20)
 
 ir108 = dict(var_name='Brightness temperature IR 10.8µm', unit='[K]',
              kind='MSG_4_SEVIRI_TB', sat_channel=9, 
@@ -99,22 +102,25 @@ 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=1,
+         kind='RADIOSONDE_SPECIFIC_HUMIDITY', 
+         n_obs=961,  obs_locations='square_array_evenly_on_grid',
          error_generate=0., error_assimilate=5*1e-5,
          heights=[1000], #range(1000, 17001, 2000),
          loc_horiz_km=0.1, 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)
+           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)
 
 psfc = dict(var_name='SYNOP Pressure', unit='[Pa]',
-            kind='SYNOP_SURFACE_PRESSURE', n_obs=1, 
+            kind='SYNOP_SURFACE_PRESSURE', 
+            n_obs=961,  obs_locations='square_array_evenly_on_grid',
             error_generate=50., error_assimilate=100.,
             loc_horiz_km=32, loc_vert_km=5)
 
-exp.observations = [wv73]
+exp.observations = [vis]
 exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'PSFC']
 
+
diff --git a/dartwrf/utils.py b/dartwrf/utils.py
index 427d5a4feb1d50c382f57529bc2c2bcbbc96d98b..53d89039c8988ca0a18bbfedf9f574173f5631cc 100755
--- a/dartwrf/utils.py
+++ b/dartwrf/utils.py
@@ -132,7 +132,7 @@ userhome = os.path.expanduser('~')
 def shell(args):
     print(args)
     #subprocess.run(args.split(' ')) #, shell=True) #, stderr=subprocess.STDOUT) 
-    os.system(args)
+    return os.system(args)
 
 def print(*args):
     __builtin__.print(*args, flush=True)