Пример #1
0
def writeruncard(options, extras):
    from MadGraphControl.MadGraphUtils import build_run_card, get_default_runcard
    rand_seed_tmp = int(options["randomSeed"]) % (30081 * 30081)
    build_run_card(run_card_old=get_default_runcard(options["processdir"]),
                   run_card_new='run_card.dat',
                   nevts=options["nevents"],
                   rand_seed=rand_seed_tmp,
                   beamEnergy=options["beamEnergy"],
                   extras=extras,
                   xqcut=0.)
def writeruncard(options, extras):
    from MadGraphControl.MadGraphUtils import build_run_card, get_default_runcard

    rand_seed_tmp = int(options["randomSeed"]) % (30081 * 30081)
    build_run_card(
        run_card_old=get_default_runcard(options["processdir"]),
        run_card_new="run_card.dat",
        nevts=options["nevents"],
        rand_seed=rand_seed_tmp,
        beamEnergy=options["beamEnergy"],
        extras=extras,
        xqcut=0.0,
    )
Пример #3
0
def BulkRS_Generation(run_number=100000,
                      gentype="tt",
                      scenario="c10",
                      stringy="m1000",
                      mass=1000,
                      nevts=5000,
                      rand_seed=1234,
                      beamEnergy=6500.,
                      scalevariation=1.0,
                      alpsfact=1.0,
                      pdf='nn23lo',
                      lhaid=247000):

    # -----------------------------------------------------------------------
    # Need to arrange several things:
    # -- proc_card.dat, this will be determined mostly by the run number.
    #    once we have this, we can also initialize the process in madgraph
    #
    # -- param_card.dat, this is mostly invariant, but does depend on the model scenario
    #
    # -- run_card.dat, this is also mostly invariant
    #
    # At that point we can generate the events, arrange the output, and cleanup.
    # -----------------------------------------------------------------------
    
    # -----------------------------------------------------------------------
    # proc card
    #
    # first, figure out what process we should run
    processes=[]
    pythiachans=[]
    if gentype == "tt":
        processes.append("p p > hh, (hh > t t~, t > j l+ vl, t~ > j l- vl~)")
        processes.append("p p > hh, (hh > t t~, t > j j j, t~ > j j j)")
        processes.append("p p > hh, (hh > t t~, t > j j j, t~ > j l- vl~)")
        processes.append("p p > hh, (hh > t t~, t > j l+ vl, t~ > j j j)")
    else:
        mglog.error('Could not configure process for %s' % (gentype))
        return -1,pythiachans
            

    # Now, import the template.  Could have just written this whole thing out in the
    # script, but a template is nicer for people perusing SVN.
    proccard = subprocess.Popen(['get_files','-data','MadGraph_proc_card_BulkRS.dat'])
    proccard.wait()
    
    # Figure out how to modify the template.
    processstring=""
    processcount=1
    for i in processes:
        if processstring=="":
            processstring="generate %s QED=99 QCD=99 @%d " % (i, processcount)
        else:
            processstring+="\nadd process %s QED=99 QCD=99 @%d " % (i, processcount)
        processcount+=1

    calcwidthstring="""
generate hh > all all
output SMRS_widths -f
launch
set c %f
set Mh %f
set MH %f
set Mhh %f
""" % (float(scenario[1:])/10., 125., 125., float(mass))

    # check that we're in a clean directory
    if not os.access('MadGraph_proc_card_BulkRS.dat',os.R_OK):
        mglog.error('Could not retrieve process card template')
        return -1,pythiachans
    if os.access('proc_card_mg5.dat',os.R_OK) or os.access('proc_card_mg5_step1.dat',os.R_OK):
        mglog.error('Old process card in the current directory.  Do not want to clobber it.  Please move it first.')
        return -1,pythiachans

    # now, modify the process cards.  note that we need two here: one that will 
    oldcard = open('MadGraph_proc_card_BulkRS.dat','r')
    newcardgen = open('proc_card_mg5.dat','w')
    newcardwidths = open('proc_card_mg5_step1.dat','w')
    for line in oldcard.readlines():
        if 'generate' in line: 
            newcardgen.write(processstring)
            newcardwidths.write(calcwidthstring)
        elif "output -f" in line:
            newcardgen.write(line)
        else: 
            newcardgen.write(line)
            newcardwidths.write(line)
    oldcard.close()
    newcardgen.close()
    newcardwidths.close()
    # -----------------------------------------------------------------------


    # -----------------------------------------------------------------------
    # run card
    extras={}
    extras["scale"] = mass
    extras["dsqrt_q2fact1"] = mass
    extras["dsqrt_q2fact2"] = mass
    extras["pdlabel"]=pdf
    extras["lhaid"]=lhaid
    build_run_card(run_card_old='MadGraph_run_card_BulkRS.dat',
                   run_card_new='run_card.dat',
                   xqcut=0,
                   nevts=nevts,
                   rand_seed=rand_seed,
                   beamEnergy=beamEnergy, 
                   scalefact=scalevariation, 
                   alpsfact=alpsfact,
                   extras=extras)
    # -----------------------------------------------------------------------


    # -----------------------------------------------------------------------
    # param card needs to be built with correct widths
    process_dir = new_process(card_loc='proc_card_mg5_step1.dat')
    print "printing process dir"
    print process_dir
    print "printed process dir"
    generate(run_card_loc='run_card.dat', 
             param_card_loc=None, 
             mode=0, 
             njobs=1, 
             run_name='run_01', 
             proc_dir=process_dir)
    str_param_card='SMRS_widths/Events/run_01/param_card.dat'
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # Now configure the generation process directory/etc
    thedir = new_process(card_loc='proc_card_mg5.dat')
    if 1==thedir:
        mglog.error('Error in process generation!')
        return -1,pythiachans
    
    # See if things are where we expected them to be...
    if not os.access(thedir,os.R_OK):
        mglog.error('Could not find process directory '+thedir+' !!  Bailing out!!')
        return -1,pythiachans
    else:
        mglog.info('Using process directory '+thedir)
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # Generation
    if generate(run_card_loc='run_card.dat',
                param_card_loc=str_param_card,
                mode=0,
                njobs=1,
                run_name='Test',
                proc_dir=thedir,
                grid_pack=False):
        mglog.error('Error generating events!')
        return -1,pythiachans
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # Cleanup
    outputDS=""
    try:
        outputDS=arrange_output(run_name='Test',
                                proc_dir=thedir,
                                outputDS='madgraph.%i.madgraph_BulkRS_%s_%s_%s._00001.events.tar.gz'%(run_number,scenario,gentype,stringy))
    except:
        mglog.error('Error arranging output dataset!')
        return -1,pythiachans

    keepOutput=False
    if not keepOutput:
        mglog.info('Removing process directory...')
        shutil.rmtree(thedir,ignore_errors=True)
        shutil.rmtree(process_dir,ignore_errors=True)

    mglog.info('All done generating events!!')
    return outputDS,pythiachans
def HVT_Generation(run_number=100000,
                   gentype="Zh",
                   decaytype="lljj",
                   scenario="Agv1",
                   stringy="126",
                   mass=1000,
                   nevts=5000,
                   rand_seed=1234,
                   beamEnergy=6500.,
                   scalevariation=1.0,
                   alpsfact=1.0,
                   pdf='nn23lo',
                   lhaid=247000):

    # -----------------------------------------------------------------------
    # Need to arrange several things:
    # -- proc_card.dat, this will be determined mostly by the run number.
    #    once we have this, we can also initialize the process in madgraph
    #
    # -- param_card.dat, this is mostly invariant, but does depend on the model scenario
    #
    # -- run_card.dat, this is also mostly invariant
    #
    # At that point we can generate the events, arrange the output, and cleanup.
    # -----------------------------------------------------------------------
    
    # -----------------------------------------------------------------------
    # proc card and process generation
    #
    # first, figure out what process we should run.
    # Note that the syntax 'p p > vz, (vz > z h)' means that the vz is always
    # on shell, with mass within some multiple of the width of the vz (usually 15, see 
    # bwcutoff in the run card).  If we want to allow the low-mass tail as well as the
    # peak, then generate 'p p > vz > z h' instead.
    processes=[]
    addHbb=False
    addHcc=False
    if gentype == "Zh" or gentype == "ZH" or gentype == "zh" or gentype == "zH":
        addHbb=True
        if decaytype == "lljj" or decaytype == "llqq":
            processes.append("p p > vz, (vz > z h, z > l+ l-)")
            addHcc=True
        elif decaytype == "jjjj" or decaytype == "qqqq":
            processes.append("p p > vz, (vz > z h, z > j j)") 
            addHcc=True
        elif decaytype == "vvqq" or decaytype == "vvjj":
            processes.append("p p > vz, (vz > z h, z > vl vl~)")
            addHcc=True
        elif decaytype == "llbb" or decaytype == "llbb":
            processes.append("p p > vz, (vz > z h, z > l+ l-)")
        elif decaytype == "jjbb" or decaytype == "qqbb":
            processes.append("p p > vz, (vz > z h, z > j j)")
        elif decaytype == "vvbb" or decaytype == "vvbb":
            processes.append("p p > vz, (vz > z h, z > vl vl~)")
        elif decaytype == "all":
            processes.append("p p > vz, (vz > z h)")
            addHbb=False
            addHcc=False
        else:
            mglog.error('Could not configure process for %s > %s' % (gentype, decaytype))
            return -1,''
    elif gentype == "WW" or gentype == "ww":
        if decaytype == "lvlv" or decaytype == "llvv":
            processes.append("p p > vz, (vz > w+ w-, w+ > l+ vl, w- > l- vl~)")
        elif decaytype == "jjjj" or decaytype == "qqqq":
            processes.append("p p > vz, (vz > w+ w-, w+ > j j, w- > j j)")
        elif decaytype == "lvqq" or decaytype == "lvjj":
            processes.append("p p > vz, (vz > w+ w-, w+ > j j, w- > l- vl~)")
            processes.append("p p > vz, (vz > w+ w-, w- > j j, w+ > l+ vl)")
        elif decaytype == "all":
            processes.append("p p > vz, (vz > w+ w-)")
        else:
            mglog.error('Could not configure process for %s > %s' % (gentype, decaytype))
            return -1,''
    elif gentype == "Wh" or gentype == "WH" or gentype == "wh" or gentype == "wH":
        addHbb=True
        if decaytype == "lvqq" or decaytype == "lvjj":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > l+ vl)")
            processes.append("p p > vc-, (vc- > w- h, w- > l- vl~)")
            addHcc=True
        elif decaytype == "qqqq" or decaytype == "qqjj":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > j j)")
            processes.append("p p > vc-, (vc- > w- h, w- > j j)")
            addHcc=True
        elif decaytype == "lvbb" or decaytype == "lvbb":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > l+ vl)")
            processes.append("p p > vc-, (vc- > w- h, w- > l- vl~)")
        elif decaytype == "qqbb" or decaytype == "qqbb":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > j j)")
            processes.append("p p > vc-, (vc- > w- h, w- > j j)")
        elif decaytype == "all":
            processes.append("p p > vc+, (vc+ > w+ h)")
            processes.append("p p > vc-, (vc- > w- h)")
            addHbb=False
            addHcc=False
        else:
            mglog.error('Could not configure process for %s > %s' % (gentype, decaytype))
            return -1,''
    elif gentype == "WZ" or gentype == "wz":
        if decaytype == "qqqq" or decaytype == "jjjj": 
            processes.append("p p > vc+, (vc+ > w+ z, w+ > j j, z > j j)")
            processes.append("p p > vc-, (vc- > w- z, w- > j j, z > j j)")
        elif decaytype == "lvqq" or decaytype == "lvjj": 
            processes.append("p p > vc+, (vc+ > w+ z, w+ > l+ vl, z > j j)")
            processes.append("p p > vc-, (vc- > w- z, w- > l- vl~, z > j j)")
        elif decaytype == "lvll" or decaytype == "lnull": 
            processes.append("p p > vc+, (vc+ > w+ z, w+ > l+ vl, z > l+ l-)")
            processes.append("p p > vc-, (vc- > w- z, w- > l- vl~, z > l+ l-)")
        elif decaytype == "llqq" or decaytype == "lljj" or decaytype == "qqll" or decaytype == "jjll": 
            processes.append("p p > vc+, (vc+ > w+ z, w+ > j j, z > l+ l-)")
            processes.append("p p > vc-, (vc- > w- z, w- > j j, z > l+ l-)")
        elif decaytype == "vvqq" or decaytype == "vvjj" or decaytype == "nunuqq" or decaytype == "nunujj":
            processes.append("p p > vc+, (vc+ > w+ z, w+ > j j, z > vl vl~)")
            processes.append("p p > vc-, (vc- > w- z, w- > j j, z > vl vl~)")
        elif decaytype == "lvvv" or decaytype == "lnununu": 
            processes.append("p p > vc+, (vc+ > w+ z, w+ > l+ vl, z > vl vl~)")
            processes.append("p p > vc-, (vc- > w- z, w- > l- vl~, z > vl vl~)")
        elif decaytype == "all": 
            processes.append("p p > vc+, (vc+ > w+ z)")
            processes.append("p p > vc-, (vc- > w- z)")
        else:
            mglog.error('Could not configure process for %s > %s' % (gentype, decaytype))
            return -1,''
    elif gentype == "Wg" or gentype == "Wgamma" or gentype == "wg" or gentype == "wgamma" or gentype == "Wa" or gentype == "wa" or gentype == "Wy" or gentype == "wy":
        if ("lv" in decaytype) or ("lnu" in decaytype):
            processes.append("p p > vc+, (vc+ > w+ a, w+ > l+ vl)")
            processes.append("p p > vc-, (vc- > w- a, w- > l- vl~)")
        elif ("qq" in decaytype) or ("jj" in decaytype):
            processes.append("p p > vc+, (vc+ > w+ a, w+ > j j)")
            processes.append("p p > vc-, (vc- > w- a, w- > j j)")
        else:
            mglog.error('Could not configure process for %s > %s' % (gentype, decaytype))
            return -1,''
    else:
        mglog.error('Could not configure process for %s > %s' % (gentype, decaytype))
        return -1,''
            
    # If we've got Higgs, and we only want H->bb or H->bb/cc, tell Pythia:
    pythiachans=[]
    if addHbb:
        pythiachans.append("25:oneChannel = on 0.569 100 5 -5 ")
        if addHcc:
            pythiachans.append("25:addChannel = on 0.0287 100 4 -4 ")
    elif addHcc:
        pythiachans.append("25:oneChannel = on 0.0287 100 4 -4 ")

    proccard = subprocess.Popen(['get_files','-data','MadGraph_proc_card_HVT.dat'])
    proccard.wait()
    
    processstring=""
    processcount=1
    for i in processes:
        if processstring=="":
            processstring="generate %s QED=99 QCD=99 @%d " % (i, processcount)
        else:
            processstring+="\nadd process %s QED=99 QCD=99 @%d" % (i, processcount)
        processcount+=1

    if not os.access('MadGraph_proc_card_HVT.dat',os.R_OK):
        mglog.error('Could not retrieve process card template')
        return -1,''
    if os.access('proc_card_mg5.dat',os.R_OK):
        mglog.error('Old process card in the current directory.  Do not want to clobber it.  Please move it first.')
        return -1,''
    oldcard = open('MadGraph_proc_card_HVT.dat','r')
    newcard = open('proc_card_mg5.dat','w')
    for line in oldcard.readlines():
        if 'generate' in line: newcard.write(processstring)
        else: newcard.write(line)
    oldcard.close()
    newcard.close()

    # Generate the new process!
    thedir = new_process(card_loc='proc_card_mg5.dat')
    if 1==thedir:
        mglog.error('Error in process generation!')
        return -1,''
    
    # See if things are where we expected them to be...
    if not os.access(thedir,os.R_OK):
        mglog.error('Could not find process directory '+thedir+' !!  Bailing out!!')
        return -1,''
    else:
        mglog.info('Using process directory '+thedir)
    # -----------------------------------------------------------------------


    # -----------------------------------------------------------------------
    # param card
    str_param_card='MadGraph_param_card_HVT_%s_M%04d.dat' % (scenario,mass)
    proc_paramcard = subprocess.Popen(['get_files','-data',str_param_card])
    proc_paramcard.wait()
    if not os.access(str_param_card,os.R_OK):
        mglog.info('Could not get param card '+str_param_card)
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # run card
    extras={}
    extras["scale"] = mass
    extras["dsqrt_q2fact1"] = mass
    extras["dsqrt_q2fact2"] = mass
    extras["pdlabel"]=pdf
    extras["lhaid"]=lhaid
    build_run_card(run_card_old='MadGraph_run_card_HVT.dat',
                   run_card_new='run_card.dat',
                   xqcut=0,
                   nevts=nevts,
                   rand_seed=rand_seed,
                   beamEnergy=beamEnergy, 
                   scalefact=scalevariation, 
                   alpsfact=alpsfact,
                   extras=extras)
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # Generation
    if generate(run_card_loc='run_card.dat',
                param_card_loc=str_param_card,
                mode=0,
                njobs=1,
                run_name='Test',
                proc_dir=thedir,
                grid_pack=False):
        mglog.error('Error generating events!')
        return -1
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # Cleanup
    outputDS=""
    try:
        outputDS=arrange_output(run_name='Test',
                                proc_dir=thedir,
                                outputDS='madgraph.%i.madgraph_HVT_%s_%s_%s_%s._00001.events.tar.gz'%(run_number,scenario,gentype,decaytype,stringy))
    except:
        mglog.error('Error arranging output dataset!')
        return -1

    keepOutput=True
    if not keepOutput:
        mglog.info('Removing process directory...')
        shutil.rmtree(thedir,ignore_errors=True)

    mglog.info('All done generating events!!')
    return outputDS,pythiachans
Пример #5
0
def HVT_Generation(run_number=100000,
                   gentype="Zh",
                   decaytype="lljj",
                   scenario="Agv1",
                   stringy="126",
                   mass=1000,
                   nevts=5000,
                   rand_seed=1234,
                   beamEnergy=6500.,
                   scalevariation=1.0,
                   alpsfact=1.0,
                   pdf='nn23lo',
                   lhaid=247000):

    # -----------------------------------------------------------------------
    # Need to arrange several things:
    # -- proc_card.dat, this will be determined mostly by the run number.
    #    once we have this, we can also initialize the process in madgraph
    #
    # -- param_card.dat, this is mostly invariant, but does depend on the model scenario
    #
    # -- run_card.dat, this is also mostly invariant
    #
    # At that point we can generate the events, arrange the output, and cleanup.
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # proc card and process generation
    #
    # first, figure out what process we should run.
    # Note that the syntax 'p p > vz, (vz > z h)' means that the vz is always
    # on shell, with mass within some multiple of the width of the vz (usually 15, see
    # bwcutoff in the run card).  If we want to allow the low-mass tail as well as the
    # peak, then generate 'p p > vz > z h' instead.
    processes = []
    addHbb = False
    addHcc = False
    if gentype == "Zh" or gentype == "ZH" or gentype == "zh" or gentype == "zH":
        addHbb = True
        if decaytype == "lljj" or decaytype == "llqq":
            processes.append("p p > vz, (vz > z h, z > l+ l-)")
            addHcc = True
        elif decaytype == "jjjj" or decaytype == "qqqq":
            processes.append("p p > vz, (vz > z h, z > j j)")
            addHcc = True
        elif decaytype == "vvqq" or decaytype == "vvjj":
            processes.append("p p > vz, (vz > z h, z > vl vl~)")
            addHcc = True
        elif decaytype == "llbb" or decaytype == "llbb":
            processes.append("p p > vz, (vz > z h, z > l+ l-)")
        elif decaytype == "jjbb" or decaytype == "qqbb":
            processes.append("p p > vz, (vz > z h, z > j j)")
        elif decaytype == "vvbb" or decaytype == "vvbb":
            processes.append("p p > vz, (vz > z h, z > vl vl~)")
        elif decaytype == "all":
            processes.append("p p > vz, (vz > z h)")
            addHbb = False
            addHcc = False
        else:
            mglog.error('Could not configure process for %s > %s' %
                        (gentype, decaytype))
            return -1, ''
    elif gentype == "WW" or gentype == "ww":
        if decaytype == "lvlv" or decaytype == "llvv":
            processes.append("p p > vz, (vz > w+ w-, w+ > l+ vl, w- > l- vl~)")
        elif decaytype == "jjjj" or decaytype == "qqqq":
            processes.append("p p > vz, (vz > w+ w-, w+ > j j, w- > j j)")
        elif decaytype == "lvqq" or decaytype == "lvjj":
            processes.append("p p > vz, (vz > w+ w-, w+ > j j, w- > l- vl~)")
            processes.append("p p > vz, (vz > w+ w-, w- > j j, w+ > l+ vl)")
        elif decaytype == "all":
            processes.append("p p > vz, (vz > w+ w-)")
        else:
            mglog.error('Could not configure process for %s > %s' %
                        (gentype, decaytype))
            return -1, ''
    elif gentype == "Wh" or gentype == "WH" or gentype == "wh" or gentype == "wH":
        addHbb = True
        if decaytype == "lvqq" or decaytype == "lvjj":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > l+ vl)")
            processes.append("p p > vc-, (vc- > w- h, w- > l- vl~)")
            addHcc = True
        elif decaytype == "qqqq" or decaytype == "qqjj":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > j j)")
            processes.append("p p > vc-, (vc- > w- h, w- > j j)")
            addHcc = True
        elif decaytype == "lvbb" or decaytype == "lvbb":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > l+ vl)")
            processes.append("p p > vc-, (vc- > w- h, w- > l- vl~)")
        elif decaytype == "qqbb" or decaytype == "qqbb":
            processes.append("p p > vc+, (vc+ > w+ h, w+ > j j)")
            processes.append("p p > vc-, (vc- > w- h, w- > j j)")
        elif decaytype == "all":
            processes.append("p p > vc+, (vc+ > w+ h)")
            processes.append("p p > vc-, (vc- > w- h)")
            addHbb = False
            addHcc = False
        else:
            mglog.error('Could not configure process for %s > %s' %
                        (gentype, decaytype))
            return -1, ''
    elif gentype == "WZ" or gentype == "wz":
        if decaytype == "qqqq" or decaytype == "jjjj":
            processes.append("p p > vc+, (vc+ > w+ z, w+ > j j, z > j j)")
            processes.append("p p > vc-, (vc- > w- z, w- > j j, z > j j)")
        elif decaytype == "lvqq" or decaytype == "lvjj":
            processes.append("p p > vc+, (vc+ > w+ z, w+ > l+ vl, z > j j)")
            processes.append("p p > vc-, (vc- > w- z, w- > l- vl~, z > j j)")
        elif decaytype == "lvll" or decaytype == "lnull":
            processes.append("p p > vc+, (vc+ > w+ z, w+ > l+ vl, z > l+ l-)")
            processes.append("p p > vc-, (vc- > w- z, w- > l- vl~, z > l+ l-)")
        elif decaytype == "llqq" or decaytype == "lljj" or decaytype == "qqll" or decaytype == "jjll":
            processes.append("p p > vc+, (vc+ > w+ z, w+ > j j, z > l+ l-)")
            processes.append("p p > vc-, (vc- > w- z, w- > j j, z > l+ l-)")
        elif decaytype == "vvqq" or decaytype == "vvjj" or decaytype == "nunuqq" or decaytype == "nunujj":
            processes.append("p p > vc+, (vc+ > w+ z, w+ > j j, z > vl vl~)")
            processes.append("p p > vc-, (vc- > w- z, w- > j j, z > vl vl~)")
        elif decaytype == "lvvv" or decaytype == "lnununu":
            processes.append("p p > vc+, (vc+ > w+ z, w+ > l+ vl, z > vl vl~)")
            processes.append(
                "p p > vc-, (vc- > w- z, w- > l- vl~, z > vl vl~)")
        elif decaytype == "all":
            processes.append("p p > vc+, (vc+ > w+ z)")
            processes.append("p p > vc-, (vc- > w- z)")
        else:
            mglog.error('Could not configure process for %s > %s' %
                        (gentype, decaytype))
            return -1, ''
    elif gentype == "Wg" or gentype == "Wgamma" or gentype == "wg" or gentype == "wgamma" or gentype == "Wa" or gentype == "wa" or gentype == "Wy" or gentype == "wy":
        if ("lv" in decaytype) or ("lnu" in decaytype):
            processes.append("p p > vc+, (vc+ > w+ a, w+ > l+ vl)")
            processes.append("p p > vc-, (vc- > w- a, w- > l- vl~)")
        elif ("qq" in decaytype) or ("jj" in decaytype):
            processes.append("p p > vc+, (vc+ > w+ a, w+ > j j)")
            processes.append("p p > vc-, (vc- > w- a, w- > j j)")
        else:
            mglog.error('Could not configure process for %s > %s' %
                        (gentype, decaytype))
            return -1, ''
    else:
        mglog.error('Could not configure process for %s > %s' %
                    (gentype, decaytype))
        return -1, ''

    # If we've got Higgs, and we only want H->bb or H->bb/cc, tell Pythia:
    pythiachans = []
    if addHbb:
        pythiachans.append("25:oneChannel = on 0.569 100 5 -5 ")
        if addHcc:
            pythiachans.append("25:addChannel = on 0.0287 100 4 -4 ")
    elif addHcc:
        pythiachans.append("25:oneChannel = on 0.0287 100 4 -4 ")

    proccard = subprocess.Popen(
        ['get_files', '-data', 'MadGraph_proc_card_HVT.dat'])
    proccard.wait()

    processstring = ""
    processcount = 1
    for i in processes:
        if processstring == "":
            processstring = "generate %s QED=99 QCD=99 @%d " % (i,
                                                                processcount)
        else:
            processstring += "\nadd process %s QED=99 QCD=99 @%d" % (
                i, processcount)
        processcount += 1

    if not os.access('MadGraph_proc_card_HVT.dat', os.R_OK):
        mglog.error('Could not retrieve process card template')
        return -1, ''
    if os.access('proc_card_mg5.dat', os.R_OK):
        mglog.error(
            'Old process card in the current directory.  Do not want to clobber it.  Please move it first.'
        )
        return -1, ''
    oldcard = open('MadGraph_proc_card_HVT.dat', 'r')
    newcard = open('proc_card_mg5.dat', 'w')
    for line in oldcard.readlines():
        if 'generate' in line: newcard.write(processstring)
        else: newcard.write(line)
    oldcard.close()
    newcard.close()

    # Generate the new process!
    thedir = new_process(card_loc='proc_card_mg5.dat')
    if 1 == thedir:
        mglog.error('Error in process generation!')
        return -1, ''

    # See if things are where we expected them to be...
    if not os.access(thedir, os.R_OK):
        mglog.error('Could not find process directory ' + thedir +
                    ' !!  Bailing out!!')
        return -1, ''
    else:
        mglog.info('Using process directory ' + thedir)
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # param card
    str_param_card = 'MadGraph_param_card_HVT_%s_M%04d.dat' % (scenario, mass)
    proc_paramcard = subprocess.Popen(['get_files', '-data', str_param_card])
    proc_paramcard.wait()
    if not os.access(str_param_card, os.R_OK):
        mglog.info('Could not get param card ' + str_param_card)
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # run card
    extras = {}
    extras["scale"] = mass
    extras["dsqrt_q2fact1"] = mass
    extras["dsqrt_q2fact2"] = mass
    extras["pdlabel"] = pdf
    extras["lhaid"] = lhaid
    build_run_card(run_card_old='MadGraph_run_card_HVT.dat',
                   run_card_new='run_card.dat',
                   xqcut=0,
                   nevts=nevts,
                   rand_seed=rand_seed,
                   beamEnergy=beamEnergy,
                   scalefact=scalevariation,
                   alpsfact=alpsfact,
                   extras=extras)
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # Generation
    if generate(run_card_loc='run_card.dat',
                param_card_loc=str_param_card,
                mode=0,
                njobs=1,
                run_name='Test',
                proc_dir=thedir,
                grid_pack=False):
        mglog.error('Error generating events!')
        return -1
    # -----------------------------------------------------------------------

    # -----------------------------------------------------------------------
    # Cleanup
    outputDS = ""
    try:
        outputDS = arrange_output(
            run_name='Test',
            proc_dir=thedir,
            outputDS='madgraph.%i.madgraph_HVT_%s_%s_%s_%s._00001.events.tar.gz'
            % (run_number, scenario, gentype, decaytype, stringy))
    except:
        mglog.error('Error arranging output dataset!')
        return -1

    keepOutput = True
    if not keepOutput:
        mglog.info('Removing process directory...')
        shutil.rmtree(thedir, ignore_errors=True)

    mglog.info('All done generating events!!')
    return outputDS, pythiachans