def parse_args():
    # feel free to ammend it!
    parser = argparse.ArgumentParser(
        description="""WARNING: SOON TO BE REPLACED BY \"mc_multinest.py\". Run mcpp with multinest.
            Note you can set using files like this: "./test_multinest.py @command_line_options.txt".
            For more info see the documentation on python's argparse function.
            """,
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        fromfile_prefix_chars="@",
    )  # FIXME: I'm not happy yet with how files are read in
    mcpp = parser.add_argument_group("mcpp arguments")
    multinest = parser.add_argument_group("multinest settings", "For more info see README of Multinest")
    # mastercode specific arguments
    mcpp.add_argument(
        "--tmp-dir",
        dest="tmp_dir",
        action="store",
        type=str,
        default=None,
        help="directory where temporary files get stored",
    )
    mcpp.add_argument(
        "--verbose",
        "-v",
        dest="verbose",
        action="store",
        nargs="+",
        help="verbosity, e.g. parameters, X, errors, multinest, or mcpp verbosity",
        default=[],
    )
    mcpp.add_argument(
        "--output-root", "-o", dest="root_out", action="store", default="chains/", help="output root directory "
    )
    mcpp.add_argument("--root-prefix", action="store", default="cmssm-multinest-step-", help="output root file prefix ")
    mcpp.add_argument(
        "--suppress-mc-info",
        dest="suppress_info",
        action="store_true",
        default=False,
        help="suppress dumping the multinest parameters. Not recommended",
    )
    mcpp.add_argument(
        "--pickle-out",
        dest="pickle_out",
        action="store_true",
        default=False,
        help="This is what we want. Store points to pickled dictionaries: unique_string.pkl",
    )
    mcpp.add_argument("--data-set", dest="data_set", action="store", default="mc8", help="data set for X^2 calculation")
    mcpp.add_argument("--model", default="cMSSM", help="Model that SoftSUSY takes", choices=["cMSSM", "NUHM1"])
    mcpp.add_argument(
        "--m0-range", action="store", nargs=2, type=float, default=[0.0, 4000.0], help="parameter range: m0"
    )
    mcpp.add_argument(
        "--m12-range", action="store", nargs=2, type=float, default=[0.0, 4000.0], help="parameter range: m12"
    )
    mcpp.add_argument(
        "--A0-range", action="store", nargs=2, type=float, default=[-5000.0, 5000.0], help="parameter range: A0"
    )
    mcpp.add_argument(
        "--tanb-range", action="store", nargs=2, type=float, default=[1.0, 62.0], help="parameter range: tanb"
    )
    mcpp.add_argument(
        "--mt-range", action="store", nargs=2, type=float, default=[171.4, 175], help="parameter range: mt"
    )
    mcpp.add_argument(
        "--mz-range", action="store", nargs=2, type=float, default=[91.1833, 91.1917], help="parameter range: mz"
    )
    mcpp.add_argument(
        "--delta-alpha-had-range",
        action="store",
        nargs=2,
        type=float,
        default=[0.02729, 0.02769],
        help="parameter range: delta_alpha_had",
    )
    mcpp.add_argument(
        "--mh2-range",
        action="store",
        nargs=2,
        type=float,
        default=[-2e7, 2e7],
        help="parameter range: mh2 (when model=NUHM1),note: further than ever",
    )
    # multinest specific arguments
    multinest.add_argument(
        "--multinest-dir", action="store", default="chains", help="directory for storing mulinest parameters "
    )
    multinest.add_argument(
        "--evidence-tolerance", "--tol", "-t", action="store", type=float, default=0.5, help="evidence tolerance"
    )
    multinest.add_argument(
        "--sampling-efficiency",
        action="store",
        type=float,
        default=0.8,
        help="0.8 and 0.3 are recommended for parameter estimation & evidence evalutaion respectively.",
    )
    multinest.add_argument(
        "--null-log-evidence", action="store", type=float, default=-1e90, help="do not change, see README"
    )
    multinest.add_argument("--log-zero", action="store", type=float, default=-1e100, help="do not change, see README")
    multinest.add_argument(
        "--n-live-points",
        "-l",
        action="store",
        type=int,
        default=10,
        help="very important setting: the number of living points ",
    )
    multinest.add_argument("--max-iter", "-i", action="store", type=int, default=1, help="maximum number of iterations")
    multinest.add_argument(
        "--context",
        action="store",
        type=int,
        default=0,
        help="the user can pass info using context, probably not needed",
    )
    multinest.add_argument(
        "--max-modes",
        action="store",
        type=int,
        default=100,
        help="maximum number of modes, to do with memory; see README",
    )
    multinest.add_argument("--n-iter-before-update", action="store", type=int, default=100, help="n_iter_before_update")
    multinest.add_argument(
        "--seed", "-s", action="store", type=int, default=-1, help="seed (negative for seed from sys clock) "
    )
    multinest.add_argument(
        "--resume",
        "-R",
        dest="resume",
        action="store_true",
        default=False,
        help=" resume existing jobs using parameters from multinest dir",
    )
    multinest.add_argument(
        "--multimodal", action="store", type=bool, default=True, help="do mode separation? Usually want this on."
    )
    multinest.add_argument(
        "--const-efficiency-mode",
        action="store",
        type=bool,
        default=False,
        help="Constant efficientcy mode; see README",
    )
    multinest.add_argument(
        "--write-output", action="store", type=bool, default=True, help="write output files? Probably yes"
    )
    multinest.add_argument(
        "--init-MPI", action="store", type=bool, default=False, help="relevant only if compiling with MPI"
    )
    return parser.parse_args()
def parse_args():
    # feel free to ammend it!
    parser = argparse.ArgumentParser(
            description='''Run mcpp with multinest.
            Note you can set using files like this: "./test_multinest.py @command_line_options.txt".
            For more info see the documentation on python's argparse function.
            ''',
            formatter_class=argparse.ArgumentDefaultsHelpFormatter,
            fromfile_prefix_chars='@') #FIXME: I'm not happy yet with how files are read in
    mcpp = parser.add_argument_group('mcpp arguments')
    multinest = parser.add_argument_group('multinest settings','For more info see README of Multinest')
    #mastercode specific arguments
    mcpp.add_argument('--predictors',default='default',choices=User.predictors.predictors.keys(),
            help='specify key from \'predictors\' dictionary in User/predictors.py')
    mcpp.add_argument('--tmp-dir',  dest='tmp_dir', action='store', type=str,
            default=None, help='directory where temporary files get stored')
    mcpp.add_argument('--storage-dict', help='specify json file containing observable id to array id map')
    mcpp.add_argument('--verbose'    , '-v', dest='verbose'  , action='store', 
            nargs="+", help='verbosity, e.g. parameters, X, errors, multinest, or mcpp verbosity',default=[])
    mcpp.add_argument('--output-root' , '-o', dest='root_out', action='store', 
            default='chains/',  help='output root directory ')
#    mcpp.add_argument('--root-prefix' ,  action='store', 
#            default='cmssm-multinest-step-',  help='output root file prefix ')
    mcpp.add_argument('--suppress-mc-info', dest='suppress_info', action='store_true', 
            default=False,  help='suppress dumping the multinest parameters. Not recommended')
    mcpp.add_argument('--pickle-out', dest='pickle_out', action='store_true', 
            default=False,  help='This is what we want. Store points to pickled dictionaries: unique_string.pkl')
    mcpp.add_argument('--data-set'  ,  dest='data_set'  , action='store', 
            default="pmssm_with_Oh2", help='data set for X^2 calculation')
    mcpp.add_argument('--model', default='pMSSM8', help='Model that SoftSUSY takes', 
            choices=['cMSSM','neg-mu-cMSSM','NUHM1','neg-mu-NUHM1','pMSSM8','pMSSM10'])
    mcpp.add_argument('--nuisance-parameter-ranges', default='User/nuisance_parameter_ranges.json', 
            help='json file with parameter ranges for mt,mz,delta_alpha_had')
    mcpp.add_argument('--cmssm-ranges', default='User/cmssm_ranges.json', 
            help='json file with parameter ranges for m0,m12,tanb,A0')
    mcpp.add_argument('--nuhm1-ranges', default='User/nuhm1_ranges.json', 
            help='json file with parameter ranges for m0,m12,tanb,A0,mh2')
    mcpp.add_argument('--pmssm8-ranges', default='User/pmssm8_ranges.json', 
            help='json file with parameter ranges for msq12,msq3,msl,M1,A,MA,tanb,mu')
    mcpp.add_argument('--pmssm10-ranges',   default='User/pmssm10_ranges.json',
            help='json file with parameter ranges for msq12,msq3,msl,M1,M2,M3,A,MA,tanb,mu')
    mcpp.add_argument('--soft-flat-priors',action='store_true',help='extend flat prior with gaussian tails')
    #multinest specific arguments
    multinest.add_argument('--multinest-dir' ,     action='store', 
            default="chains", help='directory for storing mulinest parameters ')
    multinest.add_argument('--evidence-tolerance' ,'--tol' , '-t',  action='store', type=float,
            default=0.5, help='evidence tolerance')
    multinest.add_argument('--sampling-efficiency',  action='store', type=float,
            default=0.8, help='0.8 and 0.3 are recommended for parameter estimation & evidence evalutaion respectively.')
    multinest.add_argument('--null-log-evidence',  action='store', type=float,
            default=-1e90, help='do not change, see README')
    multinest.add_argument('--log-zero',  action='store', type=float,
            default=-1e100, help='do not change, see README')
    multinest.add_argument('--n-live-points', '-l',  action='store', type=int,
            default=10, help='very important setting: the number of living points ')
    multinest.add_argument('--max-iter', '-i',  action='store', type=int,
            default=1,  help='maximum number of iterations')
    multinest.add_argument('--context',   action='store', type=int,
            default=0,  help='the user can pass info using context, probably not needed')
    multinest.add_argument('--max-modes',   action='store', type=int,
            default=100,  help='maximum number of modes, to do with memory; see README')
    multinest.add_argument('--n-iter-before-update',  action='store', type=int,
            default=100,  help='n_iter_before_update')
    multinest.add_argument('--seed', '-s',  action='store', type=int,
            default=-1, help='seed (negative for seed from sys clock) ')
    multinest.add_argument('--resume','-R', dest='resume', action='store_true', 
            default=False,  help=' resume existing jobs using parameters from multinest dir')
    multinest.add_argument('--multimodal',  action='store',type=bool, default=True,
            help='do mode separation? Usually want this on.')
    multinest.add_argument('--const-efficiency-mode',  action='store',type=bool, default=False,
            help='Constant efficientcy mode; see README')
    multinest.add_argument('--write-output',  action='store',type=bool, default=True,
            help='write output files? Probably yes')
    multinest.add_argument('--init-MPI',  action='store',type=bool, default=False,
            help='relevant only if compiling with MPI')
    return parser.parse_args()