public SilacResultSplitter(string lightParamFile, string heavyParamFile)
        {
            SequestParamFile paramFile = new SequestParamFile();
            SequestParam     light     = paramFile.ReadFromFile(@"F:\sqh\Project\wuyibo\Light.params");
            SequestParam     heavy     = paramFile.ReadFromFile(@"F:\sqh\Project\wuyibo\Heavy.params");

            this.lightCalc = light.GetPeptideMassCalculator();
            this.heavyCalc = heavy.GetPeptideMassCalculator();
        }
        private void WriteModifications(SequestParam sp)
        {
            var aas = new Aminoacids();

            foreach (SequestStaticModification ssm in sp.StaticModification.Keys)
            {
                double addMass = sp.StaticModification[ssm];
                if (addMass != 0.0)
                {
                    switch (ssm)
                    {
                    case SequestStaticModification.add_Cterm_peptide:
                    case SequestStaticModification.add_Cterm_protein:
                    case SequestStaticModification.add_Nterm_peptide:
                    case SequestStaticModification.add_Nterm_protein:
                        break;

                    default:
                        char aa = SequestParam.ModificationToAminoacid(ssm);
                        this.sw.WriteLine(
                            "      <aminoacid_modification aminoacid=\"{0}\" massdiff=\"{1:0.0000}\" mass=\"{2:0.0000}\" variable=\"N\"/>",
                            aa, addMass, aas[aa].MonoMass + addMass);
                        break;
                    }
                }
            }

            foreach (String aminoacids in sp.Diff_search_options.Keys)
            {
                double addMass = sp.Diff_search_options[aminoacids];
                foreach (char aa in aminoacids)
                {
                    this.sw.WriteLine(
                        "      <aminoacid_modification aminoacid=\"{0}\" massdiff=\"{1:0.0000}\" mass=\"{2:0.0000}\" variable=\"Y\"/>",
                        aa, addMass, aas[aa].MonoMass + addMass);
                }
            }
        }
        public void WriteSequestParam(SequestParam sp)
        {
            if (!this.isMsmsRunSummaryOpened)
            {
                throw new Exception("Call OpenMsmsRunSummary before WriteSequestParam.");
            }

            if (this.sampleProtease == null)
            {
                this.sampleProtease = sp.Protease;
            }

            this.currentSequestParams        = sp;
            this.staticAminoacidModification = sp.GetStaticAminoacidModification();

            //sample_enzyme
            this.sw.WriteLine("    <sample_enzyme name=\"{0}\">",
                              this.sampleProtease.Name);
            this.sw.WriteLine("      <specificity cut=\"{0}\" no_cut=\"{1}\" sense=\"{2}\"/>",
                              this.sampleProtease.CleaveageResidues,
                              this.sampleProtease.NotCleaveResidues,
                              this.sampleProtease.IsEndoProtease ? "C" : "N");
            this.sw.WriteLine("    </sample_enzyme>");

            //search_summary
            this.sw.WriteLine(
                "    <search_summary base_name=\"{0}\" search_engine=\"SEQUEST\" precursor_mass_type=\"{1}\" fragment_mass_type=\"{2}\" out_data_type=\"{3}\" out_data=\"{4}\" search_id=\"{5}\">",
                this.sourceFilename,
                sp.Mass_type_parent_annotation,
                sp.Mass_type_fragment_annotation,
                this.rawDataType,
                this.rawData,
                this.searchId);

            this.sw.WriteLine("      <search_database local_path=\"{0}\" type=\"{1}\"/>",
                              sp.First_database_name,
                              sp.Nucleotide_reading_frame == 0 ? "AA" : "NA");

            this.sw.WriteLine(
                "      <enzymatic_search_constraint enzyme=\"{0}\" max_num_internal_cleavages=\"{1}\" min_number_termini=\"{2}\"/>",
                sp.Protease.Name,
                sp.Max_num_internal_cleavage_sites,
                sp.Min_number_termini);

            WriteModifications(sp);

            //parameters
            this.sw.WriteLine("      <parameter name=\"peptide_mass_tol\" value=\"{0:0.0000}\"/>", sp.Peptide_mass_tolerance);
            this.sw.WriteLine("      <parameter name=\"ion_series\" value=\"{0}\"/>", sp.Ion_series);
            this.sw.WriteLine("      <parameter name=\"fragment_ion_tol\" value=\"{0:0.0000}\"/>", sp.Fragment_ion_tolerance);
            this.sw.WriteLine("      <parameter name=\"num_output_lines\" value=\"{0}\"/>", sp.Num_output_lines);
            this.sw.WriteLine("      <parameter name=\"num_results\" value=\"{0}\"/>", sp.Num_results);
            this.sw.WriteLine("      <parameter name=\"num_description_lines\" value=\"{0}\"/>", sp.Num_description_lines);
            this.sw.WriteLine("      <parameter name=\"show_fragment_ions\" value=\"{0}\"/>", sp.Show_fragment_ions);
            this.sw.WriteLine("      <parameter name=\"print_duplicate_references\" value=\"{0}\"/>",
                              sp.Print_duplicate_references);
            this.sw.WriteLine("      <parameter name=\"max_num_differential_AA_per_mod\" value=\"{0}\"/>",
                              sp.Max_num_differential_AA_per_mod);
            this.sw.WriteLine("      <parameter name=\"nucleotide_reading_frame\" value=\"{0}\"/>",
                              sp.Nucleotide_reading_frame);
            this.sw.WriteLine("      <parameter name=\"normalize_Score\" value=\"{0}\"/>", sp.Normalize_Score);
            this.sw.WriteLine("      <parameter name=\"remove_precursor_peak\" value=\"{0}\"/>", sp.Remove_precursor_peak);
            this.sw.WriteLine("      <parameter name=\"ion_cutoff_percentage\" value=\"{0:0.0000}\"/>",
                              sp.Ion_cutoff_percentage);
            this.sw.WriteLine("      <parameter name=\"max_num_internal_cleavage_sites\" value=\"{0}\"/>",
                              sp.Max_num_internal_cleavage_sites);
            this.sw.WriteLine("      <parameter name=\"protein_mass_filter\" value=\"{0} {1}\"/>",
                              sp.Protein_mass_filter.First, sp.Protein_mass_filter.Second);
            this.sw.WriteLine("      <parameter name=\"match_peak_count\" value=\"{0}\"/>", sp.Match_peak_count);
            this.sw.WriteLine("      <parameter name=\"match_peak_allowed_error\" value=\"{0}\"/>",
                              sp.Match_peak_allowed_error);
            this.sw.WriteLine("      <parameter name=\"match_peak_tolerance\" value=\"{0}\"/>", sp.Match_peak_tolerance);
            this.sw.WriteLine("      <parameter name=\"partial_sequence\" value=\"{0}\"/>", sp.Partial_sequence);
            this.sw.WriteLine("      <parameter name=\"sequence_header_filter\" value=\"{0}\"/>", sp.Sequence_header_filter);

            //end of search_summary
            this.sw.WriteLine("    </search_summary>");
        }