예제 #1
0
int
main(int argc, char *argv[])
{
    OptionParser parser = create_common_options( USAGE, DESCRIPTION, false );
    
    OptionGroup group = OptionGroup( parser, "Options for bayes", "These options will change the behaviour of bayes and fine." );
    group.add_option( "-n", "--num-interactions" ).type( "int" ).help( "The number of interactions to correct for, this is used in the model prior (default: all)." );
    group.add_option( "-s", "--num-single" ).type( "int" ).help( "The number of snps to consider when correcting (default: proportional to square of the number of interactions)." );
    group.add_option( "-t", "--single-prior" ).type( "float" ).help( "The probability that a single snp is associated (default: %default)." ).set_default( 0.0 );
    group.add_option( "-i", "--mc-iterations" ).type( "int" ).help( "The number of monte carlo iterations to use in the fine method (default: %default)." ).set_default( 4000000 );
    group.add_option( "-a", "--beta-prior-param1" ).type( "float" ).help( "First shape parameter of beta prior (default: %default)." ).set_default( 2.0 );
    group.add_option( "-b", "--beta-prior-param2" ).type( "float" ).help( "Second shape parameter of beta prior (default: %default)." ).set_default( 2.0 );
    group.add_option( "-e", "--estimate-prior-params" ).action( "store_true" ).help( "Estimate prior parameters from data by permuting phenotype (default: off)." );
    parser.add_option( "--additive" ).action( "store_true" ).help( "Use an additive model (slow)." );
    parser.add_option_group( group );

    Values options = parser.parse_args( argc, argv );
    if( parser.args( ).size( ) != 2 )
    {
        parser.print_help( );
        exit( 1 );
    }

    shared_ptr<common_options> parsed_data = parse_common_options( options, parser.args( ) );

    /* Read prior parameters */
    arma::vec alpha = arma::ones<arma::vec>( 2 );
    alpha[ 0 ] = (float) options.get( "beta_prior_param1" );
    alpha[ 1 ] = (float) options.get( "beta_prior_param2" );
    if( options.is_set( "estimate_prior_params" ) )
    {
        alpha = estimate_prior_parameters( parsed_data->genotypes, parsed_data->data->phenotype, parsed_data->data->missing, 5000 );
    }

    /* Count the number of interactions to adjust for */
    parsed_data->data->single_prior = (float) options.get( "single_prior" );
    parsed_data->data->num_single = (unsigned int) options.get( "num_single" );
    parsed_data->data->num_interactions = (unsigned int) options.get( "num_interactions" );

    method_type *m = new besiq_method( parsed_data->data, alpha );
    if( options.is_set( "additive" ) )
    {
        m = new besiq_method( parsed_data->data, alpha );
    }
    else
    {
        m = new besiq_fine_method( parsed_data->data, (int) options.get( "mc_iterations" ), alpha );
    }
    
    run_method( *m, parsed_data->genotypes, *parsed_data->pairs, *parsed_data->result_file );

    delete m;

    return 0;
}
예제 #2
0
int
main(int argc, char *argv[])
{
    OptionParser parser = create_options( );
    
    Values options = parser.parse_args( argc, argv );
    if( parser.args( ).size( ) < 2 )
    {
        parser.print_help( );
        exit( 1 );
    }
    
    std::vector<plink_file_ptr> plink_files = open_plink_file( parser.args( ) );
    std::vector<genotype_matrix_ptr> genotypes = create_genotype_matrices( plink_files );
    
    /** 
     * Create pair iterator 
     */
    size_t split = (size_t) options.get( "split" );
    size_t num_splits = (size_t) options.get( "num_splits" );
    if( split > num_splits || split == 0 || num_splits == 0 )
    {
        std::cerr << "besiq: error: Num splits and split must be > 0, and split <= num_splits." << std::endl;
        exit( 1 );
    }
   
    std::vector<std::string> loci =  plink_files[ 0 ]->get_locus_names( );
    pairfile *pairs = open_pair_file( parser.args( )[ 0 ].c_str( ), loci );
    if( pairs == NULL || !pairs->open( split, num_splits ) )
    {
        std::cerr << "besiq: error: Could not open pair file." << std::endl;
        exit( 1 );
    }
    logp_grid grid( plink_files[ 0 ]->get_loci( ), 7000, 500000 );

    double threshold = (double) options.get( "threshold" );

    /**
     * Set up method
     */
    std::vector<wald_method *> methods;
    for(int i = 0; i < plink_files.size( ); i++)
    {
        method_data_ptr data( new method_data( ) );
        data->missing = zeros<uvec>( plink_files[ i ]->get_samples( ).size( ) );
        data->phenotype = create_phenotype_vector( plink_files[ i ]->get_samples( ), data->missing );

        methods.push_back( new wald_method( data ) );
    }

    /**
     * Open results.
     */
    resultfile *result = NULL;
    if( options.is_set( "out" ) )
    {
        result = new bresultfile( options[ "out" ], loci );
    }
    else
    {
        std::ios_base::sync_with_stdio( false );
        result = new tresultfile( "-", "w" );
    }
    if( result == NULL || !result->open( ) )
    {
        std::cerr << "besiq: error: Can not open result file." << std::endl;
        exit( 1 );
    }
    std::vector<std::string> header;
    header.push_back( "W" );
    header.push_back( "P" );
    header.push_back( "N" );
    result->set_header( header );

    /**
     * Run analysis
     */
    std::pair<std::string, std::string> pair;
    float *output = new float[ methods[ 0 ]->init( ).size( ) ];
    float meta_output[ header.size( ) ];
    while( pairs->read( pair ) )
    {
        /* Compute betas and covariances */
        std::vector<arma::vec> betas( methods.size( ), arma::zeros<arma::vec>( 4 ) );
        std::vector<arma::mat> weights( methods.size( ), arma::zeros<arma::mat>( 4, 4 ) );
        size_t N = 0;
        bool all_valid = true;
        for(int i = 0; i < methods.size( ); i++)
        {
            snp_row const *row1 = genotypes[ i ]->get_row( pair.first );
            snp_row const *row2 = genotypes[ i ]->get_row( pair.second );

            methods[ i ]->run( *row1, *row2, output );

            betas[ i ] = methods[ i ]->get_last_beta( );

            arma::mat C = methods[ i ]->get_last_C( );
            arma::mat Cinv;

            if( C.n_cols != 4 || C.n_rows != 4 || !arma::inv( Cinv, C ) )
            {
                all_valid = false;
            }
            
            weights[ i ] = Cinv;

            N += methods[ i ]->num_ok_samples( *row1, *row2 );
        }

        if( !all_valid )
        {
            continue;
        }

        /* Computed weighted average of betas (fixed effect assumption) */
        arma::mat Csum = arma::zeros<arma::mat>( 4, 4 );
        for(int i = 0; i < weights.size( ); i++)
        {
            Csum += weights[ i ];
        }
        arma::mat Csum_inv;
        if( !arma::inv( Csum_inv, Csum ) )
        {
            continue;
        }

        arma::vec final_beta = arma::zeros<arma::vec>( 4 );
        arma::mat final_C = Csum_inv;
        for(int i = 0; i < weights.size( ); i++)
        {
            final_beta += weights[ i ] * betas[ i ];
        }
        final_beta = Csum_inv * final_beta;

        arma::mat final_C_inv;
        if( !arma::inv( final_C_inv, final_C ) )
        {
            continue;
        }

        double chi = dot( final_beta, final_C_inv * final_beta );
        double final_p = 1.0 - chi_square_cdf( chi, 4 );
        
        grid.add_pvalue( pair.first, pair.second, final_p );

        if( threshold != -9 && final_p > threshold )
        {
            continue;
        }

        meta_output[ 0 ] = chi;
        meta_output[ 1 ] = final_p;
        meta_output[ 2 ] = N;
        
        result->write( pair, meta_output );
    }

    result->close( );

    if( options.is_set( "grid" ) )
    {
        std::ofstream grid_file( options[ "grid" ] );
        grid.write_grid( grid_file );
        grid_file.close( );
    }
    /* Delete allocated stuff */
    
    return 0;
}
예제 #3
0
int main(int argc, char *argv[])
{
  const string usage =
    (!getenv("DISABLE_USAGE")) ?
    "usage: %prog [OPTION]... DIR [FILE]..." : SUPPRESS_USAGE;
  const string version = "%prog 1.0\nCopyright (C) 2010 Johannes Weißl\n"
    "License GPLv3+: GNU GPL version 3 or later "
    "<http://gnu.org/licenses/gpl.html>.\n"
    "This is free software: you are free to change and redistribute it.\n"
    "There is NO WARRANTY, to the extent permitted by law.";
  const string desc = "Lorem ipsum dolor sit amet, consectetur adipisicing"
    " elit, sed do eiusmod tempor incididunt ut labore et dolore magna"
    " aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco"
    " laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor"
    " in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla"
    " pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa"
    " qui officia deserunt mollit anim id est laborum.";
  const string epilog = "Sed ut perspiciatis unde omnis iste natus error sit"
    " voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque"
    " ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae"
    " dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit"
    " aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos"
    " qui ratione voluptatem sequi nesciunt.\nNeque porro quisquam est, qui"
    " dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia"
    " non numquam eius modi tempora incidunt ut labore et dolore magnam"
    " aliquam quaerat voluptatem.";

  OptionParser parser = OptionParser()
    .usage(usage)
    .version(version)
    .description(desc)
    .epilog(epilog)
  ;
  if (getenv("DISABLE_INTERSPERSED_ARGS"))
    parser.disable_interspersed_args();

  parser.set_defaults("verbosity", "50");
  parser.set_defaults("no_clear", "0");

  // test all actions
  parser.add_option("--clear") .action("store_false") .dest("no_clear") .help("clear (default)");
  parser.add_option("--no-clear") .action("store_true") .help("not clear");
  parser.add_option("--string")
    .help("This is a really long text... very long indeed! It must be wrapped on normal terminals.");
  parser.add_option("-x", "--clause", "--sentence") .metavar("SENTENCE") .set_default("I'm a sentence")
    .help("This is a really long text... very long indeed! It must be wrapped on normal terminals. "
          "Also it should appear not on the same line as the option.");
  parser.add_option("-k") .action("count") .help("how many times?");
  parser.add_option("--verbose") .action("store_const") .set_const("100") .dest("verbosity") .help("be verbose!");
  parser.add_option("-s", "--silent") .action("store_const") .set_const("0") .dest("verbosity") .help("be silent!");
  parser.add_option("-n", "--number") .type("int") .set_default("1") .metavar("NUM") .help("number of files (default: %default)");
  parser.add_option("-H") .action("help") .help("alternative help");
  parser.add_option("-V") .action("version") .help("alternative version");
  parser.add_option("-i", "--int") .action("store") .type("int") .set_default(3) .help("default: %default");
  parser.add_option("-f", "--float") .action("store") .type("float") .set_default(5.3) .help("default: %default");
  parser.add_option("-c", "--complex") .action("store") .type("complex");
  char const* const choices[] = { "foo", "bar", "baz" };
  parser.add_option("-C", "--choices") .choices(&choices[0], &choices[3]);
#if __cplusplus >= 201103L
  parser.add_option("--choices-list") .choices({"item1", "item2", "item3"});
#else
  char const* const choices_list[] = { "item1", "item2", "item3" };
  parser.add_option("--choices-list") .choices(&choices_list[0], &choices_list[3]);
#endif
  parser.add_option("-m", "--more") .action("append");
  parser.add_option("--more-milk") .action("append_const") .set_const("milk");
  parser.add_option("--hidden") .help(SUPPRESS_HELP);

  // test for 325cb47
  parser.add_option("--option1") .action("store") .type("int") .set_default(1);
  parser.add_option("--option2") .action("store") .type("int") .set_default("1");
  parser.set_defaults("option1", "640");
  parser.set_defaults("option2", 640); // now works

  MyCallback mc;
  parser.add_option("-K", "--callback") .action("callback") .callback(mc) .help("callback test");
  parser.add_option("--string-callback") .action("callback") .callback(mc) .type("string") .help("callback test");

  OptionGroup group1 = OptionGroup(parser, "Dangerous Options",
      "Caution: use these options at your own risk. "
      "It is believed that some of them\nbite.");
  group1.add_option("-g") .action("store_true") .help("Group option.") .set_default("0");
  parser.add_option_group(group1);

  OptionGroup group2 = OptionGroup(parser, "Size Options", "Image Size Options.");
  group2.add_option("-w", "--width") .action("store") .type("int") .set_default(640) .help("default: %default");
  group2.add_option("--height") .action("store") .type("int") .help("default: %default");
  parser.set_defaults("height", 480);
  parser.add_option_group(group2);

  try {
    Values& options = parser.parse_args(argc, argv);
    vector<string> args = parser.args();

    cout << "clear: " << (options.get("no_clear") ? "false" : "true") << endl;
    cout << "string: " << options["string"] << endl;
    cout << "clause: " << options["clause"] << endl;
    cout << "k: " << options["k"] << endl;
    cout << "verbosity: " << options["verbosity"] << endl;
    cout << "number: " << (int) options.get("number") << endl;
    cout << "int: " << (int) options.get("int") << endl;
    cout << "float: " << (float) options.get("float") << endl;
    complex<double> c = 0;
    if (options.is_set("complex")) {
      stringstream ss;
      ss << options["complex"];
      ss >> c;
    }
    cout << "complex: " << c << endl;
    cout << "choices: " << (const char*) options.get("choices") << endl;
    cout << "choices-list: " << (const char*) options.get("choices_list") << endl;
    {
      stringstream ss;
      for_each(options.all("more").begin(), options.all("more").end(), Output(ss, ", "));
      cout << "more: " << ss.str() << endl;
    }
    cout << "more_milk:" << endl;
    for (Values::iterator it = options.all("more_milk").begin(); it != options.all("more_milk").end(); ++it)
      cout << "- " << *it << endl;
    cout << "hidden: " << options["hidden"] << endl;
    cout << "group: " << (options.get("g") ? "true" : "false") << endl;

    cout << "option1: " << (int) options.get("option1") << std::endl;
    cout << "option2: " << (int) options.get("option2") << std::endl;

    cout << "width: " << (int) options.get("width") << std::endl;
    cout << "height: " << (int) options.get("height") << std::endl;

    cout << endl << "leftover arguments: " << endl;
    for (vector<string>::const_iterator it = args.begin(); it != args.end(); ++it) {
      cout << "arg: " << *it << endl;
    }
  }