- DMC McStas simulation working
SKIPPED: psi/amorstat.c psi/nxamor.c psi/pimotor.c psi/polterwrite.c
This commit is contained in:
@ -47,21 +47,24 @@ in a certain way:
|
|||||||
Alternatively SICS can write the data to be passed to McStas into a file. But then this
|
Alternatively SICS can write the data to be passed to McStas into a file. But then this
|
||||||
file must be read in the INITIALIZE section of the instrument definition and values must
|
file must be read in the INITIALIZE section of the instrument definition and values must
|
||||||
be assigned to the appropriate McStas variables.
|
be assigned to the appropriate McStas variables.
|
||||||
<li>McStas must dump its data into a single file: use the <b>-f filename</b> option.
|
<li>In order for the NeXus-XML based reading to work McStas must dump its data into a single file:
|
||||||
The format must be <b> --format=XML</b>.
|
use the <b>-f filename</b> option. The format must be <b> --format=XML</b>.
|
||||||
<li> In order to count on monitor, a modified PSD_monitor component MUST be used in the
|
<li> In order to count on monitor, a modified monitor component, MKMonitor MUST be used in the
|
||||||
simulation. This component writes the collected total counts into a file. This file is
|
simulation. This component writes the collected total counts into a file. This file is
|
||||||
the read by SICS in order to determine the control monitor. Evaluating the McStas XML dump \
|
the read by SICS in order to determine the control monitor. Evaluating the McStas dump \
|
||||||
file each time proved to be to inaccurate. The name of the file containing the monitor
|
file each time proved to be to inaccurate. The name of the file containing the monitor
|
||||||
must be configured through: mccontrol configure mcmonfile name-of-file.
|
must be configured through: mccontrol configure mcmonfile name-of-file.
|
||||||
<li>The mcstas simulation executable must be declared with allowexec in order to be able
|
<li>The mcstas simulation executable must be declared with allowexec in order to be able
|
||||||
to start with the Tcl exec command.
|
to start with the Tcl exec command.
|
||||||
|
<li>Though McStas can be made to dump its data by sending it a USR2 signal, it is
|
||||||
|
much cleaner and simpler to have McStas dump its data regularly through the use of the
|
||||||
|
Progress_bar component.
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
<h2>The McStas Reader</h2>
|
<h2>The McStas Reader</h2>
|
||||||
<p>
|
<p>
|
||||||
In order to enable trasnfer from McStas result files into SICS objects a reader object is
|
In order to enable transfer from McStas result files into SICS objects a reader object is
|
||||||
needed. This module supports only XML formatted McStas files, with the output dumped into
|
needed. This module supports XML formatted McStas files, with the output dumped into
|
||||||
one file. The McStas options to achieve this are: <b>-f filename --format="XML"</b>
|
one file. The McStas options to achieve this are: <b>-f filename --format="XML"</b>
|
||||||
This module supports the following commands:
|
This module supports the following commands:
|
||||||
<dl>
|
<dl>
|
||||||
@ -69,7 +72,7 @@ This module supports the following commands:
|
|||||||
<dd>Opens a McStas simulation file for reading.
|
<dd>Opens a McStas simulation file for reading.
|
||||||
<dt>mcreader close
|
<dt>mcreader close
|
||||||
<dd>Closes a McStas file after use.
|
<dd>Closes a McStas file after use.
|
||||||
<dt>mcreader insertmon path object monitornumber
|
<dt>mcreader insertmon path object monitornumber scale
|
||||||
<dd>This transfers a monitor value from a previously opened McStas file into a SICS
|
<dd>This transfers a monitor value from a previously opened McStas file into a SICS
|
||||||
monitor field. The McStas field read is the values tag belonging to the component. The
|
monitor field. The McStas field read is the values tag belonging to the component. The
|
||||||
parameters:
|
parameters:
|
||||||
@ -83,12 +86,28 @@ groups, the name attribute is used a path component.
|
|||||||
this McStas interface only counters can store monitors.
|
this McStas interface only counters can store monitors.
|
||||||
<dt>monitornumber
|
<dt>monitornumber
|
||||||
<dd>Monitornumber is the monitor channel into which the value is to be stored.
|
<dd>Monitornumber is the monitor channel into which the value is to be stored.
|
||||||
|
<dt>scale
|
||||||
|
<dd>Scale is an optional scale factor for the monitor. Real monitors have a
|
||||||
|
sensitivity of E-6, McStas monitors have an efficiency of 1.0. This factor allows to
|
||||||
|
correct for this.
|
||||||
</dl>
|
</dl>
|
||||||
<dt>mcreader inserthm path hmobject
|
<dt>mcreader inserthm path hmobject scale
|
||||||
<dd>Inserts array data stored under path in the histogram memory array of hmobject which
|
<dd>Inserts array data stored under path in the histogram memory array of hmobject which
|
||||||
must be a valid SICS histogram memory object. The path is the same as given for insertmon,
|
must be a valid SICS histogram memory object. The path is the same as given for insertmon,
|
||||||
but of course the data part of the detector must be addressed.
|
but of course the data part of the detector must be addressed. Scale is again an optional
|
||||||
|
scale factor which allows to scale the McStas counts to real counts.
|
||||||
</dl>
|
</dl>
|
||||||
|
The mccreader module also supports reading data from any ASCII file into SICS. Mcreader
|
||||||
|
close and open are not required then. For reading histogram memory data, the appropriate
|
||||||
|
data has to be parsed into a <a href="sicsdata.htm">SICSdata</a> object first. Then
|
||||||
|
data can be trasnferred using the following commands:
|
||||||
|
<dl>
|
||||||
|
<dt>mcreader insertmondirect counter num value
|
||||||
|
<dd>Assigns value to the monitor num at the counter object counter. Monitor 0 is the
|
||||||
|
actual counts data.
|
||||||
|
</dl>
|
||||||
|
<dt>mcreader inserthmfromdata hm data
|
||||||
|
<dd>Inserts the data in the SICSData object data into the histogram memory hm.
|
||||||
</p>
|
</p>
|
||||||
<H2>The McStas Controller</h2>
|
<H2>The McStas Controller</h2>
|
||||||
<p>
|
<p>
|
||||||
@ -123,6 +142,11 @@ line and finally starts the simulation. This script is expected to return either
|
|||||||
<dd>This configures the minimum time between McStas dumps in seconds. The idea is that
|
<dd>This configures the minimum time between McStas dumps in seconds. The idea is that
|
||||||
SICS buffers values during a simulation run and does not interrupt the McStas process to
|
SICS buffers values during a simulation run and does not interrupt the McStas process to
|
||||||
often.
|
often.
|
||||||
|
<dt>mccontrol configure update monitorscale
|
||||||
|
<dd>Configures the scaling factor to use on the monitor in monfile. Normal monitors have
|
||||||
|
a efficeincy of 1E-6, the McStas monitor counts every neutron. This can be compensated
|
||||||
|
for by this scaling factor. Note that this scaling factor may be dependent on the
|
||||||
|
wavelength used.
|
||||||
<dt>mccontrol configure mcmonfile filename
|
<dt>mccontrol configure mcmonfile filename
|
||||||
<dd>This configures the file which mccontrol is going to read in order to watch the
|
<dd>This configures the file which mccontrol is going to read in order to watch the
|
||||||
simulation control monitor.
|
simulation control monitor.
|
||||||
@ -131,6 +155,10 @@ line and finally starts the simulation. This script is expected to return either
|
|||||||
<dt>mccontrol run scriptkey
|
<dt>mccontrol run scriptkey
|
||||||
<dd>Invokes one of the scripts configure for testing purposes. scripkey can be one of:
|
<dd>Invokes one of the scripts configure for testing purposes. scripkey can be one of:
|
||||||
mcstart, mcisrunning, mcdump, mckill and mccopydata.
|
mcstart, mcisrunning, mcdump, mckill and mccopydata.
|
||||||
|
<dt>mccontrol finish
|
||||||
|
<dd>This calls waitpid on the PID of the McStas process. This should be done in
|
||||||
|
the mckill script. Otherwise it may occur that the McStas simulation turns into
|
||||||
|
a Zombie process.
|
||||||
</dl>
|
</dl>
|
||||||
Standard scripts for many of the script routines required are provided for the unix
|
Standard scripts for many of the script routines required are provided for the unix
|
||||||
environment in the file mcsupport.tcl. Please note, that all system executables called
|
environment in the file mcsupport.tcl. Please note, that all system executables called
|
||||||
|
@ -295,6 +295,7 @@
|
|||||||
if(!self->iInit)
|
if(!self->iInit)
|
||||||
{
|
{
|
||||||
SCWrite(pCon,"ERROR: histogram memory not initialised",eError);
|
SCWrite(pCon,"ERROR: histogram memory not initialised",eError);
|
||||||
|
InvokeCallBack(self->pCall,COUNTEND,NULL);
|
||||||
return COTERM;
|
return COTERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,6 +310,7 @@
|
|||||||
{
|
{
|
||||||
SCWrite(pCon,"ERROR: failed to fix histogram memory problem",eError);
|
SCWrite(pCon,"ERROR: failed to fix histogram memory problem",eError);
|
||||||
SCSetInterrupt(pCon,eAbortBatch);
|
SCSetInterrupt(pCon,eAbortBatch);
|
||||||
|
InvokeCallBack(self->pCall,COUNTEND,NULL);
|
||||||
return eCt;
|
return eCt;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -326,6 +328,7 @@
|
|||||||
GetHistogram
|
GetHistogram
|
||||||
*/
|
*/
|
||||||
updateHMData(self->pDriv->data);
|
updateHMData(self->pDriv->data);
|
||||||
|
InvokeCallBack(self->pCall,COUNTEND,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return eCt;
|
return eCt;
|
||||||
@ -760,8 +763,6 @@ void HistDirty(pHistMem self)
|
|||||||
iRet = 1;
|
iRet = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* whatever happened, send a COUNTEND event */
|
|
||||||
InvokeCallBack(self->pCall,COUNTEND,NULL);
|
|
||||||
|
|
||||||
return iRet;
|
return iRet;
|
||||||
|
|
||||||
|
3
hmdata.c
3
hmdata.c
@ -150,9 +150,8 @@ int genTimeBinning(pHMdata self, float start, float step, int noSteps){
|
|||||||
}
|
}
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
int setTimeBin(pHMdata self, int index, float value){
|
int setTimeBin(pHMdata self, int index, float value){
|
||||||
if(index > 0 || index < MAXCHAN){
|
if(index >= 0 && index < MAXCHAN){
|
||||||
self->timeBinning[index] = value;
|
self->timeBinning[index] = value;
|
||||||
return 1;
|
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
70
mccontrol.c
70
mccontrol.c
@ -1,11 +1,13 @@
|
|||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
McStas simulation to SICS controller module mplementation file. For more details
|
McStas simulation to SICS controller module implementation file. For more
|
||||||
see mcstas.tex.
|
details see mcstas.tex.
|
||||||
|
|
||||||
copyright: see file COPYRIGHT
|
copyright: see file COPYRIGHT
|
||||||
|
|
||||||
Mark Koennecke, June 2005
|
Mark Koennecke, June 2005
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <tcl.h>
|
#include <tcl.h>
|
||||||
@ -54,6 +56,7 @@ int McStasControllerFactory(SConnection *pCon, SicsInterp *pSics,
|
|||||||
StringDictAddPair(pNew->scripts,"mccopydata","UNDEFINED");
|
StringDictAddPair(pNew->scripts,"mccopydata","UNDEFINED");
|
||||||
StringDictAddPair(pNew->scripts,"mcmonfile","UNDEFINED");
|
StringDictAddPair(pNew->scripts,"mcmonfile","UNDEFINED");
|
||||||
pNew->pid = -1;
|
pNew->pid = -1;
|
||||||
|
pNew->monitorScale = 1;
|
||||||
|
|
||||||
return AddCommand(pSics,"mccontrol",
|
return AddCommand(pSics,"mccontrol",
|
||||||
McStasControllerWrapper,
|
McStasControllerWrapper,
|
||||||
@ -77,6 +80,16 @@ static int configureController(pMcStasController self, SConnection *pCon,
|
|||||||
SCSendOK(pCon);
|
SCSendOK(pCon);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if(strcmp(argv[2],"monitorscale") == 0){
|
||||||
|
self->monitorScale = atof(argv[3]);
|
||||||
|
if(self->monitorScale <= 0){
|
||||||
|
SCWrite(pCon,"ERROR: invalid monitor scale",eError);
|
||||||
|
self->monitorScale = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
if(!StringDictExists(self->scripts,argv[2])){
|
if(!StringDictExists(self->scripts,argv[2])){
|
||||||
snprintf(pBueffel,255,"ERROR: scriptkey %s does not exist",argv[2]);
|
snprintf(pBueffel,255,"ERROR: scriptkey %s does not exist",argv[2]);
|
||||||
SCWrite(pCon,pBueffel,eError);
|
SCWrite(pCon,pBueffel,eError);
|
||||||
@ -114,6 +127,9 @@ static void listConfiguration(pMcStasController self, SConnection *pCon){
|
|||||||
snprintf(pLine,255,"mccontrol.updateintervall = %d\n",
|
snprintf(pLine,255,"mccontrol.updateintervall = %d\n",
|
||||||
self->updateIntervall);
|
self->updateIntervall);
|
||||||
Tcl_DStringAppend(&txt,pLine,-1);
|
Tcl_DStringAppend(&txt,pLine,-1);
|
||||||
|
snprintf(pLine,255,"mccontrol.monitorscale = %f\n",
|
||||||
|
self->monitorScale);
|
||||||
|
Tcl_DStringAppend(&txt,pLine,-1);
|
||||||
snprintf(pLine,255,"mccontrol.pid = %d", self->pid);
|
snprintf(pLine,255,"mccontrol.pid = %d", self->pid);
|
||||||
Tcl_DStringAppend(&txt,pLine,-1);
|
Tcl_DStringAppend(&txt,pLine,-1);
|
||||||
|
|
||||||
@ -187,11 +203,22 @@ static int start(pMcStasController self, SConnection *pCon){
|
|||||||
SCSendOK(pCon);
|
SCSendOK(pCon);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
static void wait4Finish(pMcStasController self){
|
||||||
|
int status;
|
||||||
|
|
||||||
|
if(self->pid > 0){
|
||||||
|
status = waitpid(self->pid,NULL,WNOHANG);
|
||||||
|
if(status >= 0){
|
||||||
|
self->pid = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
int McStasControllerWrapper(SConnection *pCon, SicsInterp *pSics,
|
int McStasControllerWrapper(SConnection *pCon, SicsInterp *pSics,
|
||||||
void *pData, int argc, char *argv[]){
|
void *pData, int argc, char *argv[]){
|
||||||
pMcStasController self = NULL;
|
pMcStasController self = NULL;
|
||||||
char pBueffel[255];
|
char pBueffel[255], pFile[132];
|
||||||
|
|
||||||
self = (pMcStasController)pData;
|
self = (pMcStasController)pData;
|
||||||
assert(self);
|
assert(self);
|
||||||
@ -210,6 +237,10 @@ int McStasControllerWrapper(SConnection *pCon, SicsInterp *pSics,
|
|||||||
return runScript(self,pCon,pSics,argc,argv);
|
return runScript(self,pCon,pSics,argc,argv);
|
||||||
} else if(strcmp(argv[1],"start") == 0){
|
} else if(strcmp(argv[1],"start") == 0){
|
||||||
return start(self,pCon);
|
return start(self,pCon);
|
||||||
|
} else if(strcmp(argv[1],"finish") == 0){
|
||||||
|
wait4Finish(self);
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
snprintf(pBueffel,255,"ERROR: subcommand %s to mccontrol unknown",
|
snprintf(pBueffel,255,"ERROR: subcommand %s to mccontrol unknown",
|
||||||
argv[1]);
|
argv[1]);
|
||||||
@ -256,6 +287,7 @@ int McStasStart(pMcStasController self, CounterMode mode, float fPreset){
|
|||||||
self->pid = atoi(pResult);
|
self->pid = atoi(pResult);
|
||||||
self->startTime = time(NULL);
|
self->startTime = time(NULL);
|
||||||
self->lastUpdate = self->startTime - self->updateIntervall;
|
self->lastUpdate = self->startTime - self->updateIntervall;
|
||||||
|
self->lastMonitorRead = self->startTime;
|
||||||
return OKOK;
|
return OKOK;
|
||||||
}
|
}
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
@ -277,9 +309,15 @@ static long readMonFile(pMcStasController self){
|
|||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
int McStasStatus(pMcStasController self, float *fControl){
|
int McStasStatus(pMcStasController self, float *fControl){
|
||||||
char pResult[256];
|
char pResult[256];
|
||||||
long monValue;
|
float monValue;
|
||||||
int status, i;
|
int status, i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check at max any second, else we keep the system busy and
|
||||||
|
* there is no CPU left for McStas
|
||||||
|
*/
|
||||||
|
SicsWait(1);
|
||||||
|
|
||||||
status = invokeScript(self,"mcisrunning",pServ->pSics,pResult, 255);
|
status = invokeScript(self,"mcisrunning",pServ->pSics,pResult, 255);
|
||||||
if(status == 0){
|
if(status == 0){
|
||||||
strncpy(self->errorText,pResult,255);
|
strncpy(self->errorText,pResult,255);
|
||||||
@ -300,23 +338,31 @@ int McStasStatus(pMcStasController self, float *fControl){
|
|||||||
* handle monitor mode
|
* handle monitor mode
|
||||||
*/
|
*/
|
||||||
if(status == 1 && self->mode == ePreset){
|
if(status == 1 && self->mode == ePreset){
|
||||||
|
/*
|
||||||
|
* check only any three seconds, else SICS uses up all the CPU time
|
||||||
|
* and the simulation has no chance.
|
||||||
|
*/
|
||||||
|
if(time(NULL) < self->lastMonitorRead + 3) {
|
||||||
|
return HWBusy;
|
||||||
|
}
|
||||||
monValue = -1;
|
monValue = -1;
|
||||||
/*
|
/*
|
||||||
* try to read the monfile up to three times. Problems reading it
|
* try to read the monfile up to three times. Problems reading it
|
||||||
* can be synchronisation problems with McStas
|
* can be synchronisation problems with McStas
|
||||||
*/
|
*/
|
||||||
for(i = 0, monValue = -1; i < 3; i++){
|
for(i = 0, monValue = -1; i < 7; i++){
|
||||||
monValue = readMonFile(self);
|
monValue = (float)readMonFile(self);
|
||||||
if(monValue >= 0){
|
if(monValue >= 0){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(monValue < 0){
|
if(monValue < 0){
|
||||||
strncpy(self->errorText,"Failed to read monitor file",255);
|
return HWBusy;
|
||||||
return HWFault;
|
|
||||||
}
|
}
|
||||||
*fControl = (float)monValue;
|
self->lastMonitorRead = time(NULL);
|
||||||
if(monValue >= (long)self->fPreset){
|
monValue *= self->monitorScale;
|
||||||
|
*fControl = monValue;
|
||||||
|
if(monValue >= self->fPreset){
|
||||||
McStasStop(self);
|
McStasStop(self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -348,10 +394,12 @@ int McStasTransferData(pMcStasController self){
|
|||||||
return OKOK;
|
return OKOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->lastUpdate = time(NULL);
|
||||||
if(self->pid >= 0){
|
if(self->pid >= 0){
|
||||||
status = invokeScript(self,"mcdump",pServ->pSics,pResult, 255);
|
status = invokeScript(self,"mcdump",pServ->pSics,pResult, 255);
|
||||||
if(status == 0){
|
if(status == 0){
|
||||||
strncpy(self->errorText,pResult,255);
|
strncpy(self->errorText,pResult,255);
|
||||||
|
self->lastUpdate = time(NULL) - self->updateIntervall;
|
||||||
return HWFault;
|
return HWFault;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -359,9 +407,9 @@ int McStasTransferData(pMcStasController self){
|
|||||||
status = invokeScript(self,"mccopydata",pServ->pSics,pResult, 255);
|
status = invokeScript(self,"mccopydata",pServ->pSics,pResult, 255);
|
||||||
if(status == 0){
|
if(status == 0){
|
||||||
strncpy(self->errorText,pResult,255);
|
strncpy(self->errorText,pResult,255);
|
||||||
|
self->lastUpdate = time(NULL) - self->updateIntervall;
|
||||||
return HWFault;
|
return HWFault;
|
||||||
}
|
}
|
||||||
self->lastUpdate = time(NULL);
|
|
||||||
return OKOK;
|
return OKOK;
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
pStringDict scripts;
|
pStringDict scripts;
|
||||||
int updateIntervall;
|
int updateIntervall;
|
||||||
int pid;
|
int pid;
|
||||||
|
float monitorScale;
|
||||||
int lastError;
|
int lastError;
|
||||||
char errorText[256];
|
char errorText[256];
|
||||||
CounterMode mode;
|
CounterMode mode;
|
||||||
@ -26,6 +27,7 @@
|
|||||||
time_t lastUpdate;
|
time_t lastUpdate;
|
||||||
time_t startTime;
|
time_t startTime;
|
||||||
time_t stopTime;
|
time_t stopTime;
|
||||||
|
time_t lastMonitorRead;
|
||||||
}McStasController, *pMcStasController;
|
}McStasController, *pMcStasController;
|
||||||
|
|
||||||
/*---------------------- function prototypes -------------------------------------------*/
|
/*---------------------- function prototypes -------------------------------------------*/
|
||||||
|
111
mcreader.c
111
mcreader.c
@ -10,6 +10,7 @@
|
|||||||
#include "mcreader.h"
|
#include "mcreader.h"
|
||||||
#include "counter.h"
|
#include "counter.h"
|
||||||
#include "HistMem.h"
|
#include "HistMem.h"
|
||||||
|
#include "sicsdata.h"
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static void KillMcReader(void *pData){
|
static void KillMcReader(void *pData){
|
||||||
pMcStasReader self = (pMcStasReader)pData;
|
pMcStasReader self = (pMcStasReader)pData;
|
||||||
@ -127,7 +128,8 @@ static int insertMonitor(pMcStasReader self, SConnection *pCon,
|
|||||||
SicsInterp *pSics, int argc, char *argv[]){
|
SicsInterp *pSics, int argc, char *argv[]){
|
||||||
char pBueffel[512], *pPtr, pNumber[80];
|
char pBueffel[512], *pPtr, pNumber[80];
|
||||||
pCounter pCount = NULL;
|
pCounter pCount = NULL;
|
||||||
int status, mon, monValue, type, rank, iDim[NX_MAXRANK];
|
int status, mon, type, rank, iDim[NX_MAXRANK];
|
||||||
|
float monValue, scale = 1.;
|
||||||
|
|
||||||
if(argc < 5){
|
if(argc < 5){
|
||||||
SCWrite(pCon,\
|
SCWrite(pCon,\
|
||||||
@ -157,6 +159,10 @@ static int insertMonitor(pMcStasReader self, SConnection *pCon,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(argc > 5) {
|
||||||
|
scale = atof(argv[5]);
|
||||||
|
}
|
||||||
|
|
||||||
status = NXgetinfo(self->handle,&rank,iDim,&type);
|
status = NXgetinfo(self->handle,&rank,iDim,&type);
|
||||||
if(status != NX_OK){
|
if(status != NX_OK){
|
||||||
snprintf(pBueffel,511,"ERROR: Nexus error %s while reading %s",
|
snprintf(pBueffel,511,"ERROR: Nexus error %s while reading %s",
|
||||||
@ -187,7 +193,40 @@ static int insertMonitor(pMcStasReader self, SConnection *pCon,
|
|||||||
pPtr = getNextMCNumber(pPtr,pNumber);
|
pPtr = getNextMCNumber(pPtr,pNumber);
|
||||||
pPtr = getNextMCNumber(pPtr,pNumber);
|
pPtr = getNextMCNumber(pPtr,pNumber);
|
||||||
pPtr = getNextMCNumber(pPtr,pNumber);
|
pPtr = getNextMCNumber(pPtr,pNumber);
|
||||||
monValue = atoi(pNumber);
|
monValue = atof(pNumber);
|
||||||
|
monValue *= scale;
|
||||||
|
|
||||||
|
if(pCount != NULL){
|
||||||
|
SetMonitorValue(pCount,mon,(long)monValue);
|
||||||
|
}
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
static int insertMonitorDirect(pMcStasReader self, SConnection *pCon,
|
||||||
|
SicsInterp *pSics, int argc, char *argv[]){
|
||||||
|
char pBueffel[512], *pPtr, pNumber[80];
|
||||||
|
pCounter pCount = NULL;
|
||||||
|
int status, mon;
|
||||||
|
float monValue;
|
||||||
|
|
||||||
|
if(argc < 5){
|
||||||
|
SCWrite(pCon,\
|
||||||
|
"ERROR: insufficient number of arguments to mcreader insertmondirect",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCount = FindCommandData(pSics,argv[2],"SingleCounter");
|
||||||
|
if(pCount == NULL){
|
||||||
|
snprintf(pBueffel,511,
|
||||||
|
"ERROR: %s is no counter object",
|
||||||
|
argv[3]);
|
||||||
|
SCWrite(pCon,pBueffel,eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
mon = atoi(argv[3]);
|
||||||
|
monValue = atof(argv[4]);
|
||||||
|
|
||||||
if(pCount != NULL){
|
if(pCount != NULL){
|
||||||
SetMonitorValue(pCount,mon,(long)monValue);
|
SetMonitorValue(pCount,mon,(long)monValue);
|
||||||
@ -203,6 +242,8 @@ static int insertHM(pMcStasReader self, SConnection *pCon,
|
|||||||
int status, type, rank, iDim[NX_MAXRANK];
|
int status, type, rank, iDim[NX_MAXRANK];
|
||||||
int length, i;
|
int length, i;
|
||||||
HistInt *lData = NULL;
|
HistInt *lData = NULL;
|
||||||
|
float scale = 1.;
|
||||||
|
double val;
|
||||||
|
|
||||||
if(argc < 4){
|
if(argc < 4){
|
||||||
SCWrite(pCon,\
|
SCWrite(pCon,\
|
||||||
@ -230,6 +271,9 @@ static int insertHM(pMcStasReader self, SConnection *pCon,
|
|||||||
SCWrite(pCon,pBueffel,eError);
|
SCWrite(pCon,pBueffel,eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if(argc > 4){
|
||||||
|
scale = atof(argv[4]);
|
||||||
|
}
|
||||||
|
|
||||||
status = NXgetinfo(self->handle,&rank,iDim,&type);
|
status = NXgetinfo(self->handle,&rank,iDim,&type);
|
||||||
if(status != NX_OK){
|
if(status != NX_OK){
|
||||||
@ -266,7 +310,9 @@ static int insertHM(pMcStasReader self, SConnection *pCon,
|
|||||||
pPtr = pData;
|
pPtr = pData;
|
||||||
for(i = 0; i < length && pPtr != NULL; i++){
|
for(i = 0; i < length && pPtr != NULL; i++){
|
||||||
pPtr = getNextMCNumber(pPtr,pNumber);
|
pPtr = getNextMCNumber(pPtr,pNumber);
|
||||||
lData[i] = atoi(pNumber);
|
val = atof(pNumber);
|
||||||
|
val *= scale;
|
||||||
|
lData[i] = (HistInt)val;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetHistogram(pHM,pCon,0,0,length,lData);
|
SetHistogram(pHM,pCon,0,0,length,lData);
|
||||||
@ -276,6 +322,61 @@ static int insertHM(pMcStasReader self, SConnection *pCon,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
static int insertHMFromData(pMcStasReader self, SConnection *pCon,
|
||||||
|
SicsInterp *pSics, int argc, char *argv[]){
|
||||||
|
char pBueffel[512];
|
||||||
|
pHistMem pHM = NULL;
|
||||||
|
int length, i;
|
||||||
|
HistInt *lData = NULL;
|
||||||
|
pSICSData data = NULL;
|
||||||
|
|
||||||
|
if(argc < 4){
|
||||||
|
SCWrite(pCon,\
|
||||||
|
"ERROR: insufficient number of arguments to mcreader inserthmfromdata",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pHM = FindCommandData(pSics,argv[2],"HistMem");
|
||||||
|
if(pHM == NULL){
|
||||||
|
snprintf(pBueffel,511,
|
||||||
|
"ERROR: %s is no histogram memory object",
|
||||||
|
argv[3]);
|
||||||
|
SCWrite(pCon,pBueffel,eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
data = FindCommandData(pSics,argv[3],"SICSData");
|
||||||
|
if(data == NULL){
|
||||||
|
snprintf(pBueffel,511,
|
||||||
|
"ERROR: %s is no SICSData object",
|
||||||
|
argv[3]);
|
||||||
|
SCWrite(pCon,pBueffel,eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = GetHistLength(pHM);
|
||||||
|
if(data->currentDataSize < length){
|
||||||
|
snprintf(pBueffel,511,"WARNING: data in %s to short for HM %s",
|
||||||
|
argv[3],argv[2]);
|
||||||
|
SCWrite(pCon,pBueffel,eWarning);
|
||||||
|
}
|
||||||
|
lData = (HistInt *)malloc(length*sizeof(HistInt));
|
||||||
|
if(lData== NULL){
|
||||||
|
SCWrite(pCon,"ERROR: out of memory in mcreader inserthm",eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memset(lData,0,length*sizeof(HistInt));
|
||||||
|
if(data->currentDataSize < length){
|
||||||
|
length = data->currentDataSize;
|
||||||
|
}
|
||||||
|
for(i = 0; i < length; i++){
|
||||||
|
lData[i] = (HistInt)data->data[i];
|
||||||
|
}
|
||||||
|
SetHistogram(pHM,pCon,0,0,length,lData);
|
||||||
|
free(lData);
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
int McStasReaderWrapper(SConnection *pCon, SicsInterp *pSics,
|
int McStasReaderWrapper(SConnection *pCon, SicsInterp *pSics,
|
||||||
void *pData, int argc, char *argv[]){
|
void *pData, int argc, char *argv[]){
|
||||||
pMcStasReader self = NULL;
|
pMcStasReader self = NULL;
|
||||||
@ -296,8 +397,12 @@ int McStasReaderWrapper(SConnection *pCon, SicsInterp *pSics,
|
|||||||
return closeMcStasFile(self,pCon);
|
return closeMcStasFile(self,pCon);
|
||||||
} else if(strcmp(argv[1],"insertmon") == 0){
|
} else if(strcmp(argv[1],"insertmon") == 0){
|
||||||
return insertMonitor(self,pCon, pSics,argc,argv);
|
return insertMonitor(self,pCon, pSics,argc,argv);
|
||||||
|
} else if(strcmp(argv[1],"insertmondirect") == 0){
|
||||||
|
return insertMonitorDirect(self,pCon, pSics,argc,argv);
|
||||||
} else if(strcmp(argv[1],"inserthm") == 0){
|
} else if(strcmp(argv[1],"inserthm") == 0){
|
||||||
return insertHM(self,pCon, pSics,argc,argv);
|
return insertHM(self,pCon, pSics,argc,argv);
|
||||||
|
} else if(strcmp(argv[1],"inserthmfromdata") == 0){
|
||||||
|
return insertHMFromData(self,pCon, pSics,argc,argv);
|
||||||
} else {
|
} else {
|
||||||
snprintf(pBueffel,511,"ERROR: invalid subcommand %s to %s",
|
snprintf(pBueffel,511,"ERROR: invalid subcommand %s to %s",
|
||||||
argv[1],argv[0]);
|
argv[1],argv[0]);
|
||||||
|
@ -24,6 +24,10 @@ in a certain way:
|
|||||||
be assigned to the appropriate McStas variables.
|
be assigned to the appropriate McStas variables.
|
||||||
\item McStas must dump its data into a single file: use the {\it -f filename} option.
|
\item McStas must dump its data into a single file: use the {\it -f filename} option.
|
||||||
The format must be {\it --format=\"XML\"}.
|
The format must be {\it --format=\"XML\"}.
|
||||||
|
\item In order to count on monitor, a modified PSD_monitor component MUST be used in the
|
||||||
|
simulation. This component writes the collected total counts into a file. This file is
|
||||||
|
the read by SICS in order to determine the control monitor. Evaluating the McStas XML dump \
|
||||||
|
file each time proved to be to inaccurate.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsubsection{The McStas Controller}
|
\subsubsection{The McStas Controller}
|
||||||
@ -69,6 +73,7 @@ $\langle$mcconint {\footnotesize ?}$\rangle\equiv$
|
|||||||
\mbox{}\verb@ pStringDict scripts;@\\
|
\mbox{}\verb@ pStringDict scripts;@\\
|
||||||
\mbox{}\verb@ int updateIntervall;@\\
|
\mbox{}\verb@ int updateIntervall;@\\
|
||||||
\mbox{}\verb@ int pid;@\\
|
\mbox{}\verb@ int pid;@\\
|
||||||
|
\mbox{}\verb@ float monitorScale;@\\
|
||||||
\mbox{}\verb@ int lastError;@\\
|
\mbox{}\verb@ int lastError;@\\
|
||||||
\mbox{}\verb@ char errorText[256];@\\
|
\mbox{}\verb@ char errorText[256];@\\
|
||||||
\mbox{}\verb@ CounterMode mode;@\\
|
\mbox{}\verb@ CounterMode mode;@\\
|
||||||
@ -76,6 +81,7 @@ $\langle$mcconint {\footnotesize ?}$\rangle\equiv$
|
|||||||
\mbox{}\verb@ time_t lastUpdate;@\\
|
\mbox{}\verb@ time_t lastUpdate;@\\
|
||||||
\mbox{}\verb@ time_t startTime;@\\
|
\mbox{}\verb@ time_t startTime;@\\
|
||||||
\mbox{}\verb@ time_t stopTime;@\\
|
\mbox{}\verb@ time_t stopTime;@\\
|
||||||
|
\mbox{}\verb@ time_t lastMonitorRead;@\\
|
||||||
\mbox{}\verb@ }McStasController, *pMcStasController;@\\
|
\mbox{}\verb@ }McStasController, *pMcStasController;@\\
|
||||||
\mbox{}\verb@ @$\diamond$
|
\mbox{}\verb@ @$\diamond$
|
||||||
\end{list}
|
\end{list}
|
||||||
|
2
mcstas.w
2
mcstas.w
@ -68,6 +68,7 @@ deemed advisable to separate this logic into a separate module. The McStas contr
|
|||||||
pStringDict scripts;
|
pStringDict scripts;
|
||||||
int updateIntervall;
|
int updateIntervall;
|
||||||
int pid;
|
int pid;
|
||||||
|
float monitorScale;
|
||||||
int lastError;
|
int lastError;
|
||||||
char errorText[256];
|
char errorText[256];
|
||||||
CounterMode mode;
|
CounterMode mode;
|
||||||
@ -75,6 +76,7 @@ deemed advisable to separate this logic into a separate module. The McStas contr
|
|||||||
time_t lastUpdate;
|
time_t lastUpdate;
|
||||||
time_t startTime;
|
time_t startTime;
|
||||||
time_t stopTime;
|
time_t stopTime;
|
||||||
|
time_t lastMonitorRead;
|
||||||
}McStasController, *pMcStasController;
|
}McStasController, *pMcStasController;
|
||||||
@}
|
@}
|
||||||
The fields are:
|
The fields are:
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
6
|
71
|
||||||
NEVER, EVER modify or delete this file
|
NEVER, EVER modify or delete this file
|
||||||
You'll risk eternal damnation and a reincarnation as a cockroach!|n
|
You'll risk eternal damnation and a reincarnation as a cockroach!|n
|
104
mcstas/dmc/MKMonitor.comp
Normal file
104
mcstas/dmc/MKMonitor.comp
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
* McStas, neutron ray-tracing package
|
||||||
|
* Copyright 1997-2002, All rights reserved
|
||||||
|
* Risoe National Laboratory, Roskilde, Denmark
|
||||||
|
* Institut Laue Langevin, Grenoble, France
|
||||||
|
*
|
||||||
|
* Component: Monitor
|
||||||
|
*
|
||||||
|
* %I
|
||||||
|
* Written by: Kim Lefmann
|
||||||
|
* Date: October 4, 1997
|
||||||
|
* Version: $Revision: 1.19 $
|
||||||
|
* Origin: Risoe
|
||||||
|
* Release: McStas 1.6
|
||||||
|
* Modified to write monitor file for SICS: Mark Koennecke, June 2005
|
||||||
|
*
|
||||||
|
* Simple single detector/monitor.
|
||||||
|
*
|
||||||
|
* %D
|
||||||
|
* Sums neutrons (0th, 1st, and 2nd moment of p) flying through
|
||||||
|
* the rectangular monitor opening. May also be used as detector.
|
||||||
|
*
|
||||||
|
* Example: Monitor(xmin=-0.1, xmax=0.1, ymin=-0.1, ymax=0.1)
|
||||||
|
*
|
||||||
|
* %P
|
||||||
|
* INPUT PARAMETERS:
|
||||||
|
*
|
||||||
|
* xmin: Lower x bound of opening [m]
|
||||||
|
* xmax: Upper x bound of opening [m]
|
||||||
|
* ymin: Lower y bound of opening [m]
|
||||||
|
* ymax: Upper y bound of opening [m]
|
||||||
|
*
|
||||||
|
* OUTPUT PARAMETERS:
|
||||||
|
*
|
||||||
|
* Nsum: Number of neutron hits
|
||||||
|
* psum: Sum of neutron weights
|
||||||
|
* p2sum: 2nd moment of neutron weights
|
||||||
|
*
|
||||||
|
* %E
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
DEFINE COMPONENT MKMonitor
|
||||||
|
DEFINITION PARAMETERS ()
|
||||||
|
SETTING PARAMETERS (xmin, xmax, ymin, ymax,char *controlfile="mon1.dat",int dumpCount=1000)
|
||||||
|
OUTPUT PARAMETERS (Nsum, psum, p2sum,currentCount)
|
||||||
|
STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,p)
|
||||||
|
SHARE
|
||||||
|
%{
|
||||||
|
void dumpTotal(char *ffilename, long totalCounts){
|
||||||
|
FILE *fd = NULL;
|
||||||
|
|
||||||
|
fd = fopen(ffilename,"w");
|
||||||
|
if(fd != NULL){
|
||||||
|
fprintf(fd,"%ld\n",totalCounts);
|
||||||
|
fclose(fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
DECLARE
|
||||||
|
%{
|
||||||
|
long currentCount;
|
||||||
|
double Nsum;
|
||||||
|
double psum, p2sum;
|
||||||
|
%}
|
||||||
|
INITIALIZE
|
||||||
|
%{
|
||||||
|
psum = 0;
|
||||||
|
p2sum = 0;
|
||||||
|
Nsum = 0;
|
||||||
|
currentCount = 0;
|
||||||
|
%}
|
||||||
|
TRACE
|
||||||
|
%{
|
||||||
|
PROP_Z0;
|
||||||
|
if (x>xmin && x<xmax && y>ymin && y<ymax)
|
||||||
|
{
|
||||||
|
Nsum++;
|
||||||
|
psum += p;
|
||||||
|
p2sum += p*p;
|
||||||
|
currentCount++;
|
||||||
|
if(dumpCount > 0 && currentCount > dumpCount){
|
||||||
|
dumpTotal(controlfile,Nsum);
|
||||||
|
currentCount = 0;
|
||||||
|
}
|
||||||
|
SCATTER;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
SAVE
|
||||||
|
%{
|
||||||
|
DETECTOR_OUT_0D("Single monitor", Nsum, psum, p2sum);
|
||||||
|
%}
|
||||||
|
|
||||||
|
MCDISPLAY
|
||||||
|
%{
|
||||||
|
magnify("xy");
|
||||||
|
multiline(5, (double)xmin, (double)ymin, 0.0,
|
||||||
|
(double)xmax, (double)ymin, 0.0,
|
||||||
|
(double)xmax, (double)ymax, 0.0,
|
||||||
|
(double)xmin, (double)ymax, 0.0,
|
||||||
|
(double)xmin, (double)ymin, 0.0);
|
||||||
|
%}
|
||||||
|
|
||||||
|
END
|
@ -10,7 +10,7 @@
|
|||||||
* %I
|
* %I
|
||||||
* Written by: Kim Lefmann
|
* Written by: Kim Lefmann
|
||||||
* Date: Feb 3, 1998
|
* Date: Feb 3, 1998
|
||||||
* Version: $Revision: 1.1 $
|
* Version: $Revision: 1.2 $
|
||||||
* Origin: Risoe
|
* Origin: Risoe
|
||||||
* Release: McStas 1.6
|
* Release: McStas 1.6
|
||||||
*
|
*
|
||||||
@ -118,24 +118,10 @@ TRACE
|
|||||||
%}
|
%}
|
||||||
SAVE
|
SAVE
|
||||||
%{
|
%{
|
||||||
DETECTOR_OUT_2D(
|
|
||||||
"PSD monitor",
|
|
||||||
"X position [cm]",
|
|
||||||
"Y position [cm]",
|
|
||||||
xmin*100.0, xmax*100.0, ymin*100.0, ymax*100.0,
|
|
||||||
nx, ny,
|
|
||||||
&PSD_N[0][0],&PSD_p[0][0],&PSD_p2[0][0],
|
|
||||||
filename);
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
MCDISPLAY
|
MCDISPLAY
|
||||||
%{
|
%{
|
||||||
magnify("xy");
|
|
||||||
multiline(5, (double)xmin, (double)ymin, 0.0,
|
|
||||||
(double)xmax, (double)ymin, 0.0,
|
|
||||||
(double)xmax, (double)ymax, 0.0,
|
|
||||||
(double)xmin, (double)ymax, 0.0,
|
|
||||||
(double)xmin, (double)ymin, 0.0);
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
END
|
END
|
||||||
|
62
mcstas/dmc/conv.tcl
Normal file
62
mcstas/dmc/conv.tcl
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/tclsh
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# script for extracting detector data with error bars from a simulation
|
||||||
|
# XML file. The output can be used for plotting with gnuplot
|
||||||
|
# The program reads from stdin and prints to stdout.
|
||||||
|
#
|
||||||
|
# Mark Koennecke, July 2005
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#------- locate detector data
|
||||||
|
while { [gets stdin line] >= 0} {
|
||||||
|
if {[string first det9.dat $line] > 0} {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#------- locate data record
|
||||||
|
while { [gets stdin line] >= 0} {
|
||||||
|
if {[string first "<data" $line] > 0} {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#------ remove XML stuff
|
||||||
|
set idx [string first > $line]
|
||||||
|
set line [string range $line [expr $idx + 1] end]
|
||||||
|
|
||||||
|
set l [split $line]
|
||||||
|
set count 0
|
||||||
|
foreach e $l {
|
||||||
|
set e [string trim $e]
|
||||||
|
if { [string length $e] > 0} {
|
||||||
|
set data($count) $e
|
||||||
|
incr count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set maxCount $count
|
||||||
|
|
||||||
|
#---- find errors line
|
||||||
|
while { [gets stdin line] >= 0} {
|
||||||
|
if {[string first "<errors" $line] > 0} {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#------ remove XML stuff
|
||||||
|
set idx [string first > $line]
|
||||||
|
set line [string range $line [expr $idx + 1] end]
|
||||||
|
|
||||||
|
set l [split $line]
|
||||||
|
set count 0
|
||||||
|
foreach e $l {
|
||||||
|
set e [string trim $e]
|
||||||
|
if { [string length $e] > 0} {
|
||||||
|
set err($count) $e
|
||||||
|
incr count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for {set i 0} {$i < $maxCount} {incr i} {
|
||||||
|
puts stdout "$i $data($i) $err($i)"
|
||||||
|
}
|
@ -101,7 +101,7 @@ COMPONENT out2_slit = Slit(
|
|||||||
AT (0,0,0.65) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
AT (0,0,0.65) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
COMPONENT PSD_sample = PSD_monitor(
|
COMPONENT PSD_sample = PSD_monitor(
|
||||||
xmin=-0.05, xmax=0.05, ymin=-0.07, ymax=0.07,
|
xmin=-0.02, xmax=0.02, ymin=-0.065, ymax=0.065,
|
||||||
nx=80, ny=80, filename="PSD_sample.dat",controlfile=monfile, dumpCount=500)
|
nx=80, ny=80, filename="PSD_sample.dat",controlfile=monfile, dumpCount=500)
|
||||||
AT ( 0, 0, 1.5) RELATIVE msa
|
AT ( 0, 0, 1.5) RELATIVE msa
|
||||||
|
|
||||||
@ -125,60 +125,3 @@ AT (0,0,0) RELATIVE sa_arm
|
|||||||
ROTATED (0, 0, 180) RELATIVE sa_arm
|
ROTATED (0, 0, 180) RELATIVE sa_arm
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
145
mcstas/dmc/dmc_sics05.instr
Normal file
145
mcstas/dmc/dmc_sics05.instr
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
DEFINE INSTRUMENT DMC_diff(lambda,Det_start, char *samplefile, char *monfile)
|
||||||
|
DECLARE
|
||||||
|
%{
|
||||||
|
double mono_q;
|
||||||
|
double dm;
|
||||||
|
double OMA;
|
||||||
|
double RV;
|
||||||
|
double NV = 5;
|
||||||
|
double TKOFF;
|
||||||
|
double sample_radius = 0.005;
|
||||||
|
double sample_height = 0.03;
|
||||||
|
double lambda;
|
||||||
|
double ldiff=0.5;
|
||||||
|
double Det_start;
|
||||||
|
double Det_end;
|
||||||
|
char option_list[150];
|
||||||
|
%}
|
||||||
|
|
||||||
|
INITIALIZE
|
||||||
|
%{
|
||||||
|
dm = 3.3537;
|
||||||
|
TKOFF = lambda/(2.*dm);
|
||||||
|
TKOFF = 2.*asin(TKOFF)*57.29577951308232087679815481410517;
|
||||||
|
printf("TKOFF = %f\n", TKOFF);
|
||||||
|
OMA = TKOFF/2;
|
||||||
|
RV = fabs(2*2.82*sin(DEG2RAD*OMA));
|
||||||
|
Det_end= Det_start + 80;
|
||||||
|
sprintf(option_list,"banana theta limits [%f %f] bins=400, file=det9.dat",Det_start,Det_end);
|
||||||
|
printf("%s \n",option_list);
|
||||||
|
%}
|
||||||
|
|
||||||
|
TRACE
|
||||||
|
|
||||||
|
COMPONENT source_arm = Arm()
|
||||||
|
AT (0, 0, 0) ABSOLUTE
|
||||||
|
|
||||||
|
COMPONENT progress = Progress_bar(percent=5,flag_save=1)
|
||||||
|
AT (0,0,0) ABSOLUTE
|
||||||
|
|
||||||
|
/* values for guide side window RNR12 */
|
||||||
|
COMPONENT csource = Source_gen(
|
||||||
|
radius = 0.08,xw = 0.02, yh = 0.12, dist = 1.5,
|
||||||
|
Lambda0 = lambda, dLambda = ldiff,
|
||||||
|
T1=150.42,I1=5.98e11,
|
||||||
|
T2=37.23,I2=5.637e11,T3=14.9,I3=0.962e11)
|
||||||
|
AT (0,0,0) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide segment 1, m=2, 4.66 m */
|
||||||
|
COMPONENT guide1 = Guide(w1=0.02, h1=0.12, w2=0.02, h2=0.12,
|
||||||
|
l=4.66, R0=0.995, Qc=0.0217, alpha = 5.76,
|
||||||
|
m = 2.0, W = 0.0033)
|
||||||
|
AT (0,0,1.5) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide segment 2, curved, m=2, 24.5 m */
|
||||||
|
COMPONENT guide2 = Bender(
|
||||||
|
w = 0.02, h = 0.12, r = 3612, R0a = 0.995, Qca = 0.0217,
|
||||||
|
alphaa = 5.76, ma = 2, Wa = 0.0033, R0i = 0.995, Qci = 0.0217,
|
||||||
|
alphai = 5.76, mi = 2, Wi = 0.0033, R0s = 0.995, Qcs = 0.0217,
|
||||||
|
alphas = 5.76, ms = 2, Ws = 0.0033, l = 24.5)
|
||||||
|
AT (0,0,6.16) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* bunker wall, m=2, 3.0 m */
|
||||||
|
COMPONENT bunker = Guide(
|
||||||
|
w1=0.02, h1=.12, w2=0.02, h2=.12,
|
||||||
|
l=3.0, R0=0.995, Qc=0.0217, alpha = 5.76,
|
||||||
|
m = 2.0, W = 0.0033)
|
||||||
|
AT (0,0,30.66) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide segment 3, m=2, 8.84 m */
|
||||||
|
|
||||||
|
COMPONENT guide3 = Guide(
|
||||||
|
w1=0.02, h1=.12, w2=0.02, h2=.12,
|
||||||
|
l=8.84, R0=0.995,Qc=0.0217, alpha = 5.76,
|
||||||
|
m = 2.0, W = 0.0033)
|
||||||
|
AT (0,0,33.66) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide exit at 42.5 m - measured flux 2.46 10e8 cm-2 s-1 mA-1 */
|
||||||
|
|
||||||
|
COMPONENT in_slit = Slit(
|
||||||
|
xmin = -0.01, xmax=0.01 , ymin = -0.06, ymax = 0.06)
|
||||||
|
AT (0,0,42.5) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* Monochromator description */
|
||||||
|
|
||||||
|
COMPONENT sma = Arm() /* source - monochromator arm */
|
||||||
|
AT (0, 0, 43.15) RELATIVE source_arm ROTATED (0,OMA,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
|
||||||
|
COMPONENT foc_mono = Monochromator_curved(
|
||||||
|
zwidth = 0.05, yheight = 0.025, gap = 0.0005, NH = 1, NV = 5,
|
||||||
|
mosaich = 38, mosaicv = 38, r0 = 0.7, DM=dm, RV = RV,
|
||||||
|
RH = 0)
|
||||||
|
AT (0, 0, 0) RELATIVE sma
|
||||||
|
|
||||||
|
COMPONENT msa = Arm() /* monochromator - sample arm */
|
||||||
|
AT (0, 0, 0) RELATIVE sma ROTATED (0, TKOFF, 0) RELATIVE source_arm
|
||||||
|
|
||||||
|
COMPONENT out1_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.2) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT Amoin_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.325) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT Bmoin_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.525) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
|
||||||
|
COMPONENT out2_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.65) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT PSD_sample = MKMonitor(
|
||||||
|
xmin=-0.05, xmax=0.05, ymin=-0.07, ymax=0.07,controlfile=monfile)
|
||||||
|
AT ( 0, 0, 1.5) RELATIVE msa
|
||||||
|
|
||||||
|
/*
|
||||||
|
COMPONENT PSD_sample = PSD_monitor(
|
||||||
|
xmin=-0.05, xmax=0.05, ymin=-0.07, ymax=0.07,
|
||||||
|
nx=80, ny=80, filename="PSD_sample.dat",controlfile=monfile,dumpCount=1000)
|
||||||
|
AT ( 0, 0, 1.5) RELATIVE msa
|
||||||
|
COMPONENT PSD_sample = PSD_monitor(
|
||||||
|
xmin=-0.05, xmax=0.05, ymin=-0.07, ymax=0.07,
|
||||||
|
nx=80, ny=80, filename="PSD_sample.dat")
|
||||||
|
AT ( 0, 0, 1.5) RELATIVE msa
|
||||||
|
*/
|
||||||
|
COMPONENT sa_arm = Arm()
|
||||||
|
AT (0, 0, 2.82) RELATIVE msa
|
||||||
|
ROTATED (0, 0, 0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT sample = PowderN (
|
||||||
|
d_phi0=0, radius=sample_radius, h=sample_height,
|
||||||
|
pack=1, Vc=1076.98, reflections = samplefile,
|
||||||
|
sigma_a=0.2, focus_aw=80, focus_ah=3.5, target_index=+1)
|
||||||
|
AT ( 0, 0, 0) RELATIVE sa_arm
|
||||||
|
|
||||||
|
COMPONENT Det9 = Monitor_nD(
|
||||||
|
xwidth=3.0,yheight=0.09,
|
||||||
|
options=option_list)
|
||||||
|
AT (0,0,0.000001) RELATIVE sa_arm
|
||||||
|
ROTATED (0, 0, 180) RELATIVE sa_arm
|
||||||
|
|
||||||
|
END
|
68
mcstas/dmc/dmcafter.instr
Normal file
68
mcstas/dmc/dmcafter.instr
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
DEFINE INSTRUMENT DMC_diff(Det_start, char *samplefile, char *monfile,
|
||||||
|
char *lambdafile,int repeat)
|
||||||
|
DECLARE
|
||||||
|
%{
|
||||||
|
double sample_radius = 0.005;
|
||||||
|
double sample_height = 0.03;
|
||||||
|
double Det_start;
|
||||||
|
double Det_end;
|
||||||
|
char option_list[150];
|
||||||
|
%}
|
||||||
|
|
||||||
|
INITIALIZE
|
||||||
|
%{
|
||||||
|
Det_end= Det_start + 80;
|
||||||
|
sprintf(option_list,"banana theta limits [%f %f] bins=400, file=det9.dat",Det_start,Det_end);
|
||||||
|
printf("%s \n",option_list);
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
TRACE
|
||||||
|
|
||||||
|
COMPONENT msa = Arm() /* monochromator - sample arm */
|
||||||
|
AT (0, 0, 0) ABSOLUTE
|
||||||
|
|
||||||
|
/*
|
||||||
|
COMPONENT progress = Progress_bar(percent=5,flag_save=1)
|
||||||
|
AT (0,0,.1) ABSOLUTE
|
||||||
|
*/
|
||||||
|
|
||||||
|
COMPONENT in = Virtual_input(file=lambdafile,repeat_count=repeat)
|
||||||
|
AT (0,0,0.64) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT out2_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.65) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT PSD_sample = MKMonitor(
|
||||||
|
xmin=-0.05, xmax=0.05, ymin=-0.07, ymax=0.07,controlfile=monfile)
|
||||||
|
AT ( 0, 0, 1.5) RELATIVE msa
|
||||||
|
|
||||||
|
/*
|
||||||
|
COMPONENT PSD_sample = PSD_monitor(
|
||||||
|
xmin=-0.05, xmax=0.05, ymin=-0.07, ymax=0.07,
|
||||||
|
nx=80, ny=80, filename="PSD_sample.dat",controlfile=monfile,dumpCount=1000)
|
||||||
|
AT ( 0, 0, 1.5) RELATIVE msa
|
||||||
|
COMPONENT PSD_sample = PSD_monitor(
|
||||||
|
xmin=-0.05, xmax=0.05, ymin=-0.07, ymax=0.07,
|
||||||
|
nx=80, ny=80, filename="PSD_sample.dat")
|
||||||
|
AT ( 0, 0, 1.5) RELATIVE msa
|
||||||
|
*/
|
||||||
|
COMPONENT sa_arm = Arm()
|
||||||
|
AT (0, 0, 2.82) RELATIVE msa
|
||||||
|
ROTATED (0, 0, 0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT sample = PowderN (
|
||||||
|
d_phi0=0, radius=sample_radius, h=sample_height,
|
||||||
|
pack=1, Vc=1076.98, reflections = samplefile,
|
||||||
|
sigma_a=0.2, focus_aw=80, focus_ah=3.5, target_index=+1)
|
||||||
|
AT ( 0, 0, 0) RELATIVE sa_arm
|
||||||
|
|
||||||
|
COMPONENT Det9 = Monitor_nD(
|
||||||
|
xwidth=3.0,yheight=0.09,
|
||||||
|
options=option_list)
|
||||||
|
AT (0,0,0.000001) RELATIVE sa_arm
|
||||||
|
ROTATED (0, 0, 180) RELATIVE sa_arm
|
||||||
|
|
||||||
|
|
||||||
|
END
|
113
mcstas/dmc/dmcprecalc.instr
Normal file
113
mcstas/dmc/dmcprecalc.instr
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
DEFINE INSTRUMENT DMC_diff(lambda,Det_start, char *samplefile, char *monfile,
|
||||||
|
char *lambdafile)
|
||||||
|
DECLARE
|
||||||
|
%{
|
||||||
|
double mono_q;
|
||||||
|
double dm;
|
||||||
|
double OMA;
|
||||||
|
double RV;
|
||||||
|
double NV = 5;
|
||||||
|
double TKOFF;
|
||||||
|
double sample_radius = 0.005;
|
||||||
|
double sample_height = 0.03;
|
||||||
|
double lambda;
|
||||||
|
double ldiff=0.5;
|
||||||
|
double Det_start;
|
||||||
|
double Det_end;
|
||||||
|
char option_list[150];
|
||||||
|
%}
|
||||||
|
|
||||||
|
INITIALIZE
|
||||||
|
%{
|
||||||
|
dm = 3.3537;
|
||||||
|
TKOFF = lambda/(2.*dm);
|
||||||
|
TKOFF = 2.*asin(TKOFF)*57.29577951308232087679815481410517;
|
||||||
|
printf("TKOFF = %f\n", TKOFF);
|
||||||
|
OMA = TKOFF/2;
|
||||||
|
RV = fabs(2*2.82*sin(DEG2RAD*OMA));
|
||||||
|
Det_end= Det_start + 80;
|
||||||
|
sprintf(option_list,"banana theta limits [%f %f] bins=400, file=det9.dat",Det_start,Det_end);
|
||||||
|
printf("%s \n",option_list);
|
||||||
|
%}
|
||||||
|
|
||||||
|
TRACE
|
||||||
|
|
||||||
|
COMPONENT source_arm = Arm()
|
||||||
|
AT (0, 0, 0) ABSOLUTE
|
||||||
|
|
||||||
|
|
||||||
|
/* values for guide side window RNR12 */
|
||||||
|
COMPONENT csource = Source_gen(
|
||||||
|
radius = 0.08,xw = 0.02, yh = 0.12, dist = 1.5,
|
||||||
|
Lambda0 = lambda, dLambda = ldiff,
|
||||||
|
T1=150.42,I1=5.98e11,
|
||||||
|
T2=37.23,I2=5.637e11,T3=14.9,I3=0.962e11)
|
||||||
|
AT (0,0,0) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide segment 1, m=2, 4.66 m */
|
||||||
|
COMPONENT guide1 = Guide(w1=0.02, h1=0.12, w2=0.02, h2=0.12,
|
||||||
|
l=4.66, R0=0.995, Qc=0.0217, alpha = 5.76,
|
||||||
|
m = 2.0, W = 0.0033)
|
||||||
|
AT (0,0,1.5) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide segment 2, curved, m=2, 24.5 m */
|
||||||
|
COMPONENT guide2 = Bender(
|
||||||
|
w = 0.02, h = 0.12, r = 3612, R0a = 0.995, Qca = 0.0217,
|
||||||
|
alphaa = 5.76, ma = 2, Wa = 0.0033, R0i = 0.995, Qci = 0.0217,
|
||||||
|
alphai = 5.76, mi = 2, Wi = 0.0033, R0s = 0.995, Qcs = 0.0217,
|
||||||
|
alphas = 5.76, ms = 2, Ws = 0.0033, l = 24.5)
|
||||||
|
AT (0,0,6.16) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* bunker wall, m=2, 3.0 m */
|
||||||
|
COMPONENT bunker = Guide(
|
||||||
|
w1=0.02, h1=.12, w2=0.02, h2=.12,
|
||||||
|
l=3.0, R0=0.995, Qc=0.0217, alpha = 5.76,
|
||||||
|
m = 2.0, W = 0.0033)
|
||||||
|
AT (0,0,30.66) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide segment 3, m=2, 8.84 m */
|
||||||
|
|
||||||
|
COMPONENT guide3 = Guide(
|
||||||
|
w1=0.02, h1=.12, w2=0.02, h2=.12,
|
||||||
|
l=8.84, R0=0.995,Qc=0.0217, alpha = 5.76,
|
||||||
|
m = 2.0, W = 0.0033)
|
||||||
|
AT (0,0,33.66) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* guide exit at 42.5 m - measured flux 2.46 10e8 cm-2 s-1 mA-1 */
|
||||||
|
|
||||||
|
COMPONENT in_slit = Slit(
|
||||||
|
xmin = -0.01, xmax=0.01 , ymin = -0.06, ymax = 0.06)
|
||||||
|
AT (0,0,42.5) RELATIVE source_arm ROTATED (0,0,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
/* Monochromator description */
|
||||||
|
|
||||||
|
COMPONENT sma = Arm() /* source - monochromator arm */
|
||||||
|
AT (0, 0, 43.15) RELATIVE source_arm ROTATED (0,OMA,0) RELATIVE source_arm
|
||||||
|
|
||||||
|
|
||||||
|
COMPONENT foc_mono = Monochromator_curved(
|
||||||
|
zwidth = 0.05, yheight = 0.025, gap = 0.0005, NH = 1, NV = 5,
|
||||||
|
mosaich = 38, mosaicv = 38, r0 = 0.7, DM=dm, RV = RV,
|
||||||
|
RH = 0)
|
||||||
|
AT (0, 0, 0) RELATIVE sma
|
||||||
|
|
||||||
|
COMPONENT msa = Arm() /* monochromator - sample arm */
|
||||||
|
AT (0, 0, 0) RELATIVE sma ROTATED (0, TKOFF, 0) RELATIVE source_arm
|
||||||
|
|
||||||
|
COMPONENT out1_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.2) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT Amoin_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.325) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
COMPONENT Bmoin_slit = Slit(
|
||||||
|
xmin=-0.01, xmax=0.01, ymin=-0.06, ymax=0.06)
|
||||||
|
AT (0,0,0.525) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
|
||||||
|
COMPONENT out = Virtual_output(file=lambdafile)
|
||||||
|
AT(0,0,0.64) RELATIVE msa ROTATED (0,0,0) RELATIVE msa
|
||||||
|
|
||||||
|
END
|
4
mcstas/dmc/makelambda.sh
Normal file
4
mcstas/dmc/makelambda.sh
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
dmcprecalc -n 1e9 lambda=2.56 Det_start=19. monfile=monfile samplefile=na2ca3al2f14.q lambdafile="dmc256.dat"
|
||||||
|
dmcprecalc -n 1e9 lambda=4.2 Det_start=19. monfile=monfile samplefile=na2ca3al2f14.q lambdafile="dmc420.dat"
|
||||||
|
dmcprecalc -n 1e9 lambda=2.45 Det_start=19. monfile=monfile samplefile=na2ca3al2f14.q lambdafile="dmc245.dat"
|
||||||
|
dmcprecalc -n 1e9 lambda=3.8 Det_start=19. monfile=monfile samplefile=na2ca3al2f14.q lambdafile="dmc380.dat"
|
@ -34,23 +34,59 @@ set mcwaittime 7
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
proc mcstasdump {pid} {
|
proc mcstasdump {pid} {
|
||||||
global mcwaittime
|
global mcwaittime
|
||||||
|
if { $pid <= 0} {
|
||||||
|
error "Trying to dump invalid PID: $pid"
|
||||||
|
}
|
||||||
|
clientput "Dumping ..."
|
||||||
catch {eval exec /usr/bin/kill -USR2 $pid}
|
catch {eval exec /usr/bin/kill -USR2 $pid}
|
||||||
wait $mcwaittime
|
wait $mcwaittime
|
||||||
}
|
}
|
||||||
#-----------------------------------------------------------------------
|
#-----------------------------------------------------------------------
|
||||||
|
# mcstasisrunning has to open a pipe to ps and to read the results of
|
||||||
|
# the ps command. This is because a terminated McStas simulation turns
|
||||||
|
# into a Zombie process which finishes never. This can only be cured
|
||||||
|
# by checking for this in the STAT field of ps's output. According to
|
||||||
|
# the Unix FAQ this is the best solution......
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
proc readPID {pid} {
|
||||||
|
set f [ open "| /bin/ps -up $pid" r]
|
||||||
|
set pstxt [read $f]
|
||||||
|
close $f
|
||||||
|
return $pstxt
|
||||||
|
}
|
||||||
|
#----------------------------------------------------------------------
|
||||||
proc mcstasisrunning {pid} {
|
proc mcstasisrunning {pid} {
|
||||||
set ret [catch {eval exec /bin/ps --pid $pid} msg]
|
global runningCount runningLast
|
||||||
if {$ret == 0} {
|
|
||||||
return 1
|
if { $pid <= 0} {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
set pstxt " "
|
||||||
|
set ret [catch {set pstxt [readPID $pid]} msg]
|
||||||
|
set pslist [split $pstxt "\n"]
|
||||||
|
if { [llength $pslist] < 2} {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
set header [lindex $pslist 0]
|
||||||
|
set idx [string first STAT $header]
|
||||||
|
set stat [string trim [string range [lindex $pslist 1] $idx [expr $idx + 4]]]
|
||||||
|
if { [string first Z $stat] >= 0 || [string first T $stat] >= 0} {
|
||||||
|
mccontrol finish
|
||||||
|
return 0
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#-----------------------------------------------------------------------
|
#-----------------------------------------------------------------------
|
||||||
proc mcstaskill {pid} {
|
proc mcstaskill {pid} {
|
||||||
global mcwaittime
|
global mcwaittime
|
||||||
|
if { $pid <= 0} {
|
||||||
|
error "Trying to kill invalid PID $pid"
|
||||||
|
}
|
||||||
|
clientput "Killing $pid"
|
||||||
catch {eval exec /usr/bin/kill -TERM $pid}
|
catch {eval exec /usr/bin/kill -TERM $pid}
|
||||||
wait $mcwaittime
|
# catch {mccontrol finish}
|
||||||
|
wait 10
|
||||||
}
|
}
|
||||||
#-----------------------------------------------------------------------
|
#-----------------------------------------------------------------------
|
||||||
proc mcinstall {} {
|
proc mcinstall {} {
|
||||||
|
@ -10,8 +10,8 @@ set home $env(HOME)/src/workspace/sics/mcstas/dmc
|
|||||||
|
|
||||||
#--------------------------------- first all the server options are set
|
#--------------------------------- first all the server options are set
|
||||||
#ServerOption RedirectFile $home/stdcdmc
|
#ServerOption RedirectFile $home/stdcdmc
|
||||||
ServerOption ReadTimeOut 0
|
ServerOption ReadTimeOut 1
|
||||||
ServerOption AcceptTimeOut 0
|
ServerOption AcceptTimeOut 1
|
||||||
ServerOption ReadUserPasswdTimeout 500000
|
ServerOption ReadUserPasswdTimeout 500000
|
||||||
ServerOption LogFileBaseName "$home/vdmclog"
|
ServerOption LogFileBaseName "$home/vdmclog"
|
||||||
ServerOption LogFileDir $home/
|
ServerOption LogFileDir $home/
|
||||||
@ -57,7 +57,8 @@ MakeWaveLength lambda Mono
|
|||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
MakeMcStasReader
|
MakeMcStasReader
|
||||||
MakeMcStasController
|
MakeMcStasController
|
||||||
allowexec $home/dmc_sics01
|
allowexec $home/dmcafter
|
||||||
|
allowexec $home/dmc_sics05
|
||||||
|
|
||||||
ClientPut "Installing counter"
|
ClientPut "Installing counter"
|
||||||
MakeCounter counter mcstas
|
MakeCounter counter mcstas
|
||||||
@ -107,8 +108,8 @@ Instrument lock
|
|||||||
VarMake Title Text User
|
VarMake Title Text User
|
||||||
VarMake User Text User
|
VarMake User Text User
|
||||||
VarMake Collimation Text User
|
VarMake Collimation Text User
|
||||||
VarMake Sample Text User
|
VarMake SampleIntern Text User
|
||||||
Sample Kellerit
|
SampleIntern Kellerit
|
||||||
VarMake comment1 Text User
|
VarMake comment1 Text User
|
||||||
VarMake comment2 Text User
|
VarMake comment2 Text User
|
||||||
VarMake comment3 Text User
|
VarMake comment3 Text User
|
||||||
|
@ -13,6 +13,7 @@ if { [info exists vdmcinit] == 0 } {
|
|||||||
Publish storedmcdata User
|
Publish storedmcdata User
|
||||||
Publish rundmcsim User
|
Publish rundmcsim User
|
||||||
Publish copydmcdata User
|
Publish copydmcdata User
|
||||||
|
Publish sample User
|
||||||
mcinstall
|
mcinstall
|
||||||
}
|
}
|
||||||
source $home/log.tcl
|
source $home/log.tcl
|
||||||
@ -23,19 +24,85 @@ proc SplitReply { text } {
|
|||||||
set l [split $text =]
|
set l [split $text =]
|
||||||
return [lindex $l 1]
|
return [lindex $l 1]
|
||||||
}
|
}
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
# load a lazy pulverix file
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
proc washlazy {name} {
|
||||||
|
global home
|
||||||
|
set newNam [file rootname [file tail $name]]
|
||||||
|
set in [open $name r]
|
||||||
|
set out [open $home/$newNam.q w]
|
||||||
|
#------- proceed to first header line
|
||||||
|
while { [gets $in line] >= 0} {
|
||||||
|
if { [string first "H K L THETA 2THETA D VALUE" $line] > 0} {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#------- process data lines
|
||||||
|
puts $out "// mult Q(hkl) F2 DW w"
|
||||||
|
while { [gets $in line] >= 0} {
|
||||||
|
set num [scan $line "%d %d %d %f %f %f %f %f %d %d %d %f %f %f %f %f %d"\
|
||||||
|
h k l th th2 d di sin h2 k2 l2 I F A B ang mul]
|
||||||
|
if { $num == 17} {
|
||||||
|
set q [expr (2.*3.14159265358979323846)/$d]
|
||||||
|
set f2 [expr $F * $F]
|
||||||
|
puts $out [format "%d %f %f 1 0" $mul $q $f2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close $in
|
||||||
|
close $out
|
||||||
|
}
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
# script for setting the sample. We only allow samples for which
|
||||||
|
# there is a corresponing q data file
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
proc sample args {
|
||||||
|
global home
|
||||||
|
if { [llength $args] < 1} {
|
||||||
|
set sa [SplitReply [sampleintern]]
|
||||||
|
return "sample = $sa"
|
||||||
|
}
|
||||||
|
set txt [lindex $args 0]
|
||||||
|
#-------- list
|
||||||
|
if { [string compare $txt list] == 0} {
|
||||||
|
set l [glob $home/*.q]
|
||||||
|
foreach f $l {
|
||||||
|
append out [file rootname [file tail $f]] "\n"
|
||||||
|
}
|
||||||
|
return $out
|
||||||
|
}
|
||||||
|
#--------- load
|
||||||
|
if { [string compare $txt load] == 0} {
|
||||||
|
if { [llength $args] < 2} {
|
||||||
|
error "Need path to lazy pulverix output file to load"
|
||||||
|
}
|
||||||
|
set nam [lindex $args 1]
|
||||||
|
washlazy $nam
|
||||||
|
set nam2 [file rootname [file tail $nam]]
|
||||||
|
eval sampleintern $nam2
|
||||||
|
return OK
|
||||||
|
}
|
||||||
|
if { ![file exists $home/$txt.q] } {
|
||||||
|
error "No Q data for sample $txt"
|
||||||
|
} else {
|
||||||
|
eval sampleintern $txt
|
||||||
|
return OK
|
||||||
|
}
|
||||||
|
}
|
||||||
#-----------------------------------------------------------------------
|
#-----------------------------------------------------------------------
|
||||||
# Scripts required for controlling McStas simulations
|
# Scripts required for controlling McStas simulations
|
||||||
#-----------------------------------------------------------------------
|
#-----------------------------------------------------------------------
|
||||||
proc rundmcsim {mode preset} {
|
proc rundmcsim {mode preset} {
|
||||||
global home
|
global home
|
||||||
append command $home/dmc_sics01 " -f $home/dmc.xml --format=\"XML\""
|
append command $home/dmc_sics05 " -f $home/dmc.xml --format=\"XML\""
|
||||||
append command " -n 9e15 "
|
append command " -n 1e10 "
|
||||||
append command " lambda=[string trim [SplitReply [lambda]]]"
|
append command " lambda=[string trim [SplitReply [lambda]]]"
|
||||||
append command " TKOFF=[string trim [SplitReply [TwoThetaM]]]"
|
append command " Det_start=[string trim [SplitReply [TwoThetaD]]]"
|
||||||
append command " samplefile=$home/[string trim [SplitReply [sample]]].q"
|
append command " samplefile=$home/[string trim [SplitReply [sampleintern]]].q"
|
||||||
append command " monfile=$home/monfile "
|
append command " monfile=$home/monfile "
|
||||||
append command " >& $home/dmc.log &"
|
append command " >& $home/dmc.log &"
|
||||||
clientput "Starting McStas.. "
|
clientput "Starting McStas.. "
|
||||||
|
# clientput $command
|
||||||
set ret [catch {eval exec $command} msg]
|
set ret [catch {eval exec $command} msg]
|
||||||
if {$ret != 0} {
|
if {$ret != 0} {
|
||||||
error $msg
|
error $msg
|
||||||
@ -44,23 +111,85 @@ proc rundmcsim {mode preset} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
|
# Run the DMC simulation in an optimized mode with neutrons
|
||||||
|
# precalculated for various wave length until the sample slit
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
set dmcdata(2.56) dmc256.dat
|
||||||
|
set dmcdata(4.2) dmc420.dat
|
||||||
|
set dmcdata(2.45) dmc245.dat
|
||||||
|
set dmcdata(3.8) dmc380.dat
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
proc rundmcoptsim {mode preset } {
|
||||||
|
global home dmcdata
|
||||||
|
#--------- locate closest precalculated neutron data file
|
||||||
|
set lambda [SplitReply [lambda]]
|
||||||
|
set myLambda $lambda
|
||||||
|
set wv [array names dmcdata]
|
||||||
|
set diff 999999.99
|
||||||
|
set lambdafile $dmcdata(2.56)
|
||||||
|
foreach w $wv {
|
||||||
|
set tmp [expr abs($w - $lambda)]
|
||||||
|
if { $tmp < $diff} {
|
||||||
|
set diff $tmp
|
||||||
|
set lambdafile $dmcdata($w)
|
||||||
|
set myLambda $w
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#-------- build McStas command line
|
||||||
|
append command $home/dmcafter " -f $home/dmc.xml --format=\"XML\""
|
||||||
|
append command " -n 1e10 "
|
||||||
|
append command " lambdafile=$home/$lambdafile"
|
||||||
|
append command " Det_start=[string trim [SplitReply [TwoThetaD]]]"
|
||||||
|
append command " samplefile=$home/[string trim [SplitReply [sampleintern]]].q"
|
||||||
|
append command " monfile=$home/monfile "
|
||||||
|
append command " repeat=1000000000 "
|
||||||
|
append command " >& $home/dmc.log &"
|
||||||
|
#--------- start McStas
|
||||||
|
clientput "Starting McStas.. "
|
||||||
|
clientput "Coercing $lambda to precalculated $myLambda"
|
||||||
|
# clientput $command
|
||||||
|
set ret [catch {eval exec $command} msg]
|
||||||
|
if {$ret != 0} {
|
||||||
|
error "ERROR: $msg"
|
||||||
|
} else {
|
||||||
|
return $msg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#------------------------------------------------------------------------
|
||||||
proc copydmcdata { } {
|
proc copydmcdata { } {
|
||||||
global home
|
global home
|
||||||
set mcversion "McStas 1.8 - Mar. 05, 2004"
|
set mcversion "McStas 1.8 - Mar. 05, 2004"
|
||||||
washsimfile $home/dmc.xml
|
washsimfile $home/dmc.xml
|
||||||
mcreader open $home/dmc.xml
|
mcreader open $home/dmc.xml
|
||||||
mcreader insertmon \
|
mcreader insertmon \
|
||||||
"/$mcversion/DMC_diff/dmc.xml/PSD_sample/PSD_sample.dat/values" \
|
"/$mcversion/DMC_diff/dmc.xml/PSD_sample/values" \
|
||||||
counter 1
|
counter 1 [expr 1./10000]
|
||||||
|
mcreader insertmon \
|
||||||
|
"/$mcversion/DMC_diff/dmc.xml/Det9/det9.dat/values" \
|
||||||
|
counter 5
|
||||||
|
set hmScale [SplitReply [counter getmonitor 5]]
|
||||||
|
if { $hmScale <= 0} {
|
||||||
|
set hmScale 1e9
|
||||||
|
} else {
|
||||||
|
set hmScale [expr $hmScale * 1e9]
|
||||||
|
}
|
||||||
|
clientput "HM scale = $hmScale"
|
||||||
mcreader inserthm \
|
mcreader inserthm \
|
||||||
"/$mcversion/DMC_diff/dmc.xml/Det9/det9.dat/data" banana
|
"/$mcversion/DMC_diff/dmc.xml/Det9/det9.dat/data" banana $hmScale
|
||||||
mcreader close
|
mcreader close
|
||||||
}
|
}
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
proc dmcdump {pid} {
|
||||||
|
#--do nothing: progress is doing it for us
|
||||||
|
}
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
mccontrol configure mcstart rundmcsim
|
#mccontrol configure mcstart rundmcsim
|
||||||
|
mccontrol configure mcstart rundmcoptsim
|
||||||
mccontrol configure mccopydata copydmcdata
|
mccontrol configure mccopydata copydmcdata
|
||||||
mccontrol configure update 60
|
mccontrol configure update 60
|
||||||
mccontrol configure mcmonfile $home/monfile
|
mccontrol configure mcmonfile $home/monfile
|
||||||
|
mccontrol configure monitorscale [expr 1. /10000]
|
||||||
|
mccontrol configure mcdump mcstasdump
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# A count command for VDMC
|
# A count command for VDMC
|
||||||
# All arguments are optional. The current values will be used if not
|
# All arguments are optional. The current values will be used if not
|
||||||
|
@ -14,7 +14,7 @@ sicsdatapostfix .hdf
|
|||||||
sicsdatapostfix setAccess 0
|
sicsdatapostfix setAccess 0
|
||||||
sicsdataprefix powder
|
sicsdataprefix powder
|
||||||
sicsdataprefix setAccess 0
|
sicsdataprefix setAccess 0
|
||||||
starttime 2005-06-21 14:21:44
|
starttime 2005-07-01 16:19:39
|
||||||
starttime setAccess 2
|
starttime setAccess 2
|
||||||
comment3 UNKNOWN
|
comment3 UNKNOWN
|
||||||
comment3 setAccess 2
|
comment3 setAccess 2
|
||||||
@ -22,8 +22,8 @@ comment2 UNKNOWN
|
|||||||
comment2 setAccess 2
|
comment2 setAccess 2
|
||||||
comment1 UNKNOWN
|
comment1 UNKNOWN
|
||||||
comment1 setAccess 2
|
comment1 setAccess 2
|
||||||
sample na2ca3al2f14
|
sampleintern na2ca3al2f14
|
||||||
sample setAccess 2
|
sampleintern setAccess 2
|
||||||
collimation UNKNOWN
|
collimation UNKNOWN
|
||||||
collimation setAccess 2
|
collimation setAccess 2
|
||||||
user UNKNOWN
|
user UNKNOWN
|
||||||
@ -120,11 +120,11 @@ a1 InterruptMode 0.000000
|
|||||||
a1 precision 0.010000
|
a1 precision 0.010000
|
||||||
a1 AccessCode 2.000000
|
a1 AccessCode 2.000000
|
||||||
a1 movecount 10.000000
|
a1 movecount 10.000000
|
||||||
banana CountMode timer
|
banana CountMode monitor
|
||||||
banana preset 180.000000
|
banana preset 5.000000
|
||||||
# Counter counter
|
# Counter counter
|
||||||
counter SetPreset 180.000000
|
counter SetPreset 5000.000000
|
||||||
counter SetMode Timer
|
counter SetMode Monitor
|
||||||
# Motor twothetad
|
# Motor twothetad
|
||||||
twothetad sign 1.000000
|
twothetad sign 1.000000
|
||||||
twothetad SoftZero 0.000000
|
twothetad SoftZero 0.000000
|
||||||
|
@ -116,12 +116,9 @@ static int McHMGetData(pHistDriver self, SConnection *pCon){
|
|||||||
static int McHMGetHistogram(pHistDriver self, SConnection *pCon,
|
static int McHMGetHistogram(pHistDriver self, SConnection *pCon,
|
||||||
int bank, int start, int end, HistInt *pData){
|
int bank, int start, int end, HistInt *pData){
|
||||||
/*
|
/*
|
||||||
* normally this would update HM data from the actual histogram mmeory.
|
* make sure data gets transferred
|
||||||
* With the McStas simulation, the updated values for the hiistogram
|
|
||||||
* mmeory data are pushed through SetHistogram. Thus this routine has
|
|
||||||
* to do nothing.
|
|
||||||
*/
|
*/
|
||||||
return 1;
|
return McHMGetData(self,pCon);
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int McHMSetHistogram(pHistDriver self, SConnection *pCon,
|
static int McHMSetHistogram(pHistDriver self, SConnection *pCon,
|
||||||
|
Reference in New Issue
Block a user