# Migrating from other tools

Interchange provides special support for migrating from the OpenFF Toolkit and Foyer.

## Migrating from the OpenFF Toolkit

Where previously the OpenFF Toolkit was used to generate an OpenMM system:

```python
openmm_system = forcefield.create_openmm_system(topology)
```

the same objects can be used to generate an `Interchange` object:

```python
interchange = Interchange.from_smirnoff(force_field=forcefield, topology=topology)
```

From here, the `Interchange` object can be exported to files for OpenMM:

```python
openmm_system = interchange.to_openmm()
```

or other simulation engines:

```python
interchange.to_gro("out.gro")
interchange.to_top("out.top")
interchange.to_lammps("out.lmp")
```

Below is a minimal but complete example parameterizing an ethanol molecule with an OpenFF force field and creating an OpenMM System alongside GROMACS files:

```python
from openff.toolkit.topology import Molecule
from openff.toolkit.utils import get_data_file_path
from openff.toolkit.typing.engines.smirnoff import ForceField
from openff.interchange import Interchange

sdf_file_path = get_data_file_path("molecules/ethanol.sdf")
molecule: Molecule = Molecule.from_file(sdf_file_path)
topology: Topology = molecule.to_topology()

sage = ForceField("openff-2.0.0.offxml")

interchange = Interchange.from_smirnoff(force_field=sage, topology=topology)
interchange.positions = molecule.conformers[0]

openmm_system = interchange.to_openmm()

interchange.to_gro("out.gro")
interchange.to_top("out.top")
```

## Migrating from Foyer

Where previously Foyer is used to generate a ParmEd Structure:

```python
structure = forcefield.apply(topology)
```

similar objects can be used to generate an `Interchange` object. In the future, direct consumption
of `mbuild.Compound`s will be supported, but at present the only supported topology input is an
OpenFF topology.

```python
topology = _OFFBioTop(other=Molecule.from_smiles("CCO").to_topology())

interchange = Interchange.from_foyer(topology=topology, force_field=forcefield)
```

From here, the `Interchange` object can be exported to any supported files or objects.

Below is a minimal but complete example parameterizing an ethanol molecule with a Foyer force field and creating an OpenMM System alongside GROMACS files:

```python
from foyer import Forcefield
import mdtraj as md
from openff.toolkit import Molecule

from openff.interchange import Interchange

ethanol = Molecule.from_smiles("CCO")
ethanol.generate_conformers(n_conformers=1)
topology = ethanol.to_topology()

oplsaa: Forcefield = Forcefield(name="oplsaa")

interchange = Interchange.from_foyer(topology=topology, force_field=oplsaa)
assert interchange["vdW"].mixing_rule == "geometric"
assert interchange.positions.shape == ethanol.conformers[0].shape
```
