content: /*************************************************************************
  *                                                                        *
  *  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.l2expansion;
  
  import com.fasterxml.jackson.annotation.JsonIgnore;
  import com.fasterxml.jackson.annotation.JsonProperty;
  
  import java.io.Serializable;
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * Represents a single predicted reaction from the L2 expansion
   */
  public class L2Prediction implements Serializable {
    private static final long serialVersionUID = -8781964186957158826L;
  
    @JsonProperty("_id")
    private Integer id;
  
    @JsonProperty("substrates")
    private List<L2PredictionChemical> substrates;
  
    // This field corresponds either to the RO id, in the case of an RO expansion, or the name of the characterized group,
    // in the case of a SAR expansion. This field replaced explicit fields that stored the SAR/RO used to generate this
    // prediction. Instead to find that info one must look up the name in the RO or SAR Corpus used in the predictions.
    @JsonProperty("projector_name")
    private String projectorName;
  
    @JsonProperty("products")
    private List<L2PredictionChemical> products;
  
    @JsonProperty("reactions_ro_match")
    private List<Long> reactionsRoMatch;
  
    @JsonProperty("reactions_no_ro_match")
    private List<Long> reactionsNoRoMatch;
  
    // Necessary for JSON reading
    private L2Prediction() {
    }
  
    public L2Prediction(L2Prediction template) {
      this.id = template.id;
  
      this.substrates = new ArrayList<>(template.substrates.size());
      for (L2PredictionChemical substrate : template.substrates) {
        this.substrates.add(new L2PredictionChemical(substrate));
      }
  
      this.projectorName = template.projectorName;
  
      this.products = new ArrayList<>(template.products.size());
      for (L2PredictionChemical product : template.products) {
        this.products.add(new L2PredictionChemical(product));
      }
  
      this.reactionsRoMatch = new ArrayList<Long>(template.reactionsRoMatch);
      this.reactionsNoRoMatch = new ArrayList<Long>(template.reactionsNoRoMatch);
    }
  
    public L2Prediction(Integer id,
                        List<L2PredictionChemical> substrates,
                        String projectorName,
                        List<L2PredictionChemical> products) {
      this.id = id;
      this.substrates = substrates;
      this.products = products;
      this.projectorName = projectorName;
      this.reactionsRoMatch = new ArrayList<Long>();
      this.reactionsNoRoMatch = new ArrayList<Long>();
    }
  
    @JsonIgnore
    public int getReactionCount() {
      return reactionsRoMatch.size() + reactionsNoRoMatch.size();
    }
  
    @JsonIgnore
    public List<String> getSubstrateInchis() {
      List<String> inchis = new ArrayList<>();
      for (L2PredictionChemical chemical : getSubstrates()) {
        inchis.add(chemical.getInchi());
      }
      return inchis;
    }
  
    @JsonIgnore
    public List<Long> getSubstrateIds() {
      List<Long> ids = new ArrayList<>();
      for (L2PredictionChemical chemical : getSubstrates()) {
        if (chemical.hasId()) {
          ids.add(chemical.getId());
        }
      }
      return ids;
    }
  
    @JsonIgnore
    public List<String> getSubstrateNames() {
      List<String> names = new ArrayList<>();
      for (L2PredictionChemical chemical : getSubstrates()) {
        if (chemical.hasName()) {
          names.add(chemical.getName());
        }
      }
      return names;
    }
  
    @JsonIgnore
    public List<String> getProductInchis() {
      List<String> inchis = new ArrayList<>();
      for (L2PredictionChemical chemical : getProducts()) {
        inchis.add(chemical.getInchi());
      }
      return inchis;
    }
  
    @JsonIgnore
    public List<Long> getProductIds() {
      List<Long> ids = new ArrayList<>();
      for (L2PredictionChemical chemical : getProducts()) {
        if (chemical.hasId()) {
          ids.add(chemical.getId());
        }
      }
      return ids;
    }
  
    @JsonIgnore
    public List<String> getProductNames() {
      List<String> names = new ArrayList<>();
      for (L2PredictionChemical chemical : getProducts()) {
        if (chemical.hasName()) {
          names.add(chemical.getName());
        }
      }
      return names;
    }
  
    public Integer getId() {
      return id;
    }
  
    public void setId(Integer id) {
      this.id = id;
    }
  
    public List<L2PredictionChemical> getSubstrates() {
      return substrates;
    }
  
    public void setSubstrates(List<L2PredictionChemical> substrates) {
      this.substrates = substrates;
    }
  
    public List<L2PredictionChemical> getProducts() {
      return products;
    }
  
    public void setProducts(List<L2PredictionChemical> products) {
      this.products = products;
    }
  
    public List<Long> getReactionsRoMatch() {
      return reactionsRoMatch;
    }
  
    public void setReactionsRoMatch(List<Long> reactionsRoMatch) {
      this.reactionsRoMatch = reactionsRoMatch;
    }
  
    public List<Long> getReactionsNoRoMatch() {
      return reactionsNoRoMatch;
    }
  
    public void setReactionsNoRoMatch(List<Long> reactionsNoRoMatch) {
      this.reactionsNoRoMatch = reactionsNoRoMatch;
    }
  
    public String getProjectorName() {
      return projectorName;
    }
  
    public void setProjectorName(String projectorName) {
      this.projectorName = projectorName;
    }
  }
  