[3] | 1 | /*******************************************************************************
|
---|
| 2 | * *
|
---|
| 3 | * mcfio_Direct.c -- Utility routines for the McFast Monte-Carlo *
|
---|
| 4 | * Direct Access I/O core routines *
|
---|
| 5 | * *
|
---|
| 6 | * Copyright (c) 1994 Universities Research Association, Inc. *
|
---|
| 7 | * All rights reserved. *
|
---|
| 8 | * *
|
---|
| 9 | * This material resulted from work developed under a Government Contract and *
|
---|
| 10 | * is subject to the following license: The Government retains a paid-up, *
|
---|
| 11 | * nonexclusive, irrevocable worldwide license to reproduce, prepare derivative *
|
---|
| 12 | * works, perform publicly and display publicly by or for the Government, *
|
---|
| 13 | * including the right to distribute to other Government contractors. Neither *
|
---|
| 14 | * the United States nor the United States Department of Energy, nor any of *
|
---|
| 15 | * their employees, makes any warranty, express or implied, or assumes any *
|
---|
| 16 | * legal liability or responsibility for the accuracy, completeness, or *
|
---|
| 17 | * usefulness of any information, apparatus, product, or process disclosed, or *
|
---|
| 18 | * represents that its use would not infringe privately owned rights. *
|
---|
| 19 | * *
|
---|
| 20 | * *
|
---|
| 21 | * Written by Paul Lebrun *
|
---|
| 22 | * *
|
---|
| 23 | * *
|
---|
| 24 | *******************************************************************************/
|
---|
| 25 | #include <stdio.h>
|
---|
| 26 | #include <string.h>
|
---|
| 27 | #include <sys/param.h>
|
---|
| 28 | #include <rpc/types.h>
|
---|
| 29 | #include <sys/types.h>
|
---|
| 30 | #include <sys/stat.h>
|
---|
| 31 | #include <rpc/xdr.h>
|
---|
| 32 | #include <limits.h>
|
---|
| 33 | #include <stdlib.h>
|
---|
| 34 | #include <unistd.h>
|
---|
| 35 | #include <time.h>
|
---|
| 36 | #include <sys/mman.h>
|
---|
| 37 | #include <fcntl.h>
|
---|
| 38 | #ifdef SUNOS
|
---|
| 39 | #include <floatingpoint.h>
|
---|
| 40 | #else /* SUNOS */
|
---|
| 41 | #include <float.h>
|
---|
| 42 | #endif /* SUNOS */
|
---|
| 43 | #include "mcf_nTupleDescript.h"
|
---|
| 44 | #include "mcf_xdr.h"
|
---|
| 45 | #include "mcfio_Dict.h"
|
---|
| 46 | #include "mcfio_Util1.h"
|
---|
| 47 | #include "mcfio_Direct.h"
|
---|
| 48 | #include "mcfio_Sequential.h"
|
---|
| 49 | #include "mcf_NTuIOFiles.h"
|
---|
| 50 | #include "mcf_NTuIOUtils.h"
|
---|
| 51 | #ifndef FALSE
|
---|
| 52 | #define FALSE 0
|
---|
| 53 | #endif
|
---|
| 54 | #ifndef TRUE
|
---|
| 55 | #define TRUE 1
|
---|
| 56 | #endif
|
---|
| 57 | #ifndef MAP_FILE
|
---|
| 58 | #define MAP_FILE 0
|
---|
| 59 | #endif
|
---|
| 60 |
|
---|
| 61 | extern nTuDDL **NTuDDLList;
|
---|
| 62 | extern int NumOfNTuples;
|
---|
| 63 |
|
---|
| 64 |
|
---|
| 65 | /* Static routine used in this module */
|
---|
| 66 |
|
---|
| 67 | static int mcfioC_gofornextevent(mcfStream *str);
|
---|
| 68 | static int mcfioC_nextspecevt(mcfStream *str, int inum, int istore,
|
---|
| 69 | int irun, int itrig);
|
---|
| 70 | static int openReadDirect(char*filename, int mode);
|
---|
| 71 |
|
---|
| 72 |
|
---|
| 73 | int mcfioC_OpenReadDirect(char *filename)
|
---|
| 74 | {
|
---|
| 75 | /*
|
---|
| 76 | ** Routine to open and read the header file for a Direct access Stream,
|
---|
| 77 | ** Standard Unix I/O
|
---|
| 78 | */
|
---|
| 79 | return openReadDirect(filename, MCFIO_DIRECT);
|
---|
| 80 | }
|
---|
| 81 |
|
---|
| 82 | int mcfioC_OpenReadMapped(char *filename)
|
---|
| 83 | {
|
---|
| 84 | /*
|
---|
| 85 | ** Routine to open and read the header file for a Direct access Stream,
|
---|
| 86 | ** Standard Unix I/O
|
---|
| 87 | */
|
---|
| 88 | return openReadDirect(filename, MCFIO_MEMMAPPED);
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | static int openReadDirect(char *filename, int mode)
|
---|
| 92 | /*
|
---|
| 93 | ** Routine to open and read the header file for a Direct access Stream.
|
---|
| 94 | */
|
---|
| 95 | {
|
---|
| 96 | int i, j, jstr, idtmp, ntot, ll1, jdRef, oldNumOfNTuples;
|
---|
| 97 | int iff;
|
---|
| 98 | u_int p1, p2;
|
---|
| 99 | FILE *ff;
|
---|
| 100 | mcfStream *str;
|
---|
| 101 | nTuDDL *ddl, *ddlRef;
|
---|
| 102 | struct stat statbuf;
|
---|
| 103 | char *srcFile;
|
---|
| 104 |
|
---|
| 105 |
|
---|
| 106 | if (McfStreamPtrList == NULL) mcfioC_Init();
|
---|
| 107 |
|
---|
| 108 | if (McfNumOfStreamActive >= MCF_STREAM_NUM_MAX) {
|
---|
| 109 | fprintf(stderr,
|
---|
| 110 | " mcfio_OpenReadDirect: Too many streams opened simultaneously.\n");
|
---|
| 111 | return -1;
|
---|
| 112 | }
|
---|
| 113 | jstr = -1; i=0;
|
---|
| 114 | while ((jstr == -1) && (i<MCF_STREAM_NUM_MAX)) {
|
---|
| 115 | if (McfStreamPtrList[i] == NULL) jstr=i;
|
---|
| 116 | i++;
|
---|
| 117 | }
|
---|
| 118 | if(jstr == -1) {
|
---|
| 119 | fprintf(stderr,
|
---|
| 120 | " mcfio_OpenReadDirect: Internal error, please report \n");
|
---|
| 121 | return -1;
|
---|
| 122 | }
|
---|
| 123 | if ((filename == NULL) || (strlen(filename) > 255)) {
|
---|
| 124 | fprintf(stderr,
|
---|
| 125 | " mcfio_OpenReadDirect: You must give a valid UNIX filename.\n");
|
---|
| 126 | return -1;
|
---|
| 127 | }
|
---|
| 128 | /*
|
---|
| 129 | ** Now we can try to open this file....
|
---|
| 130 | */
|
---|
| 131 | if (mode == MCFIO_DIRECT) {
|
---|
| 132 | ff = fopen(filename, "r");
|
---|
| 133 | if (ff == NULL) {
|
---|
| 134 | fprintf(stderr,
|
---|
| 135 | " mcfio_OpenReadDirect: Problem opening file %s, message \n", filename);
|
---|
| 136 | perror ("mcfio_OpenReadDirect");
|
---|
| 137 | return -1;
|
---|
| 138 | }
|
---|
| 139 | } else {
|
---|
| 140 | /*
|
---|
| 141 | ** Using memory mapped i/o
|
---|
| 142 | */
|
---|
| 143 | iff = open(filename, O_RDONLY);
|
---|
| 144 | if (iff < 0) {
|
---|
| 145 | fprintf(stderr,
|
---|
| 146 | " mcfio_OpenReadMapped: Problem opening file %s, message \n", filename);
|
---|
| 147 | perror ("mcfio_OpenReadMapped");
|
---|
| 148 | return -1;
|
---|
| 149 | }
|
---|
| 150 | }
|
---|
| 151 | McfStreamPtrList[jstr] = (mcfStream *) malloc(sizeof(mcfStream));
|
---|
| 152 | str = McfStreamPtrList[jstr];
|
---|
| 153 | str->xdr = (XDR *) malloc(sizeof(XDR));
|
---|
| 154 | str->id = jstr+1;
|
---|
| 155 | str->row = MCFIO_READ;
|
---|
| 156 | str->dos = mode;
|
---|
| 157 | str->numWordsC = 0;
|
---|
| 158 | str->numWordsT = 0;
|
---|
| 159 | ll1 = strlen(filename) + 1;
|
---|
| 160 | str->filename = (char *) malloc(sizeof(char) * ll1);
|
---|
| 161 | strcpy(str->filename,filename);
|
---|
| 162 | if (mode == MCFIO_DIRECT) {
|
---|
| 163 | str->filePtr = ff;
|
---|
| 164 | xdrstdio_create(str->xdr, ff, XDR_DECODE);
|
---|
| 165 | str->fileDescr = 0;
|
---|
| 166 | str->fileAddr = NULL;
|
---|
| 167 | str->fileLen = 0;
|
---|
| 168 | } else {
|
---|
| 169 | /*
|
---|
| 170 | ** Use memory mapped I/O
|
---|
| 171 | */
|
---|
| 172 | if (fstat(iff, &statbuf) < 0) {
|
---|
| 173 | fprintf (stderr,
|
---|
| 174 | " mcfio_OpenReadMapped: Problem getting file length for %s \n", filename);
|
---|
| 175 | perror ("mcfio_OpenReadMapped");
|
---|
| 176 | return -1;
|
---|
| 177 | }
|
---|
| 178 | if ((srcFile =
|
---|
| 179 | mmap(0, statbuf.st_size, PROT_READ, MAP_FILE | MAP_SHARED, iff, 0 ))
|
---|
| 180 | == (caddr_t) -1) {
|
---|
| 181 | fprintf (stderr,
|
---|
| 182 | " mcfio_OpenReadMapped: Problem with memory mapping for %s \n", filename);
|
---|
| 183 | perror ("mcfio_OpenReadMapped");
|
---|
| 184 | return -1;
|
---|
| 185 | }
|
---|
| 186 | str->filePtr = (FILE *) NULL;
|
---|
| 187 | str->fileDescr = iff;
|
---|
| 188 | str->fileAddr = srcFile;
|
---|
| 189 | str->fileLen = (size_t) statbuf.st_size;
|
---|
| 190 | xdrmem_create(str->xdr, srcFile, statbuf.st_size, XDR_DECODE);
|
---|
| 191 | }
|
---|
| 192 | str->device = NULL;
|
---|
| 193 | str->vsn = NULL;
|
---|
| 194 | str->filenumber = -1;
|
---|
| 195 | str->minlrec = -1;
|
---|
| 196 | str->maxlrec = -1;
|
---|
| 197 | str->shead = NULL;
|
---|
| 198 | str->ehead = NULL;
|
---|
| 199 | str->table = NULL;
|
---|
| 200 | str->buffer = NULL;
|
---|
| 201 | str->buffer2 = NULL;
|
---|
| 202 | p1 = xdr_getpos(str->xdr);
|
---|
| 203 | str->firstPos = p1;
|
---|
| 204 | str->status = MCFIO_BOF;
|
---|
| 205 | str->fhead = NULL;
|
---|
| 206 | oldNumOfNTuples = NumOfNTuples;
|
---|
| 207 | if (xdr_mcfast_fileheader(str->xdr, &idtmp,
|
---|
| 208 | &ntot, McfGenericVersion, &(str->fhead), str->id) == FALSE) {
|
---|
| 209 | fprintf (stderr,
|
---|
| 210 | "mcfio_OpenReadDirect: Unable to decode fileheader \n");
|
---|
| 211 | mcfioC_FreeStream(&McfStreamPtrList[jstr]);
|
---|
| 212 | mcfioC_Close(jstr+1);
|
---|
| 213 | return -1;
|
---|
| 214 | }
|
---|
| 215 | if (idtmp != FILEHEADER) {
|
---|
| 216 | fprintf (stderr,
|
---|
| 217 | "mcfio_OpenReadDirect: First Structure not the header \n");
|
---|
| 218 |
|
---|
| 219 | fprintf (stderr,
|
---|
| 220 | " : Further accesses probably suspicious \n");
|
---|
| 221 | mcfioC_FreeStream(&McfStreamPtrList[jstr]);
|
---|
| 222 | mcfioC_Close(jstr+1);
|
---|
| 223 | return -1;
|
---|
| 224 | }
|
---|
| 225 | p2 = xdr_getpos(str->xdr);
|
---|
| 226 | str->numWordsC += (ntot/4);
|
---|
| 227 | /*
|
---|
| 228 | ** Check if new these Ntuple template are not reference, if so,
|
---|
| 229 | ** set the reference pointer accordingly, conversely, recompute the
|
---|
| 230 | ** offsets and length if requested. We also fill the sequential
|
---|
| 231 | ** id number for the descriptors. Note: those are trivial for
|
---|
| 232 | ** input streams, but we still fill them for consitency.
|
---|
| 233 | */
|
---|
| 234 | for (i=0; i<str->fhead->nNTuples; i++) {
|
---|
| 235 | ddl = mcf_GetNTuByPtrID((oldNumOfNTuples+i+1));
|
---|
| 236 | if (ddl == NULL) continue;
|
---|
| 237 | ddl->streamId = (jstr+1);
|
---|
| 238 | ddl->seqNTuId = (i+1);
|
---|
| 239 | if (ddl->descrNtu == NULL) {
|
---|
| 240 | for (j=0, jdRef=1; j<i; j++, jdRef++) {
|
---|
| 241 | if (jdRef == ddl->referenceId) {
|
---|
| 242 | ddlRef = mcf_GetNTuByPtrID((oldNumOfNTuples+j+1));
|
---|
| 243 | /*
|
---|
| 244 | ** back up in the linked list if need be, until we
|
---|
| 245 | ** a fully documented descriptor.
|
---|
| 246 | */
|
---|
| 247 | while (ddlRef->descrNtu == NULL) ddlRef = ddlRef->reference;
|
---|
| 248 | ddl->reference = ddlRef;
|
---|
| 249 | break;
|
---|
| 250 | }
|
---|
| 251 | }
|
---|
| 252 | } else {
|
---|
| 253 | if (McfNTuPleSaveDecoding == TRUE) {
|
---|
| 254 | mcf_ComputeNTuOffsets(ddl);
|
---|
| 255 | mcf_ComputeNTuLengths(ddl);
|
---|
| 256 | }
|
---|
| 257 | }
|
---|
| 258 | }
|
---|
| 259 | str->currentPos = p2;
|
---|
| 260 | str->fhead->firstTable = p2;
|
---|
| 261 | /* presumably correct , assume standard direct acces file config. */
|
---|
| 262 | str->numWordsT += ((p2-p1)/4);
|
---|
| 263 | str->status = MCFIO_RUNNING;
|
---|
| 264 | str->table = (mcfxdrEventTable *) malloc(sizeof(mcfxdrEventTable));
|
---|
| 265 | str->table->nextLocator = -1;
|
---|
| 266 | str->table->dim = str->fhead->dimTable;
|
---|
| 267 | str->table->numevts = 0;
|
---|
| 268 | str->table->previousnumevts = 0;
|
---|
| 269 | str->table->evtnums = NULL;
|
---|
| 270 | str->table->storenums = NULL;
|
---|
| 271 | str->table->runnums = NULL;
|
---|
| 272 | str->table->trigMasks = NULL;
|
---|
| 273 | str->table->ptrEvents = NULL;
|
---|
| 274 | str->ehead = (mcfxdrEventHeader *) malloc(sizeof(mcfxdrEventHeader));
|
---|
| 275 | str->ehead->dimBlocks = str->fhead->nBlocks;
|
---|
| 276 | str->ehead->blockIds = NULL;
|
---|
| 277 | str->ehead->ptrBlocks = NULL;
|
---|
| 278 | str->ehead->dimNTuples = str->fhead->nNTuples;
|
---|
| 279 | str->ehead->nTupleIds = NULL;
|
---|
| 280 | str->ehead->ptrNTuples = NULL;
|
---|
| 281 | McfNumOfStreamActive++;
|
---|
| 282 | return (jstr+1);
|
---|
| 283 | }
|
---|
| 284 |
|
---|
| 285 | int mcfioC_OpenWriteDirect(char *filename, char *title, char *comment,
|
---|
| 286 | int numevts_pred, int *blkIds, u_int nBlocks)
|
---|
| 287 |
|
---|
| 288 | /*
|
---|
| 289 | ** Routine to open and write the header file for a Direct access Stream.
|
---|
| 290 | */
|
---|
| 291 | {
|
---|
| 292 | int i, jstr;
|
---|
| 293 | u_int p1;
|
---|
| 294 | FILE *ff;
|
---|
| 295 | mcfStream *str;
|
---|
| 296 |
|
---|
| 297 | if (McfStreamPtrList == NULL) {
|
---|
| 298 | fprintf(stderr,
|
---|
| 299 | " mcfio_OpenWriteDirect: We will first initialize by calling mcfio_Init.\n");
|
---|
| 300 | mcfioC_Init();
|
---|
| 301 | }
|
---|
| 302 | if (McfNumOfStreamActive >= MCF_STREAM_NUM_MAX) {
|
---|
| 303 | fprintf(stderr,
|
---|
| 304 | " mcfio_OpenWriteDirect: Too many streams opened simultaneously.\n");
|
---|
| 305 | return -1;
|
---|
| 306 | }
|
---|
| 307 | jstr = -1; i=0;
|
---|
| 308 | while ((jstr == -1) && (i<MCF_STREAM_NUM_MAX)) {
|
---|
| 309 | if (McfStreamPtrList[i] == NULL) jstr=i;
|
---|
| 310 | i++;
|
---|
| 311 | }
|
---|
| 312 | if(jstr == -1) {
|
---|
| 313 | fprintf(stderr,
|
---|
| 314 | " mcfio_OpenWriteDirect: Internal error, please report \n");
|
---|
| 315 | return -1;
|
---|
| 316 | }
|
---|
| 317 | if ((filename == NULL) || (strlen(filename) > 255)) {
|
---|
| 318 | fprintf(stderr,
|
---|
| 319 | " mcfio_OpenWriteDirect: You must give a valid UNIX filename.\n");
|
---|
| 320 | return -1;
|
---|
| 321 | }
|
---|
| 322 | if ((title != NULL) && (strlen(title) > 255)) {
|
---|
| 323 | fprintf(stderr,
|
---|
| 324 | " mcfio_OpenWriteDirect: Title is too long\n");
|
---|
| 325 | return -1;
|
---|
| 326 | }
|
---|
| 327 |
|
---|
| 328 | if ((comment != NULL) && (strlen(comment) > 255)) {
|
---|
| 329 | fprintf(stderr,
|
---|
| 330 | " mcfio_OpenWriteDirect: comment is too long\n");
|
---|
| 331 | return -1;
|
---|
| 332 | }
|
---|
| 333 |
|
---|
| 334 | /*
|
---|
| 335 | ** Now we can try to open this file....
|
---|
| 336 | */
|
---|
| 337 | ff = fopen(filename, "w");
|
---|
| 338 | if (ff == NULL) {
|
---|
| 339 | fprintf(stderr,
|
---|
| 340 | " mcfio_OpenWriteDirect: Problem opening file %s, message \n", filename);
|
---|
| 341 | perror ("mcfio_OpenWriteDirect");
|
---|
| 342 | return -1;
|
---|
| 343 | }
|
---|
| 344 | McfStreamPtrList[jstr] = (mcfStream *) malloc(sizeof(mcfStream));
|
---|
| 345 | str = McfStreamPtrList[jstr];
|
---|
| 346 | str->xdr = (XDR *) malloc(sizeof(XDR));
|
---|
| 347 | str->id = jstr+1;
|
---|
| 348 | str->row = MCFIO_WRITE;
|
---|
| 349 | str->dos = MCFIO_DIRECT;
|
---|
| 350 | str->numWordsC = 0;
|
---|
| 351 | str->numWordsT = 0;
|
---|
| 352 | str->filename = (char *) malloc(sizeof(char) * ( strlen(filename) +1) );
|
---|
| 353 | strcpy(str->filename,filename);
|
---|
| 354 | str->filePtr = ff;
|
---|
| 355 | str->device = NULL;
|
---|
| 356 | str->vsn = NULL;
|
---|
| 357 | str->filenumber = -1;
|
---|
| 358 | str->minlrec = -1;
|
---|
| 359 | str->maxlrec = -1;
|
---|
| 360 | str->shead = NULL;
|
---|
| 361 | str->ehead = NULL;
|
---|
| 362 | str->table = NULL;
|
---|
| 363 | str->buffer = NULL;
|
---|
| 364 | str->buffer2 = NULL;
|
---|
| 365 | xdrstdio_create(str->xdr, ff, XDR_ENCODE);
|
---|
| 366 | p1 = xdr_getpos(str->xdr);
|
---|
| 367 | str->firstPos = p1;
|
---|
| 368 | str->currentPos = p1;
|
---|
| 369 | str->status = MCFIO_BOF;
|
---|
| 370 | str->fhead = (mcfxdrFileHeader *) malloc(sizeof(mcfxdrFileHeader));
|
---|
| 371 | /*
|
---|
| 372 | ** Fill the file header, additional info will be written on tape
|
---|
| 373 | */
|
---|
| 374 | if (title == NULL) strcpy(str->fhead->title,"No Title given");
|
---|
| 375 | else strcpy(str->fhead->title,title);
|
---|
| 376 |
|
---|
| 377 | if (comment == NULL) strcpy(str->fhead->comment,"No comment");
|
---|
| 378 | else strcpy(str->fhead->comment, comment);
|
---|
| 379 | str->fhead->numevts_expect = numevts_pred;
|
---|
| 380 | str->fhead->numevts = 0;
|
---|
| 381 | /*
|
---|
| 382 | ** Futur expansion : make this a tunable parameter.
|
---|
| 383 | */
|
---|
| 384 | str->fhead->dimTable = MCF_DEFAULT_TABLE_SIZE;
|
---|
| 385 | str->fhead->firstTable = -1;
|
---|
| 386 | str->fhead->nBlocks = nBlocks;
|
---|
| 387 | if (nBlocks > 0) {
|
---|
| 388 | str->fhead->blockIds = (int *) malloc(sizeof(int) * nBlocks);
|
---|
| 389 | str->fhead->blockNames = (char**) malloc(sizeof(char *) * nBlocks);
|
---|
| 390 | } else {
|
---|
| 391 | str->fhead->blockIds = NULL;
|
---|
| 392 | str->fhead->blockNames = NULL;
|
---|
| 393 | }
|
---|
| 394 | for (i=0; i<nBlocks; i++) {
|
---|
| 395 | str->fhead->blockIds[i] = blkIds[i];
|
---|
| 396 | str->fhead->blockNames[i] =
|
---|
| 397 | (char *) malloc(sizeof(char) * (MCF_XDR_B_TITLE_LENGTH + 1));
|
---|
| 398 | mcfioC_GetBlockName(blkIds[i], str->fhead->blockNames[i]);
|
---|
| 399 | }
|
---|
| 400 | str->fhead->nNTuples = 0; /* Will be filled later */
|
---|
| 401 | if (mcfioC_Wrtfhead(str, INITIATE) == FALSE){
|
---|
| 402 | mcfioC_FreeStream(&McfStreamPtrList[jstr]);
|
---|
| 403 | fclose(ff);
|
---|
| 404 | return -1;
|
---|
| 405 | }
|
---|
| 406 | str->table = (mcfxdrEventTable *) malloc(sizeof(mcfxdrEventTable));
|
---|
| 407 | str->table->numevts=-1;
|
---|
| 408 | str->table->nextLocator = -1;
|
---|
| 409 | str->table->evtnums = (int *) malloc(sizeof(int) * str->fhead->dimTable);
|
---|
| 410 | str->table->storenums = (int *) malloc(sizeof(int) * str->fhead->dimTable);
|
---|
| 411 | str->table->runnums = (int *) malloc(sizeof(int) * str->fhead->dimTable);
|
---|
| 412 | str->table->trigMasks = (int *) malloc(sizeof(int) * str->fhead->dimTable);
|
---|
| 413 | str->table->ptrEvents =
|
---|
| 414 | (u_int *) malloc(sizeof(int) * str->fhead->dimTable);
|
---|
| 415 | /*
|
---|
| 416 | ** Write the first dummy table
|
---|
| 417 | */
|
---|
| 418 | if (mcfioC_Wrttable(str, INITIATE) == FALSE) return -1;
|
---|
| 419 | str->ehead = (mcfxdrEventHeader *) malloc(sizeof(mcfxdrEventHeader));
|
---|
| 420 | str->ehead->dimBlocks = str->fhead->nBlocks;
|
---|
| 421 | str->ehead->nBlocks = 0;
|
---|
| 422 | str->ehead->dimNTuples = 0;
|
---|
| 423 | str->ehead->nNTuples = 0;
|
---|
| 424 | str->ehead->evtnum = 0;
|
---|
| 425 | str->ehead->previousevtnum = 0;
|
---|
| 426 | str->ehead->storenum = 0;
|
---|
| 427 | str->ehead->runnum = 0;
|
---|
| 428 | str->ehead->trigMask = 0;
|
---|
| 429 | str->ehead->nTupleIds = NULL;
|
---|
| 430 | str->ehead->ptrNTuples = NULL;
|
---|
| 431 | if (nBlocks > 0) {
|
---|
| 432 | str->ehead->blockIds =
|
---|
| 433 | (int *) malloc(sizeof(int) * str->fhead->nBlocks);
|
---|
| 434 | str->ehead->ptrBlocks =
|
---|
| 435 | (u_int *) malloc(sizeof(int) * str->fhead->nBlocks);
|
---|
| 436 | } else {
|
---|
| 437 | str->ehead->blockIds = NULL;
|
---|
| 438 | str->ehead->ptrBlocks = NULL;
|
---|
| 439 | }
|
---|
| 440 | /*
|
---|
| 441 | ** Write the first dummy event header
|
---|
| 442 | */
|
---|
| 443 | if (mcfioC_WrtEvt(str, INITIATE) == FALSE) return -1;
|
---|
| 444 | str->ehead->evtnum = 0;
|
---|
| 445 | str->status = MCFIO_RUNNING;
|
---|
| 446 | McfNumOfStreamActive++;
|
---|
| 447 | return (jstr+1);
|
---|
| 448 |
|
---|
| 449 | }
|
---|
| 450 |
|
---|
| 451 | int mcfioC_NextEvent(int stream)
|
---|
| 452 | /*
|
---|
| 453 | ** The Core routine for getting or setting the next event d.s. from/to
|
---|
| 454 | ** a stream.
|
---|
| 455 | **
|
---|
| 456 | */
|
---|
| 457 | {
|
---|
| 458 | int jstr, idtmp, ntot, nn1;
|
---|
| 459 | u_int p_evt, p2;
|
---|
| 460 | mcfStream *str;
|
---|
| 461 |
|
---|
| 462 | if (McfStreamPtrList == NULL) {
|
---|
| 463 | fprintf(stderr,
|
---|
| 464 | " mcfio_NextEvent: You must first initialize by calling mcfio_Init.\n");
|
---|
| 465 | return -1;
|
---|
| 466 | }
|
---|
| 467 | jstr = stream-1;
|
---|
| 468 | if (McfStreamPtrList[jstr] == NULL) {
|
---|
| 469 | fprintf(stderr,
|
---|
| 470 | " mcfio_NextEvent: First, declare the stream by calling mcfio_Open...\n");
|
---|
| 471 | return -1;
|
---|
| 472 | }
|
---|
| 473 | str = McfStreamPtrList[jstr];
|
---|
| 474 | if (str->dos == MCFIO_SEQUENTIAL) return mcfioC_NextEventSequential(stream);
|
---|
| 475 | if (str->row == MCFIO_READ) {
|
---|
| 476 | /*
|
---|
| 477 | ** Read the next event, hunt for either an event or a table of event
|
---|
| 478 | ** if event table not available.
|
---|
| 479 | */
|
---|
| 480 | if ((str->table == NULL) ||
|
---|
| 481 | ((str->table != NULL)&& (str->table->evtnums == NULL))) {
|
---|
| 482 | idtmp = mcfioC_gofornextevent(str);
|
---|
| 483 | if (idtmp != EVENTTABLE) {
|
---|
| 484 | if (str->table !=NULL)
|
---|
| 485 | mcfioC_Free_EventTable(&(str->table));
|
---|
| 486 | if (idtmp == NOTHING) return -1;
|
---|
| 487 | p_evt = str->currentPos;
|
---|
| 488 | } else {
|
---|
| 489 | if( xdr_mcfast_eventtable(str->xdr, &idtmp,
|
---|
| 490 | &ntot, McfGenericVersion, &(str->table)) == FALSE) {
|
---|
| 491 | fprintf(stderr,
|
---|
| 492 | " mcfio_NextEvent: XDR Error decoding the EventTable \n");
|
---|
| 493 | return -1;
|
---|
| 494 | }
|
---|
| 495 | p2 = xdr_getpos(str->xdr);
|
---|
| 496 | str->numWordsC += (ntot/4);
|
---|
| 497 | str->numWordsT += ((p2-str->currentPos)/4);
|
---|
| 498 | str->currentPos = p2;
|
---|
| 499 | str->table->ievt = 0;
|
---|
| 500 | /*
|
---|
| 501 | ** If table empty, cal this routine recursively to get
|
---|
| 502 | ** the next event
|
---|
| 503 | */
|
---|
| 504 | if (str->table->numevts <= 0) {
|
---|
| 505 | if (str->table->nextLocator == -1)
|
---|
| 506 | mcfioC_Free_EventTable(&(str->table));
|
---|
| 507 | return mcfioC_NextEvent(str->id);
|
---|
| 508 | }
|
---|
| 509 | p_evt = str->table->ptrEvents[0];
|
---|
| 510 | }
|
---|
| 511 | } else {
|
---|
| 512 | if (str->table->ievt < str->table->numevts) {
|
---|
| 513 | p_evt = str->table->ptrEvents[str->table->ievt];
|
---|
| 514 | } else {
|
---|
| 515 | /*
|
---|
| 516 | ** decode the next table, if valid. If not, scrap the
|
---|
| 517 | ** existing table and call next event recursively.
|
---|
| 518 | */
|
---|
| 519 | if (str->table->nextLocator == -2) {
|
---|
| 520 | /*
|
---|
| 521 | ** Stream is at EOF
|
---|
| 522 | */
|
---|
| 523 | str->status = MCFIO_EOF;
|
---|
| 524 | return MCFIO_EOF;
|
---|
| 525 | } else if (str->table->nextLocator == -1) {
|
---|
| 526 | fprintf(stderr,
|
---|
| 527 | " mcfio_NextEvent: Corrupted Event Table \n");
|
---|
| 528 | return -1;
|
---|
| 529 | }
|
---|
| 530 | if (xdr_setpos(str->xdr, str->table->nextLocator) == FALSE) {
|
---|
| 531 | fprintf(stderr,
|
---|
| 532 | " mcfio_NextEvent: Error Repositioning stream \n");
|
---|
| 533 | return -1;
|
---|
| 534 | }
|
---|
| 535 | if( xdr_mcfast_eventtable(str->xdr, &idtmp,
|
---|
| 536 | &ntot, McfGenericVersion, &(str->table)) == FALSE) {
|
---|
| 537 | fprintf(stderr,
|
---|
| 538 | " mcfio_NextEvent: XDR Error decoding the EventTable \n");
|
---|
| 539 | return -1;
|
---|
| 540 | }
|
---|
| 541 | p2 = xdr_getpos(str->xdr);
|
---|
| 542 | str->numWordsC += (ntot/4);
|
---|
| 543 | str->numWordsT += ((p2-str->currentPos)/4);
|
---|
| 544 | str->currentPos = p2;
|
---|
| 545 | str->table->ievt = 0;
|
---|
| 546 | p_evt = str->table->ptrEvents[0];
|
---|
| 547 | }
|
---|
| 548 | }
|
---|
| 549 | /*
|
---|
| 550 | ** we should be pointing to a good event header here.
|
---|
| 551 | */
|
---|
| 552 | if (xdr_setpos(str->xdr, p_evt) == FALSE) return -1;
|
---|
| 553 | if( xdr_mcfast_eventheader(str->xdr, &idtmp,
|
---|
| 554 | &ntot, McfGenericVersion, &(str->ehead)) == FALSE) return -1;
|
---|
| 555 | str->currentPos = xdr_getpos(str->xdr);
|
---|
| 556 | str->numWordsC += (ntot/4);
|
---|
| 557 | str->numWordsT += ((str->currentPos - p_evt)/4);
|
---|
| 558 | if (str->table != NULL) str->table->ievt ++;
|
---|
| 559 | return MCFIO_RUNNING;
|
---|
| 560 | } else {
|
---|
| 561 | /*
|
---|
| 562 | ** Writing Code here.
|
---|
| 563 | */
|
---|
| 564 | str->table->numevts++;
|
---|
| 565 | str->fhead->numevts++;
|
---|
| 566 | if (str->ehead->previousevtnum == str->ehead->evtnum) str->ehead->evtnum++;
|
---|
| 567 | /*
|
---|
| 568 | ** Write the current event header, normal case. First Flush the current
|
---|
| 569 | ** event, then initiate the next one event. Note that wrtevt will
|
---|
| 570 | ** reposition the stream after rewriting the event header, if FLUSH.
|
---|
| 571 | ** e.g. ready to initiate either a new table or a new event.
|
---|
| 572 | */
|
---|
| 573 | if (mcfioC_WrtEvt(str, FLUSH) == FALSE) return -1;
|
---|
| 574 | str->ehead->previousevtnum = str->ehead->evtnum;
|
---|
| 575 | if (str->table->numevts == (str->fhead->dimTable - 1)) {
|
---|
| 576 | /*
|
---|
| 577 | ** The Event table is now full. Flush it. Then initiate a new table.
|
---|
| 578 | */
|
---|
| 579 | str->table->nextLocator = xdr_getpos(str->xdr);
|
---|
| 580 | if (mcfioC_Wrttable(str, FLUSH) == FALSE) return -1;
|
---|
| 581 | if (mcfioC_Wrttable(str, INITIATE) == FALSE) return -1;
|
---|
| 582 | }
|
---|
| 583 | str->ehead->nBlocks = 0;
|
---|
| 584 | str->ehead->nNTuples = 0;
|
---|
| 585 | nn1 = str->ehead->evtnum;
|
---|
| 586 | if (mcfioC_WrtEvt(str, INITIATE) == FALSE) return -1;
|
---|
| 587 | str->ehead->evtnum = nn1;
|
---|
| 588 | return MCFIO_RUNNING;
|
---|
| 589 | }
|
---|
| 590 | }
|
---|
| 591 |
|
---|
| 592 | int mcfioC_SpecificEvent(int stream, int ievt,
|
---|
| 593 | int istore, int irun, int itrig)
|
---|
| 594 | {
|
---|
| 595 | int jstr, ok;
|
---|
| 596 | mcfStream *str;
|
---|
| 597 |
|
---|
| 598 | if (McfStreamPtrList == NULL) {
|
---|
| 599 | fprintf(stderr,
|
---|
| 600 | " mcfio_SpecificEvent: You must first initialize by calling mcfio_Init.\n");
|
---|
| 601 | return -1;
|
---|
| 602 | }
|
---|
| 603 | jstr = stream-1;
|
---|
| 604 | if (McfStreamPtrList[jstr] == NULL) {
|
---|
| 605 | fprintf(stderr,
|
---|
| 606 | " mcfio_SpecificEvent: First, declare the stream by calling mcfio_Open...\n");
|
---|
| 607 | return -1;
|
---|
| 608 | }
|
---|
| 609 | str = McfStreamPtrList[jstr];
|
---|
| 610 | if ((str->row != MCFIO_READ) || (str->dos == MCFIO_SEQUENTIAL)) {
|
---|
| 611 | fprintf(stderr,
|
---|
| 612 | " mcfio_SpecificEvent: Only valid for INPUT, DIRECT ACCESS \
|
---|
| 613 | or Memory Mapped \n");
|
---|
| 614 | return -1;
|
---|
| 615 | }
|
---|
| 616 | if (xdr_setpos(str->xdr, str->fhead->firstTable) == FALSE ) {
|
---|
| 617 | fprintf(stderr,
|
---|
| 618 | " mcfio_SpecificEvent: Could not reposition Direct Access Stream %d \n",
|
---|
| 619 | (jstr+1)) ;
|
---|
| 620 | return -1;
|
---|
| 621 | }
|
---|
| 622 | str->currentPos = str->fhead->firstTable;
|
---|
| 623 |
|
---|
| 624 | ok = mcfioC_nextspecevt(str, ievt, istore, irun, itrig);
|
---|
| 625 | if (ok == FALSE) {
|
---|
| 626 | mcfioC_RewindDirect(jstr);
|
---|
| 627 | if (xdr_setpos(str->xdr, str->fhead->firstTable) == FALSE ) {
|
---|
| 628 | fprintf(stderr,
|
---|
| 629 | " mcfio_SpecificEvent: Could not reposition Direct Access Stream %d \n",
|
---|
| 630 | (jstr+1)) ;
|
---|
| 631 | return -1;
|
---|
| 632 | }
|
---|
| 633 | str->currentPos = str->fhead->firstTable;
|
---|
| 634 | ok = mcfioC_nextspecevt(str, ievt, istore, irun, itrig);
|
---|
| 635 | }
|
---|
| 636 | if (ok == FALSE) return -1;
|
---|
| 637 | return ok;
|
---|
| 638 |
|
---|
| 639 | }
|
---|
| 640 | int mcfioC_NextSpecificEvent(int stream, int ievt,
|
---|
| 641 | int istore, int irun, int itrig)
|
---|
| 642 | {
|
---|
| 643 | int jstr, ok;
|
---|
| 644 | mcfStream *str;
|
---|
| 645 |
|
---|
| 646 | if (McfStreamPtrList == NULL) {
|
---|
| 647 | fprintf(stderr,
|
---|
| 648 | " mcfio_NextSpecific: You must first initialize by calling mcfio_Init.\n");
|
---|
| 649 | return -1;
|
---|
| 650 | }
|
---|
| 651 | jstr = stream-1;
|
---|
| 652 | if (McfStreamPtrList[jstr] == NULL) {
|
---|
| 653 | fprintf(stderr,
|
---|
| 654 | " mcfio_NextSpecific: First, declare the stream by calling mcfio_Open...\n");
|
---|
| 655 | return -1;
|
---|
| 656 | }
|
---|
| 657 | str = McfStreamPtrList[jstr];
|
---|
| 658 | if ((str->row != MCFIO_READ) || (str->dos == MCFIO_SEQUENTIAL)) {
|
---|
| 659 | fprintf(stderr,
|
---|
| 660 | " mcfio_NextSpecificEvent: Only valid for INPUT, DIRECT ACCESS\
|
---|
| 661 | or memory mapped I/O \n");
|
---|
| 662 | return -1;
|
---|
| 663 | }
|
---|
| 664 | ok = mcfioC_nextspecevt(str, ievt, istore, irun, itrig);
|
---|
| 665 | if (ok == FALSE) return -1;
|
---|
| 666 | return ok;
|
---|
| 667 |
|
---|
| 668 | }
|
---|
| 669 |
|
---|
| 670 |
|
---|
| 671 | void mcfioC_CloseDirect(int jstr)
|
---|
| 672 | /*
|
---|
| 673 | ** Close a direct access stream, Standard I/O or Memory Mapped
|
---|
| 674 | **
|
---|
| 675 | */
|
---|
| 676 | {
|
---|
| 677 | int i;
|
---|
| 678 | mcfStream *str;
|
---|
| 679 | nTuDDL *ddl;
|
---|
| 680 |
|
---|
| 681 | str = McfStreamPtrList[jstr];
|
---|
| 682 | if (str->row == MCFIO_WRITE) {
|
---|
| 683 | /*
|
---|
| 684 | ** Flush the event header, and the last table header.
|
---|
| 685 | */
|
---|
| 686 | if (str->status == MCFIO_RUNNING) {
|
---|
| 687 | str->table->numevts++;
|
---|
| 688 | str->ehead->evtnum++;
|
---|
| 689 | if (mcfioC_WrtEvt(str, FLUSH) == FALSE) return;
|
---|
| 690 | str->table->nextLocator = -2;
|
---|
| 691 | str->table->numevts--; /* Decrement, the table is incomplete at
|
---|
| 692 | this point */
|
---|
| 693 | if (mcfioC_Wrttable(str, FLUSH) == FALSE) return;
|
---|
| 694 | if (mcfioC_Wrtfhead(str, FLUSH) == FALSE) return;
|
---|
| 695 | }
|
---|
| 696 | }
|
---|
| 697 | xdr_destroy(str->xdr);
|
---|
| 698 | if (str->dos == MCFIO_DIRECT) {
|
---|
| 699 | fclose(str->filePtr);
|
---|
| 700 | } else {
|
---|
| 701 | /*
|
---|
| 702 | ** Memory mapped I/O, one has to unmapped..
|
---|
| 703 | */
|
---|
| 704 | munmap((caddr_t) str->fileAddr, str->fileLen);
|
---|
| 705 | close(str->fileDescr);
|
---|
| 706 | }
|
---|
| 707 | /*
|
---|
| 708 | ** One must declare the Ntuples obsolete for this stream.
|
---|
| 709 | ** Do not release the memory, just flag these Ntuple with an obsolete
|
---|
| 710 | ** stream
|
---|
| 711 | */
|
---|
| 712 | for (i=0; i<NumOfNTuples; i++) {
|
---|
| 713 | ddl = mcf_GetNTuByPtrID((i+1));
|
---|
| 714 | if ((ddl != NULL) && (ddl->streamId == (jstr+1)))
|
---|
| 715 | ddl->streamId = -1;
|
---|
| 716 | }
|
---|
| 717 | }
|
---|
| 718 |
|
---|
| 719 | void mcfioC_RewindDirect(int jstr)
|
---|
| 720 | /*
|
---|
| 721 | ** Rewind a direct access stream, open for Read only
|
---|
| 722 | **
|
---|
| 723 | */
|
---|
| 724 | {
|
---|
| 725 | mcfStream *str;
|
---|
| 726 |
|
---|
| 727 | str = McfStreamPtrList[jstr];
|
---|
| 728 | if (xdr_setpos(str->xdr, str->fhead->firstTable) == FALSE )
|
---|
| 729 | fprintf(stderr,
|
---|
| 730 | " mcfio_Rewind: Could not reposition Direct Access Stream %d \n",
|
---|
| 731 | (jstr+1)) ;
|
---|
| 732 | str->currentPos = str->fhead->firstTable;
|
---|
| 733 | if (str->table != NULL) {
|
---|
| 734 | str->table->nextLocator = str->fhead->firstTable;
|
---|
| 735 | str->table->numevts = 0;
|
---|
| 736 | str->table->previousnumevts = 0;
|
---|
| 737 | }
|
---|
| 738 | if (str->ehead != NULL) {
|
---|
| 739 | str->ehead->evtnum = 0;
|
---|
| 740 | str->ehead->previousevtnum = 0;
|
---|
| 741 | }
|
---|
| 742 | return;
|
---|
| 743 | }
|
---|
| 744 |
|
---|
| 745 | int mcfioC_Wrtfhead(mcfStream *str, int mode)
|
---|
| 746 | /*
|
---|
| 747 | ** Write the file header.
|
---|
| 748 | ** IF Mode = INITIATE, write the dummy information, at the current location.
|
---|
| 749 | ** IF mode = Flush, rewite all the information, this time with the
|
---|
| 750 | ** correct number of events.
|
---|
| 751 | **
|
---|
| 752 | */
|
---|
| 753 | {
|
---|
| 754 | int idtmp, ntot;
|
---|
| 755 | u_int p1, p0;
|
---|
| 756 | int k;
|
---|
| 757 | time_t clock;
|
---|
| 758 |
|
---|
| 759 | idtmp = FILEHEADER;
|
---|
| 760 | if (mode == FLUSH) {
|
---|
| 761 | time(&clock);
|
---|
| 762 | strcpy(str->fhead->closingDate, ctime(&clock));
|
---|
| 763 | if(xdr_setpos(str->xdr,str->firstPos) == FALSE) return FALSE;
|
---|
| 764 | if (xdr_mcfast_fileheader(str->xdr, &idtmp,
|
---|
| 765 | &ntot, McfGenericVersion, &(str->fhead), str->id) == FALSE) {
|
---|
| 766 | fprintf (stderr,
|
---|
| 767 | "mcfio_OpenCloseDirect: Unable to reencode file head \n");
|
---|
| 768 | return FALSE;
|
---|
| 769 | }
|
---|
| 770 | /*
|
---|
| 771 | ** The version of MCFIO is still at this point v2.0
|
---|
| 772 | */
|
---|
| 773 | } else if (mode == INITIATE) {
|
---|
| 774 | /* Put the current date/time in a string */
|
---|
| 775 | time(&clock);
|
---|
| 776 | strcpy(str->fhead->date, ctime(&clock));
|
---|
| 777 | /*
|
---|
| 778 | ** We obviously do not have the closing times stamp yet (Causality)
|
---|
| 779 | ** So we put ?, however, we have to put the right number of them,
|
---|
| 780 | ** the we do not screw up the XDR pointers..
|
---|
| 781 | */
|
---|
| 782 | for (k=0; k<strlen(ctime(&clock)); k++) str->fhead->closingDate[k] = '?';
|
---|
| 783 | str->fhead->closingDate[strlen(ctime(&clock))] = '\0';
|
---|
| 784 | p0 = str->currentPos;
|
---|
| 785 | if (xdr_mcfast_fileheader(str->xdr, &idtmp,
|
---|
| 786 | &ntot, McfGenericVersion, &(str->fhead), str->id) == FALSE) {
|
---|
| 787 | fprintf (stderr,
|
---|
| 788 | "mcfio_OpenWriteDirect: Unable to encode fileheader \n");
|
---|
| 789 | return FALSE;
|
---|
| 790 | }
|
---|
| 791 | p1 = xdr_getpos(str->xdr);
|
---|
| 792 | str->numWordsC += (ntot/4);
|
---|
| 793 | str->numWordsT += ((p1-p0)/4);
|
---|
| 794 | str->currentPos = p1;
|
---|
| 795 | return TRUE;
|
---|
| 796 | } else {
|
---|
| 797 | fprintf(stderr," mcfioC_Wrtfhead: Internal error, lost mode \n");
|
---|
| 798 | return FALSE;
|
---|
| 799 | }
|
---|
| 800 | return TRUE;
|
---|
| 801 | }
|
---|
| 802 |
|
---|
| 803 |
|
---|
| 804 | int mcfioC_WrtEvt(mcfStream *str, int mode)
|
---|
| 805 | /*
|
---|
| 806 | ** Write an event header, and update the table. Presumably, we have room
|
---|
| 807 | ** in this table to do so.
|
---|
| 808 | ** IF Mode = INITIATE, write the dummy event header, at the current location.
|
---|
| 809 | ** Do not fill the element table.
|
---|
| 810 | ** If mode = FLUSH write the real event header and also
|
---|
| 811 | ** fill the Table elements.
|
---|
| 812 | **
|
---|
| 813 | */
|
---|
| 814 | {
|
---|
| 815 | int idtmp, ntot;
|
---|
| 816 | u_int p1, p0;
|
---|
| 817 |
|
---|
| 818 | idtmp = EVENTHEADER;
|
---|
| 819 | if (mode == FLUSH) {
|
---|
| 820 | str->table->evtnums[str->table->numevts] = str->ehead->evtnum;
|
---|
| 821 | str->table->storenums[str->table->numevts] = str->ehead->storenum;
|
---|
| 822 | str->table->runnums[str->table->numevts] = str->ehead->runnum;
|
---|
| 823 | str->table->trigMasks[str->table->numevts] = str->ehead->trigMask;
|
---|
| 824 | str->table->ptrEvents[str->table->numevts] = str->evtPos;
|
---|
| 825 | p0 = str->currentPos;
|
---|
| 826 | if(xdr_setpos(str->xdr,str->evtPos) == FALSE) return FALSE;
|
---|
| 827 | p1 = str->evtPos;
|
---|
| 828 | if(xdr_mcfast_eventheader(str->xdr, &idtmp,
|
---|
| 829 | &ntot, McfGenericVersion, &(str->ehead)) == FALSE) return FALSE;
|
---|
| 830 | str->currentPos = xdr_getpos(str->xdr);
|
---|
| 831 | str->numWordsC += (ntot/4);
|
---|
| 832 | str->numWordsT += ((str->currentPos-p1)/4);
|
---|
| 833 | if(xdr_setpos(str->xdr,p0) == FALSE) return FALSE;
|
---|
| 834 | str->currentPos = p0;
|
---|
| 835 | str->ehead->nBlocks = 0;
|
---|
| 836 | str->ehead->nNTuples = 0;
|
---|
| 837 | return TRUE;
|
---|
| 838 | } else if (mode == INITIATE) {
|
---|
| 839 | str->ehead->nBlocks = 0; /*do not initialize nNTuples, already done */
|
---|
| 840 | str->ehead->evtnum = -1;
|
---|
| 841 | str->evtPos = xdr_getpos(str->xdr);
|
---|
| 842 |
|
---|
| 843 | if(xdr_mcfast_eventheader(str->xdr, &idtmp,
|
---|
| 844 | &ntot, McfGenericVersion, &(str->ehead)) == FALSE) return FALSE;
|
---|
| 845 | str->currentPos = xdr_getpos(str->xdr);
|
---|
| 846 | return TRUE;
|
---|
| 847 | } else {
|
---|
| 848 | fprintf(stderr," mcfioC_WrtEvt: Internal error, lost mode \n");
|
---|
| 849 | return FALSE;
|
---|
| 850 | }
|
---|
| 851 | }
|
---|
| 852 |
|
---|
| 853 | int mcfioC_Wrttable(mcfStream *str, int mode)
|
---|
| 854 | /*
|
---|
| 855 | ** Write an event table.
|
---|
| 856 | ** IF Mode = INITIATE, write the dummy event table, at the current location.
|
---|
| 857 | ** Do not fill the element table.
|
---|
| 858 | ** If mode = FLUSH write the real event header and also
|
---|
| 859 | ** fill the Table elements.
|
---|
| 860 | **
|
---|
| 861 | */
|
---|
| 862 | {
|
---|
| 863 | int idtmp, ntot;
|
---|
| 864 | u_int p1, p0;
|
---|
| 865 |
|
---|
| 866 | idtmp = EVENTTABLE;
|
---|
| 867 | str->table->dim = str->fhead->dimTable;
|
---|
| 868 | if (mode == FLUSH) {
|
---|
| 869 | p0 = str->currentPos;
|
---|
| 870 | if(xdr_setpos(str->xdr,str->tablePos) == FALSE) return FALSE;
|
---|
| 871 | p1 = str->tablePos;
|
---|
| 872 | str->table->numevts++;
|
---|
| 873 | if(xdr_mcfast_eventtable(str->xdr, &idtmp,
|
---|
| 874 | &ntot, McfGenericVersion, &(str->table)) == FALSE) return FALSE;
|
---|
| 875 | str->currentPos = xdr_getpos(str->xdr);
|
---|
| 876 | str->numWordsC += (ntot/4);
|
---|
| 877 | str->numWordsT += ((str->currentPos-p1)/4);
|
---|
| 878 | if(xdr_setpos(str->xdr,p0) == FALSE) return FALSE;
|
---|
| 879 | str->currentPos = p0;
|
---|
| 880 | str->tablePos = -1;
|
---|
| 881 | str->table->nextLocator = -1;
|
---|
| 882 | str->table->numevts=-1;
|
---|
| 883 | return TRUE;
|
---|
| 884 | } else if (mode == INITIATE) {
|
---|
| 885 | str->tablePos = xdr_getpos(str->xdr);
|
---|
| 886 | str->table->nextLocator = -1;
|
---|
| 887 | if(xdr_mcfast_eventtable(str->xdr, &idtmp,
|
---|
| 888 | &ntot, McfGenericVersion, &(str->table)) == FALSE) return FALSE;
|
---|
| 889 | str->currentPos = xdr_getpos(str->xdr);
|
---|
| 890 | return TRUE;
|
---|
| 891 | } else {
|
---|
| 892 | fprintf(stderr," mcfioC_Wrttable: Internal error, lost mode \n");
|
---|
| 893 | return FALSE;
|
---|
| 894 | }
|
---|
| 895 | }
|
---|
| 896 |
|
---|
| 897 | static int mcfioC_gofornextevent(mcfStream *str)
|
---|
| 898 | /*
|
---|
| 899 | ** Move in the direct access file to the next event or event table,
|
---|
| 900 | ** whatever comes first. The XDR current position is set to the beginning
|
---|
| 901 | ** of the event header or event table, if search sucessfull.
|
---|
| 902 | ** We position the stream to the last Block or Ntuple defined in
|
---|
| 903 | ** the current event.
|
---|
| 904 | */
|
---|
| 905 | {
|
---|
| 906 | u_int p1;
|
---|
| 907 | int id, ntot, go;
|
---|
| 908 |
|
---|
| 909 | go = TRUE;
|
---|
| 910 |
|
---|
| 911 | while (go == TRUE) {
|
---|
| 912 | p1 = xdr_getpos(str->xdr);
|
---|
| 913 | if (xdr_mcfast_headerBlock(str->xdr, &id, &ntot, McfGenericVersion)
|
---|
| 914 | == FALSE) return NOTHING;
|
---|
| 915 | if ((id == EVENTTABLE) || (id == EVENTHEADER)) {
|
---|
| 916 | str->currentPos = p1;
|
---|
| 917 | if(xdr_setpos(str->xdr, p1) == FALSE) return NOTHING;
|
---|
| 918 | return id;
|
---|
| 919 | }
|
---|
| 920 | }
|
---|
| 921 | return NOTHING; /* This statement is to make the compiler happy */
|
---|
| 922 | }
|
---|
| 923 |
|
---|
| 924 | static int mcfioC_nextspecevt(mcfStream *str, int inum, int istore,
|
---|
| 925 | int irun, int itrig)
|
---|
| 926 | /*
|
---|
| 927 | ** For Input, Direct access streams, hunt for a psecific event
|
---|
| 928 | **
|
---|
| 929 | */
|
---|
| 930 | {
|
---|
| 931 | int j, idtmp, ntot, found;
|
---|
| 932 | u_int p_evt, p2;
|
---|
| 933 |
|
---|
| 934 | if ((str->table == NULL) ||
|
---|
| 935 | ((str->table != NULL)&& (str->table->evtnums == NULL))) {
|
---|
| 936 | idtmp = mcfioC_gofornextevent(str);
|
---|
| 937 | if (idtmp != EVENTTABLE) {
|
---|
| 938 | fprintf(stderr,
|
---|
| 939 | " mcfio_SpecificEvent: No event table on stream %d \n", str->id);
|
---|
| 940 | return FALSE;
|
---|
| 941 | } else {
|
---|
| 942 | if( xdr_mcfast_eventtable(str->xdr, &idtmp,
|
---|
| 943 | &ntot, McfGenericVersion, &(str->table)) == FALSE) {
|
---|
| 944 | fprintf(stderr,
|
---|
| 945 | " mcfio_SpecificEvent: XDR Error decoding the EventTable \n");
|
---|
| 946 | return FALSE;
|
---|
| 947 | }
|
---|
| 948 | p2 = xdr_getpos(str->xdr);
|
---|
| 949 | str->numWordsC += (ntot/4);
|
---|
| 950 | str->numWordsT += ((p2-str->currentPos)/4);
|
---|
| 951 | str->currentPos = p2;
|
---|
| 952 | str->table->ievt = 0;
|
---|
| 953 | /*
|
---|
| 954 | ** If table empty, cal this routine recursively to get
|
---|
| 955 | ** the next event
|
---|
| 956 | */
|
---|
| 957 | str->table->ievt = 0;
|
---|
| 958 | }
|
---|
| 959 | }
|
---|
| 960 | found = FALSE;
|
---|
| 961 | while (found == FALSE){
|
---|
| 962 | j = str->table->ievt;
|
---|
| 963 | if (str->table->ievt < str->table->numevts) {
|
---|
| 964 | if (((inum == 0)
|
---|
| 965 | || ( inum != 0 && (str->table->evtnums[j] == inum))) &&
|
---|
| 966 | (((istore == 0)
|
---|
| 967 | || (istore != 0) && (str->table->storenums[j] == istore))) &&
|
---|
| 968 | (((irun == 0)
|
---|
| 969 | || (irun != 0) && (str->table->runnums[j] == irun))) &&
|
---|
| 970 | (((itrig == 0)
|
---|
| 971 | || (itrig != 0) && (str->table->trigMasks[j] == itrig))))
|
---|
| 972 | found = TRUE;
|
---|
| 973 | p_evt = str->table->ptrEvents[str->table->ievt];
|
---|
| 974 | str->table->ievt++;
|
---|
| 975 | } else {
|
---|
| 976 | /*
|
---|
| 977 | ** decode the next table, if valid. If not, scrap the
|
---|
| 978 | ** existing table and call next event recursively.
|
---|
| 979 | */
|
---|
| 980 | if (str->table->nextLocator == -2) {
|
---|
| 981 | /*
|
---|
| 982 | ** Stream is at EOF
|
---|
| 983 | */
|
---|
| 984 | str->status = MCFIO_EOF;
|
---|
| 985 |
|
---|
| 986 | return FALSE;
|
---|
| 987 |
|
---|
| 988 | } else if (str->table->nextLocator == -1) {
|
---|
| 989 | fprintf(stderr,
|
---|
| 990 | " mcfio_NextEvent: Next EventTable corrupted, abandoning search \n");
|
---|
| 991 | return FALSE;
|
---|
| 992 | }
|
---|
| 993 | if (xdr_setpos(str->xdr, str->table->nextLocator)
|
---|
| 994 | == FALSE) { fprintf(stderr,
|
---|
| 995 | " mcfio_NextEvent: XDR Error repositioning to the next EventTable \n");
|
---|
| 996 | return FALSE;
|
---|
| 997 | } else {
|
---|
| 998 | if( xdr_mcfast_eventtable(str->xdr, &idtmp,
|
---|
| 999 | &ntot, McfGenericVersion, &(str->table)) == FALSE) {
|
---|
| 1000 | fprintf(stderr,
|
---|
| 1001 | " mcfio_NextEvent: XDR Error decoding the EventTable \n");
|
---|
| 1002 | return FALSE;
|
---|
| 1003 | }
|
---|
| 1004 | }
|
---|
| 1005 | p2 = xdr_getpos(str->xdr);
|
---|
| 1006 | str->numWordsC += (ntot/4);
|
---|
| 1007 | str->numWordsT += ((p2-str->currentPos)/4);
|
---|
| 1008 | str->currentPos = p2;
|
---|
| 1009 | str->table->ievt = 0;
|
---|
| 1010 | p_evt = str->table->ptrEvents[0];
|
---|
| 1011 | }
|
---|
| 1012 | }
|
---|
| 1013 | if (found == FALSE) return FALSE;
|
---|
| 1014 | /*
|
---|
| 1015 | ** we should be pointing to a good event header here.
|
---|
| 1016 | */
|
---|
| 1017 | if (xdr_setpos(str->xdr, p_evt) == FALSE) return FALSE;
|
---|
| 1018 | if( xdr_mcfast_eventheader(str->xdr, &idtmp,
|
---|
| 1019 | &ntot, McfGenericVersion, &(str->ehead)) == FALSE) return FALSE;
|
---|
| 1020 | str->currentPos = xdr_getpos(str->xdr);
|
---|
| 1021 | str->numWordsC += (ntot/4);
|
---|
| 1022 | str->numWordsT += ((str->currentPos - p_evt)/4);
|
---|
| 1023 | return MCFIO_RUNNING;
|
---|
| 1024 |
|
---|
| 1025 | }
|
---|