private void initializeProcesses() throws Exception {
    MolecularSystem system = null;
    if (mainTopologyFile != null) {
      List<MolecularSystem> systems = mainTopologyFile.getMolecularSystems();
      if (systems != null && systems.size() > 0) {
        system = systems.get(0);
        List<Molecule> molecules = system.getSoluteMolecules();
        // get list of molecules defined in ITP files
        if (mainTopologyFile.getFormat().equals(LocalFile.FORMAT_GROMACS_TOP)) {
          List<LocalFile> filesInclude = allFiles.get(LocalFile.FORMAT_GROMACS_ITP);
          if (filesInclude != null && molecules != null) {
            for (LocalFile fileItp : filesInclude) {
              if (fileItp instanceof GROMACSIncludeTopologyFile) {
                List<Molecule> localMoleculeDefs =
                    ((GROMACSIncludeTopologyFile) fileItp).getMolecules();
                if (localMoleculeDefs != null) {
                  // for each molecule in the ITP file, replace in the TOP file
                  for (Molecule molDef : localMoleculeDefs) {
                    for (int m = 0; m < molecules.size(); m++) {
                      Molecule mol = molecules.get(m);
                      if (molDef.getName() != null
                          && mol.getName() != null
                          && molDef.getName().toUpperCase().equals(mol.getName().toUpperCase())) {
                        molecules.set(m, molDef);
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    List<ExperimentProcess> processes = this.initializeProcesses(parameterFileFormats);

    ExperimentProcessGroup processGroup =
        new ExperimentProcessGroup(null, description, system, processes);
    processGroup.organizeProcessesForMD();
    this.processGroups = new ArrayList<ExperimentProcessGroup>();
    this.processGroups.add(processGroup);
  }
  /**
   * Get Gromacs collection metadata
   *
   * @throws Exception
   */
  @Override
  public MetadataAVUList getMetadata() throws Exception {
    MetadataAVUList metadata = super.getMetadata();

    // add aggregated metadata
    SummaryExperimentTasks tasksSummary = this.getExperimentTasksSummary();
    if (tasksSummary != null) {
      metadata.addAll(tasksSummary.getMetadata());
    }
    // default to MD if no method found
    if (!metadata.containsAttribute(MethodMetadata.COMPUTATIONAL_METHOD_NAME)) {
      metadata.add(
          new MetadataAVU(MethodMetadata.COMPUTATIONAL_METHOD_NAME, ParameterSet.METHOD_MD));
    }

    // if no task found, default software name to AMBER
    if (!metadata.containsAttribute(PlatformMetadata.SOFTWARE_NAME))
      metadata.add(new MetadataAVU(PlatformMetadata.SOFTWARE_NAME, Software.GROMACS));

    // add topology info
    if (mainTopologyFile != null
        && mainTopologyFile.getMolecularSystems() != null
        && mainTopologyFile.getMolecularSystems().size() > 0) {
      MolecularSystem system = mainTopologyFile.getMolecularSystems().get(0);
      metadata.addAll(system.getMetadata());

      if (!metadata.containsAttribute(MethodMetadata.SOLVENT_TYPE)) {
        // if water or ions are present, assume solvated system
        if (system.getIonCount() > 0 || system.getSolventMoleculeCount() > 0)
          metadata.updatePair(MethodMetadata.SOLVENT_TYPE, ParameterSet.SOLVENT_EXPLICIT);
        else
          metadata.add(new MetadataAVU(MethodMetadata.SOLVENT_TYPE, ParameterSet.SOLVENT_IN_VACUO));
      }
    }
    return metadata;
  }