1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.potential.commands;
39
40 import ffx.numerics.Potential;
41 import ffx.potential.MolecularAssembly;
42 import ffx.potential.bonded.Atom;
43 import ffx.potential.cli.PotentialCommand;
44 import ffx.utilities.FFXBinding;
45 import picocli.CommandLine.Command;
46 import picocli.CommandLine.Parameters;
47
48 import java.io.File;
49 import java.util.ArrayList;
50 import java.util.Arrays;
51 import java.util.List;
52 import java.util.stream.Collectors;
53
54 import static org.apache.commons.io.FilenameUtils.getExtension;
55 import static org.apache.commons.io.FilenameUtils.getName;
56 import static org.apache.commons.io.FilenameUtils.removeExtension;
57
58
59
60
61
62
63
64 @Command(name = "MoveIntoUnitCell", description = " Move all molecules into the unit cell.")
65 public class MoveIntoUnitCell extends PotentialCommand {
66
67
68 @Parameters(arity = "1", paramLabel = "file",
69 description = "The atomic coordinate file in PDB or XYZ format.")
70 private String filename = null;
71
72
73 protected MolecularAssembly[] molecularAssemblies = null;
74
75
76 public double[][] origCoordinates = null;
77
78 public double[][] unitCellCoordinates = null;
79
80 public MoveIntoUnitCell() { super(); }
81 public MoveIntoUnitCell(FFXBinding binding) { super(binding); }
82 public MoveIntoUnitCell(String[] args) { super(args); }
83
84 @Override
85 public MoveIntoUnitCell run() {
86
87 if (!init()) {
88 return this;
89 }
90
91
92 molecularAssemblies = getActiveAssemblies(filename);
93 if (activeAssembly == null) {
94 logger.info(helpString());
95 return this;
96 }
97
98
99 filename = activeAssembly.getFile().getAbsolutePath();
100
101 logger.info("\n Moving molecular centers of mass into the unit cell for " + filename + "\n");
102
103
104 for (MolecularAssembly molecularAssembly : molecularAssemblies) {
105 Atom[] atoms = molecularAssembly.getAtomArray();
106 int nAtoms = atoms.length;
107 origCoordinates = new double[nAtoms][3];
108 unitCellCoordinates = new double[nAtoms][3];
109
110 for (int index = 0; index < nAtoms; index++) {
111 Atom atom = atoms[index];
112 origCoordinates[index][0] = atom.getX();
113 origCoordinates[index][1] = atom.getY();
114 origCoordinates[index][2] = atom.getZ();
115 }
116
117 molecularAssembly.moveAllIntoUnitCell();
118
119 for (int index = 0; index < nAtoms; index++) {
120 Atom atom = atoms[index];
121 unitCellCoordinates[index][0] = atom.getX();
122 unitCellCoordinates[index][1] = atom.getY();
123 unitCellCoordinates[index][2] = atom.getZ();
124 }
125 }
126
127
128 String name = getName(filename);
129 String ext = getExtension(name);
130 name = removeExtension(name);
131
132
133 String dirString = getBaseDirString(filename);
134
135 if (ext.toUpperCase().contains("XYZ")) {
136 potentialFunctions.saveAsXYZ(molecularAssemblies[0], new File(dirString + name + ".xyz"));
137 } else {
138 potentialFunctions.saveAsPDB(molecularAssemblies, new File(dirString + name + ".pdb"));
139 }
140
141 return this;
142 }
143
144 @Override
145 public List<Potential> getPotentials() {
146 if (molecularAssemblies == null) {
147 return new ArrayList<>();
148 } else {
149 return Arrays.stream(molecularAssemblies)
150 .filter(a -> a != null)
151 .map(MolecularAssembly::getPotentialEnergy)
152 .filter(e -> e != null)
153 .collect(Collectors.toList());
154 }
155 }
156 }