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 tukey_alpha = 0.0f);
377 float box_radius_a_internal;
378 float box_radius_b_internal;
379 float box_radius_c_internal;
381 map_fragment_info_t(
const clipper::Xmap<float> &xmap,
382 const clipper::Coord_orth ¢re,
383 float radius,
bool centre_at_origin =
false,
384 float tukey_alpha = 0.0f);
385 clipper::Xmap<float> xmap;
386 clipper::Coord_grid offset;
388 void unshift(clipper::Xmap<float> *xmap_p,
const clipper::Coord_orth ¢re);
389 void simple_origin_shift(
const clipper::Xmap<float> &ip_xmap,
390 const clipper::Coord_orth ¢re,
392 clipper::Grid_map make_grid_map(
const clipper::Xmap<float> &input_xmap,
393 const clipper::Coord_orth ¢re)
const;
398 class simple_residue_triple_t {
400 mmdb::Residue *this_residue;
401 mmdb::Residue *next_residue;
402 mmdb::Residue *prev_residue;
403 std::string alt_conf;
404 simple_residue_triple_t() {
409 simple_residue_triple_t(mmdb::Residue *this_residue_in,
410 mmdb::Residue *prev_residue_in,
411 mmdb::Residue *next_residue_in,
412 const std::string &alt_conf_in) : alt_conf(alt_conf_in) {
413 this_residue = this_residue_in;
414 prev_residue = prev_residue_in;
415 next_residue = next_residue_in;
420 class residue_triple_t {
422 mmdb::Residue *this_residue;
423 mmdb::Residue *next_residue;
424 mmdb::Residue *prev_residue;
425 std::string alt_conf;
431 residue_triple_t(mmdb::Residue *this_residue_in,
432 mmdb::Residue *prev_residue_in,
433 mmdb::Residue *next_residue_in,
434 const std::string &alt_conf_in) : alt_conf(alt_conf_in) {
435 this_residue = this_residue_in;
436 prev_residue = prev_residue_in;
437 next_residue = next_residue_in;
439 ~residue_triple_t() {
444 residue_triple_t deep_copy() {
445 mmdb::Residue *this_residue_cp = deep_copy_this_residue(this_residue);
446 mmdb::Residue *prev_residue_cp = deep_copy_this_residue(this_residue);
447 mmdb::Residue *next_residue_cp = deep_copy_this_residue(this_residue);
448 return residue_triple_t(this_residue_cp,
455 class backrub_residue_triple_t :
public residue_triple_t {
461 backrub_residue_triple_t(mmdb::Residue *this_residue_in,
462 mmdb::Residue *prev_residue_in,
463 mmdb::Residue *next_residue_in,
464 const std::string &alt_conf_in) : residue_triple_t(this_residue_in,
468 trim_this_residue_atoms();
469 trim_prev_residue_atoms();
470 trim_next_residue_atoms();
474 void trim_this_residue_atoms();
476 void trim_prev_residue_atoms();
478 void trim_next_residue_atoms();
479 void trim_residue_atoms_generic(mmdb::Residue *residue_p,
480 std::vector<std::string> keep_atom_vector,
481 bool use_keep_atom_vector);
486 class map_ref_triple_t {
489 clipper::Xmap<float>::Map_reference_coord iw;
491 map_ref_triple_t(
const double &d_in,
492 const clipper::Xmap<float>::Map_reference_coord &iw_in,
493 const float &den_in) {
498 map_ref_triple_t() {}
499 bool operator<(
const map_ref_triple_t &mrt)
const {
500 return (mrt.dist_sq < dist_sq);
506 enum {UNASSIGNED = -1, TOO_LOW = -2 };
508 static bool compare_density_values_map_refs(
const std::pair<clipper::Xmap_base::Map_reference_index, float> &v1,
509 const std::pair<clipper::Xmap_base::Map_reference_index, float> &v2);
513 void flood_fill_segmented_map(clipper::Xmap<std::pair<bool, int> > *segmented_map,
514 const clipper::Xmap<float> &xmap,
515 const clipper::Coord_grid &seed_point,
516 int from_val,
int to_val);
521 std::vector<clipper::Coord_grid> path_to_peak(
const clipper::Coord_grid &start_point,
522 const clipper::Xmap<float> &xmap_new);
523 static bool sort_segment_vec(
const std::pair<int, int> &a,
524 const std::pair<int, int> &b);
525 int find_biggest_segment(
const std::map<
int, std::vector<clipper::Coord_grid> > &segment_id_map,
526 const std::map<int, int> &segment_id_counter_map)
const;
528 int find_smallest_segment(
const std::map<
int, std::vector<clipper::Coord_grid> > &segment_id_map,
529 const std::map<int, int> &segment_id_counter_map)
const;
530 void resegment_watershed_points(clipper::Xmap<int> *xmap_int,
531 const clipper::Xmap<float> &xmap)
const;
543 std::pair<int, clipper::Xmap<int> > segment(
const clipper::Xmap<float> &xmap_in,
float low_level);
547 std::pair<int, clipper::Xmap<int> > segment_emsley_flood(
const clipper::Xmap<float> &xmap_in,
552 std::pair<int, clipper::Xmap<int> > segment(
const clipper::Xmap<float> &xmap_in,
554 float b_factor_increment,
559 const clipper::Xmap<float> ⟼
560 clipper::Xmap<float> make_variance_map()
const;
561 clipper::Xmap<float> solvent_treatment_map()
const;
562 clipper::Xmap<float> protein_treatment_map()
const;
563 static void apply_variance_values(clipper::Xmap<float> &variance_map,
564 const clipper::Xmap<float> &xmap,
565 const std::vector<clipper::Coord_grid> &soi_gps,
566 const std::vector<clipper::Xmap_base::Map_reference_index> &grid_indices);
568 soi_variance(
const clipper::Xmap<float> &xmap_in) : xmap(xmap_in) { }
569 void proc(
float solvent_content_frac);
570 static bool mri_var_pair_sorter(
const std::pair<clipper::Xmap_base::Map_reference_index, float> &p1,
571 const std::pair<clipper::Xmap_base::Map_reference_index, float> &p2);
577 std::vector<std::pair<std::string, clipper::Xmap<float> > >
578 partition_map_by_chain(
const clipper::Xmap<float> &xmap, mmdb::Manager *mol,
579 std::string *state_string_p);
581 bool is_EM_map(
const clipper::Xmap<float> &xmap);
584 typedef std::pair<double, double> phitheta;
586 std::vector<phitheta> make_phi_thetas(
unsigned int n_pts);
587 float average_of_sample_map_at_sphere_points(clipper::Coord_orth ¢re,
589 const std::vector<phitheta> &phi_thetas,
590 clipper::Xmap<float> &xmap);
592 std::vector<std::pair<clipper::Resolution, double> >
593 fsc(
const clipper::Xmap<float> &xmap_1,
const clipper::Xmap<float> &xmap_2);
597 power_scale(
const clipper::Xmap<float> &xmap_ref,
const clipper::Xmap<float> &xmap_for_scaling);
600 compare_structure_factors(
const clipper::Xmap<float> &xmap_1,
const clipper::Xmap<float> &xmap_2);
602 void flip_hand(clipper::Xmap<float> *xmap_p);
606 analyse_map_point_density_change(
const std::vector<std::pair<clipper::Xmap<float> *,
float> > &xmaps,
607 const clipper::Xmap<float> &xmap_for_mask);
609 clipper::Xmap<float> zero_dose_extrapolation(
const std::vector<std::pair<clipper::Xmap<float> *,
float> > &xmaps,
610 const clipper::Xmap<float> &xmap_for_mask);
612 clipper::Xmap<float> real_space_zero_dose_extrapolation(
const std::vector<clipper::Xmap<float> *> &xmaps,
613 const clipper::Xmap<float> &xmap_for_mask);
615 int split_residue_using_map(mmdb::Residue *residue_p, mmdb::Manager *mol,
const clipper::Xmap<float> &xmap);
617 std::vector<std::vector<float> >
618 get_density_on_cylinder(
const clipper::Coord_orth &pt_1,
const clipper::Coord_orth &pt_2,
619 const clipper::Coord_orth &pt_ref,
const clipper::Xmap<float> &xmap,
620 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