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 = "Frac2Cart", description = " Convert from fractional to Cartesian coordinates.")
66 public class Frac2Cart 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 private double[][] fracCoordinates = null;
80
81 public Frac2Cart() { super(); }
82 public Frac2Cart(FFXBinding binding) { super(binding); }
83 public Frac2Cart(String[] args) { super(args); }
84
85
86 public double[][] getCart() { return cartCoordinates; }
87
88 public double[][] getFrac() { return fracCoordinates; }
89
90 @Override
91 public Frac2Cart run() {
92 if (!init()) {
93 return this;
94 }
95
96
97 molecularAssemblies = getActiveAssemblies(filename);
98 if (activeAssembly == null) {
99 logger.info(helpString());
100 return this;
101 }
102
103
104 filename = activeAssembly.getFile().getAbsolutePath();
105
106 logger.info("\n Converting from fractional to Cartesian coordinates for " + filename);
107
108
109
110 for (MolecularAssembly ma : molecularAssemblies) {
111 Crystal crystal = ma.getCrystal().getUnitCell();
112
113 Atom[] atoms = ma.getAtomArray();
114 int nAtoms = atoms.length;
115 fracCoordinates = new double[nAtoms][3];
116 cartCoordinates = new double[nAtoms][3];
117
118 double[] frac = new double[3];
119 double[] cart = new double[3];
120
121 for (int index = 0; index < nAtoms; index++) {
122 Atom atom = atoms[index];
123 atom.getXYZ(frac);
124 crystal.toCartesianCoordinates(frac, cart);
125
126
127 boolean active = atom.isActive();
128 atom.setActive(true);
129 atom.moveTo(cart);
130 atom.setActive(active);
131
132 cartCoordinates[index][0] = cart[0];
133 cartCoordinates[index][1] = cart[1];
134 cartCoordinates[index][2] = cart[2];
135
136 fracCoordinates[index][0] = frac[0];
137 fracCoordinates[index][1] = frac[1];
138 fracCoordinates[index][2] = frac[2];
139 }
140 }
141
142
143 String name = getName(filename);
144 String ext = getExtension(name);
145 name = removeExtension(name);
146
147
148 String dirString = getBaseDirString(filename);
149
150 if (ext.toUpperCase().contains("XYZ")) {
151 potentialFunctions.saveAsXYZ(molecularAssemblies[0], new File(dirString + name + ".xyz"));
152 } else {
153 potentialFunctions.saveAsPDB(molecularAssemblies, new File(dirString + name + ".pdb"));
154 }
155
156
157 binding.setVariable("cart", cartCoordinates);
158 binding.setVariable("frac", fracCoordinates);
159
160 return this;
161 }
162
163 @Override
164 public List<Potential> getPotentials() {
165 if (molecularAssemblies == null) {
166 return new ArrayList<>();
167 } else {
168 return Arrays.stream(molecularAssemblies)
169 .filter(a -> a != null)
170 .map(MolecularAssembly::getPotentialEnergy)
171 .filter(e -> e != null)
172 .collect(Collectors.toList());
173 }
174 }
175 }