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.crystal.Crystal;
41 import ffx.numerics.Potential;
42 import ffx.potential.MolecularAssembly;
43 import ffx.potential.bonded.Atom;
44 import ffx.potential.cli.PotentialCommand;
45 import ffx.utilities.FFXBinding;
46 import picocli.CommandLine.Command;
47 import picocli.CommandLine.Parameters;
48
49 import java.io.File;
50 import java.util.ArrayList;
51 import java.util.Arrays;
52 import java.util.List;
53 import java.util.stream.Collectors;
54
55 import static org.apache.commons.io.FilenameUtils.getExtension;
56 import static org.apache.commons.io.FilenameUtils.getName;
57 import static org.apache.commons.io.FilenameUtils.removeExtension;
58
59
60
61
62
63
64
65 @Command(name = "Cart2Frac", description = " Convert from Cartesian to fractional coordinates.")
66 public class Cart2Frac extends PotentialCommand {
67
68
69 @Parameters(arity = "1", paramLabel = "file",
70 description = "The atomic coordinate file in PDB or XYZ format.")
71 private String filename = null;
72
73
74 private MolecularAssembly[] molecularAssemblies;
75
76
77 private double[][][] cartCoordinates = null;
78
79
80 private double[][][] fracCoordinates = null;
81
82 public Cart2Frac() {
83 super();
84 }
85
86 public Cart2Frac(FFXBinding binding) {
87 super(binding);
88 }
89
90 public Cart2Frac(String[] args) {
91 super(args);
92 }
93
94
95 public double[][][] getCart() {
96 return cartCoordinates;
97 }
98
99
100 public double[][][] getFrac() {
101 return fracCoordinates;
102 }
103
104 @Override
105 public Cart2Frac run() {
106 if (!init()) {
107 return this;
108 }
109
110
111 molecularAssemblies = getActiveAssemblies(filename);
112 if (activeAssembly == null) {
113 logger.info(helpString());
114 return this;
115 }
116
117
118 filename = activeAssembly.getFile().getAbsolutePath();
119
120 int num = molecularAssemblies.length;
121 cartCoordinates = new double[num][][];
122 fracCoordinates = new double[num][][];
123
124
125 for (int i = 0; i < num; i++) {
126 MolecularAssembly ma = molecularAssemblies[i];
127 logger.info("\n Converting from Cartesian to fractional coordinates for " + ma);
128 Crystal crystal = ma.getCrystal().getUnitCell();
129
130 Atom[] atoms = ma.getAtomArray();
131 int nAtoms = atoms.length;
132 fracCoordinates[i] = new double[nAtoms][3];
133 cartCoordinates[i] = new double[nAtoms][3];
134
135 double[] frac = new double[3];
136 double[] cart = new double[3];
137
138 for (int index = 0; index < nAtoms; index++) {
139 Atom atom = atoms[index];
140 atom.getXYZ(cart);
141 crystal.toFractionalCoordinates(cart, frac);
142
143
144 boolean active = atom.isActive();
145 atom.setActive(true);
146 atom.moveTo(frac);
147 atom.setActive(active);
148
149 cartCoordinates[i][index][0] = cart[0];
150 cartCoordinates[i][index][1] = cart[1];
151 cartCoordinates[i][index][2] = cart[2];
152
153 fracCoordinates[i][index][0] = frac[0];
154 fracCoordinates[i][index][1] = frac[1];
155 fracCoordinates[i][index][2] = frac[2];
156 }
157 }
158
159
160 String name = getName(filename);
161 String ext = getExtension(name);
162 name = removeExtension(name);
163
164
165 String dirString = getBaseDirString(filename);
166
167 if (ext.toUpperCase().contains("XYZ")) {
168 potentialFunctions.saveAsXYZ(molecularAssemblies[0], new File(dirString + name + ".xyz"));
169 } else {
170 potentialFunctions.saveAsPDB(molecularAssemblies, new File(dirString + name + ".pdb"));
171 }
172
173
174 binding.setVariable("cart", cartCoordinates);
175 binding.setVariable("frac", fracCoordinates);
176
177 return this;
178 }
179
180 @Override
181 public List<Potential> getPotentials() {
182 if (molecularAssemblies == null) {
183 return new ArrayList<>();
184 } else {
185 return Arrays.stream(molecularAssemblies)
186 .filter(a -> a != null)
187 .map(MolecularAssembly::getPotentialEnergy)
188 .filter(e -> e != null)
189 .collect(Collectors.toList());
190 }
191 }
192 }