diff --git a/dartwrf/obs/create_obsseq_out.py b/dartwrf/obs/create_obsseq_out.py
index cb56e85dacbf2508dc98e962351878257774d7e8..69e95e66fdbe6b02340e9b3f597e4559b1fdde3c 100644
--- a/dartwrf/obs/create_obsseq_out.py
+++ b/dartwrf/obs/create_obsseq_out.py
@@ -8,6 +8,14 @@ from dartwrf.exp_config import exp
 from dartwrf.server_config import cluster
 
 def generate_obsseq_out(time):
+    """Generate an obs_seq.out file from the current experiment
+    
+    Args:
+        time (datetime): time of the observations
+    
+    Returns:
+        obsseq.ObsSeq: obs_seq.out representation
+    """
 
     def ensure_physical_vis(oso):  # set reflectance < surface albedo to surface albedo
         print(" 2.2) removing obs below surface albedo ")
@@ -56,6 +64,11 @@ def generate_obsseq_out(time):
     return oso
 
 def run_perfect_model_obs(nproc=12, verbose=True):
+    """Run the perfect_model_obs program to generate observations
+    
+    Returns:
+        None
+    """
     if verbose:
         print("generating observations - running ./perfect_model_obs")
     os.chdir(cluster.dart_rundir)
@@ -67,4 +80,34 @@ def run_perfect_model_obs(nproc=12, verbose=True):
     if not os.path.exists(cluster.dart_rundir + "/obs_seq.out"):
         raise RuntimeError(
             "obs_seq.out does not exist in " + cluster.dart_rundir,
-            "\n look for " + cluster.dart_rundir + "/log.perfect_model_obs")
\ No newline at end of file
+            "\n look for " + cluster.dart_rundir + "/log.perfect_model_obs")
+    
+if __name__ == '__main__':
+    """Generate obs_seq.out files from an experiment
+    
+    Usage:
+        python3 create_obsseq_out.py 2008-07-30_12:00,2008-07-30_12:01
+    
+    Args:
+        times (str): comma-separated list of times of the observations
+    """
+    import argparse
+    import datetime as dt
+    parser = argparse.ArgumentParser(description='Generate obs_seq.out files from an experiment')
+    parser.add_argument('times', type=str, help='times of the observations')
+
+    args = parser.parse_args()
+    times = args.times.split(',')
+
+    # before running perfect_model_obs, we need to set up the run_DART folder
+    from dartwrf import assim_synth_obs as aso
+    from dartwrf import dart_nml
+    aso.prepare_run_DART_folder()
+    nml = dart_nml.write_namelist()
+
+    for time in times:
+        print("time", time)
+        time = dt.datetime.strptime(time, '%Y-%m-%d_%H:%M')
+
+        aso.prepare_nature_dart(time)  # link WRF files to DART directory
+        generate_obsseq_out(time)
\ No newline at end of file