Xmipp  v3.23.11-Nereus
Functions
metadata_split_3D.cpp File Reference
#include <algorithm>
#include "metadata_split_3D.h"
#include "core/geometry.h"
#include "core/metadata_vec.h"
#include "data/filters.h"
#include "data/basic_pca.h"
Include dependency graph for metadata_split_3D.cpp:

Go to the source code of this file.

Functions

void getNeighbours (MetaDataDb &mdIn, const Matrix1D< double > &projectionDir, MetaDataDb &mdNeighbours, double maxDist)
 
void analyzeNeighbours (MetaData &mdNeighbours, const FileName &fnRef)
 

Function Documentation

◆ analyzeNeighbours()

void analyzeNeighbours ( MetaData mdNeighbours,
const FileName fnRef 
)

Definition at line 108 of file metadata_split_3D.cpp.

109 {
110  std::vector<double> cc;
111  mdNeighbours.getColumnValues(MDL_MAXCC,cc);
112  std::sort(cc.begin(),cc.end());
113 
114  double ccMedian=cc[cc.size()/2];
115  for (size_t objId : mdNeighbours.ids())
116  {
117  double cci;
118  mdNeighbours.getValue(MDL_MAXCC, cci, objId);
119  if (cci>ccMedian)
120  mdNeighbours.setValue(MDL_COST, 1.0, objId);
121  else
122  mdNeighbours.setValue(MDL_COST, -1.0, objId);
123  }
124 }
virtual IdIteratorProxy< false > ids()
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0
Cost for the image (double)
Maximum cross-correlation for the image (double)
void sort(struct DCEL_T *dcel)
Definition: sorting.cpp:18
std::vector< T > getColumnValues(const MDLabel label) const
bool setValue(const MDLabel label, const T &valueIn, size_t id)

◆ getNeighbours()

void getNeighbours ( MetaDataDb mdIn,
const Matrix1D< double > &  projectionDir,
MetaDataDb mdNeighbours,
double  maxDist 
)

Definition at line 73 of file metadata_split_3D.cpp.

74 {
75  Matrix1D<double> projectionDir2;
76  FileName fnImg;
77  mdNeighbours.clear();
78  MetaDataDb mdAux;
79  size_t refno;
80  double cc;
81  for (size_t objId : mdIn.ids())
82  {
83  double rot, tilt;
84  mdIn.getValue(MDL_ANGLE_ROT,rot, objId);
85  mdIn.getValue(MDL_ANGLE_TILT,tilt, objId);
86  mdIn.getValue(MDL_IMAGE_IDX,refno, objId);
87  mdIn.getValue(MDL_MAXCC,cc, objId);
88  Euler_direction(rot,tilt,0,projectionDir2);
89 
90  double angle=acos(dotProduct(projectionDir,projectionDir2));
91  if (angle<maxDist)
92  {
93  mdIn.getValue(MDL_IMAGE,fnImg, objId);
94  size_t id=mdAux.addObject();
95  mdAux.setValue(MDL_IMAGE,fnImg,id);
96  mdAux.setValue(MDL_IMAGE_IDX,refno,id);
97  mdAux.setValue(MDL_MAXCC,cc,id);
98  }
99  }
100  mdNeighbours.removeDuplicates(mdAux,MDL_IMAGE_IDX);
101  std::vector<MDLabel> groupBy;
102  groupBy.push_back(MDL_IMAGE_IDX);
103  groupBy.push_back(MDL_IMAGE);
104  if (mdAux.size()>0)
105  mdNeighbours.aggregateGroupBy(mdAux,AGGR_MAX,groupBy,MDL_MAXCC,MDL_MAXCC);
106 }
Rotation angle of an image (double,degrees)
Index of an image within a list (size_t)
void Euler_direction(double alpha, double beta, double gamma, Matrix1D< double > &v)
Definition: geometry.cpp:721
bool getValue(MDObject &mdValueOut, size_t id) const override
Tilting angle of an image (double,degrees)
virtual IdIteratorProxy< false > ids()
void aggregateGroupBy(const MetaDataDb &mdIn, AggregateOperation op, const std::vector< MDLabel > &groupByLabels, MDLabel operateLabel, MDLabel resultLabel)
size_t addObject() override
void clear() override
Definition: metadata_db.cpp:54
Maximum cross-correlation for the image (double)
void removeDuplicates(MetaDataDb &MDin, MDLabel label=MDL_UNDEFINED)
size_t size() const override
bool setValue(const MDObject &mdValueIn, size_t id) override
Definition: metadata_db.cpp:90
T dotProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
Definition: matrix1d.h:1140
Name of an image (std::string)