- Added missing files

This commit is contained in:
koennecke
2009-02-17 08:40:55 +00:00
parent 3d6070ee6f
commit f9121c1afe
9 changed files with 2779 additions and 0 deletions

878
reflist.c Normal file
View File

@ -0,0 +1,878 @@
/**
* Reflection list: a configurable list of reflections and
* their setting angles. To be used for four circle and possibly
* TAS diffraction.
*
* copyright: see file COPYRIGHT
*
* Mark Koennecke, July 2008
*/
#include <stdlib.h>
#include <assert.h>
#include "reflist.h"
#include "sicshipadaba.h"
#include "stptok.h"
#define INAME "index"
#define ANAME "angles"
#define FLAG "flag"
static char undef[] = "Undefined";
#define IDXFMT " %8.4f"
#define ANGFMT " %8.2f"
/*----------------------------------------------------------------------*/
typedef struct {
int idxCount;
int angCount;
int count;
} RLPriv, *pRLPriv;
/*----------------------------------------------------------------------
* The point of the code below and the callback is to update the
* configuration counts whenever the corresponding parameters
* are changed.
* ---------------------------------------------------------------------*/
static void UpdateConfiguration(pSICSOBJ refl)
{
pRLPriv priv = refl->pPrivate;
hdbValue v;
char *pPtr = NULL, token[50];
SICSHdbGetPar(refl, NULL, "indexheader", &v);
pPtr = v.v.text;
priv->idxCount = 0;
while ((pPtr = stptok(pPtr, token, 50, ",")) != NULL) {
priv->idxCount++;
}
SICSHdbGetPar(refl, NULL, "anglesheader", &v);
pPtr = v.v.text;
priv->angCount = 0;
while ((pPtr = stptok(pPtr, token, 50, ",")) != NULL) {
priv->angCount++;
}
ClearReflectionList(refl);
}
/*-----------------------------------------------------------------------*/
static hdbCallbackReturn CalcConfiguration(pHdb node, void *userData,
pHdbMessage mm)
{
if (GetHdbSetMessage(mm) != NULL) {
/*
* This is after the normal SICS parameter SetUpdateCallback
* which already updated the node
*/
UpdateConfiguration((pSICSOBJ) userData);
}
return hdbContinue;
}
/*-----------------------------------------------------------------------*/
static int SaveRefList(void *data, char *name, FILE * fd)
{
int i;
double ang[4], hkl[3];
pSICSOBJ self = data;
SaveSICSOBJ(data, name, fd);
for (i = 0; i < ReflectionListCount(self); i++) {
memset(hkl, 0, 3 * sizeof(double));
memset(ang, 0, 4 * sizeof(double));
GetRefIndex(self, i, hkl);
GetRefAngles(self, i, ang);
fprintf(fd, "%s addax %f %f %f %f %f %f %f\n", name,
hkl[0], hkl[1], hkl[2], ang[0], ang[1], ang[2], ang[3]);
}
return 1;
}
/*-----------------------------------------------------------------------*/
pSICSOBJ MakeReflectionListInt(char *name)
{
pSICSOBJ pNew = NULL;
pHdb node = NULL;
hdbValue v;
pRLPriv priv = NULL;
pNew = MakeSICSOBJ(name, "ReflectionList");
priv = malloc(sizeof(RLPriv));
if (pNew == NULL || priv == NULL) {
return NULL;
}
pNew->pPrivate = priv;
pNew->KillPrivate = DefaultKill;
pNew->pDes->SaveStatus = SaveRefList;
v = MakeHdbText("h,k,l");
node = MakeSICSHdbPar("indexheader", usMugger, v);
AppendHipadabaCallback(node, MakeHipadabaCallback(CalcConfiguration,
pNew, NULL));
AddHipadabaChild(pNew->objectNode, node, NULL);
priv->idxCount = 3;
v = MakeHdbText("stt,om,chi,phi");
node = MakeSICSHdbPar("anglesheader", usMugger, v);
AppendHipadabaCallback(node, MakeHipadabaCallback(CalcConfiguration,
pNew, NULL));
AddHipadabaChild(pNew->objectNode, node, NULL);
priv->angCount = 4;
priv->count = 0;
v = makeHdbValue(HIPNONE, 0);
node = MakeSICSHdbPar("list", usMugger, v);
AddHipadabaChild(pNew->objectNode, node, NULL);
return pNew;
}
/*-----------------------------------------------------------------------*/
static int MakeCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
int status;
status = NewListReflection(self);
if (status >= 0) {
SCPrintf(pCon, eValue, "newref = %4.4d", status);
return 1;
} else {
SCWrite(pCon, "ERROR: failed to create reflection", eError);
return 0;
}
return 0;
}
/*-----------------------------------------------------------------------*/
static int ClearCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
ClearReflectionList(self);
return 1;
}
/*----------------------------------------------------------------------*/
static int AddIndexCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
char path[80];
int status;
pHdb node = NULL;
hdbValue v;
if (nPar < 1) {
SCWrite(pCon, "ERROR: need indexes as arguments", eError);
return 0;
}
status = NewListReflection(self);
snprintf(path, 80, "list/%4.4d/%s", status, INAME);
node = GetHipadabaNode(self->objectNode, path);
assert(node != NULL);
cloneHdbValue(&node->value, &v);
if (!readHdbValue(&v, par[0]->value.v.text, path, 80)) {
SCPrintf(pCon, eError, "ERROR: failed to convert %s to indices",
par[0]->value.v.text);
return 0;
}
SetHipadabaPar(node, v, pCon);
ReleaseHdbValue(&v);
return 1;
}
/*----------------------------------------------------------------------*/
void AddRefIdx(pSICSOBJ refl, double hkl[])
{
int status;
hdbValue v;
char path[80];
pHdb node;
status = NewListReflection(refl);
snprintf(path, 80, "list/%4.4d/%s", status, INAME);
node = GetHipadabaNode(refl->objectNode, path);
assert(node != NULL);
v = MakeHdbFloatArray(3, hkl);
SetHipadabaPar(node, v, NULL);
}
/*----------------------------------------------------------------------*/
void AddRefIdxAng(pSICSOBJ refl, double hkl[], double ang[])
{
int status;
hdbValue v;
char path[80];
pHdb node;
status = NewListReflection(refl);
snprintf(path, 80, "list/%4.4d/%s", status, INAME);
node = GetHipadabaNode(refl->objectNode, path);
assert(node != NULL);
v = MakeHdbFloatArray(3, hkl);
SetHipadabaPar(node, v, NULL);
snprintf(path, 80, "list/%4.4d/%s", status, ANAME);
node = GetHipadabaNode(refl->objectNode, path);
assert(node != NULL);
v = MakeHdbFloatArray(3, ang);
SetHipadabaPar(node, v, NULL);
}
/*----------------------------------------------------------------------*/
static int AddAnglesCmd(pSICSOBJ self, SConnection * pCon,
pHdb commandNode, pHdb par[], int nPar)
{
char path[80];
int status;
pHdb node = NULL;
hdbValue v;
if (nPar < 1) {
SCWrite(pCon, "ERROR: need angles as arguments", eError);
return 0;
}
status = NewListReflection(self);
snprintf(path, 80, "list/%4.4d/%s", status, ANAME);
node = GetHipadabaNode(self->objectNode, path);
assert(node != NULL);
cloneHdbValue(&node->value, &v);
if (!readHdbValue(&v, par[0]->value.v.text, path, 80)) {
SCPrintf(pCon, eError, "ERROR: failed to convert %s to angles",
par[0]->value.v.text);
return 0;
}
SetHipadabaPar(node, v, pCon);
ReleaseHdbValue(&v);
return 1;
}
/*----------------------------------------------------------------------*/
static int AddIndexesAnglesCmd(pSICSOBJ self, SConnection * pCon,
pHdb commandNode, pHdb par[], int nPar)
{
char path[80];
int status, i;
pHdb node = NULL;
hdbValue v;
char *pPtr = NULL;
pRLPriv priv = self->pPrivate;
if (nPar < 1) {
SCWrite(pCon, "ERROR: need indexes/angles as arguments", eError);
return 0;
}
status = NewListReflection(self);
snprintf(path, 80, "list/%4.4d/%s", status, INAME);
node = GetHipadabaNode(self->objectNode, path);
assert(node != NULL);
cloneHdbValue(&node->value, &v);
if (!readHdbValue(&v, par[0]->value.v.text, path, 80)) {
SCPrintf(pCon, eError, "ERROR: failed to convert %s to indices",
par[0]->value.v.text);
return 0;
}
SetHipadabaPar(node, v, pCon);
ReleaseHdbValue(&v);
/* advance pointer beyond indices */
pPtr = par[0]->value.v.text;
for (i = 0; i < priv->idxCount; i++) {
pPtr = stptok(pPtr, path, 80, " ");
}
snprintf(path, 80, "list/%4.4d/%s", status, ANAME);
node = GetHipadabaNode(self->objectNode, path);
assert(node != NULL);
cloneHdbValue(&node->value, &v);
if (!readHdbValue(&v, pPtr, path, 80)) {
SCPrintf(pCon, eError, "ERROR: failed to convert %s to angles",
par[0]->value.v.text);
return 0;
}
SetHipadabaPar(node, v, pCon);
ReleaseHdbValue(&v);
return 1;
}
/*-----------------------------------------------------------------------*/
static int DelCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
pHdb node = NULL;
char path[132];
if (nPar < 1) {
SCWrite(pCon, "ERROR: need id to delete as argument", eError);
return 0;
}
snprintf(path, 132, "list/%s", par[0]->value.v.text);
node = GetHipadabaNode(self->objectNode, path);
if (node != NULL) {
DeleteHipadabaNode(node, pCon);
return 1;
}
SCWrite(pCon, "ERROR: reflection not found", eError);
return 0;
}
/*-----------------------------------------------------------------------*/
static int FlagCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
pHdb node = NULL;
char path[132];
if (nPar < 1) {
SCWrite(pCon, "ERROR: need id to flag for", eError);
return 0;
}
snprintf(path, 132, "list/%s/%s", par[0]->value.v.text, FLAG);
node = GetHipadabaNode(self->objectNode, path);
if (node == NULL) {
SCPrintf(pCon, eError, "ERROR: bad ID %s", par[0]->value.v.text);
return 0;
}
if (nPar < 2) {
SCPrintf(pCon, eValue, "%s.%s.flag = %d", self->pDes->name,
par[0]->value.v.text, node->value.v.intValue);
return 1;
} else {
SetHipadabaPar(node, par[1]->value, pCon);
return 1;
}
return 0;
}
/*-----------------------------------------------------------------------*/
static int ShowCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
pHdb node = NULL;
char path[132], num[20];
char data[1024];
hdbValue v;
int i;
if (nPar < 1) {
SCWrite(pCon, "ERROR: need id for reflection to show", eError);
return 0;
}
snprintf(path, 132, "list/%s/%s", par[0]->value.v.text, FLAG);
node = GetHipadabaNode(self->objectNode, path);
if (node == NULL) {
SCPrintf(pCon, eError, "ERROR: bad ID %s", par[0]->value.v.text);
return 0;
}
GetHipadabaPar(node, &v, pCon);
snprintf(data, 1024, "%s %d", par[0]->value.v.text, v.v.intValue);
snprintf(path, 132, "list/%s/%s", par[0]->value.v.text, INAME);
node = GetHipadabaNode(self->objectNode, path);
assert(node != NULL);
GetHipadabaPar(node, &v, pCon);
for (i = 0; i < v.arrayLength; i++) {
snprintf(num, 20, " %f", v.v.floatArray[i]);
strncat(data, num, 1024);
}
snprintf(path, 132, "list/%s/%s", par[0]->value.v.text, ANAME);
node = GetHipadabaNode(self->objectNode, path);
assert(node != NULL);
GetHipadabaPar(node, &v, pCon);
for (i = 0; i < v.arrayLength; i++) {
snprintf(num, 20, " %f", v.v.floatArray[i]);
strncat(data, num, 1024);
}
SCWrite(pCon, data, eValue);
return 1;
}
/*-----------------------------------------------------------------------*/
static int ListCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
char buffer[132], path[132], *pPtr, token[20], entry[20];
pRLPriv priv = self->pPrivate;
int i;
pHdb node = NULL, data;
pDynString txt;
SCStartBuffering(pCon);
/*
* build header
*/
strcpy(buffer, " ID FLAG");
node = GetHipadabaNode(self->objectNode, "indexheader");
assert(node != NULL);
pPtr = node->value.v.text;
while ((pPtr = stptok(pPtr, token, 20, ",")) != NULL) {
snprintf(entry, 20, " %8s", token);
strncat(buffer, entry, 132);
}
node = GetHipadabaNode(self->objectNode, "anglesheader");
assert(node != NULL);
pPtr = node->value.v.text;
while ((pPtr = stptok(pPtr, token, 20, ",")) != NULL) {
snprintf(entry, 20, " %8s", token);
strncat(buffer, entry, 132);
}
SCWrite(pCon, buffer, eValue);
node = GetHipadabaNode(self->objectNode, "list");
node = node->child;
while (node != NULL) {
data = GetHipadabaNode(node, FLAG);
assert(data != NULL);
snprintf(buffer, 132, " %5s %4d", node->name, data->value.v.intValue);
data = GetHipadabaNode(node, INAME);
for (i = 0; i < priv->idxCount; i++) {
sprintf(entry, IDXFMT, data->value.v.floatArray[i]);
strncat(buffer, entry, 132);
}
data = GetHipadabaNode(node, ANAME);
for (i = 0; i < priv->angCount; i++) {
sprintf(entry, ANGFMT, data->value.v.floatArray[i]);
strncat(buffer, entry, 132);
}
SCWrite(pCon, buffer, eValue);
node = node->next;
}
txt = SCEndBuffering(pCon);
SCWrite(pCon, GetCharArray(txt), eValue);
return 1;
}
/*-----------------------------------------------------------------------*/
static int NamesCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
char buffer[132];
pHdb node = NULL;
pDynString txt;
SCStartBuffering(pCon);
node = GetHipadabaNode(self->objectNode, "list");
node = node->child;
while (node != NULL) {
snprintf(buffer, 132, "%s", node->name);
SCWrite(pCon, buffer, eValue);
node = node->next;
}
txt = SCEndBuffering(pCon);
SCWrite(pCon, GetCharArray(txt), eValue);
return 1;
}
/*----------------------------------------------------------------------*/
static int SetIndexCmd(pSICSOBJ self, SConnection * pCon, pHdb commandNode,
pHdb par[], int nPar)
{
char path[80];
int status;
pHdb node = NULL;
hdbValue v;
char *pPtr = NULL, refl[20];
if (nPar < 1) {
SCWrite(pCon, "ERROR: need id and indexes as arguments", eError);
return 0;
}
pPtr = par[0]->value.v.text;
pPtr = stptok(pPtr, refl, 20, " ");
snprintf(path, 80, "list/%s/%s", refl, INAME);
node = GetHipadabaNode(self->objectNode, path);
assert(node != NULL);
cloneHdbValue(&node->value, &v);
if (!readHdbValue(&v, pPtr, path, 80)) {
SCPrintf(pCon, eError, "ERROR: failed to convert %s to indices",
par[0]->value.v.text);
return 0;
}
SetHipadabaPar(node, v, pCon);
ReleaseHdbValue(&v);
return 1;
}
/*----------------------------------------------------------------------*/
static int SetAnglesCmd(pSICSOBJ self, SConnection * pCon,
pHdb commandNode, pHdb par[], int nPar)
{
char path[80];
int status;
pHdb node = NULL;
hdbValue v;
char *pPtr = NULL, refl[20];
if (nPar < 1) {
SCWrite(pCon, "ERROR: need id and angles as arguments", eError);
return 0;
}
pPtr = par[0]->value.v.text;
pPtr = stptok(pPtr, refl, 20, " ");
snprintf(path, 80, "list/%s/%s", refl, ANAME);
node = GetHipadabaNode(self->objectNode, path);
if (node == NULL) {
SCPrintf(pCon, eError, "ERROR: reflection with ID %s not found", refl);
return 0;
}
cloneHdbValue(&node->value, &v);
if (!readHdbValue(&v, pPtr, path, 80)) {
SCPrintf(pCon, eError, "ERROR: failed to convert %s to angles",
par[0]->value.v.text);
return 0;
}
SetHipadabaPar(node, v, pCon);
ReleaseHdbValue(&v);
return 1;
}
/*-----------------------------------------------------------------------*/
int MakeReflectionList(SConnection * pCon, SicsInterp * pSics,
void *data, int argc, char *argv[])
{
pSICSOBJ pNew = NULL;
pHdb cmd;
if (argc < 2) {
SCWrite(pCon, "ERROR: need name of reflection list", eError);
return 0;
}
pNew = CreateReflectionList(pCon, pSics, argv[1]);
if (pNew == NULL) {
return 0;
}
return 1;
}
/*------------------------------------------------------------------------*/
pSICSOBJ CreateReflectionList(SConnection * pCon, SicsInterp * pSics,
char *name)
{
pSICSOBJ pNew = NULL;
pHdb cmd;
pNew = MakeReflectionListInt(name);
if (pNew == NULL) {
SCWrite(pCon, "ERROR: failed to create reflection list", eError);
return 0;
}
/* command initialization */
AddSICSHdbPar(pNew->objectNode, "make", usUser, MakeSICSFunc(MakeCmd));
AddSICSHdbPar(pNew->objectNode, "clear", usUser, MakeSICSFunc(ClearCmd));
AddSICSHdbPar(pNew->objectNode, "print", usUser, MakeSICSFunc(ListCmd));
AddSICSHdbPar(pNew->objectNode, "names", usUser, MakeSICSFunc(NamesCmd));
cmd =
AddSICSHdbPar(pNew->objectNode, "del", usUser, MakeSICSFunc(DelCmd));
AddSICSHdbPar(cmd, "id", usUser, MakeHdbText(""));
cmd =
AddSICSHdbPar(pNew->objectNode, "addx", usUser,
MakeSICSFunc(AddIndexCmd));
AddSICSHdbPar(cmd, "args", usUser, MakeHdbText(""));
cmd =
AddSICSHdbPar(pNew->objectNode, "setx", usUser,
MakeSICSFunc(SetIndexCmd));
AddSICSHdbPar(cmd, "args", usUser, MakeHdbText(""));
cmd =
AddSICSHdbPar(pNew->objectNode, "adda", usUser,
MakeSICSFunc(AddAnglesCmd));
AddSICSHdbPar(cmd, "args", usUser, MakeHdbText(""));
cmd =
AddSICSHdbPar(pNew->objectNode, "seta", usUser,
MakeSICSFunc(SetAnglesCmd));
AddSICSHdbPar(cmd, "args", usUser, MakeHdbText(""));
cmd = AddSICSHdbPar(pNew->objectNode, "addax", usUser,
MakeSICSFunc(AddIndexesAnglesCmd));
AddSICSHdbPar(cmd, "args", usUser, MakeHdbText(""));
cmd = AddSICSHdbPar(pNew->objectNode, "flag", usUser,
MakeSICSFunc(FlagCmd));
AddSICSHdbPar(cmd, "id", usUser, MakeHdbText(""));
AddSICSHdbPar(cmd, "value", usUser, MakeHdbInt(0));
cmd = AddSICSHdbPar(pNew->objectNode, "show", usUser,
MakeSICSFunc(ShowCmd));
AddSICSHdbPar(cmd, "id", usUser, MakeHdbText(""));
AddCommand(pSics, name, InterInvokeSICSOBJ, KillSICSOBJ, pNew);
return pNew;
}
/*------------------------------------------------------------------------*/
void ClearReflectionList(pSICSOBJ refl)
{
pHdb node = NULL;
hdbValue v;
pRLPriv priv = refl->pPrivate;
node = GetHipadabaNode(refl->objectNode, "list");
assert(node);
DeleteHipadabaNode(node, NULL);
v = makeHdbValue(HIPNONE, 0);
node = MakeSICSHdbPar("list", usMugger, v);
AddHipadabaChild(refl->objectNode, node, NULL);
priv->count = 0;
}
/*-------------------------------------------------------------------------*/
int ReflectionListCount(pSICSOBJ refl)
{
pHdb node = NULL;
node = GetHipadabaNode(refl->objectNode, "list");
assert(node);
return CountHdbChildren(node);
}
/*-------------------------------------------------------------------------*/
int NewListReflection(pSICSOBJ refl)
{
int count;
char path[20];
pHdb listNode = NULL, node = NULL, refNode = NULL;
hdbValue v;
pRLPriv priv = refl->pPrivate;
listNode = GetHipadabaNode(refl->objectNode, "list");
assert(listNode);
count = priv->count;
priv->count++;
snprintf(path, 20, "%4.4d", count);
node = MakeHipadabaNode(path, HIPNONE, 0);
AddHipadabaChild(listNode, node, NULL);
v = makeHdbValue(HIPFLOATAR, priv->idxCount);
AddSICSHdbPar(node, INAME, usUser, v);
v = makeHdbValue(HIPFLOATAR, priv->angCount);
AddSICSHdbPar(node, ANAME, usUser, v);
v = makeHdbValue(HIPINT, 0);
AddSICSHdbPar(node, FLAG, usUser, v);
return count;
}
/*--------------------------------------------------------------------------*/
static pHdb findReflection(pSICSOBJ refl, int idx)
{
pHdb node = NULL;
int count = 0;
if (idx < 0) {
return node;
}
node = GetHipadabaNode(refl->objectNode, "list");
assert(node);
node = node->child;
while (node != NULL && count != idx) {
count++;
node = node->next;
}
return node;
}
/*---------------------------------------------------------------------------*/
void DelListReflection(pSICSOBJ refl, int idx)
{
pHdb node = NULL;
node = findReflection(refl, idx);
if (node != NULL) {
DeleteHipadabaNode(node, NULL);
}
}
/*-----------------------------------------------------------------------------*/
int SetRefIndex(pSICSOBJ refl, int idx, double hkl[])
{
pHdb node = NULL;
hdbValue v;
pRLPriv priv = refl->pPrivate;
node = findReflection(refl, idx);
if (node != NULL) {
node = GetHipadabaNode(node, INAME);
assert(node);
v = MakeHdbFloatArray(priv->idxCount, hkl);
SetHipadabaPar(node, v, NULL);
return 1;
} else {
return 0;
}
}
/*-----------------------------------------------------------------------------*/
int SetRefAngles(pSICSOBJ refl, int idx, double ang[])
{
pHdb node = NULL;
hdbValue v;
pRLPriv priv = refl->pPrivate;
node = findReflection(refl, idx);
if (node != NULL) {
node = GetHipadabaNode(node, ANAME);
assert(node);
v = MakeHdbFloatArray(priv->angCount, ang);
SetHipadabaPar(node, v, NULL);
return 1;
} else {
return 0;
}
}
/*-----------------------------------------------------------------------------*/
int SetRefFlag(pSICSOBJ refl, int idx, int val)
{
pHdb node = NULL;
hdbValue v;
pRLPriv priv = refl->pPrivate;
node = findReflection(refl, idx);
if (node != NULL) {
node = GetHipadabaNode(node, FLAG);
assert(node);
v = MakeHdbInt(val);
SetHipadabaPar(node, v, NULL);
return 1;
} else {
return 0;
}
}
/*-------------------------------------------------------------------------------*/
int GetRefIndex(pSICSOBJ refl, int idx, double hkl[])
{
pHdb node = NULL;
pRLPriv priv = refl->pPrivate;
node = findReflection(refl, idx);
if (node != NULL) {
node = GetHipadabaNode(node, INAME);
assert(node);
memcpy(hkl, node->value.v.floatArray, priv->idxCount * sizeof(double));
return 1;
} else {
return 0;
}
}
/*-------------------------------------------------------------------------------*/
int GetRefIndexID(pSICSOBJ refl, char *id, double hkl[])
{
pHdb node = NULL;
pRLPriv priv = refl->pPrivate;
char path[132];
snprintf(path, 132, "list/%s", id);
node = GetHipadabaNode(refl->objectNode, path);
if (node != NULL) {
node = GetHipadabaNode(node, INAME);
assert(node);
memcpy(hkl, node->value.v.floatArray, priv->idxCount * sizeof(double));
return 1;
} else {
return 0;
}
}
/*-------------------------------------------------------------------------------*/
int GetRefAngles(pSICSOBJ refl, int idx, double ang[])
{
pHdb node = NULL;
pRLPriv priv = refl->pPrivate;
node = findReflection(refl, idx);
if (node != NULL) {
node = GetHipadabaNode(node, ANAME);
assert(node);
memcpy(ang, node->value.v.floatArray, priv->angCount * sizeof(double));
return 1;
} else {
return 0;
}
}
/*-------------------------------------------------------------------------------*/
int GetRefAnglesID(pSICSOBJ refl, char *id, double hkl[])
{
pHdb node = NULL;
pRLPriv priv = refl->pPrivate;
char path[132];
snprintf(path, 132, "list/%s", id);
node = GetHipadabaNode(refl->objectNode, path);
if (node != NULL) {
node = GetHipadabaNode(node, ANAME);
assert(node);
memcpy(hkl, node->value.v.floatArray, priv->angCount * sizeof(double));
return 1;
} else {
return 0;
}
}
/*-------------------------------------------------------------------------------*/
int GetRefFlag(pSICSOBJ refl, int idx)
{
pHdb node = NULL;
pRLPriv priv = refl->pPrivate;
node = findReflection(refl, idx);
if (node != NULL) {
node = GetHipadabaNode(node, FLAG);
assert(node);
return node->value.v.intValue;
} else {
return -1;
}
}
/*--------------------------------------------------------------------------------*/
char *GetRefName(pSICSOBJ refl, int idx)
{
pHdb node = NULL;
node = findReflection(refl, idx);
if (node != NULL) {
return node->name;
} else {
return undef;
}
}