int main(int argc, char *argv[])
{
  {
    // test toStringWithComma
    int x[] = {INT_MIN, -1234567890, -123456, -12345, -1000, -999, -1,
               0, 1, 999, 1000, 12345, 123456, 1234567890, INT_MAX};
    int n = sizeof(x)/ sizeof(x[0]);
    for (int i = 0; i < n; ++i) {
      printf("%-15d : %s\n", x[i], toStringWithComma(x[i]).c_str());
    }
  }

  {
    // test toString
    std::vector<double> a;
    a.push_back(1.1);
    a.push_back(2.0);
    std::string s = floatToString(a);
    printf("%s\n", s.c_str());
  }
  return 0;
}
Exemple #2
0
int ModelManager::create(const std::string& modelType,
                         const ModelParser& parser) {
  const size_t previousModelNumber = model.size();
  std::string modelName = parser.getName();
  int nPerm = 10000;
  double alpha = 0.05;
  int windowSize = 1000000;

  if (modelType == "single") {
    if (modelName == "wald") {
      model.push_back(new SingleVariantWaldTest);
    } else if (modelName == "score") {
      model.push_back(new SingleVariantScoreTest);
    } else if (modelName == "exact") {
      model.push_back(new SingleVariantFisherExactTest);
    } else if (modelName == "famscore") {
      model.push_back(new SingleVariantFamilyScore);
    } else if (modelName == "famlrt") {
      model.push_back(new SingleVariantFamilyLRT);
    } else if (modelName == "famgrammargamma") {
      model.push_back(new SingleVariantFamilyGrammarGamma);
    } else if (modelName == "firth") {
      model.push_back(new SingleVariantFirthTest);
    } else {
      logger->error("Unknown model name: %s .", modelName.c_str());
      abort();
    }
  } else if (modelType == "burden") {
    if (modelName == "cmc") {
      model.push_back(new CMCTest);
    } else if (modelName == "zeggini") {
      model.push_back(new ZegginiTest);
    } else if (modelName == "mb") {
      parser.assign("nPerm", &nPerm, 10000).assign("alpha", &alpha, 0.05);
      model.push_back(new MadsonBrowningTest(nPerm, alpha));
      logger->info(
          "MadsonBrowning test significance will be evaluated using %d "
          "permutations",
          nPerm);
    } else if (modelName == "exactcmc") {
      model.push_back(new CMCFisherExactTest);
    } else if (modelName == "fp") {
      model.push_back(new FpTest);
    } else if (modelName == "rarecover") {
      parser.assign("nPerm", &nPerm, 10000).assign("alpha", &alpha, 0.05);
      model.push_back(new RareCoverTest(nPerm, alpha));
      logger->info(
          "Rare cover test significance will be evaluated using %d "
          "permutations",
          nPerm);
    } else if (modelName == "cmat") {
      parser.assign("nPerm", &nPerm, 10000).assign("alpha", &alpha, 0.05);
      model.push_back(new CMATTest(nPerm, alpha));
      logger->info(
          "cmat test significance will be evaluated using %d permutations",
          nPerm);
    } else if (modelName == "cmcwald") {
      model.push_back(new CMCWaldTest);
    } else if (modelName == "zegginiwald") {
      model.push_back(new ZegginiWaldTest);
    } else if (modelName == "famcmc") {
      model.push_back(new FamCMC);
    } else if (modelName == "famzeggini") {
      model.push_back(new FamZeggini);
    } else if (modelName == "famfp") {
      model.push_back(new FamFp);
    } else {
      logger->error("Unknown model name: [ %s ].", modelName.c_str());
      abort();
    }
  } else if (modelType == "vt") {
    if (modelName == "cmc") {
      model.push_back(new VTCMC);
    } else if (modelName == "price") {
      parser.assign("nPerm", &nPerm, 10000).assign("alpha", &alpha, 0.05);
      model.push_back(new VariableThresholdPrice(nPerm, alpha));
      logger->info(
          "Price's VT test significance will be evaluated using %d "
          "permutations",
          nPerm);
    } else if (modelName == "zeggini") {
      // TODO
      logger->error("Not yet implemented.");
    } else if (modelName == "mb") {
      logger->error("Not yet implemented.");
    } else if (modelName == "analyticvt") {
      model.push_back(new AnalyticVT(AnalyticVT::UNRELATED));
    } else if (modelName == "famanalyticvt") {
      model.push_back(new AnalyticVT(AnalyticVT::RELATED));
    } else if (modelName == "skat") {
      logger->error("Not yet implemented.");
    } else {
      logger->error("Unknown model name: %s .", modelName.c_str());
      abort();
    }
  } else if (modelType == "kernel") {
    if (modelName == "skat") {
      double beta1, beta2;
      parser.assign("nPerm", &nPerm, 10000)
          .assign("alpha", &alpha, 0.05)
          .assign("beta1", &beta1, 1.0)
          .assign("beta2", &beta2, 25.0);
      model.push_back(new SkatTest(nPerm, alpha, beta1, beta2));
      logger->info(
          "SKAT test significance will be evaluated using %d permutations at "
          "alpha = %g weight = Beta[beta1 = %.2f, beta2 = %.2f]",
          nPerm, alpha, beta1, beta2);
    } else if (modelName == "kbac") {
      parser.assign("nPerm", &nPerm, 10000).assign("alpha", &alpha, 0.05);
      model.push_back(new KBACTest(nPerm, alpha));
      logger->info(
          "KBAC test significance will be evaluated using %d permutations",
          nPerm);
    } else if (modelName == "famskat") {
      double beta1, beta2;
      parser.assign("beta1", &beta1, 1.0).assign("beta2", &beta2, 25.0);
      model.push_back(new FamSkatTest(beta1, beta2));
      logger->info(
          "SKAT test significance will be evaluated using weight = Beta(beta1 "
          "= %.2f, beta2 = %.2f)",
          beta1, beta2);
    } else {
      logger->error("Unknown model name: %s .", modelName.c_str());
      abort();
    };
  } else if (modelType == "meta") {
    if (modelName == "score") {
      model.push_back(new MetaScoreTest());
    } else if (modelName == "dominant") {
      model.push_back(new MetaDominantTest());
      parser.assign("windowSize", &windowSize, 1000000);
      logger->info(
          "Meta analysis uses window size %s to produce covariance statistics "
          "under dominant model",
          toStringWithComma(windowSize).c_str());
      model.push_back(new MetaDominantCovTest(windowSize));
    } else if (modelName == "recessive") {
      model.push_back(new MetaRecessiveTest());
      parser.assign("windowSize", &windowSize, 1000000);
      logger->info(
          "Meta analysis uses window size %s to produce covariance statistics "
          "under recessive model",
          toStringWithComma(windowSize).c_str());
      model.push_back(new MetaRecessiveCovTest(windowSize));
    } else if (modelName == "cov") {
      parser.assign("windowSize", &windowSize, 1000000);
      logger->info(
          "Meta analysis uses window size %s to produce covariance statistics "
          "under additive model",
          toStringWithComma(windowSize).c_str());
      model.push_back(new MetaCovTest(windowSize));
    }
#if 0
    else if (modelName == "skew") {
      int windowSize;
      parser.assign("windowSize", &windowSize, 1000000);
      logger->info("Meta analysis uses window size %d to produce skewnewss statistics", windowSize);
      model.push_back( new MetaSkewTest(windowSize) );
    } else if (modelName == "kurt") {
      int windowSize;
      parser.assign("windowSize", &windowSize, 1000000);
      logger->info("Meta analysis uses window size %d to produce kurtosis statistics", windowSize);
      model.push_back( new MetaKurtTest(windowSize) );
    }
#endif
    else {
      logger->error("Unknown model name: %s .", modelName.c_str());
      abort();
    }
  } else if (modelType == "outputRaw") {
    if (modelName == "dump") {
      model.push_back(new DumpModel(prefix.c_str()));
    } else {
      logger->error("Unknown model name: %s .", modelName.c_str());
      abort();
    }
  } else {
    logger->error("Unrecognized model type [ %s ]", modelType.c_str());
    return -1;
  }

  // set parameter and output prefix for newly created models
  for (size_t i = previousModelNumber; i < model.size(); ++i) {
    model[i]->setParameter(parser);
    model[i]->setPrefix(prefix);
    if (this->binaryOutcome) {
      model[i]->setBinaryOutcome();
    } else {
      model[i]->setQuantitativeOutcome();
    }
  }
  // create output files
  for (size_t i = previousModelNumber; i < model.size(); ++i) {
    std::string s = this->prefix;
    s += ".";
    s += model[i]->getModelName();
    if (model[i]->needToIndexResult()) {
      s += ".assoc.gz";
      fOuts.push_back(new FileWriter(s.c_str(), BGZIP));
      fileToIndex.push_back(s);
    } else {
      s += ".assoc";
      fOuts.push_back(new FileWriter(s.c_str()));
    }
  }

  assert(fOuts.size() == model.size());

  return 0;
}