/*************************************************************************
* *
* 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 act.installer.sequence;
import act.shared.Reaction;
import act.shared.helpers.MongoDBToJSON;
import act.shared.sar.SAR;
import com.mongodb.DBObject;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MetacycEntry extends SequenceEntry {
JSONObject data;
public static SequenceEntry initFromMetacycEntry(String sequence, Long org_id, String standardName, String ecnumber, Set<String> comments, Set<JSONObject> metacyc_refs, long rxnid, Reaction rxn, String activation_inhibition, String direction) {
return new MetacycEntry(sequence, org_id, standardName, ecnumber, comments, metacyc_refs, rxnid, rxn, activation_inhibition, direction);
}
public MetacycEntry(String sequence, Long org_id, String standardName, String ec, Set<String> comments, Set<JSONObject> metacyc_refs, long rxnid, Reaction rxn, String activation_inhibition, String direction) {
this.sequence = sequence;
this.org_id = org_id;
this.refs = new ArrayList<>(metacyc_refs);
this.ec = ec;
this.accessions = new HashSet<String>();
// inits this.catalyzed_{rxns, substrates, products}
extract_catalyzed_reactions(rxnid, rxn);
// new Seq(..) looks at the metadata in this.data for SwissProt fields:
// this.data { "name" : gene_name_eg_Adh1 }
// this.data { "proteinExistence": { "type" : "evidence at transcript level" });
// this.data { "comment": [ { "type": "catalytic activity", "text": uniprot_activity_annotation } ] }
// this.data { "accession" : ["Q23412", "P87D78"] }
// we manually add these fields so that we have consistent data
this.data = new JSONObject();
this.data.put("name", standardName);
this.data.put("proteinExistence", new JSONObject());
this.data.put("comment", new JSONArray());
this.data.put("accession", new JSONObject());
// extract_metadata processes this.data, so do that only after updating
// this.data with the proxy fields from above.
this.metadata = extract_metadata();
}
private void extract_catalyzed_reactions(long rxnid, Reaction rxn) {
this.sar = new SAR();
this.catalyzed_rxns = new HashSet<Long>();
this.catalyzed_rxns_to_substrates = new HashMap<Long, Set<Long>>();
this.catalyzed_rxns_to_products = new HashMap<Long, Set<Long>>();
this.catalyzed_substrates_uniform = new HashSet<Long>();
this.catalyzed_substrates_diverse = new HashSet<Long>();
this.catalyzed_products_uniform = new HashSet<Long>();
this.catalyzed_products_diverse = new HashSet<Long>();
Set<Long> rxn2substrates = new HashSet(Arrays.asList(rxn.getSubstrates()));
Set<Long> rxn2products = new HashSet(Arrays.asList(rxn.getProducts()));
this.catalyzed_rxns.add(rxnid);
this.catalyzed_rxns_to_substrates.put(rxnid, rxn2substrates);
this.catalyzed_rxns_to_products.put(rxnid, rxn2products);
// we add all to the diverse set...
this.catalyzed_substrates_diverse.addAll(rxn2substrates);
this.catalyzed_products_diverse.addAll(rxn2products);
// we do not add anything to the uniform set...
// TODO... later, move the cofactors to the uniform set,
// only leave the non-cofactors in the diverse set
}
private DBObject extract_metadata() {
// cannot directly return this.data coz in Seq.java
// we expect certain specific JSON format fields
return MongoDBToJSON.conv(this.data);
}
DBObject metadata;
Set<String> accessions;
List<JSONObject> refs;
String sequence;
Long org_id;
String ec;
Set<Long> catalyzed_rxns;
Set<Long> catalyzed_substrates_diverse, catalyzed_substrates_uniform;
Set<Long> catalyzed_products_diverse, catalyzed_products_uniform;
HashMap<Long, Set<Long>> catalyzed_rxns_to_substrates, catalyzed_rxns_to_products;
SAR sar;
DBObject getMetadata() { return this.metadata; }
Set<String> getAccessions() { return this.accessions; }
List<JSONObject> getRefs() { return this.refs; }
Long getOrgId() { return this.org_id; }
String getSeq() { return this.sequence; }
String getEc() { return this.ec; }
Set<Long> getCatalyzedRxns() { return this.catalyzed_rxns; }
Set<Long> getCatalyzedSubstratesUniform() { return this.catalyzed_substrates_uniform; }
Set<Long> getCatalyzedSubstratesDiverse() { return this.catalyzed_substrates_diverse; }
Set<Long> getCatalyzedProductsUniform() { return this.catalyzed_products_uniform; }
Set<Long> getCatalyzedProductsDiverse() { return this.catalyzed_products_diverse; }
HashMap<Long, Set<Long>> getCatalyzedRxnsToSubstrates() { return this.catalyzed_rxns_to_substrates; }
HashMap<Long, Set<Long>> getCatalyzedRxnsToProducts() { return this.catalyzed_rxns_to_products; }
SAR getSar() { return this.sar; }
@Override
public String toString() {
return this.data.toString(2); // format it with 2 spaces
}
}