26#define VISUAL_CPLUSPLUS
40#define HFNOV(A1,A2) CCALLSFSUB2(HFNOV,hfnov,INT,FLOATV,A1,A2)
44#define HMERGE(A1,A2,A3) CCALLSFSUB3(HMERGE,hmerge,INT,STRINGV,STRING,A1,A2,A3)
58#include <TApplication.h>
67#include <TServerSocket.h>
69#include <TObjString.h>
83TFile *gManaOutputFile = NULL;
101 EVENT_TREE *event_tree;
104TREE_STRUCT tree_struct;
117INT pvm_start_time = 0;
119extern BOOL disable_shm_write;
121void pvm_debug(
char *format, ...)
124 char msg[256],
str[256];
126 if (pvm_start_time == 0)
129 va_start(argptr, format);
130 vsprintf(msg, (
char *) format, argptr);
132 sprintf(
str,
"%1.3lf: %s", (
ss_millitime() - pvm_start_time) / 1000.0, msg);
138 sprintf(cmd,
"echo > /dev/console \"%s\"",
str);
151#define PVM_BUFFER_SIZE (1024*1024)
178void pvm_debug(
char *format, ...);
224extern int QUEST[100];
230#define HBOOK_LREC 8190
233#ifndef EXT_EVENT_SIZE
234#define EXT_EVENT_SIZE (2*(MAX_EVENT_SIZE+sizeof(EVENT_HEADER)))
275 'c',
"<filename1> Configuration file name(s). May contain a '%05d' to be\n\
276 <filename2> replaced by the run number. Up to ten files can be\n\
277 ... specified in one \"-c\" statement",
clp.config_file_name,
TID_STRING, 10}, {
278 'd',
" Debug flag when started the analyzer fron a debugger.\n\
279 Prevents the system to kill the analyzer when the\n\
280 debugger stops at a breakpoint", &
clp.debug,
TID_BOOL, 0}, {
281 'D',
" Start analyzer as a daemon in the background (UNIX only).",
283 'e',
"<experiment> MIDAS experiment to connect to",
clp.exp_name,
TID_STRING, 1}, {
284 'f',
" Filter mode. Write original events to output file\n\
285 only if analyzer accepts them (doesn't return ANA_SKIP).\n", &
clp.filter,
TID_BOOL, 0}, {
286 'h',
"<hostname> MIDAS host to connect to when running the analyzer online",
288 'i',
"<filename1> Input file name. May contain a '%05d' to be replaced by\n\
289 <filename2> the run number. Up to ten input files can be specified\n\
290 ... in one \"-i\" statement",
clp.input_file_name,
TID_STRING, 10}, {
291 'l',
" If set, don't load histos from last histo file when\n\
293 'L',
" HBOOK LREC size. Default is 8190.", &
clp.lrec,
TID_INT, 0}, {
294 'n',
"<count> Analyze only \"count\" events.\n\
296 Analyze only events from \"first\" to \"last\".\n\
297 <first> <last> <n>\n\
298 Analyze every n-th event from \"first\" to \"last\".",
clp.n,
TID_INT, 4}, {
299 'o',
"<filename> Output file name. Extension may be .mid (MIDAS binary),\n\
300 .asc (ASCII) or .rz (HBOOK). If the name contains a '%05d',\n\
301 one output file is generated for each run. Use \"OFLN\" as\n\
302 output file name to creaate a HBOOK shared memory instead\n\
304 'p',
"<param=value> Set individual parameters to a specific value.\n\
305 Overrides any setting in configuration files",
clp.param,
TID_STRING, 10}, {
306 'P',
"<ODB tree> Protect an ODB subtree from being overwritten\n\
307 with the online data when ODB gets loaded from .mid file",
clp.protect,
TID_STRING, 10}, {
308 'q',
" Quiet flag. If set, don't display run progress in\n\
310 'r',
"<range> Range of run numbers to analyzer like \"-r 120 125\"\n\
311 to analyze runs 120 to 125 (inclusive). The \"-r\"\n\
312 flag must be used with a '%05d' in the input file name.",
clp.run_number,
TID_INT, 2},
315 't',
"<n> Parallelize analyzer using <n> tasks with PVM.", &
clp.n_task,
317 'b',
"<n> Buffer size for parallelization in kB.", &
clp.pvm_buf_size,
322 's',
"<port> Start ROOT histo server under <port>. If port==0, don't start server.", &
clp.root_port,
TID_INT, 1}, {
323 'R',
" Start ROOT interpreter after analysis has finished.",
327 'v',
" Verbose output.", &
clp.verbose,
TID_BOOL, 0}, {
328 'w',
" Produce row-wise N-tuples in outpur .rz file. By\n\
329 default, column-wise N-tuples are used.", &
clp.rwnt,
TID_BOOL, 0}, {
343#define ANALYZER_REQUEST_STR "\
345Trigger mask = INT : -1\n\
346Sampling type = INT : 1\n\
347Buffer = STRING : [32] SYSTEM\n\
349Client name = STRING : [32] \n\
350Host = STRING : [32] \n\
353#define ANALYZER_STATS_STR "\
354Events received = DOUBLE : 0\n\
355Events per sec. = DOUBLE : 0\n\
356Events written = DOUBLE : 0\n\
368 if (argv[
index][0] ==
'-') {
397 printf(
"Note more than %d options possible for flag -%c\n",
404 }
while (
index < argc && argv[
index][0] !=
'-');
414 printf(
"usage: analyzer [options]\n\n");
415 printf(
"valid options are:\n");
441 strcpy(result,
file);
461 static int n_cache = 0;
466 return &event_def[
index];
483 return &event_def[
index];
488 cm_msg(
MERROR,
"db_get_event_definition",
"cannot find /equipment entry in ODB");
496 cm_msg(
MERROR,
"db_get_event_definition",
"Cannot find event id %d under /equipment",
event_id);
530 cm_msg(
MERROR,
"db_get_event_definition",
"unknown data format");
536 return &event_def[
index];
561 tl = (
ANA_TEST **) malloc(2 *
sizeof(
void *));
565 strcpy(
tl[0]->
name,
"Always true");
638 char value_string[80];
639 char param_string[80];
643 for (
i = 0;
clp.config_file_name[
i][0] &&
i < 10;
i++) {
644 if (strchr(
clp.config_file_name[
i],
'%') != NULL)
651 printf(
"Configuration file \"%s\" loaded\n",
file_name);
655 for (
i = 0;
clp.param[
i][0] &&
i < 10;
i++) {
656 if (strchr(
clp.param[
i],
'=') == NULL) {
657 printf(
"Error: parameter %s contains no value\n",
clp.param[
i]);
659 strcpy(value_string, strchr(
clp.param[
i],
'=') + 1);
660 strcpy(param_string,
clp.param[
i]);
661 *strchr(param_string,
'=') = 0;
664 if (strchr(param_string,
'[') != NULL) {
665 index = atoi(strchr(param_string,
'[') + 1);
666 *strchr(param_string,
'[') = 0;
671 if (param_string[0] ==
'/')
672 strcpy(
str, param_string);
677 printf(
"Error: cannot find parameter %s in ODB\n",
str);
685 printf(
"Parameter %s changed to %s\n",
str, value_string);
687 printf(
"Cannot change parameter %s\n",
str);
737 printf(
"N-tuples rebooked\n");
741 printf(
"ROOT TTree rebooked\n");
771 if (bank_list != NULL)
772 for (; bank_list->
name[0]; bank_list++) {
775 size =
sizeof(
DWORD);
800 strcpy(
str,
"Number");
801 strcpy(str2,
"Run:U*4,Number:U*4,Time:U*4");
806 if (bank_list == NULL) {
811 if (event_def == NULL) {
812 cm_msg(
MERROR,
"book_ntuples",
"Cannot find definition of event %s in ODB",
827 for (
j = 0;
str[
j];
j++) {
828 if (!(
str[
j] >=
'a' &&
str[
j] <=
'z') &&
833 strcat(ch_tags,
str);
843 "Key %s in event %s is of type %s with no HBOOK correspondence",
848 strcat(ch_tags,
str);
849 strcat(ch_tags,
",");
852 ch_tags[strlen(ch_tags) - 1] = 0;
863 for (; bank_list->
name[0]; bank_list++) {
868 sprintf(
str,
"N%s[0,%d]", bank_list->
name, bank_list->
size);
873 sprintf(
str,
"%s(N%s)", bank_list->
name, bank_list->
name);
880 "Bank %s is of type %s with no HBOOK correspondence",
887 "Bank %s is of type with unknown size", bank_list->
name);
908 for (
j = 0;
str[
j];
j++) {
909 if (!(
str[
j] >=
'a' &&
str[
j] <=
'z') &&
914 strcat(ch_tags,
str);
924 "Key %s in bank %s is of type %s with no HBOOK correspondence",
928 strcat(ch_tags,
str);
929 strcat(ch_tags,
",");
932 ch_tags[strlen(ch_tags) - 1] = 0;
933 bank_list->
addr = calloc(1, bank_list->
size);
936 bank_list->
addr, ch_tags);
964 strcpy(rw_tag[n_tag++],
"Run");
965 strcpy(rw_tag[n_tag++],
"Number");
966 strcpy(rw_tag[n_tag++],
"Time");
975 if (bank_list == NULL) {
987 for (
j = 0; key_name[
j];
j++) {
988 if (!(key_name[
j] >=
'a' && key_name[
j] <=
'z') &&
989 !(key_name[
j] >=
'A' && key_name[
j] <=
'Z') &&
990 !(key_name[
j] >=
'0' && key_name[
j] <=
'9'))
996 sprintf(
str,
"%s%d", key_name,
j);
997 strncpy(rw_tag[n_tag++],
str, 8);
1005 "Too much tags for RW N-tupeles (512 maximum)");
1009 strncpy(rw_tag[n_tag++], key_name, 8);
1018 "Too much tags for RW N-tupeles (512 maximum)");
1024 for (; bank_list->
name[0]; bank_list++) {
1026 bank_list->
n_data = n_tag;
1032 for (
i = 0;
i < (
INT) bank_list->
size;
i++) {
1033 sprintf(
str,
"%s%d", bank_list->
name,
i);
1034 strncpy(rw_tag[n_tag++],
str, 8);
1041 "Too much tags for RW N-tupeles (512 maximum)");
1056 for (
j = 0; key_name[
j];
j++) {
1057 if (!(key_name[
j] >=
'a' && key_name[
j] <=
'z') &&
1058 !(key_name[
j] >=
'A' && key_name[
j] <=
'Z') &&
1059 !(key_name[
j] >=
'0' && key_name[
j] <=
'9'))
1065 sprintf(
str,
"%s%d", key_name,
j);
1066 strncpy(rw_tag[n_tag++],
str, 8);
1069 printf(
"NT #%d-%d: %s\n",
1074 "Too much tags for RW N-tupeles (512 maximum)");
1078 strncpy(rw_tag[n_tag++], key_name, 8);
1080 printf(
"NT #%d-%d: %s\n",
1087 "Too much tags for RW N-tupeles (512 maximum)");
1107 strcpy(
str,
"//OFFLINE");
1108 HBOOKN(
id, block_name, n_tag,
str, 5120, rw_tag);
1114 "Cannot book N-tuple #%d. Increase PAWC size via the -s flag or switch off banks",
1128char ttree_types[][8] = {
1155 char leaf_tags[2000];
1174 if (bank_list != NULL)
1175 for (; bank_list->
name[0]; bank_list++) {
1178 size =
sizeof(
DWORD);
1196 tree_struct.n_tree++;
1197 if (tree_struct.n_tree == 1)
1198 tree_struct.event_tree = (EVENT_TREE *) malloc(
sizeof(EVENT_TREE));
1200 tree_struct.event_tree =
1201 (EVENT_TREE *) realloc(tree_struct.event_tree,
1202 sizeof(EVENT_TREE) * tree_struct.n_tree);
1204 et = tree_struct.event_tree + (tree_struct.n_tree - 1);
1213#if (ROOT_VERSION_CODE >= 262401)
1218 et->branch = (TBranch **) malloc(
sizeof(TBranch *));
1220 et->branch_filled = (
int *) malloc(
sizeof(
int));
1221 et->branch_len = (
int *) malloc(
sizeof(
int));
1223 et->branch[et->n_branch] =
1225 "Run/I:Number/I:Time/i");
1226 strcpy(et->branch_name,
"Number");
1230 if (bank_list == NULL) {
1234 if (event_def == NULL) {
1235 cm_msg(
MERROR,
"book_ttree",
"Cannot find definition of event %s in ODB",
1251 sprintf(leaf_tags + strlen(leaf_tags),
"[%d]",
key.
num_values);
1253 strcat(leaf_tags,
"/");
1255 if (ttree_types[
key.
type] != NULL)
1256 strcat(leaf_tags, ttree_types[
key.
type]);
1259 "Key %s in event %s is of type %s with no TTREE correspondence",
1264 strcat(leaf_tags,
":");
1267 leaf_tags[strlen(leaf_tags) - 1] = 0;
1270 (TBranch **) realloc(et->branch,
sizeof(TBranch *) * (et->n_branch + 1));
1272 (
char *) realloc(et->branch_name,
NAME_LENGTH * (et->n_branch + 1));
1274 (
int *) realloc(et->branch_filled,
sizeof(
int) * (et->n_branch + 1));
1276 (
int *) realloc(et->branch_len,
sizeof(
int) * (et->n_branch + 1));
1278 et->branch[et->n_branch] =
1280 strcpy(&et->branch_name[et->n_branch *
NAME_LENGTH],
1285 for (; bank_list->
name[0]; bank_list++) {
1290 sprintf(leaf_tags,
"n%s/I:%s[n%s]/", bank_list->
name, bank_list->
name,
1294 if (ttree_types[bank_list->
type] != NULL)
1295 strcat(leaf_tags, ttree_types[bank_list->
type]);
1298 "Bank %s is of type %s with no TTREE correspondence",
1304 cm_msg(
MERROR,
"book_ttree",
"Bank %s is of type with unknown size",
1310 (TBranch **) realloc(et->branch,
1311 sizeof(TBranch *) * (et->n_branch + 1));
1313 (
char *) realloc(et->branch_name,
NAME_LENGTH * (et->n_branch + 1));
1315 (
int *) realloc(et->branch_filled,
sizeof(
int) * (et->n_branch + 1));
1317 (
int *) realloc(et->branch_len,
sizeof(
int) * (et->n_branch + 1));
1319 et->branch[et->n_branch] =
1320 et->tree->Branch((
const char*)bank_list->
name, (
const char*)NULL, leaf_tags);
1321 strcpy(&et->branch_name[et->n_branch *
NAME_LENGTH], bank_list->
name);
1336 sprintf(leaf_tags + strlen(leaf_tags),
"[%d]",
key.
num_values);
1338 strcat(leaf_tags,
"/");
1340 if (ttree_types[
key.
type] != NULL)
1341 strcat(leaf_tags, ttree_types[
key.
type]);
1344 "Key %s in bank %s is of type %s with no HBOOK correspondence",
1348 strcat(leaf_tags,
":");
1351 leaf_tags[strlen(leaf_tags) - 1] = 0;
1354 (TBranch **) realloc(et->branch,
1355 sizeof(TBranch *) * (et->n_branch + 1));
1357 (
char *) realloc(et->branch_name,
NAME_LENGTH * (et->n_branch + 1));
1359 (
int *) realloc(et->branch_filled,
sizeof(
int) * (et->n_branch + 1));
1361 (
int *) realloc(et->branch_len,
sizeof(
int) * (et->n_branch + 1));
1363 et->branch[et->n_branch] =
1364 et->tree->Branch((
const char*)bank_list->
name, (
const char*)NULL, leaf_tags);
1365 strcpy(&et->branch_name[et->n_branch *
NAME_LENGTH], bank_list->
name);
1378INT SaveRootHistograms(TFolder * folder,
const char *filename)
1380 TDirectory *savedir = gDirectory;
1381 TFile *outf =
new TFile(filename,
"RECREATE",
"Midas Analyzer Histograms");
1383 cm_msg(
MERROR,
"SaveRootHistograms",
"Cannot create output file %s", filename);
1400void copy_from_last(TFolder * lastFolder, TFolder * onlineFolder)
1403 TIter next(lastFolder->GetListOfFolders());
1404 while (TObject * obj = next()) {
1405 const char *
name = obj->GetName();
1407 if (obj->InheritsFrom(
"TFolder")) {
1409 TFolder *onlineSubfolder = (TFolder *) onlineFolder->FindObject(
name);
1410 if (onlineSubfolder)
1411 copy_from_last((TFolder *) obj, onlineSubfolder);
1413 }
else if (obj->InheritsFrom(
"TH1")) {
1417 }
else if (obj->InheritsFrom(
"TCutG")) {
1419 TCutG *onlineObj = (TCutG *) onlineFolder->FindObject(
name);
1421 TCutG *lastObj = (TCutG *) obj;
1423 lastObj->TAttMarker::Copy(*onlineObj);
1424 lastObj->TAttFill::Copy(*onlineObj);
1425 lastObj->TAttLine::Copy(*onlineObj);
1426 lastObj->TNamed::Copy(*onlineObj);
1427 onlineObj->Set(lastObj->GetN());
1428 for (
int i = 0;
i < lastObj->GetN(); ++
i) {
1429 onlineObj->SetPoint(
i, lastObj->GetX()[
i], lastObj->GetY()[
i]);
1440INT LoadRootHistograms(TFolder * folder,
const char *filename)
1442 TFile *inf = TFile::Open(filename,
"READ");
1444 printf(
"Error: File \"%s\" not found\n", filename);
1447 TFolder *lastHistos = (TFolder *) inf->Get(
"histos");
1450 copy_from_last(lastHistos, folder);
1461INT ClearRootHistograms(TFolder * folder)
1463 TIter next(folder->GetListOfFolders());
1464 while (TObject * obj = next())
1465 if (obj->InheritsFrom(
"TH1"))
1466 ((TH1 *) obj)->Reset();
1467 else if (obj->InheritsFrom(
"TFolder"))
1468 ClearRootHistograms((TFolder *) obj);
1474INT CloseRootOutputFile()
1479 assert(gManaOutputFile != NULL);
1482 gManaOutputFile->cd();
1486 gManaOutputFile->Write();
1487 gManaOutputFile->Close();
1488 delete gManaOutputFile;
1489 gManaOutputFile = NULL;
1492 for (
i = 0;
i < tree_struct.n_tree;
i++)
1493 if (tree_struct.event_tree[
i].branch) {
1494 free(tree_struct.event_tree[
i].branch);
1495 free(tree_struct.event_tree[
i].branch_name);
1496 free(tree_struct.event_tree[
i].branch_filled);
1497 free(tree_struct.event_tree[
i].branch_len);
1498 tree_struct.event_tree[
i].branch = NULL;
1502 free(tree_struct.event_tree);
1503 tree_struct.event_tree = NULL;
1504 tree_struct.n_tree = 0;
1521 char str[256], block_name[32];
1532 cm_msg(
MERROR,
"bor",
"Cannot read output info record");
1541 if (bank_list == NULL)
1544 for (; bank_list->
name[0]; bank_list++) {
1545 strncpy(block_name, bank_list->
name, 4);
1615 module = analyze_request[i].ana_module;
1616 for (
j = 0;
module != NULL && module[j] != NULL;
j++) {
1620 module[j]->enabled = TRUE;
1621 size =
sizeof(
BOOL);
1624 if (module[
j]->init != NULL && module[
j]->enabled) {
1628 sprintf(
str,
"Histos for module %s", module[
j]->
name);
1629 module[j]->histo_folder = (TFolder *) gROOT->FindObjectAny(module[j]->name);
1630 if (!module[
j]->histo_folder)
1631 module[j]->histo_folder =
1632 gManaHistosFolder->AddFolder(module[j]->name, str);
1633 else if (strcmp(((TObject *) module[
j]->histo_folder)->ClassName(),
"TFolder")
1636 "Fatal error: ROOT Object \"%s\" of class \"%s\" exists but it is not a TFolder, exiting!",
1638 ((TObject *) module[
j]->histo_folder)->ClassName());
1662 module = analyze_request[i].ana_module;
1663 for (
j = 0;
module != NULL && module[j] != NULL;
j++)
1664 if (module[
j]->exit != NULL && module[
j]->enabled) {
1689 if (bank_list != NULL)
1690 for (; bank_list->
name[0]; bank_list++) {
1693 size =
sizeof(
DWORD);
1698 module = analyze_request[i].ana_module;
1699 for (
j = 0;
module != NULL && module[j] != NULL;
j++) {
1701 module[j]->enabled = TRUE;
1702 size =
sizeof(
BOOL);
1720 for (
i = 0;
i <
n;
i++) {
1721 for (
j = 0;
j < 10000;
j++)
1743 for (
i = 0;
i < tree_struct.n_tree;
i++)
1744 tree_struct.event_tree[
i].tree->Reset();
1753 if (strchr(
str,
'%') != NULL)
1762 while (*ext_str !=
'.')
1765 if (strncmp(ext_str,
".gz", 3) == 0) {
1768 while (*ext_str !=
'.' && ext_str >
file_name)
1772 if (strncmp(ext_str,
".asc", 4) == 0)
1774 else if (strncmp(ext_str,
".mid", 4) == 0)
1776 else if (strncmp(ext_str,
".rz", 3) == 0)
1778 else if (strncmp(ext_str,
".root", 5) == 0)
1781 strcpy(error,
"Unknown output data format. Please use file extension .asc, .mid, .rz or .root.\n");
1794 sprintf(
file_name,
"n%d", pvm_client_index);
1798 sprintf(
file_name,
"n%d", pvm_client_index);
1801 PVM_DEBUG(
"BOR: file_name = %s",
file_name);
1818 strcpy(
str,
"BSIZE");
1820 strcpy(
str,
"OFFLINE");
1821 strcpy(str2,
"NQP");
1831 cm_msg(
MERROR,
"bor",
"HBOOK support is not compiled in");
1838 assert(gManaOutputFile == NULL);
1841 new TFile(
file_name,
"RECREATE",
"Midas Analyzer output file");
1842 if (gManaOutputFile == NULL) {
1850 gManaOutputFile->cd();
1854 cm_msg(
MERROR,
"bor",
"ROOT support is not compiled in");
1867 sprintf(error,
"Cannot open output file %s",
file_name);
1901 module = analyze_request[i].ana_module;
1902 for (
j = 0;
module != NULL && module[j] != NULL;
j++)
1903 if (module[
j]->
bor != NULL && module[
j]->enabled) {
1904 module[j]->bor(run_number);
1923 module = analyze_request[i].ana_module;
1924 for (
j = 0;
module != NULL && module[j] != NULL;
j++)
1925 if (module[
j]->
eor != NULL && module[
j]->enabled) {
1926 module[j]->eor(run_number);
1936 if (strchr(
str,
'%') != NULL)
1943 for (
i = 0;
i < (int) strlen(
str);
i++)
1944 if (isupper(
str[
i]))
1947 if (
i < (
int) strlen(
str)) {
1949 (
"Error: Due to a limitation in HBOOK, directoy names may not contain uppercase\n");
1950 printf(
" characters. Histogram saving to %s will not work.\n",
str);
1968 strcpy(
str,
"OFFLINE");
1971 cm_msg(
MERROR,
"eor",
"HBOOK support is not compiled in");
1975 CloseRootOutputFile();
1977 cm_msg(
MERROR,
"eor",
"ROOT support is not compiled in");
1992 if (bank_list == NULL) {
1998 for (; bank_list->name[0]; bank_list++)
1999 if (bank_list->addr) {
2000 free(bank_list->addr);
2001 bank_list->addr = NULL;
2050 }
while (n_bytes > 0);
2091#define STR_INC(p,base) { p+=strlen(p); \
2092 if (p > base+sizeof(base)) \
2093 cm_msg(MERROR, "STR_INC", "ASCII buffer too small"); }
2113 char buffer[100000];
2118 if (event_def == NULL)
2126 sprintf(pbuf,
"%%ID BOR NR %d\n", (
int) pevent->
serial_number);
2128 sprintf(pbuf,
"%%ID EOR NR %d\n", (
int) pevent->
serial_number);
2183 if ((bktype & 0xFF00) == 0)
2189 else if ((bktype & 0xFF00) ==
TID_PCOS3)
2194 sprintf(pbuf,
"BK %s TP %s SZ %d\n",
name,
type_name, size);
2208 sprintf(pbuf,
"%s:\n",
key.
name);
2228 for (
i = 0;
i < size;) {
2232 sprintf(pbuf,
"GA %d BF %d CN %d",
2234 lrs1877_header->
count);
2243 sprintf(pbuf,
"GA %d CH %02d ED %d DA %1.1lf",
2245 lrs1877[
i +
j].edge, lrs1877[
i +
j].
data * 0.5);
2253 for (
i = 0;
i < size;
i++) {
2254 if ((bktype & 0xFF00) == 0)
2258 sprintf(pbuf,
"GA %d CH %02d DA %d",
2261 else if ((bktype & 0xFF00) ==
TID_PCOS3)
2262 sprintf(pbuf,
"TBD");
2278 cm_msg(
MERROR,
"write_event_ascii",
"cannot find event definition");
2280 pdata = (
char *) (pevent + 1);
2287 sprintf(pbuf,
"%s\n",
key.
name);
2307 size = strlen(buffer);
2331 char *pdata, *pdata_copy;
2334 DWORD bkname, bksize;
2336 static char *buffer = NULL;
2346 memcpy(pevent_copy, pevent, size);
2353 if (event_def == NULL)
2358 pbuf = (
char *) pevent_copy;
2411 bk_create(pbuf, (
char *) (&bkname), bktype, (
void **)&pdata_copy);
2412 memcpy(pdata_copy, pdata, bksize);
2413 pdata_copy += bksize;
2428 memcpy(pevent_copy, pevent, size);
2458 BOOL exclude, exclude_all;
2459 char block_name[5],
str[80];
2472 if (event_def == NULL)
2494 strcpy(
str,
"Number");
2526 *((
DWORD *) block_name) = bkname;
2539 cm_msg(
MERROR,
"write_event_hbook",
"Received unknown bank %s",
2544 if (!exclude && pbl != NULL && !
clp.rwnt) {
2548 if (item_size == 0) {
2550 "Received bank %s with unknown item size", block_name);
2554 pbl->
n_data = size / item_size;
2559 "Bank %s has more (%d) entries than maximum value (%d)",
2565 if (item_size >= 4) {
2566 size =
MIN((
INT) pbl->
size * item_size, size);
2567 memcpy(pbl->
addr, pdata, size);
2568 }
else if (item_size == 2)
2571 else if (item_size == 1)
2576 memcpy(pbl->
addr, pdata, size);
2584 if (!exclude && pbl != NULL &&
clp.rwnt) {
2585 exclude_all =
FALSE;
2590 n = size / item_size;
2595 "Bank %s has more (%d) entries than maximum value (%d)",
2596 block_name,
n, pbl->
size);
2601 for (
i = 0;
i <
n;
i++) {
2602 switch (bktype & 0xFF) {
2613 rwnt[pbl->
n_data +
i] = (float) (*((
float *) pdata +
i));
2616 rwnt[pbl->
n_data +
i] = (float) (*((
double *) pdata +
i));
2648 rwnt[
k++] = (float) (*((
short int *) pdata +
j));
2651 rwnt[
k++] = (float) (*((
INT *) pdata +
j));
2660 rwnt[
k++] = (float) (*((
float *) pdata +
j));
2663 rwnt[
k++] = (float) (*((
double *) pdata +
j));
2677 if (
clp.rwnt &&
file != NULL && !exclude_all)
2689 else if (event_def->
format == FORMAT_YBOS) {
2690 assert(!
"YBOS not supported anymore");
2698 pdata = (
char *) (pevent + 1);
2720 rwnt[
k++] = (float) (*((
short int *) pdata +
j));
2723 rwnt[
k++] = (float) (*((
INT *) pdata +
j));
2732 rwnt[
k++] = (float) (*((
float *) pdata +
j));
2735 rwnt[
k++] = (float) (*((
double *) pdata +
j));
2777 BOOL exclude, exclude_all;
2790 if (event_def == NULL)
2805 for (
i = 0;
i < tree_struct.n_tree;
i++)
2806 if (tree_struct.event_tree[
i].event_id == pevent->
event_id)
2809 if (
i == tree_struct.n_tree) {
2810 cm_msg(
MERROR,
"write_event_ttree",
"Event #%d not booked by book_ttree()",
2815 et = tree_struct.event_tree +
i;
2818 for (
i = 0;
i < et->n_branch;
i++)
2819 et->branch_filled[
i] =
FALSE;
2822 et->branch_filled[0] =
TRUE;
2874 if (!exclude && pbl != NULL) {
2875 for (
i = 0;
i < et->n_branch;
i++)
2879 if (
i == et->n_branch) {
2884 exclude_all =
FALSE;
2885 branch = et->branch[
i];
2886 et->branch_filled[
i] =
TRUE;
2887 et->branch_len[
i] = bklen;
2891 TIter next(branch->GetListOfLeaves());
2892 TLeaf *leaf = (TLeaf *) next();
2895 leaf->SetAddress(&et->branch_len[
i]);
2897 leaf = (TLeaf *) next();
2898 leaf->SetAddress(pdata);
2901 branch->SetAddress(pdata);
2908 for (
i = 0;
i < et->n_branch;
i++)
2909 if (!et->branch_filled[
i])
2911 "Bank %s booked but not received, tree cannot be filled",
2915#if (ROOT_VERSION_CODE < 262401)
2930 for (
i = 0;
i < tree_struct.n_tree;
i++)
2931 if (tree_struct.event_tree[
i].event_id == pevent->
event_id)
2934 if (
i == tree_struct.n_tree) {
2935 cm_msg(
MERROR,
"write_event_ttree",
"Event #%d not booked by book_ttree()",
2940 et = tree_struct.event_tree +
i;
2942 et->tree->GetBranch(et->branch_name)->SetAddress(pevent + 1);
2969 if (event_def == NULL)
3087 static DWORD last_time_kb = 0;
3088 static char *orig_event = NULL;
3092 printf(
"event %d, number %d, total size %d\n",
3110 if ((
char) ch ==
'!')
3133 PVM_DEBUG(
"process_event: ODB load");
3144 status = pvm_distribute(par, pevent);
3155 if (event_def == NULL)
3163 if (orig_event == NULL)
3180 module = par->ana_module;
3181 for (
i = 0;
module != NULL && module[i] != NULL;
i++) {
3182 if (module[
i]->enabled) {
3184 status =
module[i]->analyzer(pevent, (void *) (pevent + 1));
3196 cm_msg(
MERROR,
"process_event",
"Event got too large (%d Bytes) in analyzer",
i);
3202 if (event_def->
format == FORMAT_YBOS) {
3203 assert(!
"YBOS not supported anymore");
3230 cm_msg(
MERROR,
"process_event",
"Error writing to file (Disk full?)");
3240 write_event_hbook(NULL, pevent, par);
3245 write_event_ttree(NULL, pevent, par);
3251 for (
i = 0;
i < 50;
i++) {
3279 static DWORD buffer_size = 0;
3280 static char *buffer = NULL;
3283 if (buffer == NULL) {
3286 if (buffer == NULL) {
3287 cm_msg(
MERROR,
"receive_event",
"Not enough memory to buffer event of size %d", buffer_size);
3359 strlcpy(ar_info->
host, host.c_str(),
sizeof(ar_info->
host));
3380 printf(
"Cannot open statistics record, probably other analyzer is using it\n");
3455 TCutG *cut((TCutG *) folder->FindObject(
name));
3476 TFolder *subfolder = 0;
3478 TCollection *listOfSubFolders = current->GetListOfFolders();
3479 TIter iter(listOfSubFolders);
3480 while (TObject * obj = iter()) {
3481 if (strcmp(obj->GetName(),
name) == 0 && obj->InheritsFrom(
"TFolder"))
3482 subfolder = (TFolder *) obj;
3486 subfolder =
new TFolder(
name,
name);
3487 current->Add(subfolder);
3508 printf(
"Clear ID %d to ID %d\n", id1, id2);
3509 for (
i = id1;
i <= id2;
i++)
3513 printf(
"Clear ID %d\n", id1);
3527 for (
i = 0;
i < 10000;
i++)
3540 clear_histos_hbook(
CINT(0),
CINT(1));
3564 for (
i = 0;
i < (int) strlen(
str);
i++)
3565 if (isupper(
str[
i]))
3568 if (
i < (
int) strlen(
str)) {
3570 (
"Error: Due to a limitation in HBOOK, directoy names may not contain uppercase\n");
3571 printf(
" characters. Histogram loading from %s will not work.\n",
str);
3573 f = fopen(
str,
"r");
3576 printf(
"Loading previous online histos from %s\n",
str);
3589 printf(
"Loading previous online histos from %s\n",
str);
3606 printf(
"Saving current online histos to %s\n",
str);
3613 for (
i = 0;
i < (int) strlen(
str);
i++)
3614 if (isupper(
str[
i]))
3617 if (
i < (
int) strlen(
str)) {
3619 (
"Error: Due to a limitation in HBOOK, directoy names may not contain uppercase\n");
3620 printf(
" characters. Histogram saving to %s will not work.\n",
str);
3642 printf(
"Running analyzer online. Stop with \"!\"\n");
3645 last_time_update = 0;
3664 if ((
char) ch ==
'!')
3668 if ((
char) ch ==
'!')
3701 module = analyze_request[i].ana_module;
3702 for (
j = 0;
module != NULL && module[j] != NULL;
j++) {
3703 if (module[
j]->parameters != NULL) {
3713 if (size != module[
j]->param_size)
3720 "Cannot create/check \"%s\" parameters in ODB",
str);
3731 "Cannot open \"%s\" parameters in ODB",
str);
3751 size =
sizeof(flag);
3756 for (
i = 0;
i < 10;
i++)
3757 if (
clp.protect[
i][0] && !
clp.quiet)
3758 printf(
"Protect ODB tree \"%s\"\n",
clp.protect[
i]);
3796 for (
i = 0;
i < 10;
i++)
3797 if (
clp.protect[
i][0]) {
3807 if (strncmp((
char *) (pevent + 1),
"<?xml version=\"1.0\"", 19) == 0)
3830#define MA_DEVICE_DISK 1
3831#define MA_DEVICE_TAPE 2
3832#define MA_DEVICE_FTP 3
3833#define MA_DEVICE_PVM 4
3835#define MA_FORMAT_MIDAS (1<<0)
3836#define MA_FORMAT_YBOS (1<<2)
3837#define MA_FORMAT_GZIP (1<<3)
3860 cm_msg(
MERROR,
"ma_open",
"Cannot allocate MA file structure");
3880 while (*ext_str !=
'.')
3883 ext_str = (
char *)
"";
3885 if (strncmp(ext_str,
".gz", 3) == 0) {
3887 while (*ext_str !=
'.' && ext_str >
file_name)
3891 if (strncmp(
file_name,
"/dev/", 4) == 0)
3893 else if (strncmp(ext_str,
".mid", 4) == 0)
3895 else if (strncmp(ext_str,
".ybs", 4) == 0)
3896 assert(!
"YBOS not supported anymore");
3899 (
"Unknown input data format \"%s\". Please use file extension .mid or mid.gz.\n",
3906 assert(!
"YBOS not supported anymore");
3909 if (
file->gzfile == NULL)
3922 assert(!
"YBOS not supported anymore");
3924 gzclose((gzFile)
file->gzfile);
3939 cm_msg(
MERROR,
"ma_read_event",
"Buffer size too small");
3948 printf(
"Unexpected end of file %s, last event skipped\n",
file->file_name);
3965 cm_msg(
MERROR,
"ma_read_event",
"Buffer size too small");
3970 printf(
"Unexpected end of file %s, last event skipped\n",
file->file_name);
3977 assert(!
"YBOS not supported anymore");
3981 int bufid, len, tag, tid;
3983 struct timeval timeout;
3989 memcpy(pevent, pe, size);
3996 pvm_send(pvm_myparent, TAG_DATA);
3999 timeout.tv_sec = 60;
4000 timeout.tv_usec = 0;
4002 bufid = pvm_trecv(-1, -1, &timeout);
4004 pvm_perror(
"pvm_recv");
4008 PVM_DEBUG(
"ma_read_event: timeout receiving data, aborting analyzer.\n");
4012 status = pvm_bufinfo(bufid, &len, &tag, &tid);
4014 pvm_perror(
"pvm_bufinfo");
4018 PVM_DEBUG(
"ma_read_event: receive tag %d, buflen %d", tag, len);
4020 if (tag == TAG_EOR || tag == TAG_EXIT)
4025 status = pvm_upkbyte((
char *)
file->buffer, len, 1);
4027 pvm_perror(
"pvm_upkbyte");
4050 DWORD num_events_in, num_events_out;
4051 char error[256],
str[256];
4086 pevent_unaligned = (
EVENT_HEADER *) malloc(ext_event_size);
4087 if (pevent_unaligned == NULL) {
4088 printf(
"Not enough memeory\n");
4096 num_events_in = num_events_out = 0;
4121 fwrite(pevent, 1, size,
4125 cm_msg(
MERROR,
"analyze_run",
"Error writing to file (Disk full?)");
4141 if (
clp.n[0] > 0 ||
clp.n[1] > 0) {
4142 if (
clp.n[1] == 0) {
4144 if (num_events_in >
clp.n[0]) {
4150 if (num_events_in >
clp.n[1]) {
4154 if (num_events_in <
clp.n[0])
4156 else if (
clp.n[2] > 0 && num_events_in %
clp.n[2] != 0)
4187 if (num_events_in % 100 == 0) {
4204 PVM_DEBUG(
"analyze_run: event loop finished, status = %d",
status);
4211 printf(
"\nShutting down distributed analyzers, please wait...\n");
4223 printf(
"%s:%d %s:%d events, %1.2lfs\n",
input_file_name, num_events_in,
4227 start_time / 1000.0);
4235 printf(
"%s:%d %s:%d events, %1.2lfs\n",
input_file_name, num_events_in,
4239 start_time / 1000.0);
4250 PVM_DEBUG(
"analyze_run: send %d tests back to master",
n_test);
4252 status = pvm_send(pvm_myparent, TAG_EOR);
4254 pvm_perror(
"pvm_send");
4263 printf(
"%s:%d %s:%d events, %1.2lfs\n",
input_file_name, num_events_in,
4267 start_time / 1000.0);
4280 printf(
"%s:%d %s:%d events, %1.2lfs\n",
input_file_name, (
int) num_events_in,
4283 printf(
"%s:%d events, %1.2lfs\n",
input_file_name, (
int) num_events_in,
4284 start_time / 1000.0);
4294 free(pevent_unaligned);
4308 printf(
"Running analyzer offline. Stop with \"!\"\n");
4311 out_append = ((strchr(
clp.input_file_name[0],
'%') != NULL) &&
4312 (strchr(
clp.output_file_name,
'%') == NULL))
4313 ||
clp.input_file_name[1][0];
4316 if (
clp.run_number[0] > 0) {
4317 if (strchr(
clp.input_file_name[0],
'%') == NULL) {
4319 (
"Input file name must contain a wildcard like \"%%05d\" when using a range.\n");
4323 if (
clp.run_number[0] == 0) {
4324 printf(
"End of range not specified.\n");
4330 if (strchr(
clp.output_file_name,
'%') != NULL)
4341 for (
i = 0;
clp.input_file_name[
i][0] &&
i < 10;
i++) {
4349 if (strpbrk(prn,
"0123456789"))
4350 run_number = atoi(strpbrk(prn,
"0123456789"));
4352 if (strchr(
clp.output_file_name,
'%') != NULL) {
4354 printf(
"Cannot extract run number from input file name.\n");
4374 strcpy(
str,
"OFFLINE");
4377 cm_msg(
MERROR,
"loop_runs_offline",
"HBOOK support is not compiled in");
4381 CloseRootOutputFile();
4383 cm_msg(
MERROR,
"loop_runs_offline",
"ROOT support is not compiled in");
4396 if (bank_list == NULL)
4399 for (; bank_list->
name[0]; bank_list++)
4400 if (bank_list->
addr) {
4401 free(bank_list->
addr);
4402 bank_list->
addr = NULL;
4419int pvm_main(
char *argv[])
4421 int mytid,
status,
i,
j, dtid, *pvm_tid, bufid;
4423 struct timeval timeout;
4427 mytid = pvm_mytid();
4429 pvm_perror(
"pvm_mytid");
4437 pvm_perror(
"pvm_setopt");
4442 pvm_myparent = pvm_parent();
4443 if (pvm_myparent < 0 && pvm_myparent !=
PvmNoParent) {
4444 pvm_perror(
"pvm_parent");
4458 p = argv[0] + strlen(argv[0]) - 1;
4459 while (p > argv[0] && *p !=
'\\')
4465 if (strchr(argv[0],
'/') == 0) {
4468 strcat(path, argv[0]);
4470 strcpy(path, argv[0]);
4474 if (
clp.n_task == -1)
4478 pvm_config(&n_host, &n_arch, &hostp);
4480 pvm_n_task = n_host - 1;
4481 if (
clp.n_task != 0)
4482 pvm_n_task =
clp.n_task;
4484 if (
clp.n_task != 1 && pvm_n_task > n_host - 1)
4485 pvm_n_task = n_host - 1;
4487 if (pvm_n_task == 0)
4492 pvm_tid = malloc(
sizeof(
int) * pvm_n_task);
4493 pvmc = malloc(
sizeof(PVM_CLIENT) * pvm_n_task);
4495 if (pvm_tid == NULL || pvmc == NULL) {
4497 printf(
"Not enough memory to allocate PVM structures.\n");
4502 memset(pvmc, 0,
sizeof(PVM_CLIENT) * pvm_n_task);
4504 for (
i = 0;
i < pvm_n_task;
i++) {
4506 if (pvmc[
i].buffer == NULL) {
4509 printf(
"Not enough memory to allocate PVM buffers.\n");
4516 printf(
"Parallelizing analyzer on %d machines\n", pvm_n_task);
4517 if (pvm_n_task == 1)
4524 pvm_perror(
"pvm_spawn");
4531 for (
i = 0;
i < pvm_n_task;
i++) {
4532 pvmc[
i].tid = pvm_tid[
i];
4534 pvmc[
i].n_events = 0;
4536 dtid = pvm_tidtohost(pvm_tid[
i]);
4537 for (
j = 0;
j < n_host;
j++)
4542 PVM_DEBUG(
"Spawing on hosts:");
4543 for (
i = 0;
i < pvm_n_task;
i++)
4544 PVM_DEBUG(
"%s", pvmc[
i].host);
4546 if (
status < pvm_n_task) {
4547 printf(
"Trouble spawning slaves. Aborting. Error codes are:\n");
4548 for (
i = 0;
i < pvm_n_task;
i++)
4549 printf(
"TID %d %d\n",
i, pvm_tid[
i]);
4558 for (
i = 0;
i < pvm_n_task;
i++) {
4561 pvm_pkint(&
i, 1, 1);
4563 PVM_DEBUG(
"pvm_main: send index to client %d",
i);
4565 status = pvm_send(pvmc[
i].tid, TAG_INIT);
4567 pvm_perror(
"pvm_send");
4580 strcpy(path, argv[0]);
4587 PVM_DEBUG(
"PATH=%s", path);
4590 timeout.tv_sec = 10;
4591 timeout.tv_usec = 0;
4593 bufid = pvm_trecv(-1, -1, &timeout);
4595 pvm_perror(
"pvm_recv");
4599 PVM_DEBUG(
"pvm_main: timeout receiving index, aborting analyzer.\n");
4603 status = pvm_upkint(&pvm_client_index, 1, 1);
4605 pvm_perror(
"pvm_upkint");
4609 PVM_DEBUG(
"Received client ID %d", pvm_client_index);
4619 struct timeval timeout;
4620 int bufid, len, tag, tid,
status;
4623 printf(
"Event too large (%d) for PVM buffer (%d), analyzer aborted\n",
4629 timeout.tv_sec = 60;
4630 timeout.tv_usec = 0;
4632 bufid = pvm_trecv(pvmc[
index].tid, -1, &timeout);
4634 pvm_perror(
"pvm_recv");
4638 printf(
"Timeout receiving data requests from %s, aborting analyzer.\n",
4643 status = pvm_bufinfo(bufid, &len, &tag, &tid);
4645 pvm_perror(
"pvm_bufinfo");
4649 PVM_DEBUG(
"pvm_send_event: received request from client %d",
index);
4654 pvm_pkbyte((
char *) pevent, pevent->data_size +
sizeof(
EVENT_HEADER), 1);
4656 PVM_DEBUG(
"pvm_send_event: send events to client %d",
index);
4658 status = pvm_send(tid, TAG_DATA);
4660 pvm_perror(
"pvm_send");
4671int pvm_send_buffer(
int index)
4673 struct timeval timeout;
4674 int i, bufid, len, tag, tid,
status;
4676 PVM_DEBUG(
"pvm_send_buffer: index %d",
index);
4679 bufid = pvm_nrecv(-1, -1);
4682 timeout.tv_sec = 60;
4683 timeout.tv_usec = 0;
4685 bufid = pvm_trecv(-1, -1, &timeout);
4689 pvm_perror(
"pvm_recv");
4696 printf(
"Timeout receiving data requests, aborting analyzer.\n");
4700 status = pvm_bufinfo(bufid, &len, &tag, &tid);
4702 pvm_perror(
"pvm_bufinfo");
4707 for (
i = 0;
i < pvm_n_task;
i++)
4708 if (pvmc[
i].tid == tid)
4711 if (
i == pvm_n_task) {
4712 cm_msg(
MERROR,
"pvm_send_buffer",
"received message from unknown client %d", tid);
4716 PVM_DEBUG(
"pvm_send_buffer: received request from client %d",
i);
4721 pvm_pkbyte((
char *) pvmc[
i].buffer, pvmc[
i].wp, 1);
4723 PVM_DEBUG(
"pvm_send_buffer: send %d events (%1.1lfkB) to client %d",
4726 status = pvm_send(tid, TAG_DATA);
4728 pvm_perror(
"pvm_send");
4733 pvmc[
i].n_events = 0;
4738 return pvm_send_buffer(
index);
4752 for (
i = 0;
i < pvm_n_task;
i++) {
4753 status = pvm_send_event(
i, pevent);
4765 for (
i = 0;
i < pvm_n_task;
i++) {
4767 if (pvmc[
i].wp + size >=
clp.pvm_buf_size) {
4774 printf(
"Event too large (%d) for PVM buffer (%d), analyzer aborted\n", size,
4779 memcpy(pvmc[
i].buffer + pvmc[
i].wp, pevent, size);
4787 for (
i = 0;
i < pvm_n_task;
i++)
4788 if (pvmc[
i].wp < min) {
4794 if (pvmc[
index].wp + size >=
clp.pvm_buf_size) {
4801 printf(
"Event too large (%d) for PVM buffer (%d), analyzer aborted\n", size,
4807 memcpy(pvmc[
index].buffer + pvmc[
index].wp, pevent, size);
4808 pvmc[
index].wp += size;
4809 pvmc[
index].n_events++;
4813 for (
i = 0;
i < pvm_n_task;
i++)
4815 sprintf(
str + strlen(
str),
"#%d# ", pvmc[
i].wp);
4817 sprintf(
str + strlen(
str),
"%d ", pvmc[
i].wp);
4823 for (
i = 0;
i < pvm_n_task;
i++) {
4824 if (pvmc[
i].wp > max)
4826 if (pvmc[
i].wp < min)
4831 if (max <
clp.pvm_buf_size / 2)
4835 if (min >
clp.pvm_buf_size / 2) {
4836 status = pvm_send_buffer(-1);
4841 status = pvm_send_buffer(-2);
4848int pvm_eor(
int eor_tag)
4850 struct timeval timeout;
4851 int bufid, len, tag, tid,
i,
j,
status, size;
4858 for (
i = 0;
i < pvm_n_task;
i++)
4859 pvmc[
i].eor_sent =
FALSE;
4863 timeout.tv_sec = 60;
4864 timeout.tv_usec = 0;
4866 bufid = pvm_trecv(-1, -1, &timeout);
4868 pvm_perror(
"pvm_recv");
4872 printf(
"Timeout receiving data request, aborting analyzer.\n");
4876 status = pvm_bufinfo(bufid, &len, &tag, &tid);
4878 pvm_perror(
"pvm_bufinfo");
4883 for (
j = 0;
j < pvm_n_task;
j++)
4884 if (pvmc[
j].tid == tid)
4887 if (
j == pvm_n_task) {
4888 cm_msg(
MERROR,
"pvm_eor",
"received message from unknown client %d", tid);
4892 PVM_DEBUG(
"pvm_eor: received request from client %d",
j);
4895 if (eor_tag == TAG_EOR && pvmc[
j].wp > 0) {
4898 pvm_pkbyte((
char *) pvmc[
j].buffer, pvmc[
j].wp, 1);
4900 PVM_DEBUG(
"pvm_eor: send %d events (%1.1lfkB) to client %d",
4903 status = pvm_send(tid, TAG_DATA);
4905 pvm_perror(
"pvm_send");
4910 pvmc[
j].n_events = 0;
4916 if (eor_tag == TAG_EOR)
4917 PVM_DEBUG(
"pvm_eor: send EOR to client %d",
j);
4919 PVM_DEBUG(
"pvm_eor: send EXIT to client %d",
j);
4921 printf(
"Shutting down %s \r", pvmc[
j].host);
4924 status = pvm_send(tid, eor_tag);
4926 pvm_perror(
"pvm_send");
4930 pvmc[
j].eor_sent =
TRUE;
4933 timeout.tv_sec = 60;
4934 timeout.tv_usec = 0;
4936 bufid = pvm_trecv(tid, -1, &timeout);
4938 pvm_perror(
"pvm_recv");
4942 printf(
"Timeout receiving EOR request, aborting analyzer.\n");
4946 status = pvm_bufinfo(bufid, &len, &tag, &tid);
4948 pvm_perror(
"pvm_bufinfo");
4952 PVM_DEBUG(
"\nGot %d bytes", len);
4954 tst_buf = malloc(len);
4955 pvm_upkbyte((
char *) tst_buf, len, 1);
4958 for (
i = 0;
i < (int) (len /
sizeof(
ANA_TEST));
i++) {
4961 size =
sizeof(
DWORD);
4972 for (
j = 0;
j < pvm_n_task;
j++)
4973 if (!pvmc[
j].eor_sent)
4976 }
while (
j < pvm_n_task);
4992 if (strchr(
str,
'%') != NULL)
5006 if (strncmp(ext,
".gz", 3) == 0) {
5015 if (strncmp(ext,
".asc", 4) == 0)
5017 else if (strncmp(ext,
".mid", 4) == 0)
5019 else if (strncmp(ext,
".rz", 3) == 0)
5023 "Unknown output data format. Please use file extension .asc, .mid or .rz.\n");
5029 if (pvm_n_task <= 10) {
5030 for (
i = 0;
i < pvm_n_task;
i++)
5031 sprintf(fn[
i],
"n%d.rz",
i);
5035 for (
i = 0;
i <= pvm_n_task / 10;
i++) {
5036 for (
j = 0;
j < 10 &&
j +
i * 10 < pvm_n_task;
j++)
5037 sprintf(fn[
j],
"n%d.rz",
j +
i * 10);
5039 sprintf(
str,
"t%d.rz",
i);
5040 printf(
"Merging %d files to %s:\n",
j,
str);
5043 for (
i = 0;
i <= pvm_n_task / 10;
i++)
5044 sprintf(fn[
i],
"t%d.rz",
i);
5046 printf(
"Merging %d files to %s:\n",
i,
file_name);
5062#if defined ( OS_UNIX )
5064#define THREADTYPE void
5066#if defined( OS_WINNT )
5067#define THREADRETURN 0
5068#define THREADTYPE DWORD WINAPI
5073TFolder *ReadFolderPointer(TSocket * fSocket)
5080 return (TFolder *) p;
5085THREADTYPE root_server_thread(
void *arg)
5092 TSocket *sock = (TSocket *) arg;
5101 return THREADRETURN;
5105 TMessage *
message =
new TMessage(kMESS_OBJECT);
5107 if (strcmp(
request,
"GetListOfFolders") == 0) {
5109 TFolder *folder = ReadFolderPointer(sock);
5110 if (folder == NULL) {
5119 TObjArray *names =
new TObjArray(100);
5121 TCollection *folders = folder->GetListOfFolders();
5122 TIterator *iterFolders = folders->MakeIterator();
5123 while ((obj = iterFolders->Next()) != NULL)
5124 names->Add(
new TObjString(obj->GetName()));
5131 for (
int i = 0;
i < names->GetLast() + 1;
i++)
5132 delete(TObjString *) names->At(
i);
5138 }
else if (strncmp(
request,
"FindObject", 10) == 0) {
5140 TFolder *folder = ReadFolderPointer(sock);
5144 if (strncmp(
request + 10,
"Any", 3) == 0)
5145 obj = folder->FindObjectAny(
request + 14);
5147 obj = folder->FindObject(
request + 11);
5151 sock->Send(
"Error");
5159 }
else if (strncmp(
request,
"FindFullPathName", 16) == 0) {
5161 TFolder *folder = ReadFolderPointer(sock);
5164 const char *path = folder->FindFullPathName(
request + 17);
5168 sock->Send(
"Error");
5170 TObjString *obj =
new TObjString(path);
5178 }
else if (strncmp(
request,
"Occurence", 9) == 0) {
5180 TFolder *folder = ReadFolderPointer(sock);
5185 TObject *obj = ((TObject *) m->ReadObject(m->GetClass()));
5188 Int_t retValue = folder->Occurence(obj);
5197 }
else if (strncmp(
request,
"GetPointer", 10) == 0) {
5200 TObject *obj = gROOT->FindObjectAny(
request + 11);
5210 }
else if (strncmp(
request,
"Command", 7) == 0) {
5211 char objName[100], method[100];
5212 sock->Recv(objName,
sizeof(objName));
5213 sock->Recv(method,
sizeof(method));
5214 TObject *
object = gROOT->FindObjectAny(objName);
5215 if (
object && object->InheritsFrom(TH1::Class())
5216 && strcmp(method,
"Reset") == 0)
5217 static_cast < TH1 *
>(
object)->Reset();
5219 }
else if (strncmp(
request,
"SetCut", 6) == 0) {
5228 TCutG *newc = ((TCutG *) m->ReadObject(m->GetClass()));
5231 cm_msg(
MINFO,
"root server thread",
"changing cut %s", newc->GetName());
5232 newc->TAttMarker::Copy(*cut);
5233 newc->TAttFill::Copy(*cut);
5234 newc->TAttLine::Copy(*cut);
5235 newc->TNamed::Copy(*cut);
5236 cut->Set(newc->GetN());
5237 for (
int i = 0;
i < cut->GetN(); ++
i) {
5238 cut->SetPoint(
i, newc->GetX()[
i], newc->GetY()[
i]);
5241 cm_msg(
MERROR,
"root server thread",
"ignoring receipt of unknown cut %s",
5247 printf(
"SocketServer: Received unknown command \"%s\"\n",
request);
5251 return THREADRETURN;
5256THREADTYPE root_socket_server(
void *arg)
5262 port = *(
int *) arg;
5264 printf(
"Root server listening on port %d...\n", port);
5265 TServerSocket *lsock =
new TServerSocket(port, kTRUE);
5268 TSocket *sock = lsock->Accept();
5272#if defined ( OS_LINUX )
5273 TThread *
thread =
new TThread(
"Server", root_server_thread, sock);
5276#if defined( _MSC_VER )
5277 LPDWORD lpThreadId = 0;
5278 CloseHandle(CreateThread(NULL, 1024, &root_server_thread, sock, 0, lpThreadId));
5282 return THREADRETURN;
5287void start_root_socket_server(
int port)
5289 static int pport = port;
5290#if defined ( OS_LINUX )
5291 TThread *
thread =
new TThread(
"server_loop", root_socket_server, &pport);
5294#if defined( _MSC_VER )
5295 LPDWORD lpThreadId = 0;
5296 CloseHandle(CreateThread(NULL, 1024, &root_socket_server, &pport, 0, lpThreadId));
5302void *root_event_loop(
void *arg)
5312 gSystem->ExitLoop();
5331 for (
i = 0;
i < argc;
i++) {
5332 strcat(
str, argv[
i]);
5335 PVM_DEBUG(
"Analyzer started: %s",
str);
5340 char *argp = (
char *) argv[0];
5342 manaApp =
new TRint(
"ranalyzer", &argn, &argp, NULL, 0,
true);
5345 clp.root_port = 9090;
5350 sizeof(
clp.exp_name));
5364 printf(
"Becoming a daemon...\n");
5370 if (
clp.pvm_buf_size == 0)
5371 clp.pvm_buf_size = 512 * 1024;
5373 clp.pvm_buf_size *= 1024;
5375 printf(
"Buffer size cannot be larger than %dkB\n",
PVM_BUFFER_SIZE / 1024);
5380 clp.online = (
clp.input_file_name[0][0] == 0);
5396 if (
clp.host_name[0])
5397 printf(
"Connect to experiment %s on host %s...",
clp.exp_name,
clp.host_name);
5399 printf(
"Connect to experiment %s...",
clp.exp_name);
5407 printf(
"\nError: Experiment \"%s\" not defined.\n",
clp.exp_name);
5408 if (getenv(
"MIDAS_DIR")) {
5410 (
"Note that \"MIDAS_DIR\" is defined, which results in a single experiment\n");
5412 (
"called \"Default\". If you want to use the \"exptab\" file, undefine \"MIDAS_DIR\".\n");
5417 printf(
"\nError: %s\n", s.c_str());
5437 printf(
"An analyzer named \"%s\" is already running in this experiment.\n",
5440 (
"Please select another analyzer name in analyzer.c or stop other analyzer.\n");
5449 printf(
"Failed to start local RPC server");
5464 printf(
"Previous analyzer stopped\n");
5503 gROOT->GetRootFolder()->AddFolder(
"histos",
"MIDAS Analyzer Histograms");
5518 start_root_socket_server(
clp.root_port);
5540 strcpy(
str,
"OFLN");
5542 printf(
"\nGLOBAL MEMORY NAME = %s\n",
"OFLN");
5585 PVM_DEBUG(
"Analyzer stopped");
5592 disable_shm_write =
TRUE;
INT bk_close(void *event, void *pdata)
INT bk_iterate32a(const void *event, BANK32A **pbk32a, void *pdata)
INT bk_swap(void *event, BOOL force)
BOOL bk_is32a(const void *event)
BOOL bk_is32(const void *event)
INT bk_iterate32(const void *event, BANK32 **pbk, void *pdata)
void bk_init(void *event)
INT bk_iterate(const void *event, BANK **pbk, void *pdata)
void bk_init32(void *event)
void bk_create(void *event, const char *name, WORD type, void **pdata)
INT bk_size(const void *event)
INT bm_open_buffer(const char *buffer_name, INT buffer_size, INT *buffer_handle)
INT bm_delete_request(INT request_id)
INT bm_request_event(HNDLE buffer_handle, short int event_id, short int trigger_mask, INT sampling_type, HNDLE *request_id, EVENT_HANDLER *func)
INT bm_set_cache_size(INT buffer_handle, size_t read_size, size_t write_size)
INT cm_register_transition(INT transition, INT(*func)(INT, char *), INT sequence_number)
INT cm_shutdown(const char *name, BOOL bUnique)
INT cm_yield(INT millisec)
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
INT cm_register_function(INT id, INT(*func)(INT, void **))
INT cm_connect_experiment1(const char *host_name, const char *default_exp_name, const char *client_name, void(*func)(char *), INT odb_size, DWORD watchdog_timeout)
INT cm_cleanup(const char *client_name, BOOL ignore_timeout)
INT cm_disconnect_experiment(void)
INT cm_get_environment(char *host_name, int host_name_size, char *exp_name, int exp_name_size)
INT cm_set_watchdog_params(BOOL call_watchdog, DWORD timeout)
INT cm_exist(const char *name, BOOL bUnique)
#define DB_NO_MORE_SUBKEYS
#define SS_INVALID_FORMAT
#define VALIGN(adr, align)
std::string ss_gethostname()
INT ss_get_struct_align()
INT ss_getchar(BOOL reset)
INT ss_daemon_init(BOOL keep_stdout)
INT ss_sleep(INT millisec)
std::string cm_get_error(INT code)
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
BOOL equal_ustring(const char *str1, const char *str2)
INT db_delete_key(HNDLE hDB, HNDLE hKey, BOOL follow_links)
INT db_send_changed_records()
INT db_get_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, void *data, INT *buf_size, DWORD type, BOOL create)
INT db_open_record(HNDLE hDB, HNDLE hKey, void *ptr, INT rec_size, WORD access_mode, void(*dispatcher)(INT, INT, void *), void *info)
INT db_paste_xml(HNDLE hDB, HNDLE hKeyRoot, const char *buffer)
std::string strcomb1(const char **list)
INT db_get_record1(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, INT align, const char *rec_str)
INT db_get_record_size(HNDLE hDB, HNDLE hKey, INT align, INT *buf_size)
INT db_get_data(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, DWORD type)
INT db_check_record(HNDLE hDB, HNDLE hKey, const char *keyname, const char *rec_str, BOOL correct)
INT db_set_mode(HNDLE hDB, HNDLE hKey, WORD mode, BOOL recurse)
INT db_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
INT db_load(HNDLE hDB, HNDLE hKeyRoot, const char *filename, BOOL bRemote)
INT db_set_data_index(HNDLE hDB, HNDLE hKey, const void *data, INT data_size, INT idx, DWORD type)
INT db_paste(HNDLE hDB, HNDLE hKeyRoot, const char *buffer)
INT db_set_data(HNDLE hDB, HNDLE hKey, const void *data, INT buf_size, INT num_values, DWORD type)
INT db_sprintf(char *string, const void *data, INT data_size, INT idx, DWORD type)
INT db_set_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, const void *data, INT data_size, INT num_values, DWORD type)
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
INT db_set_record(HNDLE hDB, HNDLE hKey, void *data, INT buf_size, INT align)
INT db_enum_key(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
INT db_close_record(HNDLE hDB, HNDLE hKey)
INT db_sscanf(const char *data_str, void *data, INT *data_size, INT i, DWORD tid)
const char * rpc_tid_name(INT id)
#define RPC_ANA_CLEAR_HISTOS
#define HRGET(A1, A2, A3)
#define HROPEN(A1, A2, A3, A4, A5, A6)
#define HBNAME(A1, A2, A3, A4)
#define HROUT(A1, A2, A3)
#define HBSET(A1, A2, A3)
#define HBOOKN(A1, A2, A3, A4, A5, A6)
#define HRPUT(A1, A2, A3)
char config_file_name[10][256]
INT write_event_odb(EVENT_HEADER *pevent)
char exp_name[NAME_LENGTH]
void register_requests(void)
char output_file_name[256]
static int sys_max_event_size
INT ana_begin_of_run(INT run_number, char *error)
static struct @2 last_time_event[50]
EVENT_DEF * db_get_event_definition(short int event_id)
INT ana_resume_run(INT run_number, char *error)
ANALYZE_REQUEST * _current_par
INT init_module_parameters(BOOL bclose)
#define ANALYZER_STATS_STR
void update_request(HNDLE hDB, HNDLE hKey, void *info)
INT write_event_ascii(FILE *file, EVENT_HEADER *pevent, ANALYZE_REQUEST *par)
INT tr_stop(INT rn, char *error)
INT tr_start(INT rn, char *error)
const char * analyzer_name
int ma_close(MA_FILE *file)
INT write_event_midas(FILE *file, EVENT_HEADER *pevent, ANALYZE_REQUEST *par)
INT tr_pause(INT rn, char *error)
BOOL debug
debug printouts
static struct @1 clp_descrip[]
int ma_read_event(MA_FILE *file, EVENT_HEADER *pevent, int size)
INT ana_pause_run(INT run_number, char *error)
INT ana_end_of_run(INT run_number, char *error)
char input_file_name[10][256]
void test_register(ANA_TEST *t)
#define ANALYZER_REQUEST_STR
void banks_changed(INT hDB, INT hKey, void *info)
void correct_num_events(INT i)
INT bor(INT run_number, char *error)
ANALYZE_REQUEST analyze_request[]
INT analyze_run(INT run_number, char *input_file_name, char *output_file_name)
void odb_load(EVENT_HEADER *pevent)
INT tr_resume(INT rn, char *error)
INT getparam(int argc, char **argv)
INT eor(INT run_number, char *error)
INT process_event(ANALYZE_REQUEST *par, EVENT_HEADER *pevent)
MA_FILE * ma_open(char *file_name)
INT load_parameters(INT run_number)
void receive_event(HNDLE buffer_handle, HNDLE request_id, EVENT_HEADER *pheader, void *pevent)
void test_write(int delta_time)
char host_name[HOST_NAME_LENGTH]
void add_data_dir(char *result, char *file)
INT bm_get_buffer_level(INT buffer_handle, INT *n_bytes)
#define DIR_SEPARATOR_STR
#define DEFAULT_WATCHDOG_TIMEOUT
void EXPRT close_subfolder(void)
#define ANA_OUTPUT_INFO_STR
#define DEFAULT_RPC_TIMEOUT
void EXPRT open_subfolder(const char *name)
#define DEFAULT_MAX_EVENT_SIZE
#define DEFAULT_BUFFER_SIZE
#define message(type, str)
static char * skip(char **buf, const char *delimiters)
TObjArray * gHistoFolderStack
TFolder * gManaHistosFolder
TCutG * cut_book(const char *name)
char global_memory_name[8]
char histo_dump_filename[256]
char last_histo_filename[256]
struct ANALYZE_REQUEST::@9 number
INT(* analyzer)(EVENT_HEADER *, void *)
char event_name[NAME_LENGTH]
char client_name[NAME_LENGTH]