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.xray.commands;
39
40 import ffx.algorithms.cli.AlgorithmsCommand;
41 import ffx.numerics.Potential;
42 import ffx.potential.MolecularAssembly;
43 import ffx.utilities.FFXBinding;
44 import ffx.xray.DiffractionData;
45 import ffx.xray.cli.XrayOptions;
46 import ffx.xray.parsers.MTZWriter;
47 import ffx.xray.parsers.MTZWriter.MTZType;
48 import org.apache.commons.configuration2.CompositeConfiguration;
49 import picocli.CommandLine.Command;
50 import picocli.CommandLine.Mixin;
51 import picocli.CommandLine.Parameters;
52
53 import java.util.ArrayList;
54 import java.util.Arrays;
55 import java.util.List;
56 import java.util.stream.Collectors;
57
58 import static org.apache.commons.io.FilenameUtils.getBaseName;
59
60
61
62
63
64
65
66
67 @Command(description = " Write out computed structure factors.", name = "xray.ComputeFc")
68 public class ComputeFc extends AlgorithmsCommand {
69
70 @Mixin
71 private XrayOptions xrayOptions;
72
73
74
75
76 @Parameters(arity = "1..*", paramLabel = "files", description = "PDB and Diffraction input files.")
77 private List<String> filenames;
78
79 private MolecularAssembly[] molecularAssemblies;
80 private DiffractionData diffractionData;
81
82
83
84
85 public ComputeFc() {
86 super();
87 }
88
89
90
91
92
93 public ComputeFc(String[] args) {
94 super(args);
95 }
96
97
98
99
100
101 public ComputeFc(FFXBinding binding) {
102 super(binding);
103 }
104
105 @Override
106 public ComputeFc run() {
107
108 if (!init()) {
109 return this;
110 }
111
112 xrayOptions.init();
113
114 String filename;
115 if (filenames != null && !filenames.isEmpty()) {
116 molecularAssemblies = algorithmFunctions.openAll(filenames.get(0));
117 activeAssembly = molecularAssemblies[0];
118 filename = filenames.get(0);
119 } else if (activeAssembly == null) {
120 logger.info(helpString());
121 return this;
122 } else {
123 molecularAssemblies = new MolecularAssembly[]{activeAssembly};
124 filename = activeAssembly.getFile().getAbsolutePath();
125 }
126
127
128 CompositeConfiguration properties = activeAssembly.getProperties();
129 xrayOptions.setProperties(parseResult, properties);
130
131
132 diffractionData = xrayOptions.getDiffractionData(filenames, molecularAssemblies, properties);
133
134 logger.info("\n Running xray.ComputeFc on " + filename);
135
136
137 diffractionData.computeAtomicDensity();
138 diffractionData.getReflectionList();
139
140
141 MTZWriter mtzWriter = new MTZWriter(diffractionData.getReflectionList()[0],
142 diffractionData.getRefinementData()[0], getBaseName(filename) + "_fc.mtz", MTZType.FCONLY);
143
144 mtzWriter.write();
145 return this;
146 }
147
148 @Override
149 public List<Potential> getPotentials() {
150 if (molecularAssemblies == null) {
151 return new ArrayList<>();
152 } else {
153 return Arrays.stream(molecularAssemblies)
154 .filter(a -> a != null)
155 .map(a -> a.getPotentialEnergy())
156 .filter(e -> e != null)
157 .collect(Collectors.toList());
158 }
159 }
160
161 @Override
162 public boolean destroyPotentials() {
163 return diffractionData == null ? true : diffractionData.destroy();
164 }
165 }