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

#include <volume_pca.h>

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

Public Member Functions

void readParams ()
 Read arguments. More...
 
void show () const
 Show. More...
 
void defineParams ()
 Define parameters. More...
 
void produce_side_info ()
 
void run ()
 
- 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 fnVols
 Input set of volumes. More...
 
FileName fnVolsOut
 Output set of volumes. More...
 
int NPCA
 Number of PCA bases. More...
 
Mask mask
 Mask. More...
 
FileName fnBasis
 Output basis. More...
 
StringVector listOfPercentiles
 List of percentiles to generate volumes. More...
 
FileName fnAvgVol
 Average volume. More...
 
FileName fnOutStack
 Output PCA stack. More...
 
MetaDataVec mdVols
 
Image< double > V
 
PCAMahalanobisAnalyzer analyzer
 
- 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

Volume PCA parameters.

Definition at line 38 of file volume_pca.h.

Member Function Documentation

◆ defineParams()

void ProgVolumePCA::defineParams ( )
virtual

Define parameters.

Reimplemented from XmippProgram.

Definition at line 65 of file volume_pca.cpp.

66 {
67  addUsageLine("Compute the PCA of a set of volumes, within a mask (optional).");
68  addParamsLine(" -i <volumes> : Metadata with aligned volumes");
69  addParamsLine(" [-o <volumes=\"\">] : Output metadata with PCA projections");
70  addParamsLine(" [--Npca <N=1>] : Number of PCA bases");
71  addParamsLine(" [--saveBasis <stack=\"\">]: Save the bases as a stack of volumes");
72  addParamsLine(" [--generatePCAVolumes <...>]: List of percentiles (typically, \"10 90\"), to generate volumes along the 1st PCA basis");
73  addParamsLine(" [--avgVolume <volume=\"\">] : Volume on which to add the PCA basis");
74  addParamsLine(" [--opca <stack=\"\">] : Stack of generated volumes");
76 }
static void defineParams(XmippProgram *program, int allowed_data_types=ALL_KINDS, const char *prefix=nullptr, const char *comment=nullptr, bool moreOptions=false)
Definition: mask.cpp:1203
Mask mask
Mask.
Definition: volume_pca.h:48
#define INT_MASK
Definition: mask.h:385
void addUsageLine(const char *line, bool verbatim=false)
void addParamsLine(const String &line)

◆ produce_side_info()

void ProgVolumePCA::produce_side_info ( )

Produce side info.

Definition at line 79 of file volume_pca.cpp.

80 {
83 
84  size_t Xdim, Ydim, Zdim, Ndim;
85  getImageSize(mdVols, Xdim, Ydim, Zdim, Ndim);
86  if (mask.type!=NO_MASK)
87  mask.generate_mask(Zdim,Ydim,Xdim);
88  else
89  {
90  mask.imask.resizeNoCopy(Zdim,Ydim,Xdim);
92  }
93 }
void read(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, bool decomposeStack=true) override
void resizeNoCopy(const MultidimArray< T1 > &v)
FileName fnVols
Input set of volumes.
Definition: volume_pca.h:42
void getImageSize(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
void initConstant(T val)
MetaDataVec mdVols
Definition: volume_pca.h:59
#define NO_MASK
Definition: mask.h:364
int type
Definition: mask.h:402
Mask mask
Mask.
Definition: volume_pca.h:48
void generate_mask(bool apply_geo=false)
Definition: mask.cpp:1577
virtual void removeDisabled()
MultidimArray< int > imask
Definition: mask.h:499

◆ readParams()

void ProgVolumePCA::readParams ( )
virtual

Read arguments.

Reimplemented from XmippProgram.

Definition at line 31 of file volume_pca.cpp.

32 {
33  fnVols = getParam("-i");
34  fnVolsOut = getParam("-o");
35  NPCA = getIntParam("--Npca");
36  fnBasis = getParam("--saveBasis");
37  fnAvgVol = getParam("--avgVolume");
38  fnOutStack = getParam("--opca");
39  if (checkParam("--generatePCAVolumes"))
40  getListParam("--generatePCAVolumes",listOfPercentiles);
41  if (checkParam("--mask"))
42  mask.readParams(this);
43 }
FileName fnVols
Input set of volumes.
Definition: volume_pca.h:42
void getListParam(const char *param, StringVector &list)
FileName fnOutStack
Output PCA stack.
Definition: volume_pca.h:56
const char * getParam(const char *param, int arg=0)
FileName fnBasis
Output basis.
Definition: volume_pca.h:50
void readParams(XmippProgram *program)
Definition: mask.cpp:1284
Mask mask
Mask.
Definition: volume_pca.h:48
int NPCA
Number of PCA bases.
Definition: volume_pca.h:46
FileName fnAvgVol
Average volume.
Definition: volume_pca.h:54
FileName fnVolsOut
Output set of volumes.
Definition: volume_pca.h:44
StringVector listOfPercentiles
List of percentiles to generate volumes.
Definition: volume_pca.h:52
bool checkParam(const char *param)
int getIntParam(const char *param, int arg=0)

◆ run()

void ProgVolumePCA::run ( )
virtual

Run

Reimplemented from XmippProgram.

Definition at line 95 of file volume_pca.cpp.

96 {
97  show();
99 
100  const MultidimArray<int> &imask=mask.imask;
101  size_t Nvoxels=imask.sum();
103  v.initZeros(Nvoxels);
104 
105  // Add all volumes to the analyzer
106  FileName fnVol;
107  for (size_t objId : mdVols.ids())
108  {
109  mdVols.getValue(MDL_IMAGE,fnVol,objId);
110  V.read(fnVol);
111 
112  // Construct vector
113  const MultidimArray<double> &mV=V();
114  size_t idx=0;
116  {
117  if (DIRECT_MULTIDIM_ELEM(imask,n))
119  }
120 
121  analyzer.addVector(v);
122  }
123 
124  // Construct PCA basis
127 
128  // Project onto the PCA basis
129  Matrix2D<double> proj;
131  std::vector<double> dimredProj;
132  dimredProj.resize(NPCA);
133  int i=0;
134  for (size_t objId : mdVols.ids())
135  {
136  memcpy(&dimredProj[0],&MAT_ELEM(proj,i,0),NPCA*sizeof(double));
137  mdVols.setValue(MDL_DIMRED,dimredProj,objId);
138  i++;
139  }
140  if (fnVolsOut!="")
142  else
144 
145  // Save the basis
146  const MultidimArray<double> &mV=V();
147  for (int i=NPCA-1; i>=0; --i)
148  {
149  V().initZeros();
150  size_t idx=0;
153  {
154  if (DIRECT_MULTIDIM_ELEM(imask,n))
156  }
157  if (fnBasis!="")
158  V.write(fnBasis,i+1,true,WRITE_OVERWRITE);
159  }
160 
161  // Generate the PCA volumes
162  if (listOfPercentiles.size()>0 && fnOutStack!="" && fnAvgVol!="")
163  {
164  Image<double> Vavg;
165  if (fnAvgVol!="")
166  Vavg.read(fnAvgVol);
167  else
168  Vavg().initZeros(V());
169 
171  proj.toVector(p);
172  Matrix1D<double> psorted=p.sort();
173 
174  Image<double> Vpca;
175  Vpca()=Vavg();
176  createEmptyFile(fnOutStack,(int)XSIZE(Vavg()),(int)YSIZE(Vavg()),(int)ZSIZE(Vavg()),listOfPercentiles.size());
177  std::cout << "listOfPercentiles.size()=" << listOfPercentiles.size() << std::endl;
178  for (size_t i=0; i<listOfPercentiles.size(); i++)
179  {
180  auto idx=(int)round(textToFloat(listOfPercentiles[i].c_str())/100.0*VEC_XSIZE(p));
181  std::cout << "Percentile " << listOfPercentiles[i] << " -> idx=" << idx << " p(idx)=" << psorted(idx) << std::endl;
182  Vpca()+=psorted(idx)*V();
183  Vpca.write(fnOutStack,i+1,true,WRITE_REPLACE);
184  }
185  }
186 }
#define YSIZE(v)
void addVector(const MultidimArray< float > &_v)
Add vector.
Definition: basic_pca.h:100
void show() const
Show.
Definition: volume_pca.cpp:46
#define VEC_XSIZE(m)
Definition: matrix1d.h:77
void projectOnPCABasis(Matrix2D< double > &CtY)
Project on basis.
Definition: basic_pca.cpp:119
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 fnVols
Input set of volumes.
Definition: volume_pca.h:42
void subtractAvg()
Subtract average.
Definition: basic_pca.cpp:33
void toVector(Matrix1D< T > &op1) const
Definition: matrix2d.cpp:832
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
MetaDataVec mdVols
Definition: volume_pca.h:59
virtual IdIteratorProxy< false > ids()
#define i
void produce_side_info()
Definition: volume_pca.cpp:79
FileName fnOutStack
Output PCA stack.
Definition: volume_pca.h:56
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
PCAMahalanobisAnalyzer analyzer
Definition: volume_pca.h:65
bool setValue(const MDObject &mdValueIn, size_t id)
float textToFloat(const char *str)
FileName fnBasis
Output basis.
Definition: volume_pca.h:50
#define XSIZE(v)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
Projection onto a reduced manifold (vector double)
#define ZSIZE(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
std::vector< MultidimArray< double > > PCAbasis
Definition: basic_pca.h:69
void createEmptyFile(const FileName &filename, int xdim, int ydim, int Zdim, size_t select_img, bool isStack, int mode, int _swapWrite, const MDRowVec *md)
Mask mask
Mask.
Definition: volume_pca.h:48
bool getValue(MDObject &mdValueOut, size_t id) const override
int round(double x)
Definition: ap.cpp:7245
Image< double > V
Definition: volume_pca.h:62
int NPCA
Number of PCA bases.
Definition: volume_pca.h:46
FileName fnAvgVol
Average volume.
Definition: volume_pca.h:54
FileName fnVolsOut
Output set of volumes.
Definition: volume_pca.h:44
StringVector listOfPercentiles
List of percentiles to generate volumes.
Definition: volume_pca.h:52
void learnPCABasis(size_t NPCA, size_t Niter)
Learn basis.
Definition: basic_pca.cpp:170
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
MultidimArray< int > imask
Definition: mask.h:499
Matrix1D< T > sort() const
Definition: matrix1d.cpp:850
void initZeros(const MultidimArray< T1 > &op)
int * n
Name of an image (std::string)
double sum() const

◆ show()

void ProgVolumePCA::show ( ) const
virtual

Show.

Reimplemented from XmippProgram.

Definition at line 46 of file volume_pca.cpp.

47 {
48  if (verbose==0)
49  return;
50  std::cout << "Input volumes: " << fnVols << std::endl
51  << "Output metadata:" << fnVolsOut << std::endl
52  << "Number of PCAs: " << NPCA << std::endl
53  << "Basis: " << fnBasis << std::endl
54  << "Avg. volume: " << fnAvgVol << std::endl
55  << "Output PCA vols:" << fnOutStack << std::endl;
56  std::cout << "Percentiles: ";
57  for (size_t i=0; i<listOfPercentiles.size(); i++)
58  std::cout << listOfPercentiles[i] << " ";
59  std::cout << std::endl;
60  if (mask.type!=NO_MASK)
61  mask.show();
62 }
FileName fnVols
Input set of volumes.
Definition: volume_pca.h:42
#define NO_MASK
Definition: mask.h:364
#define i
FileName fnOutStack
Output PCA stack.
Definition: volume_pca.h:56
FileName fnBasis
Output basis.
Definition: volume_pca.h:50
int type
Definition: mask.h:402
int verbose
Verbosity level.
Mask mask
Mask.
Definition: volume_pca.h:48
int NPCA
Number of PCA bases.
Definition: volume_pca.h:46
FileName fnAvgVol
Average volume.
Definition: volume_pca.h:54
FileName fnVolsOut
Output set of volumes.
Definition: volume_pca.h:44
StringVector listOfPercentiles
List of percentiles to generate volumes.
Definition: volume_pca.h:52
void show() const
Definition: mask.cpp:1021

Member Data Documentation

◆ analyzer

PCAMahalanobisAnalyzer ProgVolumePCA::analyzer

Definition at line 65 of file volume_pca.h.

◆ fnAvgVol

FileName ProgVolumePCA::fnAvgVol

Average volume.

Definition at line 54 of file volume_pca.h.

◆ fnBasis

FileName ProgVolumePCA::fnBasis

Output basis.

Definition at line 50 of file volume_pca.h.

◆ fnOutStack

FileName ProgVolumePCA::fnOutStack

Output PCA stack.

Definition at line 56 of file volume_pca.h.

◆ fnVols

FileName ProgVolumePCA::fnVols

Input set of volumes.

Definition at line 42 of file volume_pca.h.

◆ fnVolsOut

FileName ProgVolumePCA::fnVolsOut

Output set of volumes.

Definition at line 44 of file volume_pca.h.

◆ listOfPercentiles

StringVector ProgVolumePCA::listOfPercentiles

List of percentiles to generate volumes.

Definition at line 52 of file volume_pca.h.

◆ mask

Mask ProgVolumePCA::mask

Mask.

Definition at line 48 of file volume_pca.h.

◆ mdVols

MetaDataVec ProgVolumePCA::mdVols

Definition at line 59 of file volume_pca.h.

◆ NPCA

int ProgVolumePCA::NPCA

Number of PCA bases.

Definition at line 46 of file volume_pca.h.

◆ V

Image<double> ProgVolumePCA::V

Definition at line 62 of file volume_pca.h.


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