/** Fill the modification ID map. */
  private static void fillModIdMap() {

    // @TODO: is this method really needed anymore?
    modIdMap = new HashMap<String, String>();
    PTMFactory ptmFactory = PTMFactory.getInstance();
    List<String> mods = new ArrayList<String>();
    mods.addAll(ptmFactory.getDefaultModifications());
    mods.addAll(ptmFactory.getUserModifications());
    // Connector string: plus for positive modifications, minus for negative ones
    String connector;

    // Write the modifications
    for (String mod : mods) {
      PTM ptm = ptmFactory.getPTM(mod);
      double ptmMass = ptm.getRoundedMass();

      if (ptmMass > 0) {
        connector = "+";
      } else {
        connector = "";
      }

      if (ptm.getPattern() == null || ptm.getPattern().getAminoAcidsAtTarget().isEmpty()) {
        if (ptmFactory.getPTM(mod).getType() == PTM.MODN
            || ptmFactory.getPTM(mod).getType() == PTM.MODNAA
            || ptmFactory.getPTM(mod).getType() == PTM.MODNP
            || ptmFactory.getPTM(mod).getType() == PTM.MODNPAA) {
          modIdMap.put(ptm.getName(), "^" + connector + Long.toString(Math.round(ptmMass)));
        } else if (ptmFactory.getPTM(mod).getType() == PTM.MODC
            || ptmFactory.getPTM(mod).getType() == PTM.MODCAA
            || ptmFactory.getPTM(mod).getType() == PTM.MODCP
            || ptmFactory.getPTM(mod).getType() == PTM.MODCPAA) {
          modIdMap.put(ptm.getName(), "$" + connector + Long.toString(Math.round(ptmMass)));
        }
      } else {
        for (Character residue : ptmFactory.getPTM(mod).getPattern().getAminoAcidsAtTarget()) {
          if (ptmFactory.getPTM(mod).getType() == PTM.MODN
              || ptmFactory.getPTM(mod).getType() == PTM.MODNAA
              || ptmFactory.getPTM(mod).getType() == PTM.MODNP
              || ptmFactory.getPTM(mod).getType() == PTM.MODNPAA) {
            modIdMap.put(ptm.getName(), residue + connector + Long.toString(Math.round(ptmMass)));
          } else if (ptmFactory.getPTM(mod).getType() == PTM.MODC
              || ptmFactory.getPTM(mod).getType() == PTM.MODCAA
              || ptmFactory.getPTM(mod).getType() == PTM.MODCP
              || ptmFactory.getPTM(mod).getType() == PTM.MODCPAA) {
            modIdMap.put(ptm.getName(), residue + connector + Long.toString(Math.round(ptmMass)));
          } else {
            modIdMap.put(ptm.getName(), residue + connector + Long.toString(Math.round(ptmMass)));
          }
        }
      }
    }
  }
  /**
   * Creates the Andromeda PTM file and saves the PTM indexes in the search parameters.
   *
   * @param andromedaFolder the Andromeda installation folder
   * @param identificationParameters the identification parameters
   * @param identificationParametersFile the file where to save the search parameters
   * @throws IOException exception thrown whenever an error occurs while writing to the file.
   * @throws java.lang.ClassNotFoundException exception thrown whenever an error occurred while
   *     saving the search parameters
   */
  public static void createPtmFile(
      File andromedaFolder,
      IdentificationParameters identificationParameters,
      File identificationParametersFile)
      throws IOException, ClassNotFoundException {

    File file = new File(andromedaFolder, "conf");
    file = new File(file, "modifications.xml");
    BufferedWriter bw = new BufferedWriter(new FileWriter(file));
    int index = 0;
    String date = "0001-01-01T00:00:00";

    PTMFactory ptmFactory = PTMFactory.getInstance();
    SearchParameters searchParameters = identificationParameters.getSearchParameters();
    AndromedaParameters andromedaParameters =
        (AndromedaParameters)
            searchParameters.getIdentificationAlgorithmParameter(Advocate.andromeda.getIndex());

    try {
      bw.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
      bw.newLine();
      bw.write(
          "<modifications xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
      bw.newLine();

      // add the default ptms
      for (String ptmName : ptmFactory.getDefaultModifications()) {
        PTM ptm = ptmFactory.getPTM(ptmName);
        writePtm(bw, date, ptm, index);
        andromedaParameters.setPtmIndex(ptmName, index);
        index++;
      }

      // add the user ptms
      for (String ptmName : ptmFactory.getUserModifications()) {
        PTM ptm = ptmFactory.getPTM(ptmName);
        writePtm(bw, date, ptm, index);
        andromedaParameters.setPtmIndex(ptmName, index);
        index++;
      }

      bw.write("</modifications>");
      bw.newLine();
    } finally {
      bw.close();
    }

    IdentificationParameters.saveIdentificationParameters(
        identificationParameters, identificationParametersFile);
  }