const ec_group_t *ec_curve_lookup(ec_curve_t curve) { ec_group_t *grp = NULL; switch (curve) { case ECC_CURVE_E521: default: grp = &ecc_curve_e521; if (0 == ecc_curve_e521_is_init) { /* Set our prime p = 2^521 - 1 */ { ul one; ul_set_ui(one, 1); ul_set_ui(grp->p->n, 0); ul_setbit(521, grp->p->n); ul_sub(grp->p->n, grp->p->n, one); mod_set(grp->p, grp->p->n); } /* Set our c = 1*/ ul_set_ui(grp->c, 1); ul_to_montgomery(grp->c, grp->c, grp->p); /* Set our d = -376014 */ { ul zero; ul_set_ui(zero, 0); ul_to_montgomery(zero, zero, grp->p); ul_set_ui(grp->d, 376014); ul_to_montgomery(grp->d, grp->d, grp->p); ul_modsub(grp->d, zero, grp->d, grp->p); } /* set the generator */ { ul_set_fullui(grp->g->X, 0x75, 0x2cb45c48, 0x648b189d, 0xf90cb229, 0x6b2878a3, 0xbfd9f42f, 0xc6c818ec, 0x8bf3c9c0, 0xc6203913, 0xf6ecc5cc, 0xc72434b1, 0xae949d56, 0x8fc99c60, 0x59d0fb13, 0x364838aa, 0x302a940a, 0x2f19ba6c); ul_to_montgomery(grp->g->X, grp->g->X, grp->p); ul_set_ui(grp->g->Y, 0xc); ul_to_montgomery(grp->g->Y, grp->g->Y, grp->p); ul_set_ui(grp->g->Z, 0x1); ul_to_montgomery(grp->g->Z, grp->g->Z, grp->p); } /* set the group order */ { ul_set_fullui(grp->n, 0x7f, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffd, 0x15b6c647, 0x46fc85f7, 0x36b8af5e, 0x7ec53f04, 0xfbd8c456, 0x9a8f1f45, 0x40ea2435, 0xf5180d6b); } ecc_curve_e521_is_init = 1; } return grp; } }
void MassDecompositionAlgorithm::updateMembers_() { // todo add accessor to tolerance, it is called very often in CID mode Map<char, double> aa_to_weight; set<const Residue *> residues = ResidueDB::getInstance()->getResidues((String)param_.getValue("residue_set")); for (set<const Residue *>::const_iterator it = residues.begin(); it != residues.end(); ++it) { aa_to_weight[(*it)->getOneLetterCode()[0]] = (*it)->getMonoWeight(Residue::Internal); } // now handle the modifications ModificationDefinitionsSet mod_set(param_.getValue("fixed_modifications"), param_.getValue("variable_modifications")); set<ModificationDefinition> fixed_mods = mod_set.getFixedModifications(); for (set<ModificationDefinition>::const_iterator it = fixed_mods.begin(); it != fixed_mods.end(); ++it) { const ResidueModification& mod = it->getModification(); char aa = ' '; if (mod.getOrigin() == 'X') { cerr << "MassDecompositionAlgorithm: Warning: cannot handle modification " << mod.getName() << ", because aa is ambiguous (" << mod.getOrigin() << "), ignoring modification!" << endl; continue; } else { aa = mod.getOrigin(); } if (mod.getMonoMass() != 0) { aa_to_weight[aa] = mod.getMonoMass(); } else { if (mod.getDiffMonoMass() != 0) { aa_to_weight[aa] += mod.getDiffMonoMass(); } else { cerr << "MassDecompositionAlgorithm: Warning: cannot handle modification " << mod.getName() << ", because no monoisotopic mass value was found! Ignoring modification!" << endl; continue; } } } const StringList mod_names(ListUtils::create<String>("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z")); vector<String>::const_iterator actual_mod_name = mod_names.begin(); set<ModificationDefinition> var_mods = mod_set.getVariableModifications(); for (set<ModificationDefinition>::const_iterator it = var_mods.begin(); it != var_mods.end(); ++it) { ResidueModification mod = it->getModification(); //cerr << it->getModification() << " " << mod.getOrigin() << " " << mod.getId() << " " << mod.getFullId() << " " << mod.getUniModAccession() << " " << mod.getPSIMODAccession() << endl; char aa = (*actual_mod_name)[0]; char origin_aa = ' '; ++actual_mod_name; if (mod.getOrigin() == 'X') { cerr << "MassDecompositionAlgorithm: Warning: cannot handle modification " << mod.getName() << ", because aa is ambiguous (" << mod.getOrigin() << "), ignoring modification!" << endl; continue; } else { origin_aa = mod.getOrigin(); } if (mod.getMonoMass() != 0) { aa_to_weight[aa] = mod.getMonoMass(); } else { if (mod.getDiffMonoMass() != 0) { aa_to_weight[aa] = aa_to_weight[origin_aa] + mod.getDiffMonoMass(); } else { cerr << "Warning: cannot handle modification " << mod.getName() << ", because no monoisotopic mass value was found! Ignoring modification!" << endl; continue; } } } if (alphabet_ != nullptr) { delete alphabet_; } if (decomposer_ != nullptr) { delete decomposer_; } // init mass decomposer alphabet_ = new ims::IMSAlphabet(); for (Map<char, double>::ConstIterator it = aa_to_weight.begin(); it != aa_to_weight.end(); ++it) { alphabet_->push_back(String(it->first), it->second); } // initializes weights ims::Weights weights(alphabet_->getMasses(), (double) param_.getValue("decomp_weights_precision")); // optimize alphabet by dividing by gcd weights.divideByGCD(); // decomposes real values decomposer_ = new ims::RealMassDecomposer(weights); return; }
void CompNovoIdentificationBase::updateMembers_() { // init residue mass table String residue_set(param_.getValue("residue_set")); set<const Residue *> residues = ResidueDB::getInstance()->getResidues(residue_set); for (set<const Residue *>::const_iterator it = residues.begin(); it != residues.end(); ++it) { aa_to_weight_[(*it)->getOneLetterCode()[0]] = (*it)->getMonoWeight(Residue::Internal); } max_number_aa_per_decomp_ = param_.getValue("max_number_aa_per_decomp"); tryptic_only_ = param_.getValue("tryptic_only").toBool(); fragment_mass_tolerance_ = (DoubleReal)param_.getValue("fragment_mass_tolerance"); max_number_pivot_ = param_.getValue("max_number_pivot"); decomp_weights_precision_ = (DoubleReal)param_.getValue("decomp_weights_precision"); min_mz_ = (DoubleReal)param_.getValue("min_mz"); max_mz_ = (DoubleReal)param_.getValue("max_mz"); max_decomp_weight_ = (DoubleReal)param_.getValue("max_decomp_weight"); max_subscore_number_ = param_.getValue("max_subscore_number"); max_isotope_ = param_.getValue("max_isotope"); name_to_residue_.clear(); residue_to_name_.clear(); // now handle the modifications ModificationDefinitionsSet mod_set((StringList)param_.getValue("fixed_modifications"), (StringList)param_.getValue("variable_modifications")); set<ModificationDefinition> fixed_mods = mod_set.getFixedModifications(); for (set<ModificationDefinition>::const_iterator it = fixed_mods.begin(); it != fixed_mods.end(); ++it) { ResidueModification mod = ModificationsDB::getInstance()->getModification(it->getModification()); char aa = ' '; if (mod.getOrigin().size() != 1 || mod.getOrigin() == "X") { cerr << "Warning: cannot handle modification " << it->getModification() << ", because aa is ambiguous (" << mod.getOrigin() << "), ignoring modification!" << endl; continue; } else { aa = mod.getOrigin()[0]; } if (mod.getMonoMass() != 0) { aa_to_weight_[aa] = mod.getMonoMass(); } else { if (mod.getDiffMonoMass() != 0) { aa_to_weight_[aa] += mod.getDiffMonoMass(); } else { cerr << "Warning: cannot handle modification " << it->getModification() << ", because no monoisotopic mass value was found! Ignoring modification!" << endl; continue; } } //cerr << "Setting fixed modification " << it->getModification() << " of amino acid '" << aa << "'; weight = " << aa_to_weight_[aa] << endl; const Residue * res = ResidueDB::getInstance()->getModifiedResidue(it->getModification()); name_to_residue_[aa] = res; residue_to_name_[res] = aa; } const StringList mod_names(StringList::create("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z")); vector<String>::const_iterator actual_mod_name = mod_names.begin(); set<ModificationDefinition> var_mods = mod_set.getVariableModifications(); for (set<ModificationDefinition>::const_iterator it = var_mods.begin(); it != var_mods.end(); ++it) { ResidueModification mod = ModificationsDB::getInstance()->getModification(it->getModification()); char aa = (*actual_mod_name)[0]; char origin_aa = ' '; ++actual_mod_name; if (mod.getOrigin().size() != 1 || mod.getOrigin() == "X") { cerr << "CompNovoIdentificationBase: Warning: cannot handle modification " << it->getModification() << ", because aa is ambiguous (" << mod.getOrigin() << "), ignoring modification!" << endl; continue; } else { origin_aa = mod.getOrigin()[0]; } if (mod.getMonoMass() != 0) { aa_to_weight_[aa] = mod.getMonoMass(); } else { if (mod.getDiffMonoMass() != 0) { aa_to_weight_[aa] = aa_to_weight_[origin_aa] + mod.getDiffMonoMass(); } else { cerr << "CompNovoIdentificationBase: Warning: cannot handle modification " << it->getModification() << ", because no monoisotopic mass value was found! Ignoring modification!" << endl; continue; } } //cerr << "Mapping variable modification " << it->getModification() << " to letter '" << aa << "' (@" << origin_aa << "); weight = " << aa_to_weight_[aa] << endl; const Residue * res = ResidueDB::getInstance()->getModifiedResidue(it->getModification()); name_to_residue_[aa] = res; residue_to_name_[res] = aa; } /* cerr << "Following masses are used for identification: " << endl; for (Map<char, DoubleReal>::const_iterator it = aa_to_weight_.begin(); it != aa_to_weight_.end(); ++it) { cerr << it->first << " " << precisionWrapper(it->second) << endl; }*/ initIsotopeDistributions_(); Param decomp_param(mass_decomp_algorithm_.getParameters()); decomp_param.setValue("tolerance", fragment_mass_tolerance_); decomp_param.setValue("fixed_modifications", (StringList)param_.getValue("fixed_modifications")); decomp_param.setValue("variable_modifications", (StringList)param_.getValue("variable_modifications")); mass_decomp_algorithm_.setParameters(decomp_param); min_aa_weight_ = numeric_limits<DoubleReal>::max(); for (Map<char, DoubleReal>::const_iterator it = aa_to_weight_.begin(); it != aa_to_weight_.end(); ++it) { if (min_aa_weight_ > it->second) { min_aa_weight_ = it->second; } } return; }