double WeightedExcludedVolumeRestraint::unprotected_evaluate(
    DerivativeAccumulator *accum) const
{
    bool calc_deriv = accum? true: false;
    IMP_LOG_VERBOSE("before resample\n");
    // //generate the transformed maps
    // std::vector<DensityMap*> transformed_maps;
    // for(int rb_i=0;rb_i<rbs_.size();rb_i++){
    //   DensityMap *dm=create_density_map(
    //       atom::get_bounding_box(atom::Hierarchy(rbs_[rb_i])),spacing);
    //   get_transformed_into(
    //       rbs_surface_maps_[rb_i],
    //       rbs_[rb_i].get_transformation()*rbs_orig_trans_[rb_i],
    //       dm,
    //       false);
    //   transformed_maps.push_back(dm);
    // }
    double score=0.;
    // MRCReaderWriter mrw;
    // for(int i=0;i<transformed_maps.size();i++){
    //   std::stringstream ss;
    //   ss<<"transformed_map_"<<i<<".mrc";
    //   std::stringstream s1;
    //   s1<<"transformed_pdb_"<<i<<".pdb";
    //   atom::write_pdb(atom::Hierarchy(rbs_[i]),s1.str().c_str());
    //   write_map(transformed_maps[i],ss.str().c_str(),mrw);
    //   for(int j=i+1;j<transformed_maps.size();j++){
    //     if (get_interiors_intersect(transformed_maps[i],
    //                                 transformed_maps[j])){
    //     score += CoarseCC::cross_correlation_coefficient(
    //                              *transformed_maps[i],
    //                              *transformed_maps[j],1.,false,true);
    //     }
    //   }
    // }
    em::SurfaceShellDensityMaps resampled_surfaces;
    for(unsigned int i=0; i<rbs_.size(); i++) {
        kernel::ParticlesTemp rb_ps=rb_refiner_->get_refined(rbs_[i]);
        resampled_surfaces.push_back(new em::SurfaceShellDensityMap(rb_ps,1.));
    }
    for(unsigned int i=0; i<rbs_.size(); i++) {
        for(unsigned int j=i+1; j<rbs_.size(); j++) {
            if (get_interiors_intersect(resampled_surfaces[i],
                                        resampled_surfaces[j])) {
                score += em::CoarseCC::cross_correlation_coefficient(
                             resampled_surfaces[i],
                             resampled_surfaces[j],1.,true,FloatPair(0.,0.));
            }
        }
    }

    if (calc_deriv) {
        IMP_WARN("WeightedExcludedVolumeRestraint currently"
                 <<" does not support derivatives\n");
    }
    /*for(int i=resampled_surfaces.size()-1;i<0;i--){
      delete(resampled_surfaces[i]);
      }*/
    return score;
}
IntPairs QuadraticClosePairsFinder::get_close_pairs(
    const algebra::BoundingBox3Ds &bbs) const {
  set_was_used(true);
  IMP_OBJECT_LOG;
  IMP_LOG_TERSE("Adding close pairs from "
                << bbs.size() << " boxes with threshold " << get_distance()
                << std::endl);
  IntPairs ret;
  const double d2 = get_distance() / 2.0;
  for (unsigned int i = 0; i < bbs.size(); ++i) {
    algebra::BoundingBox3D bi = bbs[i] + d2;
    for (unsigned int j = 0; j < i; ++j) {
      algebra::BoundingBox3D bj = bbs[j] + d2;
      if (get_interiors_intersect(bi, bj)) {
        ret.push_back(IntPair(i, j));
      }
    }
  }
  return ret;
}
IntPairs NearestNeighborsClosePairsFinder::get_close_pairs(
    const algebra::BoundingBox3Ds &bas,
    const algebra::BoundingBox3Ds &bbs) const {
  set_was_used(true);
  IMP_OBJECT_LOG;
  IMP_LOG_TERSE("Quadratic add_close_pairs called with "
                << bas.size() << " and " << bbs.size() << std::endl);
  IntPairs ret;
  const double d2 = get_distance() / 2.0;
  for (unsigned int i = 0; i < bas.size(); ++i) {
    algebra::BoundingBox3D bi = bas[i] + d2;
    for (unsigned int j = 0; j < bbs.size(); ++j) {
      algebra::BoundingBox3D bj = bbs[j] + d2;
      if (get_interiors_intersect(bi, bj)) {
        ret.push_back(IntPair(i, j));
      }
    }
  }
  return ret;
}
Example #4
0
double CoarseCC::cross_correlation_coefficient(const DensityMap *grid1,
                                               const DensityMap *grid2,
                                               float grid2_voxel_data_threshold,
                                               bool allow_padding,
                                               FloatPair norm_factors) {
  IMP_LOG_VERBOSE("Going to calculate correlation score with values: "
                  << "grid2_voxel_data_threshold:" << grid2_voxel_data_threshold
                  << " allow_padding:" << allow_padding << " norm factors:"
                  << norm_factors.first << "," << norm_factors.second << "\n");
  // run validation checks
  const DensityHeader *grid2_header = grid2->get_header();
  const DensityHeader *grid1_header = grid1->get_header();

  IMP_INTERNAL_CHECK(
      grid2_header->dmax > grid2_voxel_data_threshold,
      "voxel_data_threshold: " << grid2_voxel_data_threshold
                               << " is not within the map range: "
                               << grid2_header->dmin << "-"
                               << grid2_header->dmax << std::endl);

  IMP_INTERNAL_CHECK(grid1_header->is_top_calculated(),
                     "Top should be calculated for grid1\n");

  IMP_INTERNAL_CHECK(grid2_header->is_top_calculated(),
                     "Top should be calculated for grid2\n");

  IMP_INTERNAL_CHECK(grid1->same_voxel_size(grid2),
                     "Both grids should have the same spacing\n");
  if (!allow_padding) {
    // additional validity checks
    IMP_USAGE_CHECK(
        grid1->same_dimensions(grid2),
        "This function cannot handle density maps of different size. "
            << "First map dimensions : " << grid1_header->get_nx() << " x "
            << grid1_header->get_ny() << " x " << grid1_header->get_nz() << "; "
            << "Second map dimensions: " << grid2_header->get_nx() << " x "
            << grid2_header->get_ny() << " x " << grid2_header->get_nz());
    IMP_USAGE_CHECK(
        grid1->same_voxel_size(grid2),
        "This function cannot handle density maps of different pixelsize. "
            << "First grid pixelsize : " << grid1_header->get_spacing() << "; "
            << "Second grid pixelsize: " << grid2_header->get_spacing());
    return cross_correlation_coefficient_internal(
        grid1, grid2, grid2_voxel_data_threshold, norm_factors);
  } else {
    IMP_LOG_VERBOSE("calculated correlation between padded maps\n");
    // create a padded version of the grids
    // copy maps to contain the same extent
    if (!get_interiors_intersect(get_bounding_box(grid1),
                                 get_bounding_box(grid2))) {
      return 0.;
    }
    algebra::BoundingBox3D merged_bb =
        get_bounding_box(grid1) + get_bounding_box(grid2);
    PointerMember<DensityMap> padded_grid1 =
        create_density_map(merged_bb, grid1_header->get_spacing());
    padded_grid1->add(grid1);
    padded_grid1->get_header_writable()->set_resolution(
        grid1->get_header()->get_resolution());
    PointerMember<DensityMap> padded_grid2 =
        create_density_map(merged_bb, grid2_header->get_spacing());
    padded_grid2->add(grid2);
    padded_grid2->get_header_writable()->set_resolution(
        grid2->get_header()->get_resolution());
    padded_grid1->calcRMS();
    padded_grid2->calcRMS();
    IMP_LOG_VERBOSE("calculate correlation internal " << std::endl);
    double score = cross_correlation_coefficient_internal(
        padded_grid1, padded_grid2, grid2_voxel_data_threshold, norm_factors);
    // release the padded versions of the grids
    return score;
  }
}