Exemple #1
0
        static void Main(string[] args)
        {
            var parameters = new string[, ]
            {
                { "[pdb_or_atoms_file]", "input structure for sequence" },
                { "[fasta_file]", "input sequence for structure" },
                { "[[output_file]]", "optional output file" },
            };

            var maxParamLength = parameters.Cast <string>().Where((a, i) => i % 2 == 0).Max(a => a.Length);
            var exeFilename    = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName);

            if (args.Length < 1)
            {
                Console.WriteLine(exeFilename + @" is a program to calculate offset between the sequence and structure.");
                Console.WriteLine();
                Console.WriteLine(@"Usage:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" " + String.Join(" ", parameters.Cast <string>().Where((a, i) => i % 2 == 0)), maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Example:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" ""c:\pdb_db\atoms\atoms1a12.pdb"" ""c:\pdb_db\fasta\atoms1a12.fasta""", maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Arguments:");
                for (var i = 0; i < parameters.GetLength(0); i++)
                {
                    Console.WriteLine(@" " + parameters[i, 0].PadLeft(maxParamLength, ' ') + " " + ProteinBioClass.WrapConsoleText(parameters[i, 1], maxParamLength + 2, 1, false));
                }
                Console.WriteLine();

                return;
            }

            // load arguments
            var p             = 0;
            var atomsFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            atomsFilename = atomsFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + atomsFilename);

            p++;
            var inputFastaFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            inputFastaFilename = inputFastaFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + inputFastaFilename);

            p++;
            var outputDataFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            outputDataFilename = outputDataFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + outputDataFilename);

            Console.WriteLine();

            var struct_seq = ProteinBioinformaticsSharedLibrary.ProteinBioClass.StructureFileToAaSequence(atomsFilename, null,
                                                                                                          false);


            //foreach (var s in struct_seq)
            //Console.WriteLine(s);

            //var fasta = File.ReadAllLines(inputFastaFilename);
            //foreach (var line in fasta)
            //{
            //    if (string.IsNullOrWhiteSpace(line))continue;
            //    if (line[0] == '>')
            //    {
            //        if (line.Contains())
            //    }

            //}

            /// not finished!
        }
        static void Main(string[] args)
        {
            var parameters = new string[, ]
            {
                { "[pdb_file]", "PDB ~v3.3 Protein Data Bank format file [*.pdb, *.ent]" },
                { "[interface-interface_file]", "interface-interface file" },
                { "[[chain_ids]]", "molecule chains to output [* for all]" },
                { "[[output_file]]", "optional output file. use ? for chain id. when ommitted, output to console" },
            };

            var maxParamLength = parameters.Cast <string>().Where((a, i) => i % 2 == 0).Max(a => a.Length);
            var exeFilename    = Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            if (args.Length == 0)
            {
                Console.WriteLine(exeFilename + @" is a program to extract ATOM records from a PDB file.");
                Console.WriteLine();
                Console.WriteLine(@"Usage:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" " + String.Join(" ", parameters.Cast <string>().Where((a, i) => i % 2 == 0)), maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Example:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" ""c:\pdb_db\pdb1a12.pdb"" 8.0 ""c:\pdb_atoms\atoms1a12.pdb""", maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Arguments:");
                for (var i = 0; i < parameters.GetLength(0); i++)
                {
                    Console.WriteLine(@" " + parameters[i, 0].PadLeft(maxParamLength, ' ') + " " + ProteinBioClass.WrapConsoleText(parameters[i, 1], maxParamLength + 2, 1, false));
                }
                Console.WriteLine();
                return;
            }

            // load and echo arguments
            var p           = 0;
            var pdbFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            pdbFilename = pdbFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + pdbFilename);

            p++;
            var interfaceInterfaceFile = args.Length > p && args[p].Length > 0 ? args[p].ToUpperInvariant() : "";

            interfaceInterfaceFile = interfaceInterfaceFile.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + interfaceInterfaceFile);

            p++;
            var chainIds = args.Length > p && args[p].Length > 0 ? args[p] : "";

            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + chainIds);

            p++;
            var outputFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            outputFilename = outputFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + outputFilename);

            Console.WriteLine();

            if (!File.Exists(pdbFilename))
            {
                Console.WriteLine("; File not found: " + pdbFilename);
                return;
            }

            if (!File.Exists(interfaceInterfaceFile))
            {
                Console.WriteLine("; File not found: " + interfaceInterfaceFile);
                return;
            }

            if (string.IsNullOrWhiteSpace(pdbFilename))
            {
                return;
            }

            if (chainIds.Contains('*'))
            {
                chainIds = null;
            }

            var chainIdWhiteList = !string.IsNullOrEmpty(chainIds) ? chainIds.ToUpperInvariant().Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries) : null;

            var interfaceData = ComplexInterfaces.ComplexInterfaces.InterfaceInterfaceData.Load(interfaceInterfaceFile);

            var terminatedChains = new List <string>();

            var pdbfilenameShort = Path.GetFileNameWithoutExtension(pdbFilename);

            var pdbId = pdbfilenameShort.Substring(pdbfilenameShort.Length - 4).ToUpperInvariant();

            var lines = File.ReadAllLines(pdbFilename);

            var result = new List <Tuple <string, string> >();

            var interfaceDataChains = interfaceData.Select(a => a.ReceptorChainId).Distinct().ToList();

            var interfaceDataStart = interfaceDataChains.Select(a => interfaceData.Where(b => b.ReceptorChainId == a).Min(b => b.ReceptorInterfaceResSeqStart)).ToList();
            var interfaceDataEnd   = interfaceDataChains.Select(a => interfaceData.Where(b => b.ReceptorChainId == a).Max(b => b.ReceptorInterfaceResSeqEnd)).ToList();


            foreach (var line in lines)
            {
                if (line.Length < 22)
                {
                    continue;
                }

                if (line.Substring(0, 4).ToUpperInvariant() == "TER ")
                {
                    var chainId = ("" + line[21]).ToUpperInvariant();

                    terminatedChains.Add(chainId);
                }


                if (line.Substring(0, 5).ToUpperInvariant() == "ATOM ")
                {
                    var chainId = ("" + line[21]).ToUpperInvariant();

                    if (terminatedChains.Contains(chainId))
                    {
                        continue;
                    }

                    if (chainIdWhiteList != null && chainIdWhiteList.Length > 0 && !chainIdWhiteList.Contains(chainId))
                    {
                        continue;
                    }

                    if (!interfaceDataChains.Contains(chainId[0]))
                    {
                        continue;
                    }

                    //if (caTraceOnlyBool && (line[13] != 'C' || line[14] != 'A')) continue;

                    var interfaceDataChainIndex = interfaceDataChains.IndexOf(chainId[0]);

                    var resSeq = int.Parse(line.Substring(22, 4).Trim());

                    if (resSeq >= interfaceDataStart[interfaceDataChainIndex] && resSeq <= interfaceDataEnd[interfaceDataChainIndex])
                    {
                        result.Add(new Tuple <string, string>(chainId, line));
                    }
                }
            }


            if (!string.IsNullOrWhiteSpace(outputFilename))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(outputFilename.Replace("?", "")));
                if (!outputFilename.Contains("?"))
                {
                    File.WriteAllLines(outputFilename, result.Select(a => a.Item2).ToList());
                }
                else
                {
                    var chains = result.Select(a => a.Item1).Distinct().ToList();
                    foreach (var chain in chains)
                    {
                        var outputFilename2 = outputFilename.Replace("?", "");
                        outputFilename2 = Path.GetDirectoryName(outputFilename2) + @"\" + Path.GetFileNameWithoutExtension(outputFilename2) + chain + Path.GetExtension(outputFilename2);
                        File.WriteAllLines(outputFilename2, result.Where(a => a.Item1 == chain).Select(a => a.Item2).ToList());
                    }
                }
            }
            else
            {
                foreach (var line in result)
                {
                    Console.WriteLine(line);
                }
                Console.WriteLine();
            }
        }
Exemple #3
0
        public static void Main(string[] args)
        {
            var parameters = new string[, ]
            {
                { "[pdb_or_atoms_file]", "standard crystal pdb file or output from the ComplexAtoms program" },
                { "[[pad_missing]]", "Y or N (default: Y)" },
                { "[[output_fasta_file]]", "optional output fasta file.  when ommitted, output to console" },
                { "[[append_or_overwrite]]", "optional (A) append or (O) overwrite (default: overwrite)" },
            };

            var maxParamLength = parameters.Cast <string>().Where((a, i) => i % 2 == 0).Max(a => a.Length);
            var exeFilename    = Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            if (args.Length < 1)
            {
                Console.WriteLine(exeFilename + @" is a program to extract the protein amino acid fasta sequence from protein structure pdb file.");
                Console.WriteLine();
                Console.WriteLine(@"Usage:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" " + String.Join(" ", parameters.Cast <string>().Where((a, i) => i % 2 == 0)), maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Example:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" ""c:\pdb_db\atoms\atoms1a12.pdb"" ""c:\pdb_db\fasta_from_pdb\atoms1a12.pdb.fasta""", maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Arguments:");
                for (var i = 0; i < parameters.GetLength(0); i++)
                {
                    Console.WriteLine(@" " + parameters[i, 0].PadLeft(maxParamLength, ' ') + " " + ProteinBioClass.WrapConsoleText(parameters[i, 1], maxParamLength + 2, 1, false));
                }
                Console.WriteLine();

                return;
            }

            // load arguments
            var p             = 0;
            var atomsFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            atomsFilename = atomsFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + atomsFilename);

            p++;
            var padMissing = args.Length > p && args[p].Length > 0 ? args[p] : "Y";

            padMissing = padMissing.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + padMissing);
            if (padMissing != "Y" && padMissing != "N")
            {
                padMissing = "Y";
            }
            var padMissingBool = padMissing == "Y";

            p++;
            var outputFastaFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            outputFastaFilename = outputFastaFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + outputFastaFilename);

            p++;
            var appendOrOverwrite = args.Length > p && args[p].Length > 0 ? args[p] : "";

            appendOrOverwrite = appendOrOverwrite.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + appendOrOverwrite);

            if (!(string.IsNullOrWhiteSpace(appendOrOverwrite) || appendOrOverwrite == "O" || appendOrOverwrite == "A"))
            {
                return;
            }

            Console.WriteLine();

            var sequenceList = Sequence.LoadStructureFile(atomsFilename, null, padMissingBool);// ProteinBioClass.StructureFileToAaFastaSequence(atomsFilename, null, padMissingBool);

            var output = Sequence.GetAsFasta(sequenceList);

            if (string.IsNullOrWhiteSpace(outputFastaFilename))
            {
                Console.WriteLine();

                Console.WriteLine(output);

                Console.WriteLine();
            }
            else
            {
                Directory.CreateDirectory(Path.GetDirectoryName(outputFastaFilename));
                if (appendOrOverwrite == "A" && File.Exists(outputFastaFilename))
                {
                    var data = File.ReadAllText(outputFastaFilename);
                    if (!data.EndsWith(Environment.NewLine))
                    {
                        data = data + Environment.NewLine;
                    }
                    output = data + output;
                }

                File.WriteAllText(outputFastaFilename, output);
            }
        }
Exemple #4
0
        static void Main(string[] args)
        {
            //var s1 =
            //    @"XXXXXXXXXXXXXXXXXXXXKKVKVSHRSHSTEPGLVLTLGQGDVGQLGLGENVMERKKPALVSIPEDVVQAEAGGMHTVCLSKSGQVYSFGCNDEGALGRDTSVEGSEMVPGKVELQEKVVQVSAGDSHTAALTDDGRVFLWGSFRDNNGVIGLLEPMKKSMVPVQVQLDVPVVKVASGNDHLVMLTADGDLYTLGCGEQGQLGRVPELFANRGGRQGLERLLVPKCVMLKSRGSRGHVRFQDAFCGAYFTFAISHEGHVYGFGLSNYHQLGTPGTESCFIPQNLTSFKNSTKSWVGFSGGQHHTVCMDSEGKAYSLGRAEYGRLGLGEGAEEKSIPTLISRLPAVSSVACGASVGYAVTKDGRVFAWGMGTNYQLGTGQDEDAWSPVEMMGKQLENRVVLSVSSGGQHTVLLVKDKEQS";

            //var s2 = @"RRSPPADAIPKSKKVKVSHRSHSTEPGLVLTLGQGDVGQLGLGENVMERKKPALVSIPEDVVQAEAGGMHTVCLSKSGQVYSFGCNDEGALGRDTSVEGSEMVPGKVELQEKVVQVSAGDSHTAALTDDGRVFLWGSFRDNNGVIGLLEPMKKSMVPVQVQLDVPVVKVASGNDHLVMLTADGDLYTLGCGEQGQLGRVPELFANRGGRQGLERLLVPKCVMLKSRGSRGHVRFQDAFCGAYFTFAISHEGHVYGFGLSNYHQLGTPGTESCFIPQNLTSFKNSTKSWVGFSGGQHHTVCMDSEGKAYSLGRAEYGRLGLGEGAEEKSIPTLISRLPAVSSVACGASVGYAVTKDGRVFAWGMGTNYQLGTGQDEDAWSPVEMMGKQLENRVVLSVSSGGQHTVLLVKDKEQS";

            //var x = SimpleAlignmentOffset(s1,s2);

            //Console.WriteLine();
            //Console.WriteLine(x.Item1);
            //Console.WriteLine(x.Item2);
            //Console.WriteLine();
            //Console.ReadLine();
            //return;

            // MutateSequence example.fasta start end mutation original (will find closest to start/end in case of sequence/structure index misalignment)

            var parameters = new string[, ]
            {
                { "[input_fasta_file]", "fasta file with sequence to mutate" },
                { "[chain_ids]", "chain ids to mutate" },
                { "[start_positions]", "mutation start position (one based)" },
                { "[end_positions]", "mutation end position (one based)" },
                { "[offsets]", "offsets (for where pdb index doesn't match fasta sequence index) (one based)" },
                { "[mutation_sequence]", "new amino acids to overwrite with" },
                { "[[output_fasta_file]]", "optional output fasta file.  when ommitted, output to console" },
            };

            var maxParamLength = parameters.Cast <string>().Where((a, i) => i % 2 == 0).Max(a => a.Length);
            var exeFilename    = Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            if (args.Length < 5)
            {
                Console.WriteLine(exeFilename +
                                  @" is a program to mutate (substitute) a subsequence of a protein amino acid sequence within a fasta file.");
                Console.WriteLine();
                Console.WriteLine(@"Usage:");
                Console.WriteLine(
                    ProteinBioClass.WrapConsoleText(
                        exeFilename + @" " + String.Join(" ", parameters.Cast <string>().Where((a, i) => i % 2 == 0)),
                        maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Example:");
                Console.WriteLine(
                    ProteinBioClass.WrapConsoleText(
                        exeFilename +
                        @" ""c:\pdb_db\fasta\fasta_pdb1a12.pdb.fasta"" A,B,C 10,76,100 15,77,102 GBVBGA,AA,GHG ""c:\pdb_db\fasta_mutated\mutated_pdb1a12.pdb.fasta""",
                        maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Arguments:");
                for (var i = 0; i < parameters.GetLength(0); i++)
                {
                    Console.WriteLine(@" " + parameters[i, 0].PadLeft(maxParamLength, ' ') + " " +
                                      ProteinBioClass.WrapConsoleText(parameters[i, 1], maxParamLength + 2, 1, false));
                }
                Console.WriteLine();
                return;
            }

            var p = 0;
            var input_fasta_file = args.Length > p && args[p].Length > 0 ? args[p] : "";

            input_fasta_file = input_fasta_file.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + input_fasta_file);

            p++;
            var chain_ids = args.Length > p && args[p].Length > 0 ? args[p] : "";

            chain_ids = chain_ids.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + chain_ids);
            var chain_ids_split = chain_ids.ToUpperInvariant().Split(',');

            p++;
            var start_position = args.Length > p && args[p].Length > 0 ? args[p] : "";

            start_position = start_position.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + start_position);
            var start_position_split = start_position.Split(',').Select(int.Parse).ToArray();

            p++;
            var end_position = args.Length > p && args[p].Length > 0 ? args[p] : "";

            end_position = end_position.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + end_position);
            var end_position_split = end_position.Split(',').Select(int.Parse).ToArray();

            p++;
            var offset_position = args.Length > p && args[p].Length > 0 ? args[p] : "";

            offset_position = offset_position.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + offset_position);
            var offset_position_split = offset_position.Split(',').Select(int.Parse).ToArray();

            p++;
            var mutation_sequence = args.Length > p && args[p].Length > 0 ? args[p] : "";

            mutation_sequence = mutation_sequence.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + mutation_sequence);
            var mutation_sequence_split = mutation_sequence.Split(',');

            p++;
            var output_fasta_file = args.Length > p && args[p].Length > 0 ? args[p] : "";

            output_fasta_file = output_fasta_file.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + output_fasta_file);

            Console.WriteLine();

            MutateFastaSequenceSave(input_fasta_file, chain_ids_split, start_position_split, end_position_split,
                                    offset_position_split, mutation_sequence_split, output_fasta_file);
        }
        static void Main(string[] args)
        {
            const int atom_chain     = 21;
            const int atom_chain_len = 1;

            const int atom_icode     = 26;
            const int atom_icode_len = 1;

            const int atom_type     = 14;
            const int atom_type_len = 3;

            const int atom_resseq     = 22;
            const int atom_resseq_len = 4;

            var parameters = new string[, ]
            {
                { "[pdb_file]", "PDB ~v3.3 Protein Data Bank format file [*.pdb, *.ent]" },
                { "[[subset]]", "-, mc, sc, ca" },
                { "[[chain_ids]]", "molecule chains to output [2 formats: - for all, ABC, or A,1,50,B,2,40,C,5,200]" },
                { "[[output_file]]", "optional output file. use ? for chain id. when ommitted, output to console" },
            };

            var maxParamLength = parameters.Cast <string>().Where((a, i) => i % 2 == 0).Max(a => a.Length);
            var exeFilename    = Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            if (args.Length == 0)
            {
                Console.WriteLine(exeFilename + @" is a program to extract ATOM records from a PDB file.");
                Console.WriteLine();
                Console.WriteLine(@"Usage:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" " + String.Join(" ", parameters.Cast <string>().Where((a, i) => i % 2 == 0)), maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Example:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" ""c:\pdb_db\pdb1a12.pdb"" 8.0 ""c:\pdb_atoms\atoms1a12.pdb""", maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Arguments:");
                for (var i = 0; i < parameters.GetLength(0); i++)
                {
                    Console.WriteLine(@" " + parameters[i, 0].PadLeft(maxParamLength, ' ') + " " + ProteinBioClass.WrapConsoleText(parameters[i, 1], maxParamLength + 2, 1, false));
                }
                Console.WriteLine();
                return;
            }

            // load and echo arguments
            var p           = 0;
            var pdbFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            pdbFilename = pdbFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + pdbFilename);

            p++;
            var subset = args.Length > p && args[p].Length > 0 ? args[p].ToUpperInvariant() : "";

            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + subset);



            p++;
            var chainIds = args.Length > p && args[p].Length > 0 ? args[p] : "";

            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + chainIds);

            p++;
            var outputFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            outputFilename = outputFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + outputFilename);

            Console.WriteLine();

            if (string.IsNullOrWhiteSpace(pdbFilename))
            {
                return;
            }

            if (!File.Exists(pdbFilename))
            {
                return;
            }

            if (chainIds.Contains('-'))
            {
                chainIds = null;
            }

            var chainStartEnd = new List <Tuple <char, int, int> >();

            var chainIdsSplit = chainIds?.Split(',').ToList();

            char[] chainIdWhiteList;

            if (chainIdsSplit?.Count > 1)
            {
                if (chainIdsSplit.Count % 3 != 0)
                {
                    return;
                }
                for (var i = 0; i < chainIdsSplit.Count; i += 3)
                {
                    var id = chainIdsSplit[i + 0][0];

                    var start = chainIdsSplit[i + 1];
                    if (string.IsNullOrWhiteSpace(start))
                    {
                        start = "-1";
                    }

                    var end = chainIdsSplit[i + 2];
                    if (string.IsNullOrWhiteSpace(end))
                    {
                        end = "-1";
                    }

                    chainStartEnd.Add(new Tuple <char, int, int>(id, int.Parse(start), int.Parse(end)));
                }

                chainIdWhiteList = chainStartEnd.Select(a => a.Item1).Distinct().ToArray();
            }
            else
            {
                chainIdWhiteList = chainIds?.Where(char.IsLetter).Distinct().ToArray();//!string.IsNullOrEmpty(chainIds) ? chainIds.ToUpperInvariant().Split(new char[] { ' ', ',' },StringSplitOptions.RemoveEmptyEntries) : null;
            }



            var terminatedChains = new List <char>();

            var pdbfilenameShort = Path.GetFileNameWithoutExtension(pdbFilename);

            var pdbId = pdbfilenameShort.Substring(pdbfilenameShort.Length - 4).ToUpperInvariant();

            var lines = File.ReadAllLines(pdbFilename);

            var result = new List <Tuple <char, string> >();

            string[] ca = new string[] { "CA" };
            string[] bb = new[] { "N", "CA", "C", "O" };

            foreach (var line in lines)
            {
                if (line.Length < 22)
                {
                    continue;
                }

                if (line.Substring(0, 4).ToUpperInvariant() == "TER ")
                {
                    var chainId = line[21];//).ToUpperInvariant();

                    terminatedChains.Add(chainId);
                }


                if (line.Substring(0, 5).ToUpperInvariant() == "ATOM ")
                {
                    var chainId = line[21];//).ToUpperInvariant();

                    if (terminatedChains.Contains(chainId))
                    {
                        continue;
                    }

                    if (chainIdWhiteList != null && chainIdWhiteList.Length > 0 && !chainIdWhiteList.Contains(chainId))
                    {
                        continue;
                    }

                    //if (subset == "ca" || subset == "sc") && (line[13] != 'C' || line[14] != 'A')) continue;

                    var add = false;

                    var atom_type_s = line.Substring(13, 3).Trim();

                    if (atom_type_s[0] != 'C' && atom_type_s[0] != 'N' && atom_type_s[0] != 'O')
                    {
                        continue;
                    }

                    // check chainIdsSplit
                    var resId = int.Parse(line.Substring(atom_resseq, atom_resseq_len));

                    var chainStartEndItem = chainStartEnd.FirstOrDefault(a => a.Item1 == chainId);

                    if (chainStartEndItem != null)
                    {
                        if (!((chainStartEndItem.Item2 == -1 || resId >= chainStartEndItem.Item2) && (chainStartEndItem.Item3 == -1 || resId <= chainStartEndItem.Item3)))
                        {
                            continue;
                        }
                    }

                    if (subset == "-")
                    {
                        add = true;
                    }
                    else if (subset == "CA" && ca.Contains(atom_type_s))
                    {
                        add = true;
                    }
                    else if (subset == "MC" && bb.Contains(atom_type_s))
                    {
                        add = true;
                    }
                    else if (subset == "SC" && !bb.Contains(atom_type_s))
                    {
                        add = true;
                    }

                    if (add)
                    {
                        result.Add(new Tuple <char, string>(chainId, line));
                    }
                }
            }


            if (!string.IsNullOrWhiteSpace(outputFilename))
            {
                var outputFilename2 = outputFilename.Replace("?", "");
                Directory.CreateDirectory(Path.GetDirectoryName(outputFilename2));
                if (!outputFilename.Contains("?"))
                {
                    File.WriteAllLines(outputFilename, result.Select(a => a.Item2).ToList());
                }
                else if (outputFilename.Contains("??"))
                {
                    var chains = new string(result.Select(a => a.Item1).Where(char.IsLetter).Distinct().OrderBy(a => a).ToArray());

                    outputFilename2 = Path.GetDirectoryName(outputFilename2) + @"\" + Path.GetFileNameWithoutExtension(outputFilename2) + chains + Path.GetExtension(outputFilename2);

                    File.WriteAllLines(outputFilename2, result.Select(a => a.Item2).ToList());
                }
                else if (outputFilename.Contains("?"))
                {
                    var chains = result.Select(a => a.Item1).Distinct().ToList();

                    foreach (var chain in chains)
                    {
                        outputFilename2 = outputFilename.Replace("?", "");
                        outputFilename2 = Path.GetDirectoryName(outputFilename2) + @"\" + Path.GetFileNameWithoutExtension(outputFilename2) + chain + Path.GetExtension(outputFilename2);
                        File.WriteAllLines(outputFilename2, result.Where(a => a.Item1 == chain).Select(a => a.Item2).ToList());
                    }
                }
            }
            else
            {
                foreach (var line in result)
                {
                    Console.WriteLine(line);
                }
                Console.WriteLine();
            }
        }
        static void Main(string[] args)
        {
            var parameters = new string[, ]
            {
                { "[pdb_or_atoms_file]", "output from the ComplexAtoms program" },
                { "[max_distance]", "maximum allowed contact distance in angstroms [i.e. 5.0 or 8.0]" },
                { "[[output_file]]", "optional output file.  when ommitted, output to console" },
                { "[[overwrite]]", "overwrite if output file exists" }
            };

            var maxParamLength = parameters.Cast <string>().Where((a, i) => i % 2 == 0).Max(a => a.Length);
            var exeFilename    = Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            if (args.Length == 0)
            {
                Console.WriteLine(exeFilename + @" is a program to list atomic contacts for a PDB file ATOM records.");
                Console.WriteLine();
                Console.WriteLine(@"Usage:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" " + String.Join(" ", parameters.Cast <string>().Where((a, i) => i % 2 == 0)), maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Example:");
                Console.WriteLine(ProteinBioClass.WrapConsoleText(exeFilename + @" ""c:\pdb_db\pdb1a12.pdb"" 8.0 ""c:\pdb_atoms\atoms1a12.pdb""", maxParamLength + 2, 1));
                Console.WriteLine();
                Console.WriteLine(@"Arguments:");
                for (var i = 0; i < parameters.GetLength(0); i++)
                {
                    Console.WriteLine(@" " + parameters[i, 0].PadLeft(maxParamLength, ' ') + " " + ProteinBioClass.WrapConsoleText(parameters[i, 1], maxParamLength + 2, 1, false));
                }
                Console.WriteLine();
                //return;
            }

            // load arguments
            var p             = 0;
            var atomsFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            atomsFilename = atomsFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + atomsFilename);

            p++;
            var maxDistance = args.Length > p && args[p].Length > 0 ? Decimal.Parse(args[p]) : 0.0m;

            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + maxDistance);

            p++;
            var outputFilename = args.Length > p && args[p].Length > 0 ? args[p] : "";

            outputFilename = outputFilename.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + outputFilename);


            p++;
            var overwrite = args.Length > p && args[p].Length > 0 ? args[p] : "";

            overwrite = overwrite.Replace("\"", "");
            Console.WriteLine("; " + parameters[p, 0].PadLeft(maxParamLength, ' ') + " = " + overwrite);

            if (!string.IsNullOrWhiteSpace(overwrite) && overwrite.ToUpperInvariant() != "Y" && File.Exists(outputFilename))
            {
                Console.Write("; File exists, skipping.");
                return;
            }

            Console.WriteLine();

            if (!File.Exists(atomsFilename))
            {
                return;
            }


            var interactions = ProteinBioClass.FindInteractions(CancellationToken.None, maxDistance, atomsFilename, new Dictionary <string, List <char> >());

            if (!string.IsNullOrWhiteSpace(outputFilename))
            {
                ProteinBioClass.AtomPair.SaveAtomPairList(outputFilename, interactions);
            }
            else
            {
                //Console.WriteLine("; Atom pairs with contacts: " + interactions.Count);
                foreach (var a in interactions.Select(a => a.ToString()).ToList())
                {
                    Console.WriteLine(a);
                }
            }
        }