internal static IEnumerable<string> GetHeader(IList<MzTabProtein> proteins)
{
List<string> headers = new List<string>();
headers.Add(Accession);
headers.Add(Description);
headers.Add(TaxID);
headers.Add(Species);
headers.Add(Database);
headers.Add(DatabaseVersion);
headers.Add(SearchEngine);
headers.AddRange(GetHeaders(proteins, BestSearchEngineScore, (prot => prot.BestSearchEngineScores)));
headers.AddRange(GetHeaders(proteins, SearchEngineScoreMsRun, (prot => prot.SearchEngineScoreMsRun)));
// Only report reliability if one psm has a non-null reliability score
if (proteins.Any(protein => protein.Reliability != MzTab.ReliabilityScore.NotSet))
headers.Add(Reliability);
headers.AddRange(GetHeaders(proteins, NumberOfPsmsPerMsRun, (prot => prot.NumberOfPsmsPerMsRun)));
headers.AddRange(GetHeaders(proteins, NumberOfDistinctPeptidesPerMsRun, (prot => prot.NumberOfDistinctPeptidesPerMsRun)));
headers.AddRange(GetHeaders(proteins, NumberOfUniquePeptidesPerMsRun, (prot => prot.NumberOfUniquePeptidesPerMsRun)));
headers.Add(AmbiguityMembers);
headers.Add(Modifications);
if (proteins.Any(protein => protein.Uri != null))
headers.Add(Uri);
if (proteins.Any(protein => protein.GoTerms != null))
headers.Add(GoTerms);
if (proteins.Any(protein => protein.Coverage.HasValue))
headers.Add(Coverage);
headers.AddRange(GetHeaders(proteins, AbundancePerAssay, (prot => prot.AbundanceAssays)));
headers.AddRange(GetHeaders(proteins, AbundanceStudyVariables, (prot => prot.AbundanceStudyVariables)));
headers.AddRange(GetHeaders(proteins, AbundanceStdevStudyVariables, (prot => prot.AbundanceStdevStudyVariables)));
headers.AddRange(GetHeaders(proteins, AbundanceStandardErrorStudyVariables, (prot => prot.AbundanceStandardErrorStudyVariables)));
return headers;
}