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

#include <micrograph_automatic_picking2.h>

Collaboration diagram for AutoParticlePicking2:
Collaboration graph
[legend]

Public Member Functions

 AutoParticlePicking2 (int particle_size, int filter_num=6, int corr_num=2, int NPCA=4, const FileName &model_name=nullptr, const std::vector< MDRowSql > &vMicList={})
 Constructor. More...
 
 AutoParticlePicking2 ()=default
 
 ~AutoParticlePicking2 ()
 Destructor. More...
 
void setSize (int pSize)
 
void readMic (const FileName &fn_micrograph, int keepPrev)
 Read micrograph from the file. More...
 
void filterBankGenerator ()
 
void batchBuildInvariant (const std::vector< MDRowSql > &MD)
 
void buildInvariant (const std::vector< MDRowSql > &MD)
 
void extractInvariant ()
 
void extractPositiveInvariant ()
 
void extractNegativeInvariant ()
 
void trainPCA ()
 
void add2Dataset (int flagNegPos)
 
void train (const std::vector< MDRowSql > &MD, bool corrFlag, int x, int y, int width, int height)
 
void correction (const std::vector< MDRowSql > &addedParticlesMD, const std::vector< MDRowSql > &removedParticlesMD)
 
void add2Dataset (const MetaData &removedParticlesMD)
 
void saveTrainingSet ()
 
int automaticallySelectParticles (FileName fnmicrograph, int proc_prec, std::vector< MDRowSql > &md)
 
int automaticWithouThread (FileName fnmicrograph, int proc_prec, const FileName &fn)
 
void saveAutoParticles (MetaData &md)
 
void saveAutoParticles (std::vector< MDRowSql > &md)
 
void readParams (XmippProgram *program)
 Read the parmaeters of the main program. More...
 
void readMicrograph ()
 Read the micrograph in memory. More...
 
bool checkDist (Particle2 &p)
 
void extractStatics (MultidimArray< double > &inputVec, MultidimArray< double > &features)
 
void convert2PolarFourier (MultidimArray< double > &particleImage, MultidimArray< std::complex< double > > &polar)
 Convert an image to its polar form. More...
 
void polarCorrelation (const MultidimArray< std::complex< double > > &fourierPolarStack, MultidimArray< double > &IpolarCorr)
 Calculate the correlation of different polar channels. More...
 
void applyConvolution (bool fast)
 Convolve the micrograph with the different templates. More...
 
double PCAProject (MultidimArray< double > &pcaBasis, MultidimArray< double > &vec)
 Project a vector on one pca basis. More...
 
void extractParticle (const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)
 
void extractNonParticle (std::vector< Particle2 > &negativePosition)
 
void extractInvariant (const FileName &fnInvariantFeat, const FileName &fnParticles, bool avgFlag)
 
void extractPositiveInvariant (const FileName &fnInvariantFeat, const FileName &fnParticles, bool avgFlag)
 
void extractNegativeInvariant (const FileName &fnInvariantFeat, const FileName &fnParticles)
 
void buildVector (MultidimArray< double > &inputVec, MultidimArray< double > &staticVec, MultidimArray< double > &featureVec, MultidimArray< double > &pieceImage)
 
void buildInvariant (MultidimArray< double > &invariantChannel, int x, int y, int pre)
 
void buildSearchSpace (std::vector< Particle2 > &positionArray, bool fast)
 
void trainSVM (const FileName &fnModel, int numClassifier)
 
void trainPCA (const FileName &fnPositiveFeat)
 
void trainRotPCA (const FileName &fnAvgModel, const FileName &fnPCARotModel)
 
void add2Dataset (const FileName &fnInvariantFeat, const FileName &fnParticles, int lable)
 
void add2Dataset ()
 
void normalizeDataset (int a, int b)
 
void savePCAModel (const FileName &fn)
 Save the PCA basis and average for each channel. More...
 
void saveTrainingSet (const FileName &fn_root)
 Save training set into memory. More...
 
void loadTrainingSet (const FileName &fn_root)
 Load training set into the related array. More...
 
void generateTrainSet ()
 
void generateFeatVec (const FileName &fnmicrograph, int proc_prec, std::vector< Particle2 > &positionArray)
 
int readNextMic (FileName &fnmicrograph)
 
int getParticlesThreshold ()
 

Static Public Member Functions

static void defineParams (XmippProgram *program)
 Define the parameters of the main program. More...
 

Public Attributes

int particle_size
 
int particle_radius
 
int filter_num
 
int proc_prec
 
int NPCA
 
int NRPCA
 
int corr_num
 
int num_correlation
 
int num_features
 
int Nthreads
 
int fast
 
int NRsteps
 
SVMClassifier classifier
 
SVMClassifier classifier2
 
PCAMahalanobisAnalyzer pcaAnalyzer
 
ProgImageRotationalPCA rotPcaAnalyzer
 
Micrograph::Point p1
 
Micrograph::Point p2
 
FeaturesThreadthread
 
Micrograph m
 
Micrograph mPrev
 
Image< double > microImage
 
Image< double > micrographStack
 
Image< double > micrographStackPre
 
Image< double > microImagePrev
 
std::vector< Particle2auto_candidates
 
std::vector< Particle2rejected_particles
 
std::vector< Particle2accepted_particles
 
std::vector< Particle2negative_candidates
 
std::vector< MDRowSqlmicList
 
FileName fn_micrograph
 
FileName fn_model
 
FileName fnPCAModel
 
FileName fnPCARotModel
 
FileName fnAvgModel
 
FileName fnVector
 
FileName fnSVMModel
 
FileName fnSVMModel2
 
FileName fnInvariant
 
FileName fnParticles
 
double scaleRate
 
MultidimArray< double > convolveRes
 
MultidimArray< double > filterBankStack
 
MultidimArray< double > positiveParticleStack
 
MultidimArray< double > negativeParticleStack
 
MultidimArray< double > positiveInvariatnStack
 
MultidimArray< double > negativeInvariatnStack
 
MultidimArray< double > autoFeatVec
 
MultidimArray< double > pcaModel
 
MultidimArray< double > pcaRotModel
 
MultidimArray< double > particleAvg
 
MultidimArray< double > dataSet
 
MultidimArray< double > dataSet1
 
MultidimArray< double > classLabel
 
MultidimArray< double > classLabel1
 
MultidimArray< double > labelSet
 
MultidimArray< double > dataSetNormal
 

Static Public Attributes

static const int NangSteps =120
 

Detailed Description

Class to perform the automatic particle picking

Definition at line 61 of file micrograph_automatic_picking2.h.

Constructor & Destructor Documentation

◆ AutoParticlePicking2() [1/2]

AutoParticlePicking2::AutoParticlePicking2 ( int  particle_size,
int  filter_num = 6,
int  corr_num = 2,
int  NPCA = 4,
const FileName model_name = nullptr,
const std::vector< MDRowSql > &  vMicList = {} 
)

Constructor.

Definition at line 38 of file micrograph_automatic_picking2.cpp.

40 {
41  // Defining the paths for pca, svm, ... models.
42  fn_model=model_name;
43  fnPCAModel=fn_model+"_pca_model.stk";
44  fnPCARotModel=fn_model+"_rotpca_model.stk";
45  fnAvgModel=fn_model+"_particle_avg.xmp";
46  fnVector=fn_model+"_training.txt";
47  fnSVMModel=fn_model+"_svm.txt";
48  fnSVMModel2=fn_model+"_svm2.txt";
49  fnInvariant=fn_model+"_invariant";
50  fnParticles=fn_model+"_particle";
51 
52  // Reading the list of micrographs
53  // if (strcmp(micsFn.c_str()," "))
54  // micList.read(micsFn);
55 
56  micList = vMicList;
57  // Setting the values of the parameters
58  corr_num=corrNum;
59  filter_num=filterNum;
60  NPCA=basisPCA;
61  NRPCA=20;
62  num_correlation=filterNum+((filterNum-corr_num)*corr_num);
64  setSize(pSize);
65 
66  // Set the parameters for two SVM classifiers.
67  classifier.setParameters(8.0, 0.125);
68  classifier2.setParameters(1.0, 0.25);
69 
70  // If models were generated then load them to memory.
71  if (fnPCAModel.exists())
72  {
75  Image<double> II;
76  II.read(fnPCAModel);
77  pcaModel=II();
78  // Read rotational PCA model
79  II.read(fnPCARotModel);
80  pcaRotModel=II();
81  // Read the average of the particles for convolution
82  II.read(fnAvgModel);
83  particleAvg=II();
85  }
86 
87  // Initalize the thread to one
88  thread = nullptr;
89 }
void LoadModel(const FileName &fnModel)
void setParameters(double c, double gamma)
MultidimArray< double > pcaRotModel
bool exists() const
MultidimArray< double > pcaModel
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
MultidimArray< double > particleAvg
void initZeros(const MultidimArray< T1 > &op)
std::vector< MDRowSql > micList

◆ AutoParticlePicking2() [2/2]

AutoParticlePicking2::AutoParticlePicking2 ( )
default

◆ ~AutoParticlePicking2()

AutoParticlePicking2::~AutoParticlePicking2 ( )

Destructor.

Definition at line 1018 of file micrograph_automatic_picking2.cpp.

1019 {}

Member Function Documentation

◆ add2Dataset() [1/4]

void AutoParticlePicking2::add2Dataset ( int  flagNegPos)

Definition at line 384 of file micrograph_automatic_picking2.cpp.

385 {
387  MultidimArray<double> staticVec;
389  MultidimArray<double> pcaBase;
390  MultidimArray<double> pcaRBase;
391 
392  int steps;
393  int yDataSet=YSIZE(dataSet);
394 
395  if (!flagNegPos)
397  else
399  // Resize the dataset for the new data
400  dataSet.resize(1,1,yDataSet+steps,num_features);
401  classLabel.resize(1,1,1,YSIZE(dataSet));
402  for (size_t n=yDataSet;n<XSIZE(classLabel);n++)
403  {
404  if (!flagNegPos)
405  classLabel(n)=1;
406  else
407  classLabel(n)=2;
408  }
409  // Here we take each channel of the particle and try to project it
410  // on related PCA basis. So we first do it for first channel and obtain
411  // all the features for all particles and then move to the next channel.
412  for (int i=0;i<num_correlation;i++)
413  {
414  avg.aliasImageInStack(pcaModel,i*(NPCA+1));
415  avg.resize(1,1,XSIZE(avg)*YSIZE(avg));
416  for (int j=0;j<NPCA;j++)
417  {
418  pcaBase.aliasImageInStack(pcaModel,i*(NPCA+1)+1+j);
419  pcaBase.resize(1,1,1,XSIZE(pcaBase)*YSIZE(pcaBase));
420  for (int k=0;k<steps;k++)
421  {
422  vec.resize(1 , NangSteps, NRsteps);
423  if (!flagNegPos)
424  positiveInvariatnStack.getImage(k*num_correlation+i, vec);
425  else
426  negativeInvariatnStack.getImage(k*num_correlation+i, vec);
427  vec.resize(1, 1, XSIZE(vec)*YSIZE(vec));
428  vec-=avg;
429  DIRECT_A2D_ELEM(dataSet,k+yDataSet,j+(i*NPCA))=PCAProject(pcaBase,vec);
430  }
431  }
432  }
433 
434  // Obtain the statics for each particle
435  for (int i=0;i<steps;i++)
436  {
437  vec.resize(1 , particle_size+1, particle_size+1);
438  if (!flagNegPos)
440  else
442  vec.resize(1,1,1,XSIZE(vec)*YSIZE(vec));
443  extractStatics(vec,staticVec);
444  for (int j=0;j<12;j++)
445  DIRECT_A2D_ELEM(dataSet,i+yDataSet,j+num_correlation*NPCA)=DIRECT_A1D_ELEM(staticVec,j);
446  // Project each particles on rotational PCA basis.
447  for (int j=0;j<NRPCA;j++)
448  {
449  pcaRBase.aliasImageInStack(pcaRotModel,j);
450  pcaRBase.resize(1,1,1,XSIZE(pcaRBase)*YSIZE(pcaRBase));
451  DIRECT_A2D_ELEM(dataSet,i+yDataSet,num_correlation*NPCA+12+j)=PCAProject(pcaRBase,vec);
452  }
453  }
454 }
#define NSIZE(v)
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void aliasImageInStack(const MultidimArray< T > &m, size_t select_image)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define DIRECT_A1D_ELEM(v, i)
MultidimArray< double > positiveParticleStack
void extractStatics(MultidimArray< double > &inputVec, MultidimArray< double > &features)
MultidimArray< double > pcaRotModel
#define XSIZE(v)
MultidimArray< double > positiveInvariatnStack
#define j
double steps
double PCAProject(MultidimArray< double > &pcaBasis, MultidimArray< double > &vec)
Project a vector on one pca basis.
MultidimArray< double > classLabel
MultidimArray< double > pcaModel
MultidimArray< double > negativeParticleStack
int * n
MultidimArray< double > negativeInvariatnStack
void getImage(size_t n, MultidimArray< T > &M, size_t n2=0) const

◆ add2Dataset() [2/4]

void AutoParticlePicking2::add2Dataset ( const MetaData removedParticlesMD)

Definition at line 893 of file micrograph_automatic_picking2.cpp.

894 {
895  int cntNeg=0;
896  int enabled;
897  double cost;
898 
899  for (size_t objId : removedParticlesMD.ids())
900  {
901  removedParticlesMD.getValue(MDL_ENABLED,enabled, objId);
902  if (enabled == -1)
903  {
904  removedParticlesMD.getValue(MDL_COST,cost, objId);
905  if (cost!=-1)
906  cntNeg++;
907  }
908  }
909  int yDataSet=YSIZE(dataSet);
910  dataSet.resize(1,1,yDataSet+cntNeg,num_features);
911  classLabel.resize(1,1,1,YSIZE(dataSet));
912  int limit = cntNeg + yDataSet;
913  for (int n=yDataSet;n<limit;n++)
914  classLabel(n)=3;
915  int cnt=0;
916 
917  for (size_t objId : removedParticlesMD.ids())
918  {
919  removedParticlesMD.getValue(MDL_ENABLED,enabled, objId);
920  if (enabled == -1)
921  {
922  removedParticlesMD.getValue(MDL_COST,cost, objId);
923  if (cost!=-1)
924  {
925  for (size_t j=0;j<XSIZE(dataSet);j++)
926  DIRECT_A2D_ELEM(dataSet,cnt+yDataSet,j)=DIRECT_A1D_ELEM(auto_candidates[cnt].vec,j);
927  cnt++;
928  }
929  }
930  }
931 }
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
virtual IdIteratorProxy< false > ids()
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0
Is this image enabled? (int [-1 or 1])
#define DIRECT_A1D_ELEM(v, i)
Cost for the image (double)
#define XSIZE(v)
#define j
MultidimArray< double > classLabel
std::vector< Particle2 > auto_candidates
int * n

◆ add2Dataset() [3/4]

void AutoParticlePicking2::add2Dataset ( const FileName fnInvariantFeat,
const FileName fnParticles,
int  lable 
)

Definition at line 1180 of file micrograph_automatic_picking2.cpp.

1183 {
1184  ImageGeneric positiveInvariant;
1186  MultidimArray<double> staticVec;
1188  MultidimArray<double> pcaBase;
1189  MultidimArray<double> pcaRBase;
1190  MultidimArray<double> binaryVec;
1191  MultidimArray<double> dilatedVec;
1192  FourierFilter filter;
1193  ArrayDim aDim;
1194  int yDataSet=YSIZE(dataSet);
1195  if (!fn_Invariant.exists())
1196  return;
1197  positiveInvariant.read(fn_Invariant,HEADER);
1198  positiveInvariant.getDimensions(aDim);
1199  int steps=aDim.ndim/num_correlation;
1200  // Resize the dataset for the new data
1201  dataSet.resize(1,1,yDataSet+steps,num_features);
1202  classLabel.resize(1,1,1,YSIZE(dataSet));
1203  for (size_t n=yDataSet;n<XSIZE(classLabel);n++)
1204  classLabel(n)=label;
1205  // Here we take each channel of the particle and try to project it
1206  // on related PCA basis. So we first do it for first channel and obtain
1207  // all the features for all particles and then move to the next channel.
1208  for (int i=0;i<num_correlation;i++)
1209  {
1210  avg.aliasImageInStack(pcaModel,i*(NPCA+1));
1211  avg.resize(1,1,1,XSIZE(avg)*YSIZE(avg));
1212  for (int j=0;j<NPCA;j++)
1213  {
1214  pcaBase.aliasImageInStack(pcaModel,i*(NPCA+1)+1+j);
1215  pcaBase.resize(1,1,1,XSIZE(pcaBase)*YSIZE(pcaBase));
1216  for (int k=0;k<steps;k++)
1217  {
1218  positiveInvariant.readMapped(fn_Invariant,k*num_correlation+i+1);
1219  positiveInvariant().getImage(vec);
1220  vec.resize(1,1,1,XSIZE(vec)*YSIZE(vec));
1221  vec-=avg;
1222  DIRECT_A2D_ELEM(dataSet,k+yDataSet,j+(i*NPCA))=PCAProject(pcaBase,vec);
1223  }
1224  }
1225  }
1226  // Obtain the statics for each particle
1227  for (int i=0;i<steps;i++)
1228  {
1229  positiveInvariant.readMapped(fnParticles,i+1);
1230  positiveInvariant().getImage(vec);
1231  vec.resize(1,1,1,XSIZE(vec)*YSIZE(vec));
1232  extractStatics(vec,staticVec);
1233  for (int j=0;j<12;j++)
1234  DIRECT_A2D_ELEM(dataSet,i+yDataSet,j+num_correlation*NPCA)=DIRECT_A1D_ELEM(staticVec,j);
1235  // Project each particles on rotational PCA basis.
1236  for (int j=0;j<NRPCA;j++)
1237  {
1238  pcaRBase.aliasImageInStack(pcaRotModel,j);
1239  pcaRBase.resize(1,1,1,XSIZE(pcaRBase)*YSIZE(pcaRBase));
1240  DIRECT_A2D_ELEM(dataSet,i+yDataSet,num_correlation*NPCA+12+j)=PCAProject(pcaRBase,vec);
1241  }
1242  }
1243  fn_Invariant.deleteFile();
1244  fnParticles.deleteFile();
1245 }
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void aliasImageInStack(const MultidimArray< T > &m, size_t select_image)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define DIRECT_A1D_ELEM(v, i)
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
void extractStatics(MultidimArray< double > &inputVec, MultidimArray< double > &features)
MultidimArray< double > pcaRotModel
#define XSIZE(v)
#define j
void deleteFile() const
double steps
double PCAProject(MultidimArray< double > &pcaBasis, MultidimArray< double > &vec)
Project a vector on one pca basis.
size_t ndim
MultidimArray< double > classLabel
MultidimArray< double > pcaModel
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false)
int readMapped(const FileName &name, size_t select_img=ALL_IMAGES, int mode=WRITE_READONLY)
int * n

◆ add2Dataset() [4/4]

void AutoParticlePicking2::add2Dataset ( )

Definition at line 1247 of file micrograph_automatic_picking2.cpp.

1248 {
1249  // Here we have the features and we just want to put them
1250  // in the dataset.
1251  int limit=0, size=0, newSize=0;
1252  int yDataSet=YSIZE(dataSet);
1253  size_t n=0;
1254 
1255  newSize=rejected_particles.size()+
1256  accepted_particles.size();
1257  dataSet.resize(1,1,yDataSet+newSize,num_features);
1258  classLabel.resize(1,1,1,YSIZE(dataSet));
1259  limit=yDataSet;
1260  if (rejected_particles.size() > 0)
1261  {
1262  limit += rejected_particles.size();
1263  // for (int n=yDataSet;n<limit;n++)
1264  // classLabel(n)=2;
1265  for (n=0;n<rejected_particles.size();n++)
1266  {
1267  classLabel(n+yDataSet)=2;
1268  if (n<accepted_particles.size())
1269  classLabel(n+limit)=1;
1270  for (size_t j=0;j<XSIZE(dataSet);j++)
1271  {
1273  if (n<accepted_particles.size())
1275  }
1276  }
1277  }
1278  if (accepted_particles.size()>n)
1279  {
1280  size = limit+n;
1281  int cnt=0;
1282  for (size_t i=n;i<accepted_particles.size();i++)
1283  {
1284  classLabel(size+cnt)=1;
1285  for (size_t j=0;j<XSIZE(dataSet);j++)
1287  cnt++;
1288  }
1289  }
1290 }
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
#define i
#define DIRECT_A1D_ELEM(v, i)
std::vector< Particle2 > rejected_particles
#define XSIZE(v)
std::vector< Particle2 > accepted_particles
#define j
MultidimArray< double > classLabel
int * n

◆ applyConvolution()

void AutoParticlePicking2::applyConvolution ( bool  fast)

Convolve the micrograph with the different templates.

Definition at line 1677 of file micrograph_automatic_picking2.cpp.

1678 {
1679 
1680  MultidimArray<double> tempConvolve;
1681  MultidimArray<double> avgRotated, avgRotatedLarge;
1682  MultidimArray<int> mask;
1683  CorrelationAux aux;
1684  FourierFilter filter;
1685  int sizeX = XSIZE(microImage());
1686  int sizeY = YSIZE(microImage());
1687 
1688  //Generating Mask
1689  mask.resize(particleAvg);
1690  mask.setXmippOrigin();
1694 
1695  filter.raised_w=0.02;
1696  filter.FilterShape=RAISED_COSINE;
1697  filter.FilterBand=BANDPASS;
1698  filter.w1=1.0/double(particle_size);
1699  filter.w2=1.0/(double(particle_size)/3);
1700  if (fast)
1701  {
1702  // In fast mode we just do the convolution with the average of the
1703  // rotated templates
1704  avgRotatedLarge=particleAvg;
1705  for (int deg=3;deg<360;deg+=3)
1706  {
1707  rotate(xmipp_transformation::LINEAR,avgRotated,particleAvg,double(deg));
1708  avgRotated.setXmippOrigin();
1709  avgRotatedLarge.setXmippOrigin();
1710  avgRotatedLarge+=avgRotated;
1711  }
1712  avgRotatedLarge/=120;
1713  avgRotatedLarge.selfWindow(FIRST_XMIPP_INDEX(sizeY),FIRST_XMIPP_INDEX(sizeX),
1714  LAST_XMIPP_INDEX(sizeY),LAST_XMIPP_INDEX(sizeX));
1715  correlation_matrix(microImage(),avgRotatedLarge,convolveRes,aux,false);
1716  filter.do_generate_3dmask=true;
1717  filter.generateMask(convolveRes);
1718  filter.applyMaskSpace(convolveRes);
1719  }
1720  else
1721  {
1722  avgRotatedLarge=particleAvg;
1723  avgRotatedLarge.selfWindow(FIRST_XMIPP_INDEX(sizeY),FIRST_XMIPP_INDEX(sizeX),
1724  LAST_XMIPP_INDEX(sizeY),LAST_XMIPP_INDEX(sizeX));
1725  correlation_matrix(microImage(),avgRotatedLarge,convolveRes,aux,false);
1726  filter.do_generate_3dmask=true;
1727  filter.generateMask(convolveRes);
1728  filter.applyMaskSpace(convolveRes);
1729 
1730  for (int deg=3;deg<360;deg+=3)
1731  {
1732  // We first rotate the template and then put it in the big image in order to
1733  // the convolution
1734  rotate(xmipp_transformation::LINEAR,avgRotated,particleAvg,double(deg));
1735  avgRotatedLarge=avgRotated;
1736  avgRotatedLarge.setXmippOrigin();
1737  avgRotatedLarge.selfWindow(FIRST_XMIPP_INDEX(sizeY),FIRST_XMIPP_INDEX(sizeX),
1738  LAST_XMIPP_INDEX(sizeY),LAST_XMIPP_INDEX(sizeX));
1739  correlation_matrix(aux.FFT1,avgRotatedLarge,tempConvolve,aux,false);
1740  filter.applyMaskSpace(tempConvolve);
1742  if (DIRECT_A2D_ELEM(tempConvolve,i,j)>DIRECT_A2D_ELEM(convolveRes,i,j))
1743  DIRECT_A2D_ELEM(convolveRes,i,j)=DIRECT_A2D_ELEM(tempConvolve,i,j);
1744  }
1745  }
1746  CenterFFT(convolveRes,true);
1747 }
void selfWindow(int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T init_value=0)
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void normalize_NewXmipp(MultidimArray< double > &I, const MultidimArray< int > &bg_mask)
Definition: normalize.cpp:255
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY2D(m)
void BinaryCircularMask(MultidimArray< int > &mask, double radius, int mode, double x0, double y0, double z0)
Definition: mask.cpp:193
#define BANDPASS
#define DIRECT_A2D_ELEM(v, i, j)
void correlation_matrix(const MultidimArray< double > &m1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center)
Definition: xmipp_fftw.cpp:869
#define i
#define rotate(a, i, j, k, l)
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define XSIZE(v)
#define RAISED_COSINE
MultidimArray< std::complex< double > > FFT1
Definition: xmipp_fftw.h:554
#define j
#define FIRST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:439
MultidimArray< double > particleAvg
#define LAST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:448
void generateMask(MultidimArray< double > &v)
void applyMaskSpace(MultidimArray< double > &v)
MultidimArray< double > convolveRes

◆ automaticallySelectParticles()

int AutoParticlePicking2::automaticallySelectParticles ( FileName  fnmicrograph,
int  proc_prec,
std::vector< MDRowSql > &  md 
)

Definition at line 540 of file micrograph_automatic_picking2.cpp.

541 {
542  // bool error=MDSql::deactivateThreadMuting();
543  auto_candidates.clear();
544  // md.clear();
545 
546  double label, score;
547  Particle2 p;
548  MultidimArray<double> featVec, featVecNN;
549  std::vector<Particle2> positionArray;
550 
551  if (thread == nullptr)
552  {
553  thread = new FeaturesThread(this);
554  thread->start();
555  thread->workOnMicrograph(fnmicrograph, proc_prec);
556  }
557  if (strcmp(fnmicrograph.c_str(),thread->fnmicrograph.c_str()))
558  {
559  flagAbort=1;
561  flagAbort=0;
562  positionArray.clear();
563  generateFeatVec(fnmicrograph,proc_prec,positionArray);
564  }
565  else
566  {
568  positionArray = thread->positionArray;
569  }
570 
571  // Read the SVM model
572  // generateFeatVec(fnmicrograph,proc_prec,positionArray);
573  // classifier.LoadModel(fnSVMModel);
574  auto num=(int)(positionArray.size()*(proc_prec/100.0));
575  featVec.resize(num_features);
576  // negative_candidates.clear();
577 
578  for (int k=0;k<num;k++)
579  {
582  featVecNN=featVec;
583  double max=featVec.computeMax();
584  double min=featVec.computeMin();
586  DIRECT_A1D_ELEM(featVec,i)=0+(1*((DIRECT_A1D_ELEM(featVec,i)-min)/(max-min)));
587  int j=positionArray[k].x;
588  int i=positionArray[k].y;
589  label= classifier.predict(featVec, score);
590  if (label==1)
591  {
592  p.x=j;
593  p.y=i;
594  p.status=1;
595  p.cost=score;
596  p.vec=featVecNN;
597  auto_candidates.push_back(p);
598 
599  }
600  // else
601  // {
602  // p.x=j;
603  // p.y=i;
604  // p.status=1;
605  // p.cost=score;
606  // p.vec=featVecNN;
607  // negative_candidates.push_back(p);
608  // }
609  }
610  if (auto_candidates.size() == 0)
611  return 0;
612  // Remove the occluded particles
613  for (size_t i=0;i<auto_candidates.size();++i)
614  for (size_t j=0;j<auto_candidates.size()-i-1;j++)
615  if (auto_candidates[j].cost<auto_candidates[j+1].cost)
616  {
617  p=auto_candidates[j+1];
619  auto_candidates[j]=p;
620  }
621  for (size_t i=0;i<auto_candidates.size()-1;++i)
622  {
623  if (auto_candidates[i].status==-1)
624  continue;
625  p=auto_candidates[i];
626  for (size_t j=i+1;j<auto_candidates.size();j++)
627  {
632  {
633  if (p.cost<auto_candidates[j].cost)
634  {
635  auto_candidates[i].status=-1;
636  p=auto_candidates[j];
637  }
638  else
639  auto_candidates[j].status=-1;
640  }
641  }
642  }
643  saveAutoParticles(md);
644  if (readNextMic(fnmicrograph))
645  thread->workOnMicrograph(fnmicrograph, proc_prec);
646  return auto_candidates.size();
647 }
void min(Image< double > &op1, const Image< double > &op2)
MultidimArray< double > autoFeatVec
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
int readNextMic(FileName &fnmicrograph)
#define DIRECT_A2D_ELEM(v, i, j)
void start()
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
doublereal * x
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define DIRECT_A1D_ELEM(v, i)
T computeMin() const
void max(Image< double > &op1, const Image< double > &op2)
void workOnMicrograph(const FileName &fnMic, int proc_prec)
#define j
std::vector< Particle2 > positionArray
double predict(MultidimArray< double > &featVec, double &score)
std::vector< Particle2 > auto_candidates
MultidimArray< double > vec
void generateFeatVec(const FileName &fnmicrograph, int proc_prec, std::vector< Particle2 > &positionArray)
T computeMax() const

◆ automaticWithouThread()

int AutoParticlePicking2::automaticWithouThread ( FileName  fnmicrograph,
int  proc_prec,
const FileName fn 
)

Definition at line 649 of file micrograph_automatic_picking2.cpp.

650 {
651  // Read the SVM model
652  // classifier.LoadModel(fnSVMModel);
653 
654  double label, score;
655  Particle2 p;
656  MultidimArray<double> featVec, featVecNN;
657  std::vector<Particle2> positionArray;
658  MetaDataVec md;
659 
660  generateFeatVec(fnmicrograph,proc_prec,positionArray);
661 
662  auto num=(int)(positionArray.size()*(proc_prec/100.0));
663  featVec.resize(num_features);
664  for (int k=0;k<num;k++)
665  {
668  featVecNN=featVec;
669  double max=featVec.computeMax();
670  double min=featVec.computeMin();
672  DIRECT_A1D_ELEM(featVec,i)=0+((1)*((DIRECT_A1D_ELEM(featVec,i)-min)/(max-min)));
673  int j=positionArray[k].x;
674  int i=positionArray[k].y;
675  label= classifier.predict(featVec, score);
676  if (label==1)
677  {
678  p.x=j;
679  p.y=i;
680  p.status=1;
681  p.cost=score;
682  p.vec=featVecNN;
683  auto_candidates.push_back(p);
684 
685  }
686  }
687 
688  if (auto_candidates.size() == 0)
689  return 0;
690  // Remove the occluded particles
691  for (size_t i=0;i<auto_candidates.size();++i)
692  for (size_t j=0;j<auto_candidates.size()-i-1;j++)
693  if (auto_candidates[j].cost<auto_candidates[j+1].cost)
694  {
695  p=auto_candidates[j+1];
697  auto_candidates[j]=p;
698  }
699  for (size_t i=0;i<auto_candidates.size()-1;++i)
700  {
701  if (auto_candidates[i].status==-1)
702  continue;
703  p=auto_candidates[i];
704  for (size_t j=i+1;j<auto_candidates.size();j++)
705  {
710  {
711  if (p.cost<auto_candidates[j].cost)
712  {
713  auto_candidates[i].status=-1;
714  p=auto_candidates[j];
715  }
716  else
717  auto_candidates[j].status=-1;
718  }
719  }
720  }
721  saveAutoParticles(md);
722  md.write(fn,MD_OVERWRITE);
723  return auto_candidates.size();
724 }
void min(Image< double > &op1, const Image< double > &op2)
MultidimArray< double > autoFeatVec
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
#define DIRECT_A2D_ELEM(v, i, j)
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
doublereal * x
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define DIRECT_A1D_ELEM(v, i)
T computeMin() const
void max(Image< double > &op1, const Image< double > &op2)
#define j
double predict(MultidimArray< double > &featVec, double &score)
std::vector< Particle2 > auto_candidates
MultidimArray< double > vec
void generateFeatVec(const FileName &fnmicrograph, int proc_prec, std::vector< Particle2 > &positionArray)
T computeMax() const

◆ batchBuildInvariant()

void AutoParticlePicking2::batchBuildInvariant ( const std::vector< MDRowSql > &  MD)

Definition at line 172 of file micrograph_automatic_picking2.cpp.

173 {
174  int x, y, flag=0;
175  FileName micFile, posFile, preMicFile;
176 
177  MD[0].getValue(MDL_MICROGRAPH,preMicFile);
178  readMic(preMicFile,0);
179  for (size_t i=0;i<MD.size();i++)
180  {
181  MD[i].getValue(MDL_MICROGRAPH,micFile);
182  if (strcmp(micFile.c_str(),preMicFile.c_str()))
183  {
184  flag = 1;
185  readMic(micFile,0);
187  }
188  preMicFile=micFile;
189  if (i==(MD.size()-1))
190  {
191  mPrev.point1=p1;
192  mPrev.point2=p2;
193  flag = 0;
194  }
195  else
196  mPrev.point1.x=-1;
197  MD[i].getValue(MDL_XCOOR,x);
198  MD[i].getValue(MDL_YCOOR,y);
199  mPrev.add_coord(x,y,0,1);
200  }
201  if (!flag)
203 
204  Image<double> II;
205  II()=particleAvg;
206  II.write(fnAvgModel);
207 }
static double * y
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)
doublereal * x
#define i
long flag
X component (int)
Name of a micrograph (std::string)
Point point2
Definition: micrograph.h:117
void readMic(const FileName &fn_micrograph, int keepPrev)
Read micrograph from the file.
Point point1
Definition: micrograph.h:116
int add_coord(int x, int y, int label, double cost)
Definition: micrograph.cpp:496
Y component (int)
MultidimArray< double > particleAvg

◆ buildInvariant() [1/2]

void AutoParticlePicking2::buildInvariant ( const std::vector< MDRowSql > &  MD)

Definition at line 159 of file micrograph_automatic_picking2.cpp.

160 {
161  int x, y;
162  mPrev.point1.x=-1;
163  for (size_t i=0;i<MD.size();i++)
164  {
165  MD[i].getValue(MDL_XCOOR,x);
166  MD[i].getValue(MDL_YCOOR,y);
167  mPrev.add_coord(x,y,0,1);
168  }
170 }
static double * y
doublereal * x
#define i
X component (int)
Point point1
Definition: micrograph.h:116
int add_coord(int x, int y, int label, double cost)
Definition: micrograph.cpp:496
Y component (int)

◆ buildInvariant() [2/2]

void AutoParticlePicking2::buildInvariant ( MultidimArray< double > &  invariantChannel,
int  x,
int  y,
int  pre 
)

Definition at line 1076 of file micrograph_automatic_picking2.cpp.

1077 {
1078  MultidimArray<double> pieceImage;
1079  MultidimArray< std::complex< double > > fourierPolarStack, fourierPolar;
1080  MultidimArray<double> filter;
1082  FourierTransformer transformer;
1083  pieceImage.resize(NangSteps,NRsteps);
1084  transformer.FourierTransform(pieceImage,tmpFourier);
1085  fourierPolarStack.initZeros(filter_num,1,YSIZE(tmpFourier),XSIZE(tmpFourier));
1086  // First put the polar channels in a stack
1087  for (int j=0;j<filter_num;++j)
1088  {
1089  if (pre)
1091  else
1093  extractParticle(x,y,filter,pieceImage,true);
1094  fourierPolar.aliasImageInStack(fourierPolarStack,j);
1095  convert2PolarFourier(pieceImage,fourierPolar);
1096  }
1097  // Obtain the correlation between different channels
1098  polarCorrelation(fourierPolarStack,invariantChannel);
1099 }
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void aliasImageInStack(const MultidimArray< T > &m, size_t select_image)
static double * y
doublereal * x
void convert2PolarFourier(MultidimArray< double > &particleImage, MultidimArray< std::complex< double > > &polar)
Convert an image to its polar form.
#define XSIZE(v)
void polarCorrelation(const MultidimArray< std::complex< double > > &fourierPolarStack, MultidimArray< double > &IpolarCorr)
Calculate the correlation of different polar channels.
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
#define j
void initZeros(const MultidimArray< T1 > &op)
void extractParticle(const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)

◆ buildSearchSpace()

void AutoParticlePicking2::buildSearchSpace ( std::vector< Particle2 > &  positionArray,
bool  fast 
)

Definition at line 1648 of file micrograph_automatic_picking2.cpp.

1649 {
1650  int endX,endY;
1651  Particle2 p;
1652 
1656 
1657  for (int i=particle_radius;i<endY;i++)
1658  for (int j=particle_radius;j<endX;j++)
1660  {
1661  p.y=i;
1662  p.x=j;
1664  p.status=0;
1665  positionArray.push_back(p);
1666  }
1667  for (size_t i=0;i<positionArray.size();++i)
1668  for (size_t j=0;j<positionArray.size()-i-1;j++)
1669  if (positionArray[j].cost<positionArray[j + 1].cost)
1670  {
1671  p=positionArray[j+1];
1672  positionArray[j+1]=positionArray[j];
1673  positionArray[j]=p;
1674  }
1675 }
#define YSIZE(v)
#define DIRECT_A2D_ELEM(v, i, j)
#define i
bool isLocalMaxima(MultidimArray< double > &inputArray, int x, int y)
void applyConvolution(bool fast)
Convolve the micrograph with the different templates.
#define XSIZE(v)
#define j
MultidimArray< double > convolveRes

◆ buildVector()

void AutoParticlePicking2::buildVector ( MultidimArray< double > &  inputVec,
MultidimArray< double > &  staticVec,
MultidimArray< double > &  featureVec,
MultidimArray< double > &  pieceImage 
)

Definition at line 1036 of file micrograph_automatic_picking2.cpp.

1040 {
1042  MultidimArray<double> pcaBase;
1043  MultidimArray<double> pcaRBase;
1045 
1046  featureVec.resize(1,1,1,num_features);
1047  // Read the polar correlation from the stack and project on
1048  // PCA basis and put the value as the feature.
1049  for (int i=0;i<num_correlation;i++)
1050  {
1051  avg.aliasImageInStack(pcaModel,i*(NPCA + 1));
1052  avg.resize(1,1,1,XSIZE(avg)*YSIZE(avg));
1053  vec.aliasImageInStack(inputVec, i);
1054  vec.resize(1,1,1,XSIZE(vec)*YSIZE(vec));
1055  vec-=avg;
1056  for (int j=0;j<NPCA;j++)
1057  {
1058  pcaBase.aliasImageInStack(pcaModel,(i*(NPCA+1)+1)+j);
1059  pcaBase.resize(1,1,1,XSIZE(pcaBase)*YSIZE(pcaBase));
1060  DIRECT_A1D_ELEM(featureVec,j+(i*NPCA))=PCAProject(pcaBase,vec);
1061  }
1062  }
1063  // Extract the statics from the image
1064  for (int j=0;j<12;j++)
1065  DIRECT_A1D_ELEM(featureVec,j+num_correlation*NPCA)=DIRECT_A1D_ELEM(staticVec,j);
1066 
1067  // Projecting the image on rotational PCA basis
1068  for (int j=0;j<NRPCA;j++)
1069  {
1070  pcaRBase.aliasImageInStack(pcaRotModel,j);
1071  pcaRBase.resize(1,1,1,XSIZE(pcaRBase)*YSIZE(pcaRBase));
1072  DIRECT_A1D_ELEM(featureVec,num_correlation*NPCA+12+j)=PCAProject(pcaRBase,pieceImage);
1073  }
1074 }
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void aliasImageInStack(const MultidimArray< T > &m, size_t select_image)
#define i
#define DIRECT_A1D_ELEM(v, i)
MultidimArray< double > pcaRotModel
#define XSIZE(v)
#define j
double PCAProject(MultidimArray< double > &pcaBasis, MultidimArray< double > &vec)
Project a vector on one pca basis.
MultidimArray< double > pcaModel

◆ checkDist()

bool AutoParticlePicking2::checkDist ( Particle2 p)

Definition at line 962 of file micrograph_automatic_picking2.cpp.

963 {
964  int num_part=mPrev.ParticleNo();
965  int dist=0,min;
966  Particle2 posSample;
967 
968  posSample.x=(int)((mPrev.coord(0).X)*scaleRate);
969  posSample.y=(int)((mPrev.coord(0).Y)*scaleRate);
970  min=(int)euclidean_distance(p,posSample);
971  for (int i=1;i<num_part;i++)
972  {
973  posSample.x=(int)((mPrev.coord(i).X)*scaleRate);
974  posSample.y=(int)((mPrev.coord(i).Y)*scaleRate);
975  dist=(int)euclidean_distance(p,posSample);
976  if (dist<min)
977  min=dist;
978  }
979 
980  if (min>(0.25*particle_radius))
981  return true;
982  else
983  return false;
984 }
double euclidean_distance(const Particle2 &p1, const Particle2 &p2)
int ParticleNo() const
Definition: micrograph.h:188
int Y
Y position.
Definition: micrograph.h:62
void min(Image< double > &op1, const Image< double > &op2)
int X
X position.
Definition: micrograph.h:60
#define i
Particle_coords & coord(int n)
Definition: micrograph.h:486

◆ convert2PolarFourier()

void AutoParticlePicking2::convert2PolarFourier ( MultidimArray< double > &  particleImage,
MultidimArray< std::complex< double > > &  polar 
)

Convert an image to its polar form.

Definition at line 1456 of file micrograph_automatic_picking2.cpp.

1458 {
1459  Matrix1D<double> R;
1460  MultidimArray<double> polar;
1461  FourierTransformer transformer;
1462  particleImage.setXmippOrigin();
1463  image_convertCartesianToPolar_ZoomAtCenter(particleImage,polar,R,1,3,
1464  XSIZE(particleImage)/2,NRsteps,0,2*PI,NangSteps);
1465  transformer.FourierTransform(polar,polarFourier,true);
1466 }
void image_convertCartesianToPolar_ZoomAtCenter(const MultidimArray< double > &in, MultidimArray< double > &out, Matrix1D< double > &R, double zoomFactor, double Rmin, double Rmax, int NRSteps, float angMin, double angMax, int NAngSteps)
Definition: polar.cpp:276
#define XSIZE(v)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
#define PI
Definition: tools.h:43

◆ correction()

void AutoParticlePicking2::correction ( const std::vector< MDRowSql > &  addedParticlesMD,
const std::vector< MDRowSql > &  removedParticlesMD 
)

Definition at line 852 of file micrograph_automatic_picking2.cpp.

853 {
854  // dataSet.clear();
856  // classLabel.clear();
857  // loadTrainingSet(fnVector);
858  int idx=0,enabled,x,y;
859  double cost;
860  accepted_particles.clear();
861  rejected_particles.clear();
862 
863 
864  for (size_t i=0;i<removedParticlesMD.size();i++)
865  {
866  removedParticlesMD[i].getValue(MDL_ENABLED,enabled);
867  removedParticlesMD[i].getValue(MDL_XCOOR, x);
868  removedParticlesMD[i].getValue(MDL_YCOOR, y);
869 
870  if (enabled == -1)
871  {
872  removedParticlesMD[i].getValue(MDL_COST,cost);
873  if (cost!=-1.0)
874  rejected_particles.push_back(auto_candidates[idx]);
875  }
876  else
877  {
878  accepted_particles.push_back(auto_candidates[idx]);
879  mPrev.add_coord(x,y,0,0);
880  }
881  ++idx;
882  }
883  // if (!addedParticlesMD.isEmpty())
884  train(addedParticlesMD,true,0,0,0,0);
885  add2Dataset();
887  // normalizeDataset(0,1);
888  // generateTrainSet();
889  // classifier.SVMTrain(dataSetNormal,classLabel);
890  trainSVM(fnSVMModel,1);
891 }
static double * y
doublereal * x
#define i
Is this image enabled? (int [-1 or 1])
Cost for the image (double)
std::vector< Particle2 > rejected_particles
X component (int)
std::vector< Particle2 > accepted_particles
void trainSVM(const FileName &fnModel, int numClassifier)
MultidimArray< double > dataSetNormal
int add_coord(int x, int y, int label, double cost)
Definition: micrograph.cpp:496
std::vector< Particle2 > auto_candidates
Y component (int)
void train(const std::vector< MDRowSql > &MD, bool corrFlag, int x, int y, int width, int height)

◆ defineParams()

void AutoParticlePicking2::defineParams ( XmippProgram program)
static

Define the parameters of the main program.

Definition at line 1778 of file micrograph_automatic_picking2.cpp.

1779 {
1780  program->addParamsLine(" -i <micrograph> : Micrograph image");
1781  program->addParamsLine(" --outputRoot <rootname> : Output rootname");
1782  program->addParamsLine(" --mode <mode> : Operation mode");
1783  program->addParamsLine(" where <mode>");
1784  program->addParamsLine(" try : Try to autoselect within the training phase.");
1785  program->addParamsLine(" train : Train the classifier using the invariants features.");
1786  program->addParamsLine(" : <rootname>_auto_feature_vectors.txt contains the particle structure created by this program when used in automatic selection mode");
1787  program->addParamsLine(" : <rootname>_false_positives.xmd contains the list of false positives among the automatically picked particles");
1788  program->addParamsLine(" autoselect : Autoselect");
1789  program->addParamsLine(" buildinv <posfile=\"\"> : posfile contains the coordinates of manually picked particles");
1790  program->addParamsLine(" --model <model_rootname> : Bayesian model of the particles to pick");
1791  program->addParamsLine(" --particleSize <size> : Particle size in pixels");
1792  program->addParamsLine(" [--thr <p=1>] : Number of threads for automatic picking");
1793  program->addParamsLine(" [--fast] : Perform a fast preprocessing of the micrograph (Fourier filter instead of Wavelet filter)");
1794  program->addParamsLine(" [--in_core] : Read the micrograph in memory");
1795  program->addParamsLine(" [--filter_num <n=6>] : The number of filters in filter bank");
1796  program->addParamsLine(" [--NPCA <n=4>] : The number of PCA components");
1797  program->addParamsLine(" [--NCORR <n=2>] : The number of PCA components");
1798  program->addParamsLine(" [--autoPercent <n=90>] : The number of PCA components");
1799  program->addExampleLine("Automatically select particles during training:", false);
1800  program->addExampleLine("xmipp_micrograph_automatic_picking -i micrograph.tif --particleSize 100 --model model --thr 4 --outputRoot micrograph --mode try ");
1801  program->addExampleLine("Training:", false);
1802  program->addExampleLine("xmipp_micrograph_automatic_picking -i micrograph.tif --particleSize 100 --model model --thr 4 --outputRoot micrograph --mode train manual.pos");
1803  program->addExampleLine("Automatically select particles after training:", false);
1804  program->addExampleLine("xmipp_micrograph_automatic_picking -i micrograph.tif --particleSize 100 --model model --thr 4 --outputRoot micrograph --mode autoselect");
1805 }
void addExampleLine(const char *example, bool verbatim=true)
void addParamsLine(const String &line)

◆ extractInvariant() [1/2]

void AutoParticlePicking2::extractInvariant ( )

◆ extractInvariant() [2/2]

void AutoParticlePicking2::extractInvariant ( const FileName fnInvariantFeat,
const FileName fnParticles,
bool  avgFlag 
)

Definition at line 1397 of file micrograph_automatic_picking2.cpp.

1400 {
1401 
1402  extractPositiveInvariant(fnInvariantFeat,fnParticles,avgFlag);
1403  extractNegativeInvariant(fnInvariantFeat,fnParticles);
1404 }

◆ extractNegativeInvariant() [1/2]

void AutoParticlePicking2::extractNegativeInvariant ( )

Definition at line 283 of file micrograph_automatic_picking2.cpp.

284 {
285  MultidimArray<double> IpolarCorr;
286  MultidimArray<double> randomValues;
287  MultidimArray<double> pieceImage;
288  MultidimArray<int> randomIndexes;
289  std::vector<Particle2> negativeSamples;
290  size_t numNegInv = 0;
291  size_t numNegPart = 0;
292  int num_part=m.ParticleNo();
293 
295  // first we obtain all the places in which there could be
296  // a negative particles.
297  extractNonParticle(negativeSamples);
298  // Choose some random positions from the previous step.
299  std::random_device rd; //Will be used to obtain a seed for the random number engine
300  std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
301  std::uniform_real_distribution<> dist(0.0, 1.0);
302  randomValues.resize(1,1,1,negativeSamples.size());
304  DIRECT_A1D_ELEM(randomValues,i)=dist(gen);
305  randomValues.indexSort(randomIndexes);
306  int numNegatives;
307  // If the number of particles is lower than 15 then the
308  // number of the negatives is equal to 15 else it is equal
309  // to the number of particles times 2.
310  if (num_part<15)
311  numNegatives=15;
312  else
313  numNegatives=num_part*2;
314  if (fnPCAModel.exists())
315  {
316  negativeParticleStack.resize(size_t(numNegatives), 1, size_t(particle_size+1), size_t(particle_size+1));
317  negativeInvariatnStack.resize(size_t(numNegatives*num_correlation), 1, size_t(NangSteps), size_t(NRsteps));
318  }
319  else
320  {
321  numNegInv = NSIZE(negativeInvariatnStack);
322  numNegPart = NSIZE(negativeParticleStack);
323  negativeParticleStack.resize(size_t(numNegPart+numNegatives), 1, size_t(particle_size+1), size_t(particle_size+1));
324  negativeInvariatnStack.resize(size_t(numNegInv+numNegatives*num_correlation), 1, size_t(NangSteps), size_t(NRsteps));
325  }
326  for (int i=0;i<numNegatives;i++)
327  {
328  int x=negativeSamples[DIRECT_A1D_ELEM(randomIndexes,i)-1].x;
329  int y=negativeSamples[DIRECT_A1D_ELEM(randomIndexes,i)-1].y;
330  extractParticle(x,y,microImage(),pieceImage,false);
331  pieceImage.getImage(0,negativeParticleStack,numNegPart+i);
332  buildInvariant(IpolarCorr,x,y,1);
333  // Put the obtained invariants in the stack
334  for (size_t j=0;j<NSIZE(IpolarCorr);j++)
335  IpolarCorr.getImage(j,negativeInvariatnStack,numNegInv+i*num_correlation+j);
336 
337  }
338 }
#define NSIZE(v)
int ParticleNo() const
Definition: micrograph.h:188
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
static double * y
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
doublereal * x
#define i
#define DIRECT_A1D_ELEM(v, i)
void buildInvariant(const std::vector< MDRowSql > &MD)
bool exists() const
#define j
MultidimArray< double > negativeParticleStack
void initZeros(const MultidimArray< T1 > &op)
void extractParticle(const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)
MultidimArray< double > negativeInvariatnStack
void indexSort(MultidimArray< int > &indx) const
void getImage(size_t n, MultidimArray< T > &M, size_t n2=0) const
void extractNonParticle(std::vector< Particle2 > &negativePosition)

◆ extractNegativeInvariant() [2/2]

void AutoParticlePicking2::extractNegativeInvariant ( const FileName fnInvariantFeat,
const FileName fnParticles 
)

Definition at line 1346 of file micrograph_automatic_picking2.cpp.

1348 {
1349  MultidimArray<double> IpolarCorr;
1350  MultidimArray<double> randomValues;
1351  MultidimArray<double> pieceImage;
1352  MultidimArray<int> randomIndexes;
1353  std::vector<Particle2> negativeSamples;
1354  std::vector<Micrograph::Point> positionVec;
1355 
1356  int num_part=mPrev.ParticleNo();
1357  if (num_part==0)
1358  return;
1359  Image<double> II;
1360  FileName fnNegativeInvariatn=fnInvariantFeat+"_Negative.stk";
1361  FileName fnNegativeParticles=fnParticles+"_Negative.stk";
1363  // first we obtain all the places in which there could be
1364  // a negative particles.
1365  extractNonParticle(negativeSamples);
1366  if (negativeSamples.size()==0)
1367  return;
1368  // Choose some random positions from the previous step.
1369  std::random_device rd; //Will be used to obtain a seed for the random number engine
1370  std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
1371  std::uniform_real_distribution<> dist(0.0, 1.0);
1372  randomValues.resize(1,1,1,negativeSamples.size());
1374  DIRECT_A1D_ELEM(randomValues,i)=dist(gen);
1375  randomValues.indexSort(randomIndexes);
1376  int numNegatives;
1377  // If the number of particles is lower than 15 then the
1378  // number of the negatives is equal to 15 else it is equal
1379  // to the number of particles times 2.
1380  if (num_part<15)
1381  numNegatives=15;
1382  else
1383  numNegatives=int(num_part/2);
1384  for (int i=0;i<numNegatives;i++)
1385  {
1386  int x=negativeSamples[DIRECT_A1D_ELEM(randomIndexes,i)-1].x;
1387  int y=negativeSamples[DIRECT_A1D_ELEM(randomIndexes,i)-1].y;
1388  extractParticle(x,y,microImagePrev(),pieceImage,false);
1389  II()=pieceImage;
1390  II.write(fnNegativeParticles,ALL_IMAGES,true,WRITE_APPEND);
1391  buildInvariant(IpolarCorr,x,y,1);
1392  II()=IpolarCorr;
1393  II.write(fnNegativeInvariatn,ALL_IMAGES,true,WRITE_APPEND);
1394  }
1395 }
int ParticleNo() const
Definition: micrograph.h:188
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
static double * y
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)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
doublereal * x
#define i
#define DIRECT_A1D_ELEM(v, i)
void buildInvariant(const std::vector< MDRowSql > &MD)
#define ALL_IMAGES
void initZeros(const MultidimArray< T1 > &op)
void extractParticle(const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)
void indexSort(MultidimArray< int > &indx) const
void extractNonParticle(std::vector< Particle2 > &negativePosition)

◆ extractNonParticle()

void AutoParticlePicking2::extractNonParticle ( std::vector< Particle2 > &  negativePosition)

Definition at line 1422 of file micrograph_automatic_picking2.cpp.

1423 {
1424  int endX,endY,startX,startY;
1425  int gridStep=particle_radius/2;
1426  Particle2 negSample;
1427  if (mPrev.point1.x==-1)
1428  {
1429  startX = particle_radius*2;
1430  startY = particle_radius*2;
1431  endX = XSIZE(microImagePrev())-particle_radius*2;
1432  endY = YSIZE(microImagePrev())-particle_radius*2;
1433  }
1434  else
1435  {
1436  startX = p1.x+particle_radius*2;
1437  startY = p1.y+particle_radius*2;
1438  endX = p2.x-particle_radius*2;
1439  endY = p2.y-particle_radius*2;
1440  }
1441  MultidimArray<double> pieceImage;
1442 
1443 
1444  for (int i=startY;i<endY; i=i+gridStep)
1445  for (int j= startX;j<endX;j=j+gridStep)
1446  {
1447  negSample.y=i;
1448  negSample.x=j;
1449  if (checkDist(negSample))
1450  {
1451  extractParticle(j,i,microImagePrev(),pieceImage,false);
1452  negativePosition.push_back(negSample);
1453  }
1454  }
1455 }
#define YSIZE(v)
#define i
#define XSIZE(v)
#define j
Point point1
Definition: micrograph.h:116
void extractParticle(const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)

◆ extractParticle()

void AutoParticlePicking2::extractParticle ( const int  x,
const int  y,
MultidimArray< double > &  filter,
MultidimArray< double > &  particleImage,
bool  normal 
)

Definition at line 1406 of file micrograph_automatic_picking2.cpp.

1410 {
1411  int startX, startY, endX, endY;
1412  startX = x - particle_radius;
1413  startY = y - particle_radius;
1414  endX = x + particle_radius;
1415  endY = y + particle_radius;
1416 
1417  filter.window(particleImage, startY, startX, endY, endX);
1418  if (normal)
1419  normalize_OldXmipp(particleImage);
1420 }
static double * y
doublereal * x
void window(MultidimArray< T1 > &result, int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T1 init_value=0) const
void normalize_OldXmipp(MultidimArray< double > &I)
Definition: normalize.cpp:33

◆ extractPositiveInvariant() [1/2]

void AutoParticlePicking2::extractPositiveInvariant ( )

Definition at line 215 of file micrograph_automatic_picking2.cpp.

216 {
217  MultidimArray<double> IpolarCorr;
218  MultidimArray<double> pieceImage;
219  MultidimArray<double> invariantImage;
220  MultidimArray<double> polarImage;
221  AlignmentAux aux;
222  CorrelationAux aux2;
225  int numPosInv = 0;
226  int numPosPart = 0;
227 
228  int num_part = m.ParticleNo();
229  Image<double> II;
231  if (fnPCAModel.exists())
232  {
235  }
236  else
237  {
239  numPosInv = NSIZE(positiveInvariatnStack);
240  numPosPart = NSIZE(positiveParticleStack);
241  positiveParticleStack.resize(numPosPart+num_part, 1, particle_size+1, particle_size+1);
243  }
244  for (int i=0;i<num_part;i++)
245  {
246  auto x=(int)((m.coord(i).X)*scaleRate);
247  auto y=(int)((m.coord(i).Y)*scaleRate);
248 
249  buildInvariant(IpolarCorr,x,y,1);
250  // Keep the particles to train the classifiers
251  extractParticle(x,y,microImage(),pieceImage,false);
252  pieceImage.getImage(0,positiveParticleStack,numPosPart+i);
253  //pieceImage.aliasImageInStack(positiveParticleStack,numPosPart+i);
254 
255  // Put the obtained invariants in the stack
256  for (size_t j=0;j<NSIZE(IpolarCorr);j++)
257  IpolarCorr.getImage(j,positiveInvariatnStack,numPosInv+i*num_correlation+j);
258  // Compute the average of the manually picked particles after doing aligning
259  // We just do it on manually picked particles and the flag show that if we
260  // are in this step.
261  if (!fnPCAModel.exists())
262  {
263  pieceImage.setXmippOrigin();
265  if (particleAvg.computeMax()==0)
266  particleAvg+=pieceImage;
267  else
268  {
269  alignImages(particleAvg,pieceImage,M,true,aux,aux2,aux3);
270  particleAvg+=pieceImage;
271  }
272  }
273  }
274  if (!fnPCAModel.exists())
275  {
276  particleAvg/=num_part;
277  Image<double> II;
278  II()=particleAvg;
279  II.write(fnAvgModel);
280  }
281 }
#define NSIZE(v)
int ParticleNo() const
Definition: micrograph.h:188
int Y
Y position.
Definition: micrograph.h:62
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
double alignImages(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3)
Definition: filters.cpp:2047
static double * y
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)
int X
X position.
Definition: micrograph.h:60
doublereal * x
#define i
MultidimArray< double > positiveParticleStack
void buildInvariant(const std::vector< MDRowSql > &MD)
MultidimArray< double > positiveInvariatnStack
bool exists() const
#define j
Particle_coords & coord(int n)
Definition: micrograph.h:486
MultidimArray< double > particleAvg
void initZeros(const MultidimArray< T1 > &op)
void extractParticle(const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)
void getImage(size_t n, MultidimArray< T > &M, size_t n2=0) const
T computeMax() const

◆ extractPositiveInvariant() [2/2]

void AutoParticlePicking2::extractPositiveInvariant ( const FileName fnInvariantFeat,
const FileName fnParticles,
bool  avgFlag 
)

Definition at line 1292 of file micrograph_automatic_picking2.cpp.

1296 {
1297 
1298  MultidimArray<double> IpolarCorr;
1299  MultidimArray<double> pieceImage;
1300  AlignmentAux aux;
1301  CorrelationAux aux2;
1303  Matrix2D<double> M;
1304 
1305  int num_part =mPrev.ParticleNo();
1306  if (num_part==0)
1307  return;
1308  Image<double> II;
1309  FileName fnPositiveInvariatn=fnInvariantFeat+"_Positive.stk";
1310  FileName fnPositiveParticles=fnParticles+"_Positive.stk";
1312 
1313  for (int i=0;i<num_part;i++)
1314  {
1315  double cost = mPrev.coord(i).cost;
1316  if (cost == 0)
1317  continue;
1318  auto x=(int)((mPrev.coord(i).X)*scaleRate);
1319  auto y=(int)((mPrev.coord(i).Y)*scaleRate);
1320  buildInvariant(IpolarCorr,x,y,1);
1321  extractParticle(x,y,microImagePrev(),pieceImage,false);
1322  II()=pieceImage;
1323  II.write(fnPositiveParticles,ALL_IMAGES,true,WRITE_APPEND);
1324  // Compute the average of the manually picked particles after doing aligning
1325  // We just do it on manually picked particles and the flag show that if we
1326  // are in this step.
1327  if (avgFlag==false)
1328  {
1329  pieceImage.setXmippOrigin();
1331  if (particleAvg.computeMax()==0)
1332  particleAvg=particleAvg+pieceImage;
1333  else
1334  {
1335  alignImages(particleAvg,pieceImage,M,true,aux,aux2,aux3);
1336  particleAvg=particleAvg+pieceImage;
1337  }
1338  }
1339  II()=IpolarCorr;
1340  II.write(fnPositiveInvariatn,ALL_IMAGES,true,WRITE_APPEND);
1341  }
1342  if (avgFlag==false)
1343  particleAvg/=num_part;
1344 }
int ParticleNo() const
Definition: micrograph.h:188
int Y
Y position.
Definition: micrograph.h:62
double alignImages(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, bool wrap, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3)
Definition: filters.cpp:2047
static double * y
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)
int X
X position.
Definition: micrograph.h:60
doublereal * x
#define i
void buildInvariant(const std::vector< MDRowSql > &MD)
#define ALL_IMAGES
Particle_coords & coord(int n)
Definition: micrograph.h:486
double cost
Cost, scaled between 0 and 1.
Definition: micrograph.h:66
MultidimArray< double > particleAvg
void initZeros(const MultidimArray< T1 > &op)
void extractParticle(const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)
T computeMax() const

◆ extractStatics()

void AutoParticlePicking2::extractStatics ( MultidimArray< double > &  inputVec,
MultidimArray< double > &  features 
)

Definition at line 1021 of file micrograph_automatic_picking2.cpp.

1023 {
1024  MultidimArray<double> sortedVec;
1025  features.resize(1,1,1,12);
1026  DIRECT_A1D_ELEM(features,0)=inputVec.computeAvg();
1027  DIRECT_A1D_ELEM(features,1)=inputVec.computeStddev();
1028  normalize_OldXmipp(inputVec);
1029  // Sorting the image in order to find the quantiles
1030  inputVec.sort(sortedVec);
1031  auto step=(int)floor(XSIZE(sortedVec)*0.1);
1032  for (int i=2;i<12;i++)
1033  DIRECT_A1D_ELEM(features,i)=DIRECT_A1D_ELEM(sortedVec,(i-1)*step);
1034 }
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
__host__ __device__ float2 floor(const float2 v)
void sort(MultidimArray< T > &result) const
#define i
#define DIRECT_A1D_ELEM(v, i)
#define XSIZE(v)
void normalize_OldXmipp(MultidimArray< double > &I)
Definition: normalize.cpp:33
double computeStddev() const
double computeAvg() const

◆ filterBankGenerator()

void AutoParticlePicking2::filterBankGenerator ( )

Definition at line 131 of file micrograph_automatic_picking2.cpp.

132 {
133  MultidimArray<double> inputMicrograph;
135 
136  inputMicrograph = microImage();
137  filterBankStack.resize(size_t(filter_num), 1,
138  size_t(YSIZE(inputMicrograph)),
139  size_t(XSIZE(inputMicrograph)));
140  FourierFilter filter;
141  filter.raised_w=0.02;
142  filter.FilterShape=RAISED_COSINE;
143  filter.FilterBand=BANDPASS;
144  MultidimArray<std::complex<double> > micrographFourier;
145  FourierTransformer transformer;
146  transformer.FourierTransform(inputMicrograph,micrographFourier,true);
147  for (int i=0;i<filter_num;i++)
148  {
149  filter.w1=0.025*i;
150  filter.w2=(filter.w1)+0.025;
151  transformer.setFourier(micrographFourier);
152  filter.applyMaskFourierSpace(microImage(),transformer.fFourier);
153  transformer.inverseFourierTransform();
155  Iaux=inputMicrograph;
156  }
157 }
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
MultidimArray< std::complex< double > > fFourier
Definition: xmipp_fftw.h:70
void aliasImageInStack(const MultidimArray< T > &m, size_t select_image)
#define BANDPASS
#define i
void setFourier(const MultidimArray< std::complex< double > > &imgFourier)
Definition: xmipp_fftw.cpp:249
#define XSIZE(v)
#define RAISED_COSINE
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
MultidimArray< double > filterBankStack
void applyMaskFourierSpace(const MultidimArray< double > &v, MultidimArray< std::complex< double > > &V)

◆ generateFeatVec()

void AutoParticlePicking2::generateFeatVec ( const FileName fnmicrograph,
int  proc_prec,
std::vector< Particle2 > &  positionArray 
)

Definition at line 727 of file micrograph_automatic_picking2.cpp.

728 {
729  MultidimArray<double> IpolarCorr;
730  MultidimArray<double> featVec;
731  MultidimArray<double> pieceImage;
732  MultidimArray<double> staticVec;
733 
734  readMic(fnmicrograph,1);
736  buildSearchSpace(positionArray,true);
737 
738  auto num=(int)(positionArray.size()*(proc_prec/100.0));
740  for (int k=0;k<num;k++)
741  {
742  if (flagAbort)
743  return;
744  int j=positionArray[k].x;
745  int i=positionArray[k].y;
746  buildInvariant(IpolarCorr,j,i,0);
747  extractParticle(j,i,microImage(),pieceImage,false);
748  pieceImage.resize(1,1,1,XSIZE(pieceImage)*YSIZE(pieceImage));
749  extractStatics(pieceImage,staticVec);
750  buildVector(IpolarCorr,staticVec,featVec,pieceImage);
751  // Keep the features on memory to classify later on
754  }
755 }
void buildSearchSpace(std::vector< Particle2 > &positionArray, bool fast)
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
MultidimArray< double > autoFeatVec
#define DIRECT_A2D_ELEM(v, i, j)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define DIRECT_A1D_ELEM(v, i)
void extractStatics(MultidimArray< double > &inputVec, MultidimArray< double > &features)
#define XSIZE(v)
void buildInvariant(const std::vector< MDRowSql > &MD)
#define j
void readMic(const FileName &fn_micrograph, int keepPrev)
Read micrograph from the file.
void initZeros(const MultidimArray< T1 > &op)
void buildVector(MultidimArray< double > &inputVec, MultidimArray< double > &staticVec, MultidimArray< double > &featureVec, MultidimArray< double > &pieceImage)
void extractParticle(const int x, const int y, MultidimArray< double > &filter, MultidimArray< double > &particleImage, bool normal)

◆ generateTrainSet()

void AutoParticlePicking2::generateTrainSet ( )

Definition at line 1587 of file micrograph_automatic_picking2.cpp.

1588 {
1589  int cnt=0;
1592  cnt++;
1593  dataSet1.resize(1,1,cnt,XSIZE(dataSet));
1594  classLabel1.resize(1,1,1,cnt);
1595  cnt=0;
1597  {
1599  {
1600  if (DIRECT_A1D_ELEM(classLabel,i)==3)
1601  {
1604  }
1605  else
1607  for (size_t j=0;j<XSIZE(dataSet);j++)
1609  cnt++;
1610  }
1611  }
1612 }
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
#define i
#define DIRECT_A1D_ELEM(v, i)
MultidimArray< double > classLabel1
MultidimArray< double > dataSet1
#define XSIZE(v)
#define j
MultidimArray< double > classLabel

◆ getParticlesThreshold()

int AutoParticlePicking2::getParticlesThreshold ( )

Definition at line 846 of file micrograph_automatic_picking2.cpp.

847 {
848  return 15;
849 
850 }

◆ loadTrainingSet()

void AutoParticlePicking2::loadTrainingSet ( const FileName fn_root)

Load training set into the related array.

Definition at line 1468 of file micrograph_automatic_picking2.cpp.

1469 {
1470  int x,y;
1471  std::ifstream fhTrain;
1472  fhTrain.open(fn.c_str());
1473  fhTrain >>y>>x;
1474  dataSet.resize(1,1,y,x);
1475  classLabel.resize(1,1,1,y);
1476  // Load the train set and put the values in training array
1477  for (int i=0;i<y;i++)
1478  {
1479  fhTrain >>classLabel(i);
1480  for (int j= 0;j<x;j++)
1481  fhTrain>>DIRECT_A2D_ELEM(dataSet,i,j);
1482  }
1483  fhTrain.close();
1484 }
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
MultidimArray< double > dataSet
static double * y
#define DIRECT_A2D_ELEM(v, i, j)
doublereal * x
#define i
#define j
MultidimArray< double > classLabel

◆ normalizeDataset()

void AutoParticlePicking2::normalizeDataset ( int  a,
int  b 
)

Definition at line 1614 of file micrograph_automatic_picking2.cpp.

1615 {
1616 
1617  double max,min;
1618  MultidimArray<double> maxA;
1619  MultidimArray<double> minA;
1620 
1621  maxA.resize(1,1,1,YSIZE(dataSet));
1622  minA.resize(1,1,1,YSIZE(dataSet));
1623 
1624  // Computing the maximum and minimum of each row
1625  for (size_t i=0;i<YSIZE(dataSet);i++)
1626  {
1627  max=min=DIRECT_A2D_ELEM(dataSet,i,0);
1628  for (size_t j=1;j<XSIZE(dataSet);j++)
1629  {
1630  if (max<DIRECT_A2D_ELEM(dataSet,i,j))
1631  max=DIRECT_A2D_ELEM(dataSet,i,j);
1632  if (min>DIRECT_A2D_ELEM(dataSet,i,j))
1633  min=DIRECT_A2D_ELEM(dataSet,i,j);
1634  }
1635  DIRECT_A1D_ELEM(maxA,i)=max;
1636  DIRECT_A1D_ELEM(minA,i)=min;
1637  }
1638  // Normalizing the dataset according to the max and mean
1639  for (size_t i=0;i<YSIZE(dataSet);i++)
1640  {
1641  max=DIRECT_A1D_ELEM(maxA,i);
1642  min=DIRECT_A1D_ELEM(minA,i);
1643  for (size_t j=0;j<XSIZE(dataSet);j++)
1644  DIRECT_A2D_ELEM(dataSet,i,j)=a+((b-a)*((DIRECT_A2D_ELEM(dataSet,i,j)-min)/(max-min)));
1645  }
1646 }
#define YSIZE(v)
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)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
#define i
#define DIRECT_A1D_ELEM(v, i)
doublereal * b
#define XSIZE(v)
void max(Image< double > &op1, const Image< double > &op2)
#define j
doublereal * a

◆ PCAProject()

double AutoParticlePicking2::PCAProject ( MultidimArray< double > &  pcaBasis,
MultidimArray< double > &  vec 
)

Project a vector on one pca basis.

Definition at line 1101 of file micrograph_automatic_picking2.cpp.

1103 {
1104  double dotProduct=0;
1105  const double *ptr2 = &DIRECT_A1D_ELEM(pcaBasis,0);
1106  const double *ptr3 = &DIRECT_A1D_ELEM(vec,0);
1107  size_t iBlockMax = XSIZE(pcaBasis) / 4;
1108  for (size_t i = 0; i < iBlockMax; i++)
1109  {
1110  dotProduct += (*ptr2++) * (*ptr3++);
1111  dotProduct += (*ptr2++) * (*ptr3++);
1112  dotProduct += (*ptr2++) * (*ptr3++);
1113  dotProduct += (*ptr2++) * (*ptr3++);
1114  }
1115  for (size_t i = iBlockMax * 4; i < XSIZE(pcaBasis); ++i)
1116  dotProduct += (*ptr2++) * (*ptr3++);
1117  return dotProduct;
1118 }
#define i
#define DIRECT_A1D_ELEM(v, i)
#define XSIZE(v)
T dotProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
Definition: matrix1d.h:1140

◆ polarCorrelation()

void AutoParticlePicking2::polarCorrelation ( const MultidimArray< std::complex< double > > &  fourierPolarStack,
MultidimArray< double > &  IpolarCorr 
)

Calculate the correlation of different polar channels.

Definition at line 1005 of file micrograph_automatic_picking2.cpp.

1007 {
1008  int nF = NSIZE(fourierPolarStack);
1009  CorrelationAux aux;
1010 
1011  for (int n=0; n<nF;++n)
1012  correlationBetweenPolarChannels(n,n,n,fourierPolarStack,IpolarCorr,aux);
1013  for (int i=0; i<(filter_num-corr_num);i++)
1014  for (int j=1;j<=corr_num;j++)
1015  correlationBetweenPolarChannels(i,i+j,nF++,fourierPolarStack,IpolarCorr,aux);
1016 }
#define NSIZE(v)
void correlationBetweenPolarChannels(int n1, int n2, int nF, const MultidimArray< std::complex< double > > &fourierPolarStack, MultidimArray< double > &mIpolarCorr, CorrelationAux &aux)
#define i
#define j
int * n

◆ readMic()

void AutoParticlePicking2::readMic ( const FileName fn_micrograph,
int  keepPrev 
)

Read micrograph from the file.

Definition at line 102 of file micrograph_automatic_picking2.cpp.

103 {
104  if (keepPrev)
105  {
106  mPrev=m;
109  }
110  m.open_micrograph(fn_micrograph);
111  microImage.read(fn_micrograph);
112  // Resize the Micrograph
114  (int)((m.Xdim)*scaleRate),
115  microImage(),2);
116 
117  m.point1.x=-1;
121 
122  if (!keepPrev)
123  {
124  mPrev=m;
127  }
128 }
void open_micrograph(const FileName &fn_micrograph)
Definition: micrograph.cpp:61
void selfScaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mda, int nThreads)
Definition: xmipp_fftw.cpp:723
size_t Xdim
Definition: micrograph.h:112
Point point1
Definition: micrograph.h:116
MultidimArray< double > filterBankStack
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
size_t Ydim
Definition: micrograph.h:113

◆ readMicrograph()

void AutoParticlePicking2::readMicrograph ( )

Read the micrograph in memory.

◆ readNextMic()

int AutoParticlePicking2::readNextMic ( FileName fnmicrograph)

Definition at line 827 of file micrograph_automatic_picking2.cpp.

828 {
829  FileName currentMic;
830  size_t lastObjId = micList.size();
831  for (size_t i=0;i<micList.size();i++)
832  {
833  micList[i].getValue(MDL_MICROGRAPH,currentMic);
834  if (i==lastObjId-1)
835  return 0;
836  if (!strcmp(currentMic.c_str(),fnmicrograph.c_str()))
837  {
838  micList[i+1].getValue(MDL_MICROGRAPH,currentMic);
839  fnmicrograph=currentMic;
840  return 1;
841  }
842  }
843  return 1;
844 }
#define i
Name of a micrograph (std::string)
std::vector< MDRowSql > micList

◆ readParams()

void AutoParticlePicking2::readParams ( XmippProgram program)

Read the parmaeters of the main program.

Definition at line 1766 of file micrograph_automatic_picking2.cpp.

1767 {
1768  fn_micrograph = program->getParam("-i");
1769  particle_size = program->getIntParam("--particleSize");
1770  NPCA = program->getIntParam("--NPCA");
1771  filter_num = program->getIntParam("--filter_num");
1772  corr_num = program->getIntParam("--NCORR");
1773  Nthreads = program->getIntParam("--thr");
1774  fast = program->checkParam("--fast");
1775  proc_prec = program->getIntParam("--autoPercent");
1776 }
const char * getParam(const char *param, int arg=0)
bool checkParam(const char *param)
int getIntParam(const char *param, int arg=0)

◆ saveAutoParticles() [1/2]

void AutoParticlePicking2::saveAutoParticles ( MetaData md)

Definition at line 1552 of file micrograph_automatic_picking2.cpp.

1553 {
1554  size_t nmax=auto_candidates.size();
1555  for (size_t n=0;n<nmax;++n)
1556  {
1557  const Particle2 &p=auto_candidates[n];
1558  if (p.cost>0 && p.status==1)
1559  {
1560  size_t id=md.addObject();
1561  md.setValue(MDL_XCOOR,int(p.x*(1.0/scaleRate)),id);
1562  md.setValue(MDL_YCOOR,int(p.y*(1.0/scaleRate)),id);
1563  md.setValue(MDL_COST, p.cost,id);
1564  md.setValue(MDL_ENABLED,1,id);
1565  }
1566  }
1567 }
int * nmax
virtual size_t addObject()=0
Is this image enabled? (int [-1 or 1])
Cost for the image (double)
X component (int)
bool setValue(const MDLabel label, const T &valueIn, size_t id)
std::vector< Particle2 > auto_candidates
Y component (int)
int * n

◆ saveAutoParticles() [2/2]

void AutoParticlePicking2::saveAutoParticles ( std::vector< MDRowSql > &  md)

Definition at line 1569 of file micrograph_automatic_picking2.cpp.

1570 {
1571  size_t nmax=auto_candidates.size();
1572  MDRowSql row;
1573  for (size_t n=0;n<nmax;++n)
1574  {
1575  const Particle2 &p=auto_candidates[n];
1576  if (p.cost>0 && p.status==1)
1577  {
1578  row.setValue(MDL_XCOOR,int(p.x*(1.0/scaleRate)));
1579  row.setValue(MDL_YCOOR,int(p.y*(1.0/scaleRate)));
1580  row.setValue(MDL_COST, p.cost);
1581  row.setValue(MDL_ENABLED,1);
1582  md.push_back(row);
1583  }
1584  }
1585 }
int * nmax
Is this image enabled? (int [-1 or 1])
Cost for the image (double)
void setValue(const MDObject &object) override
X component (int)
std::vector< Particle2 > auto_candidates
Y component (int)
int * n

◆ savePCAModel()

void AutoParticlePicking2::savePCAModel ( const FileName fn)

Save the PCA basis and average for each channel.

Definition at line 1531 of file micrograph_automatic_picking2.cpp.

1532 {
1533  FileName fnPcaModel=fn_root+"_pca_model.stk";
1534  Image<double> II;
1536 
1537  avg=pcaAnalyzer.avg;
1538  avg.resize(1,1,NangSteps,NRsteps);
1539  II()=avg;
1540  II.write(fnPcaModel,ALL_IMAGES,true, WRITE_APPEND);
1541  for (int i=0; i<NPCA;i++)
1542  {
1543  MultidimArray<double> pcaBasis;
1544  pcaBasis=pcaAnalyzer.PCAbasis[i];
1545  pcaBasis.resize(1,1,NangSteps,NRsteps);
1546  II()=pcaBasis;
1547  II.write(fnPcaModel,ALL_IMAGES,true,WRITE_APPEND);
1548  }
1549 }
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
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)
#define i
std::vector< MultidimArray< double > > PCAbasis
Definition: basic_pca.h:69
#define ALL_IMAGES
MultidimArray< double > avg
Definition: basic_pca.h:72
PCAMahalanobisAnalyzer pcaAnalyzer

◆ saveTrainingSet() [1/2]

void AutoParticlePicking2::saveTrainingSet ( )

Definition at line 525 of file micrograph_automatic_picking2.cpp.

526 {
527  std::ofstream fhTrain;
528  fhTrain.open(fnVector.c_str());
529  fhTrain<<YSIZE(dataSet)<< " "<< XSIZE(dataSet)<< std::endl;
530  for (size_t i=0;i<YSIZE(dataSet);i++)
531  {
532  fhTrain<<classLabel(i)<< std::endl;
533  for (size_t j=0;j<XSIZE(dataSet);j++)
534  fhTrain<<DIRECT_A2D_ELEM(dataSet,i,j)<<" ";
535  fhTrain<<std::endl;
536  }
537  fhTrain.close();
538 }
#define YSIZE(v)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
#define i
#define XSIZE(v)
#define j
MultidimArray< double > classLabel

◆ saveTrainingSet() [2/2]

void AutoParticlePicking2::saveTrainingSet ( const FileName fn_root)

Save training set into memory.

Definition at line 1486 of file micrograph_automatic_picking2.cpp.

1487 {
1488  double max,min;
1489  int a=0,b=1;
1490  MultidimArray<double> maxA,minA;
1491  std::ofstream fhTrain;
1492 
1493  maxA.resize(1,1,1,YSIZE(dataSet));
1494  minA.resize(1,1,1,YSIZE(dataSet));
1495 
1497 
1498  // Computing the maximum and minimum of each row
1499  for (size_t i=0;i<YSIZE(dataSet);i++)
1500  {
1501  max=min=DIRECT_A2D_ELEM(dataSet,i,0);
1502  for (size_t j=1;j<XSIZE(dataSet);j++)
1503  {
1504  if (max<DIRECT_A2D_ELEM(dataSet,i,j))
1505  max=DIRECT_A2D_ELEM(dataSet,i,j);
1506  if (min>DIRECT_A2D_ELEM(dataSet,i,j))
1507  min=DIRECT_A2D_ELEM(dataSet,i,j);
1508  }
1509  DIRECT_A1D_ELEM(maxA,i)=max;
1510  DIRECT_A1D_ELEM(minA,i)=min;
1511  }
1512 
1513  fhTrain.open(fn.c_str());
1514  fhTrain<<YSIZE(dataSet)<< " "<< XSIZE(dataSet)<< std::endl;
1515  // Normalizing the dataset according to the max and mean
1516  for (size_t i=0;i<YSIZE(dataSet);i++)
1517  {
1518  fhTrain<<classLabel(i)<< std::endl;
1519  max=DIRECT_A1D_ELEM(maxA,i);
1520  min=DIRECT_A1D_ELEM(minA,i);
1521  for (size_t j=0;j<XSIZE(dataSet);j++)
1522  {
1523  fhTrain<<DIRECT_A2D_ELEM(dataSet,i,j)<<" ";
1524  DIRECT_A2D_ELEM(dataSetNormal,i,j)=a+((b-a)*((DIRECT_A2D_ELEM(dataSet,i,j)-min)/(max-min)));
1525  }
1526  fhTrain<<std::endl;
1527  }
1528  fhTrain.close();
1529 }
#define NSIZE(v)
#define YSIZE(v)
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)
MultidimArray< double > dataSet
#define DIRECT_A2D_ELEM(v, i, j)
#define i
#define DIRECT_A1D_ELEM(v, i)
doublereal * b
#define XSIZE(v)
void max(Image< double > &op1, const Image< double > &op2)
#define ZSIZE(v)
#define j
MultidimArray< double > dataSetNormal
MultidimArray< double > classLabel
doublereal * a

◆ setSize()

void AutoParticlePicking2::setSize ( int  pSize)

Definition at line 92 of file micrograph_automatic_picking2.cpp.

93 {
94  double t=std::max(0.25,50.0/pSize);
95  scaleRate=std::min(1.0,t);
96  particle_radius=(int)((pSize*scaleRate)*0.5);
99 }
void min(Image< double > &op1, const Image< double > &op2)
void max(Image< double > &op1, const Image< double > &op2)

◆ train()

void AutoParticlePicking2::train ( const std::vector< MDRowSql > &  MD,
bool  corrFlag,
int  x,
int  y,
int  width,
int  height 
)

Definition at line 456 of file micrograph_automatic_picking2.cpp.

457 {
458  if (width!=0)
459  {
460  // Scale the specified region in the last micrograph to fit to the scaled one
461  x*=scaleRate;
462  y*=scaleRate;
463  width*=scaleRate;
464  height*=scaleRate;
465  p1.x=x;
466  p1.y=y;
467  p2.x=x+width;
468  p2.y=y+height;
469  }
470  // Check if we are not in correcting mode
471  if (!corrFlag)
472  {
473  if (fnPCAModel.exists())
474  {
475  // First delete are related files
480 
481  //Second reset all the arrays
482  pcaModel.clear();
483  pcaRotModel.clear();
484  particleAvg.clear();
485  dataSet.clear();
486  classLabel.clear();
487  }
488  std::cout << "Read the data for PCA, Rot PCA, Average ..." << std::endl;
489  // Read the data for PCA, Rot PCA, Average
495  Image<double> II;
496  II.read(fnPCAModel);
497  pcaModel=II();
498  std::cout << "Read rotational PCA model ..." << std::endl;
499  // Read rotational PCA model
500  II.read(fnPCARotModel);
501  pcaRotModel=II();
502  // Read the average of the particles for convolution
503  II.read(fnAvgModel);
504  particleAvg=II();
505  }
506  if (corrFlag)
507  {
508  buildInvariant(MD);
509  dataSet.clear();
510  classLabel.clear();
512  add2Dataset(fnInvariant+"_Positive.stk",fnParticles+"_Positive.stk",1);
513  add2Dataset(fnInvariant+"_Negative.stk",fnParticles+"_Negative.stk",2);
514  }
515  else
516  {
517  add2Dataset(fnInvariant+"_Positive.stk",fnParticles+"_Positive.stk",1);
518  add2Dataset(fnInvariant+"_Negative.stk",fnParticles+"_Negative.stk",2);
520  normalizeDataset(0,1);
521  trainSVM(fnSVMModel,1);
522  }
523 }
MultidimArray< double > dataSet
static double * y
FileName removeAllExtensions() const
doublereal * x
void batchBuildInvariant(const std::vector< MDRowSql > &MD)
void loadTrainingSet(const FileName &fn_root)
Load training set into the related array.
MultidimArray< double > pcaRotModel
void buildInvariant(const std::vector< MDRowSql > &MD)
void trainSVM(const FileName &fnModel, int numClassifier)
bool exists() const
void deleteFile() const
MultidimArray< double > classLabel
void trainRotPCA(const FileName &fnAvgModel, const FileName &fnPCARotModel)
MultidimArray< double > pcaModel
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
MultidimArray< double > particleAvg
void initZeros(const MultidimArray< T1 > &op)

◆ trainPCA() [1/2]

void AutoParticlePicking2::trainPCA ( )

Definition at line 340 of file micrograph_automatic_picking2.cpp.

341 {
342  MultidimArray<float> pcaVec;
343  MultidimArray<double> pcaVecD;
345  Image<double> II;
346 
349 
350  // Read the channel correlation one by one and obtain the basis for them.
351  for (int i=0;i<num_correlation;i++)
352  {
353  for (int j=0;j<steps;j++)
354  {
355  pcaVecD.resize(1 , NangSteps, NRsteps);
356  positiveInvariatnStack.getImage(j*num_correlation+i,pcaVecD);
357  pcaVecD.resize(1, 1, XSIZE(pcaVecD)*YSIZE(pcaVecD));
358  pcaVec.resize(pcaVecD);
360  DIRECT_A1D_ELEM(pcaVec,i)=(float)DIRECT_A1D_ELEM(pcaVecD,i);
361  pcaAnalyzer.addVector(pcaVec);
362  }
365  avg=pcaAnalyzer.avg;
366  avg.resize(1, NangSteps, NRsteps);
367  avg.getImage(0, pcaModel, i*(NPCA+1));
368  for (int k=0; k<NPCA;k++)
369  {
370  MultidimArray<double> pcaBasis;
371  pcaBasis=pcaAnalyzer.PCAbasis[k];
372  pcaBasis.resize(1, NangSteps, NRsteps);
373  pcaBasis.getImage(0, pcaModel, i*(NPCA+1)+k+1);
374  }
375  pcaAnalyzer.clear();
376  }
377  II()=pcaModel;
380  II.read(fnPCARotModel);
381  pcaRotModel = II();
382 }
#define NSIZE(v)
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void addVector(const MultidimArray< float > &_v)
Add vector.
Definition: basic_pca.h:100
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 subtractAvg()
Subtract average.
Definition: basic_pca.cpp:33
FileName removeAllExtensions() const
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define DIRECT_A1D_ELEM(v, i)
MultidimArray< double > pcaRotModel
#define XSIZE(v)
std::vector< MultidimArray< double > > PCAbasis
Definition: basic_pca.h:69
MultidimArray< double > positiveInvariatnStack
#define j
double steps
void trainRotPCA(const FileName &fnAvgModel, const FileName &fnPCARotModel)
#define ALL_IMAGES
MultidimArray< double > pcaModel
void clear()
Clear.
Definition: basic_pca.h:84
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< double > avg
Definition: basic_pca.h:72
PCAMahalanobisAnalyzer pcaAnalyzer
void getImage(size_t n, MultidimArray< T > &M, size_t n2=0) const

◆ trainPCA() [2/2]

void AutoParticlePicking2::trainPCA ( const FileName fnPositiveFeat)

Definition at line 1120 of file micrograph_automatic_picking2.cpp.

1121 {
1122  ImageGeneric positiveInvariant;
1123  MultidimArray<float> pcaVec;
1124  ArrayDim aDim;
1125 
1126  FileName fnPositiveInvariatn=fnPositiveFeat+"_invariant_Positive.stk";
1127  positiveInvariant.read(fnPositiveInvariatn,HEADER);
1128  positiveInvariant.getDimensions(aDim);
1129  int steps=aDim.ndim/num_correlation;
1130  // Read the channel correlation one by one and obtain the basis for them.
1131  for (int i=1;i<=num_correlation;i++)
1132  {
1133  for (int j=0;j<steps;j++)
1134  {
1135  positiveInvariant.readMapped(fnPositiveInvariatn,j*num_correlation+i);
1136  positiveInvariant().getImage(pcaVec);
1137  pcaVec.resize(1,1,1,XSIZE(pcaVec)*YSIZE(pcaVec));
1138  pcaAnalyzer.addVector(pcaVec);
1139  }
1142  savePCAModel(fnPositiveFeat);
1143  pcaAnalyzer.clear();
1144  }
1145 }
#define YSIZE(v)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void addVector(const MultidimArray< float > &_v)
Add vector.
Definition: basic_pca.h:100
void subtractAvg()
Subtract average.
Definition: basic_pca.cpp:33
#define i
void savePCAModel(const FileName &fn)
Save the PCA basis and average for each channel.
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
#define XSIZE(v)
#define j
double steps
size_t ndim
void clear()
Clear.
Definition: basic_pca.h:84
void learnPCABasis(size_t NPCA, size_t Niter)
Learn basis.
Definition: basic_pca.cpp:170
PCAMahalanobisAnalyzer pcaAnalyzer
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false)
int readMapped(const FileName &name, size_t select_img=ALL_IMAGES, int mode=WRITE_READONLY)

◆ trainRotPCA()

void AutoParticlePicking2::trainRotPCA ( const FileName fnAvgModel,
const FileName fnPCARotModel 
)

Definition at line 1147 of file micrograph_automatic_picking2.cpp.

1148 {
1149  // just set the parameters and call the run method of the object
1150  // in order to obtain the rotational PCA basis.
1157  rotPcaAnalyzer.Nits=2;
1160  rotPcaAnalyzer.run();
1161 }
ProgImageRotationalPCA rotPcaAnalyzer

◆ trainSVM()

void AutoParticlePicking2::trainSVM ( const FileName fnModel,
int  numClassifier 
)

Definition at line 1163 of file micrograph_automatic_picking2.cpp.

1165 {
1166 
1167  if (numClassifier==1)
1168  {
1170  classifier.SaveModel(fnModel);
1171  }
1172  else
1173  {
1175  classifier2.SaveModel(fnModel);
1176  }
1177 }
void SaveModel(const FileName &fnModel)
MultidimArray< double > classLabel1
MultidimArray< double > dataSet1
MultidimArray< double > dataSetNormal
MultidimArray< double > classLabel
void SVMTrain(MultidimArray< double > &trainSet, MultidimArray< double > &lable)

Member Data Documentation

◆ accepted_particles

std::vector<Particle2> AutoParticlePicking2::accepted_particles

Definition at line 80 of file micrograph_automatic_picking2.h.

◆ auto_candidates

std::vector<Particle2> AutoParticlePicking2::auto_candidates

Definition at line 78 of file micrograph_automatic_picking2.h.

◆ autoFeatVec

MultidimArray<double> AutoParticlePicking2::autoFeatVec

Definition at line 89 of file micrograph_automatic_picking2.h.

◆ classifier

SVMClassifier AutoParticlePicking2::classifier

Definition at line 69 of file micrograph_automatic_picking2.h.

◆ classifier2

SVMClassifier AutoParticlePicking2::classifier2

Definition at line 69 of file micrograph_automatic_picking2.h.

◆ classLabel

MultidimArray<double> AutoParticlePicking2::classLabel

Definition at line 90 of file micrograph_automatic_picking2.h.

◆ classLabel1

MultidimArray<double> AutoParticlePicking2::classLabel1

Definition at line 91 of file micrograph_automatic_picking2.h.

◆ convolveRes

MultidimArray<double> AutoParticlePicking2::convolveRes

Definition at line 88 of file micrograph_automatic_picking2.h.

◆ corr_num

int AutoParticlePicking2::corr_num

Definition at line 66 of file micrograph_automatic_picking2.h.

◆ dataSet

MultidimArray<double> AutoParticlePicking2::dataSet

Definition at line 90 of file micrograph_automatic_picking2.h.

◆ dataSet1

MultidimArray<double> AutoParticlePicking2::dataSet1

Definition at line 90 of file micrograph_automatic_picking2.h.

◆ dataSetNormal

MultidimArray<double> AutoParticlePicking2::dataSetNormal

Definition at line 91 of file micrograph_automatic_picking2.h.

◆ fast

int AutoParticlePicking2::fast

Definition at line 67 of file micrograph_automatic_picking2.h.

◆ filter_num

int AutoParticlePicking2::filter_num

Definition at line 66 of file micrograph_automatic_picking2.h.

◆ filterBankStack

MultidimArray<double> AutoParticlePicking2::filterBankStack

Definition at line 88 of file micrograph_automatic_picking2.h.

◆ fn_micrograph

FileName AutoParticlePicking2::fn_micrograph

Definition at line 84 of file micrograph_automatic_picking2.h.

◆ fn_model

FileName AutoParticlePicking2::fn_model

Definition at line 84 of file micrograph_automatic_picking2.h.

◆ fnAvgModel

FileName AutoParticlePicking2::fnAvgModel

Definition at line 84 of file micrograph_automatic_picking2.h.

◆ fnInvariant

FileName AutoParticlePicking2::fnInvariant

Definition at line 85 of file micrograph_automatic_picking2.h.

◆ fnParticles

FileName AutoParticlePicking2::fnParticles

Definition at line 85 of file micrograph_automatic_picking2.h.

◆ fnPCAModel

FileName AutoParticlePicking2::fnPCAModel

Definition at line 84 of file micrograph_automatic_picking2.h.

◆ fnPCARotModel

FileName AutoParticlePicking2::fnPCARotModel

Definition at line 84 of file micrograph_automatic_picking2.h.

◆ fnSVMModel

FileName AutoParticlePicking2::fnSVMModel

Definition at line 85 of file micrograph_automatic_picking2.h.

◆ fnSVMModel2

FileName AutoParticlePicking2::fnSVMModel2

Definition at line 85 of file micrograph_automatic_picking2.h.

◆ fnVector

FileName AutoParticlePicking2::fnVector

Definition at line 85 of file micrograph_automatic_picking2.h.

◆ labelSet

MultidimArray<double> AutoParticlePicking2::labelSet

Definition at line 91 of file micrograph_automatic_picking2.h.

◆ m

Micrograph AutoParticlePicking2::m

Definition at line 74 of file micrograph_automatic_picking2.h.

◆ micList

std::vector<MDRowSql> AutoParticlePicking2::micList

Definition at line 82 of file micrograph_automatic_picking2.h.

◆ micrographStack

Image<double> AutoParticlePicking2::micrographStack

Definition at line 76 of file micrograph_automatic_picking2.h.

◆ micrographStackPre

Image<double> AutoParticlePicking2::micrographStackPre

Definition at line 76 of file micrograph_automatic_picking2.h.

◆ microImage

Image<double> AutoParticlePicking2::microImage

Definition at line 76 of file micrograph_automatic_picking2.h.

◆ microImagePrev

Image<double> AutoParticlePicking2::microImagePrev

Definition at line 76 of file micrograph_automatic_picking2.h.

◆ mPrev

Micrograph AutoParticlePicking2::mPrev

Definition at line 74 of file micrograph_automatic_picking2.h.

◆ NangSteps

const int AutoParticlePicking2::NangSteps =120
static

Definition at line 65 of file micrograph_automatic_picking2.h.

◆ negative_candidates

std::vector<Particle2> AutoParticlePicking2::negative_candidates

Definition at line 81 of file micrograph_automatic_picking2.h.

◆ negativeInvariatnStack

MultidimArray<double> AutoParticlePicking2::negativeInvariatnStack

Definition at line 89 of file micrograph_automatic_picking2.h.

◆ negativeParticleStack

MultidimArray<double> AutoParticlePicking2::negativeParticleStack

Definition at line 88 of file micrograph_automatic_picking2.h.

◆ NPCA

int AutoParticlePicking2::NPCA

Definition at line 66 of file micrograph_automatic_picking2.h.

◆ NRPCA

int AutoParticlePicking2::NRPCA

Definition at line 66 of file micrograph_automatic_picking2.h.

◆ NRsteps

int AutoParticlePicking2::NRsteps

Definition at line 67 of file micrograph_automatic_picking2.h.

◆ Nthreads

int AutoParticlePicking2::Nthreads

Definition at line 67 of file micrograph_automatic_picking2.h.

◆ num_correlation

int AutoParticlePicking2::num_correlation

Definition at line 67 of file micrograph_automatic_picking2.h.

◆ num_features

int AutoParticlePicking2::num_features

Definition at line 67 of file micrograph_automatic_picking2.h.

◆ p1

Micrograph::Point AutoParticlePicking2::p1

Definition at line 72 of file micrograph_automatic_picking2.h.

◆ p2

Micrograph::Point AutoParticlePicking2::p2

Definition at line 72 of file micrograph_automatic_picking2.h.

◆ particle_radius

int AutoParticlePicking2::particle_radius

Definition at line 66 of file micrograph_automatic_picking2.h.

◆ particle_size

int AutoParticlePicking2::particle_size

Definition at line 66 of file micrograph_automatic_picking2.h.

◆ particleAvg

MultidimArray<double> AutoParticlePicking2::particleAvg

Definition at line 90 of file micrograph_automatic_picking2.h.

◆ pcaAnalyzer

PCAMahalanobisAnalyzer AutoParticlePicking2::pcaAnalyzer

Definition at line 70 of file micrograph_automatic_picking2.h.

◆ pcaModel

MultidimArray<double> AutoParticlePicking2::pcaModel

Definition at line 90 of file micrograph_automatic_picking2.h.

◆ pcaRotModel

MultidimArray<double> AutoParticlePicking2::pcaRotModel

Definition at line 90 of file micrograph_automatic_picking2.h.

◆ positiveInvariatnStack

MultidimArray<double> AutoParticlePicking2::positiveInvariatnStack

Definition at line 89 of file micrograph_automatic_picking2.h.

◆ positiveParticleStack

MultidimArray<double> AutoParticlePicking2::positiveParticleStack

Definition at line 88 of file micrograph_automatic_picking2.h.

◆ proc_prec

int AutoParticlePicking2::proc_prec

Definition at line 66 of file micrograph_automatic_picking2.h.

◆ rejected_particles

std::vector<Particle2> AutoParticlePicking2::rejected_particles

Definition at line 79 of file micrograph_automatic_picking2.h.

◆ rotPcaAnalyzer

ProgImageRotationalPCA AutoParticlePicking2::rotPcaAnalyzer

Definition at line 71 of file micrograph_automatic_picking2.h.

◆ scaleRate

double AutoParticlePicking2::scaleRate

Definition at line 87 of file micrograph_automatic_picking2.h.

◆ thread

FeaturesThread* AutoParticlePicking2::thread

Definition at line 73 of file micrograph_automatic_picking2.h.


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