Ejemplo n.º 1
0
        //TODO: This needs to be a method
        //private StreamReader PolygeneticWeights {


        public void changePoly(Haplogroup hg, Polymorphism polyOld, Polymorphism polyNew)
        {
            var e = getPolysOfHg(hg);

            foreach (XmlNode ce in e)
            {
                if (ce.InnerText.Equals(polyOld.ToString()))
                {
                    ce.InnerText = polyNew.ToString();
                    return;
                }
            }
            throw new HaploGrepException("Polymorphism does not exit");
        }
Ejemplo n.º 2
0
 public void AddPoly(Polymorphism p)
 {
     History.Add(p);
     //This is a very backward way of representing this, as far as I can tell from the source code
     //if 152C on the tree is followed by 152C!, then this means the 152C mutation should simply be cleared
     if (p.isBackMutation)
     {
         //make sure we have one to remove
         var toDrop = CurrentState.Where(x => x.position == p.position && x.mutation == p.mutation).ToList();
         if (toDrop.Count != 1)
         {
             throw new HaploGrepException("Cannot back mutate when no mutation appeared!");
         }
         CurrentState.Remove(toDrop [0]);
     }
     else
     {
         var c1Count = CurrentState.Count == 1;
         var c1SNP   = MutationAssigner.MutationIsBasePair(CurrentState [0].mutation);
         //simple SNP replacement
         if (c1Count && c1SNP)
         {
             CurrentState.Clear();
             CurrentState.Add(p);
         }
         //insertions are appended on, and once any deletion happens we are shit out of luck
         else if (p.mutation == Mutations.INS && c1SNP && c1Count)
         {
             CurrentState.Add(p);
         }
         else if (p.mutation == Mutations.INS)
         {
             //Some spot have repeated inserts of the same base, e.g.
             if (CurrentState.Any(z => z.mutation != Mutations.INS) || CurrentState.Any(z => z.InsertedPolys.Length > 1))
             {
                 throw new HaploGrepException("Can't add insertions over multiple complex backgrounds");
             }
             else
             {
                 //TODO: 455.1T and 455.2T are simply indicative of a two bp insertion (at the 1 position and the 2 position, this is totally confusiing).
                 //Verify that all insertions are the same, this happens in some cases such as 455.1T being followed by a 455.2T, note I know realize this
                 var set = new HashSet <string> (CurrentState.Select(x => x.insertedPolys));
                 set.Add(p.insertedPolys);
                 if (set.Count > 1)
                 {
                     throw new Exception("Cannot add a new type of insertion");
                 }
                 CurrentState.Add(p);
             }
         }
         //Special exception for 1719.1G followed by 1719A, which is another odd case
         else if (p.position == 1719 && p.ToString() == "1719A")
         {
             if (CurrentState.Count != 1 || CurrentState [0].ToString() != "1719.1G")
             {
                 throw new HaploGrepException("1719 posiiton exception");
             }
             CurrentState.Add(p);
             CurrentState.Reverse();
         }
         //this can happen if the base of interest is not the reference or last mutation.
         else
         {
             if (!UnresolvedSeriesOfChanges.Contains(History))
             {
                 UnresolvedSeriesOfChanges.Add(History);
             }
             throw new HaploGrepException("Tried to change a polymorphism at a location where a mutation already occurred without it being asimple thing!");
         }
     }
 }