qsym2/interfaces/input/
analysis.rs

1//! Symmetry analysis target controls from QSym² input configuration.
2
3use std::path::PathBuf;
4
5use anyhow;
6use serde::{Deserialize, Serialize};
7
8use crate::drivers::molecule_symmetrisation_bootstrap::MoleculeSymmetrisationBootstrapParams;
9use crate::drivers::representation_analysis::angular_function::AngularFunctionRepAnalysisParams;
10use crate::drivers::representation_analysis::slater_determinant::SlaterDeterminantRepAnalysisParams;
11#[cfg(feature = "qchem")]
12use crate::drivers::representation_analysis::vibrational_coordinate::VibrationalCoordinateRepAnalysisParams;
13use crate::interfaces::binaries::BinariesSlaterDeterminantSource;
14use crate::interfaces::input::SymmetryGroupDetectionInputKind;
15#[cfg(feature = "qchem")]
16use crate::interfaces::qchem::{
17    QChemArchiveSlaterDeterminantSource, QChemArchiveVibrationalCoordinateSource,
18};
19
20// =======================================
21// Representation analysis target controls
22// =======================================
23
24// -------------------------------------
25// Representation analysis target choice
26// -------------------------------------
27
28/// Serialisable/deserialisable enumerated type representing possibilities of representation
29/// analysis targets.
30#[derive(Clone, Serialize, Deserialize)]
31pub enum AnalysisTarget {
32    /// Variant representing the choice of only performing a symmetry-group detection for a
33    /// molecule.
34    MolecularSymmetry {
35        /// Path to an XYZ file containing the molecular structure for symmetry-group detection.
36        xyz: PathBuf,
37
38        /// Optional parameters for performing symmetrisation on the structure.
39        symmetrisation: Option<MoleculeSymmetrisationBootstrapParams>,
40    },
41
42    /// Variant representing the choice of Slater determinant as the target for representation
43    /// analysis. The associated structure contains the control parameters for this.
44    RealSlaterDeterminant(SlaterDeterminantControl),
45
46    /// Variant representing the choice of vibrational coordinates as the target for representation
47    /// analysis. The associated structure contains the control parameters for this.
48    #[cfg(feature = "qchem")]
49    VibrationalCoordinates(VibrationalCoordinateControl),
50}
51
52impl AnalysisTarget {
53    /// Returns a vector containing of all possible analysis targets populated with their default
54    /// settings.
55    pub(crate) fn all_default() -> Vec<Self> {
56        vec![
57            AnalysisTarget::MolecularSymmetry {
58                xyz: PathBuf::from("path/to/xyz"),
59                symmetrisation: Some(MoleculeSymmetrisationBootstrapParams::default()),
60            },
61            AnalysisTarget::RealSlaterDeterminant(SlaterDeterminantControl::default()),
62            #[cfg(feature = "qchem")]
63            AnalysisTarget::VibrationalCoordinates(VibrationalCoordinateControl::default()),
64        ]
65    }
66}
67
68impl Default for AnalysisTarget {
69    fn default() -> Self {
70        AnalysisTarget::RealSlaterDeterminant(SlaterDeterminantControl::default())
71    }
72}
73
74// ~~~~~~~~~~~~~~~~~~~~~~~~~~
75// Target: Slater determinant
76// ~~~~~~~~~~~~~~~~~~~~~~~~~~
77
78/// Trait for the handling of vibrational coordinate input sources.
79pub(crate) trait SlaterDeterminantSourceHandle {
80    type Outcome;
81
82    /// Handles the Slater determinant input source and runs relevant calculations.
83    fn sd_source_handle(
84        &self,
85        pd_params_inp: &SymmetryGroupDetectionInputKind,
86        afa_params: &AngularFunctionRepAnalysisParams,
87        sda_params: &SlaterDeterminantRepAnalysisParams<f64>,
88    ) -> Result<Self::Outcome, anyhow::Error>;
89}
90
91/// Serialisable/deserialisable structure containing control parameters for Slater determinant
92/// representation analysis.
93#[derive(Clone, Serialize, Deserialize, Default)]
94pub struct SlaterDeterminantControl {
95    /// The source of Slater determinant(s).
96    pub source: SlaterDeterminantSource,
97
98    /// The parameters for representation analysis.
99    pub control: SlaterDeterminantRepAnalysisParams<f64>,
100}
101
102/// Serialisable/deserialisable enumerated type representing possibilities of Slater determinant
103/// sources.
104#[derive(Clone, Serialize, Deserialize)]
105pub enum SlaterDeterminantSource {
106    /// Slater determinant from Q-Chem HDF5 archive. This is only available when the `qchem`
107    /// feature is enabled.
108    #[cfg(feature = "qchem")]
109    QChemArchive(QChemArchiveSlaterDeterminantSource),
110
111    /// Slater determinant from a binaries specification.
112    Binaries(BinariesSlaterDeterminantSource),
113}
114
115#[cfg(feature = "qchem")]
116impl Default for SlaterDeterminantSource {
117    fn default() -> Self {
118        SlaterDeterminantSource::QChemArchive(QChemArchiveSlaterDeterminantSource::default())
119    }
120}
121
122#[cfg(not(feature = "qchem"))]
123impl Default for SlaterDeterminantSource {
124    fn default() -> Self {
125        SlaterDeterminantSource::Binaries(BinariesSlaterDeterminantSource::default())
126    }
127}
128
129// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130// Target: Vibrational coordinates
131// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
132
133/// Trait for the handling of vibrational coordinate input sources.
134#[cfg(feature = "qchem")]
135pub(crate) trait VibrationalCoordinateSourceHandle {
136    type Outcome;
137
138    /// Handles the vibrational coordinate input source and runs relevant calculations.
139    fn vc_source_handle(
140        &self,
141        pd_params_inp: &SymmetryGroupDetectionInputKind,
142        afa_params: &AngularFunctionRepAnalysisParams,
143        vca_params: &VibrationalCoordinateRepAnalysisParams<f64>,
144    ) -> Result<Self::Outcome, anyhow::Error>;
145}
146
147/// Serialisable/deserialisable structure containing control parameters for vibrational
148/// coordinate representation analysis.
149#[cfg(feature = "qchem")]
150#[derive(Clone, Serialize, Deserialize, Default)]
151pub struct VibrationalCoordinateControl {
152    /// The source of vibrational coordinate(s).
153    pub source: VibrationalCoordinateSource,
154
155    /// The parameters for representation analysis.
156    pub control: VibrationalCoordinateRepAnalysisParams<f64>,
157}
158
159/// Serialisable/deserialisable enumerated type representing possibilities of vibrational
160/// coordinates sources.
161#[cfg(feature = "qchem")]
162#[derive(Clone, Serialize, Deserialize)]
163pub enum VibrationalCoordinateSource {
164    /// Vibrational coordinates from Q-Chem HDF5 archive. This is only available when the `qchem`
165    /// feature is enabled.
166    QChemArchive(QChemArchiveVibrationalCoordinateSource),
167}
168
169#[cfg(feature = "qchem")]
170impl Default for VibrationalCoordinateSource {
171    fn default() -> Self {
172        VibrationalCoordinateSource::QChemArchive(QChemArchiveVibrationalCoordinateSource::default())
173    }
174}