Refinement.h 2.97 KB
Newer Older
1
2
3
#pragma once


4
5
6
#include <pinkIndexer/Backprojection.h>
#include <pinkIndexer/Lattice.h>
#include <pinkIndexer/ReciprocalToRealProjection.h>
7
#include <Eigen/Dense>
8
#include <vector>
9

10
namespace pinkIndexer
11
{
12
13
14
15
16
    class Refinement
    {
      public:
        Refinement(float tolerance);
        Refinement(float tolerance, const Backprojection& backprojection);
17

18
19
        void refineFixedLattice(Lattice& lattice, const Eigen::Matrix3Xf& ulsDirections, const Eigen::Array2Xf& ulsBorderNorms);
        void refineVariableLattice(Lattice& lattice, const Eigen::Matrix3Xf& ulsDirections, const Eigen::Array2Xf& ulsBorderNorms);
20

21
22
        void refineVariableLatticeWithCenter(Lattice& lattice, Eigen::Vector2f& centerShift, const Eigen::Matrix2Xf& detectorPeaks_m);
        void refineCenter(Eigen::Vector2f& centerShift, const Eigen::Matrix3f& basis, const Eigen::Matrix2Xf& detectorPeaks_m, float startStepSize = 20e-6);
23

24
25
26
27
        int getFittedPeaksCount(Lattice& lattice, const Eigen::Matrix3Xf& ulsDirections, const Eigen::Array2Xf& ulsBorderNorms);
        int getFittedPeaks(Lattice& lattice, Eigen::Array<bool, Eigen::Dynamic, 1>& fittedPeaks, const Eigen::Matrix3Xf& ulsDirections,
                           const Eigen::Array2Xf& ulsBorderNorms);
        double getMeanDefect(const Eigen::Matrix3f& basis, const Eigen::Matrix3Xf& ulsDirections, const Eigen::Array2Xf& ulsBorderNorms,
28
                             bool significantChangesToPreviousCall = true);
29

30
31
32
33
34
35
36
37
        void setTolerance(float tolerance)
        {
            this->tolerance = tolerance;
        }
        float getTolerance()
        {
            return tolerance;
        }
38

39
      private:
40
        void getDefects(Eigen::ArrayXf& defects, const Eigen::Matrix3f& basis, const Eigen::Matrix3Xf& ulsDirections, const Eigen::Array2Xf& ulsBorderNorms,
41
                        bool significantChangesToPreviousCall = true);
42

43
        void getCenterShiftedBackprojection(Eigen::Matrix3Xf& ulsDirections, Eigen::Array2Xf& ulsBorderNorms, const Eigen::Matrix2Xf& detectorPeaks_m,
44
                                            const Eigen::Vector2f& centerShift);
45

46
        float tolerance;
47

48
        const Backprojection* backprojection;
49

50
51
        // preallocation
        Eigen::ArrayXf defects;
52
        Eigen::Array2Xf ulsBorderNormsSquared;
53
54
55
56
57
58
59
60
61
62
63
64
65
        Eigen::Matrix3Xf millerIndices_close;
        Eigen::Matrix3Xf millerIndices_far;
        Eigen::Matrix3Xf candidatePeaks;
        Eigen::RowVectorXf candidatePeaksNormsSquared;
        std::vector<Eigen::Vector3f> millerIndices;
        Eigen::RowVectorXf projectedVectorNorms;
        Eigen::Matrix3Xf defectVectors_absolute;
        Eigen::Matrix3Xf defectVectors_relative;
        Eigen::Array<bool, 1, Eigen::Dynamic> notPredictablePeaks;
        Eigen::ArrayXf meanDefects;
        Eigen::ArrayXf meanDefects_centerAdjustment;
        int validCandidatePeaksCount;
        Eigen::Matrix2Xf detectorPeaks_m_shifted;
66
67
        Eigen::Matrix3Xf ulsDirections;
        Eigen::Array2Xf ulsBorderNorms;
68
    };
69
} // namespace pinkIndexer