23#ifndef COOT_MAP_UTILS_HH
24#define COOT_MAP_UTILS_HH
28#include <clipper/core/coords.h>
29#include <clipper/core/xmap.h>
30#include <clipper/core/hkl_data.h>
31#include <clipper/contrib/sfcalc_obs.h>
32#include "coot-coord-utils.hh"
33#include "coot-density-stats.hh"
34#include <mmdb2/mmdb_manager.h>
41 clipper::RTop_orth make_rtop_orth_from(mmdb::mat44 mat);
44 float density_at_point(
const clipper::Xmap<float> &map_in,
45 const clipper::Coord_orth &co);
46 float density_at_point_by_cubic_interp(
const clipper::NXmap<float> &map_in,
47 const clipper::Coord_map &cm);
49 float density_at_point_by_linear_interpolation(
const clipper::Xmap<float> &map_in,
50 const clipper::Coord_orth &co);
52 float density_at_point_by_nearest_grid(
const clipper::Xmap<float> &map_in,
53 const clipper::Coord_orth &co);
55 float density_at_point_by_nearest_grid(
const clipper::NXmap<float> &nxmap,
56 const clipper::Coord_orth &co);
57 float density_at_point_by_linear_interp(
const clipper::NXmap<float> &nxmap,
58 const clipper::Coord_orth &co);
60 float density_at_map_point(
const clipper::Xmap<float> &map_in,
61 const clipper::Coord_map &cg);
63 clipper::Grad_orth<double> gradient_at_point(
const clipper::Xmap<float> &map_in,
64 const clipper::Coord_orth &co);
67 std::pair<float, float> mean_and_variance(
const clipper::Xmap<float> &xmap);
70 const clipper::Xmap<float> &xmap,
79 bool map_fill_from_mtz(clipper::Xmap<float> *xmap,
80 std::string mtz_file_name,
83 std::string weight_col,
84 short int use_weights,
85 float sampling_rate=1.5);
87 bool map_fill_from_mtz(clipper::Xmap<float> *xmap,
88 std::string mtz_file_name,
91 std::string weight_col,
92 short int use_weights,
93 float reso_limit_high,
94 short int use_reso_limit_high,
95 float sampling_rate=1.5);
98 void filter_by_resolution(clipper::HKL_data< clipper::datatypes::F_phi<float> > *fphidata,
99 const float &reso_low,
100 const float &reso_high);
107 float max_gridding(
const clipper::Xmap<float> &xmap);
113 float map_score(mmdb::PPAtom atom_selection,
114 int n_selected_atoms,
115 const clipper::Xmap<float> &xmap,
116 short int with_atomic_weighting);
120 float map_score(std::vector<mmdb::Atom *> atoms,
const clipper::Xmap<float> &xmap);
122 float map_score_atom(mmdb::Atom *atom,
const clipper::Xmap<float> &xmap);
124 float map_score_by_residue_specs(mmdb::Manager *mol,
125 const std::vector<residue_spec_t> &res_specs,
126 const clipper::Xmap<float> &xmap,
127 bool main_chain_only_flag =
false);
129 clipper::Xmap<float> sharpen_blur_map(
const clipper::Xmap<float> &xmap_in,
float b_factor);
132 void sharpen_blur_map(clipper::Xmap<float> *xmap,
float b_factor);
134 clipper::Xmap<float> sharpen_blur_map_with_resample(
const clipper::Xmap<float> &xmap_in,
float b_factor,
135 float resample_factor);
137 clipper::Xmap<float> sharpen_blur_map_with_reduced_sampling(
const clipper::Xmap<float> &xmap_in,
float b_factor,
138 float resample_factor);
142 void multi_sharpen_blur_map(
const clipper::Xmap<float> &xmap_in,
143 const std::vector<float> &b_factors,
144 std::vector<clipper::Xmap<float> > *maps_p);
147 clipper::Xmap<float> sharpen_map(
const clipper::Xmap<float> &xmap_in,
148 float sharpen_factor);
151 class map_molecule_centre_info_t {
163 map_molecule_centre_info_t() {
171 map_molecule_centre_info_t map_molecule_centre(
const clipper::Xmap<float> &xmap);
173 map_molecule_centre_info_t map_molecule_recentre_from_position(
const clipper::Xmap<float> &xmap,
174 const clipper::Coord_orth ¤t_centre);
179 std::vector<amplitude_vs_resolution_point>
180 amplitude_vs_resolution(
const clipper::Xmap<float> &xmap_in,
int n_bins = -1);
184 float b_factor(
const std::vector<amplitude_vs_resolution_point> &fsqrd_data,
185 std::pair<bool, float> reso_low_invresolsq = std::pair<bool, float>(
false, -1),
186 std::pair<bool, float> reso_higy_invresolsq = std::pair<bool, float>(
false, -1));
188 clipper::Xmap<float> transform_map(
const clipper::Xmap<float> &xmap_in,
189 const clipper::Spacegroup &new_space_group,
190 const clipper::Cell &new_cell,
191 const clipper::RTop_orth &rtop,
192 const clipper::Coord_orth &about_pt,
195 clipper::Grid_sampling suggested_grid_sampling(
const clipper::Grid_sampling &orig_sampling,
196 const clipper::Cell &orig_cell,
197 const clipper::Spacegroup &new_space_group,
198 const clipper::Cell &new_cell);
200 clipper::Xmap<float> laplacian_transform(
const clipper::Xmap<float> &xmap_in);
202 std::vector<float> density_map_points_in_sphere(clipper::Coord_orth pt,
float radius,
203 const clipper::Xmap<float> &xmap_in);
207 clipper::Xmap<float> calc_atom_map(mmdb::Manager *mol,
208 int atom_selection_handle,
209 const clipper::Cell &cell,
210 const clipper::Spacegroup &space_group,
211 const clipper::Grid_sampling &sampling);
213 clipper::Xmap<float> mask_map(
const clipper::Xmap<float> &xmap_in,
214 const std::vector<mmdb::Residue *> &neighbs);
216 clipper::Xmap<float> make_map_mask(
const clipper::Spacegroup &space_group,
217 const clipper::Cell &cell,
218 const clipper::Grid_sampling &grid_sampling,
220 int atom_selection_handle,
232 float map_to_model_correlation(mmdb::Manager *mol,
233 const std::vector<residue_spec_t> &specs_for_correl,
234 const std::vector<residue_spec_t> &specs_for_masking_neighbs,
235 unsigned short int atom_mask_mode,
237 const clipper::Xmap<float> &xmap_from_sfs);
239 density_correlation_stats_info_t
240 map_to_model_correlation_stats(mmdb::Manager *mol,
241 const std::vector<residue_spec_t> &specs_for_correl,
242 const std::vector<residue_spec_t> &specs_for_masking_neighbs,
243 unsigned short int atom_mask_mode,
245 const clipper::Xmap<float> &xmap_from_sfs,
246 map_stats_t map_stats_flag);
250 std::vector<std::pair<residue_spec_t, float> >
251 map_to_model_correlation_per_residue(mmdb::Manager *mol,
252 const std::vector<residue_spec_t> &specs,
253 unsigned short int atom_mask_mode,
255 const clipper::Xmap<float> &xmap_from_sfs);
257 std::map<coot::residue_spec_t, density_stats_info_t>
258 map_to_model_correlation_stats_per_residue(mmdb::Manager *mol,
259 const std::vector<residue_spec_t> &specs,
260 unsigned short int atom_mask_mode,
262 const clipper::Xmap<float> &xmap);
266 std::pair<std::map<coot::residue_spec_t, density_correlation_stats_info_t>, std::map<coot::residue_spec_t, density_correlation_stats_info_t> >
267 map_to_model_correlation_stats_per_residue_run(mmdb::Manager *mol,
268 const std::string &chain_id,
269 const clipper::Xmap<float> &xmap,
270 unsigned int n_residues_per_run,
272 float atom_mask_radius=2.8,
273 float NOC_mask_radius=1.8);
276 std::pair<clipper::Coord_frac, clipper::Coord_frac>
277 find_struct_fragment_coord_fracs_v2(
const std::pair<clipper::Coord_orth, clipper::Coord_orth> &selection_extents,
278 const clipper::Cell &cell);
282 class map_stats_holder_helper_t {
285 double sum_x_squared;
287 double sum_y_squared;
290 map_stats_holder_helper_t() {
298 void add_xy(
const double &x,
const double &y) {
301 sum_x_squared += x*x;
302 sum_y_squared += y*y;
310 std::vector<std::pair<double, double> >
311 qq_plot_for_map_over_model(mmdb::Manager *mol,
312 const std::vector<coot::residue_spec_t> &specs,
313 const std::vector<coot::residue_spec_t> &nb_residues,
315 const clipper::Xmap<float> &xmap);
319 std::pair<clipper::Xmap<float>,
float>
320 difference_map(
const clipper::Xmap<float> &xmap_in_1,
321 const clipper::Xmap<float> &xmap_in_2,
326 average_map(
const std::vector<std::pair<clipper::Xmap<float>,
float> > &maps_and_scales_vec);
330 clipper::Xmap<float> variance_map(
const std::vector<std::pair<clipper::Xmap<float>,
float> > &maps_and_scales_vec);
336 regen_weighted_map(clipper::Xmap<float> *xmap_in,
337 const std::vector<std::pair<clipper::Xmap<float> *,
float> > &maps_and_scales_vec);
344 std::pair<float, float> spin_search(
const clipper::Xmap<float> &xmap, mmdb::Residue *res, coot::torsion tors);
350 clipper::Xmap<float> reinterp_map_fine_gridding(
const clipper::Xmap<float> &xmap);
355 clipper::Xmap<float> reinterp_map(
const clipper::Xmap<float> &xmap_in,
float sampling_multiplier);
359 clipper::Xmap<float> reinterp_map(
const clipper::Xmap<float> &xmap_in,
360 const clipper::Xmap<float> &reference_xmap);
365 void reverse_map(clipper::Xmap<float> *xmap_p);
367 class map_fragment_info_t {
369 void init(
const clipper::Xmap<float> &xmap,
370 const clipper::Coord_orth ¢re,
373 void init_making_map_centred_at_origin(
const clipper::Xmap<float> &xmap,
374 const clipper::Coord_orth ¢re,
376 float box_radius_a_internal;
377 float box_radius_b_internal;
378 float box_radius_c_internal;
380 map_fragment_info_t(
const clipper::Xmap<float> &xmap,
381 const clipper::Coord_orth ¢re,
382 float radius,
bool centre_at_origin =
false);
383 clipper::Xmap<float> xmap;
384 clipper::Coord_grid offset;
386 void unshift(clipper::Xmap<float> *xmap_p,
const clipper::Coord_orth ¢re);
387 void simple_origin_shift(
const clipper::Xmap<float> &ip_xmap,
388 const clipper::Coord_orth ¢re,
390 clipper::Grid_map make_grid_map(
const clipper::Xmap<float> &input_xmap,
391 const clipper::Coord_orth ¢re)
const;
396 class simple_residue_triple_t {
398 mmdb::Residue *this_residue;
399 mmdb::Residue *next_residue;
400 mmdb::Residue *prev_residue;
401 std::string alt_conf;
402 simple_residue_triple_t() {
407 simple_residue_triple_t(mmdb::Residue *this_residue_in,
408 mmdb::Residue *prev_residue_in,
409 mmdb::Residue *next_residue_in,
410 const std::string &alt_conf_in) : alt_conf(alt_conf_in) {
411 this_residue = this_residue_in;
412 prev_residue = prev_residue_in;
413 next_residue = next_residue_in;
418 class residue_triple_t {
420 mmdb::Residue *this_residue;
421 mmdb::Residue *next_residue;
422 mmdb::Residue *prev_residue;
423 std::string alt_conf;
429 residue_triple_t(mmdb::Residue *this_residue_in,
430 mmdb::Residue *prev_residue_in,
431 mmdb::Residue *next_residue_in,
432 const std::string &alt_conf_in) : alt_conf(alt_conf_in) {
433 this_residue = this_residue_in;
434 prev_residue = prev_residue_in;
435 next_residue = next_residue_in;
437 ~residue_triple_t() {
442 residue_triple_t deep_copy() {
443 mmdb::Residue *this_residue_cp = deep_copy_this_residue(this_residue);
444 mmdb::Residue *prev_residue_cp = deep_copy_this_residue(this_residue);
445 mmdb::Residue *next_residue_cp = deep_copy_this_residue(this_residue);
446 return residue_triple_t(this_residue_cp,
453 class backrub_residue_triple_t :
public residue_triple_t {
459 backrub_residue_triple_t(mmdb::Residue *this_residue_in,
460 mmdb::Residue *prev_residue_in,
461 mmdb::Residue *next_residue_in,
462 const std::string &alt_conf_in) : residue_triple_t(this_residue_in,
466 trim_this_residue_atoms();
467 trim_prev_residue_atoms();
468 trim_next_residue_atoms();
472 void trim_this_residue_atoms();
474 void trim_prev_residue_atoms();
476 void trim_next_residue_atoms();
477 void trim_residue_atoms_generic(mmdb::Residue *residue_p,
478 std::vector<std::string> keep_atom_vector,
479 bool use_keep_atom_vector);
484 class map_ref_triple_t {
487 clipper::Xmap<float>::Map_reference_coord iw;
489 map_ref_triple_t(
const double &d_in,
490 const clipper::Xmap<float>::Map_reference_coord &iw_in,
491 const float &den_in) {
496 map_ref_triple_t() {}
497 bool operator<(
const map_ref_triple_t &mrt)
const {
498 return (mrt.dist_sq < dist_sq);
504 enum {UNASSIGNED = -1, TOO_LOW = -2 };
506 static bool compare_density_values_map_refs(
const std::pair<clipper::Xmap_base::Map_reference_index, float> &v1,
507 const std::pair<clipper::Xmap_base::Map_reference_index, float> &v2);
511 void flood_fill_segmented_map(clipper::Xmap<std::pair<bool, int> > *segmented_map,
512 const clipper::Xmap<float> &xmap,
513 const clipper::Coord_grid &seed_point,
514 int from_val,
int to_val);
519 std::vector<clipper::Coord_grid> path_to_peak(
const clipper::Coord_grid &start_point,
520 const clipper::Xmap<float> &xmap_new);
521 static bool sort_segment_vec(
const std::pair<int, int> &a,
522 const std::pair<int, int> &b);
523 int find_biggest_segment(
const std::map<
int, std::vector<clipper::Coord_grid> > &segment_id_map,
524 const std::map<int, int> &segment_id_counter_map)
const;
526 int find_smallest_segment(
const std::map<
int, std::vector<clipper::Coord_grid> > &segment_id_map,
527 const std::map<int, int> &segment_id_counter_map)
const;
528 void resegment_watershed_points(clipper::Xmap<int> *xmap_int,
529 const clipper::Xmap<float> &xmap)
const;
541 std::pair<int, clipper::Xmap<int> > segment(
const clipper::Xmap<float> &xmap_in,
float low_level);
545 std::pair<int, clipper::Xmap<int> > segment_emsley_flood(
const clipper::Xmap<float> &xmap_in,
550 std::pair<int, clipper::Xmap<int> > segment(
const clipper::Xmap<float> &xmap_in,
552 float b_factor_increment,
557 const clipper::Xmap<float> ⟼
558 clipper::Xmap<float> make_variance_map()
const;
559 clipper::Xmap<float> solvent_treatment_map()
const;
560 clipper::Xmap<float> protein_treatment_map()
const;
561 static void apply_variance_values(clipper::Xmap<float> &variance_map,
562 const clipper::Xmap<float> &xmap,
563 const std::vector<clipper::Coord_grid> &soi_gps,
564 const std::vector<clipper::Xmap_base::Map_reference_index> &grid_indices);
566 soi_variance(
const clipper::Xmap<float> &xmap_in) : xmap(xmap_in) { }
567 void proc(
float solvent_content_frac);
568 static bool mri_var_pair_sorter(
const std::pair<clipper::Xmap_base::Map_reference_index, float> &p1,
569 const std::pair<clipper::Xmap_base::Map_reference_index, float> &p2);
575 std::vector<std::pair<std::string, clipper::Xmap<float> > >
576 partition_map_by_chain(
const clipper::Xmap<float> &xmap, mmdb::Manager *mol,
577 std::string *state_string_p);
579 bool is_EM_map(
const clipper::Xmap<float> &xmap);
582 typedef std::pair<double, double> phitheta;
584 std::vector<phitheta> make_phi_thetas(
unsigned int n_pts);
585 float average_of_sample_map_at_sphere_points(clipper::Coord_orth ¢re,
587 const std::vector<phitheta> &phi_thetas,
588 clipper::Xmap<float> &xmap);
590 std::vector<std::pair<clipper::Resolution, double> >
591 fsc(
const clipper::Xmap<float> &xmap_1,
const clipper::Xmap<float> &xmap_2);
595 power_scale(
const clipper::Xmap<float> &xmap_ref,
const clipper::Xmap<float> &xmap_for_scaling);
598 compare_structure_factors(
const clipper::Xmap<float> &xmap_1,
const clipper::Xmap<float> &xmap_2);
600 void flip_hand(clipper::Xmap<float> *xmap_p);
604 analyse_map_point_density_change(
const std::vector<std::pair<clipper::Xmap<float> *,
float> > &xmaps,
605 const clipper::Xmap<float> &xmap_for_mask);
607 clipper::Xmap<float> zero_dose_extrapolation(
const std::vector<std::pair<clipper::Xmap<float> *,
float> > &xmaps,
608 const clipper::Xmap<float> &xmap_for_mask);
610 clipper::Xmap<float> real_space_zero_dose_extrapolation(
const std::vector<clipper::Xmap<float> *> &xmaps,
611 const clipper::Xmap<float> &xmap_for_mask);
613 int split_residue_using_map(mmdb::Residue *residue_p, mmdb::Manager *mol,
const clipper::Xmap<float> &xmap);
615 std::vector<std::vector<float> >
616 get_density_on_cylinder(
const clipper::Coord_orth &pt_1,
const clipper::Coord_orth &pt_2,
617 const clipper::Coord_orth &pt_ref,
const clipper::Xmap<float> &xmap,
618 double radius,
unsigned int n_length,
unsigned int n_ring);
Definition coot-density-stats.hh:36
float suggested_radius
the suggested radius
Definition coot-map-utils.hh:160
double sum_of_densities
sum of densities - for whatever use that may be.
Definition coot-map-utils.hh:162
float suggested_contour_level
suggested contour level
Definition coot-map-utils.hh:158
clipper::Coord_orth updated_centre
new centre
Definition coot-map-utils.hh:156
bool success
success flag
Definition coot-map-utils.hh:154