36 imagesBuffer =
nullptr;
44 delete[] imagesBuffer;
70 " [--mpi_job_size <size=10>] : Number of images sent to a cpu in a single job ");
73 " : if -1 the computer will fill the value for you");
75 " [--chunk_angular_distance <dist=-1>] : sample the projection sphere with this ");
77 " :using the voronoi regions");
79 " [--sym <cn=\"c1\">] : One of the 17 possible symmetries in");
81 " :single particle electronmicroscopy");
83 " :i.e. ci, cs, cn, cnv, cnh, sn, dn, dnv,");
85 " :dnh, t, td, th, o, oh, i1 (default MDB), i2, i3, i4, ih");
87 " :i1h (default MDB), i2h, i3h, i4h");
89 " : where n may change from 1 to 99");
97 imagesBuffer =
new size_t[mpi_job_size + 1];
98 chunk_angular_distance =
getDoubleParam(
"--chunk_angular_distance");
107 size_t finishingWorkers = 0;
108 size_t processedImages = 0, finishedImages = 0, totalImages =
DFexp.
size();
117 while (finishingWorkers < node->size - 1)
123 finishedImages += processedImages;
132 if (
verbose && processedImages > 0)
138 std::vector<size_t> imagesToProcess;
152 int node_index = last_chunk[node];
153 static bool reached_last_chunk =
false;
159 if (!reached_last_chunk)
161 node_index = chunk_index;
162 chunk_index = (chunk_index + 1) % chunk_number;
163 reached_last_chunk = (chunk_index == 0);
171 ++
i, chunk_index = (chunk_index + 1) % chunk_number)
175 if (i == chunk_number)
180 last_chunk[node] = node_index = chunk_index;
181 chunk_index = (chunk_index + 1) % chunk_number;
186 imagesToSent[0] = assigned_images;
190 for (
size_t i = 1;
i <= assigned_images; ++
i)
204 std::vector<size_t> &imagesToProcess)
206 static size_t numberOfImages = 0;
215 numberOfImages = imagesBuffer[0];
217 if (numberOfImages == 0)
220 imagesToProcess.clear();
221 for (
size_t i = 1;
i <= numberOfImages; ++
i)
222 imagesToProcess.push_back(imagesBuffer[
i]);
248 size_t max_number_of_images_in_around_a_sampling_point = 0;
252 (
String)
"mpi_angular_proj_match::prerun Invalid symmetry: " + fn_sym);
255 if (chunk_angular_distance == -1)
260 int remaining_points = 0;
262 while (remaining_points == 0)
265 chunk_mysampling.
setSampling(chunk_angular_distance);
276 if (chunk_angular_distance > 2)
277 chunk_angular_distance -= 1;
279 chunk_angular_distance /= 2;
282 std::cout <<
"New chunk_angular_distance " << chunk_angular_distance
284 if (chunk_angular_distance < 0)
286 "Can't compute chunk_angular_distance");
295 for (
int j = 0;
j < chunk_number;
j++)
297 if (max_number_of_images_in_around_a_sampling_point
299 max_number_of_images_in_around_a_sampling_point =
304 std::cout <<
"number of subsets: " << chunk_number << std::endl
305 <<
"biggest subset (EXPERIMENTAL images per chunk): " 306 << max_number_of_images_in_around_a_sampling_point << std::endl
307 <<
"maximun number of references in memory: " 311 if (mpi_job_size == -1)
312 mpi_job_size = (int)ceil((
double)
DFexp.
size()/(node->
size - 1));
316 last_chunk =
new int[node->
size];
317 for (
size_t i = 1;
i < node->
size; ++
i)
324 double non_reduntant_area_of_sphere =
327 double number_cpus = (double) node->
size - 1;
332 neighborhood_radius = 0;
336 if (counter++ > 1000)
338 chunk_angular_distance = 0.001;
339 std::cerr <<
"****************************************************" 341 std::cerr <<
"* WARNING: The neighbourhood does not fit in memory " 343 std::cerr <<
"****************************************************" 347 double area_chunk = non_reduntant_area_of_sphere / number_cpus;
349 chunk_angular_distance = acos(1 - area_chunk / (2 *
PI));
350 double area_chunck_neigh = 2 *
PI 351 * (1 - cos(chunk_angular_distance + neighborhood_radius));
356 double areaVoronoiRegionReferenceLibrary = 2 *( 3 *( acos(
359 auto number_of_images_that_fit_in_a_chunck_neigh =(int)
360 ceil(area_chunck_neigh / areaVoronoiRegionReferenceLibrary);
364 std::cerr <<
"\n\ncounter " << counter << std::endl;
365 std::cerr <<
"area_chunk " << area_chunk << std::endl;
366 std::cerr <<
"2*chunk_angular_distance " << 2*chunk_angular_distance << std::endl;
371 std::cerr <<
"neighborhood_radius " << neighborhood_radius
373 std::cerr <<
"areaVoronoiRegionReferenceLibrary " << areaVoronoiRegionReferenceLibrary << std::endl;
374 std::cerr <<
"number_of_images_that_fit_in_a_chunck_neigh " << number_of_images_that_fit_in_a_chunck_neigh << std::endl;
375 std::cerr <<
"number_cpus " << number_cpus << std::endl;
381 number_cpus = 1.2 * number_cpus;
386 chunk_angular_distance *= 2.0;
391 std::cerr <<
"chunk_angular_distance " << chunk_angular_distance
393 <<
"neighborhood_radius " << neighborhood_radius
398 if (chunk_angular_distance >= 0.5 *
cte_w)
399 chunk_angular_distance = 0.5 *
cte_w;
400 chunk_angular_distance *= (180. /
PI);
404 std::cerr <<
"chunk_angular_distance_degrees " << chunk_angular_distance
double nonRedundantProjectionSphere(int pgGroup, int pgOrder)
void computeChunkAngularDistance(int symmetry, int sym_order)
void init_progress_bar(long total)
std::vector< std::vector< size_t > > my_exp_img_per_sampling_point
void setSampling(double sampling)
void min(Image< double > &op1, const Image< double > &op2)
void removeRedundantPoints(const int symmetry, int sym_order)
WriteModeMetaData do_overwrite
double getDoubleParam(const char *param, int arg=0)
virtual void read(int argc, const char **argv, bool reportErrors=true)
#define REPORT_ERROR(nerr, ErrormMsg)
int readSymmetryFile(FileName fn_sym, double accuracy=SYM_ACCURACY)
virtual void readParams()
Read arguments from command line.
void processSomeImages(const std::vector< size_t > &imagesToProcess)
bool isSymmetryGroup(FileName fn_sym, int &pgGroup, int &pgOrder)
void findClosestExperimentalPoint()
virtual void defineParams()
Define arguments accepted.
bool requestJobs(std::vector< size_t > &imagesToProcess)
virtual void produceSideInfo()
void readParams()
Read arguments from command line.
void defineParams()
Define arguments accepted.
int argc
Original command line arguments.
void computeSamplingPoints(bool only_half_sphere=true, double max_tilt=180, double min_tilt=0)
const char * getParam(const char *param, int arg=0)
~MpiProgAngularProjectionMatching()
void progress_bar(long rlen)
Error related to numerical calculation.
double cos_neighborhood_radius
int verbose
Verbosity level.
void fillLRRepository(void)
bool distributeJobs(size_t *imagesToSent, int node)
int max_nr_refs_in_memory
int max_nr_imgs_in_memory
std::vector< Matrix1D< double > > no_redundant_sampling_points_angles
constexpr int TAG_JOB_REQUEST
void read(int argc, char **argv)
constexpr int TAG_JOB_REPLY
MpiProgAngularProjectionMatching()
void fillExpDataProjectionDirectionByLR(const MetaData &DFi)
void removePointsFarAwayFromExperimentalData()
int getIntParam(const char *param, int arg=0)
void gatherMetadatas(T &MD, const FileName &rootName)
Incorrect value received.
void addParamsLine(const String &line)