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 #include <stdio.h>
00059 #include <string.h>
00060 #include <time.h>
00061
00062
00063 #include "midas.h"
00064 #include "experim.h"
00065 #include "analyzer.h"
00066
00067
00068 #ifdef OS_WINNT
00069 #define VISUAL_CPLUSPLUS
00070 #endif
00071 #ifdef __linux__
00072 #define f2cFortran
00073 #endif
00074
00075 #ifdef HAVE_HBOOK
00076 #include <cfortran.h>
00077 #include <hbook.h>
00078
00079 PAWC_DEFINE(1000000);
00080 #endif
00081
00082
00083
00084
00085 char *analyzer_name = "Analyzer";
00086
00087
00088 INT analyzer_loop_period = 0;
00089
00090
00091 INT odb_size = DEFAULT_ODB_SIZE;
00092
00093
00094 RUNINFO runinfo;
00095 GLOBAL_PARAM global_param;
00096 EXP_PARAM exp_param;
00097 TRIGGER_SETTINGS trigger_settings;
00098
00099
00100
00101 extern ANA_MODULE scaler_accum_module;
00102 extern ANA_MODULE adc_calib_module;
00103 extern ANA_MODULE adc_summing_module;
00104
00105 ANA_MODULE *scaler_module[] = {
00106 &scaler_accum_module,
00107 NULL
00108 };
00109
00110 ANA_MODULE *trigger_module[] = {
00111 &adc_calib_module,
00112 &adc_summing_module,
00113 NULL
00114 };
00115
00116
00117
00118 ASUM_BANK_STR(asum_bank_str);
00119
00120 ADC0_BANK_STR(ana_adc0_bank_str);
00121
00122 BANK_LIST ana_trigger_bank_list[] = {
00123
00124
00125 {"ADC0", TID_STRUCT, sizeof(ADC0_BANK), ana_adc0_bank_str}
00126 ,
00127 {"TDC0", TID_WORD, N_TDC, NULL}
00128 ,
00129
00130
00131 {"CADC", TID_FLOAT, N_ADC, NULL}
00132 ,
00133 {"ASUM", TID_STRUCT, sizeof(ASUM_BANK), asum_bank_str}
00134 ,
00135
00136 {""}
00137 ,
00138 };
00139
00140 BANK_LIST ana_scaler_bank_list[] = {
00141
00142 {"SCLR", TID_DWORD, N_ADC, NULL}
00143 ,
00144
00145
00146 {"ACUM", TID_DOUBLE, N_ADC, NULL}
00147 ,
00148 {""}
00149 ,
00150 };
00151
00152
00153
00154 ANALYZE_REQUEST analyze_request[] = {
00155 {"Trigger",
00156 {1,
00157 TRIGGER_ALL,
00158 GET_SOME,
00159 "SYSTEM",
00160 TRUE,
00161 "", "",}
00162 ,
00163 NULL,
00164 trigger_module,
00165 ana_trigger_bank_list,
00166 1000,
00167 TRUE,
00168 }
00169 ,
00170
00171 {"Scaler",
00172 {2,
00173 TRIGGER_ALL,
00174 GET_ALL,
00175 "SYSTEM",
00176 TRUE,
00177 "", "",}
00178 ,
00179 NULL,
00180 scaler_module,
00181 ana_scaler_bank_list,
00182 100,
00183 }
00184 ,
00185
00186 {""}
00187 ,
00188 };
00189
00190
00191
00192 INT analyzer_init()
00193 {
00194 HNDLE hDB, hKey;
00195 char str[80];
00196
00197 RUNINFO_STR(runinfo_str);
00198 EXP_PARAM_STR(exp_param_str);
00199 GLOBAL_PARAM_STR(global_param_str);
00200 TRIGGER_SETTINGS_STR(trigger_settings_str);
00201
00202
00203 cm_get_experiment_database(&hDB, NULL);
00204 db_create_record(hDB, 0, "/Runinfo", strcomb(runinfo_str));
00205 db_find_key(hDB, 0, "/Runinfo", &hKey);
00206 if (db_open_record(hDB, hKey, &runinfo, sizeof(runinfo), MODE_READ, NULL, NULL) !=
00207 DB_SUCCESS) {
00208 cm_msg(MERROR, "analyzer_init", "Cannot open \"/Runinfo\" tree in ODB");
00209 return 0;
00210 }
00211
00212 db_create_record(hDB, 0, "/Experiment/Run Parameters", strcomb(exp_param_str));
00213 db_find_key(hDB, 0, "/Experiment/Run Parameters", &hKey);
00214 if (db_open_record(hDB, hKey, &exp_param, sizeof(exp_param), MODE_READ, NULL, NULL) !=
00215 DB_SUCCESS) {
00216 cm_msg(MERROR, "analyzer_init",
00217 "Cannot open \"/Experiment/Run Parameters\" tree in ODB");
00218 return 0;
00219 }
00220
00221 sprintf(str, "/%s/Parameters/Global", analyzer_name);
00222 db_create_record(hDB, 0, str, strcomb(global_param_str));
00223 db_find_key(hDB, 0, str, &hKey);
00224 if (db_open_record
00225 (hDB, hKey, &global_param, sizeof(global_param), MODE_READ, NULL,
00226 NULL) != DB_SUCCESS) {
00227 cm_msg(MERROR, "analyzer_init", "Cannot open \"%s\" tree in ODB", str);
00228 return 0;
00229 }
00230
00231 db_create_record(hDB, 0, "/Equipment/Trigger/Settings", strcomb(trigger_settings_str));
00232 db_find_key(hDB, 0, "/Equipment/Trigger/Settings", &hKey);
00233
00234 if (db_open_record
00235 (hDB, hKey, &trigger_settings, sizeof(trigger_settings), MODE_READ, NULL,
00236 NULL) != DB_SUCCESS) {
00237 cm_msg(MERROR, "analyzer_init",
00238 "Cannot open \"/Equipment/Trigger/Settings\" tree in ODB");
00239 return 0;
00240 }
00241
00242 return SUCCESS;
00243 }
00244
00245
00246
00247 INT analyzer_exit()
00248 {
00249 return CM_SUCCESS;
00250 }
00251
00252
00253
00254 INT ana_begin_of_run(INT run_number, char *error)
00255 {
00256 return CM_SUCCESS;
00257 }
00258
00259
00260
00261 INT ana_end_of_run(INT run_number, char *error)
00262 {
00263 FILE *f;
00264 time_t now;
00265 char str[256];
00266 int size;
00267 double n;
00268 HNDLE hDB;
00269 BOOL flag;
00270
00271 cm_get_experiment_database(&hDB, NULL);
00272
00273
00274
00275 size = sizeof(flag);
00276 db_get_value(hDB, 0, "/Logger/Write data", &flag, &size, TID_BOOL, TRUE);
00277 if (flag && runinfo.online_mode == 1) {
00278
00279 size = sizeof(str);
00280 str[0] = 0;
00281 db_get_value(hDB, 0, "/Logger/Data Dir", str, &size, TID_STRING, TRUE);
00282 if (str[0] != 0)
00283 if (str[strlen(str) - 1] != DIR_SEPARATOR)
00284 strcat(str, DIR_SEPARATOR_STR);
00285 strcat(str, "runlog.txt");
00286
00287 f = fopen(str, "a");
00288
00289 time(&now);
00290 strcpy(str, ctime(&now));
00291 str[10] = 0;
00292
00293 fprintf(f, "%s\t%3d\t", str, runinfo.run_number);
00294
00295 strcpy(str, runinfo.start_time);
00296 str[19] = 0;
00297 fprintf(f, "%s\t", str + 11);
00298
00299 strcpy(str, ctime(&now));
00300 str[19] = 0;
00301 fprintf(f, "%s\t", str + 11);
00302
00303 size = sizeof(n);
00304 db_get_value(hDB, 0, "/Equipment/Trigger/Statistics/Events sent", &n, &size,
00305 TID_DOUBLE, TRUE);
00306
00307 fprintf(f, "%5.1lfk\t", n / 1000);
00308 fprintf(f, "%s\n", exp_param.comment);
00309
00310 fclose(f);
00311 }
00312
00313 return CM_SUCCESS;
00314 }
00315
00316
00317
00318 INT ana_pause_run(INT run_number, char *error)
00319 {
00320 return CM_SUCCESS;
00321 }
00322
00323
00324
00325 INT ana_resume_run(INT run_number, char *error)
00326 {
00327 return CM_SUCCESS;
00328 }
00329
00330
00331
00332 INT analyzer_loop()
00333 {
00334 return CM_SUCCESS;
00335 }
00336
00337