示例#1
0
 def test_iopathlist(self):
     global MSDIR
     global INPUT
     global OUTPUT
     global CABPATH
     stimela.register_globals()
     rrr = stimela.Recipe("pathlist", ms_dir=MSDIR)
     rrr.add("cab/custom", "test1", {
         "bla1": "a", # only accepts a, b or c
         "bla5": ["testinput2.txt:input",
                  "testinput3.txt:msfile",
                  spf("{}hello\{reim\}.fits,{}to.fits,{}world.fits", "input", "msfile", "output")],
     },
     cabpath=CABPATH,
     input=INPUT, output=OUTPUT)
     rrr.run() #validate and run
     assert rrr.jobs[0].job._cab.parameters[4].value[0] == os.path.join(rrr.jobs[0].job.IODEST["input"], 
             "testinput2.txt")
     assert rrr.jobs[0].job._cab.parameters[4].value[1] == os.path.join(rrr.jobs[0].job.IODEST["msfile"],
             "testinput3.txt")
     assert rrr.jobs[0].job._cab.parameters[4].value[2] == \
             "{}/hello{{reim}}.fits,{}/to.fits,{}/world.fits".format(rrr.jobs[0].job.IODEST["input"],
                 rrr.jobs[0].job.IODEST["msfile"],
                 rrr.jobs[0].job.IODEST["output"]
                 )
示例#2
0
    def test_udocker(self):
        import sys
        global MSDIR
        global INPUT
        global OUTPUT
        global UDOCKER
        if UDOCKER is False:
            return

        stimela.register_globals()
        rrr = stimela.Recipe("singularitypaths",
                             ms_dir=MSDIR,
                             JOB_TYPE="udocker",
                             cabpath="cab/",
                             log_dir="logs")
        assert os.path.exists(MSDIR)
        rrr.add("cab/custom", "test1", {
            "bla1": "a", # only accepts a, b or c
            "bla5": ["testinput2.txt:input",
                     "testinput3.txt:msfile",
                     spf("{}hello\{reim\}.fits,{}to.fits,{}world.fits", "input", "msfile", "output")],
        }, input=INPUT, output=OUTPUT)
        rrr.run() #validate and run
        assert rrr.jobs[0].job._cab.parameters[4].value[0] == os.path.join(rrr.jobs[0].job.IODEST["input"], 
                    "testinput2.txt")
        assert rrr.jobs[0].job._cab.parameters[4].value[1] == os.path.join(rrr.jobs[0].job.IODEST["msfile"],
                    "testinput3.txt")
        assert rrr.jobs[0].job._cab.parameters[4].value[2] == \
                "{}/hello{{reim}}.fits,{}/to.fits,{}/world.fits".format(
                    rrr.jobs[0].job.IODEST["input"],
                    rrr.jobs[0].job.IODEST["msfile"],
                    rrr.jobs[0].job.IODEST["output"]
                )
示例#3
0
 def test_iopathlist(self):
     global MSDIR
     global INPUT
     global OUTPUT
     stimela.register_globals()
     rrr = stimela.Recipe("pathlist", ms_dir=MSDIR)
     assert os.path.exists(MSDIR)
     rrr.add(
         "cab/custom",
         "test1",
         {
             "bla1":
             "a",  # only accepts a, b or c
             "bla5": [
                 "testinput2.txt:input", "testinput3.txt:msfile",
                 spf("{}hello\{reim\}.fits,{}to.fits,{}world.fits", "input",
                     "msfile", "output")
             ],
         },
         input=INPUT,
         output=OUTPUT)
     rrr.run()  #validate and run
     assert rrr.jobs[0].job._cab.parameters[4].value[
         0] == "/input/testinput2.txt"
     assert rrr.jobs[0].job._cab.parameters[4].value[1] == os.path.join(
         "/", "home", os.environ["USER"], "msdir", "testinput3.txt")
     assert rrr.jobs[0].job._cab.parameters[4].value[2] == \
             "{}hello{{reim}}.fits,{}to.fits,{}world.fits".format(
                 "/input/",
                 os.path.join("/", "home", os.environ["USER"], "msdir/"),
                 os.path.join("/", "home", os.environ["USER"], "output/"),
             )
示例#4
0
    def test_singularity(self):
        global MSDIR
        global INPUT
        global OUTPUT
        global SINGULARITY
        if SINGULARITY is False:
            return

        stimela.register_globals()
        rrr = stimela.Recipe("singularitypaths",
                             ms_dir=MSDIR,
                             JOB_TYPE="singularity",
                             cabpath="cab/",
                             singularity_image_dir=os.environ["STIMELA_PULLFOLDER"],
                             log_dir="logs")
        rrr.add("cab/custom", "test1", {
            "bla1": "a", # only accepts a, b or c
            "bla5": ["testinput2.txt:input",
                     "testinput3.txt:msfile",
                     spf("{}hello\{reim\}.fits,{}to.fits,{}world.fits", "input", "msfile", "output")],
        }, input=INPUT, output=OUTPUT)
        rrr.run() #validate and run

        assert rrr.jobs[0].job._cab.parameters[4].value[0] == os.path.join(rrr.jobs[0].job.IODEST["input"], 
                    "testinput2.txt")
        assert rrr.jobs[0].job._cab.parameters[4].value[1] == os.path.join(rrr.jobs[0].job.IODEST["msfile"],
                    "testinput3.txt")
        assert rrr.jobs[0].job._cab.parameters[4].value[2] == \
                "{}/hello{{reim}}.fits,{}/to.fits,{}/world.fits".format(
                    rrr.jobs[0].job.IODEST["input"],
                    rrr.jobs[0].job.IODEST["msfile"],
                    rrr.jobs[0].job.IODEST["output"]
                )
示例#5
0
    def test_udocker(self):
        import sys
        if sys.version_info[0] > 2:
            return

        global MSDIR
        global INPUT
        global OUTPUT
        stimela.register_globals()
        rrr = stimela.Recipe("singularitypaths",
                             ms_dir=MSDIR,
                             JOB_TYPE="udocker",
                             cabpath="cab/")
        assert os.path.exists(MSDIR)
        rrr.add(
            "cab/custom",
            "test1",
            {
                "bla1":
                "a",  # only accepts a, b or c
                "bla5": [
                    "testinput2.txt:input", "testinput3.txt:msfile",
                    spf("{}hello\{reim\}.fits,{}to.fits,{}world.fits", "input",
                        "msfile", "output")
                ],
            },
            input=INPUT,
            output=OUTPUT)
        rrr.run()  #validate and run
        assert rrr.jobs[0].job._cab.parameters[4].value[
            0] == "/scratch/input/testinput2.txt"
        assert rrr.jobs[0].job._cab.parameters[4].value[
            1] == "/scratch/msdir/testinput3.txt"
        assert rrr.jobs[0].job._cab.parameters[4].value[2] == \
                "{}hello{{reim}}.fits,{}to.fits,{}world.fits".format(
                    "/scratch/input/",
                    "/scratch/msdir/",
                    "/scratch/output/"
                )
示例#6
0
    def test_singularity(self):
        global MSDIR
        global INPUT
        global OUTPUT
        stimela.register_globals()
        rrr = stimela.Recipe(
            "singularitypaths",
            ms_dir=MSDIR,
            JOB_TYPE="singularity",
            cabpath="cab/",
            singularity_image_dir=os.environ["SINGULARITY_PULLFOLDER"])
        assert os.path.exists(MSDIR)
        rrr.add(
            "cab/custom",
            "test1",
            {
                "bla1":
                "a",  # only accepts a, b or c
                "bla5": [
                    "testinput2.txt:input", "testinput3.txt:msfile",
                    spf("{}hello\{reim\}.fits,{}to.fits,{}world.fits", "input",
                        "msfile", "output")
                ],
            },
            input=INPUT,
            output=OUTPUT)
        rrr.run()  #validate and run

        assert rrr.jobs[0].job._cab.parameters[4].value[
            0] == "/scratch/input/testinput2.txt"
        assert rrr.jobs[0].job._cab.parameters[4].value[
            1] == "/scratch/msdir/testinput3.txt"
        assert rrr.jobs[0].job._cab.parameters[4].value[2] == \
                "{}hello{{reim}}.fits,{}to.fits,{}world.fits".format(
                    "/scratch/input/",
                    "/scratch/msdir/",
                    "/scratch/output/"
                )
示例#7
0
 def dd_calibrate(field,mslist):
     key = 'calibrate_dd'
     print("pipeline.output", pipeline.output)
     outdir = field+"_ddcal"
     dicomod = prefix+"_"+field+"-DD-precal.DicoModel"
     dereg = "de-{0:s}.reg".format(field)
     output_cubical = OUTPUT+"/"+outdir
     test_path = spf("MODEL_DATA")
     print("test_path",test_path)
     print("output_cubical",output_cubical)
     for ms in mslist:
        mspref =os.path.splitext(ms)[0].replace('-','_')
        step = 'dd_calibrate-{0:s}-{1:s}'.format(mspref,field)
        recipe.add('cab/cubical_ddf', step, {
           "data-ms"           : ms,
           "data-column"       : config[key]['dd_data_col'],
           "out-column"        : config[key]['dd_out_data_col'],
           "weight-column"     : config[key]['dd_weight_col'],
           "sol-jones"         : "G,DD",  # Jones terms to solve
           "sol-min-bl"        : config[key]['sol_min_bl'],  # only solve for |uv| > 300 m
           "sol-stall-quorum"  : config[key]['dd_sol_stall_quorum'],
           "g-type"            : config[key]['dd_g_type'],
           "g-clip-high"       : config[key]['dd_g_clip_high'],
           "g-clip-low"        : config[key]['dd_g_clip_low'],
           "g-solvable"        : True,
           "g-update-type"     : config[key]['dd_g_update_type'],
           "g-max-prior-error" : config[key]['dd_g_max_prior_error'],
           "dd-max-prior-error" : config[key]['dd_dd_max_prior_error'],
           "g-max-post-error"  : config[key]['dd_g_max_post_error'],
           "dd-max-post-error"  : config[key]['dd_dd_max_post_error'],
           "g-time-int"        : config[key]['dd_g_timeslots_int'],
           "g-freq-int"        : config[key]['dd_g_chan_int'],
           "dist-ncpu"         : config[key]['dist_ncpu'],
           "dist-nworker"      : config[key]['dist_nworker'],
           "dist-max-chunks"   : config[key]['dist_nworker'],
           "dist-max-chunks"   : config[key]['dist_nworker'],
         #  "model-beam-pattern": prefix+"'_$(corr)_$(reim).fits':output",
         #  "montblanc-feed-type": "linear",
         #  "model-beam-l-axis" : "px",
         #  "model-beam-m-axis" : "py",
           "g-save-to"         : "g_final-cal_{0:s}_{1:s}.parmdb".format(mspref, field),
           "dd-save-to"        : "dd_cal_final_{0:s}_{1:s}.parmdb".format(mspref, field),
           "dd-type"           : "complex-2x2",
           "dd-clip-high"      : 0.0,
           "dd-clip-low"       : 0.0,
           "dd-solvable"       : True,
           "dd-time-int"       : ddsols_t,
           "dd-freq-int"       : ddsols_f,
           "dd-dd-term"        : True,
           "dd-prop-flags"     : 'always',
           "dd-fix-dirs"       : "0",
           "out-subtract-dirs" : "1:",
           "model-list"        : spf("MODEL_DATA+-{{}}{}@{{}}{}:{{}}{}@{{}}{}".format(dicomod, dereg, dicomod, dereg), "output", "output", "output", "output"),
           "out-name"          : prefix + "dE_sub",
           "out-mode"          : 'sr',
           "out-model-column"  : "MODEL_OUT",
           #"data-freq-chunk"   : 1*ddsols_f,
           #"data-time-chunk"   : 1*ddsols_t,
           "data-time-chunk"   : ddsols_t*int(min(1,config[key]['dist_nworker'])) if (ddsols_f==0 or config[key]['dd_g_chan_int']== 0) else ddsols_t*int(min(1,np.sqrt(config[key]['dist_nworker']))),
           "data-freq-chunk"   : 0 if (ddsols_f==0 or config[key]['dd_g_chan_int']== 0) else ddsols_f*int(min(1, np.sqrt(config[key]['dist_nworker']))),
           "sol-term-iters"    : "[50,90,50,90]",
           "madmax-plot"       : False,
           "out-plots"          : True,
           "madmax-enable"     : config[key]['madmax_enable'],
           "madmax-threshold"  : config[key]['madmax_thr'],
           "madmax-global-threshold": config[key]['madmax_global_thr'],
           "madmax-estimate"   : "corr",
           #"out-casa-gaintables" : True,
           "degridding-NDegridBand": config['image_dd']['freq_ndegridband'],
           'degridding-MaxFacetSize': 0.15,
            },
            input=INPUT,
            #output=OUTPUT+"/"+outdir,
            output=output_cubical,
            shared_memory=shared_mem,
            label='dd_calibrate-{0:s}-{1:s}:: Carry out DD calibration'.format(mspref,field))
示例#8
0
    def testEndToEndReduction(self):
        global INPUT, OUTPUT, MSDIR, MS, LABEL
        recipe = stimela.Recipe('Test reduction script',
                                ms_dir=MSDIR, JOB_TYPE="docker", log_dir="logs")

        imname1 = "deep2.1gc"
        imname2 = "deep2.2gc"
        recipe.add("cab/ddfacet", "ddfacet_test1",
                   {
                       "Data-MS": [MS],
                       "Output-Name": imname1,
                       "Image-NPix": 2048,
                       "Image-Cell": 2,
                       "Cache-Reset": True,
                       "Freq-NBand": 2,
                       "Freq-NDegridBand": 4,
                       "Weight-ColName": "WEIGHT",
                       "Data-ChunkHours": 0.1,
                       "Data-Sort": True,
                       "Log-Boring": True,
                       "Deconv-MaxMajorIter": 2,
                       "Deconv-MaxMinorIter": 1500,
                       "Predict-ColName": "MODEL_DATA"
                   },
                   input=INPUT, output=OUTPUT, shared_memory="8gb",
                   label="image1",
                   time_out=1800)

        recipe.add('cab/tricolour', "flag_data",
                   {
                       "ms": MS,
                       "data-column": "DATA",
                       "window-backend": 'numpy',
                       "flagging-strategy": "total_power",
                       "subtract-model-column": "MODEL_DATA",
                   },
                   input=INPUT, output=OUTPUT, label="flag_data",
                   time_out=1800)

        maskname0 = "MASK.fits"
        recipe.add('cab/cleanmask', 'mask0', {
            "image": '%s.app.restored.fits:output' % (imname1),
            "output": '%s:output' % (maskname0),
            "dilate": False,
            "sigma": 25,
        },
            input=INPUT,
            output=OUTPUT,
            label='mask0:: Make mask',
            time_out=1800)

        recipe.add("cab/ddfacet", "ddfacet_test2",
                   {
                       "Data-MS": [MS],
                       "Output-Name": imname1,
                       "Image-NPix": 2048,
                       "Image-Cell": 2.0,
                       "Cache-Reset": True,
                       "Freq-NBand": 2,
                       "Freq-NDegridBand": 4,
                       "Mask-External": '%s:output' % (maskname0),
                       "Weight-ColName": "WEIGHT",
                       "Data-ChunkHours": 0.1,
                       "Data-Sort": True,
                       "Log-Boring": True,
                       "Deconv-MaxMajorIter": 2,
                       "Deconv-MaxMinorIter": 1500,
                   },
                   input=INPUT, output=OUTPUT, shared_memory="24gb",
                   label="image2",
                   time_out=1800)

        recipe.add("cab/shadems", "shadems_test",
                   {
                       'ms': MS,
                       'xaxis': 'DATA:imag',
                       'yaxis': 'real',
                       'col': 'DATA',
                       'png': '%s_shadems_test_real_imag' % (PREFIX)
                   },
                   input=INPUT, output=OUTPUT,
                   label="shadems_test",
                   time_out=1800)

        # # First selfcal round

        recipe.add("cab/cubical_ddf", "cubical_cal",
                   {
                       'data-ms': MS,
                       'data-column': "DATA",
                       'dist-nworker': 4,
                       'dist-nthread': 1,
                       'dist-max-chunks': 20,
                       'data-freq-chunk': 0,
                       'data-time-chunk': 1,
                       'model-list': spf("MODEL_DATA"),
                       'weight-column': "WEIGHT",
                       'flags-apply': "FLAG",
                       'flags-auto-init': "legacy",
                       'madmax-enable': False,
                       'madmax-threshold': [0, 0, 10],
                       'madmax-global-threshold': [0, 0],
                       'sol-jones': 'g',
                       'sol-stall-quorum': 0.95,
                       'out-name': "cubicaltest",
                       'out-column': "CORRECTED_DATA",
                       'log-verbose': "solver=2",
                       'g-type': "complex-2x2",
                       'g-freq-int': 0,
                       'g-time-int': 20,
                       'g-max-iter': 10,
                       'sol-term-iters': 10,
                       'g-update-type': "complex-2x2",

                   }, input=INPUT, output=OUTPUT,
                   label="cubical",
                   shared_memory="24gb",
                   time_out=1800)

        recipe.add("cab/cubical", "cubical_cal2",
                   {
                       'data-ms': MS,
                       'data-column': "DATA",
                       'dist-nworker': 4,
                       'dist-nthread': 1,
                       'dist-max-chunks': 20,
                       'data-freq-chunk': 0,
                       'data-time-chunk': 1,
                       'model-list': spf("MODEL_DATA"),
                       'weight-column': "WEIGHT",
                       'flags-apply': "FLAG",
                       'flags-auto-init': "legacy",
                       'madmax-enable': False,
                       'madmax-threshold': [0, 0, 10],
                       'madmax-global-threshold': [0, 0],
                       'sol-jones': 'g',
                       'sol-stall-quorum': 0.95,
                       'out-name': "cubicaltest",
                       'out-column': "CORRECTED_DATA",
                       'log-verbose': "solver=2",
                       'g-type': "complex-2x2",
                       'g-freq-int': 0,
                       'g-time-int': 20,
                       'g-max-iter': 10,
                       'sol-term-iters': 10,
                       'out-overwrite' : True,
                       'g-update-type': "complex-2x2",

                   }, input=INPUT, output=OUTPUT,
                   label="cubical",
                   shared_memory="24gb",
                   time_out=1800)


        recipe.add("cab/ragavi_vis", "ragavi_vis_test",
                   {
                       'ms': MS,
                       'xaxis': 'imaginary',
                       'yaxis': 'real',
                       'data-column': 'CORRECTED_DATA',
                       'htmlname': "%s_ragavi_vis_real_imag" % (PREFIX)
                   },
                   input=INPUT, output=OUTPUT,
                   label="ragavi_vis_test",
                   time_out=1800)
        recipe.run()
示例#9
0
def decalibrate(incol="corrected_data",
                calincol="corrected_data",
                outcol="subtracted_data",
                model="model_data",
                label='decal',
                freq_int=8,
                masksig=45,
                tagsigma=3.0,
                nfacets=4,
                solvemode='complex-2x2',
                corrtype='sc',
                interval=40,
                restore=None):
    steps = []
    steps += image(incol=incol,
                   label=label,
                   masksig=masksig,
                   restore=restore,
                   nfacets=nfacets)

    for ti, t in enumerate(TARGET):
        recipe.add(
            "cab/catdagger",
            "auto_tagger_{}_{}".format(label, ti), {
                'ds9-reg-file': "{}.{}.dE.reg".format(label, ti),
                'ds9-tag-reg-file': "{}.{}.dE.clusterleads.reg".format(
                    label, ti),
                'sigma': tagsigma,
                'min-distance-from-tracking-centre': 350,
                'noise-map':
                "{}.app.residual.fits:output".format(t + "_" + label),
            },
            input=INPUT,
            output=OUTPUT,
            label="auto_tagger_{}_{}".format(label, ti),
            shared_memory="250g")

        diconame = "{}.DicoModel".format(t + "_" + label)
        tagregs = "{}.{}.dE.reg".format(label, ti)
        recipe.add("cab/cubical_ddf", "de_calibrate_{}_{}".format(label, ti), {
                'data-ms': DATASET,
                'data-column': calincol,
                'dist-nworker': args.ncubical_workers,
                'dist-nthread': args.ncubical_workers,
                'dist-max-chunks': args.ncubical_workers,
                'data-time-chunk': interval*int(min(1, args.ncubical_workers)) if not args.cubical_split_DI_bandwidth else \
                                   interval*int(min(1, np.sqrt(args.ncubical_workers))),
                'data-freq-chunk': 0 if not args.cubical_split_DI_bandwidth else \
                                   freq_int*int(min(1, np.sqrt(args.ncubical_workers))),
                'model-list': spf("MODEL_DATA+-{{}}{}@{{}}{}:{{}}{}@{{}}{}".format(diconame, tagregs, diconame, tagregs),
                                  "output", "output", "output", "output"),
                #'model-beam-pattern': "'MeerKAT_VBeam_10MHz_53Chans_$(corr)_$(reim).fits':output",
                #'model-beam-l-axis' : "X",
                #'model-beam-m-axis' : "Y",
                'weight-column': "WEIGHT",
                'flags-apply': "FLAG",
                'flags-auto-init': "legacy",
                'madmax-enable': False,
                'madmax-threshold': [0,0,10],
                'madmax-global-threshold': [0,0],
                'sol-jones': 'g,dd',
                'sol-min-bl': 110.0,
                'sol-max-bl': 0,
                'sol-stall-quorum': 0.95,
                'sol-term-iters': [50,90,50,90],
                'out-name': t + str(time.time()),

                'out-mode': corrtype,
                'out-column': outcol,
                'out-model-column': "MODEL_OUT",
                'log-verbose': "solver=2",
                'dd-time-int': interval,
                'dd-freq-int': freq_int,
                'dd-type': solvemode,
                'g-type': solvemode,
                'g-freq-int': 0,
                'g-time-int': interval,
                'g-max-iter': 100,
                'g-update-type': "phase-diag",
                'dd-max-iter': 200,
                'dd-clip-high': 0,
                'dd-clip-low': 0,
                'dd-fix-dirs': "0",
                'out-subtract-dirs': '1:',
                'dd-dd-term': True,
                'dd-max-prior-error': 0.35,
                'dd-max-post-error': 0.35,
                'g-clip-high': 0,
                'g-clip-low': 0,
                'g-max-prior-error': 0.35,
                'g-max-post-error': 0.35,
                'degridding-NDegridBand': args.mfs_predictbands,
                'degridding-MaxFacetSize': 0.15
        }, input=INPUT, output=OUTPUT, label="de_calibrate_{}_{}".format(label, ti), shared_memory="250g")
    recent_corrected_column = outcol
    steps += [
        "auto_tagger_{}_{}".format(label, ti),
        "de_calibrate_{}_{}".format(label, ti)
    ]
    return steps