00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461 #ifndef _MIDAS_H_
00462 #define _MIDAS_H_
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492 #define MIDAS_VERSION "1.9.5"
00493 #define DATABASE_VERSION 2
00494
00495
00496 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00497
00498
00499
00500
00501
00502 #if defined( VAX ) || defined( __VMS )
00503 #define OS_VMS
00504 #endif
00505
00506 #if defined( _MSC_VER )
00507 #define OS_WINNT
00508 #endif
00509
00510 #if defined( __MSDOS__ )
00511 #define OS_MSDOS
00512 #endif
00513
00514 #if defined ( vxw )
00515 #define OS_VXWORKS
00516 #undef OS_UNIX
00517 #endif
00518
00519 #if !defined(OS_LINUX)
00520 #if defined ( __linux__ )
00521 #define OS_LINUX
00522 #endif
00523 #endif
00524
00525 #if defined(OS_LINUX) || defined(OS_OSF1) || defined(OS_ULTRIX) || defined(OS_FREEBSD) || defined(OS_SOLARIS) || defined(OS_IRIX) || defined(OS_DARWIN)
00526 #define OS_UNIX
00527 #endif
00528
00529 #if !defined(OS_IRIX) && !defined(OS_VMS) && !defined(OS_MSDOS) && !defined(OS_UNIX) && !defined(OS_VXWORKS) && !defined(OS_WINNT)
00530 #error MIDAS cannot be used on this operating system
00531 #endif
00532
00533
00534
00535 #ifdef USE_ROOT
00536 #include <TObjArray.h>
00537 #include <TFolder.h>
00538 #include <TCutG.h>
00539 #endif
00540
00541
00542
00543 #ifndef MIDAS_TYPE_DEFINED
00544 #define MIDAS_TYPE_DEFINED
00545
00546 typedef unsigned char BYTE;
00547 typedef unsigned short int WORD;
00548
00549 #ifdef __alpha
00550 typedef unsigned int DWORD;
00551 #else
00552 typedef unsigned long int DWORD;
00553 #endif
00554
00555 #ifndef OS_WINNT
00556 #ifndef OS_VXWORKS
00557 typedef DWORD BOOL;
00558 #endif
00559 #endif
00560
00561 #endif
00562
00563
00564
00565
00566
00567
00568
00569 #if defined(OS_MSDOS)
00570 typedef long int INT;
00571 #elif defined( OS_WINNT )
00572
00573
00574 #ifndef _INC_WINDOWS
00575 #include <windows.h>
00576 #endif
00577
00578 #else
00579 typedef int INT;
00580 #endif
00581
00582 typedef INT HNDLE;
00583
00584
00585 #ifdef OS_VXWORKS
00586 #ifndef __INCvxWorksh
00587 #include <vxWorks.h>
00588 #endif
00589 #endif
00590
00591
00592
00593
00594
00595
00596
00597
00598 #ifdef __alpha
00599 #define PTYPE long int
00600 #else
00601 #define PTYPE int
00602 #endif
00603
00604
00605 #if defined(OS_WINNT)
00606 typedef HANDLE midas_thread_t;
00607 #elif defined(OS_UNIX)
00608 #include <pthread.h>
00609 typedef pthread_t midas_thread_t;
00610 #else
00611 typedef INT midas_thread_t;
00612 #endif
00613
00614 #define TRUE 1
00615 #define FALSE 0
00616
00617
00618 #if defined(OS_MSDOS) || defined(OS_WINNT)
00619 #define DIR_SEPARATOR '\\'
00620 #define DIR_SEPARATOR_STR "\\"
00621 #elif defined(OS_VMS)
00622 #define DIR_SEPARATOR ']'
00623 #define DIR_SEPARATOR_STR "]"
00624 #else
00625 #define DIR_SEPARATOR '/'
00626 #define DIR_SEPARATOR_STR "/"
00627 #endif
00628
00629
00630 #if defined( _MSC_VER )
00631 #define INLINE __inline
00632 #elif defined(__GNUC__)
00633 #define INLINE __inline__
00634 #else
00635 #define INLINE
00636 #endif
00637
00638
00639 #ifndef _LARGEFILE64_SOURCE
00640 #define O_LARGEFILE 0
00641 #endif
00642
00643
00644 #endif
00645
00646
00647
00648
00649
00650
00651
00652 #ifdef OS_WINNT
00653 #define TAPE_BUFFER_SIZE 0x100000
00654 #else
00655 #define TAPE_BUFFER_SIZE 0x8000
00656 #endif
00657 #define NET_TCP_SIZE 0xFFFF
00658 #define OPT_TCP_SIZE 8192
00659 #define NET_UDP_SIZE 8192
00660
00661 #define EVENT_BUFFER_SIZE 0x100000
00662 #define EVENT_BUFFER_NAME "SYSTEM"
00663 #define MAX_EVENT_SIZE 0x80000
00664 #define DEFAULT_EVENT_BUFFER_SIZE 0x200000;
00665 #define DEFAULT_ODB_SIZE 0x100000
00666
00667 #define NAME_LENGTH 32
00668 #define HOST_NAME_LENGTH 256
00669 #define MAX_CLIENTS 64
00670 #define MAX_EVENT_REQUESTS 10
00671 #define MAX_OPEN_RECORDS 256
00672 #define MAX_ODB_PATH 256
00673 #define MAX_EXPERIMENT 32
00674 #define BANKLIST_MAX 64
00675 #define STRING_BANKLIST_MAX BANKLIST_MAX * 4
00676
00677
00678 #define MIDAS_TCP_PORT 1175
00679
00680
00681
00682 #define DEFAULT_RPC_TIMEOUT 10000
00683 #define WATCHDOG_INTERVAL 1000
00684
00685 #define DEFAULT_WATCHDOG_TIMEOUT 10000
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698 #define STATE_STOPPED 1
00699 #define STATE_PAUSED 2
00700 #define STATE_RUNNING 3
00701
00702
00703
00704 #define FORMAT_MIDAS 1
00705 #define FORMAT_YBOS 2
00706 #define FORMAT_ASCII 3
00707 #define FORMAT_FIXED 4
00708 #define FORMAT_DUMP 5
00709 #define FORMAT_HBOOK 6
00710 #define FORMAT_ROOT 7
00711
00712
00713
00714 #define GET_ALL (1<<0)
00715 #define GET_SOME (1<<1)
00716 #define GET_FARM (1<<2)
00717
00718
00719
00720
00721 #define TID_BYTE 1
00722 #define TID_SBYTE 2
00723 #define TID_CHAR 3
00724 #define TID_WORD 4
00725 #define TID_SHORT 5
00726 #define TID_DWORD 6
00727 #define TID_INT 7
00728 #define TID_BOOL 8
00729 #define TID_FLOAT 9
00730 #define TID_DOUBLE 10
00731 #define TID_BITFIELD 11
00732 #define TID_STRING 12
00733 #define TID_ARRAY 13
00734 #define TID_STRUCT 14
00735 #define TID_KEY 15
00736 #define TID_LINK 16
00737 #define TID_LAST 17
00738
00739
00740
00741 #define SYNC 0
00742 #define ASYNC 1
00743
00744
00745
00746 #define MODE_READ (1<<0)
00747 #define MODE_WRITE (1<<1)
00748 #define MODE_DELETE (1<<2)
00749 #define MODE_EXCLUSIVE (1<<3)
00750 #define MODE_ALLOC (1<<7)
00751
00752
00753
00754 #define RPC_OTIMEOUT 1
00755 #define RPC_OTRANSPORT 2
00756 #define RPC_OCONVERT_FLAG 3
00757 #define RPC_OHW_TYPE 4
00758 #define RPC_OSERVER_TYPE 5
00759 #define RPC_OSERVER_NAME 6
00760 #define RPC_CONVERT_FLAGS 7
00761 #define RPC_ODB_HANDLE 8
00762 #define RPC_CLIENT_HANDLE 9
00763 #define RPC_SEND_SOCK 10
00764 #define RPC_WATCHDOG_TIMEOUT 11
00765 #define RPC_NODELAY 12
00766
00767 #define RPC_TCP 0
00768 #define RPC_FTCP 1
00769
00770
00771
00772 #define WF_WATCH_ME (1<<0)
00773 #define WF_CALL_WD (1<<1)
00774
00775
00776
00777 #define TR_START (1<<0)
00778 #define TR_STOP (1<<1)
00779 #define TR_PAUSE (1<<2)
00780 #define TR_RESUME (1<<3)
00781 #define TR_DEFERRED (1<<12)
00782
00783
00784
00785 #define EQ_PERIODIC (1<<0)
00786 #define EQ_POLLED (1<<1)
00787 #define EQ_INTERRUPT (1<<2)
00788 #define EQ_SLOW (1<<3)
00789 #define EQ_MANUAL_TRIG (1<<4)
00790 #define EQ_FRAGMENTED (1<<5)
00791 #define EQ_EB (1<<6)
00792
00793
00794
00795
00796 #define RO_RUNNING (1<<0)
00797 #define RO_STOPPED (1<<1)
00798 #define RO_PAUSED (1<<2)
00799 #define RO_BOR (1<<3)
00800 #define RO_EOR (1<<4)
00801 #define RO_PAUSE (1<<5)
00802 #define RO_RESUME (1<<6)
00803
00804 #define RO_TRANSITIONS (RO_BOR|RO_EOR|RO_PAUSE|RO_RESUME)
00805 #define RO_ALWAYS (0xFF)
00806
00807 #define RO_ODB (1<<8)
00808
00809
00810
00811
00812
00813
00814 #define CH_BS 8
00815 #define CH_TAB 9
00816 #define CH_CR 13
00817
00818 #define CH_EXT 0x100
00819
00820 #define CH_HOME (CH_EXT+0)
00821 #define CH_INSERT (CH_EXT+1)
00822 #define CH_DELETE (CH_EXT+2)
00823 #define CH_END (CH_EXT+3)
00824 #define CH_PUP (CH_EXT+4)
00825 #define CH_PDOWN (CH_EXT+5)
00826 #define CH_UP (CH_EXT+6)
00827 #define CH_DOWN (CH_EXT+7)
00828 #define CH_RIGHT (CH_EXT+8)
00829 #define CH_LEFT (CH_EXT+9)
00830
00831
00832
00833
00834
00835
00836
00837 #define LAM_SOURCE(c, s) (c<<24 | ((s) & 0xFFFFFF))
00838
00839
00840
00841
00842
00843 #define LAM_STATION(s) (1<<(s-1))
00844
00845
00846
00847
00848
00849 #define LAM_SOURCE_CRATE(c) (c>>24)
00850
00851
00852
00853
00854
00855 #define LAM_SOURCE_STATION(s) ((s) & 0xFFFFFF)
00856
00857
00858
00859 #define CNAF 0x1
00860 #define CNAF_nQ 0x2
00861
00862 #define CNAF_INHIBIT_SET 0x100
00863 #define CNAF_INHIBIT_CLEAR 0x101
00864 #define CNAF_CRATE_CLEAR 0x102
00865 #define CNAF_CRATE_ZINIT 0x103
00866 #define CNAF_TEST 0x110
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876 #ifndef MAX
00877 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
00878 #endif
00879
00880
00881
00882 #ifndef MIN
00883 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
00884 #endif
00885
00886
00887
00888
00889
00890 #define ALIGN8(x) (((x)+7) & ~7)
00891
00892
00893
00894 #define VALIGN(adr,align) (((PTYPE) (adr)+align-1) & ~(align-1))
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905 #define EVENTID_ALL -1
00906 #define TRIGGER_ALL -1
00907
00908
00909
00910 #define MT_ERROR (1<<0)
00911 #define MT_INFO (1<<1)
00912 #define MT_DEBUG (1<<2)
00913 #define MT_USER (1<<3)
00914 #define MT_LOG (1<<4)
00915 #define MT_TALK (1<<5)
00916 #define MT_CALL (1<<6)
00917 #define MT_ALL 0xFF
00918
00919 #define MERROR MT_ERROR, __FILE__, __LINE__
00920 #define MINFO MT_INFO, __FILE__, __LINE__
00921 #define MDEBUG MT_DEBUG, __FILE__, __LINE__
00922 #define MUSER MT_USER, __FILE__, __LINE__
00923 #define MLOG MT_LOG, __FILE__, __LINE__
00924 #define MTALK MT_TALK, __FILE__, __LINE__
00925 #define MCALL MT_CALL, __FILE__, __LINE__
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941 #define SUCCESS 1
00942 #define CM_SUCCESS 1
00943 #define CM_SET_ERROR 102
00944 #define CM_NO_CLIENT 103
00945 #define CM_DB_ERROR 104
00946 #define CM_UNDEF_EXP 105
00947 #define CM_VERSION_MISMATCH 106
00948 #define CM_SHUTDOWN 107
00949 #define CM_WRONG_PASSWORD 108
00950 #define CM_UNDEF_ENVIRON 109
00951 #define CM_DEFERRED_TRANSITION 110
00952 #define CM_TRANSITION_IN_PROGRESS 111
00953 #define CM_TIMEOUT 112
00954 #define CM_INVALID_TRANSITION 113
00955 #define CM_TOO_MANY_REQUESTS 114
00956
00957
00958
00959
00960
00961
00962
00963 #define BM_SUCCESS 1
00964 #define BM_CREATED 202
00965 #define BM_NO_MEMORY 203
00966 #define BM_INVALID_NAME 204
00967 #define BM_INVALID_HANDLE 205
00968 #define BM_NO_SLOT 206
00969 #define BM_NO_MUTEX 207
00970 #define BM_NOT_FOUND 208
00971 #define BM_ASYNC_RETURN 209
00972 #define BM_TRUNCATED 210
00973 #define BM_MULTIPLE_HOSTS 211
00974 #define BM_MEMSIZE_MISMATCH 212
00975 #define BM_CONFLICT 213
00976 #define BM_EXIT 214
00977 #define BM_INVALID_PARAM 215
00978 #define BM_MORE_EVENTS 216
00979 #define BM_INVALID_MIXING 217
00980 #define BM_NO_SHM 218
00981
00982
00983
00984
00985
00986
00987 #define DB_SUCCESS 1
00988 #define DB_CREATED 302
00989 #define DB_NO_MEMORY 303
00990 #define DB_INVALID_NAME 304
00991 #define DB_INVALID_HANDLE 305
00992 #define DB_NO_SLOT 306
00993 #define DB_NO_MUTEX 307
00994 #define DB_MEMSIZE_MISMATCH 308
00995 #define DB_INVALID_PARAM 309
00996 #define DB_FULL 310
00997 #define DB_KEY_EXIST 311
00998 #define DB_NO_KEY 312
00999 #define DB_KEY_CREATED 313
01000 #define DB_TRUNCATED 314
01001 #define DB_TYPE_MISMATCH 315
01002 #define DB_NO_MORE_SUBKEYS 316
01003 #define DB_FILE_ERROR 317
01004 #define DB_NO_ACCESS 318
01005 #define DB_STRUCT_SIZE_MISMATCH 319
01006 #define DB_OPEN_RECORD 320
01007 #define DB_OUT_OF_RANGE 321
01008 #define DB_INVALID_LINK 322
01009 #define DB_CORRUPTED 323
01010 #define DB_STRUCT_MISMATCH 324
01011 #define DB_TIMEOUT 325
01012 #define DB_VERSION_MISMATCH 326
01013
01014
01015
01016
01017
01018
01019 #define SS_SUCCESS 1
01020 #define SS_CREATED 402
01021 #define SS_NO_MEMORY 403
01022 #define SS_INVALID_NAME 404
01023 #define SS_INVALID_HANDLE 405
01024 #define SS_INVALID_ADDRESS 406
01025 #define SS_FILE_ERROR 407
01026 #define SS_NO_MUTEX 408
01027 #define SS_NO_PROCESS 409
01028 #define SS_NO_THREAD 410
01029 #define SS_SOCKET_ERROR 411
01030 #define SS_TIMEOUT 412
01031 #define SS_SERVER_RECV 413
01032 #define SS_CLIENT_RECV 414
01033 #define SS_ABORT 415
01034 #define SS_EXIT 416
01035 #define SS_NO_TAPE 417
01036 #define SS_DEV_BUSY 418
01037 #define SS_IO_ERROR 419
01038 #define SS_TAPE_ERROR 420
01039 #define SS_NO_DRIVER 421
01040 #define SS_END_OF_TAPE 422
01041 #define SS_END_OF_FILE 423
01042 #define SS_FILE_EXISTS 424
01043 #define SS_NO_SPACE 425
01044 #define SS_INVALID_FORMAT 426
01045 #define SS_NO_ROOT 427
01046
01047
01048
01049
01050
01051
01052 #define RPC_SUCCESS 1
01053 #define RPC_ABORT SS_ABORT
01054 #define RPC_NO_CONNECTION 502
01055 #define RPC_NET_ERROR 503
01056 #define RPC_TIMEOUT 504
01057 #define RPC_EXCEED_BUFFER 505
01058 #define RPC_NOT_REGISTERED 506
01059 #define RPC_CONNCLOSED 507
01060 #define RPC_INVALID_ID 508
01061 #define RPC_SHUTDOWN 509
01062 #define RPC_NO_MEMORY 510
01063 #define RPC_DOUBLE_DEFINED 511
01064
01065
01066
01067
01068
01069
01070 #define FE_SUCCESS 1
01071 #define FE_ERR_ODB 602
01072 #define FE_ERR_HW 603
01073 #define FE_ERR_DISABLED 604
01074 #define FE_ERR_DRIVER 605
01075
01076
01077
01078 #define HS_SUCCESS 1
01079 #define HS_FILE_ERROR 702
01080 #define HS_NO_MEMORY 703
01081 #define HS_TRUNCATED 704
01082 #define HS_WRONG_INDEX 705
01083 #define HS_UNDEFINED_EVENT 706
01084 #define HS_UNDEFINED_VAR 707
01085
01086
01087
01088 #define FTP_SUCCESS 1
01089 #define FTP_NET_ERROR 802
01090 #define FTP_FILE_ERROR 803
01091 #define FTP_RESPONSE_ERROR 804
01092 #define FTP_INVALID_ARG 805
01093
01094
01095
01096 #define EL_SUCCESS 1
01097 #define EL_FILE_ERROR 902
01098 #define EL_NO_MESSAGE 903
01099 #define EL_TRUNCATED 904
01100 #define EL_FIRST_MSG 905
01101 #define EL_LAST_MSG 906
01102
01103
01104
01105 #define AL_SUCCESS 1
01106 #define AL_INVALID_NAME 1002
01107 #define AL_ERROR_ODB 1003
01108 #define AL_RESET 1004
01109
01110
01111
01112 #define CMD_INIT (1<<0)
01113 #define CMD_EXIT (1<<1)
01114 #define CMD_IDLE (1<<2)
01115 #define CMD_SET (1<<3)
01116 #define CMD_SET_ALL (1<<4)
01117 #define CMD_GET (1<<5)
01118 #define CMD_GET_ALL (1<<6)
01119 #define CMD_GET_CURRENT (1<<7)
01120 #define CMD_GET_CURRENT_ALL (1<<8)
01121 #define CMD_SET_CURRENT_LIMIT (1<<9)
01122 #define CMD_SET_CURRENT_LIMIT_ALL (1<<10)
01123 #define CMD_GET_DEMAND (1<<11)
01124 #define CMD_GET_DEFAULT_NAME (1<<12)
01125 #define CMD_GET_DEFAULT_THRESHOLD (1<<13)
01126 #define CMD_SET_LABEL (1<<14)
01127 #define CMD_ENABLE_COMMAND (1<<15)
01128 #define CMD_DISABLE_COMMAND (1<<16)
01129
01130
01131
01132 #define CMD_WRITE 100
01133 #define CMD_READ 101
01134 #define CMD_PUTS 102
01135 #define CMD_GETS 103
01136 #define CMD_DEBUG 104
01137 #define CMD_NAME 105
01138
01139
01140
01141 #define CMD_INTERRUPT_ENABLE 100
01142 #define CMD_INTERRUPT_DISABLE 101
01143 #define CMD_INTERRUPT_ATTACH 102
01144 #define CMD_INTERRUPT_DETACH 103
01145
01146
01147
01148 #define BD_GETS(s,z,p,t) info->bd(CMD_GETS, info->bd_info, s, z, p, t)
01149 #define BD_READS(s,z,p,t) info->bd(CMD_READ, info->bd_info, s, z, p, t)
01150 #define BD_PUTS(s) info->bd(CMD_PUTS, info->bd_info, s)
01151 #define BD_WRITES(s) info->bd(CMD_WRITE, info->bd_info, s)
01152
01153
01154
01155
01156
01157
01158
01159
01160 #define ANA_CONTINUE 1
01161 #define ANA_SKIP 0
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176 typedef struct {
01177 short int event_id;
01178 short int trigger_mask;
01179 DWORD serial_number;
01180 DWORD time_stamp;
01181 DWORD data_size;
01182 } EVENT_HEADER;
01183
01184
01185
01186
01187
01188
01189 #define TRIGGER_MASK(e) ((((EVENT_HEADER *) e)-1)->trigger_mask)
01190
01191
01192
01193
01194
01195
01196 #define EVENT_ID(e) ((((EVENT_HEADER *) e)-1)->event_id)
01197
01198
01199
01200
01201
01202
01203 #define SERIAL_NUMBER(e) ((((EVENT_HEADER *) e)-1)->serial_number)
01204
01205
01206
01207
01208
01209
01210 #define TIME_STAMP(e) ((((EVENT_HEADER *) e)-1)->time_stamp)
01211 #define EVENT_SOURCE(e,o) (* (INT*) (e+o))
01212
01213
01214
01215 #define EVENTID_BOR ((short int) 0x8000)
01216 #define EVENTID_EOR ((short int) 0x8001)
01217 #define EVENTID_MESSAGE ((short int) 0x8002)
01218
01219
01220
01221 #define EVENTID_FRAG1 ((unsigned short) 0xC000)
01222 #define EVENTID_FRAG ((unsigned short) 0xD000)
01223
01224
01225
01226 #define MIDAS_MAGIC 0x494d
01227
01228
01229
01230
01231 typedef struct {
01232 INT id;
01233 BOOL valid;
01234 short int event_id;
01235 short int trigger_mask;
01236 INT sampling_type;
01237
01238 void (*dispatch) (HNDLE, HNDLE, EVENT_HEADER *, void *);
01239 } EVENT_REQUEST;
01240
01241 typedef struct {
01242 char name[NAME_LENGTH];
01243 INT pid;
01244 INT tid;
01245 INT thandle;
01246 INT port;
01247 INT read_pointer;
01248 INT max_request_index;
01249 INT num_received_events;
01250 INT num_sent_events;
01251 INT num_waiting_events;
01252 float data_rate;
01253 BOOL read_wait;
01254 INT write_wait;
01255 BOOL wake_up;
01256 BOOL all_flag;
01257 DWORD last_activity;
01258 DWORD watchdog_timeout;
01259
01260 EVENT_REQUEST event_request[MAX_EVENT_REQUESTS];
01261
01262 } BUFFER_CLIENT;
01263
01264 typedef struct {
01265 char name[NAME_LENGTH];
01266 INT num_clients;
01267 INT max_client_index;
01268 INT size;
01269 INT read_pointer;
01270 INT write_pointer;
01271 INT num_in_events;
01272 INT num_out_events;
01273
01274 BUFFER_CLIENT client[MAX_CLIENTS];
01275
01276 } BUFFER_HEADER;
01277
01278
01279
01280 typedef struct {
01281 BOOL attached;
01282 INT client_index;
01283 BUFFER_HEADER *buffer_header;
01284 void *buffer_data;
01285 char *read_cache;
01286 INT read_cache_size;
01287 INT read_cache_rp;
01288 INT read_cache_wp;
01289 char *write_cache;
01290 INT write_cache_size;
01291 INT write_cache_rp;
01292 INT write_cache_wp;
01293 HNDLE mutex;
01294 INT shm_handle;
01295 INT index;
01296 BOOL callback;
01297
01298 } BUFFER;
01299
01300 typedef struct {
01301 DWORD type;
01302 INT num_values;
01303 char name[NAME_LENGTH];
01304 INT data;
01305 INT total_size;
01306 INT item_size;
01307 WORD access_mode;
01308 WORD notify_count;
01309 INT next_key;
01310 INT parent_keylist;
01311 INT last_written;
01312 } KEY;
01313
01314 typedef struct {
01315 INT parent;
01316 INT num_keys;
01317 INT first_key;
01318 } KEYLIST;
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329 #define DF_INPUT (1<<0)
01330 #define DF_OUTPUT (1<<1)
01331 #define DF_PRIO_DEVICE (1<<2)
01332 #define DF_READ_ONLY (1<<3)
01333
01334 typedef struct {
01335 char name[NAME_LENGTH];
01336 INT(*bd) (INT cmd, ...);
01337 void *bd_info;
01338 } BUS_DRIVER;
01339
01340 typedef struct {
01341 char name[NAME_LENGTH];
01342 INT(*dd) (INT cmd, ...);
01343 INT channels;
01344 INT(*bd) (INT cmd, ...);
01345 DWORD flags;
01346 void *dd_info;
01347 } DEVICE_DRIVER;
01348
01349 typedef struct {
01350 WORD event_id;
01351 WORD trigger_mask;
01352 char buffer[NAME_LENGTH];
01353 INT eq_type;
01354 INT source;
01355 char format[8];
01356 BOOL enabled;
01357 INT read_on;
01358 INT period;
01359 double event_limit;
01360 DWORD num_subevents;
01361 INT history;
01362 char frontend_host[NAME_LENGTH];
01363 char frontend_name[NAME_LENGTH];
01364 char frontend_file_name[256];
01365 } EQUIPMENT_INFO;
01366
01367 typedef struct {
01368 double events_sent;
01369 double events_per_sec;
01370 double kbytes_per_sec;
01371 } EQUIPMENT_STATS;
01372
01373 typedef struct eqpmnt *PEQUIPMENT;
01374
01375 typedef struct eqpmnt {
01376 char name[NAME_LENGTH];
01377 EQUIPMENT_INFO info;
01378 INT(*readout) (char *, INT);
01379 INT(*cd) (INT cmd, PEQUIPMENT);
01380 DEVICE_DRIVER *driver;
01381 void *event_descrip;
01382 void *cd_info;
01383 INT status;
01384 DWORD last_called;
01385 DWORD last_idle;
01386 DWORD poll_count;
01387 INT format;
01388 HNDLE buffer_handle;
01389 HNDLE hkey_variables;
01390 DWORD serial_number;
01391 DWORD subevent_number;
01392 DWORD odb_out;
01393 DWORD odb_in;
01394 DWORD bytes_sent;
01395 DWORD events_sent;
01396 EQUIPMENT_STATS stats;
01397 } EQUIPMENT;
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407 #define BANK_FORMAT_VERSION 1
01408 #define BANK_FORMAT_32BIT (1<<4)
01409
01410 typedef struct {
01411 DWORD data_size;
01412 DWORD flags;
01413 } BANK_HEADER;
01414
01415 typedef struct {
01416 char name[4];
01417 WORD type;
01418 WORD data_size;
01419 } BANK;
01420
01421 typedef struct {
01422 char name[4];
01423 DWORD type;
01424 DWORD data_size;
01425 } BANK32;
01426
01427 typedef struct {
01428 char name[NAME_LENGTH];
01429 DWORD type;
01430 DWORD n_data;
01431 } TAG;
01432
01433 typedef struct {
01434 char name[9];
01435 WORD type;
01436 DWORD size;
01437 char **init_str;
01438 BOOL output_flag;
01439 void *addr;
01440 DWORD n_data;
01441 HNDLE def_key;
01442 } BANK_LIST;
01443
01444
01445
01446
01447
01448
01449
01450
01451 typedef struct {
01452 char name[NAME_LENGTH];
01453 char author[NAME_LENGTH];
01454 INT(*analyzer) (EVENT_HEADER *, void *);
01455
01456 INT(*bor) (INT run_number);
01457 INT(*eor) (INT run_number);
01458 INT(*init) ();
01459 INT(*exit) ();
01460 void *parameters;
01461 INT param_size;
01462 char **init_str;
01463 BOOL enabled;
01464 void *histo_folder;
01465 } ANA_MODULE;
01466
01467 typedef struct {
01468 INT event_id;
01469 INT trigger_mask;
01470 INT sampling_type;
01471 char buffer[NAME_LENGTH];
01472 BOOL enabled;
01473 char client_name[NAME_LENGTH];
01474 char host[NAME_LENGTH];
01475 } AR_INFO;
01476
01477 typedef struct {
01478 double events_received;
01479 double events_per_sec;
01480 double events_written;
01481 } AR_STATS;
01482
01483 typedef struct {
01484 char event_name[NAME_LENGTH];
01485 AR_INFO ar_info;
01486 INT(*analyzer) (EVENT_HEADER *, void *);
01487 ANA_MODULE **ana_module;
01488 BANK_LIST *bank_list;
01489 INT rwnt_buffer_size;
01490 BOOL use_tests;
01491 char **init_string;
01492 INT status;
01493 HNDLE buffer_handle;
01494 HNDLE request_id;
01495 HNDLE hkey_variables;
01496 HNDLE hkey_common;
01497 void *addr;
01498 struct {
01499 DWORD run;
01500 DWORD serial;
01501 DWORD time;
01502 } number;
01503 DWORD events_received;
01504 DWORD events_written;
01505 AR_STATS ar_stats;
01506
01507 } ANALYZE_REQUEST;
01508
01509
01510
01511 typedef struct {
01512 char name[80];
01513 BOOL registered;
01514 DWORD count;
01515 DWORD previous_count;
01516 BOOL value;
01517 } ANA_TEST;
01518
01519 #define SET_TEST(t, v) { if (!t.registered) test_register(&t); t.value = (v); }
01520 #define TEST(t) (t.value)
01521
01522 #ifdef DEFINE_TESTS
01523 #define DEF_TEST(t) ANA_TEST t = { #t, 0, 0, FALSE };
01524 #else
01525 #define DEF_TEST(t) extern ANA_TEST t;
01526 #endif
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536 #define RT_DATA (*((DWORD *) "HSDA"))
01537 #define RT_DEF (*((DWORD *) "HSDF"))
01538
01539 typedef struct {
01540 DWORD record_type;
01541 DWORD event_id;
01542 DWORD time;
01543 DWORD def_offset;
01544 DWORD data_size;
01545 } HIST_RECORD;
01546
01547 typedef struct {
01548 DWORD event_id;
01549 char event_name[NAME_LENGTH];
01550 DWORD def_offset;
01551 } DEF_RECORD;
01552
01553 typedef struct {
01554 DWORD event_id;
01555 DWORD time;
01556 DWORD offset;
01557 } INDEX_RECORD;
01558
01559 typedef struct {
01560 DWORD event_id;
01561 char event_name[NAME_LENGTH];
01562 DWORD n_tag;
01563 TAG *tag;
01564 DWORD hist_fh;
01565 DWORD index_fh;
01566 DWORD def_fh;
01567 DWORD base_time;
01568 DWORD def_offset;
01569 } HISTORY;
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582 typedef struct {
01583 INT state;
01584 INT online_mode;
01585 INT run_number;
01586 INT transition_in_progress;
01587 INT requested_transition;
01588 char start_time[32];
01589 DWORD start_time_binary;
01590 char stop_time[32];
01591 DWORD stop_time_binary;
01592 } RUNINFO;
01593
01594 #define RUNINFO_STR(_name) char *_name[] = {\
01595 "[.]",\
01596 "State = INT : 1",\
01597 "Online Mode = INT : 1",\
01598 "Run number = INT : 0",\
01599 "Transition in progress = INT : 0",\
01600 "Requested transition = INT : 0",\
01601 "Start time = STRING : [32] Tue Sep 09 15:04:42 1997",\
01602 "Start time binary = DWORD : 0",\
01603 "Stop time = STRING : [32] Tue Sep 09 15:04:42 1997",\
01604 "Stop time binary = DWORD : 0",\
01605 "",\
01606 NULL }
01607
01608
01609
01610
01611
01612
01613
01614
01615
01616
01617
01618
01619 typedef struct {
01620 BOOL required;
01621 INT watchdog_timeout;
01622 DWORD check_interval;
01623 char start_command[256];
01624 BOOL auto_start;
01625 BOOL auto_stop;
01626 BOOL auto_restart;
01627 char alarm_class[32];
01628 DWORD first_failed;
01629 } PROGRAM_INFO;
01630
01631 #define AT_INTERNAL 1
01632 #define AT_PROGRAM 2
01633 #define AT_EVALUATED 3
01634 #define AT_PERIODIC 4
01635 #define AT_LAST 4
01636
01637 #define PROGRAM_INFO_STR(_name) char *_name[] = {\
01638 "[.]",\
01639 "Required = BOOL : n",\
01640 "Watchdog timeout = INT : 10000",\
01641 "Check interval = DWORD : 180000",\
01642 "Start command = STRING : [256] ",\
01643 "Auto start = BOOL : n",\
01644 "Auto stop = BOOL : n",\
01645 "Auto restart = BOOL : n",\
01646 "Alarm class = STRING : [32] ",\
01647 "First failed = DWORD : 0",\
01648 "",\
01649 NULL }
01650
01651
01652
01653 typedef struct {
01654 BOOL write_system_message;
01655 BOOL write_elog_message;
01656 INT system_message_interval;
01657 DWORD system_message_last;
01658 char execute_command[256];
01659 INT execute_interval;
01660 DWORD execute_last;
01661 BOOL stop_run;
01662 char display_bgcolor[32];
01663 char display_fgcolor[32];
01664 } ALARM_CLASS;
01665
01666 #define ALARM_CLASS_STR(_name) char *_name[] = {\
01667 "[.]",\
01668 "Write system message = BOOL : y",\
01669 "Write Elog message = BOOL : n",\
01670 "System message interval = INT : 60",\
01671 "System message last = DWORD : 0",\
01672 "Execute command = STRING : [256] ",\
01673 "Execute interval = INT : 0",\
01674 "Execute last = DWORD : 0",\
01675 "Stop run = BOOL : n",\
01676 "Display BGColor = STRING : [32] red",\
01677 "Display FGColor = STRING : [32] black",\
01678 "",\
01679 NULL }
01680
01681
01682
01683 typedef struct {
01684 BOOL active;
01685 INT triggered;
01686 INT type;
01687 INT check_interval;
01688 DWORD checked_last;
01689 char time_triggered_first[32];
01690 char time_triggered_last[32];
01691 char condition[256];
01692 char alarm_class[32];
01693 char alarm_message[80];
01694 } ALARM;
01695
01696 #define ALARM_ODB_STR(_name) char *_name[] = {\
01697 "[.]",\
01698 "Active = BOOL : n",\
01699 "Triggered = INT : 0",\
01700 "Type = INT : 3",\
01701 "Check interval = INT : 60",\
01702 "Checked last = DWORD : 0",\
01703 "Time triggered first = STRING : [32] ",\
01704 "Time triggered last = STRING : [32] ",\
01705 "Condition = STRING : [256] /Runinfo/Run number > 100",\
01706 "Alarm Class = STRING : [32] Alarm",\
01707 "Alarm Message = STRING : [80] Run number became too large",\
01708 "",\
01709 NULL }
01710
01711 #define ALARM_PERIODIC_STR(_name) char *_name[] = {\
01712 "[.]",\
01713 "Active = BOOL : n",\
01714 "Triggered = INT : 0",\
01715 "Type = INT : 4",\
01716 "Check interval = INT : 28800",\
01717 "Checked last = DWORD : 0",\
01718 "Time triggered first = STRING : [32] ",\
01719 "Time triggered last = STRING : [32] ",\
01720 "Condition = STRING : [256] ",\
01721 "Alarm Class = STRING : [32] Warning",\
01722 "Alarm Message = STRING : [80] Please do your shift checks",\
01723 "",\
01724 NULL }
01725
01726
01727
01728
01729
01730 #ifndef DOXYGEN_SHOULD_SKIP_THIS
01731
01732
01733
01734 #ifdef _MEM_DBG
01735 #define M_MALLOC(x) dbg_malloc((x), __FILE__, __LINE__)
01736 #define M_CALLOC(x,y) dbg_calloc((x), (y), __FILE__, __LINE__)
01737 #define M_FREE(x) dbg_free ((x), __FILE__, __LINE__)
01738 #else
01739 #define M_MALLOC(x) malloc(x)
01740 #define M_CALLOC(x,y) calloc(x,y)
01741 #define M_FREE(x) free(x)
01742 #endif
01743
01744 void *dbg_malloc(unsigned int size, char *file, int line);
01745 void *dbg_calloc(unsigned int size, unsigned int count, char *file, int line);
01746 void dbg_free(void *adr, char *file, int line);
01747
01748
01749
01750 #ifdef extname
01751 #define PAWC_NAME pawc_
01752 #else
01753 #define PAWC_NAME PAWC
01754 #endif
01755
01756 #define PAWC_DEFINE(size) \
01757 INT PAWC_NAME[size/4]; \
01758 INT pawc_size = size
01759
01760
01761 #undef GetCurrentTime
01762
01763
01764
01765
01766
01767 #define RPC_IN (1 << 0)
01768 #define RPC_OUT (1 << 1)
01769 #define RPC_POINTER (1 << 2)
01770 #define RPC_FIXARRAY (1 << 3)
01771 #define RPC_VARARRAY (1 << 4)
01772 #define RPC_OUTGOING (1 << 5)
01773
01774
01775
01776 #define ST_NONE 0
01777 #define ST_SINGLE 1
01778 #define ST_MTHREAD 2
01779 #define ST_MPROCESS 3
01780 #define ST_SUBPROCESS 4
01781 #define ST_REMOTE 5
01782
01783
01784
01785 typedef struct {
01786 WORD tid;
01787 WORD flags;
01788 INT n;
01789 } RPC_PARAM;
01790
01791 typedef struct {
01792 INT id;
01793 char *name;
01794 RPC_PARAM param[20];
01795 INT(*dispatch) (INT, void **);
01796 } RPC_LIST;
01797
01798
01799
01800 #define RPC_MIN_ID 1
01801 #define RPC_MAX_ID 9999
01802
01803
01804
01805 #define CF_ENDIAN (1<<0)
01806 #define CF_IEEE2VAX (1<<1)
01807 #define CF_VAX2IEEE (1<<2)
01808 #define CF_ASCII (1<<3)
01809
01810 #define CBYTE(_i) (* ((BYTE *) prpc_param[_i]))
01811 #define CPBYTE(_i) ( ((BYTE *) prpc_param[_i]))
01812
01813 #define CSHORT(_i) (* ((short *) prpc_param[_i]))
01814 #define CPSHORT(_i) ( ((short *) prpc_param[_i]))
01815
01816 #define CINT(_i) (* ((INT *) prpc_param[_i]))
01817 #define CPINT(_i) ( ((INT *) prpc_param[_i]))
01818
01819 #define CWORD(_i) (* ((WORD *) prpc_param[_i]))
01820 #define CPWORD(_i) ( ((WORD *) prpc_param[_i]))
01821
01822 #define CLONG(_i) (* ((long *) prpc_param[_i]))
01823 #define CPLONG(_i) ( ((long *) prpc_param[_i]))
01824
01825 #define CDWORD(_i) (* ((DWORD *) prpc_param[_i]))
01826 #define CPDWORD(_i) ( ((DWORD *) prpc_param[_i]))
01827
01828 #define CHNDLE(_i) (* ((HNDLE *) prpc_param[_i]))
01829 #define CPHNDLE(_i) ( ((HNDLE *) prpc_param[_i]))
01830
01831 #define CBOOL(_i) (* ((BOOL *) prpc_param[_i]))
01832 #define CPBOOL(_i) ( ((BOOL *) prpc_param[_i]))
01833
01834 #define CFLOAT(_i) (* ((float *) prpc_param[_i]))
01835 #define CPFLOAT(_i) ( ((float *) prpc_param[_i]))
01836
01837 #define CDOUBLE(_i) (* ((double *) prpc_param[_i]))
01838 #define CPDOUBLE(_i) ( ((double *) prpc_param[_i]))
01839
01840 #define CSTRING(_i) ( ((char *) prpc_param[_i]))
01841 #define CARRAY(_i) ( ((void *) prpc_param[_i]))
01842
01843 #define CBYTE(_i) (* ((BYTE *) prpc_param[_i]))
01844 #define CPBYTE(_i) ( ((BYTE *) prpc_param[_i]))
01845
01846 #define CSHORT(_i) (* ((short *) prpc_param[_i]))
01847 #define CPSHORT(_i) ( ((short *) prpc_param[_i]))
01848
01849 #define CINT(_i) (* ((INT *) prpc_param[_i]))
01850 #define CPINT(_i) ( ((INT *) prpc_param[_i]))
01851
01852 #define CWORD(_i) (* ((WORD *) prpc_param[_i]))
01853 #define CPWORD(_i) ( ((WORD *) prpc_param[_i]))
01854
01855 #define CLONG(_i) (* ((long *) prpc_param[_i]))
01856 #define CPLONG(_i) ( ((long *) prpc_param[_i]))
01857
01858 #define CDWORD(_i) (* ((DWORD *) prpc_param[_i]))
01859 #define CPDWORD(_i) ( ((DWORD *) prpc_param[_i]))
01860
01861 #define CHNDLE(_i) (* ((HNDLE *) prpc_param[_i]))
01862 #define CPHNDLE(_i) ( ((HNDLE *) prpc_param[_i]))
01863
01864 #define CBOOL(_i) (* ((BOOL *) prpc_param[_i]))
01865 #define CPBOOL(_i) ( ((BOOL *) prpc_param[_i]))
01866
01867 #define CFLOAT(_i) (* ((float *) prpc_param[_i]))
01868 #define CPFLOAT(_i) ( ((float *) prpc_param[_i]))
01869
01870 #define CDOUBLE(_i) (* ((double *) prpc_param[_i]))
01871 #define CPDOUBLE(_i) ( ((double *) prpc_param[_i]))
01872
01873 #define CSTRING(_i) ( ((char *) prpc_param[_i]))
01874 #define CARRAY(_i) ( ((void *) prpc_param[_i]))
01875
01876
01877
01878 #define cBYTE (* ((BYTE *) prpc_param[--n_param]))
01879 #define cPBYTE ( ((BYTE *) prpc_param[--n_param]))
01880
01881 #define cSHORT (* ((short *) prpc_param[--n_param]))
01882 #define cPSHORT ( ((short *) prpc_param[--n_param]))
01883
01884 #define cINT (* ((INT *) prpc_param[--n_param]))
01885 #define cPINT ( ((INT *) prpc_param[--n_param]))
01886
01887 #define cWORD (* ((WORD *) prpc_param[--n_param]))
01888 #define cPWORD ( ((WORD *) prpc_param[--n_param]))
01889
01890 #define cLONG (* ((long *) prpc_param[--n_param]))
01891 #define cPLONG ( ((long *) prpc_param[--n_param]))
01892
01893 #define cDWORD (* ((DWORD *) prpc_param[--n_param]))
01894 #define cPDWORD ( ((DWORD *) prpc_param[--n_param]))
01895
01896 #define cHNDLE (* ((HNDLE *) prpc_param[--n_param]))
01897 #define cPHNDLE ( ((HNDLE *) prpc_param[--n_param]))
01898
01899 #define cBOOL (* ((BOOL *) prpc_param[--n_param]))
01900 #define cPBOOL ( ((BOOL *) prpc_param[--n_param]))
01901
01902 #define cFLOAT (* ((float *) prpc_param[--n_param]))
01903 #define cPFLOAT ( ((float *) prpc_param[--n_param]))
01904
01905 #define cDOUBLE (* ((double *) prpc_param[--n_param]))
01906 #define cPDOUBLE ( ((double *) prpc_param[--n_param]))
01907
01908 #define cSTRING ( ((char *) prpc_param[--n_param]))
01909 #define cARRAY ( ((void *) prpc_param[--n_param]))
01910
01911
01912
01913
01914 #ifdef __cplusplus
01915 extern "C" {
01916 #endif
01917
01918
01919 #if defined(OS_WINNT) && defined(MIDAS_DLL)
01920 #define EXPRT __declspec(dllexport)
01921 #else
01922 #define EXPRT
01923 #endif
01924
01925
01926 INT EXPRT cm_get_error(INT code, char *string);
01927 char EXPRT *cm_get_version(void);
01928 INT EXPRT cm_get_environment(char *host_name, int host_name_size,
01929 char *exp_name, int exp_name_size);
01930 INT EXPRT cm_list_experiments(char *host_name,
01931 char exp_name[MAX_EXPERIMENT][NAME_LENGTH]);
01932 INT EXPRT cm_select_experiment(char *host_name, char *exp_name);
01933 INT EXPRT cm_connect_experiment(char *host_name, char *exp_name,
01934 char *client_name, void (*func) (char *));
01935 INT EXPRT cm_connect_experiment1(char *host_name, char *exp_name,
01936 char *client_name,
01937 void (*func) (char *), INT odb_size,
01938 DWORD watchdog_timeout);
01939 INT EXPRT cm_disconnect_experiment(void);
01940 INT EXPRT cm_register_transition(INT transition, INT(*func) (INT, char *), int sequence_number);
01941 INT EXPRT cm_set_transition_sequence(INT transition, INT sequence_number);
01942 INT EXPRT cm_query_transition(int *transition, int *run_number, int *trans_time);
01943 INT EXPRT cm_register_deferred_transition(INT transition, BOOL(*func) (INT, BOOL));
01944 INT EXPRT cm_check_deferred_transition(void);
01945 INT EXPRT cm_transition(INT transition, INT run_number, char *error,
01946 INT strsize, INT async_flag, INT debug_flag);
01947 INT EXPRT cm_register_server(void);
01948 INT EXPRT cm_register_function(INT id, INT(*func) (INT, void **));
01949 INT EXPRT cm_connect_client(char *client_name, HNDLE * hConn);
01950 INT EXPRT cm_disconnect_client(HNDLE hConn, BOOL bShutdown);
01951 INT EXPRT cm_set_experiment_database(HNDLE hDB, HNDLE hKeyClient);
01952 INT EXPRT cm_get_experiment_database(HNDLE * hDB, HNDLE * hKeyClient);
01953 INT EXPRT cm_set_experiment_mutex(INT mutex_alarm, INT mutex_elog);
01954 INT EXPRT cm_get_experiment_mutex(INT * mutex_alarm, INT * mutex_elog);
01955 INT EXPRT cm_set_client_info(HNDLE hDB, HNDLE * hKeyClient,
01956 char *host_name, char *client_name,
01957 INT computer_id, char *password, DWORD watchdog_timeout);
01958 INT EXPRT cm_get_client_info(char *client_name);
01959 INT EXPRT cm_set_watchdog_params(BOOL call_watchdog, DWORD timeout);
01960 INT EXPRT cm_get_watchdog_params(BOOL * call_watchdog, DWORD * timeout);
01961 INT EXPRT cm_get_watchdog_info(HNDLE hDB, char *client_name,
01962 DWORD * timeout, DWORD * last);
01963 INT EXPRT cm_enable_watchdog(BOOL flag);
01964 void EXPRT cm_watchdog(int);
01965 INT EXPRT cm_shutdown(char *name, BOOL bUnique);
01966 INT EXPRT cm_exist(char *name, BOOL bUnique);
01967 INT EXPRT cm_cleanup(char *client_name, BOOL ignore_timeout);
01968 INT EXPRT cm_yield(INT millisec);
01969 INT EXPRT cm_execute(char *command, char *result, INT buf_size);
01970 INT EXPRT cm_synchronize(DWORD * sec);
01971 INT EXPRT cm_asctime(char *str, INT buf_size);
01972 INT EXPRT cm_time(DWORD * time);
01973 BOOL EXPRT cm_is_ctrlc_pressed();
01974 void EXPRT cm_ack_ctrlc_pressed();
01975
01976 INT EXPRT cm_set_msg_print(INT system_mask, INT user_mask, int (*func) (const char *));
01977 INT EXPRT cm_msg(INT message_type, char *filename, INT line,
01978 const char *routine, const char *format, ...);
01979 INT EXPRT cm_msg1(INT message_type, char *filename, INT line,
01980 const char *facility, const char *routine, const char *format, ...);
01981 INT EXPRT cm_msg_register(void (*func)
01982 (HNDLE, HNDLE, EVENT_HEADER *, void *));
01983 INT EXPRT cm_msg_retrieve(INT n_message, char *message, INT * buf_size);
01984
01985 BOOL EXPRT equal_ustring(char *str1, char *str2);
01986 #ifndef HAVE_STRLCPY
01987 INT EXPRT strlcpy(char *dst, const char *src, INT size);
01988 INT EXPRT strlcat(char *dst, const char *src, INT size);
01989 #endif
01990
01991
01992 INT EXPRT bm_open_buffer(char *buffer_name, INT buffer_size, INT * buffer_handle);
01993 INT EXPRT bm_close_buffer(INT buffer_handle);
01994 INT EXPRT bm_close_all_buffers(void);
01995 INT EXPRT bm_init_buffer_counters(INT buffer_handle);
01996 INT EXPRT bm_get_buffer_info(INT buffer_handle, BUFFER_HEADER * buffer_header);
01997 INT EXPRT bm_get_buffer_level(INT buffer_handle, INT * n_bytes);
01998 INT EXPRT bm_set_cache_size(INT buffer_handle, INT read_size, INT write_size);
01999 INT EXPRT bm_compose_event(EVENT_HEADER * event_header,
02000 short int event_id, short int trigger_mask,
02001 DWORD size, DWORD serial);
02002 INT EXPRT bm_request_event(INT buffer_handle, short int event_id,
02003 short int trigger_mask, INT sampling_type,
02004 INT * request_id, void (*func) (HNDLE, HNDLE,
02005 EVENT_HEADER *, void *));
02006 INT EXPRT bm_add_event_request(INT buffer_handle, short int event_id,
02007 short int trigger_mask,
02008 INT sampling_type, void (*func) (HNDLE,
02009 HNDLE,
02010 EVENT_HEADER
02011 *,
02012 void *),
02013 INT request_id);
02014 INT EXPRT bm_delete_request(INT request_id);
02015 INT EXPRT bm_send_event(INT buffer_handle, void *event, INT buf_size, INT async_flag);
02016 INT EXPRT bm_receive_event(INT buffer_handle, void *destination,
02017 INT * buf_size, INT async_flag);
02018 INT EXPRT bm_skip_event(INT buffer_handle);
02019 INT EXPRT bm_flush_cache(INT buffer_handle, INT async_flag);
02020 INT EXPRT bm_poll_event(INT flag);
02021 INT EXPRT bm_empty_buffers(void);
02022
02023
02024 INT EXPRT db_open_database(char *database_name, INT database_size,
02025 HNDLE * hdb, char *client_name);
02026 INT EXPRT db_close_database(HNDLE database_handle);
02027 INT EXPRT db_close_all_databases(void);
02028 INT EXPRT db_protect_database(HNDLE database_handle);
02029
02030 INT EXPRT db_create_key(HNDLE hdb, HNDLE key_handle, char *key_name, DWORD type);
02031 INT EXPRT db_create_link(HNDLE hdb, HNDLE key_handle, char *link_name,
02032 char *destination);
02033 INT EXPRT db_set_value(HNDLE hdb, HNDLE hKeyRoot, char *key_name,
02034 void *data, INT size, INT num_values, DWORD type);
02035 INT EXPRT db_get_value(HNDLE hdb, HNDLE hKeyRoot, char *key_name,
02036 void *data, INT * size, DWORD type, BOOL create);
02037 INT EXPRT db_find_key(HNDLE hdb, HNDLE hkey, char *name, HNDLE * hsubkey);
02038 INT EXPRT db_find_link(HNDLE hDB, HNDLE hKey, char *key_name, HNDLE * subhKey);
02039 INT EXPRT db_find_key1(HNDLE hdb, HNDLE hkey, char *name, HNDLE * hsubkey);
02040 INT EXPRT db_find_link1(HNDLE hDB, HNDLE hKey, char *key_name, HNDLE * subhKey);
02041 INT EXPRT db_scan_tree(HNDLE hDB, HNDLE hKey, int level,
02042 INT(*callback) (HNDLE, HNDLE, KEY *, INT, void *), void *info);
02043 INT EXPRT db_scan_tree_link(HNDLE hDB, HNDLE hKey, int level,
02044 void (*callback) (HNDLE, HNDLE, KEY *, INT,
02045 void *), void *info);
02046 INT EXPRT db_get_path(HNDLE hDB, HNDLE hKey, char *path, INT buf_size);
02047 INT EXPRT db_delete_key(HNDLE database_handle, HNDLE key_handle, BOOL follow_links);
02048 INT EXPRT db_enum_key(HNDLE hdb, HNDLE key_handle, INT index, HNDLE * subkey_handle);
02049 INT EXPRT db_enum_link(HNDLE hdb, HNDLE key_handle, INT index, HNDLE * subkey_handle);
02050 INT EXPRT db_get_next_link(HNDLE hdb, HNDLE key_handle, HNDLE * subkey_handle);
02051 INT EXPRT db_get_key(HNDLE hdb, HNDLE key_handle, KEY * key);
02052 INT EXPRT db_get_key_info(HNDLE hDB, HNDLE hKey, char *name,
02053 INT name_size, INT * type, INT * num_values,
02054 INT * item_size);
02055 INT EXPRT db_get_key_time(HNDLE hdb, HNDLE key_handle, DWORD * delta);
02056 INT EXPRT db_rename_key(HNDLE hDB, HNDLE hKey, char *name);
02057 INT EXPRT db_reorder_key(HNDLE hDB, HNDLE hKey, INT index);
02058 INT EXPRT db_get_data(HNDLE hdb, HNDLE key_handle, void *data,
02059 INT * buf_size, DWORD type);
02060 INT EXPRT db_get_data1(HNDLE hDB, HNDLE hKey, void *data,
02061 INT * buf_size, DWORD type, INT * num_values);
02062 INT EXPRT db_get_data_index(HNDLE hDB, HNDLE hKey, void *data,
02063 INT * buf_size, INT index, DWORD type);
02064 INT EXPRT db_set_data(HNDLE hdb, HNDLE hKey, void *data, INT buf_size,
02065 INT num_values, DWORD type);
02066 INT EXPRT db_set_data_index(HNDLE hDB, HNDLE hKey, void *data, INT size,
02067 INT index, DWORD type);
02068 INT EXPRT db_set_data_index2(HNDLE hDB, HNDLE hKey, void *data,
02069 INT size, INT index, DWORD type, BOOL bNotify);
02070 INT EXPRT db_set_num_values(HNDLE hDB, HNDLE hKey, INT num_values);
02071 INT EXPRT db_merge_data(HNDLE hDB, HNDLE hKeyRoot, char *name,
02072 void *data, INT data_size, INT num_values, INT type);
02073 INT EXPRT db_set_mode(HNDLE hdb, HNDLE key_handle, WORD mode, BOOL recurse);
02074 INT EXPRT db_create_record(HNDLE hdb, HNDLE hkey, char *name, char *init_str);
02075 INT EXPRT db_check_record(HNDLE hDB, HNDLE hKey, char *key_name,
02076 char *rec_str, BOOL correct);
02077 INT EXPRT db_open_record(HNDLE hdb, HNDLE hkey, void *ptr, INT rec_size,
02078 WORD access, void (*dispatcher) (INT, INT,
02079 void *), void *info);
02080 INT EXPRT db_close_record(HNDLE hdb, HNDLE hkey);
02081 INT EXPRT db_get_record(HNDLE hdb, HNDLE hKey, void *data, INT * buf_size, INT align);
02082 INT EXPRT db_get_record_size(HNDLE hdb, HNDLE hKey, INT align, INT * buf_size);
02083 INT EXPRT db_set_record(HNDLE hdb, HNDLE hKey, void *data, INT buf_size, INT align);
02084 INT EXPRT db_send_changed_records(void);
02085 INT EXPRT db_get_open_records(HNDLE hDB, HNDLE hKey, char *str,
02086 INT buf_size, BOOL fix);
02087
02088 INT EXPRT db_add_open_record(HNDLE hDB, HNDLE hKey, WORD access_mode);
02089 INT EXPRT db_remove_open_record(HNDLE hDB, HNDLE hKey, BOOL lock);
02090
02091 INT EXPRT db_load(HNDLE hdb, HNDLE key_handle, char *filename, BOOL bRemote);
02092 INT EXPRT db_save(HNDLE hdb, HNDLE key_handle, char *filename, BOOL bRemote);
02093 INT EXPRT db_copy(HNDLE hDB, HNDLE hKey, char *buffer, INT * buffer_size, char *path);
02094 INT EXPRT db_paste(HNDLE hDB, HNDLE hKeyRoot, char *buffer);
02095 INT EXPRT db_save_struct(HNDLE hDB, HNDLE hKey, char *file_name,
02096 char *struct_name, BOOL append);
02097 INT EXPRT db_save_string(HNDLE hDB, HNDLE hKey, char *file_name,
02098 char *string_name, BOOL append);
02099 INT EXPRT db_save_xml(HNDLE hDB, HNDLE hKey, char *file_name);
02100
02101 INT EXPRT db_sprintf(char *string, void *data, INT data_size, INT index, DWORD type);
02102 INT EXPRT db_sprintfh(char *string, void *data, INT data_size, INT index, DWORD type);
02103 INT EXPRT db_sscanf(char *string, void *data, INT * data_size, INT index, DWORD type);
02104 char EXPRT *strcomb(char **list);
02105
02106
02107 void EXPRT bk_init(void *pbh);
02108 void EXPRT bk_init32(void *event);
02109 BOOL EXPRT bk_is32(void *event);
02110 INT EXPRT bk_size(void *pbh);
02111 void EXPRT bk_create(void *pbh, const char *name, WORD type, void *pdata);
02112 INT EXPRT bk_delete(void *event, const char *name);
02113 INT EXPRT bk_close(void *pbh, void *pdata);
02114 INT EXPRT bk_list(void *pbh, char *bklist);
02115 INT EXPRT bk_locate(void *pbh, const char *name, void *pdata);
02116 INT EXPRT bk_iterate(void *pbh, BANK ** pbk, void *pdata);
02117 INT EXPRT bk_iterate32(void *pbh, BANK32 ** pbk, void *pdata);
02118 INT EXPRT bk_swap(void *event, BOOL force);
02119 INT EXPRT bk_find(BANK_HEADER * pbkh, const char *name, DWORD * bklen,
02120 DWORD * bktype, void **pdata);
02121
02122
02123 INT EXPRT rpc_register_functions(RPC_LIST * new_list, INT(*func) (INT, void **));
02124 INT EXPRT rpc_register_function(INT id, INT(*func) (INT, void **));
02125 INT EXPRT rpc_get_option(HNDLE hConn, INT item);
02126 INT EXPRT rpc_set_option(HNDLE hConn, INT item, INT value);
02127 INT EXPRT rpc_set_name(char *name);
02128 INT EXPRT rpc_get_name(char *name);
02129 INT EXPRT rpc_is_remote(void);
02130 INT EXPRT rpc_set_debug(void (*func) (char *), INT mode);
02131 void EXPRT rpc_debug_printf(char *format, ...);
02132
02133 INT EXPRT rpc_register_server(INT server_type, char *name, INT * port,
02134 INT(*func) (INT, void **));
02135 INT EXPRT rpc_register_client(char *name, RPC_LIST * list);
02136 INT EXPRT rpc_server_thread(void *pointer);
02137 INT EXPRT rpc_server_shutdown(void);
02138 INT EXPRT rpc_client_call(HNDLE hConn, const INT routine_id, ...);
02139 INT EXPRT rpc_call(const INT routine_id, ...);
02140 INT EXPRT rpc_tid_size(INT id);
02141 char EXPRT *rpc_tid_name(INT id);
02142 INT EXPRT rpc_server_connect(char *host_name, char *exp_name);
02143 INT EXPRT rpc_client_connect(char *host_name, INT midas_port,
02144 char *client_name, HNDLE * hConnection);
02145 INT EXPRT rpc_client_disconnect(HNDLE hConn, BOOL bShutdown);
02146
02147 INT EXPRT rpc_send_event(INT buffer_handle, void *source, INT buf_size,
02148 INT async_flag);
02149 INT EXPRT rpc_flush_event(void);
02150
02151 void EXPRT rpc_get_convert_flags(INT * convert_flags);
02152 void EXPRT rpc_convert_single(void *data, INT tid, INT flags, INT convert_flags);
02153 void EXPRT rpc_convert_data(void *data, INT tid, INT flags, INT size,
02154 INT convert_flags);
02155
02156
02157 DWORD EXPRT ss_millitime(void);
02158 DWORD EXPRT ss_time(void);
02159 DWORD EXPRT ss_settime(DWORD seconds);
02160 char EXPRT *ss_asctime(void);
02161 INT EXPRT ss_sleep(INT millisec);
02162 BOOL EXPRT ss_kbhit(void);
02163
02164 void EXPRT ss_clear_screen(void);
02165 void EXPRT ss_printf(INT x, INT y, const char *format, ...);
02166 void ss_set_screen_size(int x, int y);
02167
02168 char EXPRT *ss_getpass(char *prompt);
02169 INT EXPRT ss_getchar(BOOL reset);
02170 char EXPRT *ss_crypt(char *key, char *salt);
02171 char EXPRT *ss_gets(char *string, int size);
02172
02173 void EXPRT *ss_ctrlc_handler(void (*func) (int));
02174
02175
02176 INT EXPRT ss_directio_give_port(INT start, INT end);
02177 INT EXPRT ss_directio_lock_port(INT start, INT end);
02178
02179
02180 INT EXPRT ss_tape_open(char *path, INT oflag, INT * channel);
02181 INT EXPRT ss_tape_close(INT channel);
02182 INT EXPRT ss_tape_status(char *path);
02183 INT EXPRT ss_tape_read(INT channel, void *pdata, INT * count);
02184 INT EXPRT ss_tape_write(INT channel, void *pdata, INT count);
02185 INT EXPRT ss_tape_write_eof(INT channel);
02186 INT EXPRT ss_tape_fskip(INT channel, INT count);
02187 INT EXPRT ss_tape_rskip(INT channel, INT count);
02188 INT EXPRT ss_tape_rewind(INT channel);
02189 INT EXPRT ss_tape_spool(INT channel);
02190 INT EXPRT ss_tape_mount(INT channel);
02191 INT EXPRT ss_tape_unmount(INT channel);
02192 INT EXPRT ss_tape_get_blockn(INT channel);
02193
02194
02195 double EXPRT ss_disk_free(char *path);
02196 double EXPRT ss_file_size(char *path);
02197 INT EXPRT ss_file_remove(char *path);
02198 INT EXPRT ss_file_find(char *path, char *pattern, char **plist);
02199 double EXPRT ss_disk_size(char *path);
02200
02201
02202 INT EXPRT hs_set_path(char *path);
02203 INT EXPRT hs_define_event(DWORD event_id, char *name, TAG * tag, DWORD size);
02204 INT EXPRT hs_write_event(DWORD event_id, void *data, DWORD size);
02205 INT EXPRT hs_count_events(DWORD ltime, DWORD * count);
02206 INT EXPRT hs_enum_events(DWORD ltime, char *event_name,
02207 DWORD * name_size, INT event_id[], DWORD * id_size);
02208 INT EXPRT hs_count_vars(DWORD ltime, DWORD event_id, DWORD * count);
02209 INT EXPRT hs_enum_vars(DWORD ltime, DWORD event_id, char *var_name,
02210 DWORD * size, DWORD * var_n, DWORD * n_size);
02211 INT EXPRT hs_get_var(DWORD ltime, DWORD event_id, char *var_name,
02212 DWORD * type, INT * n_data);
02213 INT EXPRT hs_get_event_id(DWORD ltime, char *name, DWORD * id);
02214 INT EXPRT hs_read(DWORD event_id, DWORD start_time, DWORD end_time,
02215 DWORD interval, char *tag_name, DWORD var_index,
02216 DWORD * time_buffer, DWORD * tbsize,
02217 void *data_buffer, DWORD * dbsize, DWORD * type, DWORD * n);
02218 INT EXPRT hs_dump(DWORD event_id, DWORD start_time, DWORD end_time,
02219 DWORD interval, BOOL binary_time);
02220 INT EXPRT hs_fdump(char *file_name, DWORD id, BOOL binary_time);
02221
02222
02223 INT EXPRT el_retrieve(char *tag, char *date, int *run, char *author,
02224 char *type, char *system, char *subject,
02225 char *text, int *textsize, char *orig_tag,
02226 char *reply_tag, char *attachment1,
02227 char *attachment2, char *attachment3, char *encoding);
02228 INT EXPRT el_submit(int run, char *author, char *type, char *system,
02229 char *subject, char *text, char *reply_to,
02230 char *encoding, char *afilename1, char *buffer1,
02231 INT buffer_size1, char *afilename2, char *buffer2,
02232 INT buffer_size2, char *afilename3, char *buffer3,
02233 INT buffer_size3, char *tag, INT tag_size);
02234 INT EXPRT el_search_message(char *tag, int *fh, BOOL walk);
02235 INT EXPRT el_search_run(int run, char *return_tag);
02236 INT EXPRT el_delete_message(char *tag);
02237
02238
02239 INT EXPRT al_check();
02240 INT EXPRT al_trigger_alarm(char *alarm_name, char *alarm_message,
02241 char *default_class, char *cond_str, INT type);
02242 INT EXPRT al_trigger_class(char *alarm_class, char *alarm_message, BOOL first);
02243 INT EXPRT al_reset_alarm(char *alarm_name);
02244 BOOL EXPRT al_evaluate_condition(char *condition, char *value);
02245
02246
02247 INT get_frontend_index();
02248
02249
02250 void EXPRT test_register(ANA_TEST * t);
02251 void EXPRT add_data_dir(char *result, char *file);
02252 void EXPRT lock_histo(INT id);
02253
02254 void EXPRT open_subfolder(char *name);
02255 void EXPRT close_subfolder();
02256 #ifdef __cplusplus
02257 }
02258
02259 #ifdef USE_ROOT
02260
02261 extern TFolder *gManaHistosFolder;
02262 extern TObjArray *gHistoFolderStack;
02263
02264
02265
02266
02267 template<typename TH1X>
02268 TH1X EXPRT *h1_book(const char *name, const char *title,
02269 int bins, double min, double max)
02270 {
02271 TH1X *hist;
02272
02273
02274 if (!gHistoFolderStack->Last())
02275 hist = (TH1X *) gManaHistosFolder->FindObjectAny(name);
02276 else
02277 hist = (TH1X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02278
02279 if (hist == NULL) {
02280 hist = new TH1X(name, title, bins, min, max);
02281 if (!gHistoFolderStack->Last())
02282 gManaHistosFolder->Add(hist);
02283 else
02284 ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02285 }
02286
02287 return hist;
02288 }
02289
02290 template<typename TH1X>
02291 TH1X EXPRT *h1_book(const char *name, const char *title,
02292 int bins, double edges[])
02293 {
02294 TH1X *hist;
02295
02296
02297 if (!gHistoFolderStack->Last())
02298 hist = (TH1X *) gManaHistosFolder->FindObjectAny(name);
02299 else
02300 hist = (TH1X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02301
02302 if (hist == NULL) {
02303 hist = new TH1X(name, title, bins, edges);
02304 if (!gHistoFolderStack->Last())
02305 gManaHistosFolder->Add(hist);
02306 else
02307 ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02308 }
02309
02310 return hist;
02311 }
02312
02313 template<typename TH2X>
02314 TH2X EXPRT *h2_book(const char *name, const char *title,
02315 int xbins, double xmin, double xmax,
02316 int ybins, double ymin, double ymax)
02317 {
02318 TH2X *hist;
02319
02320
02321 if (!gHistoFolderStack->Last())
02322 hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02323 else
02324 hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02325
02326 if (hist == NULL) {
02327 hist = new TH2X(name, title, xbins, xmin, xmax, ybins, ymin, ymax);
02328 if (!gHistoFolderStack->Last())
02329 gManaHistosFolder->Add(hist);
02330 else
02331 ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02332 }
02333
02334 return hist;
02335 }
02336
02337 template<typename TH2X>
02338 TH2X EXPRT *h2_book(const char *name, const char *title,
02339 int xbins, double xmin, double xmax,
02340 int ybins, double yedges[])
02341 {
02342 TH2X *hist;
02343
02344
02345 if (!gHistoFolderStack->Last())
02346 hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02347 else
02348 hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02349
02350 if (hist == NULL) {
02351 hist = new TH2X(name, title, xbins, xmin, xmax, ybins, yedges);
02352 if (!gHistoFolderStack->Last())
02353 gManaHistosFolder->Add(hist);
02354 else
02355 ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02356 }
02357
02358 return hist;
02359 }
02360
02361 template<typename TH2X>
02362 TH2X EXPRT *h2_book(const char *name, const char *title,
02363 int xbins, double xedges[],
02364 int ybins, double ymin, double ymax)
02365 {
02366 TH2X *hist;
02367
02368
02369 if (!gHistoFolderStack->Last())
02370 hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02371 else
02372 hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02373
02374 if (hist == NULL) {
02375 hist = new TH2X(name, title, xbins, xedges, ybins, ymin, ymax);
02376 if (!gHistoFolderStack->Last())
02377 gManaHistosFolder->Add(hist);
02378 else
02379 ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02380 }
02381
02382 return hist;
02383 }
02384
02385 template<typename TH2X>
02386 TH2X EXPRT *h2_book(const char *name, const char *title,
02387 int xbins, double xedges[],
02388 int ybins, double yedges[])
02389 {
02390 TH2X *hist;
02391
02392
02393 if (!gHistoFolderStack->Last())
02394 hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02395 else
02396 hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02397
02398 if (hist == NULL) {
02399 hist = new TH2X(name, title, xbins, xedges, ybins, yedges);
02400 if (!gHistoFolderStack->Last())
02401 gManaHistosFolder->Add(hist);
02402 else
02403 ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02404 }
02405
02406 return hist;
02407 }
02408
02409
02410
02411
02412
02413 #define H1_BOOK(n,t,b,min,max) (h1_book<TH1F>(n,t,b,min,max))
02414 #define H2_BOOK(n,t,xb,xmin,xmax,yb,ymin,ymax) (h2_book<TH2F>(n,t,xb,xmin,xmax,yb,ymin,ymax))
02415 #endif
02416
02417 #endif
02418 #endif
02419
02420 #endif
02421
02422
02423