IMP logo
IMP Reference Guide  develop.63b38c487d,2024/12/21
The Integrative Modeling Platform
saxs/profile_fit.py

In this example, we read a protein from a PDB file and experimental profile file. Next we compute the theoretical profile from the PDB file and fit it to the experimental one. Unlike in profile.py example, here we fit the profile with adjustment of the excluded volume and hydration layer density of the molecule.

This application is available as a web service at salilab.org/foxs. It is also available as C++ code in IMP at modules/foxs/bin/foxs.cpp.

The experimental data for lysozyme is taken from crysol program (www.embl-hamburg.de/ExternalInfo/Research/Sax/crysol.html)

1 ## \example saxs/profile_fit.py
2 # In this example, we read a protein from a PDB file and experimental profile
3 # file. Next we compute the theoretical profile from the PDB file and fit it
4 # to the experimental one. Unlike in profile.py example, here we fit the
5 # profile with adjustment of the excluded volume and hydration layer density
6 # of the molecule.
7 #
8 # This application is available as a web service at salilab.org/foxs. It is
9 # also available as C++ code in IMP at modules/foxs/bin/foxs.cpp.
10 #
11 # The experimental data for lysozyme is taken from crysol program
12 # (www.embl-hamburg.de/ExternalInfo/Research/Sax/crysol.html)
13 #
14 
15 import IMP
16 import IMP.atom
17 import IMP.core
18 import IMP.saxs
19 import sys
20 
21 IMP.setup_from_argv(sys.argv, "profile fit")
22 
23 m = IMP.Model()
24 
25 # read PDB
28 
29 # read experimental profile
30 exp_profile = IMP.saxs.Profile(IMP.saxs.get_example_path('lyzexp.dat'))
31 
32 print('min_q = ' + str(exp_profile.get_min_q()))
33 print('max_q = ' + str(exp_profile.get_max_q()))
34 print('delta_q = ' + str(exp_profile.get_delta_q()))
35 
36 # select particles from the model
37 particles = IMP.atom.get_by_type(mp, IMP.atom.ATOM_TYPE)
38 
39 # add radius for water layer computation
41 for i in range(0, len(particles)):
42  radius = ft.get_radius(particles[i])
43  IMP.core.XYZR.setup_particle(particles[i], radius)
44 # compute surface accessibility
46 surface_area = s.get_solvent_accessibility(IMP.core.XYZRs(particles))
47 
48 # calculate SAXS profile
49 delta_q = 0.5 / 500
50 model_profile = IMP.saxs.Profile(0.0, 0.5, delta_q)
51 model_profile.calculate_profile_partial(particles, surface_area)
52 # model_profile.write_SAXS_file('6lyz.dat')
53 
54 # calculate chi-square score (should be ~0.25 for this example)
55 saxs_score = IMP.saxs.ProfileFitterChi(exp_profile)
56 chi = saxs_score.compute_score(model_profile)
57 print('Chi without parameter fitting = ' + str(chi))
58 
59 chi = (saxs_score.fit_profile(model_profile)).get_chi_square()
60 print('Chi after adjustment of excluded volume and water layer parameters = '
61  + str(chi))
62 saxs_score.fit_profile(model_profile, 0.95, 1.05, -2.0, 4.0, False,
63  '6lyz_fitted.dat')