Program Listing for File DataNodes.h

Return to documentation for file (source/default_mode/DataNodes.h)

#ifndef DATA_H
#define DATA_H

#include "SymWorld.h"

void SymWorld::CreateDataFiles(){
  int TIMING_REPEAT = my_config->DATA_INT();
  std::string file_ending = "_SEED"+std::to_string(my_config->SEED())+".data";

  SetupHostIntValFile(my_config->FILE_PATH()+"HostVals"+my_config->FILE_NAME()+file_ending).SetTimingRepeat(TIMING_REPEAT);
  SetupSymIntValFile(my_config->FILE_PATH()+"SymVals"+my_config->FILE_NAME()+file_ending).SetTimingRepeat(TIMING_REPEAT);
  SetUpTransmissionFile(my_config->FILE_PATH()+"TransmissionRates"+my_config->FILE_NAME()+file_ending).SetTimingRepeat(TIMING_REPEAT);

  if(my_config->FREE_LIVING_SYMS() == 1){
    SetUpFreeLivingSymFile(my_config->FILE_PATH()+"FreeLivingSyms_"+my_config->FILE_NAME()+file_ending).SetTimingRepeat(TIMING_REPEAT);
  }
}

emp::DataFile & SymWorld::SetupSymIntValFile(const std::string & filename) {
  auto & file = SetupFile(filename);
  auto & node = GetSymIntValDataNode();
  auto & node1 = GetSymCountDataNode();

  file.AddVar(update, "update", "Update");
  file.AddMean(node, "mean_intval", "Average symbiont interaction value");
  file.AddTotal(node1, "count", "Total number of symbionts");

  //interaction val histogram
  file.AddHistBin(node, 0, "Hist_-1", "Count for histogram bin -1 to <-0.9");
  file.AddHistBin(node, 1, "Hist_-0.9", "Count for histogram bin -0.9 to <-0.8");
  file.AddHistBin(node, 2, "Hist_-0.8", "Count for histogram bin -0.8 to <-0.7");
  file.AddHistBin(node, 3, "Hist_-0.7", "Count for histogram bin -0.7 to <-0.6");
  file.AddHistBin(node, 4, "Hist_-0.6", "Count for histogram bin -0.6 to <-0.5");
  file.AddHistBin(node, 5, "Hist_-0.5", "Count for histogram bin -0.5 to <-0.4");
  file.AddHistBin(node, 6, "Hist_-0.4", "Count for histogram bin -0.4 to <-0.3");
  file.AddHistBin(node, 7, "Hist_-0.3", "Count for histogram bin -0.3 to <-0.2");
  file.AddHistBin(node, 8, "Hist_-0.2", "Count for histogram bin -0.2 to <-0.1");
  file.AddHistBin(node, 9, "Hist_-0.1", "Count for histogram bin -0.1 to <0.0");
  file.AddHistBin(node, 10, "Hist_0.0", "Count for histogram bin 0.0 to <0.1");
  file.AddHistBin(node, 11, "Hist_0.1", "Count for histogram bin 0.1 to <0.2");
  file.AddHistBin(node, 12, "Hist_0.2", "Count for histogram bin 0.2 to <0.3");
  file.AddHistBin(node, 13, "Hist_0.3", "Count for histogram bin 0.3 to <0.4");
  file.AddHistBin(node, 14, "Hist_0.4", "Count for histogram bin 0.4 to <0.5");
  file.AddHistBin(node, 15, "Hist_0.5", "Count for histogram bin 0.5 to <0.6");
  file.AddHistBin(node, 16, "Hist_0.6", "Count for histogram bin 0.6 to <0.7");
  file.AddHistBin(node, 17, "Hist_0.7", "Count for histogram bin 0.7 to <0.8");
  file.AddHistBin(node, 18, "Hist_0.8", "Count for histogram bin 0.8 to <0.9");
  file.AddHistBin(node, 19, "Hist_0.9", "Count for histogram bin 0.9 to 1.0");

  file.PrintHeaderKeys();

  return file;
}


emp::DataFile & SymWorld::SetupHostIntValFile(const std::string & filename) {
  auto & file = SetupFile(filename);
  SetupHostFileColumns(file);
  file.PrintHeaderKeys();
  return file;
}


void SymWorld::SetupHostFileColumns(emp::DataFile & file){
  auto & node = GetHostIntValDataNode();
  auto & node1 = GetHostCountDataNode();
  auto & uninf_hosts_node = GetUninfectedHostsDataNode();

  file.AddVar(update, "update", "Update");
  file.AddMean(node, "mean_intval", "Average host interaction value");
  file.AddTotal(node1, "count", "Total number of hosts");
  file.AddTotal(uninf_hosts_node, "uninfected_host_count", "Total number of hosts that are uninfected");
  file.AddHistBin(node, 0, "Hist_-1", "Count for histogram bin -1 to <-0.9");
  file.AddHistBin(node, 1, "Hist_-0.9", "Count for histogram bin -0.9 to <-0.8");
  file.AddHistBin(node, 2, "Hist_-0.8", "Count for histogram bin -0.8 to <-0.7");
  file.AddHistBin(node, 3, "Hist_-0.7", "Count for histogram bin -0.7 to <-0.6");
  file.AddHistBin(node, 4, "Hist_-0.6", "Count for histogram bin -0.6 to <-0.5");
  file.AddHistBin(node, 5, "Hist_-0.5", "Count for histogram bin -0.5 to <-0.4");
  file.AddHistBin(node, 6, "Hist_-0.4", "Count for histogram bin -0.4 to <-0.3");
  file.AddHistBin(node, 7, "Hist_-0.3", "Count for histogram bin -0.3 to <-0.2");
  file.AddHistBin(node, 8, "Hist_-0.2", "Count for histogram bin -0.2 to <-0.1");
  file.AddHistBin(node, 9, "Hist_-0.1", "Count for histogram bin -0.1 to <0.0");
  file.AddHistBin(node, 10, "Hist_0.0", "Count for histogram bin 0.0 to <0.1");
  file.AddHistBin(node, 11, "Hist_0.1", "Count for histogram bin 0.1 to <0.2");
  file.AddHistBin(node, 12, "Hist_0.2", "Count for histogram bin 0.2 to <0.3");
  file.AddHistBin(node, 13, "Hist_0.3", "Count for histogram bin 0.3 to <0.4");
  file.AddHistBin(node, 14, "Hist_0.4", "Count for histogram bin 0.4 to <0.5");
  file.AddHistBin(node, 15, "Hist_0.5", "Count for histogram bin 0.5 to <0.6");
  file.AddHistBin(node, 16, "Hist_0.6", "Count for histogram bin 0.6 to <0.7");
  file.AddHistBin(node, 17, "Hist_0.7", "Count for histogram bin 0.7 to <0.8");
  file.AddHistBin(node, 18, "Hist_0.8", "Count for histogram bin 0.8 to <0.9");
  file.AddHistBin(node, 19, "Hist_0.9", "Count for histogram bin 0.9 to 1.0");
}


emp::DataFile & SymWorld::SetUpFreeLivingSymFile(const std::string & filename){
  auto & file = SetupFile(filename);
  auto & node1 = GetSymCountDataNode(); //count
  auto & node2 = GetCountFreeSymsDataNode();
  auto & node3 = GetCountHostedSymsDataNode();
  auto & node4 = GetSymIntValDataNode(); //interaction_val
  auto & node5 = GetFreeSymIntValDataNode();
  auto & node6 = GetHostedSymIntValDataNode();
  auto & node7 = GetSymInfectChanceDataNode(); //infect chance
  auto & node8 = GetFreeSymInfectChanceDataNode();
  auto & node9 = GetHostedSymInfectChanceDataNode();

  file.AddVar(update, "update", "Update");

  //count
  file.AddTotal(node1, "count", "Total number of symbionts");
  file.AddTotal(node2, "free_syms", "Total number of free syms");
  file.AddTotal(node3, "hosted_syms", "Total number of syms in a host");


  //interaction val
  file.AddMean(node4, "mean_intval", "Average symbiont interaction value");
  file.AddMean(node5, "mean_freeintval", "Average free symbiont interaction value");
  file.AddMean(node6, "mean_hostedintval", "Average hosted symbiont interaction value");

  //infection chance
  file.AddMean(node7, "mean_infectchance", "Average symbiont infection chance");
  file.AddMean(node8, "mean_freeinfectchance", "Average free symbiont infection chance");
  file.AddMean(node9, "mean_hostedinfectchance", "Average hosted symbiont infection chance");

  file.PrintHeaderKeys();

  return file;
}


void SymWorld::WritePhylogenyFile(const std::string & filename) {
  sym_sys->Snapshot("SymSnapshot_"+filename);
  host_sys->Snapshot("HostSnapshot_"+filename);
}


emp::DataFile & SymWorld::SetUpTransmissionFile(const std::string & filename){
  auto & file = SetupFile(filename);
  auto & node1 = GetHorizontalTransmissionAttemptCount();
  auto & node2 = GetHorizontalTransmissionSuccessCount();
  auto & node3 = GetVerticalTransmissionAttemptCount();

  file.AddVar(update, "update", "Update");

  //horizontal transmission
  file.AddTotal(node1, "attempts_horiztrans", "Total number of horizontal transmission attempts", true);
  file.AddTotal(node2, "successes_horiztrans", "Total number of horizontal transmission successes", true);

  //vertical transmission
  file.AddTotal(node3, "attempts_verttrans", "Total number of horizontal transmission attempts", true);

  file.PrintHeaderKeys();

  return file;
}


emp::DataMonitor<int>& SymWorld::GetHostCountDataNode() {
  if(!data_node_hostcount) {
    data_node_hostcount.New();
    OnUpdate([this](size_t){
      data_node_hostcount -> Reset();
      for (size_t i = 0; i< pop.size(); i++){
        if (IsOccupied(i)){
          data_node_hostcount->AddDatum(1);
        }
      }
    });
  }
  return *data_node_hostcount;
}


emp::DataMonitor<int>& SymWorld::GetSymCountDataNode() {
  if(!data_node_symcount) {
    data_node_symcount.New();
    OnUpdate([this](size_t){
      data_node_symcount -> Reset();
      for (size_t i = 0; i < pop.size(); i++){
        if(IsOccupied(i)){
          data_node_symcount->AddDatum((pop[i]->GetSymbionts()).size());
        }
        if(sym_pop[i]){
          data_node_symcount->AddDatum(1);
        }
      }
    });
  }
  return *data_node_symcount;
}


emp::DataMonitor<int>& SymWorld::GetCountHostedSymsDataNode(){
  if (!data_node_hostedsymcount) {
    data_node_hostedsymcount.New();
    OnUpdate([this](size_t){
      data_node_hostedsymcount->Reset();
      for (size_t i = 0; i< pop.size(); i++){
        if (IsOccupied(i)){
          data_node_hostedsymcount->AddDatum(pop[i]->GetSymbionts().size());
        }
      }
    });
  }
  return *data_node_hostedsymcount;
}


emp::DataMonitor<int>& SymWorld::GetCountFreeSymsDataNode(){
  if (!data_node_freesymcount) {
    data_node_freesymcount.New();
    OnUpdate([this](size_t){
      data_node_freesymcount->Reset();
      for (size_t i = 0; i< pop.size(); i++){
        if (sym_pop[i]){
          data_node_freesymcount->AddDatum(1);
        }
      }
    });
  }
  return *data_node_freesymcount;
}


emp::DataMonitor<int>& SymWorld::GetUninfectedHostsDataNode() {
  //keep track of host organisms that are uninfected
  if(!data_node_uninf_hosts) {
    data_node_uninf_hosts.New();
    OnUpdate([this](size_t){
  data_node_uninf_hosts -> Reset();

  for (size_t i = 0; i < pop.size(); i++) {
    if(IsOccupied(i)) {
      if((pop[i]->GetSymbionts()).empty()) {
        data_node_uninf_hosts->AddDatum(1);
      }
    } //endif
  } //end for
}); //end OnUpdate
  } //end if
  return *data_node_uninf_hosts;
}




emp::DataMonitor<double, emp::data::Histogram>& SymWorld::GetHostIntValDataNode() {
  if (!data_node_hostintval) {
    data_node_hostintval.New();
    OnUpdate([this](size_t){
      data_node_hostintval->Reset();
      for (size_t i = 0; i< pop.size(); i++){
        if (IsOccupied(i)){
          data_node_hostintval->AddDatum(pop[i]->GetIntVal());
        }
      }
    });
  }
  data_node_hostintval->SetupBins(-1.0, 1.1, 21);
  return *data_node_hostintval;
}


emp::DataMonitor<double,emp::data::Histogram>& SymWorld::GetSymIntValDataNode() {
  if (!data_node_symintval) {
    data_node_symintval.New();
    OnUpdate([this](size_t){
      data_node_symintval->Reset();
      for (size_t i = 0; i< pop.size(); i++) {
        if (IsOccupied(i)) {
          emp::vector<emp::Ptr<Organism>>& syms = pop[i]->GetSymbionts();
          size_t sym_size = syms.size();
          for(size_t j=0; j< sym_size; j++){
            data_node_symintval->AddDatum(syms[j]->GetIntVal());
          }//close for
        }
        if (sym_pop[i]) {
          data_node_symintval->AddDatum(sym_pop[i]->GetIntVal());
        } //close if
      }//close for
    });
  }
  data_node_symintval->SetupBins(-1.0, 1.1, 21);
  return *data_node_symintval;
}


emp::DataMonitor<double,emp::data::Histogram>& SymWorld::GetFreeSymIntValDataNode() {
  if (!data_node_freesymintval) {
    data_node_freesymintval.New();
    OnUpdate([this](size_t){
      data_node_freesymintval->Reset();
      for (size_t i = 0; i< pop.size(); i++) {
        if (sym_pop[i]) {
          data_node_freesymintval->AddDatum(sym_pop[i]->GetIntVal());
        } //close if
      }//close for
    });
  }
  data_node_freesymintval->SetupBins(-1.0, 1.1, 21);
  return *data_node_freesymintval;
}


emp::DataMonitor<double,emp::data::Histogram>& SymWorld::GetHostedSymIntValDataNode() {
  if (!data_node_hostedsymintval) {
    data_node_hostedsymintval.New();
    OnUpdate([this](size_t){
      data_node_hostedsymintval->Reset();
      for (size_t i = 0; i< pop.size(); i++) {
        if (IsOccupied(i)) {
          emp::vector<emp::Ptr<Organism>>& syms = pop[i]->GetSymbionts();
          size_t sym_size = syms.size();
          for(size_t j=0; j< sym_size; j++){
            data_node_hostedsymintval->AddDatum(syms[j]->GetIntVal());
          }//close for
        }//close if
      }//close for
    });
  }
  data_node_hostedsymintval->SetupBins(-1.0, 1.1, 21);
  return *data_node_hostedsymintval;
}


emp::DataMonitor<double,emp::data::Histogram>& SymWorld::GetSymInfectChanceDataNode() {
  if (!data_node_syminfectchance) {
    data_node_syminfectchance.New();
    OnUpdate([this](size_t){
      data_node_syminfectchance->Reset();
      for (size_t i = 0; i< pop.size(); i++) {
        if (IsOccupied(i)) {
          emp::vector<emp::Ptr<Organism>>& syms = pop[i]->GetSymbionts();
          size_t sym_size = syms.size();
          for(size_t j=0; j< sym_size; j++){
            data_node_syminfectchance->AddDatum(syms[j]->GetInfectionChance());
          }//close for
        }
        if (sym_pop[i]) {
          data_node_syminfectchance->AddDatum(sym_pop[i]->GetInfectionChance());
        } //close if
      }//close for
    });
  }
  data_node_syminfectchance->SetupBins(0, 1.1, 11);
  return *data_node_syminfectchance;
}


emp::DataMonitor<double,emp::data::Histogram>& SymWorld::GetFreeSymInfectChanceDataNode() {
  if (!data_node_freesyminfectchance) {
    data_node_freesyminfectchance.New();
    OnUpdate([this](size_t){
      data_node_freesyminfectchance->Reset();
      for (size_t i = 0; i< pop.size(); i++) {
        if (sym_pop[i]) {
          data_node_freesyminfectchance->AddDatum(sym_pop[i]->GetInfectionChance());
        } //close if
      }//close for
    });
  }
  data_node_freesyminfectchance->SetupBins(0, 1.1, 11);
  return *data_node_freesyminfectchance;
}


emp::DataMonitor<double,emp::data::Histogram>& SymWorld::GetHostedSymInfectChanceDataNode() {
  if (!data_node_hostedsyminfectchance) {
    data_node_hostedsyminfectchance.New();
    OnUpdate([this](size_t){
      data_node_hostedsyminfectchance->Reset();
      for (size_t i = 0; i< pop.size(); i++) {
        if (IsOccupied(i)) {
          emp::vector<emp::Ptr<Organism>>& syms = pop[i]->GetSymbionts();
          size_t sym_size = syms.size();
          for(size_t j=0; j< sym_size; j++){
            data_node_hostedsyminfectchance->AddDatum(syms[j]->GetInfectionChance());
          }//close for
        }
      }//close for
    });
  }
  data_node_hostedsyminfectchance->SetupBins(0, 1.1, 11);
  return *data_node_hostedsyminfectchance;
}


emp::DataMonitor<int>& SymWorld::GetHorizontalTransmissionAttemptCount() {
  if (!data_node_attempts_horiztrans) {
    data_node_attempts_horiztrans.New();
  }
  return *data_node_attempts_horiztrans;
}


emp::DataMonitor<int>& SymWorld::GetHorizontalTransmissionSuccessCount() {
  if (!data_node_successes_horiztrans) {
    data_node_successes_horiztrans.New();
  }
  return *data_node_successes_horiztrans;
}


emp::DataMonitor<int>& SymWorld::GetVerticalTransmissionAttemptCount() {
  if (!data_node_attempts_verttrans) {
    data_node_attempts_verttrans.New();
  }
  return *data_node_attempts_verttrans;
}

#endif