Xmipp  v3.23.11-Nereus
Public Types | Public Member Functions | Public Attributes | List of all members
ProgXrayImport Class Reference

#include <xray_import.h>

Inheritance diagram for ProgXrayImport:
Inheritance graph
[legend]
Collaboration diagram for ProgXrayImport:
Collaboration graph
[legend]

Public Types

enum  DataSource { NONE, GENERIC, MISTRAL, BESSY }
 Xray microscopy data origin;. More...
 

Public Member Functions

void init ()
 Constructor. More...
 
void readParams ()
 Read argument from command line. More...
 
void defineParams ()
 Define params. More...
 
void show () const
 Show. More...
 
void run ()
 
void readAndCrop (const FileName &fn, Image< double > &I, int xSize, int ySize) const
 Read an image and crop. More...
 
void readGeoInfo (const FileName &fn, MDRow &rowGeo) const
 Read geometrical info. More...
 
void readCorrectionInfo (const FileName &fn, double &currentBeam, double &expTime, double &slitWidth) const
 Read related data to normalize the tomogram. More...
 
void getDarkfield (const FileName &fnDir, Image< double > &IavgDark)
 
void getFlatfield (const FileName &fnDir, Image< double > &Iavg)
 
- Public Member Functions inherited from XmippProgram
const char * getParam (const char *param, int arg=0)
 
const char * getParam (const char *param, const char *subparam, int arg=0)
 
int getIntParam (const char *param, int arg=0)
 
int getIntParam (const char *param, const char *subparam, int arg=0)
 
double getDoubleParam (const char *param, int arg=0)
 
double getDoubleParam (const char *param, const char *subparam, int arg=0)
 
float getFloatParam (const char *param, int arg=0)
 
float getFloatParam (const char *param, const char *subparam, int arg=0)
 
void getListParam (const char *param, StringVector &list)
 
int getCountParam (const char *param)
 
bool checkParam (const char *param)
 
bool existsParam (const char *param)
 
void addParamsLine (const String &line)
 
void addParamsLine (const char *line)
 
ParamDefgetParamDef (const char *param) const
 
virtual void quit (int exit_code=0) const
 
virtual int tryRun ()
 
void initProgress (size_t total, size_t stepBin=60)
 
void setProgress (size_t value=0)
 
void endProgress ()
 
void processDefaultComment (const char *param, const char *left)
 
void setDefaultComment (const char *param, const char *comment)
 
virtual void initComments ()
 
void setProgramName (const char *name)
 
void addUsageLine (const char *line, bool verbatim=false)
 
void clearUsage ()
 
void addExampleLine (const char *example, bool verbatim=true)
 
void addSeeAlsoLine (const char *seeAlso)
 
void addKeywords (const char *keywords)
 
const char * name () const
 
virtual void usage (int verb=0) const
 
virtual void usage (const String &param, int verb=2)
 
int version () const
 
virtual void read (int argc, const char **argv, bool reportErrors=true)
 
virtual void read (int argc, char **argv, bool reportErrors=true)
 
void read (const String &argumentsLine)
 
 XmippProgram ()
 
 XmippProgram (int argc, const char **argv)
 
virtual ~XmippProgram ()
 

Public Attributes

FileName fnInput
 Input directory. More...
 
FileName fnFlat
 Input Flatfield directory. More...
 
FileName fnRoot
 Output directory. More...
 
FileName fnOut
 Output Stack file. More...
 
ImageInfo imgInfo
 Input image size. More...
 
int cropSizeX
 Number of pixels to crop from each side. Set to 0 for no cropping. More...
 
int cropSizeY
 
int cropSizeXi
 
int cropSizeYi
 
int cropSizeXe
 
int cropSizeYe
 
int thrNum
 Number of threads. More...
 
double BPFactor
 Bad pixel factor. More...
 
FileName fnBPMask
 bad Pixel filter Mask More...
 
bool extFlat
 Flag to apply external flat field correction. More...
 
bool darkFix
 Flag to apply dark field correction. More...
 
bool logFix
 Flag to apply log corrections. More...
 
bool selfAttFix
 Flag to apply self-attenuation corrections. More...
 
enum ProgXrayImport::DataSource dSource
 
size_t tIni
 Index number used in Bessy tomograms and flatfield images. More...
 
size_t tEnd
 
size_t fIni
 
size_t fEnd
 
XmippH5File H5File
 hdf5 file handler More...
 
double * vCBeam
 
double vExpTime
 
double vslitWidth
 
Matrix1D< double > expTimeArray
 
Matrix1D< double > cBeamArray
 
Matrix1D< double > slitWidthArray
 
Matrix1D< double > anglesArray
 
MetaDataDb inMD
 List of input images. More...
 
MetaDataDb outMD
 List of output images. More...
 
MetaDataDb fMD
 List of flatfield images. More...
 
Image< double > IavgFlat
 
Image< double > IavgDark
 
Image< char > bpMask
 
std::vector< FileNamefilenames
 
std::vector< size_t > objIds
 
ParallelTaskDistributortd
 
ThreadManagertm
 
Mutex mutex
 
- Public Attributes inherited from XmippProgram
bool doRun
 
bool runWithoutArgs
 
int verbose
 Verbosity level. More...
 
int debug
 

Additional Inherited Members

- Protected Member Functions inherited from XmippProgram
void defineCommons ()
 
- Protected Attributes inherited from XmippProgram
int errorCode
 
ProgramDefprogDef
 Program definition and arguments parser. More...
 
std::map< String, CommentListdefaultComments
 
int argc
 Original command line arguments. More...
 
const char ** argv
 

Detailed Description

Xray import parameters.

Definition at line 40 of file xray_import.h.

Member Enumeration Documentation

◆ DataSource

Xray microscopy data origin;.

Enumerator
NONE 
GENERIC 
MISTRAL 
BESSY 

Definition at line 70 of file xray_import.h.

Member Function Documentation

◆ defineParams()

void ProgXrayImport::defineParams ( )
virtual

Define params.

Reimplemented from XmippProgram.

Definition at line 34 of file xray_import.cpp.

35 {
36  addUsageLine("Preprocess X-ray micrograph to be used in tomographic reconstruction software");
37  addUsageLine(" ");
38  addUsageLine("+This program converts a single-axis tilt series coming from X-ray");
39  addUsageLine("+microscopy into a stack. Several corrections are applied ");
40  addUsageLine("+during this conversion including correction by the beam current, ");
41  addUsageLine("+the exposure time, and the slitwidth. The flatfield and a possible ");
42  addUsageLine("+darkfield are also corrected. The exact formula applied is");
43  addUsageLine("+ ");
44  addUsageLine("+ (I-darkfield)/(expTime*beamCurrent*slitWidth)",true);
45  addUsageLine("+Inormalized = -----------------------------------------------------------",true);
46  addUsageLine("+ Avg{(Iflatfield-darkfield)/(expTime*beamCurrent*slitWidth)}",true);
47  addUsageLine("+ ");
48  addUsageLine("+Because the intrinsic self-attenuation, X-ray projections are not optimal to be used ");
49  addUsageLine("+with EM 3D reconstruction algorithm. To fix that, use --log flag:");
50  addUsageLine("+ ");
51  addUsageLine("+log = log10(Inormalized)");
52  addUsageLine("+ ");
53  addUsageLine("+In addition to log correction, to apply a contrast inversion, which allows 3DEM ");
54  addUsageLine("+reconstruction algorithms returning volume coefficients close to the real expected ");
55  addUsageLine("+absorption values, use --correct flag:");
56  addUsageLine("+ ");
57  addUsageLine("+Icorrected = -log10(Inormalized)");
58  addUsageLine("+ ");
59  addUsageLine("+If darkfield/flatfield are not available, then they are not used for the correction.");
60  addUsageLine("+ ");
61  addUsageLine("+Specific flags to import tomo series from Mistral microscope (Alba synchrotron) and ");
62  addUsageLine("+U41-TXM (Bessy).");
63  addUsageLine("+ ");
64  addUsageLine("+In the general case, the flatfields and the the tilt series may be in any directory.");
65  addUsageLine("+ If the darkfield are available, they must be within the flatfield and the tilt");
66  addUsageLine("+series under a directory named darkfields (in small letters). For each");
67  addUsageLine("+SPE file there must be a positions file. For instance, the file myfile.spe");
68  addUsageLine("+must have in the same directory the file myfile-positions.txt. The");
69  addUsageLine("+exposure time, the beam current and the slit width are taken from this file.");
70  addUsageLine("+ ");
71  addUsageLine("+The exposure time is the parameter xm:ccd:exp_time, the beam current");
72  addUsageLine("+is sr:current, and the slit width is xm:mono:slitwidth. The tilt angle");
73  addUsageLine("+xm:sample:rx.");
74 
75  addParamsLine("[--input <input_directory> ] : Directory with tomograms, position files and, optionally, ");
76  addParamsLine(" : darkfields (in a directory called darkfields)");
77  addParamsLine("[--flat <ff_rootname=\"\">] : Directory with SPE images, position files and, optionally, ");
78  addParamsLine(" : darkfields (in a directory called darkfields).");
79  addParamsLine(" : This param can also be used with specific microscopes params to ");
80  addParamsLine(" : use a stack of flatfields to average, or an averaged flatfield image");
81  addParamsLine("[--oroot <output_rootname>] : Rootname for output files. If empty, input filename is taken.");
82  addParamsLine(" :+ The following files are created:");
83  addParamsLine(" :+ rootname.mrc: MRC stack with tilt series fully corrected as described above");
84  addParamsLine(" :+ rootname_darkfield.xmp: darkfield for the tilt series");
85  addParamsLine(" :+ rootname_flatfields_darkfield.xmp: darkfield of the flatfields");
86  addParamsLine(" :+ rootname_flatfields_avg.xmp: average flatfield corrected by its darkfield");
87  addParamsLine(" :+ rootname.xmd: selfile with the images in the stack");
88  addParamsLine(" :+ rootname.tlt: list of angles");
89  addParamsLine(" [--crop <sizeX=0> <sizeY=sizeX>] : Number of pixels to crop from each side");
90  addParamsLine(" : This is used to avoid some black pixels of some cameras");
91  addParamsLine(" [--thr <N=1>] : Number of threads");
92  addParamsLine(" == Specific microscopes ");
93  addParamsLine("[--bessy <input_directory> <t_ini> <t_end> <f_ini> <f_end> ] : Directory with raw SPE images and position files acquired in ");
94  addParamsLine(" : Bessy X-ray microscope:");
95  addParamsLine(" : t_ini and t_end denotes the range of the tomogram images, and");
96  addParamsLine(" : f_ini and f_end denotes the range of the flatfield images stored in the same directory");
97  addParamsLine("[--mistral <input_file>] : hdf5 Nexus file acquired in Mistral microscope at Alba, which contains all data");
98  addParamsLine(" == Filters ");
99  addParamsLine(" [--bad_pixels <type=factor>] : Apply a boundaries median filter to bad pixels");
100  addParamsLine(" where <type> ");
101  addParamsLine(" factor <k=3.> : Applied at those pixels below [mean - k*std]");
102  addParamsLine(" mask <mask_file> : Applied at those pixels given by mask");
103  addParamsLine(" none : Do not apply the filter");
104  addParamsLine(" [--log] : Apply log to pixel values");
105  addParamsLine(" alias -l;");
106  addParamsLine(" [--correct] : Correct for the self-attenuation of X-ray projections applying ");
107  addParamsLine(" : log and multiplying by -1");
108  addParamsLine(" alias -c;");
109  addExampleLine("Standard call for spe files classified in folders is:",false);
110  addExampleLine("xmipp_xray_import --data 10s --flat flatfields --oroot ProcessedData/img --crop 7");
111  addExampleLine("Importing data from Alba synchrotron:",false);
112  addExampleLine("xmipp_xray_import --mistral tomogram.hdf5 --oroot imported_tomogram");
113  addExampleLine("Correcting for self-áttenuation and cropping:",false);
114  addExampleLine("xmipp_xray_import --mistral tomogram.hdf5 --oroot imported_tomogram --correct --crop 10");
115 }
void addExampleLine(const char *example, bool verbatim=true)
void addUsageLine(const char *line, bool verbatim=false)
void addParamsLine(const String &line)

◆ getDarkfield()

void ProgXrayImport::getDarkfield ( const FileName fnDir,
Image< double > &  IavgDark 
)

Get the darkfield for a directory. In case there is no darkfield a message is shown and the output image is empty.

Definition at line 292 of file xray_import.cpp.

293 {
294  IavgDark.clear();
295  std::vector<FileName> listDir;
296  fnDir.getFiles(listDir);
297 
298  for (size_t i=0; i<listDir.size(); i++)
299  if (listDir[i]=="darkfields")
300  {
301  std::cout << formatString("Getting darkfield from %s/darkfields",fnDir.c_str()) << " ..." << std::endl;
302 
303  darkFix = true;
304  std::vector<FileName> listDirDark;
305  FileName(fnDir+"/darkfields").getFiles(listDirDark);
306  int N = 0;
307 
308  for (size_t j=0; j<listDirDark.size(); j++)
309  {
310  if (!listDirDark[j].hasImageExtension())
311  continue;
312  Image<double> Iaux;
313  readAndCrop(fnDir+"/darkfields/"+listDirDark[j],Iaux, cropSizeX, cropSizeY);
314  if (N==0)
315  IavgDark()=Iaux();
316  else
317  IavgDark()+=Iaux();
318  N++;
319  }
320  if (N==0)
321  REPORT_ERROR(ERR_IO_NOTEXIST,"darkfields directory is empty");
322  IavgDark()*=1.0/N;
323  break;
324  }
325 }
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
Image< double > IavgDark
Definition: xray_import.h:93
bool darkFix
Flag to apply dark field correction.
Definition: xray_import.h:64
int cropSizeX
Number of pixels to crop from each side. Set to 0 for no cropping.
Definition: xray_import.h:54
void readAndCrop(const FileName &fn, Image< double > &I, int xSize, int ySize) const
Read an image and crop.
#define i
void getFiles(std::vector< FileName > &files) const
File or directory does not exist.
Definition: xmipp_error.h:136
#define j
String formatString(const char *format,...)
void clear()
Definition: xmipp_image.h:144

◆ getFlatfield()

void ProgXrayImport::getFlatfield ( const FileName fnDir,
Image< double > &  Iavg 
)

Get the corrected average of a directory. If there is a darkfield, a file called fnRoot+"_"+fnDir+"_darkfield.xmp" is saved.

Definition at line 327 of file xray_import.cpp.

329 {
330 
331  // Process the flatfield images
332 
333 
334  MultidimArray<double> &mdaIavg = Iavg();
335 
337 
338  DataSource ldSource = dSource;
339 
340  // Checking if fnFFinput is a single file to obtain the flatfield avg from
341  if (extFlat && isImage(fnFFinput))
342  {
343  fMD.read(fnFFinput);
344  ldSource = NONE;
345  }
346  else
347  {
348  switch (ldSource)
349  {
350  case MISTRAL:
351  if (!H5File.checkDataset(fnFFinput.getBlockName().c_str()))
352  break;
353  {
354  fMD.read(fnFFinput);
355  H5File.getDataset("NXtomo/instrument/bright_field/ExpTimes", expTimeArray, false);
356  H5File.getDataset("NXtomo/instrument/bright_field/current", cBeamArray, false);
357 
358  // If expTime is empty or only one single value in nexus file then we fill with 1
359  if (expTimeArray.size() < 2)
360  {
361  reportWarning("Input file does not contains flatfields' exposition time information.");
362  expTimeArray.initConstant(fMD.size(), 1.);
363  }
364  // If current is empty or only one single value in nexus file then we fill with 1
365  if (cBeamArray.size() < 2)
366  {
367  reportWarning("Input file does not contains flatfields' current beam information.");
368  cBeamArray.initConstant(fMD.size(), 1.);
369  }
370 
371  }
372 
373  // Since Alba does not provide slit width, we set to ones
374  slitWidthArray.initConstant(fMD.size(), 1.);
375 
376  break;
377  case BESSY:
378  {
379  size_t objId;
380 
381  for (size_t i = fIni; i <= fEnd; ++i)
382  {
383  objId = fMD.addObject();
384  fMD.setValue(MDL_IMAGE, fnFFinput + formatString("/img%d.spe", i), objId);
385  }
386  break;
387  }
388  case GENERIC:
389  {
390  // Get Darkfield
391  std::cout << "Getting darkfield from "+fnFFinput << " ..." << std::endl;
392  getDarkfield(fnFFinput, IavgDark);
393  if (darkFix)
394  IavgDark.write(fnRoot+"_"+fnFFinput.removeDirectories()+"_darkfield.xmp");
395 
396  std::vector<FileName> listDir;
397  fnFFinput.getFiles(listDir);
398  size_t objId;
399 
400  for (size_t i = 0; i < listDir.size(); ++i)
401  {
402  if (!listDir[i].hasImageExtension())
403  continue;
404  objId = fMD.addObject();
405  fMD.setValue(MDL_IMAGE, fnFFinput+"/"+listDir[i], objId);
406  }
407  }
408  break;
409  }
410  }
411 
412  if ( fMD.size() == 0 )
413  {
414  reportWarning("XrayImport::getFlatfield: No images to process");
415  return;
416  }
417 
418  ImageInfo imFFInfo;
419 
420  getImageInfo(fMD, imFFInfo);
421 
422  if ( (imFFInfo.adim.xdim != imgInfo.adim.xdim) || (imFFInfo.adim.ydim != imgInfo.adim.ydim) )
423  {
424  reportWarning(formatString("XrayImport:: Flatfield images size %dx%d different from Tomogram images size %dx%d",
425  imFFInfo.adim.xdim,imFFInfo.adim.ydim,imgInfo.adim.xdim,imgInfo.adim.ydim));
426  std::cout << "Setting crop values to fit the smallest dimensions." <<std::endl;
427 
428  // This shift in the crop sizes is exclusive of Mistral data
431  cropSizeXe = cropSizeXi - 2;
432  cropSizeYe = cropSizeYi - 2;
433  }
434 
435  int cropX = (imFFInfo.adim.xdim - (imgInfo.adim.xdim-cropSizeXi-cropSizeXe))/2;// - 1;
436  int cropY = (imFFInfo.adim.ydim - (imgInfo.adim.ydim-cropSizeYi-cropSizeYe))/2;// - 1;
437 
438 
439  int N = 0;
440  Image<double> Iaux;
441  FileName fnImg;
442 
443  for (size_t objId : fMD.ids())
444  {
445  fMD.getValue(MDL_IMAGE, fnImg, objId);
446 
447  readAndCrop(fnImg, Iaux, cropX, cropY);
448 
449 
450  if ( darkFix )
451  {
452  Iaux() -= IavgDark();
453  forcePositive(Iaux());
454  }
455 
456  double currentBeam = 1;
457  double expTime = 1;
458  double slitWidth = 1;
459 
460  switch (ldSource)
461  {
462  case MISTRAL:
463  {
464  size_t idx = fnImg.getPrefixNumber();
465  currentBeam = dMi(cBeamArray, idx-1);
466  expTime = dMi(expTimeArray, idx-1);
467  slitWidth = dMi(slitWidthArray, idx-1);
468  }
469  break;
470  case BESSY:
471  case GENERIC:
472  readCorrectionInfo(fnImg, currentBeam, expTime, slitWidth);
473  break;
474  default:
475  break;
476  }
477 
478  Iaux() *= 1.0/(currentBeam*expTime*slitWidth);
479 
480  if ( N == 0 )
481  mdaIavg = Iaux();
482  else
483  mdaIavg += Iaux();
484  N++;
485  }
486 
487  darkFix = false; // We reset just in case there is no dark field for tomo images
488 
489  if (0 == N) {
490  REPORT_ERROR(ERR_NUMERICAL, "N is zero (0), which would lead to division by zero");
491  }
492  mdaIavg/=N;
493 
494  /* Create a mask with zero valued pixels to apply boundaries median filter
495  * to avoid dividing by zero when normalizing */
496 
498 
499  if ( !fnBPMask.empty() && !mdaIavg.sameShape(mdaMask) )
500  REPORT_ERROR(ERR_MULTIDIM_SIZE, "XrayImport: Mask size does not match flat fields size.");
501 
502  if (BPFactor > 0)
503  {
504  double avg, std;
505  mdaIavg.computeAvgStdev(avg, std);
506  mdaMask.resize(mdaIavg, false);
507 
508  double th = avg - std*BPFactor;
510  dAi(mdaMask, n) = dAi(mdaIavg, n) < th;
511  }
512  else if (fnBPMask.empty())
513  mdaIavg.equal(0,mdaMask);
514 
515  MultidimArray<char> mask = mdaMask;
516  boundMedianFilter(mdaIavg,mask);
517 }
enum ProgXrayImport::DataSource dSource
#define dAi(v, i)
Matrix1D< double > slitWidthArray
Definition: xray_import.h:82
void min(Image< double > &op1, const Image< double > &op2)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
size_t xdim
void reportWarning(const String &what)
void forcePositive(MultidimArray< double > &V)
Definition: filters.cpp:3506
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
size_t size() const
Definition: matrix1d.h:508
Image< double > IavgDark
Definition: xray_import.h:93
bool darkFix
Flag to apply dark field correction.
Definition: xray_import.h:64
bool getValue(MDObject &mdValueOut, size_t id) const override
FileName fnBPMask
bad Pixel filter Mask
Definition: xray_import.h:60
int cropSizeX
Number of pixels to crop from each side. Set to 0 for no cropping.
Definition: xray_import.h:54
void write(const FileName &name="", size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST, int _swapWrite=0)
void computeAvgStdev(U &avg, U &stddev) const
#define MULTIDIM_ARRAY(v)
FileName removeDirectories(int keep=0) const
double BPFactor
Bad pixel factor.
Definition: xray_import.h:58
Incorrect MultidimArray size.
Definition: xmipp_error.h:174
virtual IdIteratorProxy< false > ids()
ImageInfo imgInfo
Input image size.
Definition: xray_import.h:52
void readAndCrop(const FileName &fn, Image< double > &I, int xSize, int ySize) const
Read an image and crop.
#define i
void getImageInfo(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, DataType &datatype, MDLabel image_label)
bool checkDataset(const char *dsname) const
Definition: xmipp_hdf5.cpp:121
size_t addObject() override
XmippH5File H5File
hdf5 file handler
Definition: xray_import.h:80
size_t getPrefixNumber(size_t pos=0) const
Matrix1D< double > expTimeArray
Definition: xray_import.h:82
bool sameShape(const MultidimArrayBase &op) const
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
Error related to numerical calculation.
Definition: xmipp_error.h:179
void equal(T op1, MultidimArray< char > &result) const
void readCorrectionInfo(const FileName &fn, double &currentBeam, double &expTime, double &slitWidth) const
Read related data to normalize the tomogram.
ArrayDim adim
MetaDataDb fMD
List of flatfield images.
Definition: xray_import.h:89
size_t size() const override
#define dMi(v, i)
Definition: matrix1d.h:246
void getDarkfield(const FileName &fnDir, Image< double > &IavgDark)
Image< char > bpMask
Definition: xray_import.h:94
bool extFlat
Flag to apply external flat field correction.
Definition: xray_import.h:62
void boundMedianFilter(MultidimArray< T > &V, const MultidimArray< char > &mask, int n=0)
Definition: filters.h:1309
bool setValue(const MDObject &mdValueIn, size_t id) override
Definition: metadata_db.cpp:90
Matrix1D< double > cBeamArray
Definition: xray_import.h:82
DataSource
Xray microscopy data origin;.
Definition: xray_import.h:70
String formatString(const char *format,...)
void read(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=NULL, bool decomposeStack=true) override
FileName fnRoot
Output directory.
Definition: xray_import.h:48
size_t ydim
void initConstant(T val)
Definition: matrix1d.cpp:83
int * n
Name of an image (std::string)
int getDataset(const char *dsname, Matrix1D< double > &data, bool reportError=true) const
Definition: xmipp_hdf5.cpp:137
bool isImage(const FileName &name)

◆ init()

void ProgXrayImport::init ( void  )

Constructor.

Definition at line 119 of file xray_import.cpp.

120 {
121  tIni = tEnd = fIni = fEnd = 0;
122  extFlat = darkFix = false;
123  BPFactor = 0;
124  dSource = NONE;
125 }
enum ProgXrayImport::DataSource dSource
bool darkFix
Flag to apply dark field correction.
Definition: xray_import.h:64
double BPFactor
Bad pixel factor.
Definition: xray_import.h:58
size_t tIni
Index number used in Bessy tomograms and flatfield images.
Definition: xray_import.h:78
bool extFlat
Flag to apply external flat field correction.
Definition: xray_import.h:62

◆ readAndCrop()

void ProgXrayImport::readAndCrop ( const FileName fn,
Image< double > &  I,
int  xSize,
int  ySize 
) const

Read an image and crop.

Definition at line 197 of file xray_import.cpp.

198 {
199  I.read(fn);
200  I().selfWindow(yCropSize,xCropSize,
201  (int)(YSIZE(I())-yCropSize-1),(int)(XSIZE(I())-xCropSize-1));
202 
203  I().resetOrigin();
204 }
#define YSIZE(v)
#define XSIZE(v)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)

◆ readCorrectionInfo()

void ProgXrayImport::readCorrectionInfo ( const FileName fn,
double &  currentBeam,
double &  expTime,
double &  slitWidth 
) const

Read related data to normalize the tomogram.

Definition at line 250 of file xray_import.cpp.

252 {
253  FileName fnBase = fn.withoutExtension();
254  std::ifstream fhPosition;
255  fhPosition.open((fnBase+"-positions.txt").c_str());
256 
257  if (!fhPosition)
258  REPORT_ERROR(ERR_IO_NOTEXIST,fnBase+"-positions.txt");
259  int itemsFound = 0;
260  std::string line;
261  std::vector<std::string> tokens;
262 
263  while (!fhPosition.eof())
264  {
265  getline(fhPosition,line);
266  splitString(line," ",tokens);
267  if (tokens[0]=="sr:current")
268  {
269  currentBeam = textToFloat(tokens[1]);
270  itemsFound++;
271  }
272  else if (tokens[0]=="xm:ccd:exp_time")
273  {
274  expTime = textToFloat(tokens[1]);
275  itemsFound++;
276  }
277  else if (tokens[0]=="xm:mono:slitwidth")
278  {
279  slitWidth = textToFloat(tokens[1]);
280  itemsFound++;
281  }
282  if (itemsFound==3)
283  break;
284  }
285  fhPosition.close();
286 
287  if ( itemsFound != 3 )
288  REPORT_ERROR(ERR_VALUE_EMPTY,(std::string)"Cannot find all parameters in "+
289  fnBase+"-positions.txt");
290 }
Empty value.
Definition: xmipp_error.h:194
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
float textToFloat(const char *str)
int splitString(const String &input, const String &delimiter, StringVector &results, bool includeEmpties)
File or directory does not exist.
Definition: xmipp_error.h:136
FileName withoutExtension() const

◆ readGeoInfo()

void ProgXrayImport::readGeoInfo ( const FileName fn,
MDRow rowGeo 
) const

Read geometrical info.

Definition at line 207 of file xray_import.cpp.

208 {
209  double tiltAngle;
210 
211  switch (dSource)
212  {
213  case MISTRAL:
214  tiltAngle = dMi(anglesArray, fn.getPrefixNumber()-1);
215  break;
216  case BESSY:
217  case GENERIC:
218  {
219  FileName fnBase = fn.withoutExtension();
220  std::ifstream fhPosition;
221  fhPosition.open((fnBase+"-positions.txt").c_str());
222  if (!fhPosition)
223  REPORT_ERROR(ERR_IO_NOTEXIST,fnBase+"-positions.txt");
224  int itemsFound=0;
225  std::string line;
226  std::vector<std::string> tokens;
227  while (!fhPosition.eof())
228  {
229  getline(fhPosition,line);
230  splitString(line," ",tokens);
231  if (tokens[0]=="xm:sample:rx")
232  {
233  tiltAngle=textToFloat(tokens[1]);
234  itemsFound++;
235  }
236  if (itemsFound==1)
237  break;
238  }
239  fhPosition.close();
240  if (itemsFound!=1)
241  REPORT_ERROR(ERR_VALUE_EMPTY,(std::string)"Cannot find tilt angle in "+
242  fnBase+"-positions.txt");
243  }
244  break;
245  }
246 
247  rowGeo.setValue(MDL_ANGLE_TILT, tiltAngle);
248 }
enum ProgXrayImport::DataSource dSource
Empty value.
Definition: xmipp_error.h:194
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
Tilting angle of an image (double,degrees)
float textToFloat(const char *str)
int splitString(const String &input, const String &delimiter, StringVector &results, bool includeEmpties)
size_t getPrefixNumber(size_t pos=0) const
File or directory does not exist.
Definition: xmipp_error.h:136
#define dMi(v, i)
Definition: matrix1d.h:246
void setValue(MDLabel label, const T &d, bool addLabel=true)
FileName withoutExtension() const
Matrix1D< double > anglesArray
Definition: xray_import.h:82

◆ readParams()

void ProgXrayImport::readParams ( )
virtual

Read argument from command line.

Reimplemented from XmippProgram.

Definition at line 128 of file xray_import.cpp.

129 {
130 
131  if (checkParam("--mistral"))
132  {
133  fnInput = getParam("--mistral");
134  fnFlat = "NXtomo/instrument/bright_field/data@" + fnInput;
135  dSource = MISTRAL;
136  }
137  else if (checkParam("--bessy"))
138  {
139  fnInput = getParam("--bessy", 0);
140  tIni = getIntParam("--bessy", 1);
141  tEnd = getIntParam("--bessy", 2);
142  fIni = getIntParam("--bessy", 3);
143  fEnd = getIntParam("--bessy", 4);
144  fnFlat = fnInput;
145  dSource = BESSY;
146  }
147  else
148  {
149  fnInput = getParam("--input");
150  dSource = GENERIC;
151  }
152  // If --flat is passed it forces the use of this flatfield
153  if (checkParam("--flat"))
154  {
155  fnFlat = getParam("--flat");
156  extFlat = true;
157  }
158 
159  fnRoot = getParam("--oroot");
160  cropSizeX = getIntParam("--crop");
161 
162  if ( STR_EQUAL(getParam("--crop", 1), "sizeX") )
164  else
165  cropSizeY = getIntParam("--crop",1);
166 
167 
168  thrNum = getIntParam("--thr");
169 
170  String tempString = getParam("--bad_pixels");
171  if (tempString == "factor")
172  BPFactor = getDoubleParam("--bad_pixels", 1);
173  else if (tempString == "mask")
174  fnBPMask = getParam("--bad_pixels",1);
175  else
176  BPFactor = -1;
177 
178  selfAttFix = checkParam("--correct");
179  logFix = selfAttFix? true : checkParam("--log");
180 }
enum ProgXrayImport::DataSource dSource
FileName fnFlat
Input Flatfield directory.
Definition: xray_import.h:46
double getDoubleParam(const char *param, int arg=0)
FileName fnBPMask
bad Pixel filter Mask
Definition: xray_import.h:60
int cropSizeX
Number of pixels to crop from each side. Set to 0 for no cropping.
Definition: xray_import.h:54
FileName fnInput
Input directory.
Definition: xray_import.h:44
bool logFix
Flag to apply log corrections.
Definition: xray_import.h:66
double BPFactor
Bad pixel factor.
Definition: xray_import.h:58
const char * getParam(const char *param, int arg=0)
#define STR_EQUAL(str1, str2)
Definition: xmipp_strings.h:42
size_t tIni
Index number used in Bessy tomograms and flatfield images.
Definition: xray_import.h:78
bool extFlat
Flag to apply external flat field correction.
Definition: xray_import.h:62
std::string String
Definition: xmipp_strings.h:34
FileName fnRoot
Output directory.
Definition: xray_import.h:48
bool checkParam(const char *param)
int thrNum
Number of threads.
Definition: xray_import.h:56
bool selfAttFix
Flag to apply self-attenuation corrections.
Definition: xray_import.h:68
int getIntParam(const char *param, int arg=0)

◆ run()

void ProgXrayImport::run ( )
virtual

Really import

Reimplemented from XmippProgram.

Definition at line 609 of file xray_import.cpp.

610 {
611  // Delete output stack if it exists
612  fnOut = fnRoot + ".mrc";
613  fnOut.deleteFile();
614 
615  /* Turn off error handling */
616  H5Eset_auto(H5E_DEFAULT, NULL, NULL);
617 
618  if (dSource == MISTRAL)
619  H5File.openFile(fnInput, H5F_ACC_RDONLY);
620 
621 
622  // Reading bad pixels mask
623  if ( !fnBPMask.empty() )
624  {
625  std::cerr << "Reading bad pixels mask from "+fnBPMask << "." << std::endl;
627  if ( (cropSizeX + cropSizeY ) > 0 )
628  bpMask().selfWindow(cropSizeY,cropSizeX,
629  (int)(YSIZE(bpMask())-cropSizeY-1),(int)(XSIZE(bpMask())-cropSizeX-1));
630  STARTINGX(bpMask()) = STARTINGY(bpMask()) = 0;
631  }
632 
633 
634  // Setting the image projections list
635  switch (dSource)
636  {
637  case MISTRAL:
638  {
639  inMD.read(fnInput);
640  H5File.getDataset("NXtomo/data/rotation_angle", anglesArray, false);
641  H5File.getDataset("NXtomo/instrument/sample/ExpTimes", expTimeArray, false);
642  H5File.getDataset("NXtomo/instrument/sample/current", cBeamArray);
643 
644  /* In case there is no angles information we set them to to an increasing sequence
645  * just to be able to continue importing data */
646  if ( anglesArray.size() != inMD.size() )
647  {
648  reportWarning("Input file does not contains angle information. Default sequence used.");
651  }
652 
653  // If expTime is empty or only one single value in nexus file then we fill with 1
654  if (expTimeArray.size() < 2)
655  {
656  reportWarning("Input file does not contains tomogram exposition time information.");
658  }
659  // If current is empty or only one single value in nexus file then we fill with 1
660  if (cBeamArray.size() < 2)
661  {
662  reportWarning("Input file does not contains tomogram current beam information.");
664  }
665  // Since Alba does not provide slit width, we set to ones
667  }
668  break;
669  case BESSY:
670  {
671  size_t objId;
672 
673  for (size_t i = tIni; i <= tEnd; ++i)
674  {
675  objId = inMD.addObject();
676  inMD.setValue(MDL_IMAGE, fnInput + formatString("/img%d.spe", i), objId);
677  }
678  break;
679  }
680  case GENERIC:
681  {
682  // Get Darkfield
683  std::cerr << "Getting darkfield from "+fnInput << " ..." << std::endl;
685  if (XSIZE(IavgDark())!=0)
686  IavgDark.write(fnRoot+"_darkfield.xmp");
687 
688 
689  std::vector<FileName> listDir;
690  fnInput.getFiles(listDir);
691  size_t objId;
692 
693  for (size_t i = 0; i < listDir.size(); ++i)
694  {
695  if (!listDir[i].hasImageExtension())
696  continue;
697  objId = inMD.addObject();
698  inMD.setValue(MDL_IMAGE, fnInput+"/"+listDir[i], objId);
699  }
700  }
701  break;
702  }
703 
705  size_t nIm = inMD.size();
706 
707  // Create empty output stack file
708 
710 
711 
712  /* Get the flatfield:: We get the FF after the image list because we need the image size to adapt the FF
713  * in case they were already cropped.
714  */
715  if (!fnFlat.empty())
716  {
717  std::cout << "Getting flatfield from "+fnFlat << " ..." << std::endl;
719  if ( XSIZE(IavgFlat()) != 0 )
720  {
721  FileName ffName = fnRoot+"_flatfield_avg.xmp";
722  IavgFlat.write(ffName);
723  fMD.setValue(MDL_IMAGE, ffName, fMD.addObject());
724  }
725  }
726 
728 
729  // Process images
730  td = new ThreadTaskDistributor(nIm, XMIPP_MAX(1, nIm/30));
731  tm = new ThreadManager(thrNum, this);
732  std::cerr << "Getting data from " << fnInput << " ...\n";
733  init_progress_bar(nIm);
734  tm->run(runThread);
735  progress_bar(nIm);
736 
737  // Write Metadata and angles
738  MetaDataDb MDSorted;
739  MDSorted.sort(outMD,MDL_ANGLE_TILT);
740  MDSorted.write("tomo@"+fnRoot + ".xmd");
741  if ( fMD.size() > 0 )
742  fMD.write("flatfield@"+fnRoot + ".xmd", MD_APPEND);
743 
744  // We also reference initial and final images at 0 degrees for Mistral tomograms
745  if ( dSource == MISTRAL )
746  {
747  fMD.clear();
748  FileName degree0Fn = "NXtomo/instrument/sample/0_degrees_initial_image";
749  if ( H5File.checkDataset(degree0Fn.c_str()))
750  fMD.setValue(MDL_IMAGE, degree0Fn + "@" + fnInput, fMD.addObject());
751  degree0Fn = "NXtomo/instrument/sample/0_degrees_final_image";
752  if ( H5File.checkDataset(degree0Fn.c_str()))
753  fMD.setValue(MDL_IMAGE, degree0Fn + "@" + fnInput, fMD.addObject());
754  if ( fMD.size() > 0 )
755  fMD.write("degree0@"+fnRoot + ".xmd", MD_APPEND);
756  }
757 
758  // Write tlt file for IMOD
759  std::ofstream fhTlt;
760  fhTlt.open((fnRoot+".tlt").c_str());
761  if (!fhTlt)
763  for (size_t objId : MDSorted.ids())
764  {
765  double tilt;
766  MDSorted.getValue(MDL_ANGLE_TILT,tilt,objId);
767  fhTlt << tilt << std::endl;
768  }
769  fhTlt.close();
770  delete td;
771  delete tm;
772 }
enum ProgXrayImport::DataSource dSource
MetaDataDb outMD
List of output images.
Definition: xray_import.h:87
void run(ThreadFunction function, void *data=NULL)
void init_progress_bar(long total)
Matrix1D< double > slitWidthArray
Definition: xray_import.h:82
#define YSIZE(v)
#define XMIPP_MAX(x, y)
Definition: xmipp_macros.h:193
FileName fnFlat
Input Flatfield directory.
Definition: xray_import.h:46
size_t xdim
void reportWarning(const String &what)
void getFlatfield(const FileName &fnDir, Image< double > &Iavg)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
size_t size() const
Definition: matrix1d.h:508
std::vector< size_t > objIds
Definition: xray_import.h:96
void openFile(const H5std_string &name, unsigned int flags, const H5::FileAccPropList &access_plist=H5::FileAccPropList::DEFAULT)
Definition: xmipp_hdf5.cpp:112
void findObjects(std::vector< size_t > &objectsOut, const MDQuery &query) const override
Image< double > IavgDark
Definition: xray_import.h:93
bool getValue(MDObject &mdValueOut, size_t id) const override
Tilting angle of an image (double,degrees)
Couldn&#39;t write to file.
Definition: xmipp_error.h:140
FileName fnBPMask
bad Pixel filter Mask
Definition: xray_import.h:60
int cropSizeX
Number of pixels to crop from each side. Set to 0 for no cropping.
Definition: xray_import.h:54
void write(const FileName &name="", size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST, int _swapWrite=0)
FileName fnInput
Input directory.
Definition: xray_import.h:44
Image< double > IavgFlat
Definition: xray_import.h:92
void enumerate()
Definition: matrix1d.cpp:98
FileName fnOut
Output Stack file.
Definition: xray_import.h:50
virtual IdIteratorProxy< false > ids()
ImageInfo imgInfo
Input image size.
Definition: xray_import.h:52
#define STARTINGX(v)
#define i
void getFiles(std::vector< FileName > &files) const
#define STARTINGY(v)
void getImageInfo(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, DataType &datatype, MDLabel image_label)
bool checkDataset(const char *dsname) const
Definition: xmipp_hdf5.cpp:121
size_t addObject() override
XmippH5File H5File
hdf5 file handler
Definition: xray_import.h:80
Matrix1D< double > expTimeArray
Definition: xray_import.h:82
#define XSIZE(v)
ThreadManager * tm
Definition: xray_import.h:101
void progress_bar(long rlen)
MetaDataDb inMD
List of input images.
Definition: xray_import.h:85
void clear() override
Definition: metadata_db.cpp:54
void createEmptyFile(const FileName &filename, int xdim, int ydim, int Zdim, size_t select_img, bool isStack, int mode, int _swapWrite, const MDRowVec *md)
ArrayDim adim
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const override
MetaDataDb fMD
List of flatfield images.
Definition: xray_import.h:89
size_t size() const override
void deleteFile() const
void getDarkfield(const FileName &fnDir, Image< double > &IavgDark)
size_t tIni
Index number used in Bessy tomograms and flatfield images.
Definition: xray_import.h:78
Image< char > bpMask
Definition: xray_import.h:94
void sort(MetaDataDb &MDin, const MDLabel sortLabel, bool asc=true, int limit=-1, int offset=0)
bool setValue(const MDObject &mdValueIn, size_t id) override
Definition: metadata_db.cpp:90
Matrix1D< double > cBeamArray
Definition: xray_import.h:82
Matrix1D< double > anglesArray
Definition: xray_import.h:82
String formatString(const char *format,...)
void read(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=NULL, bool decomposeStack=true) override
void resizeNoCopy(int Xdim)
Definition: matrix1d.h:458
FileName fnRoot
Output directory.
Definition: xray_import.h:48
int thrNum
Number of threads.
Definition: xray_import.h:56
size_t ydim
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void initConstant(T val)
Definition: matrix1d.cpp:83
Name of an image (std::string)
void runThread(ThreadArgument &thArg)
int getDataset(const char *dsname, Matrix1D< double > &data, bool reportError=true) const
Definition: xmipp_hdf5.cpp:137
ParallelTaskDistributor * td
Definition: xray_import.h:100

◆ show()

void ProgXrayImport::show ( ) const
virtual

Show.

Reimplemented from XmippProgram.

Definition at line 183 of file xray_import.cpp.

184 {
185  std::ostream &out = std::cout;
186 
187  out << "Input data directory : " << fnInput << std::endl;
188  if (!fnFlat.empty())
189  out << "Input flatfield directory : " << fnFlat << std::endl;
190  out << "Output rootname : " << fnRoot << std::endl;
191  out << "Crop sizes : " << formatString("%dx%d",cropSizeX,cropSizeY).c_str() << std::endl;
192  out << "Number of threads : " << thrNum << std::endl;
193  ;
194 }
FileName fnFlat
Input Flatfield directory.
Definition: xray_import.h:46
int cropSizeX
Number of pixels to crop from each side. Set to 0 for no cropping.
Definition: xray_import.h:54
FileName fnInput
Input directory.
Definition: xray_import.h:44
String formatString(const char *format,...)
FileName fnRoot
Output directory.
Definition: xray_import.h:48
int thrNum
Number of threads.
Definition: xray_import.h:56

Member Data Documentation

◆ anglesArray

Matrix1D<double> ProgXrayImport::anglesArray

Definition at line 82 of file xray_import.h.

◆ BPFactor

double ProgXrayImport::BPFactor

Bad pixel factor.

Definition at line 58 of file xray_import.h.

◆ bpMask

Image<char> ProgXrayImport::bpMask

Definition at line 94 of file xray_import.h.

◆ cBeamArray

Matrix1D<double> ProgXrayImport::cBeamArray

Definition at line 82 of file xray_import.h.

◆ cropSizeX

int ProgXrayImport::cropSizeX

Number of pixels to crop from each side. Set to 0 for no cropping.

Definition at line 54 of file xray_import.h.

◆ cropSizeXe

int ProgXrayImport::cropSizeXe

Definition at line 54 of file xray_import.h.

◆ cropSizeXi

int ProgXrayImport::cropSizeXi

Definition at line 54 of file xray_import.h.

◆ cropSizeY

int ProgXrayImport::cropSizeY

Definition at line 54 of file xray_import.h.

◆ cropSizeYe

int ProgXrayImport::cropSizeYe

Definition at line 54 of file xray_import.h.

◆ cropSizeYi

int ProgXrayImport::cropSizeYi

Definition at line 54 of file xray_import.h.

◆ darkFix

bool ProgXrayImport::darkFix

Flag to apply dark field correction.

Definition at line 64 of file xray_import.h.

◆ dSource

enum ProgXrayImport::DataSource ProgXrayImport::dSource

◆ expTimeArray

Matrix1D<double> ProgXrayImport::expTimeArray

Definition at line 82 of file xray_import.h.

◆ extFlat

bool ProgXrayImport::extFlat

Flag to apply external flat field correction.

Definition at line 62 of file xray_import.h.

◆ fEnd

size_t ProgXrayImport::fEnd

Definition at line 78 of file xray_import.h.

◆ filenames

std::vector<FileName> ProgXrayImport::filenames

Definition at line 95 of file xray_import.h.

◆ fIni

size_t ProgXrayImport::fIni

Definition at line 78 of file xray_import.h.

◆ fMD

MetaDataDb ProgXrayImport::fMD

List of flatfield images.

Definition at line 89 of file xray_import.h.

◆ fnBPMask

FileName ProgXrayImport::fnBPMask

bad Pixel filter Mask

Definition at line 60 of file xray_import.h.

◆ fnFlat

FileName ProgXrayImport::fnFlat

Input Flatfield directory.

Definition at line 46 of file xray_import.h.

◆ fnInput

FileName ProgXrayImport::fnInput

Input directory.

Definition at line 44 of file xray_import.h.

◆ fnOut

FileName ProgXrayImport::fnOut

Output Stack file.

Definition at line 50 of file xray_import.h.

◆ fnRoot

FileName ProgXrayImport::fnRoot

Output directory.

Definition at line 48 of file xray_import.h.

◆ H5File

XmippH5File ProgXrayImport::H5File

hdf5 file handler

Definition at line 80 of file xray_import.h.

◆ IavgDark

Image<double> ProgXrayImport::IavgDark

Definition at line 93 of file xray_import.h.

◆ IavgFlat

Image<double> ProgXrayImport::IavgFlat

Definition at line 92 of file xray_import.h.

◆ imgInfo

ImageInfo ProgXrayImport::imgInfo

Input image size.

Definition at line 52 of file xray_import.h.

◆ inMD

MetaDataDb ProgXrayImport::inMD

List of input images.

Definition at line 85 of file xray_import.h.

◆ logFix

bool ProgXrayImport::logFix

Flag to apply log corrections.

Definition at line 66 of file xray_import.h.

◆ mutex

Mutex ProgXrayImport::mutex

Definition at line 102 of file xray_import.h.

◆ objIds

std::vector<size_t> ProgXrayImport::objIds

Definition at line 96 of file xray_import.h.

◆ outMD

MetaDataDb ProgXrayImport::outMD

List of output images.

Definition at line 87 of file xray_import.h.

◆ selfAttFix

bool ProgXrayImport::selfAttFix

Flag to apply self-attenuation corrections.

Definition at line 68 of file xray_import.h.

◆ slitWidthArray

Matrix1D<double> ProgXrayImport::slitWidthArray

Definition at line 82 of file xray_import.h.

◆ td

ParallelTaskDistributor* ProgXrayImport::td

Definition at line 100 of file xray_import.h.

◆ tEnd

size_t ProgXrayImport::tEnd

Definition at line 78 of file xray_import.h.

◆ thrNum

int ProgXrayImport::thrNum

Number of threads.

Definition at line 56 of file xray_import.h.

◆ tIni

size_t ProgXrayImport::tIni

Index number used in Bessy tomograms and flatfield images.

Definition at line 78 of file xray_import.h.

◆ tm

ThreadManager* ProgXrayImport::tm

Definition at line 101 of file xray_import.h.

◆ vCBeam

double* ProgXrayImport::vCBeam

Definition at line 81 of file xray_import.h.

◆ vExpTime

double ProgXrayImport::vExpTime

Definition at line 81 of file xray_import.h.

◆ vslitWidth

double ProgXrayImport::vslitWidth

Definition at line 81 of file xray_import.h.


The documentation for this class was generated from the following files: