1LoadFunctionLibrary("../protein.bf");
2LoadFunctionLibrary("../parameters.bf");
3LoadFunctionLibrary("../frequencies.bf");
4LoadFunctionLibrary("../../UtilityFunctions.bf");
5LoadFunctionLibrary("../../all-terms.bf");
6
7
8/** @module models.protein.empirical */
9
10/**
11 * @name models.protein.empirical.ModelDescription
12 * @param {String} type
13 * @returns {Dictionary} model description
14 * @description Create the baseline schema (dictionary) for empirical protein model definitions
15 */
16lfunction models.protein.empirical.ModelDescription(type) {
17    return {
18        utility.getGlobalValue("terms.alphabet"): utility.getGlobalValue("models.protein.alphabet"),
19        utility.getGlobalValue("terms.description"): "General class of empirical substitution matrices for amino-acids",
20        utility.getGlobalValue("terms.model.canonical"): 1, // is of the r_ij \times \pi_j form
21        utility.getGlobalValue("terms.model.reversible"): 1,
22        utility.getGlobalValue("terms.model.efv_estimate_name"): utility.getGlobalValue("terms.frequencies.predefined"),
23        utility.getGlobalValue("terms.parameters"): {
24            utility.getGlobalValue("terms.global"): {},
25            utility.getGlobalValue("terms.local"): {},
26            utility.getGlobalValue("terms.model.empirical"): 0
27        },
28        utility.getGlobalValue("terms.model.type"): type,
29        utility.getGlobalValue("terms.model.get_branch_length"): "",
30        utility.getGlobalValue("terms.model.set_branch_length"): "models.generic.SetBranchLength",
31        utility.getGlobalValue("terms.model.constrain_branch_length"): "models.generic.ConstrainBranchLength",
32        utility.getGlobalValue("terms.model.frequency_estimator"): "frequencies.empirical.protein",
33        utility.getGlobalValue("terms.model.q_ij"): "models.protein.empirical._GenerateRate",
34        utility.getGlobalValue("terms.model.time"): "models.protein.generic.Time",
35        utility.getGlobalValue("terms.model.defineQ"): "models.protein.empirical._DefineQ",
36        utility.getGlobalValue("terms.model.post_definition"): "models.generic.post.definition"
37    };
38}
39
40/*
41Load model matrices
42*/
43LoadFunctionLibrary("matrices/JC69.ibf");
44LoadFunctionLibrary("matrices/JTT.ibf");
45LoadFunctionLibrary("matrices/LG.ibf");
46LoadFunctionLibrary("matrices/WAG.ibf");
47LoadFunctionLibrary("matrices/mt.ibf"); // all three mtMet/mtVer/mtInv models
48LoadFunctionLibrary("matrices/gcpREV.ibf");
49LoadFunctionLibrary("matrices/HIV.ibf");
50
51/**
52 * @name models.protein.Empirical._GenerateRate
53 * @description Generates the r_ij component of q_ij := r_ij * time * freq_j
54 * @param {Dict} rateDict
55 * @param {Number} fromChar
56 * @param {Number} toChar
57 * @param {String} namespace
58 * @param {String} model_type
59 * @return list of parameters
60 */
61lfunction models.protein.empirical._GenerateRate(fromChar, toChar, namespace, model_type, model) {
62    models.protein.empirical._GenerateRate.p = {};
63    models.protein.empirical._GenerateRate.p  [model_type]       = {};
64
65    if (fromChar < toChar) {
66        models.protein.empirical._GenerateRate.p  [utility.getGlobalValue("terms.model.rate_entry")] = "" + ((model[utility.getGlobalValue ("terms.model.empirical_rates")])[fromChar])[toChar];
67    } else {
68        models.protein.empirical._GenerateRate.p  [utility.getGlobalValue("terms.model.rate_entry")] = "" + ((model[utility.getGlobalValue ("terms.model.empirical_rates")])[toChar])[fromChar];
69    }
70    return models.protein.empirical._GenerateRate.p;
71}
72
73/**
74 * @name models.protein.empirical._DefineQ
75 * @param {Dictionary} model definition
76 * @param {String} namespace
77 */
78lfunction models.protein.empirical._DefineQ(model_dict, namespace) {
79
80    // Call frequencies here. Will be repeated in model.generic.DefineModel, but we are ok with that.
81
82    if (utility.Has (model_dict, utility.getGlobalValue("terms.model.data"), "String")) {
83        frequencies._aux.empirical.singlechar(model_dict, namespace, model_dict[utility.getGlobalValue("terms.model.data")]);
84        models.protein.empirical._NormalizeEmpiricalRates(model_dict, namespace);
85    }
86    models.protein.empirical.DefineQMatrix (model_dict, namespace);
87    return model_dict;
88}
89
90/**
91 * @name models.protein.empirical._NormalizeEmpiricalRates
92 * @param {Dictionary} model definition
93 * @param {String} namespace
94 */
95lfunction models.protein.empirical._NormalizeEmpiricalRates(model_dict, namespace) {
96
97
98    alphabet  = model_dict[utility.getGlobalValue("terms.alphabet")];
99    dim       = utility.Array1D (alphabet);
100    raw_rates = model_dict[utility.getGlobalValue("terms.model.empirical_rates")];
101    EFV       = model_dict[utility.getGlobalValue("terms.efv_estimate")];
102
103
104    // Create Q from R, EFV
105    Q = {dim,dim};
106    rowSums = {dim,1};
107
108    // Fill in nondiagonal
109    for (i = 0; i < dim; i +=1 ){
110        for (j = i+1; j < dim; j += 1){
111            if ( i!=j ){
112
113
114                rate = (raw_rates[alphabet[i]])[alphabet[j]];
115
116                Q[i][j] = rate * EFV[j];
117                Q[j][i] = rate * EFV[i];
118
119                rowSums[i] += Q[i][j];
120                rowSums[j] += Q[j][i];
121            }
122        }
123    }
124
125    // Fill in diagonal
126    for (i = 0; i < dim; i += 1){
127        Q[i][i] = -1 * rowSums[i];
128    }
129
130
131    // Get normalization factor
132    norm = 0;
133    for (i = 0; i < dim; i +=1 ){
134        norm += Q[i][i] * EFV[i];
135    }
136    norm = -1*norm;
137
138    // perform normalization
139    for (i = 0; i < dim; i +=1 ){
140        for ( j = 0; j < dim; j += 1){
141            Q[i][j] = Q[i][j] / norm;
142        }
143    }
144    // Now convert it BACK TO hyphy dictionary with frequencies divided out. //
145    // ************** This sets the new empirical rates. ************** //
146
147    new_empirical_rates  = {};
148    for (l1 = 0; l1 < dim - 1; l1 += 1) {
149        new_empirical_rates[alphabet[l1]] = {};
150
151        for (l2 = l1 + 1; l2 < dim; l2 += 1) {
152
153            if (EFV[l2] == 0){
154                nof_rate = 0.;
155            }
156            else {
157                nof_rate =  Q [l1][l2] / EFV[l2];
158            }
159            (new_empirical_rates[alphabet[l1]])[alphabet[l2]] = nof_rate;
160        }
161    }
162    model_dict[ utility.getGlobalValue("terms.model.empirical_rates")] = new_empirical_rates;
163
164    return model_dict;
165}
166
167
168/**
169 * @name models.protein.empirical.DefineQMatrix
170 * @param {Dictionary} modelSpec
171 * @param {String} namespace
172 */
173function models.protein.empirical.DefineQMatrix (modelSpec, namespace) {
174
175	__alphabet = modelSpec [terms.alphabet];
176	assert (Type (__alphabet) == "Matrix" && Columns (__alphabet) == models.protein.dimensions, "Unsupported or missing alphabet '" + __alphabet + "'");
177
178	__modelType = modelSpec[terms.model.type];
179	if (Type (__modelType) == "None" || Type (__modelType) == "Number") {
180		__modelType = terms.global;
181	}
182	modelSpec[terms.model.type] = __modelType;
183	assert (__modelType == terms.local || __modelType == terms.global, "Unsupported or missing model type '" + __modelType + "'");
184
185	__rate_function = modelSpec [terms.model.q_ij];
186	assert (utility.IsFunction (__rate_function), "Missing q_ij callback in model specification");
187
188	__time_function = modelSpec [terms.model.time];
189	assert (utility.IsFunction (__time_function), "Missing time callback in model specification");
190
191
192	__rate_matrix = {models.protein.dimensions,models.protein.dimensions};
193	__rate_matrix [0][0] = "";
194
195	__rate_variation = model.generic.get_rate_variation (modelSpec);
196
197    // ADDED FOR EMPIRICAL MODELS
198    __empirical_rates = modelSpec[terms.model.empirical_rates];
199
200
201
202
203	__global_cache = {};
204
205	if (None != __rate_variation) {
206
207
208		__rp = Call (__rate_variation[terms.rate_variation.distribution], __rate_variation[terms.rate_variation.options], namespace);
209		__rate_variation [terms.id] = (__rp[terms.category])[terms.id];
210
211		parameters.DeclareCategory   (__rp[terms.category]);
212        parameters.helper.copy_definitions (modelSpec[terms.parameters], __rp);
213	}
214
215	for (_rowChar = 0; _rowChar < models.protein.dimensions; _rowChar +=1 ){
216		for (_colChar = 0; _colChar < models.protein.dimensions; _colChar += 1) {
217            if (_rowChar == _colChar) {
218                continue;
219            }
220			__rp = Call (__rate_function, __alphabet[_rowChar],
221															  __alphabet[_colChar],
222															   namespace,
223															  __modelType,
224															  modelSpec);
225
226
227		 	if (None != __rate_variation) {
228				__rp = Call (__rate_variation[terms.rate_variation.rate_modifier],
229							 __rp,
230							 __alphabet[_rowChar],
231							 __alphabet[_colChar],
232							 namespace,
233							 __rate_variation [terms.id]);
234 			}
235
236            if (Abs (__rp[terms.model.rate_entry])) {
237                parameters.DeclareGlobal (__rp[terms.global], __global_cache);
238                parameters.helper.copy_definitions (modelSpec[terms.parameters], __rp);
239
240                __rate_matrix [_rowChar][_colChar] = __rp[terms.model.rate_entry];
241                continue;
242            }
243			__rate_matrix [_rowChar][_colChar] = "";
244		}
245	}
246
247	__rp = Call (__time_function, __modelType);
248
249	if (Abs (__rp)) {
250		((modelSpec[terms.parameters])[terms.local])[terms.timeParameter ()] = __rp;
251	    modelSpec [terms.model.rate_matrix] = parameters.AddMultiplicativeTerm (__rate_matrix, __rp, 0);
252	} else {
253	    modelSpec [terms.model.rate_matrix] = __rate_matrix;
254	}
255
256}
257
258models.protein.empirical.default_generators = {"LG": "models.protein.LG.ModelDescription",
259                                               "WAG": "models.protein.WAG.ModelDescription",
260                                               "JTT": "models.protein.JTT.ModelDescription",
261                                               "JC69": "models.protein.JC69.ModelDescription",
262                                               "mtInv": "models.protein.mtInv.ModelDescription",
263                                               "mtMet": "models.protein.mtMet.ModelDescription",
264                                               "mtVer": "models.protein.mtVer.ModelDescription",
265                                               "gcpREV": "models.protein.gcpREV.ModelDescription",
266                                               "HIVBm": "models.protein.HIVBm.ModelDescription",
267                                               "HIVWm": "models.protein.HIVWm.ModelDescription"};
268
269models.protein.empirical.plusF_generators = {"LG": "models.protein.LGF.ModelDescription",
270                                             "WAG": "models.protein.WAGF.ModelDescription",
271                                             "JTT": "models.protein.JTTF.ModelDescription",
272                                             "JC69": "models.protein.JC69F.ModelDescription",
273                                             "mtMet": "models.protein.mtMetF.ModelDescription",
274                                             "mtVer": "models.protein.mtVerF.ModelDescription",
275                                             "gcpREV": "models.protein.gcpREVF.ModelDescription",
276                                             "HIVBm": "models.protein.HIVBmF.ModelDescription",
277                                             "HIVWm": "models.protein.HIVWmF.ModelDescription"};
278
279models.protein.empirical.mleF_generators = {"LG": "models.protein.LGML.ModelDescription",
280                                             "WAG": "models.protein.WAGML.ModelDescription",
281                                             "JTT": "models.protein.JTTML.ModelDescription",
282                                             "JC69": "models.protein.JC69ML.ModelDescription",
283                                             "mtMet": "models.protein.mtMetML.ModelDescription",
284                                             "mtVer": "models.protein.mtVerML.ModelDescription",
285                                             "gcpREV": "models.protein.gcpREVML.ModelDescription",
286                                             "HIVBm": "models.protein.HIVBmML.ModelDescription",
287                                             "HIVWm": "models.protein.HIVWmML.ModelDescription"};
288
289/**************************************** LG functions *************************************/
290
291
292/**
293 * @name models.protein.LG.ModelDescription
294 * @description Create the baseline schema (dictionary) for the LG model of protein evolution
295 * @returns {Dictionary} model description
296 * @param {String} type
297 */
298 function models.protein.LG.ModelDescription(type) {
299    models.protein.LG.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
300    models.protein.LG.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.LG.Rij;
301    models.protein.LG.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.LG.frequencies";
302    return models.protein.LG.ModelDescription.model_definition;
303}
304
305/**
306 * @name models.protein.LGF.ModelDescription
307 * @description Create the baseline schema (dictionary) for the LG+F model of protein evolution
308 * @returns {Dictionary} model description
309 * @param {String} type
310 */
311function models.protein.LGF.ModelDescription(type) {
312    models.protein.LGF.ModelDescription.model_definition = models.protein.LG.ModelDescription(type);
313    models.protein.LGF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
314    models.protein.LGF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
315    return models.protein.LGF.ModelDescription.model_definition;
316}
317
318
319/**
320 * @name models.protein.LGML.ModelDescription
321 * @description Create the baseline schema (dictionary) for the LG+ML model of protein evolution
322 * @returns {Dictionary} model description
323 * @param {String} type
324 */
325function models.protein.LGML.ModelDescription(type) {
326    models.protein.LGML.ModelDescription.model_definition = models.protein.LG.ModelDescription(type);
327    models.protein.LGML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
328    models.protein.LGML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
329    return models.protein.LGML.ModelDescription.model_definition;
330}
331
332
333/**************************************** JTT functions *************************************/
334
335
336/**
337 * @name models.protein.JTT.ModelDescription
338 * @description Create the baseline schema (dictionary) for the JTT model of protein evolution
339 * @returns {Dictionary} model description
340 * @param {String} type
341 */
342 function models.protein.JTT.ModelDescription(type) {
343    models.protein.JTT.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
344    models.protein.JTT.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.JTT.Rij;
345    models.protein.JTT.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.JTT.frequencies";
346    return models.protein.JTT.ModelDescription.model_definition;
347}
348
349
350/**
351 * @name models.protein.JTTF.ModelDescription
352 * @description Create the baseline schema (dictionary) for the JTT+F model of protein evolution
353 * @returns {Dictionary} model description
354 * @param {String} type
355 */
356function models.protein.JTTF.ModelDescription(type) {
357    models.protein.JTTF.ModelDescription.model_definition = models.protein.JTT.ModelDescription(type);
358    models.protein.JTTF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
359    models.protein.JTTF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
360    return models.protein.JTTF.ModelDescription.model_definition;
361}
362
363
364/**
365 * @name models.protein.JTTML.ModelDescription
366 * @description Create the baseline schema (dictionary) for the JTT+ML model of protein evolution
367 * @returns {Dictionary} model description
368 * @param {String} type
369 */
370function models.protein.JTTML.ModelDescription(type) {
371    models.protein.JTTML.ModelDescription.model_definition = models.protein.JTT.ModelDescription(type);
372    models.protein.JTTML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
373    models.protein.JTTML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
374    return models.protein.JTTML.ModelDescription.model_definition;
375}
376
377/**************************************** JC69 functions *************************************/
378
379
380 /**
381 * @name models.protein.JC69.ModelDescription
382 * @description Create the baseline schema (dictionary) for the JC69 (equal rates) model of protein evolution
383 * @returns {Dictionary} model description
384 * @param {String} type
385 */
386function models.protein.JC69.ModelDescription(type) {
387    models.protein.JC69.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
388    models.protein.JC69.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.JC69.Rij;
389    models.protein.JC69.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.JC69.frequencies";
390    return models.protein.JC69.ModelDescription.model_definition;
391}
392
393/**
394 * @name models.protein.JC69F.ModelDescription
395 * @description Create the baseline schema (dictionary) for the JC69+F model of protein evolution
396 * @returns {Dictionary} model description
397 * @param {String} type
398 */
399function models.protein.JC69F.ModelDescription(type) {
400    models.protein.JC69F.ModelDescription.model_definition = models.protein.JC69.ModelDescription(type);
401    models.protein.JC69F.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
402    models.protein.JC69F.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
403    return models.protein.JC69F.ModelDescription.model_definition;
404}
405
406
407/**
408 * @name models.protein.JC69ML.ModelDescription
409 * @description Create the baseline schema (dictionary) for the JC69+ML model of protein evolution
410 * @returns {Dictionary} model description
411 * @param {String} type
412 */
413function models.protein.JC69ML.ModelDescription(type) {
414    models.protein.JC69ML.ModelDescription.model_definition = models.protein.JC69.ModelDescription(type);
415    models.protein.JC69ML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
416    models.protein.JC69ML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
417    return models.protein.JC69ML.ModelDescription.model_definition;
418}
419
420/**************************************** mtMAM functions *************************************/
421
422
423 /**
424 * @name models.protein.mtMAM.ModelDescription
425 * @description Create the baseline schema (dictionary) for the mtMAM model of protein evolution
426 * @returns {Dictionary} model description
427 * @param {String} type
428 */
429function models.protein.mtMAM.ModelDescription(type) {
430    models.protein.mtMAM.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
431    models.protein.mtMAM.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.mtMAM.Rij;
432    models.protein.mtMAM.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.mtMAM.frequencies";
433    return models.protein.mtMAM.ModelDescription.model_definition;
434}
435
436/**
437 * @name models.protein.mtMAMF.ModelDescription
438 * @description Create the baseline schema (dictionary) for the mtMAM+F model of protein evolution
439 * @returns {Dictionary} model description
440 * @param {String} type
441 */
442function models.protein.mtMAMF.ModelDescription(type) {
443    models.protein.mtMAMF.ModelDescription.model_definition = models.protein.mtMAM.ModelDescription(type);
444    models.protein.mtMAMF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
445    models.protein.mtMAMF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
446    return models.protein.mtMAMF.ModelDescription.model_definition;
447}
448
449
450/**
451 * @name models.protein.mtMAMML.ModelDescription
452 * @description Create the baseline schema (dictionary) for the mtMAM+ML model of protein evolution
453 * @returns {Dictionary} model description
454 * @param {String} type
455 */
456function models.protein.mtMAMML.ModelDescription(type) {
457    models.protein.mtMAMML.ModelDescription.model_definition = models.protein.mtMAM.ModelDescription(type);
458    models.protein.mtMAMML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
459    models.protein.mtMAMML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
460    return models.protein.mtMAMML.ModelDescription.model_definition;
461}
462
463/**************************************** cpREV functions *************************************/
464
465/**
466 * @name models.protein.cpREV.ModelDescription
467 * @description Create the baseline schema (dictionary) for the cpREV model of protein evolution
468 * @returns {Dictionary} model description
469 * @param {String} type
470 */
471function models.protein.cpREV.ModelDescription(type) {
472    models.protein.cpREV.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
473    models.protein.cpREV.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.cpREV.Rij;
474    models.protein.cpREV.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.cpREV.frequencies";
475    return models.protein.cpREV.ModelDescription.model_definition;
476}
477
478/**
479 * @name models.protein.cpREVF.ModelDescription
480 * @description Create the baseline schema (dictionary) for the cpREV+F model of protein evolution
481 * @returns {Dictionary} model description
482 * @param {String} type
483 */
484function models.protein.cpREVF.ModelDescription(type) {
485    models.protein.cpREVF.ModelDescription.model_definition = models.protein.cpREV.ModelDescription(type);
486    models.protein.cpREVF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
487    models.protein.cpREVF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
488    return models.protein.cpREVF.ModelDescription.model_definition;
489}
490
491/**
492 * @name models.protein.cpREVML.ModelDescription
493 * @description Create the baseline schema (dictionary) for the cpREV+ML model of protein evolution
494 * @returns {Dictionary} model description
495 * @param {String} type
496 */
497function models.protein.cpREVML.ModelDescription(type) {
498    models.protein.cpREVML.ModelDescription.model_definition = models.protein.cpREV.ModelDescription(type);
499    models.protein.cpREVML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
500    models.protein.cpREVML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
501    return models.protein.cpREVML.ModelDescription.model_definition;
502}
503
504/**************************************** AB functions *************************************/
505
506/**
507 * @name models.protein.AB.ModelDescription
508 * @description Create the baseline schema (dictionary) for the AB model of protein evolution
509 * @returns {Dictionary} model description
510 * @param {String} type
511 */
512function models.protein.AB.ModelDescription(type) {
513    models.protein.AB.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
514    models.protein.AB.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.AB.Rij;
515    models.protein.AB.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.AB.frequencies";
516    return models.protein.AB.ModelDescription.model_definition;
517}
518
519/**
520 * @name models.protein.ABF.ModelDescription
521 * @description Create the baseline schema (dictionary) for the AB+F model of protein evolution
522 * @returns {Dictionary} model description
523 * @param {String} type
524 */
525function models.protein.ABF.ModelDescription(type) {
526    models.protein.ABF.ModelDescription.model_definition = models.protein.AB.ModelDescription(type);
527    models.protein.ABF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
528    models.protein.ABF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
529    return models.protein.ABF.ModelDescription.model_definition;
530}
531
532/**
533 * @name models.protein.ABML.ModelDescription
534 * @description Create the baseline schema (dictionary) for the AB+ML model of protein evolution
535 * @returns {Dictionary} model description
536 * @param {String} type
537 */
538function models.protein.ABML.ModelDescription(type) {
539    models.protein.ABML.ModelDescription.model_definition = models.protein.AB.ModelDescription(type);
540    models.protein.ABML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
541    models.protein.ABML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
542    return models.protein.ABML.ModelDescription.model_definition;
543}
544
545
546/**************************************** mtMet functions *************************************/
547
548
549/**
550 * @name models.protein.mtMet.ModelDescription
551 * @description Create the baseline schema (dictionary) for the mtMet model of protein evolution
552 * @returns {Dictionary} model description
553 * @param {String} type
554 */
555 function models.protein.mtMet.ModelDescription(type) {
556    models.protein.mtMet.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
557    models.protein.mtMet.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.mtMet.Rij;
558    models.protein.mtMet.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.mtMet.frequencies";
559    return models.protein.mtMet.ModelDescription.model_definition;
560}
561
562/**
563 * @name models.protein.mtMetF.ModelDescription
564 * @description Create the baseline schema (dictionary) for the mtMet+F model of protein evolution
565 * @returns {Dictionary} model description
566 * @param {String} type
567 */
568function models.protein.mtMetF.ModelDescription(type) {
569    models.protein.mtMetF.ModelDescription.model_definition = models.protein.mtMet.ModelDescription(type);
570    models.protein.mtMetF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
571    models.protein.mtMetF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
572    return models.protein.mtMetF.ModelDescription.model_definition;
573}
574
575
576/**
577 * @name models.protein.mtMetML.ModelDescription
578 * @description Create the baseline schema (dictionary) for the mtMet+ML model of protein evolution
579 * @returns {Dictionary} model description
580 * @param {String} type
581 */
582function models.protein.mtMetML.ModelDescription(type) {
583    models.protein.mtMetML.ModelDescription.model_definition = models.protein.mtMet.ModelDescription(type);
584    models.protein.mtMetML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
585    models.protein.mtMetML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
586    return models.protein.mtMetML.ModelDescription.model_definition;
587}
588
589
590/**************************************** mtVer functions *************************************/
591
592
593/**
594 * @name models.protein.mtVer.ModelDescription
595 * @description Create the baseline schema (dictionary) for the mtVer model of protein evolution
596 * @returns {Dictionary} model description
597 * @param {String} type
598 */
599 function models.protein.mtVer.ModelDescription(type) {
600    models.protein.mtVer.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
601    models.protein.mtVer.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.mtVer.Rij;
602    models.protein.mtVer.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.mtVer.frequencies";
603    return models.protein.mtVer.ModelDescription.model_definition;
604}
605
606/**
607 * @name models.protein.mtVerF.ModelDescription
608 * @description Create the baseline schema (dictionary) for the mtVer+F model of protein evolution
609 * @returns {Dictionary} model description
610 * @param {String} type
611 */
612function models.protein.mtVerF.ModelDescription(type) {
613    models.protein.mtVerF.ModelDescription.model_definition = models.protein.mtVer.ModelDescription(type);
614    models.protein.mtVerF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
615    models.protein.mtVerF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
616    return models.protein.mtVerF.ModelDescription.model_definition;
617}
618
619
620/**
621 * @name models.protein.mtVerML.ModelDescription
622 * @description Create the baseline schema (dictionary) for the mtVer+ML model of protein evolution
623 * @returns {Dictionary} model description
624 * @param {String} type
625 */
626function models.protein.mtVerML.ModelDescription(type) {
627    models.protein.mtVerML.ModelDescription.model_definition = models.protein.mtVer.ModelDescription(type);
628    models.protein.mtVerML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
629    models.protein.mtVerML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
630    return models.protein.mtVerML.ModelDescription.model_definition;
631}
632
633
634
635/**************************************** gcpREV functions *************************************/
636
637
638/**
639 * @name models.protein.gcpREV.ModelDescription
640 * @description Create the baseline schema (dictionary) for the gcpREV model of protein evolution
641 * @returns {Dictionary} model description
642 * @param {String} type
643 */
644 function models.protein.gcpREV.ModelDescription(type) {
645    models.protein.gcpREV.ModelDescription.model_definition = models.protein.empirical.ModelDescription(type);
646    models.protein.gcpREV.ModelDescription.model_definition [terms.model.empirical_rates] = models.protein.gcpREV.Rij;
647    models.protein.gcpREV.ModelDescription.model_definition [terms.model.frequency_estimator] = "models.protein.gcpREV.frequencies";
648    return models.protein.gcpREV.ModelDescription.model_definition;
649}
650
651/**
652 * @name models.protein.gcpREVF.ModelDescription
653 * @description Create the baseline schema (dictionary) for the gcpREV+F model of protein evolution
654 * @returns {Dictionary} model description
655 * @param {String} type
656 */
657function models.protein.gcpREVF.ModelDescription(type) {
658    models.protein.gcpREVF.ModelDescription.model_definition = models.protein.gcpREV.ModelDescription(type);
659    models.protein.gcpREVF.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.empirical.protein";
660    models.protein.gcpREVF.ModelDescription.model_definition [terms.model.efv_estimate_name] = utility.getGlobalValue("terms.frequencies._20x1");
661    return models.protein.gcpREVF.ModelDescription.model_definition;
662}
663
664
665/**
666 * @name models.protein.gcpREVML.ModelDescription
667 * @description Create the baseline schema (dictionary) for the gcpREV+ML model of protein evolution
668 * @returns {Dictionary} model description
669 * @param {String} type
670 */
671function models.protein.gcpREVML.ModelDescription(type) {
672    models.protein.gcpREVML.ModelDescription.model_definition = models.protein.gcpREV.ModelDescription(type);
673    models.protein.gcpREVML.ModelDescription.model_definition [terms.model.frequency_estimator] = "frequencies.ML.protein";
674    models.protein.gcpREVML.ModelDescription.model_definition [terms.model.efv_estimate_name]   =  utility.getGlobalValue("terms.frequencies.MLE");
675    return models.protein.gcpREVML.ModelDescription.model_definition;
676}
677
678
679
680