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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
/* Copyright (C) 2000 Damir Zucic */
/*=============================================================================
select_sphere.c
Purpose:
Select atoms inside the sphere defined by the sphere radius and the
geometric center of current selection calculated for all selected
atoms. Every caught macromolecular complex is taken into account.
Input:
(1) Pointer to MolComplexS structure, with macromol. complexes.
(2) Number of macromolecular complexes.
(3) Pointer to RuntimeS structure (sequence buffer is there).
(4) Selection mode index (0 = overwrite, 1 = restrict, 2 = expand
previous selection).
Output:
(1) The flag selectedF set to one for selected atoms in every
caught macromolecular complex.
(2) Return value.
Return value:
(1) The number of selected atoms (zero or positive value).
========includes:============================================================*/
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include "defines.h"
#include "typedefs.h"
/*======select sphere:=======================================================*/
long SelectSphere_ (MolComplexS *mol_complexSP, int mol_complexesN,
RuntimeS *runtimeSP, int selection_modeI)
{
long selected_atomsN = 0;
int mol_complexI;
MolComplexS *curr_mol_complexSP;
size_t atomsN, atomI;
AtomS *curr_atomSP;
double x = 0.0, y = 0.0, z = 0.0, denom;
double center_x, center_y, center_z;
double radius_squared;
double delta_x, delta_y, delta_z, dist_squared;
unsigned char sphereF;
/* Calculate the geometric center position for currently selected atoms: */
for (mol_complexI = 0; mol_complexI < mol_complexesN; mol_complexI++)
{
/* Pointer to the current macromolecular complex: */
curr_mol_complexSP = mol_complexSP + mol_complexI;
/* Check is the current macromolecular complex caught: */
if (curr_mol_complexSP->catchF == 0) continue;
/* Number of atoms in a macromolecular complex: */
atomsN = curr_mol_complexSP->atomsN;
if (atomsN == 0) continue;
/* Scan all atoms in the current complex: */
for (atomI = 0; atomI < atomsN; atomI++)
{
/* Pointer to the current atom: */
curr_atomSP = curr_mol_complexSP->atomSP + atomI;
/* Check is this atom selected: */
if (curr_atomSP->selectedF == 0) continue;
/* Update the number of selected atoms: */
selected_atomsN++;
/* Prepare data required to find geometric center: */
x += curr_atomSP->raw_atomS.x[0];
y += curr_atomSP->raw_atomS.y;
z += curr_atomSP->raw_atomS.z[0];
}
}
/* Check how many atoms are selected: */
if (selected_atomsN == 0) return 0;
/* Calculate the geometric center position: */
denom = 1.0 / (double) selected_atomsN;
x *= denom;
y *= denom;
z *= denom;
/* Update the geometric center position: */
center_x = x;
center_y = y;
center_z = z;
/* Reset the number of selected atoms: */
selected_atomsN = 0;
/* Prepare the squared radius: */
radius_squared = runtimeSP->sphere_radius * runtimeSP->sphere_radius;
/* Select all atoms in a sphere: */
for (mol_complexI = 0; mol_complexI < mol_complexesN; mol_complexI++)
{
/* Pointer to the current macromolecular complex: */
curr_mol_complexSP = mol_complexSP + mol_complexI;
/* Check is the current macromolecular complex caught: */
if (curr_mol_complexSP->catchF == 0) continue;
/* Number of atoms in a macromolecular complex: */
atomsN = curr_mol_complexSP->atomsN;
if (atomsN == 0) continue;
/* Scan all atoms in the current complex: */
for (atomI = 0; atomI < atomsN; atomI++)
{
/* Pointer to the current atom: */
curr_atomSP = curr_mol_complexSP->atomSP + atomI;
/* Copy the coordinates: */
x = curr_atomSP->raw_atomS.x[0];
y = curr_atomSP->raw_atomS.y;
z = curr_atomSP->raw_atomS.z[0];
/* The squared distance: */
delta_x = x - center_x;
delta_y = y - center_y;
delta_z = z - center_z;
dist_squared = delta_x * delta_x +
delta_y * delta_y +
delta_z * delta_z;
/* Compare the squared distance with the squared radius: */
sphereF = 1;
if (dist_squared > radius_squared) sphereF = 0;
/* Set the selection flag for the current atom: */
switch (selection_modeI)
{
/* Overwrite the previous selection: */
case 0:
curr_atomSP->selectedF = sphereF;
break;
/* Restrict the previous selection: */
case 1:
curr_atomSP->selectedF &= sphereF;
break;
/* Expand the previous selection: */
case 2:
curr_atomSP->selectedF |= sphereF;
break;
default:
;
}
/* Check the selection flag; increase */
/* the count if flag is equal to one: */
if (curr_atomSP->selectedF) selected_atomsN++;
}
}
/* Return the number of selected atoms: */
return selected_atomsN;
}
/*===========================================================================*/
|