Skip to content

Multi Body Fluctuation Induced Forces

Adrià Bravo Vidal edited this page Jul 9, 2026 · 1 revision

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:

  1. Generating the desired initial membrane shape configuration and equilibrating it.
  2. Randomly placing inclusions on it with desired features and running simulations again.
  3. 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.

Clone this wiki locally