public GlycanComposition(GlycanComposition other)
        {
            //Components are not reference types, and so they will be copied by value
            this.ElementalComposition = new Dictionary<string, int>(other.ElementalComposition);
            this.MolecularComposition = new Dictionary<string, int>(other.MolecularComposition);

            this.MassWeight = other.MassWeight;
            this.AdductAmount = other.AdductAmount;
            this.AdductReplaces = other.AdductReplaces;
            this.Annotation = other.Annotation;
        }
 /// <summary>
 /// Incorporate the components of a GlycanComposition object into
 /// this glycopeptide.
 /// </summary>
 /// <param name="glycanComposition"></param>
 public void AttachGlycan(GlycanComposition glycanComposition)
 {
     this.MassWeight += glycanComposition.MassWeight - WaterMass - glycanComposition.AdductMass;
     this.GlycosylationCount++;
     foreach (KeyValuePair<string, int> kvp in glycanComposition.ElementalComposition)
     {
         if (!ElementalComposition.ContainsKey(kvp.Key))
         {
             ElementalComposition[kvp.Key] = kvp.Value;
         }
         else
         {
             ElementalComposition[kvp.Key] += kvp.Value;
         }
     }
     foreach (KeyValuePair<string, int> kvp in glycanComposition.MolecularComposition)
     {
         if (!MolecularComposition.ContainsKey(kvp.Key))
         {
             MolecularComposition[kvp.Key] = kvp.Value;
         }
         else
         {
             MolecularComposition[kvp.Key] += kvp.Value;
         }
     }
     if (MolecularComposition.ContainsKey("Water"))
     {
         MolecularComposition["Water"] -= 1;
     }
     else
     {
         Console.WriteLine(JsonConvert.SerializeObject(this));
         throw new Exception("No water found to remove!");
     }
     if (ElementalComposition.ContainsKey("O"))
     {
         ElementalComposition["O"] -= 1;
         ElementalComposition["H"] -= 2;
     }
     //Adduct information is a singleton despite there being multiple glycans per peptide.
     //Is this actually correct chemically?
     this.AdductReplaces = glycanComposition.AdductReplaces;
     this.AdductAmount = glycanComposition.AdductAmount;
 }
        /// <summary>
        /// Combination Cosntructor
        /// </summary>
        /// <param name="glycanComposition"></param>
        /// <param name="peptide"></param>
        public GlycopeptideComposition(GlycanComposition glycanComposition, MSDigestPeptide peptide)
            : base(glycanComposition)
        {
            this.PeptideSequence = peptide.Sequence;
            this.PeptideModification = peptide.Modifications;
            this.StartAA = peptide.StartAA;
            this.EndAA = peptide.EndAA;
            this.GlycosylationCount = peptide.NumGlycosylations;
            this.MassWeight += peptide.Mass - WaterMass - glycanComposition.AdductMass;
            MolecularComposition["Water"] -= 1;
            if (ElementalComposition.ContainsKey("O"))
            {
                ElementalComposition["O"] -= 1;
                ElementalComposition["H"] -= 2;
            }
            this.ProteinID = peptide.ProteinID;

            AdductAmount = 0;
            AdductReplaces = "";
        }