#include <processor.h>
Inheritance diagram for EMAN::AddRandomNoiseProcessor:


Public Member Functions | |
| virtual void | process_inplace (EMData *image) |
| To process an image in-place. | |
| virtual string | get_name () const |
| Get the processor's name. | |
| virtual TypeDict | get_param_types () const |
| Get processor parameter information in a dictionary. | |
| virtual string | get_desc () const |
| Get the descrition of this specific processor. | |
Static Public Member Functions | |
| Processor * | NEW () |
Static Public Attributes | |
| const string | NAME = "math.addspectralnoise" |
| n | ||
| x0 | ||
| dx | ||
| y | ||
| interpolation | ||
| seed | seed for random number generator |
Definition at line 4637 of file processor.h.
|
|
Get the descrition of this specific processor. This function must be overwritten by a subclass.
Implements EMAN::Processor. Definition at line 4664 of file processor.h. 04665 {
04666 return "add spectral noise to a complex image.";
04667 }
|
|
|
Get the processor's name. Each processor is identified by a unique name.
Implements EMAN::Processor. Definition at line 4642 of file processor.h. 04643 {
04644 return NAME;
04645 }
|
|
|
Get processor parameter information in a dictionary. Each parameter has one record in the dictionary. Each record contains its name, data-type, and description.
Reimplemented from EMAN::Processor. Definition at line 4652 of file processor.h. References EMAN::TypeDict::put(). 04653 {
04654 TypeDict d;
04655 d.put("n", EMObject::INT);
04656 d.put("x0", EMObject::FLOAT);
04657 d.put("dx", EMObject::FLOAT);
04658 d.put("y", EMObject::FLOATARRAY);
04659 d.put("interpolation", EMObject::INT);
04660 d.put("seed", EMObject::INT, "seed for random number generator");
04661 return d;
04662 }
|
|
|
Definition at line 4647 of file processor.h. 04648 {
04649 return new AddRandomNoiseProcessor();
04650 }
|
|
|
To process an image in-place. For those processors which can only be processed out-of-place, override this function to just print out some error message to remind user call the out-of-place version.
Implements EMAN::Processor. Definition at line 5413 of file processor.cpp. References EMAN::EMData::ap2ri(), EMAN::Util::fast_floor(), EMAN::EMData::get_data(), EMAN::Randnum::get_frand(), EMAN::Randnum::get_gauss_rand(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::Dict::has_key(), EMAN::Util::hypot3(), ImageFormatException, EMAN::Randnum::Instance(), EMAN::EMData::is_complex(), LOGERR, LOGWARN, nx, ny, rdata, EMAN::Randnum::set_seed(), sqrt(), EMAN::EMData::update(), and y. 05414 {
05415 if (!image) {
05416 LOGWARN("NULL Image");
05417 return;
05418 }
05419
05420 if (!image->is_complex()) {
05421 LOGERR("AddRandomNoise Processor only works for complex image");
05422 throw ImageFormatException("only work for complex image");
05423 }
05424
05425 int n = params["n"];
05426 float x0 = params["x0"];
05427 float dx = params["dx"];
05428 vector < float >y = params["y"];
05429
05430 int interpolation = 1;
05431 if (params.has_key("interpolation")) {
05432 interpolation = params["interpolation"];
05433 }
05434
05435 Randnum * randnum = Randnum::Instance();
05436 if(params.has_key("seed")) {
05437 randnum->set_seed((int)params["seed"]);
05438 }
05439
05440 int nx = image->get_xsize();
05441 int ny = image->get_ysize();
05442 int nz = image->get_zsize();
05443
05444 image->ap2ri();
05445 float *rdata = image->get_data();
05446
05447 size_t k = 0;
05448 float half_nz = 0;
05449 if (nz > 1) {
05450 half_nz = nz / 2.0f;
05451 }
05452
05453 const float sqrt_2 = sqrt((float) 2);
05454
05455 float r;
05456 for (int h = 0; h < nz; h++) {
05457 for (int j = 0; j < ny; j++) {
05458 for (int i = 0; i < nx; i += 2, k += 2) {
05459 r = (Util::hypot3(i / 2.0f, j - ny / 2.0f, h - half_nz));
05460 // r = sqrt(Util::hypot3(i / 2.0f, j - ny / 2.0f, h - half_nz)); // I don't think this sqrt was supposed to be here --steve
05461 r = (r - x0) / dx;
05462 int l = 0;
05463 if (interpolation) {
05464 l = Util::fast_floor(r);
05465 }
05466 else {
05467 l = Util::fast_floor(r + 0.5f);
05468 }
05469 r -= l;
05470 float f = 0;
05471 if (l >= n - 2) {
05472 f = y[n - 1];
05473 }
05474 else if (l < 0) {
05475 l = 0;
05476 }
05477 else {
05478 if (interpolation) {
05479 f = (y[l] * (1 - r) + y[l + 1] * r);
05480 }
05481 else {
05482 f = y[l];
05483 }
05484 }
05485 f = randnum->get_gauss_rand(sqrt(f), sqrt(f) / 3);
05486 float a = randnum->get_frand(0.0f, (float)(2 * M_PI));
05487 if (i == 0) {
05488 f *= sqrt_2;
05489 }
05490 rdata[k] += f * cos(a);
05491 rdata[k + 1] += f * sin(a);
05492 }
05493 }
05494 }
05495
05496 image->update();
05497 }
|
|
|
Definition at line 166 of file processor.cpp. |
1.3.9.1