/************************************************************************* * * * This file is part of the 20n/act project. * * 20n/act enables DNA prediction for synthetic biology/bioengineering. * * Copyright (C) 2017 20n Labs, Inc. * * * * Please direct all queries to act@20n.com. * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * * * *************************************************************************/ package com.act.biointerpretation.cofactorremoval; import act.shared.Chemical; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.json.JSONArray; import org.json.JSONObject; import java.io.IOException; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; /** * This class finds for cofactor-like components within a fake inchi. * Created by jca20n on 11/12/1. */ public class FakeCofactorFinder { private static final Logger LOGGER = LogManager.getFormatterLogger(FakeCofactorFinder.class); private Map<String, String> fakeCofactorToRealCofactorName; public FakeCofactorFinder() { try { FakeCofactorCorpus corpus = new FakeCofactorCorpus(); corpus.loadCorpus(); fakeCofactorToRealCofactorName = corpus.getFakeCofactorNameToRealCofactorName(); } catch (IOException e) { LOGGER.error(String.format("Error hydrating the fake cofactor corpus. Error: %s", e.getMessage())); fakeCofactorToRealCofactorName = new LinkedHashMap<>(); } } /** * This function scans a fake inchi chemical and detects if it has a cofactor in it. * @param chemical - The chemical being analyzed * @return - The cofactor present within the chemical. */ public String scanAndReturnCofactorNameIfItExists(Chemical chemical) { Set<String> names = new HashSet<>(); names.addAll(chemical.getBrendaNames()); names.addAll(chemical.getSynonyms()); names.addAll(chemical.getPubchemNames().keySet()); names.addAll(chemical.getPubchemNameTypes()); names.addAll(chemical.getKeywords()); names.addAll(chemical.getCaseInsensitiveKeywords()); JSONObject metacycData = chemical.getRef(Chemical.REFS.METACYC); if (metacycData != null) { JSONArray meta = metacycData.getJSONArray("meta"); JSONObject firstMetaObject = meta.getJSONObject(0); JSONArray metaNames = firstMetaObject.getJSONArray("names"); for (int i = 0; i < metaNames.length(); i++) { String chemicalName = metaNames.getString(i); names.add(chemicalName); } } LOGGER.debug(String.format("The size of fakeCofactorToRealCofactorName is %d and the size of name is %d", fakeCofactorToRealCofactorName.size(), names.size())); for (String name : names) { if (fakeCofactorToRealCofactorName.containsKey(name)) { return fakeCofactorToRealCofactorName.get(name); } } return null; } }