public List <FeatureItemGroup> ReadFromFile(string fileName) { Console.WriteLine("read file {0} ...", fileName); var result = new List <FeatureItemGroup>(); XElement root = XElement.Load(fileName); //Console.WriteLine("read locations ..."); Dictionary <string, SAMAlignedLocation> qmmap = root.ToSAMAlignedItems().ToSAMAlignedLocationMap(); //Console.WriteLine("read mapped items ..."); foreach (XElement groupEle in root.Element("subjectResult").Elements("subjectGroup")) { var group = new FeatureItemGroup(); result.Add(group); foreach (XElement featureEle in groupEle.Elements("subject")) { var item = new FeatureItem(); group.Add(item); item.Name = featureEle.Attribute("name").Value; foreach (XElement locEle in featureEle.Elements("region")) { var fl = new FeatureLocation(); item.Locations.Add(fl); fl.Name = item.Name; fl.ParseLocation(locEle); if (locEle.Attribute("sequence") != null) { fl.Sequence = locEle.Attribute("sequence").Value; } if (locEle.Attribute("query_count_before_filter") != null) { fl.QueryCountBeforeFilter = int.Parse(locEle.Attribute("query_count_before_filter").Value); } if (locEle.Attribute("pvalue") != null) { fl.PValue = double.Parse(locEle.Attribute("pvalue").Value); } foreach (XElement queryEle in locEle.Elements("query")) { string qname = queryEle.Attribute("qname").Value; string loc = queryEle.Attribute("loc").Value; string key = SAMAlignedLocation.GetKey(qname, loc); SAMAlignedLocation query = qmmap[key]; FeatureSamLocation fsl = new FeatureSamLocation(fl); fsl.SamLocation = query; var attr = queryEle.FindAttribute("overlap"); if (attr == null) { fsl.OverlapPercentage = query.OverlapPercentage(fl); } else { fsl.OverlapPercentage = double.Parse(attr.Value); } var nnpm = queryEle.FindAttribute("nnpm"); if (nnpm == null) { nnpm = queryEle.FindAttribute("nnmp"); } if (nnpm != null) { fsl.NumberOfNoPenaltyMutation = int.Parse(nnpm.Value); } var nmi = queryEle.FindAttribute("nmi"); if (nmi != null) { fsl.NumberOfMismatch = int.Parse(nmi.Value); } } } } } qmmap.Clear(); return(result); }
public virtual List <FeatureItemGroup> ReadFromFile(string fileName) { var result = new List <FeatureItemGroup>(); using (XmlReader source = XmlReader.Create(fileName)) { Progress.SetMessage("reading queries ..."); List <SAMAlignedItem> queries = SAMAlignedItemUtils.ReadFrom(source); Progress.SetMessage("{0} queries read.", queries.Count); var qmmap = queries.ToSAMAlignedLocationMap(); queries.Clear(); Progress.SetMessage("reading subjects ..."); string value; source.ReadToFollowing("subjectResult"); if (source.ReadToDescendant("subjectGroup")) { do { var featureGroup = new FeatureItemGroup(); result.Add(featureGroup); if (source.ReadToDescendant("subject")) { do { var item = new FeatureItem(); featureGroup.Add(item); item.Name = source.GetAttribute("name"); if (source.ReadToDescendant("region")) { do { var fl = new FeatureLocation(); item.Locations.Add(fl); fl.Name = item.Name; fl.Seqname = source.GetAttribute("seqname"); fl.Start = long.Parse(source.GetAttribute("start")); fl.End = long.Parse(source.GetAttribute("end")); fl.Strand = source.GetAttribute("strand")[0]; fl.Sequence = source.GetAttribute("sequence"); value = source.GetAttribute("query_count_before_filter"); if (value != null) { fl.QueryCountBeforeFilter = int.Parse(value); } value = source.GetAttribute("pvalue"); if (value != null) { fl.PValue = double.Parse(value); } if (source.ReadToDescendant("query")) { do { string qname = source.GetAttribute("qname"); string loc = source.GetAttribute("loc"); string key = SAMAlignedLocation.GetKey(qname, loc); SAMAlignedLocation query = qmmap[key]; FeatureSamLocation fsl = new FeatureSamLocation(fl); fsl.SamLocation = query; fsl.Offset = int.Parse(source.GetAttribute("offset")); var attr = source.GetAttribute("overlap"); if (attr == null) { fsl.OverlapPercentage = query.OverlapPercentage(fl); } else { fsl.OverlapPercentage = double.Parse(attr); } var nmi = source.GetAttribute("nmi"); if (nmi != null) { fsl.NumberOfMismatch = int.Parse(nmi); } var nnpm = source.GetAttribute("nnpm"); if (nnpm != null) { fsl.NumberOfNoPenaltyMutation = int.Parse(nnpm); } } while (source.ReadToNextSibling("query")); } } while (source.ReadToNextSibling("region")); } } while (source.ReadToNextSibling("subject")); } } while (source.ReadToNextSibling("subjectGroup")); } qmmap.Clear(); } Progress.SetMessage("{0} subjects read.", result.Count); return(result); }
public override bool AcceptLocus(SAMAlignedLocation loc) { var result = false; if (!loc.Seqname.Equals(lastSeqname)) { if (!featureMap.TryGetValue(loc.Seqname, out lastFeatures)) { return false; } lastSeqname = loc.Seqname; } foreach (var feature in lastFeatures) { if (feature.End < loc.Start) { continue; } if (feature.Start > loc.End) { break; } if (feature.Overlap(loc, this.minOverlapPercentage)) { result = true; var samloc = new FeatureSamLocation(feature); samloc.SamLocation = loc; feature.SamLocations.Add(samloc); } } return result; }