Nemo  2.4.0b
Simulate forward-in-time genetic evolution in a spatially explicit, individual-based stochastic simulator
TProtoQuanti Class Reference

TProtoQuanti. More...

#include <ttquanti.h>

+ Inheritance diagram for TProtoQuanti:
+ Collaboration diagram for TProtoQuanti:

Public Member Functions

 TProtoQuanti ()
 
 TProtoQuanti (const TProtoQuanti &T)
 
virtual ~TProtoQuanti ()
 
unsigned int get_num_traits ()
 
unsigned int get_num_locus ()
 
unsigned int get_num_locus (unsigned int trait)
 
unsigned int get_pleiotropy_type ()
 
unsigned int get_seq_length ()
 
size_t get_size_locus_type ()
 
size_t get_locus_byte_size ()
 
vector< double > get_env_var ()
 
vector< double > get_heritability ()
 
unsigned int get_h2_setTime ()
 
bool get_h2_isBroad ()
 
unsigned int get_allele_model ()
 
const TMatrixget_diallele_values ()
 
double get_diallele_value (unsigned int locus, unsigned int allele)
 
double get_seq_diallele_value (unsigned int position, unsigned int allele)
 
double get_init_value (unsigned int i)
 
double get_init_variance (unsigned int i)
 
unsigned int get_doInitMutation ()
 
TTQuantiSHget_stater ()
 
const TMatrixget_pleio_matrix ()
 
unsigned int get_locus_seq_pos (unsigned int loc, unsigned int trait)
 
unsigned int get_locus_ID (unsigned int locus, unsigned int trait)
 
unsigned int get_locus_PD (unsigned int locus)
 
unsigned int get_locus_start_pos (unsigned int locus)
 
void set_eVarianceSD (unsigned int trait, double SD)
 
void set_init_values (const double *values, unsigned int nval)
 
void set_trait_value_func_ptr (bool withVe)
 
double set_trait_value_VE (const TTQuanti *ind, const unsigned int trait)
 
double set_trait_value_noVE (const TTQuanti *ind, const unsigned int trait)
 
double set_genotype_value_additive (const TTQuanti *ind, const unsigned int trait)
 
double set_genotype_value_dominance (const TTQuanti *ind, const unsigned int trait)
 
int get_allele_position (const unsigned int locus, const unsigned int trait)
 
double get_allele_value (const TTQuanti *ind, const unsigned int allele, const unsigned int locus, const unsigned int trait)
 
double get_genotype_with_dominance (const double a1, const double a2, const unsigned int locus, const unsigned int trait)
 
double get_genotype_dominance_h (double a1, double a2, double h)
 
double get_genotype_dominance_k (double a1, double a2, double k)
 
unsigned int get_dominance_model ()
 
double get_dominance (unsigned int locus, unsigned int trait)
 
double get_trait_mutation_variance (unsigned int trait)
 
double get_genotypic_value (const TTQuanti *ind, const unsigned int trait)
 
double get_phenotypic_value (const TTQuanti *ind, const unsigned int trait)
 
bool setHeritabilityParams ()
 
bool setInitialValuesParams ()
 
bool setGeneticMapParams ()
 
unsigned int setAlleleModel ()
 
bool setMutationModel_no_pleio ()
 
bool setMutationModel_full_pleio ()
 
bool setMutationModel_var_pleio ()
 
void setTraitAndLocusTables_full_pleio ()
 
void setTraitAndLocusTables_no_pleio (TMatrix &mat)
 
bool setMutationCorrelation ()
 
bool setDominanceParameters ()
 
bool setDiallelicMutationModel ()
 
bool setMutationSigmaFromQuantiMutationVariance ()
 
bool setMutationSigmaFromQuantiMutationVariance_no_pleio ()
 
bool readMatrixFromQuantiMutationMatrix (vector< vector< double >> &varmat)
 
bool setContinuousMutationModel_no_pleio ()
 
bool setContinuousMutationModel_full_pleio ()
 
bool setContinuousMutationModel_var_pleio ()
 
void allocate_gsl_mutation_matrix_space (unsigned int num_locus)
 
void deallocate_gsl_mutation_matrix_space ()
 
gsl_matrix * set_gsl_mutation_matrix_from_sigma (unsigned int loc, unsigned int pleio_deg)
 
gsl_matrix * set_gsl_mutation_matrix (unsigned int pleio_deg, const vector< double > &varcov)
 
void set_mutation_matrix_decomposition (unsigned int loc, unsigned int pleio_deg)
 
double * getMutationEffectMultivariateGaussian (unsigned int loc)
 
double * getMutationEffectBivariateGaussian (unsigned int loc)
 
double * getMutationEffectUnivariateGaussian (unsigned int loc)
 
double * getMutationEffectMultivariateGaussianLocSpec (unsigned int loc)
 
double * getMutationEffectBivariateGaussianLocSpec (unsigned int loc)
 
double * getMutationEffectUnivariateGaussianLocSpec (unsigned int loc)
 
double * getMutationEffectUnivariateDiallelic (unsigned int loc)
 
double * getMutationEffectBivariateDiallelic (unsigned int loc)
 
double * getMutationEffects (unsigned int loc)
 
double * getMutationEffectsVarPleio (unsigned int loc)
 
void inherit (sex_t SEX, TTQuanti *ind, const TTQuanti *parent)
 
void inherit_free (sex_t SEX, TTQuanti *ind, const TTQuanti *parent)
 
void inherit_low (sex_t SEX, TTQuanti *ind, const TTQuanti *parent)
 
void mutate (TTQuanti *ind)
 
void mutate_nill (TTQuanti *ind)
 
void mutate_full_pleio (TTQuanti *ind)
 
void mutate_var_pleio (TTQuanti *ind)
 
void mutate_no_pleio (TTQuanti *ind)
 
void mutate_inplace_full_pleio (TTQuanti *ind)
 
void mutate_inplace_var_pleio (TTQuanti *ind)
 
void mutate_inplace_no_pleio (TTQuanti *ind)
 
void mutate_diallelic_pleio (TTQuanti *ind)
 
void mutate_diallelic_var_pleio (TTQuanti *ind)
 
void mutate_diallelic_no_pleio (TTQuanti *ind)
 
bool setEpistasisParameters ()
 
unsigned int get_num_epi_coefs ()
 
bool do_epistasis ()
 
const TMatrixget_epi_coefs () const
 
const TMatrixget_epi_coef_index () const
 
virtual void reset ()
 
virtual TTQuantihatch ()
 
virtual TProtoQuanticlone ()
 
virtual trait_t get_type () const
 
virtual bool setParameters ()
 
virtual void loadFileServices (FileServices *loader)
 
virtual void loadStatServices (StatServices *loader)
 
virtual bool resetParameterFromSource (std::string param, SimComponent *cmpt)
 
virtual void store_data (BinaryStorageBuffer *saver)
 
virtual bool retrieve_data (BinaryStorageBuffer *reader)
 
- Public Member Functions inherited from TTProtoWithMap
 TTProtoWithMap ()
 
 TTProtoWithMap (const TTProtoWithMap &TP)
 
virtual ~TTProtoWithMap ()
 
void setMapIndex (unsigned int idx)
 
unsigned int getMapIndex ()
 
bool setGeneticMapParameters (string prefix)
 
void addGeneticMapParameters (string prefix)
 
bool setRecombinationMapRandom ()
 
bool setRecombinationMapNonRandom (vector< vector< double > > *lociPositions)
 
bool setRecombinationMapFixed ()
 
bool setNumLociPerChromosome (string param_name)
 
void reset_recombination_pointers ()
 
void registerGeneticMap ()
 
void unregisterFromGeneticMap ()
 
bool areGeneticMapParamSet (string prefix)
 
bool isRecombinationFree (string prefix)
 
void recordRandomMap ()
 
- Public Member Functions inherited from TraitPrototype
virtual void set_index (int idx)
 Sets the traits index. More...
 
virtual int get_index ()
 Index getter. More...
 
- Public Member Functions inherited from StorableComponent
virtual ~StorableComponent ()
 
- Public Member Functions inherited from SimComponent
 SimComponent ()
 
virtual ~SimComponent ()
 
virtual void loadUpdaters (UpdaterServices *loader)
 Loads the parameters and component updater onto the updater manager. More...
 
virtual void set_paramset (ParamSet *paramset)
 Sets the ParamSet member. More...
 
virtual void set_paramset (std::string name, bool required, SimComponent *owner)
 Sets a new ParamSet and name it. More...
 
virtual void set_paramsetFromCopy (const ParamSet &PSet)
 Reset the set of parameters from a another set. More...
 
virtual ParamSetget_paramset ()
 ParamSet accessor. More...
 
virtual void add_parameter (Param *param)
 Interface to add a parameter to the set. More...
 
virtual void add_parameter (std::string Name, param_t Type, bool isRequired, bool isBounded, double low_bnd, double up_bnd)
 Interface to add a parameter to the set. More...
 
virtual void add_parameter (std::string Name, param_t Type, bool isRequired, bool isBounded, double low_bnd, double up_bnd, ParamUpdaterBase *updater)
 Interface to add a parameter and its updater to the set. More...
 
virtual Paramget_parameter (std::string name)
 Param getter. More...
 
virtual double get_parameter_value (std::string name)
 Param value getter. More...
 
virtual string get_name ()
 Returnd the name of the ParamSet, i.e. More...
 
virtual bool has_parameter (std::string name)
 Param getter. More...
 

Protected Attributes

unsigned int _num_locus
 Total number of loci, for all traits. More...
 
unsigned int _num_traits
 Number of traits. More...
 
unsigned int _seq_length
 Total number of loci, same as _num_locus. More...
 
unsigned int _allele_model
 
string _diallele_datatype
 
double _mutation_rate
 
double _genomic_mutation_rate
 
unsigned int _pleio_type
 
- Protected Attributes inherited from TTProtoWithMap
unsigned int _mapIndex
 
double _totRecombEventsMean
 
double _recombRate
 
double _mapResolution
 
unsigned int _numChromosome
 
unsigned int _numLoci
 
double * _recombRatePerChrmsm
 
unsigned int * _numLociPerChrmsm
 
unsigned int * _chrsmLength
 
unsigned int * _lociMapPositions
 
- Protected Attributes inherited from TraitPrototype
int _index
 The trait index in the Individual traits table. More...
 
- Protected Attributes inherited from SimComponent
ParamSet_paramSet
 The parameters container. More...
 

Private Attributes

TMatrix _allele_value
 
double * _sequence_diallele_values [2]
 
TMatrix _init_value
 
TMatrix _init_variance
 
double * _phenotypes
 
TMatrix _mutation_correlation
 
TMatrix _mutation_sigma
 
gsl_matrix ** _gsl_mutation_matrix
 
gsl_matrix ** _evect
 
gsl_vector ** _eval
 
gsl_vector ** _effects_multivar
 
gsl_vector ** _ws
 
double _effects_bivar [2]
 
unsigned int _doInitMutation
 
bool _mutationVarianceIsLocusSpecific
 
bool _mutationEffectIsFixedDiAllele
 
unsigned int _dominance_model
 
TMatrix _dominance_effects
 
bool * _all_chooser
 
size_t _locusByteSize
 
size_t _sizeofLocusType
 
vector< double > _eVariance
 
vector< double > _h2
 
unsigned int _h2_setTime
 
bool _h2_isBroad
 
TMatrix _pleio_matx
 Pleiotropy matrix provided in input (num locu X num trait). More...
 
vector< vector< unsigned int > > _trait_table
 Trait table, (num trait X (variable length/trait)), holds, for each trait, the array position of causative alleles in the sequence. More...
 
vector< vector< unsigned int > > _trait_locus_table
 Table storing the locus id of each locus affecting each trait (num trait X (variable length/trait)). More...
 
vector< vector< unsigned int > > _locus_table
 Locus table, num_locus x 2, first column holds the start position of the alleles of each locus in the sequence, second column counts the number of alleles = pleiotropic degree. More...
 
bool _epistasis
 
unsigned int _num_epi_coefs
 
TMatrix _epistatic_coefs_matrix
 
TMatrix _epistatic_coefs_indices
 
void(TProtoQuanti::* _inherit_fun_ptr )(sex_t, TTQuanti *, const TTQuanti *)
 Pointer to inheritance functions: either inherit_free() (r=0.5), or inherit_low() (r<0.5). More...
 
void(TProtoQuanti::* _mutation_func_ptr )(TTQuanti *)
 Pointer to mutation function, which depends on allele on model (HC, noHC, diallelic) More...
 
double *(TProtoQuanti::* _getMutationValues )(unsigned int)
 Pointer to mutation allele value function, which depends on allele model and number of traits affected. More...
 
vector< double *(TProtoQuanti::*)(unsigned int) > _getMutationValuesVarPleio
 Collection of pointers to mutation functions, which generate allele values in dependence of pleiotropic degree. More...
 
double(TProtoQuanti::* _getGenotypeWithDominance )(double, double, double)
 Pointer to either dominance_h() or dominance_k() function computing the genotypic value with dominance. More...
 
double(TProtoQuanti::* _set_trait_value_func_ptr )(const TTQuanti *, const unsigned int)
 Pointer to either set_trait_value_VE() or set_trait_value_noVE() to compute phenotypic values. More...
 
double(TProtoQuanti::* _set_genotype_func_ptr )(const TTQuanti *, const unsigned int)
 Pointer to functions get_genotype_value_additive() or get_genotype_value_dominance() computing the genotypic value of a trait as function of allele effect. More...
 
TTQuantiSH_stats
 
TTQuantiFH_writer
 
TTQuantiFH_reader
 
TTQFreqExtractor_freqExtractor
 
TTQOhtaStats_ohtaStats
 

Friends

class TTQuanti
 
class TTQuanti_continuous
 
class TTQuanti_continuous_full_pleio
 
class TTQuanti_continuous_var_pleio
 
class TTQuanti_continuous_no_pleio
 
class TTQuanti_continuous_single
 

Additional Inherited Members

- Static Public Member Functions inherited from TTProtoWithMap
static void recombine (unsigned long indID)
 
- Static Public Attributes inherited from TTProtoWithMap
static GeneticMap _map
 

Detailed Description

Constructor & Destructor Documentation

◆ TProtoQuanti() [1/2]

TProtoQuanti::TProtoQuanti ( )
64  :
65  _num_locus(0),
66  _num_traits(0),
67  _seq_length(0),
68  _allele_model(0),
70  _evect(0),
71  _eval(0),
73  _ws(0),
74  _mutation_rate(0),
76  _phenotypes(0),
77  _doInitMutation(0),
80  _h2_setTime(0),
81  _h2_isBroad(0),
82  _pleio_type(0),
84  _all_chooser(0),
85  _locusByteSize(0),
87  _eVariance(0),
88  _epistasis(false),
89 // _epistatic_mean(0),
90 // _epistatic_variance(0),
91 // _epistatic_prop_large(0),
92 // _epistatic_large_mean(0),
93 // _epistatic_large_variance(0),
94  _num_epi_coefs(0),
101  _stats(0),
102  _writer(0),
103  _reader(0),
104  _freqExtractor(0),
105  _ohtaStats(0)
106 {
107  set_paramset("quantitative_trait", false, this);
108 
109  add_parameter("quanti_traits",INT,true,false,0,0); // MANDATORY
110  add_parameter("quanti_loci",INT,true,false,0,0); // MANDATORY
111  add_parameter("quanti_loci_per_trait", MAT, false, false,0,0);
112  add_parameter("quanti_allele_model",STR,true,false,0,0); // MANDATORY
113  add_parameter("quanti_allele_value",DBL,false,false,0,0);
114  add_parameter("quanti_diallele_datatype", STR, false, false, 0, 0);
115  add_parameter("quanti_init_value",MAT,false,false,0,0);
116  add_parameter("quanti_init_variance",DBL,false,false,0,0,0);
117  add_parameter("quanti_init_model",INT,false,true,0,3);
118 
119  // heritability
120  add_parameter("quanti_environmental_variance",DBL,false,false,0,0);
121  add_parameter("quanti_heritability", DBL, false, false, 0, 0);
122  add_parameter("quanti_heritability_setTime",INT, false, false, 0,0);
123  add_parameter("quanti_heritability_isBroad",BOOL, false, false, 0,0);
124 
125  // mutations
126  add_parameter("quanti_mutation_rate",DBL,true,true,0,1, 0); // MANDATORY
127  add_parameter("quanti_mutation_variance",DBL,false,false,0,0, 0); // accept locus-specific values
128 
129  // pleiotropy
130  add_parameter("quanti_pleiotropy", STR, false, false, 0,0, 0); // optional
131  add_parameter("quanti_mutation_correlation",DBL,false,false,0,0, 0); // accept locus-specific values
132  add_parameter("quanti_mutation_matrix",MAT,false,false,0,0, 0);
133  add_parameter("quanti_pleio_matrix",INT,false,true,0,1); // allows user to set pleiotropic degree of loci
134 
135  //dominance
136 // add_parameter("quanti_dominance_model", INT, false, true, 0, 1, 0);
137  add_parameter("quanti_dominance_mean", DBL, false, false, 0, 0, 0);
138  add_parameter("quanti_dominance_sd", DBL, false, false, 0, 0, 0);
139  add_parameter("quanti_dominance_effects", DBL, false, false, 0, 0, 0);
140 
141  //epsistasis
142 // add_parameter("quanti_epistatic_mean",DBL,false,false,0,0,0);
143 // add_parameter("quanti_epistatic_variance",DBL,false,false,0,0,0);
144 // add_parameter("quanti_epistatic_prop_large",DBL,false,false,0,0,0);
145 // add_parameter("quanti_epistatic_large_mean",DBL,false,false,0,0,0);
146 // add_parameter("quanti_epistatic_large_variance",DBL,false,false,0,0,0);
147  add_parameter("quanti_epistatic_coefs", MAT, false, false, 0, 0, 0);
148 
149  //genetic map parameters:
151 
152  // output
153  add_parameter("quanti_output",STR,false,false,0,0);
154  add_parameter("quanti_logtime",INT,false,false,0,0);
155  add_parameter("quanti_dir",STR,false,false,0,0);
156 
157  add_parameter("quanti_freq_output",BOOL,false,false,0,0);
158  add_parameter("quanti_freq_logtime",INT,false,false,0,0);
159 
160  add_parameter("quanti_ohta_output",BOOL,false,false,0,0);
161  add_parameter("quanti_ohta_logtime",INT,false,false,0,0);
162 
163 
164 // some pointer initialization:
165  _sequence_diallele_values[0] = NULL;
166  _sequence_diallele_values[1] = NULL;
167 
168 }
virtual void set_paramset(ParamSet *paramset)
Sets the ParamSet member.
Definition: simcomponent.h:86
virtual void add_parameter(Param *param)
Interface to add a parameter to the set.
Definition: simcomponent.h:112
vector< double > _eVariance
Definition: ttquanti.h:620
unsigned int _allele_model
Definition: ttquanti.h:579
bool _epistasis
Definition: ttquanti.h:643
size_t _sizeofLocusType
Definition: ttquanti.h:617
unsigned int _doInitMutation
Definition: ttquanti.h:606
unsigned int _dominance_model
Definition: ttquanti.h:611
void(TProtoQuanti::* _inherit_fun_ptr)(sex_t, TTQuanti *, const TTQuanti *)
Pointer to inheritance functions: either inherit_free() (r=0.5), or inherit_low() (r<0....
Definition: ttquanti.h:657
bool _h2_isBroad
Definition: ttquanti.h:623
TTQuantiFH * _reader
Definition: ttquanti.h:692
unsigned int _h2_setTime
Definition: ttquanti.h:622
unsigned int _seq_length
Total number of loci, same as _num_locus.
Definition: ttquanti.h:578
double _mutation_rate
Definition: ttquanti.h:583
gsl_matrix ** _evect
Definition: ttquanti.h:601
gsl_vector ** _ws
Definition: ttquanti.h:604
bool _mutationVarianceIsLocusSpecific
Definition: ttquanti.h:607
double * _phenotypes
Definition: ttquanti.h:595
unsigned int _num_epi_coefs
Definition: ttquanti.h:649
unsigned int _num_traits
Number of traits.
Definition: ttquanti.h:576
double * _sequence_diallele_values[2]
Definition: ttquanti.h:592
TTQuantiSH * _stats
Definition: ttquanti.h:690
void(TProtoQuanti::* _mutation_func_ptr)(TTQuanti *)
Pointer to mutation function, which depends on allele on model (HC, noHC, diallelic)
Definition: ttquanti.h:660
gsl_vector ** _effects_multivar
Definition: ttquanti.h:603
double(TProtoQuanti::* _set_genotype_func_ptr)(const TTQuanti *, const unsigned int)
Pointer to functions get_genotype_value_additive() or get_genotype_value_dominance() computing the ge...
Definition: ttquanti.h:681
double _genomic_mutation_rate
Definition: ttquanti.h:584
gsl_matrix ** _gsl_mutation_matrix
Definition: ttquanti.h:600
bool * _all_chooser
Definition: ttquanti.h:615
double(TProtoQuanti::* _getGenotypeWithDominance)(double, double, double)
Pointer to either dominance_h() or dominance_k() function computing the genotypic value with dominanc...
Definition: ttquanti.h:669
size_t _locusByteSize
Definition: ttquanti.h:616
double(TProtoQuanti::* _set_trait_value_func_ptr)(const TTQuanti *, const unsigned int)
Pointer to either set_trait_value_VE() or set_trait_value_noVE() to compute phenotypic values.
Definition: ttquanti.h:675
double *(TProtoQuanti::* _getMutationValues)(unsigned int)
Pointer to mutation allele value function, which depends on allele model and number of traits affecte...
Definition: ttquanti.h:663
gsl_vector ** _eval
Definition: ttquanti.h:602
TTQuantiFH * _writer
Definition: ttquanti.h:691
bool _mutationEffectIsFixedDiAllele
Definition: ttquanti.h:608
TTQOhtaStats * _ohtaStats
Definition: ttquanti.h:694
unsigned int _num_locus
Total number of loci, for all traits.
Definition: ttquanti.h:574
unsigned int _pleio_type
Definition: ttquanti.h:587
TTQFreqExtractor * _freqExtractor
Definition: ttquanti.h:693
void addGeneticMapParameters(string prefix)
Definition: ttrait_with_map.cc:77
@ DBL
Definition: types.h:78
@ MAT
Definition: types.h:78
@ BOOL
Definition: types.h:78
@ STR
Definition: types.h:78
@ INT
Definition: types.h:78

References _sequence_diallele_values, SimComponent::add_parameter(), TTProtoWithMap::addGeneticMapParameters(), BOOL, DBL, INT, MAT, SimComponent::set_paramset(), and STR.

Referenced by clone().

◆ TProtoQuanti() [2/2]

TProtoQuanti::TProtoQuanti ( const TProtoQuanti T)
172  :
178  _evect(0),
179  _eval(0),
181  _ws(0),
184  _phenotypes(0),
185  _h2_setTime(0),
186  _h2_isBroad(0),
187  _pleio_type(0),
188  _doInitMutation(0),
191  _dominance_model(0),
192  _all_chooser(0),
193  _locusByteSize(0),
195  _eVariance(0),
197 // _epistatic_mean(T._epistatic_mean),
198 // _epistatic_variance(T._epistatic_variance),
199 // _epistatic_prop_large(T._epistatic_prop_large),
200 // _epistatic_large_mean(T._epistatic_large_mean),
201 // _epistatic_large_variance(T._epistatic_large_variance),
203  _inherit_fun_ptr(0),
209  _stats(0),
210  _writer(0),
211  _reader(0),
212  _freqExtractor(0),
213  _ohtaStats(0)
214 {
215  _locusByteSize = T._num_traits * sizeof(double);
216  _paramSet = new ParamSet( *(T._paramSet) ) ;
217 
219 
220  _sequence_diallele_values[0] = NULL;
221  _sequence_diallele_values[1] = NULL;
222 
225 
226 }
Parameters container, implemented in each SimComponent.
Definition: param.h:206
ParamSet * _paramSet
The parameters container.
Definition: simcomponent.h:48
void copy(const TMatrix &mat)
Copy a matrix.
Definition: tmatrix.h:78
TMatrix _pleio_matx
Pleiotropy matrix provided in input (num locu X num trait).
Definition: ttquanti.h:628
TMatrix _epistatic_coefs_matrix
Definition: ttquanti.h:650
TMatrix _epistatic_coefs_indices
Definition: ttquanti.h:651

References _epistatic_coefs_indices, _epistatic_coefs_matrix, _locusByteSize, _num_traits, SimComponent::_paramSet, _pleio_matx, _sequence_diallele_values, and TMatrix::copy().

◆ ~TProtoQuanti()

TProtoQuanti::~TProtoQuanti ( )
virtual
231 {
233 
234  if(_stats){delete _stats; _stats = NULL;}
235  if(_writer){delete _writer; _writer = NULL;}
236  if(_reader) delete _reader;
237  if(_freqExtractor){delete _freqExtractor; _freqExtractor = NULL;}
238  if(_ohtaStats) {delete _ohtaStats; _ohtaStats = NULL;}
239  if(_all_chooser) {delete [] _all_chooser; _all_chooser = NULL;}
240 
242  delete [] _sequence_diallele_values[0];
243  _sequence_diallele_values[0] = NULL;
244  }
245 
247  delete [] _sequence_diallele_values[1];
248  _sequence_diallele_values[1] = NULL;
249  }
250 
251 }
void deallocate_gsl_mutation_matrix_space()
Definition: ttquanti.cc:2113

References _all_chooser, _freqExtractor, _ohtaStats, _reader, _sequence_diallele_values, _stats, _writer, and deallocate_gsl_mutation_matrix_space().

Member Function Documentation

◆ allocate_gsl_mutation_matrix_space()

void TProtoQuanti::allocate_gsl_mutation_matrix_space ( unsigned int  num_locus)
2094 {
2095  _eval = new gsl_vector* [num_loc];
2096  _evect = new gsl_matrix* [num_loc];
2097  _effects_multivar = new gsl_vector* [num_loc];;
2098  _ws = new gsl_vector* [num_loc];
2099  _gsl_mutation_matrix = new gsl_matrix* [num_loc];
2100 
2101  // initializing pointers
2102  for(unsigned int i = 0; i < num_loc; ++i) {
2103  _eval[i] = NULL;
2104  _evect[i] = NULL;
2105  _effects_multivar[i] = NULL;
2106  _ws[i] = NULL;
2107  _gsl_mutation_matrix[i] = NULL;
2108  }
2109 }

References _effects_multivar, _eval, _evect, _gsl_mutation_matrix, and _ws.

Referenced by setContinuousMutationModel_full_pleio(), and setContinuousMutationModel_var_pleio().

◆ clone()

virtual TProtoQuanti* TProtoQuanti::clone ( )
inlinevirtual

Implements TraitPrototype.

554 {return new TProtoQuanti(*this);}
TProtoQuanti()
Definition: ttquanti.cc:64

References TProtoQuanti().

◆ deallocate_gsl_mutation_matrix_space()

void TProtoQuanti::deallocate_gsl_mutation_matrix_space ( )
2114 {
2115 
2116  unsigned int SIZE = 1;
2117 
2118  if(_mutationVarianceIsLocusSpecific) // this should represent the state of the simulation which did the allocation
2119  SIZE = _num_locus;
2120 
2122 
2123  for(unsigned int i = 0; i < SIZE; ++i)
2124  if(_gsl_mutation_matrix[i]) gsl_matrix_free(_gsl_mutation_matrix[i]);
2125 
2126  delete [] _gsl_mutation_matrix;
2127  _gsl_mutation_matrix = NULL;
2128  }
2129 
2130  if(_evect) {
2131  for(unsigned int i = 0; i < SIZE; ++i)
2132  if(_evect[i]) gsl_matrix_free(_evect[i]);
2133  delete [] _evect;
2134  _evect = NULL;
2135  }
2136 
2137  if(_eval){
2138  for(unsigned int i = 0; i < SIZE; ++i)
2139  if(_eval[i]) gsl_vector_free(_eval[i]);
2140  delete [] _eval;
2141  _eval = NULL;
2142  }
2143 
2144  if(_effects_multivar) {
2145  for(unsigned int i = 0; i < SIZE; ++i)
2146  if(_effects_multivar[i]) gsl_vector_free(_effects_multivar[i]);
2147  delete [] _effects_multivar;
2148  _effects_multivar = NULL;
2149  }
2150 
2151  if(_ws) {
2152  for(unsigned int i = 0; i < SIZE; ++i)
2153  if(_ws[i]) gsl_vector_free(_ws[i]);
2154  delete [] _ws;
2155  _ws = NULL;
2156  }
2157 
2158 }

References _effects_multivar, _eval, _evect, _gsl_mutation_matrix, _mutationVarianceIsLocusSpecific, _num_locus, and _ws.

Referenced by setParameters(), and ~TProtoQuanti().

◆ do_epistasis()

bool TProtoQuanti::do_epistasis ( )
inline

◆ get_allele_model()

◆ get_allele_position()

int TProtoQuanti::get_allele_position ( const unsigned int  locus,
const unsigned int  trait 
)
2434 {
2435  // not assured that the locus is affecting that trait, first check
2436  if(std::any_of(_trait_locus_table[trait].cbegin(), _trait_locus_table[trait].cend(),
2437  [locus](unsigned int i){return (i == locus);})) {
2438 
2439  // we have to find where the locus sits in the table
2440  vector<unsigned int>::const_iterator I = find(_trait_locus_table[trait].cbegin(), _trait_locus_table[trait].cend(),
2441  locus);
2442  // find index of pointer
2443  unsigned int pos = I - _trait_locus_table[trait].cbegin();
2444 
2445  return _trait_table[trait][pos];
2446  }
2447  return -1;
2448 }
vector< vector< unsigned int > > _trait_locus_table
Table storing the locus id of each locus affecting each trait (num trait X (variable length/trait)).
Definition: ttquanti.h:634
vector< vector< unsigned int > > _trait_table
Trait table, (num trait X (variable length/trait)), holds, for each trait, the array position of caus...
Definition: ttquanti.h:631

References _trait_locus_table, and _trait_table.

Referenced by get_allele_value().

◆ get_allele_value()

double TProtoQuanti::get_allele_value ( const TTQuanti ind,
const unsigned int  allele,
const unsigned int  locus,
const unsigned int  trait 
)
2453 {
2454  assert(allele < 2); // can be 0 or 1 only
2455 
2456  int pos = get_allele_position(locus, trait);
2457 
2458  if(pos > -1)
2459  return ind->get_allele_value(pos, allele);
2460  else
2461  return error("TProtoQuanti::get_allele_value::wrong allele position at locus %i for trait %i\n", locus, trait);
2462 }
int get_allele_position(const unsigned int locus, const unsigned int trait)
Definition: ttquanti.cc:2433
virtual double get_allele_value(int loc, int all) const =0
Called to read one allele value at a particular locus.
int error(const char *str,...)
Definition: output.cc:77

References error(), get_allele_position(), and TTrait::get_allele_value().

◆ get_diallele_value()

double TProtoQuanti::get_diallele_value ( unsigned int  locus,
unsigned int  allele 
)
inline
431  {return _allele_value.get(locus, allele);}
double get(unsigned int i, unsigned int j) const
Accessor to element at row i and column j.
Definition: tmatrix.h:193
TMatrix _allele_value
Definition: ttquanti.h:591

References _allele_value, and TMatrix::get().

◆ get_diallele_values()

const TMatrix& TProtoQuanti::get_diallele_values ( )
inline

◆ get_doInitMutation()

◆ get_dominance()

double TProtoQuanti::get_dominance ( unsigned int  locus,
unsigned int  trait 
)
inline
463  {return _dominance_effects.get(trait, locus); }
TMatrix _dominance_effects
Definition: ttquanti.h:612

References _dominance_effects, and TMatrix::get().

Referenced by get_genotype_with_dominance().

◆ get_dominance_model()

◆ get_env_var()

vector<double> TProtoQuanti::get_env_var ( )
inline

◆ get_epi_coef_index()

◆ get_epi_coefs()

◆ get_genotype_dominance_h()

double TProtoQuanti::get_genotype_dominance_h ( double  a1,
double  a2,
double  h 
)
inline
2523 {
2524  if(a1<a2) return 2*((1-h)*a1 + h*a2);
2525  return 2*((1-h)*a2 + h*a1);
2526 }

◆ get_genotype_dominance_k()

double TProtoQuanti::get_genotype_dominance_k ( double  a1,
double  a2,
double  k 
)
inline
2540 {
2541  return a1 + a2 + k*abs(a2-a1);
2542 }

Referenced by get_genotype_with_dominance(), and setParameters().

◆ get_genotype_with_dominance()

double TProtoQuanti::get_genotype_with_dominance ( const double  a1,
const double  a2,
const unsigned int  locus,
const unsigned int  trait 
)

◆ get_genotypic_value()

double TProtoQuanti::get_genotypic_value ( const TTQuanti ind,
const unsigned int  trait 
)
inline

◆ get_h2_isBroad()

bool TProtoQuanti::get_h2_isBroad ( )
inline
427 {return _h2_isBroad;}

References _h2_isBroad.

Referenced by TTQuantiSH::getVaWithDominance().

◆ get_h2_setTime()

unsigned int TProtoQuanti::get_h2_setTime ( )
inline
426 {return _h2_setTime;}

References _h2_setTime.

Referenced by LCE_Breed_Quanti::setVefromVa().

◆ get_heritability()

vector<double> TProtoQuanti::get_heritability ( )
inline

◆ get_init_value()

◆ get_init_variance()

◆ get_locus_byte_size()

◆ get_locus_ID()

◆ get_locus_PD()

◆ get_locus_seq_pos()

unsigned int TProtoQuanti::get_locus_seq_pos ( unsigned int  loc,
unsigned int  trait 
)
inline
441  {return _trait_table[trait][loc];}

References _trait_table.

Referenced by TTQuantiFH::FHread(), TTQFreqExtractor::FHwrite(), TTQuanti_continuous_var_pleio::get_additive_genotype(), TTQuanti_continuous_no_pleio::get_additive_genotype(), TTQuanti_diallelic_no_pleio::get_additive_genotype(), TTQuanti_diallelic_full_pleio::get_additive_genotype(), TTQuanti_diallelic_var_pleio::get_additive_genotype(), TTQuanti_diallelic_bitstring_no_pleio::get_additive_genotype(), TTQuanti_diallelic_bitstring_full_pleio::get_additive_genotype(), TTQuanti_diallelic_bitstring_var_pleio::get_additive_genotype(), TTQuanti_diallelic_full_pleio_epistasis::get_additive_genotype(), TTQuanti_continuous_no_pleio_epistasis::get_additive_genotype(), TTQuanti_diallelic_no_pleio_epistasis::get_additive_genotype(), TTQuanti_continuous_var_pleio::get_dominant_genotype(), TTQuanti_continuous_no_pleio::get_dominant_genotype(), TTQuanti_diallelic_no_pleio::get_dominant_genotype(), TTQuanti_diallelic_full_pleio::get_dominant_genotype(), TTQuanti_diallelic_var_pleio::get_dominant_genotype(), TTQuanti_diallelic_bitstring_no_pleio::get_dominant_genotype(), TTQuanti_diallelic_bitstring_full_pleio::get_dominant_genotype(), TTQuanti_diallelic_bitstring_var_pleio::get_dominant_genotype(), TTQuanti_diallelic_full_pleio_epistasis::get_dominant_genotype(), TTQuanti_continuous_no_pleio_epistasis::get_dominant_genotype(), TTQuanti_diallelic_no_pleio_epistasis::get_dominant_genotype(), TTQuantiSH::getVaWithDominance(), TTQuanti_continuous_var_pleio::init_sequence(), TTQuanti_continuous_no_pleio::init_sequence(), TTQuanti_diallelic_full_pleio::init_sequence(), TTQuanti_diallelic_var_pleio::init_sequence(), TTQuanti_diallelic_bitstring_full_pleio::init_sequence(), TTQuanti_diallelic_bitstring_var_pleio::init_sequence(), TTQuanti_diallelic_full_pleio_epistasis::init_sequence(), TTQuanti_continuous_no_pleio_epistasis::init_sequence(), TTQuantiFH::print(), TTQuantiFH::print_PLINK_PED(), setDiallelicMutationModel(), TTQuanti_continuous_var_pleio::show_up(), TTQuanti_continuous_no_pleio::show_up(), TTQuanti_diallelic_no_pleio::show_up(), TTQuanti_diallelic_full_pleio::show_up(), TTQuanti_diallelic_var_pleio::show_up(), TTQuanti_diallelic_bitstring_no_pleio::show_up(), TTQuanti_diallelic_bitstring_full_pleio::show_up(), TTQuanti_diallelic_bitstring_var_pleio::show_up(), TTQuanti_diallelic_full_pleio_epistasis::show_up(), TTQuanti_continuous_no_pleio_epistasis::show_up(), and TTQuanti_diallelic_no_pleio_epistasis::show_up().

◆ get_locus_start_pos()

◆ get_num_epi_coefs()

unsigned int TProtoQuanti::get_num_epi_coefs ( )
inline
546 {return _num_epi_coefs;}

References _num_epi_coefs.

◆ get_num_locus() [1/2]

unsigned int TProtoQuanti::get_num_locus ( )
inline
418 {return _num_locus;}

References _num_locus.

Referenced by TTQuantiFH::FHread(), TTQFreqExtractor::FHwrite(), TTQOhtaStats::FHwrite(), TTQuanti_continuous_full_pleio::get_additive_genotype(), TTQuanti_continuous_var_pleio::get_additive_genotype(), TTQuanti_continuous_no_pleio::get_additive_genotype(), TTQuanti_continuous_single::get_additive_genotype(), TTQuanti_diallelic_no_pleio::get_additive_genotype(), TTQuanti_diallelic_full_pleio::get_additive_genotype(), TTQuanti_diallelic_var_pleio::get_additive_genotype(), TTQuanti_diallelic_bitstring_no_pleio::get_additive_genotype(), TTQuanti_diallelic_bitstring_full_pleio::get_additive_genotype(), TTQuanti_diallelic_bitstring_var_pleio::get_additive_genotype(), TTQuanti_continuous_full_pleio_epistasis::get_additive_genotype(), TTQuanti_diallelic_full_pleio_epistasis::get_additive_genotype(), TTQuanti_continuous_no_pleio_epistasis::get_additive_genotype(), TTQuanti_diallelic_no_pleio_epistasis::get_additive_genotype(), TTQuanti_continuous_full_pleio::get_dominant_genotype(), TTQuanti_continuous_var_pleio::get_dominant_genotype(), TTQuanti_continuous_no_pleio::get_dominant_genotype(), TTQuanti_continuous_single::get_dominant_genotype(), TTQuanti_diallelic_no_pleio::get_dominant_genotype(), TTQuanti_diallelic_full_pleio::get_dominant_genotype(), TTQuanti_diallelic_var_pleio::get_dominant_genotype(), TTQuanti_diallelic_bitstring_no_pleio::get_dominant_genotype(), TTQuanti_diallelic_bitstring_full_pleio::get_dominant_genotype(), TTQuanti_diallelic_bitstring_var_pleio::get_dominant_genotype(), TTQuanti_continuous_full_pleio_epistasis::get_dominant_genotype(), TTQuanti_diallelic_full_pleio_epistasis::get_dominant_genotype(), TTQuanti_continuous_no_pleio_epistasis::get_dominant_genotype(), TTQuanti_diallelic_no_pleio_epistasis::get_dominant_genotype(), TTQuantiSH::getVaWithDominance(), TTQuantiSH::init(), TTQuanti_continuous_full_pleio::init_sequence(), TTQuanti_continuous_var_pleio::init_sequence(), TTQuanti_continuous_no_pleio::init_sequence(), TTQuanti_diallelic_no_pleio::init_sequence(), TTQuanti_diallelic_full_pleio::init_sequence(), TTQuanti_diallelic_var_pleio::init_sequence(), TTQuanti_diallelic_bitstring_no_pleio::init_sequence(), TTQuanti_diallelic_bitstring_full_pleio::init_sequence(), TTQuanti_diallelic_bitstring_var_pleio::init_sequence(), TTQuanti_continuous_full_pleio_epistasis::init_sequence(), TTQuanti_diallelic_full_pleio_epistasis::init_sequence(), TTQuanti_continuous_no_pleio_epistasis::init_sequence(), TTQuanti_diallelic_no_pleio_epistasis::init_sequence(), TTQuanti_continuous::operator==(), TTQuanti_diallelic::operator==(), TTQuanti_diallelic_bitstring::operator==(), TTQuantiFH::print(), TTQuantiFH::print_PLINK_PED(), setDiallelicMutationModel(), LCE_QuantiInit::setParameters(), TTQuanti_continuous_full_pleio::show_up(), TTQuanti_continuous_var_pleio::show_up(), TTQuanti_continuous_no_pleio::show_up(), TTQuanti_diallelic_no_pleio::show_up(), TTQuanti_diallelic_full_pleio::show_up(), TTQuanti_diallelic_var_pleio::show_up(), TTQuanti_diallelic_bitstring_no_pleio::show_up(), TTQuanti_diallelic_bitstring_full_pleio::show_up(), TTQuanti_diallelic_bitstring_var_pleio::show_up(), TTQuanti_continuous_full_pleio_epistasis::show_up(), TTQuanti_diallelic_full_pleio_epistasis::show_up(), TTQuanti_continuous_no_pleio_epistasis::show_up(), TTQuanti_diallelic_no_pleio_epistasis::show_up(), TTQuantiFH::write_PLINK(), and TTQuantiFH::write_TABLE().

◆ get_num_locus() [2/2]

unsigned int TProtoQuanti::get_num_locus ( unsigned int  trait)
inline
419 {return _trait_table[trait].size();}

References _trait_table.

◆ get_num_traits()

unsigned int TProtoQuanti::get_num_traits ( )
inline
417 {return _num_traits;}

References _num_traits.

Referenced by LCE_PhenotypeExpression::check_g_index_matrix(), TTQuanti_diallelic_bitstring_full_pleio::copy_sequence_1locus(), TTQuanti_continuous_full_pleio_epistasis::copy_sequence_1locus(), TTQuanti_diallelic_full_pleio_epistasis::copy_sequence_1locus(), TTQuanti_continuous_full_pleio::copy_sequence_1locus(), TTQuanti_diallelic_full_pleio::copy_sequence_1locus(), TTQuanti_diallelic_bitstring_full_pleio::copy_sequence_block(), TTQuanti_continuous_full_pleio_epistasis::copy_sequence_block(), TTQuanti_diallelic_full_pleio_epistasis::copy_sequence_block(), TTQuanti_continuous_full_pleio::copy_sequence_block(), TTQuanti_diallelic_full_pleio::copy_sequence_block(), TTQuantiFH::FHread(), TTQFreqExtractor::FHwrite(), TTQOhtaStats::FHwrite(), TTQuanti_continuous_full_pleio::get_additive_genotype(), TTQuanti_diallelic_full_pleio::get_additive_genotype(), TTQuanti_diallelic_bitstring_full_pleio::get_additive_genotype(), TTQuanti_continuous_full_pleio_epistasis::get_additive_genotype(), TTQuanti_diallelic_full_pleio_epistasis::get_additive_genotype(), TTQuanti_continuous_full_pleio::get_dominant_genotype(), TTQuanti_diallelic_full_pleio::get_dominant_genotype(), TTQuanti_diallelic_bitstring_full_pleio::get_dominant_genotype(), TTQuanti_continuous_full_pleio_epistasis::get_dominant_genotype(), TTQuanti_diallelic_full_pleio_epistasis::get_dominant_genotype(), TTQuanti_continuous::init(), TTQuanti_diallelic::init(), TTQuantiSH::init(), TTQuanti_diallelic_bitstring::init(), TTQuanti_continuous_full_pleio::init_sequence(), TTQuanti_continuous_var_pleio::init_sequence(), TTQuanti_continuous_no_pleio::init_sequence(), TTQuanti_diallelic_full_pleio::init_sequence(), TTQuanti_diallelic_var_pleio::init_sequence(), TTQuanti_diallelic_bitstring_full_pleio::init_sequence(), TTQuanti_diallelic_bitstring_var_pleio::init_sequence(), TTQuanti_continuous_full_pleio_epistasis::init_sequence(), TTQuanti_diallelic_full_pleio_epistasis::init_sequence(), TTQuanti_continuous_no_pleio_epistasis::init_sequence(), TTQuanti_continuous::operator==(), TTQuanti_diallelic::operator==(), TTQuanti_diallelic_bitstring::operator==(), TTQuantiFH::print(), TTQuantiFH::print_PLINK_FAM(), TTQuantiFH::print_PLINK_PED(), LCE_PhenotypeExpression::set_g_value_matrix(), TTQuanti::set_value(), LCE_QuantiModifier::setVefromVa(), LCE_Breed_Quanti::setVefromVa(), TTQuanti_continuous_full_pleio::show_up(), TTQuanti_continuous_var_pleio::show_up(), TTQuanti_continuous_no_pleio::show_up(), TTQuanti_diallelic_no_pleio::show_up(), TTQuanti_diallelic_full_pleio::show_up(), TTQuanti_diallelic_var_pleio::show_up(), TTQuanti_diallelic_bitstring_no_pleio::show_up(), TTQuanti_diallelic_bitstring_full_pleio::show_up(), TTQuanti_diallelic_bitstring_var_pleio::show_up(), TTQuanti_continuous_full_pleio_epistasis::show_up(), TTQuanti_diallelic_full_pleio_epistasis::show_up(), TTQuanti_continuous_no_pleio_epistasis::show_up(), TTQuanti_diallelic_no_pleio_epistasis::show_up(), TTQuantiFH::write_PLINK(), and TTQuantiFH::write_TABLE().

◆ get_phenotypic_value()

double TProtoQuanti::get_phenotypic_value ( const TTQuanti ind,
const unsigned int  trait 
)
inline
472  {
473  return (this->*_set_trait_value_func_ptr)(ind, trait);
474  }

References _set_trait_value_func_ptr.

Referenced by TTQuanti::set_value().

◆ get_pleio_matrix()

const TMatrix& TProtoQuanti::get_pleio_matrix ( )
inline
439 {return _pleio_matx;}

References _pleio_matx.

◆ get_pleiotropy_type()

unsigned int TProtoQuanti::get_pleiotropy_type ( )
inline

◆ get_seq_diallele_value()

◆ get_seq_length()

unsigned int TProtoQuanti::get_seq_length ( )
inline
421 {return _seq_length;}

References _seq_length.

Referenced by TTQuantiFH::FHread(), TTQFreqExtractor::FHwrite(), TTQuanti_diallelic_bitstring::get_allele_bit(), TTQuanti_continuous::get_allele_value(), TTQuanti_diallelic::get_allele_value(), TTQuanti_diallelic_bitstring::get_allele_value(), TTQuantiSH::getSNPalleleFreqInPatch(), TTQuanti_continuous::init(), TTQuanti_diallelic::init(), TTQuanti_diallelic_bitstring::init(), TTQuanti_diallelic_no_pleio::init_sequence(), TTQuanti_diallelic_full_pleio::init_sequence(), TTQuanti_diallelic_var_pleio::init_sequence(), TTQuanti_diallelic_bitstring_full_pleio::init_sequence(), TTQuanti_diallelic_bitstring_var_pleio::init_sequence(), TTQuanti_diallelic_full_pleio_epistasis::init_sequence(), TTQuanti_diallelic_no_pleio_epistasis::init_sequence(), TTQuanti_continuous::operator=(), TTQuanti_diallelic::operator=(), TTQuanti_continuous::operator==(), TTQuanti_diallelic::operator==(), TTQuanti_diallelic_bitstring::operator==(), TTQuanti_continuous::retrieve_data(), TTQuanti_diallelic::retrieve_data(), TTQuanti_diallelic_bitstring::set_allele_bit(), TTQuanti_continuous::set_sequence(), TTQuanti_diallelic::set_sequence(), TTQuanti_continuous_full_pleio::show_up(), TTQuanti_continuous_var_pleio::show_up(), TTQuanti_continuous_no_pleio::show_up(), TTQuanti_diallelic_no_pleio::show_up(), TTQuanti_diallelic_full_pleio::show_up(), TTQuanti_diallelic_var_pleio::show_up(), TTQuanti_diallelic_bitstring_no_pleio::show_up(), TTQuanti_diallelic_bitstring_full_pleio::show_up(), TTQuanti_diallelic_bitstring_var_pleio::show_up(), TTQuanti_continuous_full_pleio_epistasis::show_up(), TTQuanti_diallelic_full_pleio_epistasis::show_up(), TTQuanti_continuous_no_pleio_epistasis::show_up(), TTQuanti_diallelic_no_pleio_epistasis::show_up(), TTQuanti_continuous::store_data(), and TTQuanti_diallelic::store_data().

◆ get_size_locus_type()

◆ get_stater()

TTQuantiSH* TProtoQuanti::get_stater ( )
inline
437 {return _stats;}

References _stats.

Referenced by LCE_QuantiModifier::setVefromVa(), and LCE_Breed_Quanti::setVefromVa().

◆ get_trait_mutation_variance()

double TProtoQuanti::get_trait_mutation_variance ( unsigned int  trait)
2547 {
2548  double Vm;
2549 
2550  if(_mutation_sigma.nrows() == 1) // same value for all loci
2551  Vm = 2 * _genomic_mutation_rate * _mutation_sigma.get(0, trait);
2552  else
2553  Vm = _mutation_sigma.colSum(trait) * _mutation_rate * 2;
2554 
2555  return Vm;
2556 }
double colSum(unsigned int col)
Sum all elements in a column.
Definition: tmatrix.h:308
unsigned int nrows() const
Definition: tmatrix.h:213
TMatrix _mutation_sigma
Definition: ttquanti.h:599

References _genomic_mutation_rate, _mutation_rate, _mutation_sigma, TMatrix::colSum(), TMatrix::get(), and TMatrix::nrows().

◆ get_type()

virtual trait_t TProtoQuanti::get_type ( ) const
inlinevirtual

Implements TraitPrototype.

555 {return QUANT;}
#define QUANT
Definition: types.h:72

References QUANT.

Referenced by TTQuantiSH::init(), TTQuantiFH::setOutputOption(), and TTQuantiFH::write_PLINK().

◆ getMutationEffectBivariateDiallelic()

double * TProtoQuanti::getMutationEffectBivariateDiallelic ( unsigned int  loc)
2423 {
2424  bool pos = RAND::RandBool();
2425  _effects_bivar[0] = _allele_value.get(loc, pos);
2427  pos : RAND::RandBool()) );
2428  return &_effects_bivar[0];
2429 }
static double Uniform()
Generates a random number from [0.0, 1.0[ uniformly distributed.
Definition: Uniform.h:124
static bool RandBool()
Returns a random boolean.
Definition: Uniform.h:162
TMatrix _mutation_correlation
Definition: ttquanti.h:598
double _effects_bivar[2]
Definition: ttquanti.h:605

References _allele_value, _effects_bivar, _mutation_correlation, TMatrix::get(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_full_pleio().

◆ getMutationEffectBivariateGaussian()

double * TProtoQuanti::getMutationEffectBivariateGaussian ( unsigned int  loc)
2380 {
2381  //no need to assert() as we are using a different set of containers and read from mutation_sigma directly
2383  &_effects_bivar[0], &_effects_bivar[1]);
2384  return &_effects_bivar[0];
2385 }
static void BivariateGaussian(double sigma1, double sigma2, double rho, double *out1, double *out2)
Definition: Uniform.h:330

References _effects_bivar, _mutation_correlation, _mutation_sigma, RAND::BivariateGaussian(), and TMatrix::get().

Referenced by setMutationModel_full_pleio(), and setMutationModel_var_pleio().

◆ getMutationEffectBivariateGaussianLocSpec()

double * TProtoQuanti::getMutationEffectBivariateGaussianLocSpec ( unsigned int  loc)

◆ getMutationEffectMultivariateGaussian()

double * TProtoQuanti::getMutationEffectMultivariateGaussian ( unsigned int  loc)
2356 {
2357  // assert we are using the correct mutation environment
2358  assert(get_locus_PD(loc) == _effects_multivar[0]->size);
2359 
2360  RAND::MultivariateGaussian(_eval[0], _evect[0], _ws[0], _effects_multivar[0]);
2361 
2362  return _effects_multivar[0]->data;
2363 }
unsigned int get_locus_PD(unsigned int locus)
Definition: ttquanti.h:444

References _effects_multivar, _eval, _evect, _ws, and get_locus_PD().

Referenced by setMutationModel_full_pleio().

◆ getMutationEffectMultivariateGaussianLocSpec()

double * TProtoQuanti::getMutationEffectMultivariateGaussianLocSpec ( unsigned int  loc)
2368 {
2369  // assert we are using the correct mutation environment
2370  assert(get_locus_PD(loc) == _effects_multivar[loc]->size);
2371 
2372  RAND::MultivariateGaussian(_eval[loc], _evect[loc], _ws[loc], _effects_multivar[loc]);
2373 
2374  return _effects_multivar[loc]->data;
2375 }

References _effects_multivar, _eval, _evect, _ws, and get_locus_PD().

Referenced by setMutationModel_full_pleio(), and setMutationModel_var_pleio().

◆ getMutationEffects()

double* TProtoQuanti::getMutationEffects ( unsigned int  loc)
inline

◆ getMutationEffectsVarPleio()

double* TProtoQuanti::getMutationEffectsVarPleio ( unsigned int  loc)
inline
519  {
520  return (this->* _getMutationValuesVarPleio[loc]) (loc);
521  }
vector< double *(TProtoQuanti::*)(unsigned int) > _getMutationValuesVarPleio
Collection of pointers to mutation functions, which generate allele values in dependence of pleiotrop...
Definition: ttquanti.h:666

References _getMutationValuesVarPleio.

Referenced by TTQuanti_continuous_var_pleio::init_sequence().

◆ getMutationEffectUnivariateDiallelic()

double * TProtoQuanti::getMutationEffectUnivariateDiallelic ( unsigned int  loc)
2415 {
2417  return &_effects_bivar[0];
2418 }

References _allele_value, _effects_bivar, TMatrix::get(), and RAND::RandBool().

◆ getMutationEffectUnivariateGaussian()

double * TProtoQuanti::getMutationEffectUnivariateGaussian ( unsigned int  loc)
2399 {
2401  return &_effects_bivar[0];
2402 }
static double Gaussian(double sigma)
Definition: Uniform.h:261

References _effects_bivar, _mutation_sigma, RAND::Gaussian(), and TMatrix::get().

Referenced by setMutationModel_no_pleio(), and setMutationModel_var_pleio().

◆ getMutationEffectUnivariateGaussianLocSpec()

double * TProtoQuanti::getMutationEffectUnivariateGaussianLocSpec ( unsigned int  loc)

◆ hatch()

TTQuanti * TProtoQuanti::hatch ( )
virtual

Implements TraitPrototype.

2879 {
2880  TTQuanti* kid;
2881 
2882  if(_epistasis && _diallele_datatype == "bit")
2883  fatal("diallelic quantitative trait loci coded on bitstring are not implemented for the epistatic case.\n");
2884 
2885  if(_epistasis && _pleio_type == 2)
2886  fatal("quantitative trait loci with variable pleiotropy are not implemented for the epistatic case.\n");
2887 
2888  if(_pleio_type == 0) { //non-pleiotropic cases
2889 
2890  if(_allele_model <= 2) { // diallelic
2891 
2892  if(_epistasis) {
2894  }
2895  else if(_diallele_datatype == "byte") {
2896  kid = new TTQuanti_diallelic_no_pleio();
2897  } else {
2899  }
2900 
2901  } else { // continious
2902 
2903  if(_epistasis)
2905  else
2906  kid = new TTQuanti_continuous_no_pleio();
2907  }
2908 
2909  } else if (_pleio_type == 1) { //full-pleiotropic cases
2910 
2911  if(_allele_model <= 2) {
2912 
2913  if(_epistasis) {
2915  }
2916  else if(_diallele_datatype == "byte") {
2917  kid = new TTQuanti_diallelic_full_pleio();
2918  } else {
2920  }
2921 
2922  } else {
2923 
2924  if(_epistasis)
2926  else
2927  kid = new TTQuanti_continuous_full_pleio();
2928  }
2929 
2930  } else { // variable pleiotropy cases
2931 
2932  if(_allele_model <= 2) {
2933 
2934  if(_diallele_datatype == "byte")
2935  kid = new TTQuanti_diallelic_var_pleio();
2936  else
2938 
2939  } else {
2940  kid = new TTQuanti_continuous_var_pleio();
2941  }
2942  }
2943 
2944  kid->set_proto(this);
2945 
2946  return kid;
2947 }
friend class TTQuanti_continuous_var_pleio
Definition: ttquanti.h:686
string _diallele_datatype
Definition: ttquanti.h:580
friend class TTQuanti_continuous_no_pleio
Definition: ttquanti.h:687
friend class TTQuanti_continuous_full_pleio
Definition: ttquanti.h:685
TTQuanti_continuous_full_pleio : universal pleiotropy.
Definition: ttquanti_epistasis.h:39
TTQuanti_continuous_no_pleio : multiple non-pleiotropic traits with epistasis.
Definition: ttquanti_epistasis.h:99
TTQuanti_diallelic_bitstring_full_pleio : pleiotropic di-allelic loci, max PD = 2.
Definition: ttquanti_bitstring.h:128
TTQuanti_diallelic_bitstring_no_pleio : single or multiple non-pleiotropic traits,...
Definition: ttquanti_bitstring.h:98
TTQuanti_diallelic_bitstring_var_pleio : variable pleiotropic di-allelic loci, max PD = 2.
Definition: ttquanti_bitstring.h:155
TTQuanti_diallelic_full_pleio : pleiotropic di-allelic loci, max PD = 2.
Definition: ttquanti_epistasis.h:69
TTQuanti_diallelic_full_pleio : pleiotropic di-allelic loci, max PD = 2.
Definition: ttquanti.h:350
TTQuanti_diallelic_no_pleio_epistasis : single or multiple non-pleiotropic traits,...
Definition: ttquanti_epistasis.h:128
TTQuanti_diallelic_no_pleio : single or multiple non-pleiotropic traits, di-allelic.
Definition: ttquanti.h:323
TTQuanti_diallelic_var_pleio : variable pleiotropic di-allelic loci, max PD = 2.
Definition: ttquanti.h:377
TTQuanti.
Definition: ttquanti.h:59
void set_proto(TProtoQuanti *proto)
Definition: ttquanti.h:95
void fatal(const char *str,...)
Definition: output.cc:96

References _allele_model, _diallele_datatype, _epistasis, _pleio_type, fatal(), TTQuanti::set_proto(), TTQuanti_continuous_full_pleio, TTQuanti_continuous_no_pleio, and TTQuanti_continuous_var_pleio.

Referenced by setParameters().

◆ inherit()

void TProtoQuanti::inherit ( sex_t  SEX,
TTQuanti ind,
const TTQuanti parent 
)
inline
2561 {
2562  (this->*_inherit_fun_ptr)(SEX, ind, parent);
2563 }

References _inherit_fun_ptr.

Referenced by TTQuanti::inherit().

◆ inherit_free()

void TProtoQuanti::inherit_free ( sex_t  SEX,
TTQuanti ind,
const TTQuanti parent 
)
inline
2606 {
2607 // assert(_all_chooser);
2608 
2609 // for(unsigned int i = 0; i < _num_locus; ++i)
2610 // _all_chooser[i] = RAND::RandBool();
2611 
2612  // copy the information for one locus at a time
2613  for(unsigned int i = 0; i < _num_locus; ++i)
2614 // ind->copy_sequence_block(SEX, _all_chooser[i], i, i+1, parent);
2615  ind->copy_sequence_1locus(SEX, RAND::RandBool(), i, parent);
2616 
2617  // note that more than one value may be copied at a time because of pleiotropy
2618 }
virtual void copy_sequence_1locus(sex_t SEX, unsigned int strand, unsigned int at, const TTQuanti *parent)=0

References _num_locus, TTQuanti::copy_sequence_1locus(), and RAND::RandBool().

Referenced by setGeneticMapParams().

◆ inherit_low()

void TProtoQuanti::inherit_low ( sex_t  SEX,
TTQuanti ind,
const TTQuanti parent 
)
inline
2568 {
2569  unsigned int prevLoc = 0;
2570 
2571  //the table containing the loci at which x-overs happen
2572  vector< pair<unsigned int, unsigned int> > recTable = _map.reduceJunctions(SEX, _mapIndex);
2573 
2574 
2575 #ifdef _REC_DEBUG_
2576  //number of x-overs
2577  unsigned int nbRec = recTable.size();
2578  cout << "TProtoQuanti::inherit_low; nb Rec = "<<nbRec - 1<<endl;
2579  cout << " --sex = "<<SEX<<"\n";
2580 #endif
2581 
2582 // unsigned int num_copied = 0;
2583 
2584  vector< pair<unsigned int, unsigned int> >::const_iterator xover = recTable.begin();
2585 
2586  while(xover != recTable.end()) {
2587 
2588 #ifdef _REC_DEBUG_
2589  cout<< " copy seq from "<<prevLoc<<" to "<<xover->first
2590  <<" ("<<(xover->first - prevLoc)<<" loc) ("
2591  <<(xover->first - prevLoc)*_sizeofLocusType
2592  <<"B) on side "<<xover->second<<std::endl;
2593 #endif
2594 
2595  ind->copy_sequence_block(SEX, xover->second, prevLoc, xover->first, parent);
2596 
2597  prevLoc = xover->first;
2598 
2599  xover++;
2600  }
2601 }
vector< pair< unsigned int, unsigned int > > reduceJunctions(sex_t SEX, unsigned int trait_idx)
Remove multiple x-over at the same locus when traits differ in number of loci.
Definition: ttrait_with_map.cc:1179
static GeneticMap _map
Definition: ttrait_with_map.h:209
unsigned int _mapIndex
Definition: ttrait_with_map.h:193
virtual void copy_sequence_block(sex_t SEX, unsigned int strand, unsigned int from_pos, unsigned int to_pos, const TTQuanti *parent)=0

References TTProtoWithMap::_map, TTProtoWithMap::_mapIndex, _sizeofLocusType, TTQuanti::copy_sequence_block(), and GeneticMap::reduceJunctions().

Referenced by setGeneticMapParams().

◆ loadFileServices()

void TProtoQuanti::loadFileServices ( FileServices loader)
virtual

Implements SimComponent.

2952 {
2953  int logtime = 0;
2954 
2955  //writer
2956  // purge previous settings:
2957  if(_writer) delete _writer;
2958  _writer = NULL;
2959 
2960  if(get_parameter("quanti_output")->isSet()) {
2961 
2962  _writer = new TTQuantiFH(this);
2963 
2964  if(get_parameter("quanti_output")->getArg().find("snp_") != string::npos && get_allele_model() > 2)
2965  fatal("trait quant::SNP genotypes can only be printed out for di-allelic quantitative loci\n");
2966 
2967  _writer->setOutputOption(get_parameter("quanti_output")->getArg());
2968 
2969  if(!get_parameter("quanti_logtime")->isSet())
2970  fatal("parameter \"quanti_logtime\" is missing!\n");
2971 
2972  Param* param = get_parameter("quanti_logtime");
2973 
2974  logtime = (param->isSet() ? (int)param->getValue() : 0);
2975 
2976  if(param->isMatrix()) {
2977 
2978  TMatrix temp;
2979  param->getMatrix(&temp);
2980  _writer->set_multi(true, true, 1, &temp, get_parameter("quanti_dir")->getArg(), this);
2981 
2982  } else // rpl_per, gen_per, rpl_occ, gen_occ, rank (0), path, self-ref
2983  _writer->set(true, true, 1, logtime, 0, get_parameter("quanti_dir")->getArg(),this);
2984 
2985  loader->attach(_writer);
2986 
2987  }
2988 
2989  //freq extractor
2990  if(_freqExtractor) delete _freqExtractor;
2991  _freqExtractor = NULL;
2992 
2993  if(get_parameter("quanti_freq_output")->isSet()) {
2994 
2995  if(get_allele_model() > 2) {
2996 
2997  error("option \"quanti_freq_output\" only works with di-allelic quantitative loci. This option will be ignored.\n");
2998 
2999  }else {
3000 
3001  _freqExtractor = new TTQFreqExtractor(this);
3002 
3004 
3005  Param* param = get_parameter("quanti_freq_logtime");
3006 
3007  if(param->isMatrix())
3008  fatal("parameter \"quanti_freq_logtime\" only accepts a single log-time value and not an array of values.\n\
3009  A single '.qfreq' output file contains the allele frequencies computed every log-time generation.\n");
3010 
3011  logtime = (param->isSet() ? (int)param->getValue() : 0);
3012 
3013  //save multiple generations in a single file:
3014  _freqExtractor->set(true, true, 1, logtime, 0, get_parameter("quanti_dir")->getArg(),this);
3015 
3016  loader->attach(_freqExtractor);
3017  }
3018 
3019  }
3020 
3021  // Ohta's (1982) D statistics
3022  if(_ohtaStats) delete _ohtaStats;
3023  _ohtaStats = NULL;
3024 
3025  if(get_parameter("quanti_ohta_output")->isSet()) {
3026 
3027  if ((_allele_model > 2) || (_num_traits > 1) || (SIMenv::MainSim->get_pop()->getPatchNbr() < 2)) {
3028  fatal("output option \"quanti_ohta_output\" is only valid for diallelic QTL affecting one trait in multiple patches!\n");
3029  }
3030 
3031  _ohtaStats = new TTQOhtaStats(this);
3032 
3033  Param* param = get_parameter("quanti_ohta_logtime");
3034 
3035  if(param->isMatrix()) {
3036 
3037  TMatrix temp;
3038  param->getMatrix(&temp);
3039  _ohtaStats->set_multi(true, true, 1, &temp, get_parameter("quanti_dir")->getArg(), this);
3040 
3041  } else // rpl_per, gen_per, rpl_occ, gen_occ, rank (0), path, self-ref
3042  _ohtaStats->set(true, true, 1, (param->isSet() ? (int)param->getValue() : 0),
3043  0, get_parameter("quanti_dir")->getArg(),this);
3044 
3045  loader->attach(_ohtaStats);
3046  }
3047 
3048  //load the reader:
3049  if(_reader) delete _reader;
3050  _reader = new TTQuantiFH(this);
3051  _reader->set_isInputHandler(true);
3052  loader->attach_reader(_reader);
3053 }
void set_isInputHandler(bool val)
Definition: filehandler.h:151
virtual void attach_reader(FileHandler *FH)
Attaches the FileHandler to the current list (_readers) of the FileServices.
Definition: fileservices.cc:74
virtual void attach(Handler *FH)
Attaches the FileHandler to the current list (_writers) of the FileServices.
Definition: fileservices.cc:61
This structure stores one parameter, its definition and its string argument.
Definition: param.h:54
double getValue()
Returns the argument value according to its type.
Definition: param.cc:368
bool isMatrix()
Checks if the argument is of matrix type.
Definition: param.h:172
string getArg()
Definition: param.h:138
void getMatrix(TMatrix *mat)
Sets the matrix from the argument string if the parameter is set and of matrix type.
Definition: param.cc:378
bool isSet()
Definition: param.h:140
static SimRunner * MainSim
Definition: simenv.h:42
virtual Param * get_parameter(std::string name)
Param getter.
Definition: simcomponent.h:139
A class to handle matrix in params, coerces matrix into a vector of same total size.
Definition: tmatrix.h:50
unsigned int get_allele_model()
Definition: ttquanti.h:428
TTQFreqExtractor.
Definition: ttquanti.h:823
void resetTable()
Definition: ttquanti.cc:6560
TTQOhtaStats.
Definition: ttquanti.h:842
TTQuantiFH.
Definition: ttquanti.h:797
void setOutputOption(string opt)
Definition: ttquanti.cc:5912
virtual void set_multi(bool rpl_per, bool gen_per, int rpl_occ, TMatrix *Occ, string path, TP *trait_proto)
Definition: filehandler.h:244
virtual void set(bool rpl_per, bool gen_per, int rpl_occ, int gen_occ, int rank, string path, TP *trait_proto)
Definition: filehandler.h:237

References _allele_model, _freqExtractor, _num_traits, _ohtaStats, _reader, _writer, FileServices::attach(), FileServices::attach_reader(), error(), fatal(), get_allele_model(), SimComponent::get_parameter(), Param::getArg(), Param::getMatrix(), Param::getValue(), Param::isMatrix(), Param::isSet(), SIMenv::MainSim, TTQFreqExtractor::resetTable(), TraitFileHandler< TP >::set(), FileHandler::set_isInputHandler(), TraitFileHandler< TP >::set_multi(), and TTQuantiFH::setOutputOption().

◆ loadStatServices()

void TProtoQuanti::loadStatServices ( StatServices loader)
virtual

Implements SimComponent.

3058 {
3059  //allocate the stat handler
3060  if(_stats)
3061  delete _stats; // this will reset internal state for the new simulation, safest solution
3062 
3063  _stats = new TTQuantiSH(this);
3064 
3065  loader->attach(_stats);
3066 }
virtual void attach(Handler *H)
attach the StatHandler to the current list (_statHandlers) of the StatServices
Definition: statservices.cc:177
TTQuantiSH.
Definition: ttquanti.h:702

References _stats, and StatServices::attach().

◆ mutate()

void TProtoQuanti::mutate ( TTQuanti ind)
inline
2623 {
2624  (this->*_mutation_func_ptr)(ind);
2625 }

References _mutation_func_ptr.

Referenced by TTQuanti::mutate().

◆ mutate_diallelic_no_pleio()

void TProtoQuanti::mutate_diallelic_no_pleio ( TTQuanti ind)
inline
2859 {
2860  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2861  unsigned int mut_locus, mut_all;
2862 
2863  while(NbMut != 0) {
2864 
2865  mut_locus = RAND::Uniform(_num_locus);
2866  mut_all = RAND::RandBool();
2867 
2868  // here just flips the bit at the mutating allele, value argument is ignored
2869  ind->mutate_inplace( mut_locus, mut_all, 1);
2870 
2871  NbMut--;
2872  }
2873 
2874 }
static double Poisson(double mean)
From the Numerical Recieps.
Definition: Uniform.h:219
virtual void mutate_inplace(unsigned int position, unsigned int allele, double value)=0

References _genomic_mutation_rate, _num_locus, TTQuanti::mutate_inplace(), RAND::Poisson(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_no_pleio().

◆ mutate_diallelic_pleio()

void TProtoQuanti::mutate_diallelic_pleio ( TTQuanti ind)
inline
2793 {
2794  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2795  unsigned int mut_locus, mut_all, pos;
2796  bool allele;
2797 
2798  while(NbMut != 0) {
2799 
2800  mut_locus = RAND::Uniform(_num_locus);
2801  mut_all = RAND::RandBool(); // which of the two copies is mutated
2802 
2803  pos = mut_locus*_num_traits; //where it stands in the sequence (full pleio)
2804 
2805  allele = !(ind->get_allele_bit(pos, mut_all));
2806 
2807  // flip the bit, mutate to the alt. allele
2808  ind->mutate_inplace( pos, mut_all, allele);
2809 
2810  // There cannot be more than two traits in this case, as set during startup
2811  // set second value:
2812  pos++;
2813  // The allele affecting the second trait may receive the same mutation depending on the
2814  // mutational correlation
2816  ind->set_allele_bit(pos, mut_all, allele); // calling ind->mutate_add(pos,...) would be equivalent
2817  else
2818  ind->set_allele_bit(pos, mut_all, RAND::RandBool()); // may or may not flip the bit, avoids spurious correlation
2819 
2820  NbMut--;
2821  }
2822 
2823 }
virtual void set_allele_bit(unsigned int position, unsigned int allele, bool value)=0
virtual bool get_allele_bit(unsigned int position, unsigned int allele) const =0

References _genomic_mutation_rate, _mutation_correlation, _num_locus, _num_traits, TMatrix::get(), TTQuanti::get_allele_bit(), TTQuanti::mutate_inplace(), RAND::Poisson(), RAND::RandBool(), TTQuanti::set_allele_bit(), and RAND::Uniform().

Referenced by setMutationModel_full_pleio().

◆ mutate_diallelic_var_pleio()

void TProtoQuanti::mutate_diallelic_var_pleio ( TTQuanti ind)
inline
2828 {
2829  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2830  unsigned int mut_locus, mut_all, pos;
2831 
2832  while(NbMut != 0) {
2833 
2834  mut_locus = RAND::Uniform(_num_locus);
2835  mut_all = RAND::RandBool();
2836 
2837  pos = _locus_table[mut_locus][0];
2838 
2839  ind->mutate_inplace(pos, mut_all, 1); // value argument is ignored, flips the bit
2840 
2841  if(_locus_table[mut_locus][1] == 2) { // only degree of pleiotropy allowed
2842 
2843  pos++;
2844 
2846  ind->set_allele_bit(pos, mut_all, ind->get_allele_bit(pos-1, mut_all));
2847  else
2848  ind->set_allele_bit(pos, mut_all, RAND::RandBool()); //avoids spurious correlations
2849  }
2850 
2851  NbMut--;
2852  }
2853 
2854 }

References _genomic_mutation_rate, _locus_table, _mutation_correlation, _num_locus, TMatrix::get(), TTQuanti::get_allele_bit(), TTQuanti::mutate_inplace(), RAND::Poisson(), RAND::RandBool(), TTQuanti::set_allele_bit(), and RAND::Uniform().

Referenced by setMutationModel_var_pleio().

◆ mutate_full_pleio()

void TProtoQuanti::mutate_full_pleio ( TTQuanti ind)
inline
2660 {
2661 // cout<<" TProtoQuanti::mutate_noHC_var_pleio\n";
2662  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2663  unsigned int mut_locus, mut_all, pos;
2664  double *effects;
2665 
2666  while(NbMut != 0) {
2667  mut_locus = RAND::Uniform(_num_locus);
2668  mut_all = RAND::RandBool();
2669 
2670  effects = (this->*_getMutationValues)(mut_locus);
2671 
2672  pos = mut_locus*_num_traits;
2673 
2674  //cycle through all alleles at the mutated locus, depending on the PD of the locus
2675  for(unsigned int i = 0; i < _num_traits; ++i, ++pos) {
2676  ind->mutate_add( pos, mut_all, effects[i]);
2677  }
2678 
2679  NbMut--;
2680  }
2681 
2682 // cout<<" TProtoQuanti::mutate_noHC::end\n";
2683 }
virtual void mutate_add(unsigned int position, unsigned int allele, double value)=0

References _genomic_mutation_rate, _getMutationValues, _num_locus, _num_traits, TTQuanti::mutate_add(), RAND::Poisson(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_full_pleio().

◆ mutate_inplace_full_pleio()

void TProtoQuanti::mutate_inplace_full_pleio ( TTQuanti ind)
inline
2741 {
2742 // cout<<" TProtoQuanti::mutate_inplace_full_pleio\n";
2743  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2744  unsigned int mut_locus, mut_all, pos;
2745  double *effects;
2746 
2747  while(NbMut != 0) {
2748  mut_locus = RAND::Uniform(_num_locus);
2749  mut_all = RAND::RandBool();
2750 
2751  effects = (this->*_getMutationValues)(mut_locus);
2752 
2753  pos = mut_locus*_num_traits; //start location of the locus in the sequence
2754 
2755  //cycle through all alleles at the mutated locus, depending on the PD of the locus
2756  for(unsigned int i = 0; i < _num_traits; ++i, ++pos) {
2757  ind->mutate_inplace( pos, mut_all, effects[i]);
2758  }
2759 
2760  NbMut--;
2761  }
2762 
2763 // cout<<" TProtoQuanti::mutate_inplace_full_pleio::end\n";
2764 }

References _genomic_mutation_rate, _getMutationValues, _num_locus, _num_traits, TTQuanti::mutate_inplace(), RAND::Poisson(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_full_pleio().

◆ mutate_inplace_no_pleio()

void TProtoQuanti::mutate_inplace_no_pleio ( TTQuanti ind)
inline
2718 {
2719 // cout<<" TProtoQuanti::mutate_inplace_full_pleio\n";
2720  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2721  unsigned int mut_locus, mut_all;
2722  double *effects;
2723 
2724  while(NbMut != 0) {
2725  mut_locus = RAND::Uniform(_num_locus);
2726  mut_all = RAND::RandBool();
2727 
2728  effects = (this->*_getMutationValues)(mut_locus);
2729 
2730  ind->mutate_inplace( mut_locus, mut_all, effects[0]);
2731 
2732  NbMut--;
2733  }
2734 
2735 // cout<<" TProtoQuanti::mutate_inplace_full_pleio::end\n";
2736 }

References _genomic_mutation_rate, _getMutationValues, _num_locus, TTQuanti::mutate_inplace(), RAND::Poisson(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_no_pleio().

◆ mutate_inplace_var_pleio()

void TProtoQuanti::mutate_inplace_var_pleio ( TTQuanti ind)
inline
2769 {
2770  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2771  unsigned int mut_locus, mut_all, pos;
2772  double *effects;
2773 
2774  while(NbMut != 0) {
2775  mut_locus = RAND::Uniform(_num_locus);
2776  mut_all = RAND::RandBool();
2777 
2778  effects = (this->*_getMutationValuesVarPleio[mut_locus])(mut_locus);
2779 
2780  pos = _locus_table[mut_locus][0];
2781 
2782  for(unsigned int i = 0; i < _locus_table[mut_locus][1]; ++i, ++pos){
2783  ind->mutate_inplace( pos, mut_all, effects[i]);
2784  }
2785 
2786  NbMut--;
2787  }
2788 }

References _genomic_mutation_rate, _getMutationValuesVarPleio, _locus_table, _num_locus, TTQuanti::mutate_inplace(), RAND::Poisson(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_var_pleio().

◆ mutate_nill()

void TProtoQuanti::mutate_nill ( TTQuanti ind)
inline

◆ mutate_no_pleio()

void TProtoQuanti::mutate_no_pleio ( TTQuanti ind)
inline
2637 {
2638 // cout<<" TProtoQuanti::mutate_noHC_var_pleio\n";
2639  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2640  unsigned int mut_locus, mut_all;
2641  double *effects;
2642 
2643  while(NbMut != 0) {
2644  mut_locus = RAND::Uniform(_num_locus);
2645  mut_all = RAND::RandBool();
2646 
2647  effects = (this->*_getMutationValues)(mut_locus);
2648 
2649  ind->mutate_add( mut_locus, mut_all, effects[0]);
2650 
2651  NbMut--;
2652  }
2653 
2654 // cout<<" TProtoQuanti::mutate_noHC::end\n";
2655 }

References _genomic_mutation_rate, _getMutationValues, _num_locus, TTQuanti::mutate_add(), RAND::Poisson(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_no_pleio().

◆ mutate_var_pleio()

void TProtoQuanti::mutate_var_pleio ( TTQuanti ind)
inline
2688 {
2689 // cout<<" TProtoQuanti::mutate_var_pleio\n";
2690 
2691  unsigned int NbMut = (unsigned int)RAND::Poisson(_genomic_mutation_rate);
2692  unsigned int mut_locus, mut_all, pos;
2693  double *effects;
2694 
2695  while(NbMut != 0) {
2696 
2697  mut_locus = RAND::Uniform(_num_locus);
2698  mut_all = RAND::RandBool();
2699 
2700  effects = (this->* _getMutationValuesVarPleio[mut_locus])(mut_locus);
2701 
2702  pos = _locus_table[mut_locus][0];
2703 
2704  //cycle through all alleles at the mutated locus, depending on the PD of the locus
2705  for(unsigned int i = 0; i < _locus_table[mut_locus][1]; ++i, ++pos) {
2706  ind->mutate_add( pos, mut_all, effects[i]);
2707  }
2708 
2709  NbMut--;
2710  }
2711 
2712 // cout<<" TProtoQuanti::mutate_var_pleio::end\n";
2713 }

References _genomic_mutation_rate, _getMutationValuesVarPleio, _locus_table, _num_locus, TTQuanti::mutate_add(), RAND::Poisson(), RAND::RandBool(), and RAND::Uniform().

Referenced by setMutationModel_var_pleio().

◆ readMatrixFromQuantiMutationMatrix()

bool TProtoQuanti::readMatrixFromQuantiMutationMatrix ( vector< vector< double >> &  varmat)
2035 {
2036 // message("quant::found \"quanti_mutation_matrix\" in input, analyzing the matrix for pleiotropic loci\n");
2037 
2038  get_parameter("quanti_mutation_matrix")->getVariableMatrix(&varmat);
2039 
2040  // check dimensionality of the matrix: ------------------------------------------------
2041  size_t numRows = varmat.size();
2042  size_t numEl;
2043  size_t maxNumEl = varmat[0].size(); //number of elements in the first row, as a start
2044  bool rowsAreDifferent = false;
2045 
2046  int numCovariance = (_num_traits - 1)*_num_traits/2; // number of off-diagonal elements
2047 
2048  for(size_t i = 0; i < numRows; ++i) {
2049 
2050  numEl = varmat[i].size();
2051 
2052  if(_pleio_type == 1) { //full pleio
2053  if( numEl != _num_traits && numEl != numCovariance + _num_traits) {
2054  return error("number of values in \"quanti_mutation_matrix\" at row %i \
2055 does not match with the pleiotropic degree of %i. Rows must contain either %i or %i variance-covariance values.\n",
2056 i+1, _num_traits, _num_traits, _num_traits + numCovariance);
2057  }
2058  }
2059 
2060  if(maxNumEl != numEl) rowsAreDifferent = true;
2061 
2062  maxNumEl = max(numEl, maxNumEl);
2063 
2064  }
2065 
2066  // assess if locus-specific matrices have been provided:
2067  if(numRows == _num_traits && maxNumEl == _num_traits && !rowsAreDifferent) {
2068 
2069 // if(_pleio_type == 1)
2070 // message("quant::\"quanti_mutation_matrix\" is a single square, num. traits x num. traits matrix. It will be used for all loci equally.\n");
2071 
2072  if(_pleio_type == 2)
2073  warning("\"quanti_mutation_matrix\" is a single square, num. traits x num. traits matrix but loci have variable pleiotropy. \
2074 The matrix will be interpreted as a set of locus-specific mutation matrices.");
2075 
2077 
2078  } else {
2079 
2080 // message("quant::\"quanti_mutation_matrix\" is not a square, num. traits x num. traits matrix. Rows will be treated as locus-specific mutation matrices.");
2081 
2082  if( numRows > _num_locus )
2083  return error("\"quanti_mutation_matrix\" has too many rows, it must be a matrix with max num. rows = \"quanti_loci\" or \"quanti_traits\" \n");
2084 
2086  }
2087 
2088  return true;
2089 }
void getVariableMatrix(vector< vector< double > > *mat)
Definition: param.cc:460
void warning(const char *str,...)
Definition: output.cc:58

References _mutationVarianceIsLocusSpecific, _num_locus, _num_traits, _pleio_type, error(), SimComponent::get_parameter(), Param::getVariableMatrix(), and warning().

Referenced by setContinuousMutationModel_full_pleio(), and setContinuousMutationModel_var_pleio().

◆ reset()

virtual void TProtoQuanti::reset ( )
inlinevirtual

Reimplemented from TTProtoWithMap.

virtual void reset()
Definition: ttrait_with_map.cc:612

References TTProtoWithMap::reset().

◆ resetParameterFromSource()

virtual bool TProtoQuanti::resetParameterFromSource ( std::string  param,
SimComponent cmpt 
)
inlinevirtual

Implements SimComponent.

561 {return false;}

◆ retrieve_data()

virtual bool TProtoQuanti::retrieve_data ( BinaryStorageBuffer reader)
inlinevirtual

Implements StorableComponent.

569  {reader->read(&_seq_length,sizeof(int));return true;}
void read(void *out, unsigned int nb_bytes)
Definition: binarystoragebuffer.h:162

References _seq_length, and BinaryStorageBuffer::read().

◆ set_eVarianceSD()

void TProtoQuanti::set_eVarianceSD ( unsigned int  trait,
double  SD 
)
2346 {
2347  if(_eVariance.size() < trait + 1) //trait is expected as the element index
2348  _eVariance.push_back(SD);
2349  else
2350  _eVariance[trait] = SD;
2351 }

References _eVariance.

Referenced by LCE_QuantiModifier::setVefromVa(), and LCE_Breed_Quanti::setVefromVa().

◆ set_genotype_value_additive()

double TProtoQuanti::set_genotype_value_additive ( const TTQuanti ind,
const unsigned int  trait 
)
2491 {
2492  return ind->get_additive_genotype(trait);
2493 }
virtual double get_additive_genotype(const unsigned int trait) const =0

References TTQuanti::get_additive_genotype().

Referenced by setParameters().

◆ set_genotype_value_dominance()

double TProtoQuanti::set_genotype_value_dominance ( const TTQuanti ind,
const unsigned int  trait 
)
2498 {
2499  return ind->get_dominant_genotype(trait);
2500 }
virtual double get_dominant_genotype(const unsigned int trait) const =0

References TTQuanti::get_dominant_genotype().

Referenced by setParameters().

◆ set_gsl_mutation_matrix()

gsl_matrix * TProtoQuanti::set_gsl_mutation_matrix ( unsigned int  pleio_deg,
const vector< double > &  varcov 
)
2163 {
2164  // varcov must be a one-line matrix
2165  unsigned int numCovariance = (pleio_deg - 1)*pleio_deg/2; // number of off-diagonal elements
2166  unsigned int cov_pos = pleio_deg; //first covariance term in the array
2167  size_t numEl = varcov.size(); //dimension check has been done already
2168 
2169  gsl_matrix* mat = gsl_matrix_alloc(pleio_deg, pleio_deg);
2170 
2171  for(unsigned int i = 0; i < pleio_deg; ++i){
2172 
2173  //set the diagonal = variances, we know they are the first pleio_deg elements in the matrix
2174  gsl_matrix_set(mat,i,i,varcov[i]);
2175 
2176  if (numEl == numCovariance + pleio_deg ) { // covariance values also provided, set the off-diagonal
2177 
2178  //setting covariance given in input as: e.g. {{v1,v2,v3,cov12,cov13,cov23}} with pleio_deg = 3
2179  for(unsigned long int j = i+1; j < pleio_deg && cov_pos < numEl; ++j){
2180  gsl_matrix_set(mat,i,j,varcov[cov_pos]);
2181  gsl_matrix_set(mat,j,i,varcov[cov_pos++]); // the matrix is symmetrical
2182  }
2183 
2184  } else {
2185  // no covariance provided in input, set off-diagonal to zero
2186  for(unsigned long int j = i+1; j < pleio_deg ; ++j){
2187  gsl_matrix_set(mat,i,j,0);
2188  gsl_matrix_set(mat,j,i,0); // the matrix is symmetrical
2189  }
2190 
2191  }
2192  }
2193 
2194  return mat;
2195 }

Referenced by set_gsl_mutation_matrix_from_sigma(), setContinuousMutationModel_full_pleio(), and setContinuousMutationModel_var_pleio().

◆ set_gsl_mutation_matrix_from_sigma()

gsl_matrix * TProtoQuanti::set_gsl_mutation_matrix_from_sigma ( unsigned int  loc,
unsigned int  pleio_deg 
)
2200 {
2201  // variance are identical across traits (in a row of _mutation_sigma) at this stage (mutation_matrix not set in input)
2202 
2203  unsigned int numCov = (pleio_deg-1)*pleio_deg / 2;
2204 
2205  vector<double> varcov(pleio_deg + numCov);
2206 
2207  // fill in the varcov array as a one-line matrix {{var1, var2, ..., covar12, covar13, ...}}
2208 
2209  // must be carefull as the mutation_sigma matrix may have only one row if variances are not locus specific
2210  // check for locus specificity:
2211  unsigned int pos = (_mutationVarianceIsLocusSpecific ? loc : 0);
2212 
2213  unsigned int cov_pos = pleio_deg; //starting place where covariance are recorded, after the variances
2214 
2215  for(unsigned int i = 0; i < pleio_deg; ++i) {
2216  varcov[i] = _mutation_sigma.get(pos, i)*_mutation_sigma.get(pos, i);
2217 
2218  for(unsigned int j = i; j < pleio_deg - 1 && cov_pos < (pleio_deg + numCov); ++j)
2219  varcov[cov_pos++] = _mutation_correlation.get(0, loc) * _mutation_sigma.get(pos, i)*_mutation_sigma.get(pos, j+1);
2220  }
2221 
2222 #ifdef _DEBUG_
2223  message("quanti:: Locus %i\n--setting mutation matrix from mutation variance and correlation\n", loc+1);
2224  message("-- one-line reduced matrix:\n");
2225  for(unsigned int i = 0; i < varcov.size(); ++i)
2226  message("%.3f ",varcov[i]);
2227  message("\n");
2228 #endif
2229 
2230  return set_gsl_mutation_matrix(pleio_deg, varcov);
2231 }
gsl_matrix * set_gsl_mutation_matrix(unsigned int pleio_deg, const vector< double > &varcov)
Definition: ttquanti.cc:2162
void message(const char *message,...)
Definition: output.cc:40

References _mutation_correlation, _mutation_sigma, _mutationVarianceIsLocusSpecific, TMatrix::get(), message(), and set_gsl_mutation_matrix().

Referenced by setContinuousMutationModel_full_pleio(), and setContinuousMutationModel_var_pleio().

◆ set_init_values()

void TProtoQuanti::set_init_values ( const double *  values,
unsigned int  nval 
)
2467 {
2468  assert(nval == _num_traits);
2469 
2470  _init_value.reset(1, _num_traits, values);
2471 
2472 }
void reset(unsigned int rows, unsigned int cols)
Re-allocate the existing matrix with assigned rows and cols dimensions and all elements to 0.
Definition: tmatrix.h:161

References _init_value, _num_traits, and TMatrix::reset().

Referenced by LCE_QuantiInit::execute().

◆ set_mutation_matrix_decomposition()

void TProtoQuanti::set_mutation_matrix_decomposition ( unsigned int  loc,
unsigned int  pleio_deg 
)
2236 {
2237  _evect[loc] = gsl_matrix_alloc(pleio_deg, pleio_deg);
2238  _eval[loc] = gsl_vector_alloc(pleio_deg);
2239  _effects_multivar[loc] = gsl_vector_alloc(pleio_deg);
2240  _ws[loc] = gsl_vector_alloc(pleio_deg);
2241 
2242  gsl_matrix *E = gsl_matrix_alloc(pleio_deg, pleio_deg);
2243  gsl_matrix_memcpy(E,_gsl_mutation_matrix[loc]);
2244  gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (pleio_deg);
2245  gsl_eigen_symmv (E, _eval[loc], _evect[loc], w);
2246  gsl_eigen_symmv_free (w);
2247  gsl_matrix_free(E);
2248 
2249  #ifdef _DEBUG_
2250  message("-- Mutation matrix eigenvalues:\n");
2251  for(unsigned int i = 0; i < pleio_deg; i++)
2252  cout<<gsl_vector_get(_eval[loc],i)<<" ";
2253  cout<<endl;
2254  #endif
2255 
2256  double eval;
2257  //take square root of eigenvalues, will be used in Gaussian as stdev
2258  for(unsigned int i = 0; i < pleio_deg; i++) {
2259 
2260  // check for positive matrix
2261  if(gsl_vector_get(_eval[loc],i) < 0)
2262  fatal("quanti::the mutation matrix is not a positive matrix (at least one eigenvalue is negative)\n\
2263  Please correct the values inside the matrix provided in input.\n");
2264 
2265  eval = gsl_vector_get(_eval[loc],i);
2266  eval = (eval < 0.000001 ? 0 : eval);
2267  gsl_vector_set( _eval[loc], i, sqrt(eval) );
2268  }
2269 
2270  #ifdef _DEBUG_
2271  // DEBUG OUTPUT ------------------------------------------------------
2272  cout << "_gsl_mutation_matrix eigen values (sqrt-ed): ";
2273  for(unsigned int i = 0; i < pleio_deg; i++)
2274  cout<<gsl_vector_get(_eval[loc],i)<<" ";
2275  cout << "\n_gsl_mutation_matrix eigen vectors: \n";
2276  for(unsigned int i = 0; i < pleio_deg; i++){
2277  for(unsigned int j = 0; j < pleio_deg; j++){
2278  cout<<gsl_matrix_get(_evect[loc],i,j)<<" | ";
2279  }
2280  cout<<endl;
2281  }
2282  #endif
2283 
2284 }// ----------------------------------------------------------------------------------------

References _effects_multivar, _eval, _evect, _gsl_mutation_matrix, _ws, fatal(), and message().

Referenced by setContinuousMutationModel_full_pleio(), and setContinuousMutationModel_var_pleio().

◆ set_trait_value_func_ptr()

void TProtoQuanti::set_trait_value_func_ptr ( bool  withVe)
699 {
700  if(withVe)
702  else
704 }
double set_trait_value_VE(const TTQuanti *ind, const unsigned int trait)
Definition: ttquanti.cc:2476
double set_trait_value_noVE(const TTQuanti *ind, const unsigned int trait)
Definition: ttquanti.cc:2483

References _set_trait_value_func_ptr, set_trait_value_noVE(), and set_trait_value_VE().

Referenced by LCE_QuantiModifier::execute(), and LCE_Breed_Quanti::setVefromVa().

◆ set_trait_value_noVE()

double TProtoQuanti::set_trait_value_noVE ( const TTQuanti ind,
const unsigned int  trait 
)
inline
2484 {
2485  return (this->*_set_genotype_func_ptr)(ind, trait);
2486 }

References _set_genotype_func_ptr.

Referenced by set_trait_value_func_ptr(), set_trait_value_VE(), and setParameters().

◆ set_trait_value_VE()

double TProtoQuanti::set_trait_value_VE ( const TTQuanti ind,
const unsigned int  trait 
)
inline
2477 {
2478  return set_trait_value_noVE(ind, trait) + RAND::Gaussian( _eVariance[trait] );
2479 }

References _eVariance, RAND::Gaussian(), and set_trait_value_noVE().

Referenced by set_trait_value_func_ptr(), and setParameters().

◆ setAlleleModel()

unsigned int TProtoQuanti::setAlleleModel ( )
820 {
821  string model("continuous");
822 
823  unsigned int ret_val;
824 
825  //checking allelic model
826  if (get_parameter("quanti_allele_model")->isSet()) {
827 
828  model = get_parameter("quanti_allele_model")->getArg();
829 
830  //---------------------------------------------------------------------------------------
831  // DIALLELIC MODELS
832 
833  if (model == "diallelic" || model == "diallelic_HC") { //for backward-compatibility with v <2.4.0
834 
835  // symmetrical allelic values are centered on zero with -a/+a values
836 
837  if(get_parameter("quanti_init_value")->isSet()){
838  error("\"quanti_allele_model diallelic\" needs to be initialized with \"quanti_init_freq\" provided by LCE \"quanti_init\" instead of \"quanti_init_value\". \n");
839  }
840 
841  ret_val = 1;
842 
843  } else if (model == "diallelic_asymmetrical") {
844 
845  // asymmetrical model allows for two arbitrary allelic values a/b at a locus
846 
847  if(get_parameter("quanti_init_value")->isSet()){
848  error("\"quanti_allele_model diallelic_HC\" needs to be initialized with \"quanti_init_freq\" provided by LCE \"quanti_init\" instead of \"quanti_init_value\". \n");
849  }
850 
851  ret_val = 2;
852 
853  //---------------------------------------------------------------------------------------
854  // CONTIUUM OF ALLELE MODELS
855 
856  } else if (model == "continuous") {
857 
858  ret_val = 3;
859 
860  } else if (model == "continuous_in_place" || model == "continuous_HC") { //for backward-compatibility with v <2.4.0
861 
862  ret_val = 4;
863 
864 
865  } else {
866  return error("\"quanti_allele_model\" has options \"diallelic\", \"diallelic_asymmetrical\", \"continuous\" or \"continuous_in_place\". \n");
867  }
868 
869  }
870  else { //default model: 'continuous"
871  ret_val = 3;
872  }
873 
874 
875 #ifdef _DEBUG_
876  message("quant::allele model is \"%s\"\n",model.c_str());
877 #endif
878  return ret_val;
879 }

References error(), SimComponent::get_parameter(), Param::getArg(), and message().

Referenced by setParameters().

◆ setContinuousMutationModel_full_pleio()

bool TProtoQuanti::setContinuousMutationModel_full_pleio ( )
1479 {
1480  //setting the mutation variance-covariance matrix
1481 
1482  // the pointer has been freed previously by a call to TProtoQuanti::deallocate_gsl_mutation_matrix_space in TProtoQuanti::setMutationParameters
1483  // we double-check with assert
1484  assert(_gsl_mutation_matrix == NULL);
1485  assert(_eval == NULL);
1486  assert(_evect == NULL);
1487  assert(_effects_multivar == NULL);
1488  assert(_ws == NULL);
1489 
1490  if(get_parameter("quanti_mutation_variance")->isSet()) {
1491 
1492  if(get_parameter("quanti_mutation_matrix")->isSet()) {
1493 
1494  warning("both \"quanti_mutation_variance\" and \"quanti_mutation_matrix\" are set, using the matrix only!\n");
1495 
1496  } else {
1497  // the variance are passed as single values because they apply to all traits equally
1498  // the sqrt-variance(s) are stored in _mutation_sigma, can be locus-specific
1499 
1500  if(!setMutationSigmaFromQuantiMutationVariance()) return false;
1501 
1502  //check if variance are locus-specific
1504 
1505  // pleiotropic loci for more than 2 traits, we need the full mutation matrix:
1506  if(_num_traits > 2) {
1507 
1508  //setting the mutation matrix
1509 
1511 
1512  // allocate memory for one m-matrix per locus
1514 
1515  for(unsigned int l = 0; l < _num_locus; ++l) {
1517 
1519  }
1520 
1521  } else { // !_mutationVarianceIsLocusSpecific
1522 
1523  // allocate memory for a single mutation matrix used for all loci
1525 
1527 
1529  }
1530  }
1531  }
1532  } //_end_ if quanti_mutation_variance is set
1533 
1534  if(get_parameter("quanti_mutation_matrix")->isSet()) {
1535 
1536  // full mutation matrix given in input, we need to check what kind of matrix is passed (if locus-specific or not)
1537  vector< vector<double> > _mut_matrix;
1538 
1539  // check the structure of the matrix passed in input, and set the locus-specific flag
1540  if(!readMatrixFromQuantiMutationMatrix(_mut_matrix)) return false;
1541 
1542  // fill and create mutation matrices --------------------------------------------------
1543  int loc_pos;
1544  size_t numRows = _mut_matrix.size();
1545 
1547  // set a new mutation matrix for each locus separately
1548  //each row of the input matrix will be used as a locus-specific m-matrix
1550 
1551  _mutation_sigma.reset(_num_locus, _num_traits); // this is used when PD = 2 or 1
1552 
1553  // checking that _mutation_correlation has been set:
1555 
1556  for(unsigned int loc = 0; loc < _num_locus; loc++){
1557 
1558  loc_pos = loc % numRows; //user may pass only a few rows that will be repeated across loci
1559 
1560  for(unsigned int i = 0; i < _num_traits; i++) // first _num_traits elements are the per-trait mut variance
1561  _mutation_sigma.set(loc, i, sqrt(_mut_matrix[loc_pos][i]));
1562 
1563  //set the locus-specific mutation matrix:
1564  _gsl_mutation_matrix[loc] = set_gsl_mutation_matrix(_num_traits, _mut_matrix[loc_pos]);
1565 
1566  if(_num_traits == 2) { // special case for bivariate Gaussian models
1567 
1568  _mutation_correlation.set(0, loc, gsl_matrix_get(_gsl_mutation_matrix[loc],0,1) / _mutation_sigma.get(loc,0) / _mutation_sigma.get(loc,1));
1569 
1570  } else {
1571 
1573  }
1574 
1575 #ifdef _DEBUG_
1576  cout << "\n-- _gsl_mutation_matrix for locus " << loc+1 << " \n";
1577  for(unsigned int i=0; i<_num_traits; ++i){
1578  for(unsigned int j=0; j<_num_traits; ++j){
1579  cout << gsl_matrix_get(_gsl_mutation_matrix[loc],i,j) << " | ";
1580  }
1581  cout << endl;
1582  }
1583 
1584  message("-- M-matrix decomposition:\n");
1585  for(unsigned int i = 0; i < _num_traits; i++)
1586  cout<<gsl_vector_get(_eval[loc],i)<<" ";
1587  cout<<endl;
1588  if(_num_traits == 2) message("-- mutation correlation: %f\n",_mutation_correlation.get(0,loc));
1589 #endif
1590  } //END for locus
1591 
1592  } else { //mutation is not locus-specific
1593  //create a single mutation matrix
1595 
1596  _mutation_sigma.reset(1, _num_traits); // this is used when PD = 2 or 1
1597 
1598  for(unsigned int i = 0; i < _num_traits; i++) // the diagonal of the input matrix elements are the per-trait mut variance
1599  _mutation_sigma.set(0, i, sqrt(_mut_matrix[i][i]));
1600 
1601  //set the mutation matrix: we have to read the input matrix as a full square matrix, not as an array-matrix
1602  _gsl_mutation_matrix[0] = gsl_matrix_alloc(_num_traits, _num_traits);
1603 
1604  //easiest is to read the input matrix into a TMatrix object (we know it isn't a variable matrix by now)
1605  TMatrix mat;
1606  get_parameter("quanti_mutation_matrix")->getMatrix(&mat);
1607 
1608  //convert it into a gsl_matrix
1609  mat.get_gsl_matrix(_gsl_mutation_matrix[0]);
1610 
1611  if(_num_traits == 2) { // special case for bivariate Gaussian models
1612 
1613  // reset the _mutation_correlation matrix for non-locus specific case:
1615 
1616  _mutation_correlation.set(0, 0, gsl_matrix_get(_gsl_mutation_matrix[0],0,1) / _mutation_sigma.get(0,0) / _mutation_sigma.get(0,1));
1617 
1618  } else { // more traits
1619 
1621  }
1622 
1623 
1624 #ifdef _DEBUG_
1625  message("-- Mutation matrix:\n");
1626  mat.show_up();
1627  message("-- M-matrix decomposition:\n");
1628  for(unsigned int i = 0; i < _num_traits; i++)
1629  cout<<gsl_vector_get(_eval[0],i)<<" ";
1630  cout<<endl;
1631  if(_num_traits == 2) message("-- mutation correlation: %f\n",_mutation_correlation.get(0,1));
1632 #endif
1633 
1634  }
1635  } // END if(get_parameter("quanti_mutation_matrix")->isSet())
1636  else if(!get_parameter("quanti_mutation_variance")->isSet()) {
1637  return error("\"quanti_mutation_matrix\" or \"quanti_mutation_variance\" must be specified!\n");
1638  }
1639 
1640  return true;
1641 }
void show_up()
Definition: tmatrix.h:328
unsigned int ncols() const
Definition: tmatrix.h:216
void set(unsigned int i, unsigned int j, double val)
Sets element at row i and column j to value val.
Definition: tmatrix.h:103
bool setMutationSigmaFromQuantiMutationVariance()
Definition: ttquanti.cc:1898
void set_mutation_matrix_decomposition(unsigned int loc, unsigned int pleio_deg)
Definition: ttquanti.cc:2235
gsl_matrix * set_gsl_mutation_matrix_from_sigma(unsigned int loc, unsigned int pleio_deg)
Definition: ttquanti.cc:2199
bool readMatrixFromQuantiMutationMatrix(vector< vector< double >> &varmat)
Definition: ttquanti.cc:2034
void allocate_gsl_mutation_matrix_space(unsigned int num_locus)
Definition: ttquanti.cc:2093

References _effects_multivar, _eval, _evect, _gsl_mutation_matrix, _mutation_correlation, _mutation_sigma, _mutationVarianceIsLocusSpecific, _num_locus, _num_traits, _ws, allocate_gsl_mutation_matrix_space(), error(), TMatrix::get(), SimComponent::get_parameter(), Param::getMatrix(), message(), TMatrix::ncols(), TMatrix::nrows(), readMatrixFromQuantiMutationMatrix(), TMatrix::reset(), TMatrix::set(), set_gsl_mutation_matrix(), set_gsl_mutation_matrix_from_sigma(), set_mutation_matrix_decomposition(), setMutationSigmaFromQuantiMutationVariance(), TMatrix::show_up(), and warning().

Referenced by setMutationModel_full_pleio().

◆ setContinuousMutationModel_no_pleio()

bool TProtoQuanti::setContinuousMutationModel_no_pleio ( )
1803 {
1804  //setting the mutation variance matrix
1805 
1806  if(get_parameter("quanti_mutation_variance")->isSet()) {
1807 
1808  if(get_parameter("quanti_mutation_matrix")->isSet()) {
1809 
1810  warning("both \"quanti_mutation_variance\" and \"quanti_mutation_matrix\" are set, not using the matrix in the non-pleiotropic case!\n");
1811 
1812  }
1813  // the variance are passed as single values because they apply to all traits equally
1814  // the sqrt-variance(s) are stored in _mutation_sigma, can be locus-specific
1815 #ifdef _DEBUG_
1816  message("quant::setting mutation variance (param is set).\n");
1817 #endif
1818 
1820 
1821  //check if variance are locus-specific
1823 
1824  } //_end_ if quanti_mutation_variance is set
1825 
1826  else if(get_parameter("quanti_mutation_matrix")->isSet()) {
1827 
1828  return error("quant::parameter \"quanti_mutation_matrix\" is not used under non-pleiotropic model, use \"quanti_mutation_variance\" instead.\n");
1829 
1830  } // END if(get_parameter("quanti_mutation_matrix")->isSet())
1831  else if(!get_parameter("quanti_mutation_variance")->isSet()) {
1832  return error("\"quanti_mutation_variance\" must be specified for the non-pleiotropic model of quantitative loci!\n");
1833  }
1834 
1835  return true;
1836 }
bool setMutationSigmaFromQuantiMutationVariance_no_pleio()
Definition: ttquanti.cc:1968

References _mutation_sigma, _mutationVarianceIsLocusSpecific, error(), SimComponent::get_parameter(), Param::isSet(), message(), TMatrix::nrows(), setMutationSigmaFromQuantiMutationVariance_no_pleio(), and warning().

Referenced by setMutationModel_no_pleio().

◆ setContinuousMutationModel_var_pleio()

bool TProtoQuanti::setContinuousMutationModel_var_pleio ( )
1646 {
1647 // cout << "TProtoQuanti::setContinuousMutationModel_var_pleio\n";
1648 
1649  // the pointer has been freed previously in TProtoQuanti_var_pleio::setMutationParameters
1650  // we double-check with assert
1651  assert(_gsl_mutation_matrix == NULL);
1652  assert(_eval == NULL);
1653  assert(_evect == NULL);
1654  assert(_effects_multivar == NULL);
1655  assert(_ws == NULL);
1656 
1657  // allocate memory
1659 
1660  unsigned int pleio_deg;
1661 
1662  //setting the mutation variance
1663  if(get_parameter("quanti_mutation_variance")->isSet()) {
1664 
1665  if(get_parameter("quanti_mutation_matrix")->isSet()) {
1666 
1667  warning("both \"quanti_mutation_variance\" and \"quanti_mutation_matrix\" are set, using the matrix only!\n");
1668 
1669  } else {
1670  // the variance are passed as single values because they apply to all traits equally
1671  // the sqrt-variance(s) are stored in _mutation_sigma, can be locus-specific
1672 
1673  if(!setMutationSigmaFromQuantiMutationVariance()) return false;
1674 
1675  //check if variance are locus-specific
1677 
1678  // we need one m-matrix per locus if locus is pleiotropic
1679  // even if all have same variance and _mutationVarianceIsLocusSpecific = false bcse PD varies among loci
1680  for(unsigned int loc = 0; loc < _num_locus; loc++){
1681 
1682  pleio_deg = _locus_table[loc][1];
1683 
1684  if(pleio_deg > 1) {
1685  //set the M-matrix for all pleiotropic loci, even though it is not used when PD == 2
1686  //setting the mutation matrix
1688 
1689  set_mutation_matrix_decomposition(loc, pleio_deg);
1690 
1691 
1692 #ifdef _DEBUG_
1693  cout << "_gsl_mutation_matrix for locus " << loc+1 << " \n";
1694  for(unsigned int i=0; i<pleio_deg; ++i){
1695  for(unsigned int j=0; j<pleio_deg; ++j){
1696  cout << gsl_matrix_get(_gsl_mutation_matrix[loc],i,j) << " | ";
1697  }
1698  cout << endl;
1699  }
1700 #endif
1701 
1702  } // END if PD > 1
1703  } // END for locus
1704  } // END if get_parameter("quanti_mutation_matrix")->isSet()
1705  } // END if(get_parameter("quanti_mutation_variance")->isSet())
1706 
1707 
1708 
1709  if(get_parameter("quanti_mutation_matrix")->isSet()) {
1710 
1711  vector< vector<double> > _mut_matrix;
1712 
1713  if(!readMatrixFromQuantiMutationMatrix(_mut_matrix)) return false;
1714 
1715  // we will store sigma in case some loci have PD = 1 or PD = 2
1717 
1718  // checking that _mutation_correlation has been set:
1720 
1721  int numVarInRow;
1722  int numRows = _mut_matrix.size();
1723  int numCovariance;
1724  int loc_pos;
1725 
1726  // set the mutation matrix for each locus separately
1727  for(unsigned int loc = 0; loc < _num_locus; loc++){
1728 
1729  pleio_deg = _locus_table[loc][1];
1730 
1731  loc_pos = loc % numRows; //user may pass only one row that will be repeated for all loci
1732 
1733  numVarInRow = _mut_matrix[loc_pos].size(); // number of diagonal elements
1734  numCovariance = (pleio_deg - 1)*pleio_deg/2; // number of off-diagonal elements
1735 
1736  // we accept 1 value (same var on all traits, no covar), pleio_deg values, or pleio_deg +numCovariance values:
1737  if( numVarInRow > 1 && numVarInRow != (int)pleio_deg && numVarInRow != (numCovariance + (int)pleio_deg) ){
1738  return error("number of values (%i) for locus %i in \"quanti_mutation_matrix\" at row %i \
1739 does not match with its pleiotropic degree of %i \n", numVarInRow, loc+1, loc_pos+1, pleio_deg);
1740  }
1741 
1742 #ifdef _DEBUG_
1743  // Print out mut_matrix for debugging purposes
1744  message("\nquant::input M-matrix for locus %i\n", loc_pos+1);
1745  for(unsigned int j=0; j<_mut_matrix[loc_pos].size(); ++j){
1746  message("%.3f | ",_mut_matrix[loc_pos][j]);
1747  }
1748  message("\n");
1749 #endif
1750 
1751  // we build the varcov vector in case only a single variance was passed:
1752  vector<double> varcov(pleio_deg);
1753 
1754  for(unsigned int i = 0; i < pleio_deg; i++) { // first pleio_deg elements are the per-trait mut variance
1755  _mutation_sigma.set(loc, i, sqrt(_mut_matrix[loc_pos][ i%numVarInRow]) ); //recycle if single value passed
1756  varcov[i] = _mut_matrix[loc_pos][ i%numVarInRow];
1757  }
1758  //set the mutation matrix: we either pass a pleio_deg copied set of a single variance or the original M-matrix
1759  _gsl_mutation_matrix[loc] = set_gsl_mutation_matrix(pleio_deg, (numVarInRow == 1 ? varcov : _mut_matrix[loc_pos] ) );
1760 
1761  set_mutation_matrix_decomposition(loc, pleio_deg);
1762 
1763  if(pleio_deg == 2) { // special case for bivariate Gaussian models
1764  _mutation_correlation.set(0, loc, gsl_matrix_get(_gsl_mutation_matrix[loc],0,1) / _mutation_sigma.get(loc,0) / _mutation_sigma.get(loc,1));
1765  }
1766 
1767 #ifdef _DEBUG_
1768  message("quant::GSL M-matrix for locus %i\n", loc+1);
1769  for(unsigned int i=0; i<pleio_deg; ++i){
1770  for(unsigned int j=0; j<pleio_deg; ++j){
1771  message("%.3f | ",gsl_matrix_get(_gsl_mutation_matrix[loc],i,j));
1772  }
1773  message("\n");
1774  }
1775 #endif
1776 
1777 
1778 #ifdef _DEBUG_
1779  message("-- Mutation matrix for locus %i with PD=%i:\n", loc+1, pleio_deg);
1780  // _mutation_matrix[loc].show_up();
1781  message("-- MMatrix decomposition:\n");
1782  for(unsigned int i = 0; i < pleio_deg; i++)
1783  message("%.3f ", gsl_vector_get(_eval[loc],i));
1784  cout<<endl;
1785  if(_num_traits == 2)
1786  message("-- mutation correlation: %f\n", _mutation_correlation.get(0,loc) ) ;
1787 #endif
1788 
1789  } //END for locus
1790 
1791  } // END if(get_parameter("quanti_mutation_matrix")->isSet())
1792  else if(!get_parameter("quanti_mutation_variance")->isSet()) {
1793  return error("\"quanti_mutation_matrix\" or \"quanti_mutation_variance\" must be specified!\n");
1794  }
1795 
1796 // cout << "TProtoQuanti::setContinuousMutationModel_var_pleio::end\n";
1797  return true;
1798 }

References _effects_multivar, _eval, _evect, _gsl_mutation_matrix, _locus_table, _mutation_correlation, _mutation_sigma, _mutationVarianceIsLocusSpecific, _num_locus, _num_traits, _ws, allocate_gsl_mutation_matrix_space(), error(), TMatrix::get(), SimComponent::get_parameter(), message(), TMatrix::ncols(), TMatrix::nrows(), readMatrixFromQuantiMutationMatrix(), TMatrix::reset(), TMatrix::set(), set_gsl_mutation_matrix(), set_gsl_mutation_matrix_from_sigma(), set_mutation_matrix_decomposition(), setMutationSigmaFromQuantiMutationVariance(), and warning().

Referenced by setMutationModel_var_pleio().

◆ setDiallelicMutationModel()

bool TProtoQuanti::setDiallelicMutationModel ( )
1347 {
1348  static bool warn_allele_once = false;
1349 
1350  if (!get_parameter("quanti_allele_value")->isSet()) {
1351 
1352  return error("in \"quanti\" trait, \"quanti_allele_value\" is not set for the diallelic model.\n");
1353 
1354  } else {
1355 
1356  // allele_value is a matrix nb_locus x 2 values
1357 
1358  // IMPORTANT:: This interface doesn't allow for trait-specific allelic values!!
1359 
1361 
1362  if (get_parameter("quanti_allele_value")->isMatrix()) { //locus-specific allelic values
1363 
1364  TMatrix tmp;
1365 
1366  get_parameter("quanti_allele_value")->getMatrix(&tmp);
1367 
1368  if (tmp.ncols() != _num_locus) {
1369  if(!warn_allele_once) {
1370  warning("\"quanti_allele_value\" has less values than the number of loci, allelic values will be recycled among loci.\n");
1371  warn_allele_once = true;
1372  }
1373  }
1374 
1375  unsigned int nval = tmp.ncols();
1376 
1377  // we need to order the allele in decreasing order for later calculations of allele frequencies
1378  // such that p = freq of trait-increasing allele, q = freq of trait-decreasing allele
1379 
1380  double a1, a2;
1381 
1382  if (tmp.nrows() == 1) { // only 'a' is provided
1383 
1384 // if(_allele_model != 1) // not the diallelic_symmetrical model
1385 // return error("\"quanti_allele_value\" must hold the two alternative allelic values at\
1386 // the quantitative loci with model \"diallelic_asymmetrical\". Only one value is currently provided.");
1387 
1388  if(_allele_model == 1) { // store +a and -a allelic values, with +a at position 0
1389  for (unsigned i = 0; i < _num_locus; ++i) {
1390 
1391  a1 = tmp.get(0, i % nval); // recycle allelic values among loci, if necessary
1392 
1393  if(a1 < 0) a1 = -1.0*a1; // we need the positive value in the first position
1394 
1395  a2 = -1.0*a1;
1396 
1397  _allele_value.set(i, 0, a1);
1398  _allele_value.set(i, 1, a2);
1399  }
1400  }
1401  else if (_allele_model == 2) // "asymmetrical case, create allele values {0, a}
1402  {
1403  for (unsigned i = 0; i < _num_locus; ++i) {
1404 
1405  a1 = tmp.get(0, i % nval); // recycle allelic values among loci, if necessary
1406  _allele_value.set(i, 0, 0.0); // first allele is the ancestral allele with value 0
1407  _allele_value.set(i, 1, a1); // second allele is the derived allele with a != 0
1408  }
1409  } else
1410  return error("parameter \"quanti_allele_value\" should only be used with the \"diallelic\" allele models.\n ");
1411 
1412  } else if (tmp.nrows() == 2) { // store A and a allelic values, a != -A
1413 
1414 // if(_allele_model != 2) // not the diallelic_asymmetrical model
1415 // return error("\"quanti_allele_value\" should hold only one of the alternative allelic values at\
1416 // the quantitative loci with model \"diallelic\". Two values per locus are currently provided.");
1417 
1418  for (unsigned i = 0; i < _num_locus; ++i) {
1419 
1420  a1 = tmp.get(0, i % nval); // recycle allelic values among loci
1421  a2 = tmp.get(1, i % nval);
1422 
1423  //smallest first; but we keep the "ancestral" allele (value 0, if provided) at position 0 in all cases
1424  if(a1 != 0.0 && a1 > a2) {
1425  a1 = a2;
1426  a2 = tmp.get(0, i % nval);
1427  }
1428  _allele_value.set(i, 0, a1);
1429  _allele_value.set(i, 1, a2);
1430  }
1431 
1432  } else {
1433  return error("\"quanti_allele_value\" must get a matrix with a max. of 2 rows (and max. num. columns = num. loci).\n");
1434  }
1435 
1436  } else { //not a matrix, therefore no locus-specific allelic values
1437 
1438  double a1 = get_parameter_value("quanti_allele_value"), a2;
1439 
1440  if(a1 < 0) a1 = -1.0*a1;
1441  a2 = -1.0*a1;
1442 
1443  _allele_value.set_col(0, a1);
1444  _allele_value.set_col(1, a2);
1445 
1446  }
1447  }
1448 
1449  // we need a mapping of sequence position to allele value to read the allele value from the sequence
1450  if(_sequence_diallele_values[0]) {
1451  delete [] _sequence_diallele_values[0];
1452  _sequence_diallele_values[0] = NULL;
1453  }
1454 
1455  if(_sequence_diallele_values[1]) {
1456  delete [] _sequence_diallele_values[1];
1457  _sequence_diallele_values[1] = NULL;
1458  }
1459 
1460  _sequence_diallele_values[0] = new double [_seq_length];
1461  _sequence_diallele_values[1] = new double [_seq_length];
1462 
1463  unsigned int pos, locID;
1464  for(unsigned int i = 0; i < _num_traits; ++i) {
1465  for(unsigned int j = 0; j < get_num_locus(i); ++j) {
1466  pos = get_locus_seq_pos(j, i);
1467  locID = get_locus_ID(j, i);
1468  _sequence_diallele_values[0][pos] = _allele_value.get(locID, 0);
1469  _sequence_diallele_values[1][pos] = _allele_value.get(locID, 1);
1470  }
1471  }
1472 
1473  return true;
1474 }
virtual double get_parameter_value(std::string name)
Param value getter.
Definition: simcomponent.h:143
void set_col(unsigned int i, double val)
Sets element at column i to value val.
Definition: tmatrix.h:133
unsigned int get_locus_ID(unsigned int locus, unsigned int trait)
Definition: ttquanti.h:442
unsigned int get_locus_seq_pos(unsigned int loc, unsigned int trait)
Definition: ttquanti.h:440
unsigned int get_num_locus()
Definition: ttquanti.h:418

References _allele_model, _allele_value, _num_locus, _num_traits, _seq_length, _sequence_diallele_values, error(), TMatrix::get(), get_locus_ID(), get_locus_seq_pos(), get_num_locus(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getMatrix(), TMatrix::ncols(), TMatrix::nrows(), TMatrix::reset(), TMatrix::set(), TMatrix::set_col(), and warning().

Referenced by setMutationModel_full_pleio(), setMutationModel_no_pleio(), and setMutationModel_var_pleio().

◆ setDominanceParameters()

bool TProtoQuanti::setDominanceParameters ( )
2288 {
2289  TMatrix tmp_mat;
2290 
2291 #ifdef _DEBUG_
2292  message("quant::setting dominance parameters\n");
2293 #endif
2294 
2295  _dominance_model = 0; // no dominance by default
2297 
2299  if(get_parameter("quanti_dominance_effects")->isSet())
2300  {
2301 
2303 
2304  if(get_parameter("quanti_dominance_effects")->isMatrix())
2305  {
2306 
2307  get_parameter("quanti_dominance_effects")->getMatrix(&tmp_mat);
2308 
2309  if(tmp_mat.nrows() > _num_traits)
2310  return error("the dominance effect matrix must hold at most as many rows as the number of quantitative loci.\n");
2311 
2312  if(tmp_mat.ncols() > _num_locus)
2313  return error("the dominance effect matrix must hold at most as many columns as the number of quantitative traits.\n");
2314 
2316 
2317  }
2318  else {
2319  _dominance_effects.assign( get_parameter_value("quanti_dominance_effects") );
2320  }
2321 
2322  // set dominance flag active
2323  _dominance_model = 1; // internally, model 0 = no dominance
2324  }
2325 
2326 
2327 #ifdef _DEBUG_
2328  message("quant::dominance is set ? \"%s\"\n", (_dominance_model == 0 ? " no" : "yes"));
2329  if(_dominance_model) {
2330 
2331  message("quant::dominance coefficients (trait x locus table, 20 first loci):\n");
2332  for(unsigned int i = 0; i < _dominance_effects.nrows(); ++i)
2333  for(unsigned int j = 0; j < _dominance_effects.ncols() && j < 20; ++j)
2334  message("%.3f ", _dominance_effects.get(i,j));
2335  }
2336  message("\n");
2337 #endif
2338 
2339  return true;
2340 }
void assign(double val)
Assigns a value to all element of the matrix.
Definition: tmatrix.h:155
void copy_recycle(const TMatrix &mat)
Copy elements of 'mat', recycling elements of 'mat' if its size is smaller than current matrix.
Definition: tmatrix.h:90

References _dominance_effects, _dominance_model, _num_locus, _num_traits, TMatrix::assign(), TMatrix::copy_recycle(), error(), TMatrix::get(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getMatrix(), message(), TMatrix::ncols(), TMatrix::nrows(), and TMatrix::reset().

Referenced by setParameters().

◆ setEpistasisParameters()

bool TProtoQuanti::setEpistasisParameters ( )
709 {
710 
711  _epistasis = false;
712 
713 // if(get_parameter("quanti_epistatic_mean")->isSet()) {
714 // _epistatic_mean = get_parameter_value("quanti_epistatic_mean");
715 // _epistasis = true;
716 // }
717 // else
718 // _epistatic_mean = 0;
719 //
720 // if(get_parameter("quanti_epistatic_variance")->isSet()) {
721 // _epistatic_variance = sqrt(get_parameter_value("quanti_epistatic_variance"));
722 // _epistasis = true;
723 // }
724 // else
725 // _epistatic_variance = 0;
726 //
727 // if(get_parameter("quanti_epistatic_prop_large")->isSet())
728 // _epistatic_prop_large = get_parameter_value("quanti_epistatic_prop_large");
729 // else
730 // _epistatic_prop_large = 0;
731 //
732 // if(get_parameter("quanti_epistatic_large_mean")->isSet())
733 // _epistatic_large_mean = get_parameter_value("quanti_epistatic_large_mean");
734 // else
735 // _epistatic_large_mean = 0;
736 //
737 // if(get_parameter("quanti_epistatic_large_variance")->isSet())
738 // _epistatic_large_variance = sqrt(get_parameter_value("quanti_epistatic_large_variance"));
739 // else
740 // _epistatic_large_variance = 0;
741 //
742  // set epistatic coefficients:
743  if(get_parameter("quanti_epistatic_coefs")->isSet()) {
744 
746 
747  unsigned int num_interact = _num_locus*(_num_locus-1)/2.0; //num of pairwise interactions
748 
749  assert(num_interact == _num_epi_coefs);
750 
752 
753  TMatrix readEpiCoefs;
754 
755  get_parameter("quanti_epistatic_coefs")->getMatrix(&readEpiCoefs);
756 
757  if(readEpiCoefs.nrows() > 1)
758  return error("\"quanti_epistatic_coefs\" must be an array, i.e., have one row only\n");
759 
760  if(readEpiCoefs.ncols() > _num_epi_coefs){
761 
762  return error("The number of epistatic coefficients provided with \"quanti_epistatic_coefs\
763 must be at least equal the total number of pairwise locus interactions (%i for %i loci).\n", _num_epi_coefs, _num_locus);
764 
765  }
766 
768 
770 
771  // Here _epistatic_coefs_indices covers only pairwise epistatic interactions
772  // and has dimensions nbCoefs x 2
774 
775  _epistasis = true;
776  }
777 // else {
778 //
779 // for (unsigned int i = 0; i < _num_epi_coefs; i++)
780 // _epistatic_coefs_matrix[i] = _epistatic_mean + RAND::Gaussian(_epistatic_variance);
781 // }
782 //
783 // // reset the epistatic coefficient to larger values if desired
784 // if (_epistatic_large_mean || _epistatic_large_variance) {
785 //
786 // unsigned int quantiLargeNum = (unsigned int) floor(_epistatic_prop_large * _num_epi_coefs);
787 //
788 // for (unsigned int i = 0, randLoc = 0; i < quantiLargeNum; i++) {
789 //
790 // randLoc = RAND::Uniform(_num_epi_coefs);
791 //
792 // _epistatic_coefs_matrix[randLoc] = _epistatic_large_mean + RAND::Gaussian(_epistatic_large_variance);
793 // }
794 // }
795 //
796 //
797 // if(!get_parameter("quanti_epistatic_coefs")->isSet()) {
798 // // Record the epistatic coefficients when randomly set
799 // ostringstream coefs;
800 // coefs << "{{";
801 //
802 // for (unsigned int i = 0; i < _num_epi_coefs-1; i++)
803 // coefs << _epistatic_coefs_matrix[i] << ", ";
804 //
805 // coefs << _epistatic_coefs_matrix[_num_epi_coefs-1];
806 //
807 // coefs << "}}";
808 //
809 // Param* coefsParam = get_parameter("quanti_epistatic_coefs");
810 // coefsParam->setArg(coefs.str());
811 // coefsParam->setIsSet(true);
812 // }
813 
814  return true;
815 }
unsigned int length() const
Returns the number of elements in the matrix.
Definition: tmatrix.h:218
TMatrix nChooseKVec(int n, int k)
Definition: utils.cc:198
unsigned long nChooseK(int n, int k)
Definition: utils.cc:174

References _epistasis, _epistatic_coefs_indices, _epistatic_coefs_matrix, _num_epi_coefs, _num_locus, TMatrix::copy(), TMatrix::copy_recycle(), error(), SimComponent::get_parameter(), Param::getMatrix(), TMatrix::length(), nChooseK(), nChooseKVec(), TMatrix::ncols(), TMatrix::nrows(), and TMatrix::reset().

Referenced by setParameters().

◆ setGeneticMapParams()

bool TProtoQuanti::setGeneticMapParams ( )
668  {
669 
670  //bypass the genetic map for free recombination to save significant time:
671  //this is done whenever the recombination rate is set to 0.5
672 
673  if( TTProtoWithMap::isRecombinationFree("quanti")) { //test all possible options to set recomb rate = 0.5
674 
676 
678 
679  //necessary for the inherit_free function:
680  if(_all_chooser) delete [] _all_chooser;
681  _all_chooser = new bool[_num_locus];
682 
683  } else {
684  // loci are not independent, ie recomb rate < 0.5
685 
686  // the loci positions will be registered in the genetic map
687  if( !setGeneticMapParameters("quanti") ) return false;
688 
690 
691  }
692 
693  return true;
694 }
void inherit_low(sex_t SEX, TTQuanti *ind, const TTQuanti *parent)
Definition: ttquanti.cc:2567
void inherit_free(sex_t SEX, TTQuanti *ind, const TTQuanti *parent)
Definition: ttquanti.cc:2605
double _recombRate
Definition: ttrait_with_map.h:195
bool isRecombinationFree(string prefix)
Definition: ttrait_with_map.cc:98
bool setGeneticMapParameters(string prefix)
Definition: ttrait_with_map.cc:125

References _all_chooser, _inherit_fun_ptr, _num_locus, TTProtoWithMap::_recombRate, inherit_free(), inherit_low(), TTProtoWithMap::isRecombinationFree(), and TTProtoWithMap::setGeneticMapParameters().

Referenced by setParameters().

◆ setHeritabilityParams()

bool TProtoQuanti::setHeritabilityParams ( )
457  {
458 
459  // temporary TMatrix for parameters read-in
460  TMatrix tmp_mat;
461 
462 #ifdef _DEBUG_
463  message("quant::setting heritability parameters\n");
464 #endif
465  //---------------------------------------------------------------------------------------------
466  // ENVIRONMENTAL VARIANCE and HERITABILITY
467 
468  _eVariance.clear(); //it is empty by default, signaling that we do not add Ve to trait genotype
469 
470  if(get_parameter("quanti_environmental_variance")->isSet()){
471 
472  if(get_parameter("quanti_environmental_variance")->isMatrix())
473  {
474  // environmental effects can be trait-specific
475  get_parameter("quanti_environmental_variance")->getMatrix(&tmp_mat);
476 
477  if(tmp_mat.nrows() > 1)
478  return error("\"quanti_environmental_variance\" accepts only an array with one row. \
479 The matrix has %i rows.\n", tmp_mat.nrows());
480 
481  if(tmp_mat.ncols() > _num_traits)
482  return error("\"quanti_environmental_variance\" accepts an array with as many values as the number of traits. \
483 The matrix has %i columns.\n", tmp_mat.ncols());
484 
485  if(tmp_mat.ncols() < _num_traits)
486  warning("\"quanti_environmental_variance\" received an array with less values (%i) than the number of traits (%i). \
487 The values will be recycled among traits.", tmp_mat.ncols(), _num_traits);
488 
489  double var;
490 
491  for(unsigned int i = 0; i < _num_traits; i++) {
492 
493  var = tmp_mat.get(0, i%tmp_mat.ncols()); // recycle values if less values provided than number of traits
494 
495  if( var < 0 )
496  return error("\"quanti_environmental_variance\" received a negative value for trait %i!\n", i+1 );
497  else
498  _eVariance.push_back( sqrt(var) ); // store the SD to save time later
499  }
500 
501  } else { // single value provided, copied for all traits
502 
503  double var = get_parameter_value("quanti_environmental_variance");
504 
505  if( var < 0 )
506  return error("\"quanti_environmental_variance\" received a negative value!\n");
507 
508  for(unsigned int i = 0; i < _num_traits; ++i) {
509  _eVariance.push_back( sqrt(var) ); // store the SD to save time later
510  }
511 
512  }
513 
514  } // END if env variance
515 
516 #ifdef _DEBUG_
517  if(_eVariance.size() > 0) {
518 
519  message("quant::environmental variance is set to: ");
520 
521  for(unsigned int i = 0; i < _eVariance.size(); ++i)
522  message("%.3f, ", _eVariance[i]);
523 
524  message("\n");
525 
526  } else {
527 
528  message("quant::no environmental variance is set\n");
529  }
530 
531 #endif
532 
533  _h2.clear();
534 
535  if(get_parameter("quanti_heritability")->isSet()){
536 
537  if(get_parameter("quanti_heritability")->isMatrix()) // can be trait-specific
538  {
539  get_parameter("quanti_heritability")->getMatrix(&tmp_mat);
540 
541  if(tmp_mat.nrows() > 1)
542  return error("\"quanti_heritability\" accepts only an array with one row. \
543 The matrix has %i rows.\n", tmp_mat.nrows());
544 
545  if(tmp_mat.ncols() > _num_traits)
546  return error("\"quanti_heritability\" accepts an array with as many values as the number of traits. \
547 The matrix has %i columns.\n", tmp_mat.ncols());
548 
549  if(tmp_mat.ncols() < _num_traits)
550  warning("\"quanti_heritability\" received an array with less values (%i) than the number of traits (%i). \
551 The values will be recycled among traits.", tmp_mat.ncols(), _num_traits);
552 
553 
554  double h2;
555 
556  for(unsigned int i = 0; i < _num_traits; i++) {
557 
558  h2 = tmp_mat.get(0, i%_num_traits); // value recycling
559 
560  if( h2< 0 )
561  return error("\"quanti_heritability\" received a negative value for trait %i!\n", i+1 );
562  else
563  _h2.push_back( h2 ); // store the SD to save time later
564  }
565 
566  } else {
567 
568  double h2 = get_parameter_value("quanti_heritability");
569 
570  if( h2 < 0 )
571  return error("\"quanti_heritability\" received a negative value!\n");
572 
573  for(unsigned int i = 0; i < _num_traits; ++i) {
574  _h2.push_back( h2 ); // store the SD to save time later
575  }
576 
577  }
578  } //END IF isSet heritability
579 
580  _h2_setTime = 0;
581  if(get_parameter("quanti_heritability_setTime")->isSet()){
582  _h2_setTime = (unsigned int)get_parameter_value("quanti_heritability_setTime");
583  }
584 
585  _h2_isBroad = false;
586  if(get_parameter("quanti_heritability_isBroad")->isSet())
587  _h2_isBroad = (bool)get_parameter_value("quanti_heritability_isBroad");
588 
589 #ifdef _DEBUG_
590  if(_h2.size() > 0) {
591 
592  message("quant::heritability is set to: ");
593 
594  for(unsigned int i = 0; i < _eVariance.size(); ++i)
595  message("%.3f, ", _h2[i]);
596 
597  message("\n");
598 
599  } else {
600 
601  message("quant::no heritability is set, it will bepend on Ve (see above)\n");
602  }
603 
604  if(_h2_isBroad)
605  message("quant::heritability is set to \"broad sense\"\n");
606 #endif
607 
608  return true;
609 }

References _eVariance, _h2, _h2_isBroad, _h2_setTime, _num_traits, error(), TMatrix::get(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getMatrix(), Param::isSet(), message(), TMatrix::ncols(), TMatrix::nrows(), and warning().

Referenced by setParameters().

◆ setInitialValuesParams()

bool TProtoQuanti::setInitialValuesParams ( )
613  {
614 
615  //---------------------------------------------------------------------------------------------
616  // INITIAL VALUES:
617 
618  if(get_parameter("quanti_init_value")->isSet()) {
619 
620  get_parameter("quanti_init_value")->getMatrix(&_init_value);
621 
622  if(_init_value.nrows() != 1 || _init_value.ncols() != _num_traits) {
623  return error("\"quanti_init_value\" must be an array of length equal to the number of traits!\n");
624  }
625 
626  }
627  else {
628  _init_value.reset(1,_num_traits, 0.0);
629  }
630 
631  if(get_parameter("quanti_init_model")->isSet()) {
632 
633  _doInitMutation = (unsigned int)get_parameter_value("quanti_init_model");
634 
635  } else {
636  _doInitMutation = 0;
637  }
638 
639  if(get_parameter("quanti_init_variance")->isSet()) {
640 
641  if(get_parameter("quanti_init_variance")->isMatrix()) {
642 
643  get_parameter("quanti_init_variance")->getMatrix(&_init_variance);
644 
646  return error("\"quanti_init_variance\" must be an array of length equal to the number of traits!\n");
647  }
648 
649  } else {
650  _init_variance.reset(1, _num_traits, get_parameter_value("quanti_init_variance"));
651  }
652 
653  }
654  else { // initial variance is not set
655 
656  // verify that the initial variance is set when needed
657  if(_doInitMutation == 2 && _allele_model > 2)
658  return error("the initial trait variance must be set with \"quanti_init_variance\" for init model 2 and continuous allelic model.\n");
659 
661  }
662 
663  return true;
664 }

References _allele_model, _doInitMutation, _init_value, _init_variance, _num_traits, error(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getMatrix(), Param::isMatrix(), Param::isSet(), TMatrix::ncols(), TMatrix::nrows(), and TMatrix::reset().

Referenced by setParameters().

◆ setMutationCorrelation()

bool TProtoQuanti::setMutationCorrelation ( )
1841 {
1842  //---------------------------------------------------------------------------------------
1843  // MUTATIONAL CORRELATION
1844 
1845  // temporary TMatrix for parameters read-in
1846  TMatrix tmp_mat;
1847 
1848  _mutation_correlation.reset(1, _num_locus); // sets all elements to 0
1849 
1850  if(get_parameter("quanti_mutation_correlation")->isSet()) {
1851 
1852  if( get_parameter("quanti_mutation_matrix")->isSet() ){
1853 
1854  warning("\"quanti_mutation_correlation\" and \"quanti_mutation_matrix\" are set, we only use the mutation matrix. \"quanti_mutation_correlation\" is ignored.");
1855 
1856  } else if (_num_traits == 1) {
1857 
1858  warning("\"quanti_mutation_correlation\" is set but only one trait is modeled. Parameter is ignored.");
1859 
1860  } else {
1861 
1862  if(get_parameter("quanti_mutation_correlation")->isMatrix()) {
1863 
1864  get_parameter("quanti_mutation_correlation")->getMatrix(&tmp_mat);
1865 
1866  if(tmp_mat.nrows() > 1)
1867  return error("\"quanti_mutation_correlation\" must be an array with one row. The matrix has %i rows.\n", tmp_mat.nrows());
1868 
1869  if(tmp_mat.ncols() > _num_locus)
1870  return error("\"quanti_mutation_correlation\" accepts an array with as many values as the number of loci. \
1871 The array has %i values.\n", tmp_mat.ncols());
1872 
1873  if(tmp_mat.ncols() < _num_locus)
1874  warning("\"quanti_mutation_correlation\" received an array with less values (%i) than the number of loci (%i). \
1875 The values will be recycled among loci.", tmp_mat.ncols(), _num_locus);
1876 
1878 
1879  } else { // not a matrix but a single value
1880 
1881  double val = get_parameter_value("quanti_mutation_correlation");
1882 
1883  if(val < -1.0 || val > 1.0)
1884  return error("quant::value assigned to \"quanti_mutation_correlation\" must be within [-1, 1].\n");
1885 
1887 
1888  }
1889 
1890  }
1891  } // _end_ if param->isSet()
1892 
1893  return true;
1894 }

References _mutation_correlation, _num_locus, _num_traits, TMatrix::assign(), TMatrix::copy_recycle(), error(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getMatrix(), TMatrix::ncols(), TMatrix::nrows(), TMatrix::reset(), and warning().

Referenced by setMutationModel_full_pleio(), and setMutationModel_var_pleio().

◆ setMutationModel_full_pleio()

bool TProtoQuanti::setMutationModel_full_pleio ( )
884 {
885 
886  //store a few important numbers
888 
889  // memory size of a single allele value
890 // _sizeofLocusType = sizeof(double); --> this is set in setParameters() depending on the allele type
891 
892  // size of data used to store pleiotropic allelic values at a locus
894 
895  // mutation correlation set from "quanti_mutation_correlation"
896  if(!setMutationCorrelation()) return false;
897 
898  // set the set trait/locus_table, will be used by stat and file handlers to access data
900 
901  if( _allele_model == 1 || _allele_model ==2 ) {
902  //---------------------------------------------------------------------------------------
903  // DIALLELIC LOCI
904 
905  if (_num_traits > 2) { // multivariate models, only for non-diallelic loci
906 
907  return error("quant::the di-allelic model with pleiotropy is only allowed for max. 2 quantitative traits.\n");
908 
909  } else { // there are 2 traits, otherwise the "no_pleio" version of the function is called
910 
911  if(!setDiallelicMutationModel()) return false;
912 
914 
915  }
916 
917  } else {
918  //---------------------------------------------------------------------------------------
919  // CONTIUUM OF ALLELE MODEL
920 
921  if(!setContinuousMutationModel_full_pleio()) return false;
922 
923  if (_num_traits == 2) { // bivariate models, only for non-diallelic loci
924 
927  else
929 
930 
931  } else if (_num_traits > 2) { // multivariate models, only for non-diallelic loci
932 
935  else
937 
938  }
939  }
940 
941  // SET POINTER TO MUTATE FUNCTION
942 
943  if(_genomic_mutation_rate == 0) {
944 
946 
947  } else if(_allele_model <= 2) { // diallelic models
948 
950 
951  } else if(_allele_model == 3) { // continuous
953  } else // continuous in-place
955 
956 
957  return true;
958 }
double * getMutationEffectMultivariateGaussian(unsigned int loc)
Definition: ttquanti.cc:2355
void setTraitAndLocusTables_full_pleio()
Definition: ttquanti.cc:1271
void mutate_nill(TTQuanti *ind)
Definition: ttquanti.cc:2629
double * getMutationEffectBivariateGaussian(unsigned int loc)
Definition: ttquanti.cc:2379
void mutate_inplace_full_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2740
double * getMutationEffectBivariateDiallelic(unsigned int loc)
Definition: ttquanti.cc:2422
void mutate_diallelic_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2792
double * getMutationEffectBivariateGaussianLocSpec(unsigned int loc)
Definition: ttquanti.cc:2389
double * getMutationEffectMultivariateGaussianLocSpec(unsigned int loc)
Definition: ttquanti.cc:2367
bool setDiallelicMutationModel()
Definition: ttquanti.cc:1346
bool setMutationCorrelation()
Definition: ttquanti.cc:1840
void mutate_full_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2659
bool setContinuousMutationModel_full_pleio()
Definition: ttquanti.cc:1478

References _allele_model, _genomic_mutation_rate, _getMutationValues, _locusByteSize, _mutation_func_ptr, _mutationVarianceIsLocusSpecific, _num_locus, _num_traits, _seq_length, _sizeofLocusType, error(), getMutationEffectBivariateDiallelic(), getMutationEffectBivariateGaussian(), getMutationEffectBivariateGaussianLocSpec(), getMutationEffectMultivariateGaussian(), getMutationEffectMultivariateGaussianLocSpec(), mutate_diallelic_pleio(), mutate_full_pleio(), mutate_inplace_full_pleio(), mutate_nill(), setContinuousMutationModel_full_pleio(), setDiallelicMutationModel(), setMutationCorrelation(), and setTraitAndLocusTables_full_pleio().

Referenced by setParameters().

◆ setMutationModel_no_pleio()

bool TProtoQuanti::setMutationModel_no_pleio ( )
1153 {
1154 
1155  //---------------------------------------------------------------------------------------------
1156  // NON-PLEIOTROPIC TRAITS
1157 
1158  // size of data used to store allelic values at a locus -- here non-pleiotropic
1160 
1161  TMatrix tmp;
1162 
1163  if(_num_traits > 1) {
1164 #ifdef _DEBUG_
1165  message("quant::setting num loci per trait without pleiotropy.\n");
1166 #endif
1167 
1168 
1169  if(get_parameter("quanti_loci_per_trait")->isSet()) {
1170 
1171  get_parameter("quanti_loci_per_trait")->getMatrix(&tmp);
1172 
1173  if( tmp.nrows() > 1)
1174  return error("\"quanti_loci_per_trait\" must be an array with one row.\n");
1175 
1176  if( !(tmp.ncols() == _num_traits) )
1177  return error("\"quanti_loci_per_trait\" must hold a number of loci for each trait. Use \"quanti_loci\" if loci are equally distributed among traits.\n");
1178 
1179  if(tmp.rowSum(0) != _num_locus)
1180  return error("\"quanti_loci_per_trait\" must specify a total number of loci equal to \"quanti_loci\"\n");
1181 
1182 #ifdef _DEBUG_
1183  message("quant::found trait-specific number of loci.\n");
1184 #endif
1185 
1186  } else {
1187  // divide the tot num of loci into num of traits
1188  tmp.reset(1, _num_traits);
1189 
1190  unsigned int loc_per_trait = _num_locus / _num_traits;
1191 
1192  tmp.assign(loc_per_trait);
1193 
1194  if( _num_locus % _num_traits != 0) {
1195  warning("quant::number of loci is not a multiple of the number of trait, setting the number of loci per trait to %i.\n", _num_locus / _num_traits);
1196  warning("quant::resetting the total number of quantitative loci to %i\n", loc_per_trait*_num_traits);
1197  }
1198 
1199  _num_locus = loc_per_trait*_num_traits;
1200 
1201 #ifdef _DEBUG_
1202  message("quant::set equal number of loci per trait (%i).\n", (unsigned int)tmp.get(0,0));
1203 #endif
1204 
1205  }
1206 
1207 #ifdef _DEBUG_
1208  message("quant::setting trait and locus table for no-pleiotropy case.\n");
1209 #endif
1210 
1212  }
1213  else {
1214 
1215  tmp.reset(1, 1, _num_locus);
1216 
1218  }
1219 
1220  // _seq_length is equal to _num_locus
1222 
1223  //-----------------------------------------------------------------------------------------
1224  // SET MUTATION MODEL
1225 
1226 
1227  if( _allele_model <= 2 ) {
1228  //---------------------------------------------------------------------------------------
1229  // DIALLELIC LOCI
1230 
1231  if(!setDiallelicMutationModel()) return false;
1232 
1233  } else {
1234  //---------------------------------------------------------------------------------------
1235  // CONTIUUM OF ALLELE MODEL
1236 #ifdef _DEBUG_
1237  message("quant::setting continuous allele model for no-pleiotropy case.\n");
1238 #endif
1239 
1240  if(!setContinuousMutationModel_no_pleio()) return false;
1241 
1244  else
1246  }
1247 
1248  //-----------------------------------------------------------------------------------------
1249  // SET POINTER TO MUTATE FUNCTION
1250 
1251  if(_genomic_mutation_rate == 0) {
1252 
1254 
1255  } else if(_allele_model <= 2) {// di-allelic models
1256 
1258 
1259  } else if(_allele_model == 3) {
1260 
1262 
1263  } else
1265 
1266  return true;
1267 }
double rowSum(unsigned int row)
Sum all elements in a row.
Definition: tmatrix.h:318
double * getMutationEffectUnivariateGaussian(unsigned int loc)
Definition: ttquanti.cc:2398
bool setContinuousMutationModel_no_pleio()
Definition: ttquanti.cc:1802
void mutate_diallelic_no_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2858
void mutate_inplace_no_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2717
double * getMutationEffectUnivariateGaussianLocSpec(unsigned int loc)
Definition: ttquanti.cc:2406
void setTraitAndLocusTables_no_pleio(TMatrix &mat)
Definition: ttquanti.cc:1303
void mutate_no_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2636

References _allele_model, _genomic_mutation_rate, _getMutationValues, _locusByteSize, _mutation_func_ptr, _mutationVarianceIsLocusSpecific, _num_locus, _num_traits, _seq_length, _sizeofLocusType, TMatrix::assign(), error(), TMatrix::get(), SimComponent::get_parameter(), Param::getMatrix(), getMutationEffectUnivariateGaussian(), getMutationEffectUnivariateGaussianLocSpec(), message(), mutate_diallelic_no_pleio(), mutate_inplace_no_pleio(), mutate_nill(), mutate_no_pleio(), TMatrix::ncols(), TMatrix::nrows(), TMatrix::reset(), TMatrix::rowSum(), setContinuousMutationModel_no_pleio(), setDiallelicMutationModel(), setTraitAndLocusTables_no_pleio(), and warning().

Referenced by setParameters().

◆ setMutationModel_var_pleio()

bool TProtoQuanti::setMutationModel_var_pleio ( )
963 {
964 
965  //---------------------------------------------------------------------------------------------
966  // VARIABLE PLEIOTROPY: Jobran Chebib
967 
968  // size of data used to store pleiotropic allelic values at a locus,
969  //here set same as sizeof a single allele as PD varies per locus
971 
972  // initializes pleiotropic connectivity matrix -- "quanti_pleio_matx" in init file
973  // the connectivity matrix holds 0's in absence of a locus effect on a trait, and 1's otherwise
974  // loci are fully pleiotropic by default (1's everywhere)
975 
976  // a matrix is provided in input
977 
978  get_parameter("quanti_pleio_matrix")->getMatrix(&_pleio_matx); //this resets/builds the TMatrix
979 
981  return error("quant::\"quanti_pleio-matrix\" must be an m by n matrix of length m equal to the number of loci and n equal to the number of traits!\n");
982  }
983 
984  // end reading pleiot matrix
985 
986 
987 #ifdef _DEBUG_
988  // print _pleio_matrix
989  message("\nquant::pleiotropy matrix dimensions: rows(loci) = %i, columns(traits) = %i, (first 25 loci)\n",_pleio_matx.getNbRows(),_pleio_matx.getNbCols());
990  for(unsigned int i = 0; i < _pleio_matx.getNbRows() && i < 25; i++) {
991  for(unsigned int j = 0; j < _pleio_matx.getNbCols(); j++){
992  message("%.0f ",_pleio_matx.get(i,j));
993  message(" | ");
994  }
995  message("\n");
996  }
997 #endif
998 
999  // create temp_table from _pleio_matx to build _trait_table and _locus_table
1000  // records the locus-specific allele position affecting each trait, which depends on the PD of each locus
1001 
1002  vector< vector<unsigned int> > temp_table(_pleio_matx.ncols(),vector<unsigned int>(_pleio_matx.nrows()));
1003 
1004  if(_trait_locus_table.size() != 0) _trait_locus_table.clear();
1005  // build table:
1006  _trait_locus_table.assign(_pleio_matx.ncols(),vector<unsigned int>()); //trait X locus table, size of each row unknown yet
1007 
1008  unsigned int pos = 1; //because '0' is for no-effect of locus i on trait j
1009 
1010  for(unsigned int i = 0; i < _pleio_matx.nrows(); ++i){
1011  for(unsigned int j = 0; j < _pleio_matx.ncols(); ++j){
1012 
1013  if(_pleio_matx.get(i,j) == 1){
1014  temp_table[j][i] = pos; // pos is the array index in the sequence where the allelic value will be located
1015  pos++;
1016  _trait_locus_table[j].push_back(i); //add locus ID if that locus affects trait j
1017  }
1018  else if(_pleio_matx.get(i,j) == 0){
1019  temp_table[j][i] = 0;
1020  }
1021  else return error("quant::\"quanti_pleio_matrix\" must only contain 0s and 1s \n");
1022  }
1023  }
1024 
1025 #ifdef _DEBUG_
1026  // print temp_table (for debugging purposes only)
1027  message("quant::pleiotropic locus sequence position per trait (temp_table) (first 25 loci/trait): \n");
1028  for(unsigned int i=0; i<temp_table.size(); ++i){
1029  for(unsigned int j=0; j<temp_table[i].size() && j < 25; ++j){
1030  cout << temp_table[i][j] << " | ";
1031  }
1032  message("\n");
1033  }
1034 #endif
1035 
1036  // build _trait_table from temp_table (trait x locus)
1037  // it sets the array index of each allele affecting each trait in the QTL sequence
1038  // the sequence is organized as locus-trait: alleles affecting a given trait are NOT contiguous in the sequence
1039  if(_trait_table.size() != 0) _trait_table.clear();
1040 
1041  for(size_t i = 0; i < temp_table.size(); ++i){ //trait-wise
1042 
1043  _trait_table.push_back(vector<unsigned int>());
1044 
1045  for(size_t j = 0; j < temp_table[i].size(); ++j){ //locus-wise, size is the number of loci affecting trait i
1046 
1047  if(temp_table[i][j] != 0){
1048  _trait_table[i].push_back(temp_table[i][j]-1); //position in sequence where causative alleles are located
1049  }
1050  }
1051  }
1052 
1053  // build _locus_table from _pleio_matx
1054  // table holding { start locus index in sequence , pleiotropic degree } on each row
1055  if(_locus_table.size() != 0) _locus_table.clear();
1056 
1057  unsigned int pos4 = 0; //counts position in sequence
1058  unsigned int tsize = 0; //counts n traits affected = PD
1059 
1060  for(unsigned int i=0; i<_pleio_matx.getNbRows(); ++i){ //locus-wise
1061 
1062  _locus_table.push_back(vector<unsigned int> (2));
1063 
1064  _locus_table[i][0] = pos4;
1065 
1066  for(unsigned int j=0; j<_pleio_matx.getNbCols(); ++j){ //trait-wise, sum the row
1067 
1068  if(_pleio_matx.get(i,j) == 1)
1069  tsize++;
1070  }
1071 
1072  _locus_table[i][1] = tsize;
1073 
1074  pos4 += tsize;
1075 
1076  tsize = 0;
1077  }
1078 
1079  // calculate _seq_length from _trait_table
1080  _seq_length = 0;
1081  for(unsigned int i=0; i<_trait_table.size(); ++i){
1082  _seq_length += _trait_table[i].size();
1083  }
1084 
1085  //-----------------------------------------------------------------------------------------
1086  // SET MUTATION MODEL
1087 
1088  // mutation correlation set from "quanti_mutation_correlation"
1089  if(!setMutationCorrelation()) return false;
1090 
1091  if(_allele_model < 3 && !setDiallelicMutationModel()) return false;
1092 
1093  if(_allele_model > 2 && ! setContinuousMutationModel_var_pleio()) return false;
1094 
1095  _getMutationValuesVarPleio.clear(); // dimensionality of mutations depends on pleiotropic degree
1096 
1097  for(unsigned int i=0; i < _num_locus; ++i){
1098 
1099  if (_locus_table[i][1] == 1) { // PD = 1, no pleiotropy at this locus
1100 
1103  else
1105 
1106  } else if (_locus_table[i][1] == 2) { // PD = 2
1107 
1110  else
1112 
1113  } else if (_locus_table[i][1] > 2) { // PD > 2
1114 
1115  if (_allele_model > 2) {
1116 
1117 // if(_mutationVarianceIsLocusSpecific)
1119 // else
1120 // _getMutationValuesVarPleio.push_back(&TProtoQuanti::getMutationEffectMultivariateGaussian);
1121 
1122  } else {
1123  return error("quant::the di-allelic model with pleiotropy is only allowed for max. 2 quantitative traits (locus %i has PD = %i)\n.", i+1, _locus_table[i][1]);
1124  }
1125 
1126  }
1127  }
1128 
1129  //-----------------------------------------------------------------------------------------
1130  // SET POINTER TO MUTATE FUNCTION
1131 
1132  if(_genomic_mutation_rate == 0) {
1133 
1135 
1136  } else if(_allele_model <= 2) {// di-allelic models
1137 
1139 
1140  } else if(_allele_model == 3) {// continuous model
1141 
1143 
1144  } else //model 4, in-place continuous model
1146 
1147  return true;
1148 }
unsigned int getNbRows() const
Gives the number of rows.
Definition: tmatrix.h:212
unsigned int getNbCols() const
Gives the number of columns.
Definition: tmatrix.h:215
void mutate_inplace_var_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2768
void mutate_diallelic_var_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2827
void mutate_var_pleio(TTQuanti *ind)
Definition: ttquanti.cc:2687
bool setContinuousMutationModel_var_pleio()
Definition: ttquanti.cc:1645

References _allele_model, _genomic_mutation_rate, _getMutationValuesVarPleio, _locus_table, _locusByteSize, _mutation_func_ptr, _mutationVarianceIsLocusSpecific, _num_locus, _num_traits, _pleio_matx, _seq_length, _sizeofLocusType, _trait_locus_table, _trait_table, error(), TMatrix::get(), SimComponent::get_parameter(), Param::getMatrix(), getMutationEffectBivariateGaussian(), getMutationEffectBivariateGaussianLocSpec(), getMutationEffectMultivariateGaussianLocSpec(), getMutationEffectUnivariateGaussian(), getMutationEffectUnivariateGaussianLocSpec(), TMatrix::getNbCols(), TMatrix::getNbRows(), message(), mutate_diallelic_var_pleio(), mutate_inplace_var_pleio(), mutate_nill(), mutate_var_pleio(), TMatrix::ncols(), TMatrix::nrows(), setContinuousMutationModel_var_pleio(), setDiallelicMutationModel(), and setMutationCorrelation().

Referenced by setParameters().

◆ setMutationSigmaFromQuantiMutationVariance()

bool TProtoQuanti::setMutationSigmaFromQuantiMutationVariance ( )
1899 {
1900 
1901 // message("quant::found \"quanti_mutation_variance\" in input, checking dimensionality: ");
1902 
1903  if(get_parameter("quanti_mutation_variance")->isMatrix()) {
1904 
1905 #ifdef _DEBUG_
1906  message("\nquant::found locus-specific mutation variance (param is matrix).\n");
1907 #endif
1908 
1909  TMatrix tmp;
1910 
1911  get_parameter("quanti_mutation_variance")->getMatrix(&tmp);
1912 
1913 // message("%i x %i\n",tmp.nrows(), tmp.ncols());
1914 
1915  if(tmp.nrows() > 1) {
1916  error("\"quanti_mutation_variance\" must be an array with a single row and as many columns as the number of loci.\
1917 The matrix passed has %i rows.\n", tmp.nrows());
1918 
1919  error("Note: use \"quanti_mutation_matrix\" to specify different variance-covariance parameters for different traits\n");
1920  return false;
1921  }
1922 
1923  if(tmp.ncols() > _num_locus)
1924  return error("\"quanti_mutation_variance\" accepts an array with max. as many values as the number of loci. \
1925 The array has %i columns.\n", tmp.ncols());
1926 
1927  if(tmp.ncols() < _num_locus)
1928  warning("\"quanti_mutation_variance\" received an array with less values (%i) than the number of loci (%i). \
1929 The values will be recycled among loci.\n", tmp.ncols(), _num_locus);
1930 
1931  // using an array means that the mutation effect size is different among loci
1932  // we do not look at locus-specific pleiotropy here, but set the matrix to the maximum pleiotropic degree = num traits
1933 
1935 
1936 // message("quant::setting locus-specific mutation variance\n");
1937 
1938  // copy the values for each locus to all traits equally
1939  for(unsigned int i = 0; i < _num_locus; ++i) {
1940 
1941  if(tmp.get(0, i % tmp.ncols()) < 0)
1942  return error("quant::values assigned to \"quanti_mutation_variance\" must by > 0.\n");
1943 
1944  _mutation_sigma.set_row(i, sqrt( tmp.get(0, i % tmp.ncols()) ) );
1945  }
1946 
1947  } else { // not a matrix but a single value, the matrix has a single row
1948 
1949 // message("1 x 1\nquant::setting equal mutation variance on all traits and for all loci\n");
1950 
1951  if(get_parameter_value("quanti_mutation_variance") < 0)
1952  return error("quant::value assigned to \"quanti_mutation_variance\" must by > 0.\n");
1953 
1954  _mutation_sigma.reset(1, _num_traits, sqrt( get_parameter_value("quanti_mutation_variance") ));
1955 
1956  }
1957 
1958 #ifdef _DEBUG_
1959  message("quant::mutation sigma matrix:\n");
1961 #endif
1962 
1963  return true;
1964 }
void set_row(unsigned int i, double val)
Sets all elements at row i to value val.
Definition: tmatrix.h:111

References _mutation_sigma, _num_locus, _num_traits, error(), TMatrix::get(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getMatrix(), message(), TMatrix::ncols(), TMatrix::nrows(), TMatrix::reset(), TMatrix::set_row(), TMatrix::show_up(), and warning().

Referenced by setContinuousMutationModel_full_pleio(), and setContinuousMutationModel_var_pleio().

◆ setMutationSigmaFromQuantiMutationVariance_no_pleio()

bool TProtoQuanti::setMutationSigmaFromQuantiMutationVariance_no_pleio ( )
1969 {
1970 // message("quant::found \"quanti_mutation_variance\" in input, checking dimensionality for non-pleiotropic loci: ");
1971 
1972  if(get_parameter("quanti_mutation_variance")->isMatrix()) {
1973 
1974  TMatrix tmp;
1975 
1976  get_parameter("quanti_mutation_variance")->getMatrix(&tmp);
1977 
1978 // message("%i x %i\n",tmp.nrows(), tmp.ncols());
1979 
1980  if(tmp.nrows() > _num_traits)
1981  return error("\"quanti_mutation_variance\" has more rows than the number of traits for non-pleiotropic loci. Ignoring extra rows.\n", tmp.nrows());
1982 
1983  if(tmp.ncols() > _num_locus)
1984  return error("\"quanti_mutation_variance\" has more columns than the number of loci. The matrix has %i columns.\n", tmp.ncols());
1985 
1986  if(tmp.ncols() < _num_locus || tmp.nrows() < _num_traits)
1987  warning("quant::\"quanti_mutation_variance\" received less values than expected from the number of loci or traits. \
1988 The values will be recycled among loci and traits.\n");
1989 
1990  // using an array means the mutation effect size is different among loci
1991  // we do not look at locus-specific pleiotropy here, but set the matrix to the maximum pleiotropic degree = num traits
1992 
1993 // message("quant::setting locus-specific mutation variance for non-pleiotropic loci\n");
1994 
1995  _mutation_sigma.reset(_num_locus, 1); //each locus is affecting one trait only
1996 
1997  TMatrix expanded_mat(_num_traits, _num_locus);
1998 
1999  // copy elements at the right place when provided as trait-specific variance per block of loci, for instance.
2000  expanded_mat.copy_recycle(tmp);
2001 
2002  // copy trait-specific variances into the mutation sigma matrix first column
2003  for(unsigned int i = 0; i < _num_traits; ++i) {
2004  for(unsigned int j = 0, pos = _trait_table[i][0]; j < _trait_table[i].size(); ++j, ++pos){
2005 
2006  if(expanded_mat.get(i,pos) < 0)
2007  return error("quant::values assigned to \"quanti_mutation_variance\" must by > 0.\n");
2008 
2009  _mutation_sigma.set(pos, 0, sqrt(expanded_mat.get(i,pos)));
2010  }
2011  }
2012 
2013  } else { // not a matrix but a single value, the matrix has a single row
2014 
2015 // message("1 x 1\nquant::setting equal mutation variance across all quantitative loci\n");
2016 
2017  if(get_parameter_value("quanti_mutation_variance") < 0)
2018  return error("quant::value assigned to \"quanti_mutation_variance\" must by > 0.\n");
2019 
2020  _mutation_sigma.reset(1, 1, sqrt( get_parameter_value("quanti_mutation_variance") ));
2021 
2022  }
2023 
2024 #ifdef _DEBUG_
2025  message("quant::mutation sigma matrix:\n");
2027 #endif
2028 
2029  return true;
2030 }

References _mutation_sigma, _num_locus, _num_traits, _trait_table, TMatrix::copy_recycle(), error(), TMatrix::get(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getMatrix(), message(), TMatrix::ncols(), TMatrix::nrows(), TMatrix::reset(), TMatrix::set(), TMatrix::show_up(), and warning().

Referenced by setContinuousMutationModel_no_pleio().

◆ setParameters()

bool TProtoQuanti::setParameters ( )
virtual

Implements SimComponent.

256 {
257 #ifdef _DEBUG_
258  message("Trait quant::setting parameters\n");
259 #endif
260 
261  // reset all pointers to GSL matrices and vectors etc.
262  // do it here, before changing num trait and num loci for a new simulation
264 
265  //---------------------------------------------------------------------------------------
266  // Mandatory parameters:
267 
268  // number of quantitative traits
269  _num_traits = (unsigned int)get_parameter_value("quanti_traits");
270 
271  // number of loci
272  _num_locus = (unsigned int)get_parameter_value("quanti_loci");
273 
274  // set the genomic mutation rate
275  _mutation_rate = get_parameter_value("quanti_mutation_rate");
276 
278 
279  // set the allelic model
280  if( !(_allele_model = setAlleleModel()) ) return false;
281 
282  // check and set the datatype of the alleles, and size thereof
283  if(get_parameter("quanti_diallele_datatype")->isSet()) {
284 
285  _diallele_datatype = get_parameter("quanti_diallele_datatype")->getArg();
286 
287  if(_diallele_datatype != "byte" && _diallele_datatype != "bitstring")
288  return error("\"quanti_diallele_datatype\" has options \"byte\" or \"bitstring\"\n");
289  }
290  else
291  _diallele_datatype = "byte";
292 
293  if(_allele_model <= 2)
294  _sizeofLocusType = sizeof(unsigned char); // only used for "byte" datatype; i.e. di-allelic loci
295  else
296  _sizeofLocusType = sizeof(double);
297 
298  //---------------------------------------------------------------------------------------
299  // type of pleiotropy and pleiotropy-dpdt parameters:
300 
301  string pleio = get_parameter("quanti_pleiotropy")->getArg();
302 
303  if(_num_traits == 1 || pleio == "no" || pleio == "n" || pleio == "") {
304 
305  _pleio_type = 0;
306 
307 #ifdef _DEBUG_
308  message("quant::%s pleiotropy, %i trait(s), %i loci\n", "no", _num_traits, _num_locus);
309 #endif
310 
311  if(!setMutationModel_no_pleio()) return false;
312 
313  } else if (pleio == "full" || pleio == "f") {
314 
315  if(get_parameter("quanti_pleio_matrix")->isSet())
316  warning("\"quanti_pleio_matrix\" is ignored when pleiotropy type is \"full\".\n");
317 
318  _pleio_type = 1;
319 
320 #ifdef _DEBUG_
321  message("quant::%s pleiotropy, %i trait(s), %i loci\n", "full", _num_traits, _num_locus);
322 #endif
323 
324  if (!setMutationModel_full_pleio()) return false;
325 
326  } else if (pleio == "var" || pleio == "variable" || pleio == "v") {
327 
328  if(!get_parameter("quanti_pleio_matrix")->isSet())
329  return error("\"quanti_pleio_matrix\" must be provided when pleiotropy type is \"variable\".\n");
330 
331  _pleio_type = 2;
332 
333 #ifdef _DEBUG_
334  message("quant::%s pleiotropy, %i trait(s), %i loci\n", "variable", _num_traits, _num_locus);
335 #endif
336 
337  if(!setMutationModel_var_pleio()) return false;
338 
339  } else {
340  return error("\"quanti_pleiotropy\" takes options: full (f), var(iable) (v), or no (n)\n");
341  }
342 
343 #ifdef _DEBUG_
344  // print _trait_table (for debugging purposes only
345  message("quant::pleiotropic locus sequence position per trait (_trait_table) (ID:pos of first 10 loci/trait): \n");
346  for(unsigned int i=0; i<_trait_table.size(); ++i){
347  message("trait %i:\n", i);
348  for(unsigned int j=0; j <_trait_table[i].size() && j < 10; ++j){
349  message("%i:%i | ", _trait_locus_table[i][j], _trait_table[i][j]);
350  }
351  message("\n");
352  }
353  message("\n_trait_size: %i\n", _trait_table.size());
354 
355  // print _locus_table (for debugging purposes only)
356  message("quant::pleiotropic degree per locus (_locus_table) (first position in sequence of a locus : PD; for the first 25 loci): \n");
357  for(unsigned int i = 0; i <_locus_table.size() && i < 25; ++i){
358  message(" %i: %i \n", _locus_table[i][0], _locus_table[i][1]);
359  }
360 
361  message("quant::total sequence length: %i\n", _seq_length);
362 #endif
363 
364  //---------------------------------------------------------------------------------------
365  // ENVIRONMENTAL VARIANCE AND HERITABILITY
366 
367  // check and set environmental variance and heritability parameters:
368  if( !setHeritabilityParams()) return false;
369 
370  // setting the pointer to the phenotype setter function
371  // called in TProtoQuanti::get_phenotypic_value, itself called by TTQuanti::set_value()
372  if(_eVariance.size() != 0 ) {
373 
375 
376  } else { // no environmental effect
377 
379 
380  }
381 
382  //---------------------------------------------------------------------------------------
383  // INITIAL TRAIT VALUES
384  if( !setInitialValuesParams()) return false;
385 
386  //---------------------------------------------------------------------------------------
387  // COMPUTING GENOTYPE VALUES: ADDITVITY and DOMINANCE
388 
389  if( !setDominanceParameters() ) return false;
390 
391  //---------------------------------------------------------------------------------------
392  // EPISTASIS
393  if( !setEpistasisParameters() ) return false;
394 
395 
396  //---------------------------------------------------------------------------------------
397  // set pointers to genotype value setter
398 
399  // epistasis is hidden in the additive and dominance value setter of the "epistatic" classes
400  // epistasis is thus allowed on top of dominance
401 
402 
403  // set function pointers to default k-dominance model if dominance is added
404  if(_dominance_model) {
405 
408 
409  } else {
410 
413 
414  }
415 
416 // switch( _dominance_model) {
417 //
418 // case 0: // no dominance, reset pointers to additive case
419 // _set_genotype_func_ptr = &TProtoQuanti::set_genotype_value_additive;
420 // _getGenotypeWithDominance = 0;
421 // break;
422 //
423 // case 1: // h dominance model
424 // _getGenotypeWithDominance = &TProtoQuanti::get_genotype_dominance_h;
425 // break;
426 //
427 // case 2: // k dominance model
428 // _getGenotypeWithDominance = &TProtoQuanti::get_genotype_dominance_k;
429 //
430 // break;
431 // }
432 
433 
434  //---------------------------------------------------------------------------------------
435  // GENETIC MAP AND INHERIT FUNCTION POINTER
436 
437  if( !setGeneticMapParams()) return false;
438 
439 #ifdef _DEBUG_
440 
441  TTQuanti* trait = hatch();
442 
443  trait->init();
444  trait->init_sequence();
445  message("quant::parameters are set; display individual trait info:\n");
446  trait->show_up();
447 
448  delete trait;
449 
450 #endif
451 
452  return true;
453 }
unsigned int setAlleleModel()
Definition: ttquanti.cc:819
double set_genotype_value_dominance(const TTQuanti *ind, const unsigned int trait)
Definition: ttquanti.cc:2497
double set_genotype_value_additive(const TTQuanti *ind, const unsigned int trait)
Definition: ttquanti.cc:2490
bool setMutationModel_var_pleio()
Definition: ttquanti.cc:962
bool setMutationModel_no_pleio()
Definition: ttquanti.cc:1152
bool setDominanceParameters()
Definition: ttquanti.cc:2287
bool setInitialValuesParams()
Definition: ttquanti.cc:613
bool setGeneticMapParams()
Definition: ttquanti.cc:668
virtual TTQuanti * hatch()
Definition: ttquanti.cc:2878
bool setEpistasisParameters()
Definition: ttquanti.cc:708
bool setHeritabilityParams()
Definition: ttquanti.cc:457
bool setMutationModel_full_pleio()
Definition: ttquanti.cc:883
virtual void show_up()=0
Writes some info to stdout.
virtual void init()=0
Called to allocate the trait's genotypic sequences.
virtual void init_sequence()=0
Called at the start of each replicate, sets the initial genotypes.

References _allele_model, _diallele_datatype, _dominance_model, _eVariance, _genomic_mutation_rate, _getGenotypeWithDominance, _locus_table, _mutation_rate, _num_locus, _num_traits, _pleio_type, _seq_length, _set_genotype_func_ptr, _set_trait_value_func_ptr, _sizeofLocusType, _trait_locus_table, _trait_table, deallocate_gsl_mutation_matrix_space(), error(), get_genotype_dominance_k(), SimComponent::get_parameter(), SimComponent::get_parameter_value(), Param::getArg(), hatch(), TTrait::init(), TTrait::init_sequence(), message(), set_genotype_value_additive(), set_genotype_value_dominance(), set_trait_value_noVE(), set_trait_value_VE(), setAlleleModel(), setDominanceParameters(), setEpistasisParameters(), setGeneticMapParams(), setHeritabilityParams(), setInitialValuesParams(), setMutationModel_full_pleio(), setMutationModel_no_pleio(), setMutationModel_var_pleio(), TTrait::show_up(), and warning().

◆ setTraitAndLocusTables_full_pleio()

void TProtoQuanti::setTraitAndLocusTables_full_pleio ( )
1272 {
1273  // set the number of loci per trait in the _trait_table
1274  _trait_table.clear();
1275  _trait_table.assign(_num_traits, vector<unsigned int>(_num_locus));
1276 
1277  for(unsigned int i = 0; i < _num_traits; ++i) {
1278  for(unsigned int j = 0; j < _num_locus; ++j)
1279  _trait_table[i][j] = j*_num_traits + i;
1280  }
1281 
1282  // set the ID of loci affecting each trait in the _trait_locus_table
1283  _trait_locus_table.clear();
1284  _trait_locus_table.assign(_num_traits, vector<unsigned int>(_num_locus));
1285 
1286  for(unsigned int i = 0; i < _num_traits; ++i)
1287  for(unsigned int j = 0; j < _num_locus; ++j)
1288  _trait_locus_table[i][j] = j;
1289 
1290  // build _locus_table from _pleio_matx
1291  // table holding { start locus index in sequence , pleiotropic degree } on each row
1292  _locus_table.clear();
1293  _locus_table.assign(_num_locus, vector<unsigned int>(2));
1294 
1295  for(unsigned int i = 0; i < _num_locus; ++i) {
1296  _locus_table[i][0] = i*_num_traits;
1297  _locus_table[i][1] = _num_traits;
1298  }
1299 }

References _locus_table, _num_locus, _num_traits, _trait_locus_table, and _trait_table.

Referenced by setMutationModel_full_pleio().

◆ setTraitAndLocusTables_no_pleio()

void TProtoQuanti::setTraitAndLocusTables_no_pleio ( TMatrix mat)
1304 {
1305  // loci are contiguous, separated in chunks each affecting different traits
1306 
1307  // set the number of loci array position in the _trait_table
1308  // starting position in the sequence array of each locus set is the first value of each row
1309  _trait_table.clear();
1310 
1311  unsigned int loc = 0;
1312 
1313  for(unsigned int i = 0; i < _num_traits; ++i) {
1314 
1315  _trait_table.push_back(vector<unsigned int>(numLoc.get(0,i)));
1316 
1317  for(unsigned int j = 0; j < numLoc.get(0,i); ++j)
1318 
1319  _trait_table[i][j] = loc++;
1320  }
1321 
1322  assert(loc == _num_locus);
1323 
1324  // set the ID of loci affecting each trait in the _trait_locus_table,
1325  _trait_locus_table.clear();
1326  _trait_locus_table.assign(_num_traits, vector<unsigned int>());
1327 
1328  // here we just copy the _trait_table
1329  for(unsigned int i = 0; i < _num_traits; ++i) {
1330  _trait_locus_table[i].assign(_trait_table[i].begin(), _trait_table[i].end());
1331  }
1332 
1333  // build _locus_table from _pleio_matx
1334  // table holding { start locus index in sequence , pleiotropic degree } on each row
1335  _locus_table.clear();
1336  _locus_table.assign(_num_locus, vector<unsigned int>(2));
1337 
1338  for(unsigned int i = 0; i < _num_locus; ++i) {
1339  _locus_table[i][0] = i;
1340  _locus_table[i][1] = 1;
1341  }
1342 }

References _locus_table, _num_locus, _num_traits, _trait_locus_table, _trait_table, and TMatrix::get().

Referenced by setMutationModel_no_pleio().

◆ store_data()

virtual void TProtoQuanti::store_data ( BinaryStorageBuffer saver)
inlinevirtual

Implements StorableComponent.

566  {saver->store(&_seq_length,sizeof(int));}
void store(void *stream, unsigned int nb_bytes)
Definition: binarystoragebuffer.cc:16

References _seq_length, and BinaryStorageBuffer::store().

Friends And Related Function Documentation

◆ TTQuanti

friend class TTQuanti
friend

◆ TTQuanti_continuous

friend class TTQuanti_continuous
friend

◆ TTQuanti_continuous_full_pleio

friend class TTQuanti_continuous_full_pleio
friend

Referenced by hatch().

◆ TTQuanti_continuous_no_pleio

friend class TTQuanti_continuous_no_pleio
friend

Referenced by hatch().

◆ TTQuanti_continuous_single

friend class TTQuanti_continuous_single
friend

◆ TTQuanti_continuous_var_pleio

friend class TTQuanti_continuous_var_pleio
friend

Referenced by hatch().

Member Data Documentation

◆ _all_chooser

bool* TProtoQuanti::_all_chooser
private

◆ _allele_model

◆ _allele_value

◆ _diallele_datatype

string TProtoQuanti::_diallele_datatype
protected

Referenced by hatch(), and setParameters().

◆ _doInitMutation

unsigned int TProtoQuanti::_doInitMutation
private

◆ _dominance_effects

TMatrix TProtoQuanti::_dominance_effects
private

◆ _dominance_model

unsigned int TProtoQuanti::_dominance_model
private

◆ _effects_bivar

◆ _effects_multivar

◆ _epistasis

bool TProtoQuanti::_epistasis
private

◆ _epistatic_coefs_indices

TMatrix TProtoQuanti::_epistatic_coefs_indices
private

◆ _epistatic_coefs_matrix

TMatrix TProtoQuanti::_epistatic_coefs_matrix
private

◆ _eval

◆ _eVariance

vector<double> TProtoQuanti::_eVariance
private

◆ _evect

◆ _freqExtractor

TTQFreqExtractor* TProtoQuanti::_freqExtractor
private

Referenced by loadFileServices(), and ~TProtoQuanti().

◆ _genomic_mutation_rate

◆ _getGenotypeWithDominance

double(TProtoQuanti::* TProtoQuanti::_getGenotypeWithDominance) (double, double, double)
private

Pointer to either dominance_h() or dominance_k() function computing the genotypic value with dominance.

Referenced by setParameters().

◆ _getMutationValues

double*(TProtoQuanti::* TProtoQuanti::_getMutationValues) (unsigned int)
private

◆ _getMutationValuesVarPleio

vector< double* (TProtoQuanti::* ) (unsigned int) > TProtoQuanti::_getMutationValuesVarPleio
private

Collection of pointers to mutation functions, which generate allele values in dependence of pleiotropic degree.

Referenced by getMutationEffectsVarPleio(), mutate_inplace_var_pleio(), mutate_var_pleio(), and setMutationModel_var_pleio().

◆ _gsl_mutation_matrix

◆ _h2

vector<double> TProtoQuanti::_h2
private

◆ _h2_isBroad

bool TProtoQuanti::_h2_isBroad
private

◆ _h2_setTime

unsigned int TProtoQuanti::_h2_setTime
private

◆ _inherit_fun_ptr

void(TProtoQuanti::* TProtoQuanti::_inherit_fun_ptr) (sex_t, TTQuanti *, const TTQuanti *)
private

Pointer to inheritance functions: either inherit_free() (r=0.5), or inherit_low() (r<0.5).

Referenced by inherit(), and setGeneticMapParams().

◆ _init_value

TMatrix TProtoQuanti::_init_value
private

◆ _init_variance

TMatrix TProtoQuanti::_init_variance
private

◆ _locus_table

vector< vector<unsigned int> > TProtoQuanti::_locus_table
private

Locus table, num_locus x 2, first column holds the start position of the alleles of each locus in the sequence, second column counts the number of alleles = pleiotropic degree.

Allelic values at a locus are contiguous in the sequence.

Referenced by get_locus_PD(), get_locus_start_pos(), mutate_diallelic_var_pleio(), mutate_inplace_var_pleio(), mutate_var_pleio(), setContinuousMutationModel_var_pleio(), setMutationModel_var_pleio(), setParameters(), setTraitAndLocusTables_full_pleio(), and setTraitAndLocusTables_no_pleio().

◆ _locusByteSize

◆ _mutation_correlation

◆ _mutation_func_ptr

void(TProtoQuanti::* TProtoQuanti::_mutation_func_ptr) (TTQuanti *)
private

Pointer to mutation function, which depends on allele on model (HC, noHC, diallelic)

Referenced by mutate(), setMutationModel_full_pleio(), setMutationModel_no_pleio(), and setMutationModel_var_pleio().

◆ _mutation_rate

double TProtoQuanti::_mutation_rate
protected

◆ _mutation_sigma

◆ _mutationEffectIsFixedDiAllele

bool TProtoQuanti::_mutationEffectIsFixedDiAllele
private

◆ _mutationVarianceIsLocusSpecific

◆ _num_epi_coefs

unsigned int TProtoQuanti::_num_epi_coefs
private

◆ _num_locus

◆ _num_traits

◆ _ohtaStats

TTQOhtaStats* TProtoQuanti::_ohtaStats
private

Referenced by loadFileServices(), and ~TProtoQuanti().

◆ _phenotypes

double* TProtoQuanti::_phenotypes
private

◆ _pleio_matx

TMatrix TProtoQuanti::_pleio_matx
private

Pleiotropy matrix provided in input (num locu X num trait).

Gene (row)-trait (column) connectivity matrix.

Referenced by get_pleio_matrix(), setMutationModel_var_pleio(), and TProtoQuanti().

◆ _pleio_type

unsigned int TProtoQuanti::_pleio_type
protected

◆ _reader

TTQuantiFH* TProtoQuanti::_reader
private

Referenced by loadFileServices(), and ~TProtoQuanti().

◆ _seq_length

unsigned int TProtoQuanti::_seq_length
protected

◆ _sequence_diallele_values

double* TProtoQuanti::_sequence_diallele_values[2]
private

◆ _set_genotype_func_ptr

double(TProtoQuanti::* TProtoQuanti::_set_genotype_func_ptr) (const TTQuanti *, const unsigned int)
private

Pointer to functions get_genotype_value_additive() or get_genotype_value_dominance() computing the genotypic value of a trait as function of allele effect.

Referenced by get_genotypic_value(), set_trait_value_noVE(), and setParameters().

◆ _set_trait_value_func_ptr

double(TProtoQuanti::* TProtoQuanti::_set_trait_value_func_ptr) (const TTQuanti *, const unsigned int)
private

Pointer to either set_trait_value_VE() or set_trait_value_noVE() to compute phenotypic values.

Will call function to compute genotype values stored in _set_genotype_func_ptr.

Referenced by get_phenotypic_value(), set_trait_value_func_ptr(), and setParameters().

◆ _sizeofLocusType

◆ _stats

TTQuantiSH* TProtoQuanti::_stats
private

◆ _trait_locus_table

vector< vector<unsigned int> > TProtoQuanti::_trait_locus_table
private

Table storing the locus id of each locus affecting each trait (num trait X (variable length/trait)).

Referenced by get_allele_position(), get_locus_ID(), setMutationModel_var_pleio(), setParameters(), setTraitAndLocusTables_full_pleio(), and setTraitAndLocusTables_no_pleio().

◆ _trait_table

vector< vector<unsigned int> > TProtoQuanti::_trait_table
private

Trait table, (num trait X (variable length/trait)), holds, for each trait, the array position of causative alleles in the sequence.

Referenced by get_allele_position(), get_locus_seq_pos(), get_num_locus(), setMutationModel_var_pleio(), setMutationSigmaFromQuantiMutationVariance_no_pleio(), setParameters(), setTraitAndLocusTables_full_pleio(), and setTraitAndLocusTables_no_pleio().

◆ _writer

TTQuantiFH* TProtoQuanti::_writer
private

Referenced by loadFileServices(), and ~TProtoQuanti().

◆ _ws


The documentation for this class was generated from the following files:

Generated for Nemo v2.4.0b by  doxygen 1.9.1 -- Nemo is hosted on  Download Nemo

Locations of visitors to this page
Catalogued on GSR