Skip to content

Commit ce5f084

Browse files
authored
feat: Add ImportConfigurationTrajectory node (#2310)
1 parent fb58635 commit ce5f084

9 files changed

+133
-8
lines changed

src/io/import/coordinates.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ CoordinateImportFileFormat::CoordinateImportFileFormat(std::string_view filename
1616
setUpKeywords();
1717
}
1818

19-
// Return enum option info for AveragingScheme
19+
// Return enum option info for CoordinateImportFileFormat
2020
EnumOptions<CoordinateImportFileFormat::CoordinateImportFormat> CoordinateImportFileFormat::coordinateImportFileFormat()
2121
{
2222
return EnumOptions<CoordinateImportFileFormat::CoordinateImportFormat>(

src/io/import/trajectory.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,24 @@ TrajectoryImportFileFormat::TrajectoryImportFileFormat(std::string_view filename
1111
TrajectoryImportFileFormat::TrajectoryImportFormat format)
1212
: FileAndFormat(formats_, filename, (int)format)
1313
{
14-
formats_ = EnumOptions<TrajectoryImportFileFormat::TrajectoryImportFormat>(
14+
formats_ = trajectoryImportFileFormats();
15+
}
16+
17+
// Return enum option info for TrajectoryImportFileFormat
18+
EnumOptions<TrajectoryImportFileFormat::TrajectoryImportFormat> TrajectoryImportFileFormat::trajectoryImportFileFormats()
19+
{
20+
return EnumOptions<TrajectoryImportFileFormat::TrajectoryImportFormat>(
1521
"TrajectoryImportFileFormat",
1622
{{TrajectoryImportFormat::DLPOLYFormatted, "hisf", "Formatted DL_POLY Trajectory (no header)"},
1723
{TrajectoryImportFormat::XYZ, "xyz", "XYZ Trajectory"}});
1824
}
1925

26+
EnumOptions<TrajectoryImportFileFormat::TrajectoryImportFormat>
27+
getEnumOptions(TrajectoryImportFileFormat::TrajectoryImportFormat)
28+
{
29+
return TrajectoryImportFileFormat::trajectoryImportFileFormats();
30+
}
31+
2032
/*
2133
* Import Functions
2234
*/

src/io/import/trajectory.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class TrajectoryImportFileFormat : public FileAndFormat
2424
TrajectoryImportFormat format = TrajectoryImportFormat::XYZ);
2525
~TrajectoryImportFileFormat() override = default;
2626

27+
// Return enum options for TrajectoryImportFileFormat
28+
static EnumOptions<TrajectoryImportFileFormat::TrajectoryImportFormat> trajectoryImportFileFormats();
29+
2730
/*
2831
* Formats
2932
*/
@@ -49,3 +52,6 @@ class TrajectoryImportFileFormat : public FileAndFormat
4952
// Import trajectory using supplied parser and current format
5053
bool importData(LineParser &parser, Configuration *cfg, std::optional<Matrix3> &unitCell);
5154
};
55+
56+
EnumOptions<TrajectoryImportFileFormat::TrajectoryImportFormat>
57+
getEnumOptions(TrajectoryImportFileFormat::TrajectoryImportFormat);

src/nodes/importConfigurationCoordinates.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Copyright (c) 2026 Team Dissolve and contributors
33

44
#include "nodes/importConfigurationCoordinates.h"
5-
#include "nodes/dissolve.h"
65

76
ImportConfigurationCoordinatesNode::ImportConfigurationCoordinatesNode(Graph *parentGraph) : Node(parentGraph)
87
{

src/nodes/importConfigurationCoordinates.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
#include "io/import/coordinates.h"
77
#include "nodes/node.h"
8-
#include <memory>
98

9+
// Forward Declarations
1010
class Configuration;
1111

1212
class ImportConfigurationCoordinatesNode : public Node
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
// Copyright (c) 2026 Team Dissolve and contributors
3+
4+
#include "nodes/importConfigurationTrajectory.h"
5+
6+
ImportConfigurationTrajectoryNode::ImportConfigurationTrajectoryNode(Graph *parentGraph) : Node(parentGraph)
7+
{
8+
// Inputs
9+
addInput<Configuration *>("Configuration", "Configuration to which Trajectory will be imported", configuration_);
10+
11+
// Options
12+
addOption<std::string>("FilePath", "File path", filePath_);
13+
addOption<TrajectoryImportFileFormat::TrajectoryImportFormat>("FileFormat", "File format", format_);
14+
15+
// Outputs
16+
addOutput<Configuration *>("Configuration", "Output configuration", configuration_);
17+
18+
// Serialisable data
19+
addSerialisable("filePosition", filePosition_);
20+
}
21+
22+
std::string_view ImportConfigurationTrajectoryNode::type() const { return "ImportTrajectory"; }
23+
24+
std::string_view ImportConfigurationTrajectoryNode::summary() const
25+
{
26+
return "Import configuration coordinates from sequential frames of a trajectory.";
27+
}
28+
29+
NodeConstants::ProcessResult ImportConfigurationTrajectoryNode::process()
30+
{
31+
TrajectoryImportFileFormat format(filePath_, format_);
32+
33+
message("Import: Reading trajectory file frame from '{}' into Configuration '{}'...\n", format.filename(),
34+
configuration_->name());
35+
36+
// Open the file
37+
LineParser parser;
38+
if ((!parser.openInput(format.filename())) || (!parser.isFileGoodForReading()))
39+
{
40+
error("Couldn't open trajectory file '{}'.\n", format.filename());
41+
return NodeConstants::ProcessResult::Failed;
42+
}
43+
44+
// Seek to the next file position
45+
parser.seekg(filePosition_);
46+
47+
// Read the frame
48+
std::optional<Matrix3> unitCell;
49+
if (!format.importData(parser, configuration_, unitCell))
50+
{
51+
error("Failed to read trajectory frame data.\n");
52+
return NodeConstants::ProcessResult::Failed;
53+
}
54+
55+
configuration_->notifyAtomicPositionsChanged();
56+
57+
// Store the new trajectory file position
58+
filePosition_ = parser.tellg();
59+
60+
// Set the unit cell if one was read in
61+
if (unitCell)
62+
configuration_->createBox(unitCell.value());
63+
64+
return NodeConstants::ProcessResult::Success;
65+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
// Copyright (c) 2026 Team Dissolve and contributors
3+
4+
#pragma once
5+
6+
#include "io/import/trajectory.h"
7+
#include "nodes/node.h"
8+
9+
// Forward Declarations
10+
class Configuration;
11+
12+
class ImportConfigurationTrajectoryNode : public Node
13+
{
14+
public:
15+
ImportConfigurationTrajectoryNode(Graph *parentGraph);
16+
~ImportConfigurationTrajectoryNode() override = default;
17+
18+
/*
19+
* Definition
20+
*/
21+
public:
22+
std::string_view type() const override;
23+
std::string_view summary() const override;
24+
25+
/*
26+
* Data
27+
*/
28+
private:
29+
// File path
30+
std::string filePath_;
31+
// File format
32+
TrajectoryImportFileFormat::TrajectoryImportFormat format_{TrajectoryImportFileFormat::TrajectoryImportFormat::XYZ};
33+
// Last read file position (as int)
34+
int filePosition_;
35+
// Target configuration
36+
Configuration *configuration_;
37+
38+
/*
39+
* Processing
40+
*/
41+
private:
42+
// Run main processing
43+
NodeConstants::ProcessResult process() override;
44+
};

src/nodes/registry.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
// Copyright (c) 2026 Team Dissolve and contributors
33

44
#include "nodes/registry.h"
5-
#include "base/enumOptions.h"
6-
#include "base/enumOptionsBase.h"
75
#include "math/averaging.h"
8-
#include "math/windowFunction.h"
96
#include "nodes/add.h"
107
#include "nodes/atomicMC/atomicMC.h"
118
#include "nodes/configuration.h"
@@ -17,6 +14,7 @@
1714
#include "nodes/forcefield.h"
1815
#include "nodes/gr/gr.h"
1916
#include "nodes/importConfigurationCoordinates.h"
17+
#include "nodes/importConfigurationTrajectory.h"
2018
#include "nodes/insert.h"
2119
#include "nodes/integrator.h"
2220
#include "nodes/iterableGraph.h"
@@ -61,6 +59,7 @@ void NodeRegistry::instantiateNodeProducers()
6159
{"Graph", makeDerivedNode<Graph>()},
6260
{"GR", makeDerivedNode<GRNode>()},
6361
{"ImportConfigurationCoordinates", makeDerivedNode<ImportConfigurationCoordinatesNode>()},
62+
{"ImportConfigurationTrajectory", makeDerivedNode<ImportConfigurationTrajectoryNode>()},
6463
{"Insert", makeDerivedNode<InsertNode>()},
6564
{"Integrator", makeDerivedNode<Integrator1DNode>()},
6665
{"Iterator", makeDerivedNode<IterableGraph>()},

src/nodes/serialisableData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ template <typename DataClass> class SerialisableClass : public SerialisableData
176176
ValueChecker dataChecker_{[&]() { return true; }};
177177
// Resolver function for data
178178
using DataResolver = std::function<void(const std::map<std::string, const Species *> &)>;
179-
DataResolver dataResolver_{[&]() { return; }};
179+
DataResolver dataResolver_{[&](const std::map<std::string, const Species *> &reachableSpecies) {}};
180180

181181
/*
182182
* Serialisation

0 commit comments

Comments
 (0)