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.util.List;
50
51
52
53
54
55
56
57 @Command(name = "Cart2Frac", description = " Convert from Cartesian to fractional coordinates.")
58 public class Cart2Frac extends PotentialCommand {
59
60
61
62
63 @Parameters(arity = "1", paramLabel = "file",
64 description = "The atomic coordinate file in PDB or XYZ format.")
65 private String filename = null;
66
67
68
69
70 private MolecularAssembly[] molecularAssemblies;
71
72
73
74
75 private double[][][] cartCoordinates = null;
76
77
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
96
97 public double[][][] getCart() {
98 return cartCoordinates;
99 }
100
101
102
103
104 public double[][][] getFrac() {
105 return fracCoordinates;
106 }
107
108 @Override
109 public Cart2Frac run() {
110 if (!init()) {
111 return this;
112 }
113
114
115 molecularAssemblies = getActiveAssemblies(filename);
116 if (activeAssembly == null) {
117 logger.info(helpString());
118 return this;
119 }
120
121
122 filename = activeAssembly.getFile().getAbsolutePath();
123
124 int num = molecularAssemblies.length;
125 cartCoordinates = new double[num][][];
126 fracCoordinates = new double[num][][];
127
128
129 for (int i = 0; i < num; i++) {
130 MolecularAssembly ma = molecularAssemblies[i];
131 logger.info("\n Converting from Cartesian to fractional coordinates for " + ma);
132 Crystal crystal = ma.getCrystal().getUnitCell();
133
134 Atom[] atoms = ma.getAtomArray();
135 int nAtoms = atoms.length;
136 fracCoordinates[i] = new double[nAtoms][3];
137 cartCoordinates[i] = new double[nAtoms][3];
138
139 double[] frac = new double[3];
140 double[] cart = new double[3];
141
142 for (int index = 0; index < nAtoms; index++) {
143 Atom atom = atoms[index];
144 atom.getXYZ(cart);
145 crystal.toFractionalCoordinates(cart, frac);
146
147
148 boolean active = atom.isActive();
149 atom.setActive(true);
150 atom.moveTo(frac);
151 atom.setActive(active);
152
153 cartCoordinates[i][index][0] = cart[0];
154 cartCoordinates[i][index][1] = cart[1];
155 cartCoordinates[i][index][2] = cart[2];
156
157 fracCoordinates[i][index][0] = frac[0];
158 fracCoordinates[i][index][1] = frac[1];
159 fracCoordinates[i][index][2] = frac[2];
160 }
161 }
162
163 saveByOriginalExtension(molecularAssemblies, filename);
164
165
166 binding.setVariable("cart", cartCoordinates);
167 binding.setVariable("frac", fracCoordinates);
168
169 return this;
170 }
171
172 @Override
173 public List<Potential> getPotentials() {
174 return getPotentialsFromAssemblies(molecularAssemblies);
175 }
176 }