conda install -f environment.yml
conda activate ff
pip install .from FiberForge.build import (
identify_protofibrils,
calculate_average_helical_parameters,
build_fibril,
solvate_fibril
)
from FiberForge.utils import (
clean_structure,
remove_chains
)
# The path to your amyloid structure in PDB format
pdb_file = "amyloid.pdb" # A classic is 2MXU (ABeta42)
# Locate the protofibrils, returns List[dict[str, np.array(3)]]
protofibrils = identify_protofibrils(pdb_file)
# If multiple protofibril structure, remove other chains
remove_chains(
pdb_file,
"protofibril.pdb", # Saves to protofibril.pdb
chains_to_remove = [] # for example we assume fibril made of 1 protofibril
)
# Calculate the best theta and t
theta, t, growth_axis = calculate_average_helical_parameters("protofibril.pdb")
build_fibril(
"protofibril.pdb",
theta,
t,
n_units=20,
output_file = "extended_protofibril.pdb"
)
solvate_fibril(
input_structure="extended_protofibril.gro",
output_gro="solvated.gro",
topol_file="topol.top",
box=box,
water_model='spc216.gro',
gmx_path='module load gromacs;gmx',
expand_box=False
)Alter the fiberverse database location for your machine ininit.py, create the list of pdb_ids you want to simulate, specify n_replicates, specify pulling conditions, specify the chains you wish to pull.
After you have initialized your jobs with python init.py perform the following operations to run simulations on your system
python project.py run -o preprocess_pdb
python project.py run -o create_eq_submission
python project.py run -o run_equilibrationAfter minimization and equilibration have finished run:
python project.py run -o create_pull_mdp
python project.py run -o create_pull_submission
python project.py run -o preprocess_pull
python project.py run -o run_pullFinally, after the pulling simulation has finished run:
python project.py run -o run_analysisAfter you have finished your simulations you can calculate mechanical properties of interest:
from FiberForge.analyze import calculate_cross_sectional_area
pdb_file = 'extended_protofibril.pdb'
project_path = 'path/to/files'
cross_sectional_area = calculate_cross_sectional_area(pdb_file)
cross_sectional_area = cross_sectional_area * 1e-20 # A^2 to m^2
# Calculate the strain in units of nm
time_length = calculate_variable_over_time(project_path + '/4_smd/pull_pullx.xvg')
length_over_time = np.array([l for (t, l) in time_length])
strain = (length_over_time - length_over_time[0]) / length_over_time[0]
# Calculate the stress
time_force = calculate_variable_over_time(project_path + '/4_smd/pull_pullf.xvg')
force_over_time = np.array([f for (t, f) in time_force])*(1e-9)*(1/1000) # kJ/mol/nm to N
stress = force_over_time / cross_sectional_area
# Calculate the ultimate tensile strength
ultimate_tensile_strength = np.max(stress)
# Calculate the elastic modulus, assuming there is no plastic deformation
E, yield_point = estimate_elastic_modulus(stress, strain)A repo for building, characterizing, and analyizing protein fibrils.
Copyright (c) 2025, Kieran Nehil-Puleo