Multi Body Fluctuation Induced Forces - weria-pezeshkian/FreeDTS GitHub Wiki
Created by Adrià Bravo Vidal
Introduction
On this page, we provide the simulation scheme used in the work "Multi-body fluctuation-induced forces between membrane proteins: Insights from mesoscale simulations" by Adrià Bravo Vidal and Weria Pezeshkian (https://doi.org/10.1101/2025.09.12.675822). Note that data appearing in the plots of this work can be found in 10.5281/zenodo.20365837.
The simulation scheme consists on three steps:
- Generating the desired initial membrane shape configuration and equilibrating it.
- Randomly placing inclusions on it with desired features and running simulations again.
- Analyzing simulations. (Under construction)
In the following, we will guide you through these three steps.
1. Generating initial membrane configurations
In this work, we used two different membrane shapes, a membrane patch subject to periodic boundary conditions in the XY directions and a membrane with spherical shape. First, we generate equilibrated configurations of any of these shapes in absence of inclusions. In order to generate a dynamically triangulated surface (DTS) in any of these shapes and equilibrating them under any desired constraints, we refer you to the following tutorial and user manual.
2. Adding inclusions and running production simulation
After equilibration of the membrane has been reached under a desired constraint and shape, we can now proceed to randomly place inclusions in the surface with chosen features and run the simulations again. First, take the last frame that you generated in your last run and use it as the topology file for the next simulation you will launch. Second, your input.dts file must be modified to include the following lines at the end:
INCLUSION
Define 2 Inclusions
SRotation Type K KG KP KL C0 C0P C0L lambda lkg lkn cn0
0 Pro1 x y 0 0 z 0 0 0 0 0 0
GenerateInclusions
Selection_Type Random
TypeID 1
Density rho
In here, the first 4 lines define the inclusion-membrane interaction energy. x, y and z corresponds to $\kappa + \Delta\kappa, \Delta\kappa_g$ and $c_o$, respectively, which are defined in the referenced manuscript. $\rho$ refers to the surface coverage (e.g. $\rho=N_i/N_{\nu}$ where $N_i$ is the number of inclusions and $N_{\nu}$ is the number of vertices). The last 4 lines are in charge of randomly placing $N_i$ inclusions on $N_{\nu}$ vertices at the beginning of the run.
You can now execute the production run with the new input and topology file! Make sure to include enough Monte Carlo steps and replicates to obtain good sampling of the system (see section II.E in the manuscript to see the number of replicas and Monte Calor steps we used).
3. Analyzing the simulations
When the simulations have run for enough MC steps to obtain good sampling, we are in condition to perform analysis of the data and extract relevant quantities. To do so, we use an analysis code build in C++ and with similar structure as the source code from FreeDTS and that can be downloaded here. To use it, simply compile it using ./compile_ana.sh, which will generate an executable ANA. You can run this executable from the folder where you have run the simulation and contains the input .dts file and trajectory folder (typically called TrajTSI). Run this with the following command.
$path/ANA -in input.dts -ana input.ana
This program reads .tsi files from a TrajTSI folder generated from an input.dts file and extracts quantities specified in the input.ana file, which contains the following lines:
FolderName = Analysis
Energy = on
Area = on
ProjectedArea = on
Thickness = on
MeanCurvature = on
GaussianCurvature = on
Inclusion = on
InclusionCluster = on
The first line indicates the name of the output folder where different files will be stored.
The following lines contain keywords that are calculated if set to value on.
The output will be Analysis/dts.ana
## Frame Energy Area Area_p MeanCurvature MeanCurvature2 GaussianCurvature InclusionNeighbour InclusionEnergy InclusionMeanCurvature InclusionGaussianCurvature InclusionMeanCurvature2
0 1004.60380051 3050.86417722 2982.30726898 0.04960958 25.11509501 8.23936884 0.75510204 90.64161215 0.85189528 0.70690685 2.26604030
1 975.41356762 3054.75093560 2987.91590495 0.02118345 24.38533919 7.16727454 0.46938776 92.74798975 0.63919010 0.61117283 2.31869974
2 1009.76350814 3057.73441710 2991.16190844 0.01228063 25.24408770 7.69690421 0.69387755 123.50276993 2.67307061 1.40779919 3.08756925
3 987.14400812 3053.29779475 2983.60950109 -0.02806493 24.67860020 7.51114926 0.59183673 92.25315507 0.72232042 0.77022704 2.30632888
4 1041.91118537 3050.20295251 2978.45008992 0.01351667 26.04777963 8.14272453 0.52040816 103.28733747 4.24434437 0.71585984 2.58218344
5 1029.53435543 3049.73296498 2979.62332672 0.01139364 25.73835889 8.24242681 0.55102041 92.59685355 0.99957081 0.59550997 2.31492134
6 1034.05908558 3050.98243246 2982.81312916 -0.03358379 25.85147714 8.30466556 0.69387755 94.29126952 -1.28707037 0.83827721 2.35728174
7 992.24918958 3044.64419751 2978.19222310 0.00630923 24.80622974 7.54474325 0.70408163 111.54774436 -2.66068777 1.16980309 2.78869361
The header describes the content of each column, while each row represents the data corresponding to frame TrajTSI/dts{x}.tsi.
Note that all quantities except the referent to InclusionNeighbor are total quantities, not averaged, across vertices (e.g. Energy represent $\sum_i E_i$ where $i$ goes over all vertices).
If the quantity has the particle Inclusion in front in the header, as for example InclusionEnergy, then that quantity is summed across vertices that own an inclusion only.
The quantity InclusionNeighbor matches exactly the definition of $n$ given in the manuscript.
Finally, if the InclusionCluster keyword is set to on, an extra file called inclusioncluster.ana is outputted with the following format:
0 94 23 7 2 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 119 24 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 98 28 5 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 109 24 8 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Each line $j$ of this file indicates, for frame $j$, the number of inclusions making clusters of size $m$, where $m$ is the column number. For example, in the first frame there are 94 clusters made of only 1 inclusion. Averaging over frames and replicas using these two files, all quantities shown in the figures of the manuscript can be calculated.