static private List <FragmentFeatureNode> GetTargetNodes(FragmentFeatureNode primeNode, IEnumerable <FragmentFeatureNode> nodes, bool diffTerminal, bool diffCharge) // if diffCharge is true, diffTerminal is ignored
        {
            var targetNodes = new List <FragmentFeatureNode>();
            //var primeNterm = primeNode.FragmentIonClassBase is IonType.NtermIonType;
            var primeNterm = primeNode.FragmentIonClassBase.IsPrefixIon;    // Modified by Sangtae

            foreach (var node in nodes)
            {
                //Console.WriteLine(node.FragmentIonClassBase);
                if (node.Equals(primeNode))
                {
                    continue;
                }
                if (diffCharge)
                {
                    if (node.FragmentIonClassBase.Charge != primeNode.FragmentIonClassBase.Charge)
                    {
                        targetNodes.Add(node);
                    }
                }
                else
                {
                    if (node.FragmentIonClassBase.Charge != primeNode.FragmentIonClassBase.Charge)
                    {
                        continue;
                    }
                    if (diffTerminal && primeNterm || !diffTerminal && !primeNterm)
                    {
                        if (!node.FragmentIonClassBase.IsPrefixIon)
                        {
                            targetNodes.Add(node);
                        }
                    }
                    else
                    {
                        if (node.FragmentIonClassBase.IsPrefixIon)
                        {
                            targetNodes.Add(node);
                        }
                    }
                }
            }
            return(targetNodes);
        }
        private List <FragmentFeatureNode> GetFragmentNodes(ImsDataCached imsData, Feature precursorFeature, Composition cutComposition, Ion precursorIon, GroupParameter parameter)
        {
            var ionTypes = _scoringParams.GetIonTypes(parameter);

            var nodes             = new List <FragmentFeatureNode>();
            var suffixComposition = precursorIon.Composition - Composition.H2O - cutComposition;

            //Console.WriteLine(cutComposition.GetMass() + " " + suffixComposition.GetMass());

            foreach (var ionType in ionTypes)
            {
                var composition = ionType.IsPrefixIon ? cutComposition : suffixComposition;
                //Console.WriteLine("FragFeatureGraph\t" + ionType.Name + "\t" + composition.GetMass() + "\t" + ionType.GetIon(composition).GetMonoIsotopicMz());
                var node = new FragmentFeatureNode(IsotopomerFeatures.GetFramentIsotopomerFeatures(imsData, composition, ionType, precursorFeature), ionType, precursorFeature, parameter, _scoringParams);
                //if(node.Feature != null)
                //    if (20 * node.Feature.IntensityMax < precursorFeature.IntensityMax || node.Feature.IntensityMax > 20 * precursorFeature.IntensityMax) continue; //

                nodes.Add(node);
            }
            return(nodes);
        }