package com.compomics.util.experiment.biology.ions;
import com.compomics.util.experiment.biology.AminoAcid;
import com.compomics.util.experiment.biology.AtomChain;
import com.compomics.util.experiment.biology.Ion;
import com.compomics.util.experiment.biology.NeutralLoss;
import com.compomics.util.pride.CvTerm;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Represents a related ion, i.e., an ion that is related to a given amino acid,
* and is its own factory.
*
* @author Harald Barsnes
* @author Marc Vaudel
*/
public class RelatedIon extends Ion {
/**
* Serial number for backward compatibility.
*/
static final long serialVersionUID = -4605345486425465764L;
/**
* Subtype counter.
*/
private static int subTypeCounter = 0;
/**
* Map of the implemented related ions.
*/
private static HashMap<Character, ArrayList<RelatedIon>> implementedIons = new HashMap<Character, ArrayList<RelatedIon>>();
/**
* Related ion for R. Cyanamid and ammonia loss from immonium ion (C4H7N).
*/
public final static RelatedIon RELATED_R_1 = new RelatedIon(AminoAcid.R, AtomChain.getAtomChain("C(4)H(7)N"), subTypeCounter++);
/**
* Related ion for R. Cyanamid loss from immonium ion (C4H10N2).
*/
public final static RelatedIon RELATED_R_2 = new RelatedIon(AminoAcid.R, AtomChain.getAtomChain("C(4)H(10)N(2)"), subTypeCounter++);
/**
* Related ion for R. Ammonia loss from immonium ion (C5H9N3).
*/
public final static RelatedIon RELATED_R_3 = new RelatedIon(AminoAcid.R, AtomChain.getAtomChain("C(5)H(9)N(3)"), subTypeCounter++);
/**
* Related ion for R (C5H10N2O).
*/
public final static RelatedIon RELATED_R_4 = new RelatedIon(AminoAcid.R, AtomChain.getAtomChain("C(5)H(10)N(2)O"), subTypeCounter++);
/**
* Related ion for N. Ammonia loss from immonium ion (C3H3NO).
*/
public final static RelatedIon RELATED_N_1 = new RelatedIon(AminoAcid.N, AtomChain.getAtomChain("C(3)H(3)NO"), subTypeCounter++);
/**
* Related ion for D. water loss from immonium ion (C3H3NO).
*/
public final static RelatedIon RELATED_D_1 = new RelatedIon(AminoAcid.D, AtomChain.getAtomChain("C(3)H(3)NO"), subTypeCounter++);
/**
* Related ion for C. Carbamidomethylated immonium ion (C4H8N2SO).
*/
public final static RelatedIon RELATED_C_1 = new RelatedIon(AminoAcid.C, AtomChain.getAtomChain("C(4)H(8)N(2)SO"), subTypeCounter++);
/**
* Related ion for C. Carbamidomethylated and ammonia loss from immonium ion
* (C4H5NSO).
*/
public final static RelatedIon RELATED_C_2 = new RelatedIon(AminoAcid.C, AtomChain.getAtomChain("C(4)H(5)NSO"), subTypeCounter++);
/**
* Related ion for E. Water loss from immonium ion (C4H5NO).
*/
public final static RelatedIon RELATED_E_1 = new RelatedIon(AminoAcid.E, AtomChain.getAtomChain("C(4)H(5)NO"), subTypeCounter++);
/**
* Related ion for Q. Ammonia loss from immonium ion (C4H5NO).
*/
public final static RelatedIon RELATED_Q_1 = new RelatedIon(AminoAcid.Q, AtomChain.getAtomChain("C(4)H(5)NO"), subTypeCounter++);
/**
* Related ion for Q. Internal b-ion (C5H8N2O2).
*/
public final static RelatedIon RELATED_Q_2 = new RelatedIon(AminoAcid.Q, AtomChain.getAtomChain("C(5)H(8)N(2)O(2)"), subTypeCounter++);
/**
* Related ion for H (C4H5N2).
*/
public final static RelatedIon RELATED_H_1 = new RelatedIon(AminoAcid.H, AtomChain.getAtomChain("C(4)H(5)N(2)"), subTypeCounter++);
/**
* Related ion for H. Internal b-ion (C6H7N3O).
*/
public final static RelatedIon RELATED_H_2 = new RelatedIon(AminoAcid.H, AtomChain.getAtomChain("C(6)H(7)N(3)O"), subTypeCounter++);
/**
* Related ion for K. Ammonia loss from immonium ion (C5H9N).
*/
public final static RelatedIon RELATED_K_1 = new RelatedIon(AminoAcid.K, AtomChain.getAtomChain("C(5)H(9)N"), subTypeCounter++);
/**
* Related ion for K. Ammonia loss from internal b-ion (C6H9NO).
*/
public final static RelatedIon RELATED_K_2 = new RelatedIon(AminoAcid.K, AtomChain.getAtomChain("C(6)H(9)NO"), subTypeCounter++);
/**
* Related ion for K. Internal b-ion (C6H12N2O).
*/
public final static RelatedIon RELATED_K_3 = new RelatedIon(AminoAcid.K, AtomChain.getAtomChain("C(6)H(12)N(2)O"), subTypeCounter++);
/**
* Related ion for M (C2H4S).
*/
public final static RelatedIon RELATED_M_1 = new RelatedIon(AminoAcid.M, AtomChain.getAtomChain("C(2)H(4)S"), subTypeCounter++);
/**
* Related ion for F. Tropylium ion (C7H6).
*/
public final static RelatedIon RELATED_F_1 = new RelatedIon(AminoAcid.F, AtomChain.getAtomChain("C(7)H(6)"), subTypeCounter++);
/**
* Related ion for W (C9H7N).
*/
public final static RelatedIon RELATED_W_1 = new RelatedIon(AminoAcid.W, AtomChain.getAtomChain("C(9)H(7)N"), subTypeCounter++);
/**
* Related ion for Y (C7H7O).
*/
public final static RelatedIon RELATED_Y_1 = new RelatedIon(AminoAcid.Y, AtomChain.getAtomChain("C(7)H(7)O"), subTypeCounter);
/**
* The amino acid target.
*/
private AminoAcid aminoAcidTarget;
/**
* The sub type.
*/
private int subType;
/**
* Constructor for a related ion.
*
* @param aminoAcidTarget the amino acid target
* @param atomChain the atomic composition of this ion
* @param subType the ion subtype
*/
public RelatedIon(AminoAcid aminoAcidTarget, AtomChain atomChain, int subType) {
this(aminoAcidTarget, atomChain, subType, true);
}
/**
* Constructor for a related ion.
*
* @param aminoAcidTarget the amino acid target
* @param atomChain the atomic composition of this ion
* @param subType the ion subtype
* @param save if true the related ion will be saved in the static map for
* later reuse
*/
public RelatedIon(AminoAcid aminoAcidTarget, AtomChain atomChain, int subType, boolean save) {
type = IonType.RELATED_ION;
this.aminoAcidTarget = aminoAcidTarget;
this.atomChain = atomChain;
this.subType = subType;
if (save) {
Character aminoAcidChar = aminoAcidTarget.getSingleLetterCodeAsChar();
ArrayList<RelatedIon> relatedIons = implementedIons.get(aminoAcidChar);
if (relatedIons == null) {
relatedIons = new ArrayList<RelatedIon>(1);
implementedIons.put(aminoAcidTarget.getSingleLetterCodeAsChar(), relatedIons);
}
relatedIons.add(this);
}
}
/**
* Returns the list of related ions for the given amino acid.
*
* @param aminoAcidTarget the amino acid target
* @return the list of related ions for the given amino acid
*/
public static ArrayList<RelatedIon> getRelatedIons(AminoAcid aminoAcidTarget) {
ArrayList<RelatedIon> relatedIons = implementedIons.get(aminoAcidTarget.getSingleLetterCodeAsChar());
if (relatedIons == null) {
relatedIons = new ArrayList<RelatedIon>(1);
}
return relatedIons;
}
@Override
public String getName() {
return "r" + aminoAcidTarget.singleLetterCode;
}
@Override
public CvTerm getPrideCvTerm() {
// @TODO: implement when the required cv terms are available
// return new CvTerm("PSI-MS", "MS:100????", "frag: related ion", null);
return null;
}
@Override
public CvTerm getPsiMsCvTerm() {
// @TODO: implement when the required cv terms are available
// return new CvTerm("PSI-MS", "MS:100????", "frag: related ion", null);
return null;
}
/**
* Compares the current related ion with another one based on their
* composition.
*
* @param anotherRelatedIon the other related ion
* @return a boolean indicating whether compositions are equal
*/
public boolean isSameAs(RelatedIon anotherRelatedIon) {
return atomChain.isSameCompositionAs(anotherRelatedIon.getAtomicComposition());
}
@Override
public int getSubType() {
return subType;
}
@Override
public String getSubTypeAsString() {
return "r" + subType;
}
/**
* Returns an arraylist of possible subtypes.
*
* @return an arraylist of possible subtypes
*/
public static ArrayList<Integer> getPossibleSubtypes() {
ArrayList<Integer> possibleTypes = new ArrayList<Integer>();
for (int i = 0; i < subTypeCounter; i++) {
possibleTypes.add(i);
}
return possibleTypes;
}
@Override
public ArrayList<NeutralLoss> getNeutralLosses() {
return new ArrayList<NeutralLoss>(0);
}
@Override
public boolean isSameAs(Ion anotherIon) {
if (anotherIon instanceof RelatedIon) {
RelatedIon otherIon = (RelatedIon) anotherIon;
return isSameAs(otherIon);
}
return false;
}
}