User Guide
User Manual:
Open the PDF directly: View PDF .
Page Count: 10
Download | |
Open PDF In Browser | View PDF |
User guide for FEtool.py – v1.0 1. Introduction The program FEtool.py is designed to fully automate absolute binding free energy calculations, starting only from a crystal structure or a docked complex. The building of the simulation boxes, generation of all the needed parameters, set up of the various simulation windows, running the simulations, and the final free energy analysis are all done without any manual interference. FEtool.py uses the pmemd.cuda sofware from AMBER [1], which has shown very high performance on Graphics Processing Units (GPUs) at a reduced cost (http://ambermd.org/gpus16/benchmarks.htm). We believe that our implementation can be used for high-throughput search of high-affinity ligands to a given receptor, using a rigorous physics-based free energy approach. FEtool.py can also be applied for parameter testing and optimization, as well as the comparison between alchemical (double decoupling -DD) and physical routes (attach-pull-release - APR) for standard binding free energy calculations. In this user guide we will first describe the workflow of the program, then the various components of the free energy calculation, and how the simulations are analyzed in order to obtain the quantities of interest. All the parameters needed for the program input file, and how they apply to the various calculation steps, will also be described in detail. Finally, we will explain how to add a new protein system to our automated protocol. 2. Workflow The workflow above shows the equilibration, preparation and calculation procedures. It begins by first building the initial complex, either starting from the docked receptor and ligand files or directly from the receptor-ligand co-crystal structure. The necessary ligand parameters are obtained using Antechamber [2], with the General Amber Force-Field (GAFF) for the bonded and LJ parameters [3], and the AM1-BCC model for the partial atomic charges [4,5]. The system is then aligned to a reference structure of a similar protein using the program MUSTANG [6], so that the ligand anchors and dummy atom coordinates can be automatically assigned. With all the coordinates of the initial system already set, the complex is then placed in a water box with a given ion concentration, and the necessary restraints are applied. An initial equilibration is then performed, with all the receptor restraints activated, and the translational/rotational restraints of the ligand being gradually released in order to find a nearby energy minimum. At the end of this last step, the ligand might still be bound or it might have left the binding site in the case of unstable binding mode. If the latter happens, this pose is considered unstable and no further simulations are performed for this system. If the ligand is still bound after equilibration, which should usually be the case, then the preparation of the system for the binding free energy calculations is performed. The preparation starts from the last state from equilibrium, reassigning the ligand anchors, repositioning the dummy atoms, solvating/ionizing the system and and redefining the restraints. This is necessary since the unrestrained ligand can adopt a different binding mode in the last stage of the equilibration step, which requires a new reference state for the free energy calculations. The preparation simulations may involve the pulling of the ligand from the binding site to bulk, if APR is to be used, or only the simulation of the restrained ligand in the bound state, if only DD is employed. Starting from the last state of the preparation step, all the necessary simulation windows are now created for the binding free energy calculation. They involve various components for the application/removal of restraints, as well as the pulling/decoupling of the ligand, which are explained in detail in the next section. Once the free energy simulations are concluded, they can be analyzed using the Multistate Bennett Acceptance Ratio (MBAR) [7], Thermodynamic Integration with Gaussian Quadrature (TI), or analytically, depending on the stage and the choice in the input file. 3. Free Energy Components The FEtool.py expression for the calculated binding free energy is defined as follows: −Δ Gobind =Δ G p , conf ,att +Δ Gl , conf , att +Δ Gl ,TR ,att +Δ Gtransfer +ΔGl ,TR, rel +Δ Gl ,conf , rel +Δ G p ,conf , rel In the equation above, the att index denotes attachment of restraints in the bound state, and rel indicates release of restraints with the ligand in bulk. The l and p indexes are for ligand and protein (receptor), respectively, conf is for conformational restraints and TR is for translational/rotational restraints. The ΔGtransfer term is the free energy of transferring of the ligand from the receptor binding site to bulk with all restraints applied, using either a physical reaction coordinate (APR), or an alchemical transformation (DD): Δ G transfer− APR=ΔG pull Δ Gtransfer− DD=ΔG dec, elec ,site +Δ Gdec , LJ ,site −ΔG dec, elec ,bulk −Δ Gdec , LJ , bulk (APR) (DD) In the case of APR, ΔGtransfer-APR is equal to the pulling free energy of the ligand from the binding site to bulk, which is done using umbrella sampling, as in Ref [8]. For the double decoupling procedure, ΔGtransfer-DD is equal to the sum of four terms, as shown in the equation above. The index dec stands for decoupling, elec for electrostatic interactions and LJ for Lennard-Jones interactions, with these calculations being performed both in the binding site or in bulk. Table I summarizes all the free energy components from our simulations, with each identified by a letter: Description Letter System Free Energy Method Free energy term Attachment of receptor conformational restraints a Complex MBAR Δ G p , conf ,att Attachment of ligand conformational restraints l Complex MBAR Δ Gl , conf ,att Attachment of ligand TR restraints t Complex MBAR Δ Gl ,TR , att Pulling stage (umbrella sampling) u Complex* MBAR Δ G pull Decoupling of ligand charge interactions (binding site) e Complex MBAR/TI Δ Gdec , elect, site Decoupling of ligand LJ interactions (binding site) v Complex MBAR/TI Δ Gdec , LJ , site Decoupling of ligand charge interactions (bulk) f Ligand only MBAR/TI Δ Gdec , elec, bulk Decoupling of ligand LJ interactions (bulk) w Ligand only MBAR/TI Δ Gdec , LJ , bulk Release of ligand TR restraints b Ligand only Analytical Δ Gl ,TR ,rel Release of ligand conformational restraints c Ligand only MBAR Δ Gl , conf ,rel Release of receptor conformational r Receptor only MBAR restraints * The receptor and ligand will be physically separated during the pulling simulations Δ G p , conf ,rel When the calculations are set up, the windows from each free energy component will have their corresponding letter followed by the window number, starting at 0. The number of windows and their properties can be defined in the input file. The letters also identify the free energy output files, which are stored in the ./data folder of each component, after the analysis is performed. More information on the nature of each of the restraints, and the free energy methods we use, can be found in Refs. [8,9]. 4. Input file Various options concerning the creation of the systems, simulations and analysis, can be chosen in the input file: calc_type: Accepts the options “dock” or “crystal”, for a receptor ligand pair of pdb files, or a complex co-crystal structure, respectively. The system initial pdb files should be located in the ./all-poses folder. celpp_receptor: Sets the name of the receptor, followed by _docked. For example, choose “hiTanimoto5uf0_5uez” for a receptor file called hiTanimoto-5uf0_5uez_docked.pdb. The naming is based on the CELPP challenge procedure. For a crystal structure, put the four letter identifier for the structure, for example “5uf0” for the 5uf0.pdb crystal structure. poses_list: The list of poses that will be used for the calculations. The list should be placed in brackets ans separated by commas. Ex: “[0,1,2,3,4]”. The docked poses files in the ./all-poses folder must be listed accordingly as pose0.pdb, pose1.pdb, pose2.pdb, etc. This parameter is not used for crystal structure calculations. ligand_name: The residue name for the ligand. This is arbitrary for docked poses (Ex: “DOK”), but is necessary if starting the calculations from a crystal structure. In that case, put the three letter ligand identifier in this option. Ex: “89J” for the 5uf0 crystal structure. P1, P2 and P3: These define the anchor atoms of the receptor, which have to be determined beforehand. The original protein sequence numbering should be used here, using AMBER masks to define each atom. Ex: “:403@CA” for the CA atom of residue 403. fe_type: Designates which components are to be included in the free energy calculations. For example, if all the APR and DD calculations are to be performed, choose “all” for this option. If only double decoupling with restraints will be performed, choose “dd-rest”, and if only APR choose “pmf-rest”. The “custom” option allows to choose any combination of components, using the components option below. components: If the option “custom” is set in the option above, choose the components you want to calculate, using a list of letters separated by spaces inside a bracket. Ex: “[ c l t a ]”. release_eq: The weights for the gradual release of the restraints in the equilibrium stage, going from 100 (fully restrained) to 0 (unrestrained). Each option will be a new simulation, and they are performed in sequence. Use a list of letters separated by spaces inside a bracket to define these weights. Ex: “[ 5.00 2.50 1.00 0.00 ]”. A single 0.00 inside the brackets (Ex: “[ 0.00 ]”) will run just one equilibrium simulation without any ligand restraints. attach_apr: List of weights for the spring constant of each window during the attaching/releasing of restraints using MBAR (components a, l, t, c and r). The total number of windows for each of these components will be the size of the array. Ex: “[ 0.00 2.00 4.00 16.00 64.00 100.00 ]” for a total of 6 windows. translate_apr: Windows for the umbrella sampling (pulling) procedure of APR, identified by the letter u. It starts from 0.00 (bound state) until the desired reference distance between the receptor and the ligand in the unbound state. The number of windows is the size of the array. Ex: “[ 0.00 1.00 2.00 3.00 4.00 5.00 ]” for a total of 6 windows, ending 5.00 Å away from the initial reference distance. lambdas: Lambda values for the double decoupling procedure, going from 0.00 to 1.00. Ex: For a 12-point Gaussian quadrature, choose “[ 0.00922 0.04794 0.11505 0.20634 0.31608 0.43738 0.56262 0.68392 0.79366 0.88495 0.95206 0.99078 ]” for the lambda array values. pull_ligand: Choice to pull the ligand from the binding site or not during preparation. This is needed for the APR method, but not needed for double decoupling. Choose “yes” or “no” for this option. pull_spacing: The interval between each ligand position during the preparation simulations, if the option above is set to yes. The final distance is the last value in the translate_apr array. Ex: “0.1” for a pulling interval of 0.1 Å. rec_distance_force: Distance spring constant for the receptor rigid body restraints, identified as R2 in Ref. [8]. Use units of kcal/mol.Ų. rec_angle_force: Angle and torsion angle spring constants for the receptor rigid body restraints, identified as A3, A4, T4, T5 and T6 in Ref. [8]. Use units of kcal/mol. rad². The forces from rec_distance_force and rec_angle_force are included to keep the receptor in the laboratory reference frame. rec_dihcf_force: Final spring constant for the protein conformational dihedral restraints, if this option is activated (see rec_bb variable). The nature of these restraints, and how they are implemented, are explained in Ref. [9]. Use units of kcal/mol.rad². rec_discf_force: Final spring constant for the protein conformational distance restraints between the anchor atoms. Use units of kcal/mol.Ų. lig_distance_force, lig_angle_force, lig_dihcf_force and lig_discf_force: Final spring constants for the ligand restraints, defined the same way as the receptor above. The value of lig_distance_force also designates the spring constant used during the pulling simulations. The nature of the ligand conformational restraints, and how they are implemented, are explained in Ref. [9]. water_model: The water model used in the calculations. Supported options are “TIP3P”, “TIP4PEW” and “SPCE”. num_waters: Number of waters used in the simulations of the complex and the apo protein. buffer_x and buffer_y: Options for the water padding in the x and y axes of the system, remembering that the pulling is done along the z coordinate. The dependent variable is the padding in the z-axis, so make sure you have enough waters to cover the complex and allow the pulling of the ligand. lig_box: Water padding in the three Cartesian axes for the box with only the ligand in it. neutralize_only: Option to add ions only to neutralize the system, or to also include a chosen ion molar concentration. Accepts options “yes” or “no”. cation and anion: Cation and anion species to be used, accepts all ions supported by the Joung and Cheatham monovalent ion parameters [10]. Ex: “Na+” and “Cl-”. num_cations: Number of cations to be added after neutralization, for the desired ion concentration, for simulations of the complex and the apo protein. The number of anions is the dependent variable, since the systems are always neutral. num_cations_ligbox: Number of cations to be added after neutralization, for the desired ion concentration, for the smaller ligand box. hmr: Use hydrogen mass repartitioning [11] with a 4 fs time step, if set to “yes”. If set to “no”, the simulations do not use hmr, and use a 2 fs time step. temperature: Temperature of the simulated systems, in Kelvin (K). eq_steps1: Number of steps for each simulation of the gradual release of restraints, during the equilibration procedure. eq_steps2: Number of steps for the last simulation of the equilibration procedure, in which the ligand is unrestrained. prep_steps1: Number of steps for the first simulation of the preparation step, in which the ligand is fully restrained in the bound state. prep_steps2: Number of steps for each of the pulling simulations, during the preparation procedure. The distance separation of each of these steps is defined in the pull_spacing option. [component]_steps1: Number of steps of equilibration, for each window of the various components of the free energy calculation, with the component letters shown in Table I. No data is collected during this simulation. [component]_steps2: Number of steps for the production stage of each window of the various components of the free energy calculation, in which data is collected. rec_bb: Choice to use or not protein (receptor) backbone dihedral restraints, accepting “yes” or “no”. bb_start and bb_end: If the option above is activated, these variables define the residue range of the protein backbone dihedral restraints, using the original protein sequence numbering. l1_x: distance in the x axis between the first protein anchor atom P1 and the center of the “strike zone” for the search of the ligand first anchor L1. More details on this procedure can be found in section 6 of this guide and also in Ref. [9] l1_y: Same as the previous one, but for the y axis distance. l1_z: Minimum distance between the first protein anchor atom P1 and the first ligand anchor L1, in the z axis. l1_range: Size of the “strike zone” for the first ligand anchor atom search, which is a square with sides having twice the value of this parameter (2*l1_range). min_adis and max_adis: Minimum and maximum distance between the ligand anchors. dd_type: Type of integration method for the decoupling components of the binding free energy calculation (e, v, f and w). If “TI” is chosen, Gaussian quadrature is applied, if “MBAR” is chosen, the latter is used to calculate these components. Remember that the lambda values have to be suitable for either type of integration method. weights: Weights for Gaussian quadrature calculations, in case the TI option is chosen above. These values must correspond to the values in the lambdas array, for the procedure to be applied correctly. In the case of a 12-point Gaussian quadrature, write “[ 0.02359 0.05347 0.08004 0.10158 0.11675 0.12457 0.12457 0.11675 0.10158 0.08004 0.05347 0.02359 ]” for this variable. blocks: Number of blocks for block data analysis. This separates the simulation data in blocks and provides the results for each, so the temporal variation and convergence of the results can be assessed. 5. Adding new ligands to a given protein In the example provided in the FEtool folder, binding free energy calculations are performed for the 5uf0 crystal structure, as well as 5 docked poses of the same ligand docked to the receptor with the 5uez structure. The protein receptor is the second bromodomain of the BRD4 protein – BRD4(2). The ./all-poses folder in this example contains the original 5uf0.pdb file, as well as a set of pdb files for the docked poses and receptor. The same procedure can be applied to any ligand that binds to BRD4(2), as explained below: 5.1 Docked complexes: In order to generate a set of pdb files for the docked poses and receptor, there are two options, either do a manual docking with chosen input files, or using the CELPP challenge workflow. Both options use AutoDockTools [12], Chimera [13], and AutoDock Vina [14] to prepare the files and run the docking, so you must have them in your path in order to perform this stage. For the first option, the ./dockingfiles/Vina-example folder has a simple docking workflow using the dock.bash script and the input files for the 5uf0 system, which already outputs the files in the right format for use with FEtool. The docking can also be integrated into the CELPP challenge, using the procedure from the CELPPade tutorial (https://doc.google.com/document/d/1iJcPUktbdrRftAA8cuVa32Ri1TPr2XvZVqTccDja2OMh), which the user needs to be familiarized with. The same scripts from the “internal_autodockvina_contestant” model from this tutorial can be used for docking, except for internal_autodockvina_contestant_dock.py. To output the docked structures suitable for use with FEtool, you should use instead the FEtool_dock.py script, which is included inside the FEtool/CELPP-docking folder. Once you run the CELPP docking, the necessary pdb structures for various different receptors will be inside the ./4-docking folder that was just created. 5.2 Co-crystal structure: In the case of a co-crystal structure, the calc_type, ligand_name and celpp_receptor options in the input file have to be adjusted properly, as explained in section 4. The script prep-crystal.tcl, inside the ./build_files folder, is used by VMD [15] to “clean” the original file and leave only a single chain of the receptor-ligand complex. The editing of this tcl script usually not needed, but is necessary if the original pdb file has more than one chain. Keep in mind that the “MMM” identifier will be replaced by the ligand name, so it does not have to be changed beforehand. 6. Adding a new protein system FEtool.py can be extended to several protein systems, by including a reference alignment file and adjusting a few parameters in the input.in file. The ./systems-library folder contains the necessary data for a few systems, and more can be requested by contacting the author directly. The user can also set up a new protein system, so below we show a few good practices, using the second BRD4 bromodomain as an example. 6.1: Aligning the protein: The first step is to create the reference.pdb file, so that the complex can be aligned relative to it using MUSTANG, before the FEtool.py simulations are performed. If using APR, the ligand pulling direction is along the z axis and towards positive values (z+), so the ligand must have free access to the solvent along this direction. This is not needed if only DD is to be employed. The reference file is created by rotating a structure of the desired protein with a ligand bound, in this example the 5uf0 crystal structure of BRD4(2), and then saving it as reference.pdb. One way of doing this is using VMD (http://www.ks.uiuc.edu/Training/Tutorials/vmd/vmd-tutorial.pdf), but other programs such as Chimera can also be employed for that purpose. Figure 1 shows the 5uf0 structure before (red) and after the rotation (blue), with the ligand now having access to the solvent along the z direction. The reference.pdb file does not need to have the same sequence as the receptor input file, so the same reference created here for for BRD4(2) can be extended to other bromodomains that share the same fold, such as BRD4(1), CREBBP and BAZ2B. Figure 1: The 5uf0 structure before (red) and after (blue) the rotation, so that the latter has the ligand with free access to the solvent in the +z direction. 6.2: Choosing the protein anchors: Once the reference.pdb file with the desired orientation is created, it is time to choose the three protein anchor atoms. Starting from this file, choose a tentative ligand first anchor atom L1 [8], with the lowest or one of the lowest values for the z coordinate from all the ligand atoms, and with the x and y coordinates not too far from the center of the binding site (Figure 2). Even though this anchor is going to be chosen automatically when you run FEtool.py, an estimate of its location is needed to choose the protein anchors. The protein P1 anchor is then chosen using a few rules: 1 – Should be a backbone atom (CA, C or N) and part of a stable secondary structure such as an alpha-helix or a beta sheet, always avoiding loop regions due to their increased flexibility. 2 – Should have a distance between 10 Å and 15 Å from the chosen L1 atom in the z axis, and having an absolute value between 5.0 Å and 10 Å in the xy plane. In the example for the 5uf0 structure (Figure 2), the tentative L1 atom has a { x1 y1 z1} distance vector from the CA atom from the protein 403 residue (P1) being equal to {-0.74 -6.16 13.03} , with the z1 distance being 13.03 2 2 Å and the distance in the xy plane x 1 + y 1 being 6.20 Å. Since it satisfies our criteria, we choose :403@CA for the first protein anchor P1. The choice of the other protein anchors P2 and P3 are chosen after the first one, and also follow a few guidelines: 1 – Should also be backbone atoms part of stable secondary structures such as alpha-helix or beta sheet, always avoiding loop regions due to their increased flexibility. 2 – The N2-P1-P2 and P1-P2-P3 angles (Figure 2) should not be close to 0 or 180 degrees (better if close to 90 o), and the distance between the protein anchors should be large (at least 10 Å) . This is to avoid large forces during the simulations due to a gimbal lock. Like the ligand anchors, the positioning of the dummy atoms is done automatically, with an example shown in Figure 2. More information on their location and the full restraint setup can be found on Refs [8,9]. Figure 2: (left) The ligand tentative first anchor L1 (yellow) and the three protein anchors P1, P2 and P3 (green). The strike zone for L1 search is shown in orange. (right) The same structure, but showing the the yz plane. The dummy atoms N1, N2 and N3 (red), which are placed automatically when running FEtool.py, are shown as an example. 6.3: Determining the input values for ligand anchor search: Once P1, P2 and P3 are chosen, a few more parameters are needed for the input file. The x1 and y1 coordinates determined above can be used for the l1_x and l1_y parameters, and the l1_z parameter can have a safe minimum value of 8.50 Å. The l1_range parameter defines a “strike zone” when searching for the first ligand anchor L1, and can also be safely defined as 3.0 Å (Figure 2). The min_adis and max_adis define the minimum and maximum distance between the ligand anchors, and can usually be left with values of 4.0 Å and 8.0 Å, respectively. For smaller ligands, min_adis might have to be reduced to 3.5 Å or even 3.0 Å, and max_adis could be increased in the case of larger ligands. Even though this is a heuristic approach, if applied correctly the protein and the ligand will be properly restrained during the calculations, allowing us to obtain the absolute binding free energy of several molecules to a given protein without any further adjustments. 7. References [1] D.A. Case, I.Y. Ben-Shalom, S.R. Brozell, D.S. Cerutti, T.E. Cheatham, III, V.W.D. Cruzeiro, T.A. Darden, R.E. Duke, D. Ghoreishi, M.K. Gilson, H. Gohlke, A.W. Goetz, D. Greene, R Harris, N. Homeyer, S. Izadi, A. Kovalenko, T. Kurtzman, T.S. Lee, S. LeGrand, P. Li, C. Lin, J. Liu, T. Luchko, R. Luo, D.J. Mermelstein, K.M. Merz, Y. Miao, G. Monard, C. Nguyen, H. Nguyen, I. Omelyan, A. Onufriev, F. Pan, R. Qi, D.R. Roe, A. Roitberg, C. Sagui, S. Schott-Verdugo, J. Shen, C.L. Simmerling, J. Smith, R. Salomon-Ferrer, J. Swails, R.C. Walker, J. Wang, H. Wei, R.M. Wolf, X. Wu, L. Xiao, D.M. York and P.A. Kollman (2018), AMBER 2018, University of California, San Francisco. [2] J. Wang, W. Wang, P.A. Kollman, and D.A. Case.. (2006) "Automatic atom type and bond type perception in molecular mechanical calculations".Journal of Molecular Graphics and Modelling, 25, 247-260. [3] J. Wang, R.M. Wolf, J.W. Caldwell, and P. A. Kollman, D. A. Case (2004) "Development and testing of a general AMBER force field". Journal of Computational Chemistry, 25, 1157-1174. [4] A. Jakalian, B. L. Bush, D. B. Jack, and C.I. Bayly (2000) "Fast, efficient generation of high‐quality atomic charges. AM1‐BCC model: I. Method". Journal of Computational Chemistry, 21, 132-146. [5] A. Jakalian, D. B. Jack, and C.I. Bayly (2002) "Fast, efficient generation of high‐quality atomic charges. AM1‐BCC model: II. Parameterization and validation". Journal of Computational Chemistry, 16, 1623-1641. [6] A. S. Konagurthu, J. Whisstock, P. J. Stuckey, and A. M. Lesk. (2006) “MUSTANG: A multiple structural alignment algorithm”. Proteins, 64, 559-574. [7] M. R. Shirts and J. Chodera (2008) “Statistically optimal analysis of samples from multiple equilibrium states.” Journal of Chemical Physics, 129, 129105. [8] G. Heinzelmann, N. M. Henriksen, and M. K. Gilson. (2017) “Attach-Pull-Release Calculations of Ligand Binding and Conformational Changes on the First BRD4 Bromodomain” Journal of Chemical Theory and Computation, 13, 3260-3275. [9] G. Heinzelmann and M. K. Gilson. “FEtool.py: A fully automated tool for high-performance absolute binding free energy calculations” . Paper in preparation. [10] I. S. Joung and T. E. Cheatham III (2008). “Determination of Alkali and Halide Monovalent Ion Parameters for Use in Explicitly Solvated Biomolecular Simulations”. The Journal of Physical Chemistry B, 112, 90209041. [11] C. W. Hopkins, S. Le Grand, R. C. Walker, and A. E. Roitberg. (2015) “Long-Time-Step Molecular Dynamics through Hydrogen Mass Repartitioning”. Journal of Chemical Theory and Computation, 11, 18641874. [12] G. M. Morris, R. Huey, W. Lindstrom, M. F. Sanner, R. K. Belew, D. S. Goodsell, and A. J. Olson. (2009) “AutoDock4 and AutoDockTools4: Automated Docking with Selective Receptor Flexibility” Journal of Computational Chemistry, 30, 2785-2791. [13] E. F. Pettersen, T. D. Goddard, C. C. Huang, G. S. Couch, D. M. Greenblatt, E. C. Meng, and T. E. Ferrin. (2004). "UCSF Chimera - A Visualization System for Exploratory Research and Analysis." Journal of Computational Chemistry, 25, 1605-1612. [14] O. Trott and A. J. Olson. (2010) "AutoDock Vina: improving the speed and accuracy of docking with a new scoring function, efficient optimization and multithreading," Journal of Computational Chemistry, 31, 455-461. [15] W. Humphrey, A. Dalke and K. Schulten. (1996) "VMD - Visual Molecular Dynamics", Journal of Molecular Graphics, 14, 33-38.
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : No Page Count : 10 Language : en-US Creator : Writer Producer : LibreOffice 4.2 Create Date : 2019:03:12 16:45:32-03:00EXIF Metadata provided by EXIF.tools