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_map_point(
const clipper::Xmap<float> &map_in,
56 const clipper::Coord_map &cg);
58 clipper::Grad_orth<double> gradient_at_point(
const clipper::Xmap<float> &map_in,
59 const clipper::Coord_orth &co);
62 std::pair<float, float> mean_and_variance(
const clipper::Xmap<float> &xmap);
65 const clipper::Xmap<float> &xmap,
74 bool map_fill_from_mtz(clipper::Xmap<float> *xmap,
75 std::string mtz_file_name,
78 std::string weight_col,
79 short int use_weights,
80 float sampling_rate=1.5);
82 bool map_fill_from_mtz(clipper::Xmap<float> *xmap,
83 std::string mtz_file_name,
86 std::string weight_col,
87 short int use_weights,
88 float reso_limit_high,
89 short int use_reso_limit_high,
90 float sampling_rate=1.5);
93 void filter_by_resolution(clipper::HKL_data< clipper::datatypes::F_phi<float> > *fphidata,
94 const float &reso_low,
95 const float &reso_high);
102 float max_gridding(
const clipper::Xmap<float> &xmap);
108 float map_score(mmdb::PPAtom atom_selection,
109 int n_selected_atoms,
110 const clipper::Xmap<float> &xmap,
111 short int with_atomic_weighting);
115 float map_score(std::vector<mmdb::Atom *> atoms,
const clipper::Xmap<float> &xmap);
117 float map_score_atom(mmdb::Atom *atom,
const clipper::Xmap<float> &xmap);
119 float map_score_by_residue_specs(mmdb::Manager *mol,
120 const std::vector<residue_spec_t> &res_specs,
121 const clipper::Xmap<float> &xmap,
122 bool main_chain_only_flag =
false);
124 clipper::Xmap<float> sharpen_blur_map(
const clipper::Xmap<float> &xmap_in,
float b_factor);
127 void sharpen_blur_map(clipper::Xmap<float> *xmap,
float b_factor);
129 clipper::Xmap<float> sharpen_blur_map_with_resample(
const clipper::Xmap<float> &xmap_in,
float b_factor,
130 float resample_factor);
132 clipper::Xmap<float> sharpen_blur_map_with_reduced_sampling(
const clipper::Xmap<float> &xmap_in,
float b_factor,
133 float resample_factor);
137 void multi_sharpen_blur_map(
const clipper::Xmap<float> &xmap_in,
138 const std::vector<float> &b_factors,
139 std::vector<clipper::Xmap<float> > *maps_p);
142 clipper::Xmap<float> sharpen_map(
const clipper::Xmap<float> &xmap_in,
143 float sharpen_factor);
146 class map_molecule_centre_info_t {
158 map_molecule_centre_info_t() {
166 map_molecule_centre_info_t map_molecule_centre(
const clipper::Xmap<float> &xmap);
168 map_molecule_centre_info_t map_molecule_recentre_from_position(
const clipper::Xmap<float> &xmap,
169 const clipper::Coord_orth ¤t_centre);
174 std::vector<amplitude_vs_resolution_point>
175 amplitude_vs_resolution(
const clipper::Xmap<float> &xmap_in,
int n_bins = -1);
179 float b_factor(
const std::vector<amplitude_vs_resolution_point> &fsqrd_data,
180 std::pair<bool, float> reso_low_invresolsq = std::pair<bool, float>(
false, -1),
181 std::pair<bool, float> reso_higy_invresolsq = std::pair<bool, float>(
false, -1));
183 clipper::Xmap<float> transform_map(
const clipper::Xmap<float> &xmap_in,
184 const clipper::Spacegroup &new_space_group,
185 const clipper::Cell &new_cell,
186 const clipper::RTop_orth &rtop,
187 const clipper::Coord_orth &about_pt,
190 clipper::Grid_sampling suggested_grid_sampling(
const clipper::Grid_sampling &orig_sampling,
191 const clipper::Cell &orig_cell,
192 const clipper::Spacegroup &new_space_group,
193 const clipper::Cell &new_cell);
195 clipper::Xmap<float> laplacian_transform(
const clipper::Xmap<float> &xmap_in);
197 std::vector<float> density_map_points_in_sphere(clipper::Coord_orth pt,
float radius,
198 const clipper::Xmap<float> &xmap_in);
202 clipper::Xmap<float> calc_atom_map(mmdb::Manager *mol,
203 int atom_selection_handle,
204 const clipper::Cell &cell,
205 const clipper::Spacegroup &space_group,
206 const clipper::Grid_sampling &sampling);
208 clipper::Xmap<float> mask_map(
const clipper::Xmap<float> &xmap_in,
209 const std::vector<mmdb::Residue *> &neighbs);
211 clipper::Xmap<float> make_map_mask(
const clipper::Spacegroup &space_group,
212 const clipper::Cell &cell,
213 const clipper::Grid_sampling &grid_sampling,
215 int atom_selection_handle,
227 float map_to_model_correlation(mmdb::Manager *mol,
228 const std::vector<residue_spec_t> &specs_for_correl,
229 const std::vector<residue_spec_t> &specs_for_masking_neighbs,
230 unsigned short int atom_mask_mode,
232 const clipper::Xmap<float> &xmap_from_sfs);
234 density_correlation_stats_info_t
235 map_to_model_correlation_stats(mmdb::Manager *mol,
236 const std::vector<residue_spec_t> &specs_for_correl,
237 const std::vector<residue_spec_t> &specs_for_masking_neighbs,
238 unsigned short int atom_mask_mode,
240 const clipper::Xmap<float> &xmap_from_sfs,
241 map_stats_t map_stats_flag);
245 std::vector<std::pair<residue_spec_t, float> >
246 map_to_model_correlation_per_residue(mmdb::Manager *mol,
247 const std::vector<residue_spec_t> &specs,
248 unsigned short int atom_mask_mode,
250 const clipper::Xmap<float> &xmap_from_sfs);
252 std::map<coot::residue_spec_t, density_stats_info_t>
253 map_to_model_correlation_stats_per_residue(mmdb::Manager *mol,
254 const std::vector<residue_spec_t> &specs,
255 unsigned short int atom_mask_mode,
257 const clipper::Xmap<float> &xmap);
261 std::pair<std::map<coot::residue_spec_t, density_correlation_stats_info_t>, std::map<coot::residue_spec_t, density_correlation_stats_info_t> >
262 map_to_model_correlation_stats_per_residue_run(mmdb::Manager *mol,
263 const std::string &chain_id,
264 const clipper::Xmap<float> &xmap,
265 unsigned int n_residues_per_run,
267 float atom_mask_radius=2.8,
268 float NOC_mask_radius=1.8);
271 std::pair<clipper::Coord_frac, clipper::Coord_frac>
272 find_struct_fragment_coord_fracs_v2(
const std::pair<clipper::Coord_orth, clipper::Coord_orth> &selection_extents,
273 const clipper::Cell &cell);
277 class map_stats_holder_helper_t {
280 double sum_x_squared;
282 double sum_y_squared;
285 map_stats_holder_helper_t() {
293 void add_xy(
const double &x,
const double &y) {
296 sum_x_squared += x*x;
297 sum_y_squared += y*y;
305 std::vector<std::pair<double, double> >
306 qq_plot_for_map_over_model(mmdb::Manager *mol,
307 const std::vector<coot::residue_spec_t> &specs,
308 const std::vector<coot::residue_spec_t> &nb_residues,
310 const clipper::Xmap<float> &xmap);
314 std::pair<clipper::Xmap<float>,
float>
315 difference_map(
const clipper::Xmap<float> &xmap_in_1,
316 const clipper::Xmap<float> &xmap_in_2,
321 average_map(
const std::vector<std::pair<clipper::Xmap<float>,
float> > &maps_and_scales_vec);
325 clipper::Xmap<float> variance_map(
const std::vector<std::pair<clipper::Xmap<float>,
float> > &maps_and_scales_vec);
331 regen_weighted_map(clipper::Xmap<float> *xmap_in,
332 const std::vector<std::pair<clipper::Xmap<float> *,
float> > &maps_and_scales_vec);
339 std::pair<float, float> spin_search(
const clipper::Xmap<float> &xmap, mmdb::Residue *res, coot::torsion tors);
345 clipper::Xmap<float> reinterp_map_fine_gridding(
const clipper::Xmap<float> &xmap);
350 clipper::Xmap<float> reinterp_map(
const clipper::Xmap<float> &xmap_in,
float sampling_multiplier);
354 clipper::Xmap<float> reinterp_map(
const clipper::Xmap<float> &xmap_in,
355 const clipper::Xmap<float> &reference_xmap);
360 void reverse_map(clipper::Xmap<float> *xmap_p);
362 class map_fragment_info_t {
364 void init(
const clipper::Xmap<float> &xmap,
365 const clipper::Coord_orth ¢re,
368 void init_making_map_centred_at_origin(
const clipper::Xmap<float> &xmap,
369 const clipper::Coord_orth ¢re,
371 float box_radius_a_internal;
372 float box_radius_b_internal;
373 float box_radius_c_internal;
375 map_fragment_info_t(
const clipper::Xmap<float> &xmap,
376 const clipper::Coord_orth ¢re,
377 float radius,
bool centre_at_origin =
false);
378 clipper::Xmap<float> xmap;
379 clipper::Coord_grid offset;
381 void unshift(clipper::Xmap<float> *xmap_p,
const clipper::Coord_orth ¢re);
382 void simple_origin_shift(
const clipper::Xmap<float> &ip_xmap,
383 const clipper::Coord_orth ¢re,
385 clipper::Grid_map make_grid_map(
const clipper::Xmap<float> &input_xmap,
386 const clipper::Coord_orth ¢re)
const;
391 class simple_residue_triple_t {
393 mmdb::Residue *this_residue;
394 mmdb::Residue *next_residue;
395 mmdb::Residue *prev_residue;
396 std::string alt_conf;
397 simple_residue_triple_t() {
402 simple_residue_triple_t(mmdb::Residue *this_residue_in,
403 mmdb::Residue *prev_residue_in,
404 mmdb::Residue *next_residue_in,
405 const std::string &alt_conf_in) : alt_conf(alt_conf_in) {
406 this_residue = this_residue_in;
407 prev_residue = prev_residue_in;
408 next_residue = next_residue_in;
413 class residue_triple_t {
415 mmdb::Residue *this_residue;
416 mmdb::Residue *next_residue;
417 mmdb::Residue *prev_residue;
418 std::string alt_conf;
424 residue_triple_t(mmdb::Residue *this_residue_in,
425 mmdb::Residue *prev_residue_in,
426 mmdb::Residue *next_residue_in,
427 const std::string &alt_conf_in) : alt_conf(alt_conf_in) {
428 this_residue = this_residue_in;
429 prev_residue = prev_residue_in;
430 next_residue = next_residue_in;
432 ~residue_triple_t() {
437 residue_triple_t deep_copy() {
438 mmdb::Residue *this_residue_cp = deep_copy_this_residue(this_residue);
439 mmdb::Residue *prev_residue_cp = deep_copy_this_residue(this_residue);
440 mmdb::Residue *next_residue_cp = deep_copy_this_residue(this_residue);
441 return residue_triple_t(this_residue_cp,
448 class backrub_residue_triple_t :
public residue_triple_t {
454 backrub_residue_triple_t(mmdb::Residue *this_residue_in,
455 mmdb::Residue *prev_residue_in,
456 mmdb::Residue *next_residue_in,
457 const std::string &alt_conf_in) : residue_triple_t(this_residue_in,
461 trim_this_residue_atoms();
462 trim_prev_residue_atoms();
463 trim_next_residue_atoms();
467 void trim_this_residue_atoms();
469 void trim_prev_residue_atoms();
471 void trim_next_residue_atoms();
472 void trim_residue_atoms_generic(mmdb::Residue *residue_p,
473 std::vector<std::string> keep_atom_vector,
474 bool use_keep_atom_vector);
479 class map_ref_triple_t {
482 clipper::Xmap<float>::Map_reference_coord iw;
484 map_ref_triple_t(
const double &d_in,
485 const clipper::Xmap<float>::Map_reference_coord &iw_in,
486 const float &den_in) {
491 map_ref_triple_t() {}
492 bool operator<(
const map_ref_triple_t &mrt)
const {
493 return (mrt.dist_sq < dist_sq);
499 enum {UNASSIGNED = -1, TOO_LOW = -2 };
501 static bool compare_density_values_map_refs(
const std::pair<clipper::Xmap_base::Map_reference_index, float> &v1,
502 const std::pair<clipper::Xmap_base::Map_reference_index, float> &v2);
506 void flood_fill_segmented_map(clipper::Xmap<std::pair<bool, int> > *segmented_map,
507 const clipper::Xmap<float> &xmap,
508 const clipper::Coord_grid &seed_point,
509 int from_val,
int to_val);
514 std::vector<clipper::Coord_grid> path_to_peak(
const clipper::Coord_grid &start_point,
515 const clipper::Xmap<float> &xmap_new);
516 static bool sort_segment_vec(
const std::pair<int, int> &a,
517 const std::pair<int, int> &b);
518 int find_biggest_segment(
const std::map<
int, std::vector<clipper::Coord_grid> > &segment_id_map,
519 const std::map<int, int> &segment_id_counter_map)
const;
521 int find_smallest_segment(
const std::map<
int, std::vector<clipper::Coord_grid> > &segment_id_map,
522 const std::map<int, int> &segment_id_counter_map)
const;
523 void resegment_watershed_points(clipper::Xmap<int> *xmap_int,
524 const clipper::Xmap<float> &xmap)
const;
536 std::pair<int, clipper::Xmap<int> > segment(
const clipper::Xmap<float> &xmap_in,
float low_level);
540 std::pair<int, clipper::Xmap<int> > segment_emsley_flood(
const clipper::Xmap<float> &xmap_in,
545 std::pair<int, clipper::Xmap<int> > segment(
const clipper::Xmap<float> &xmap_in,
547 float b_factor_increment,
552 const clipper::Xmap<float> ⟼
553 clipper::Xmap<float> make_variance_map()
const;
554 clipper::Xmap<float> solvent_treatment_map()
const;
555 clipper::Xmap<float> protein_treatment_map()
const;
556 static void apply_variance_values(clipper::Xmap<float> &variance_map,
557 const clipper::Xmap<float> &xmap,
558 const std::vector<clipper::Coord_grid> &soi_gps,
559 const std::vector<clipper::Xmap_base::Map_reference_index> &grid_indices);
561 soi_variance(
const clipper::Xmap<float> &xmap_in) : xmap(xmap_in) { }
562 void proc(
float solvent_content_frac);
563 static bool mri_var_pair_sorter(
const std::pair<clipper::Xmap_base::Map_reference_index, float> &p1,
564 const std::pair<clipper::Xmap_base::Map_reference_index, float> &p2);
570 std::vector<std::pair<std::string, clipper::Xmap<float> > >
571 partition_map_by_chain(
const clipper::Xmap<float> &xmap, mmdb::Manager *mol,
572 std::string *state_string_p);
574 bool is_EM_map(
const clipper::Xmap<float> &xmap);
577 typedef std::pair<double, double> phitheta;
579 std::vector<phitheta> make_phi_thetas(
unsigned int n_pts);
580 float average_of_sample_map_at_sphere_points(clipper::Coord_orth ¢re,
582 const std::vector<phitheta> &phi_thetas,
583 clipper::Xmap<float> &xmap);
585 std::vector<std::pair<clipper::Resolution, double> >
586 fsc(
const clipper::Xmap<float> &xmap_1,
const clipper::Xmap<float> &xmap_2);
590 power_scale(
const clipper::Xmap<float> &xmap_ref,
const clipper::Xmap<float> &xmap_for_scaling);
593 compare_structure_factors(
const clipper::Xmap<float> &xmap_1,
const clipper::Xmap<float> &xmap_2);
595 void flip_hand(clipper::Xmap<float> *xmap_p);
599 analyse_map_point_density_change(
const std::vector<std::pair<clipper::Xmap<float> *,
float> > &xmaps,
600 const clipper::Xmap<float> &xmap_for_mask);
602 clipper::Xmap<float> zero_dose_extrapolation(
const std::vector<std::pair<clipper::Xmap<float> *,
float> > &xmaps,
603 const clipper::Xmap<float> &xmap_for_mask);
605 clipper::Xmap<float> real_space_zero_dose_extrapolation(
const std::vector<clipper::Xmap<float> *> &xmaps,
606 const clipper::Xmap<float> &xmap_for_mask);
608 int split_residue_using_map(mmdb::Residue *residue_p, mmdb::Manager *mol,
const clipper::Xmap<float> &xmap);
610 std::vector<std::vector<float> >
611 get_density_on_cylinder(
const clipper::Coord_orth &pt_1,
const clipper::Coord_orth &pt_2,
612 const clipper::Coord_orth &pt_ref,
const clipper::Xmap<float> &xmap,
613 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:155
double sum_of_densities
sum of densities - for whatever use that may be.
Definition coot-map-utils.hh:157
float suggested_contour_level
suggested contour level
Definition coot-map-utils.hh:153
clipper::Coord_orth updated_centre
new centre
Definition coot-map-utils.hh:151
bool success
success flag
Definition coot-map-utils.hh:149