128 #include <sys/types.h>
131 #include <sys/mman.h>
132 #include <sys/ioctl.h>
133 #include <sys/time.h>
137 #include <include/linux/version.h>
210 #define SIS3820_ADDRESS_0 0x38000000
211 #define SIS3820_ADDRESS_1 0x39000000
212 #define V1190_ADDRESS 0xEE000000
213 #define MAX_NUMBER_LWORDS 1024
214 #define ALMOST_FULL_LEVEL 1024
215 #define DATABUFFER_SIZE 131072
216 #define DIFF_TOLERANCE -12200
217 #define TD_EVENT (1<<0)
220 #define LE_POSITRON_EVENT (1<<1)
221 #define M2_EVENT (1<<2)
222 #define BC_EVENT (1<<3)
223 #define M1_EVENT (1<<4)
224 #define M1_POSITRON_EVENT (1<<5)
228 #define MASTERFIRST 2
295 INT
pause_run(INT run_number,
char *error);
299 INT
poll_event(INT source, INT count, BOOL test);
308 INT *channel, INT *ind);
310 INT *channel, INT *ind);
332 LAM_SOURCE(0,0xFFFFFF),
443 cm_get_experiment_database(&hDB, NULL);
445 db_create_record(hDB, 0,
"/Experiment/Run Parameters", strcomb(exp_param_str));
446 db_create_record(hDB, 0,
"/Equipment/Trigger/Settings", strcomb(trigger_settings_str));
447 db_create_record(hDB, 0,
"/Equipment/Scaler/Settings", strcomb(scaler_settings_str));
448 db_create_record(hDB, 0,
"/Equipment/Trigger/Vme_Statistics", strcomb(vme_stats_str));
449 db_create_record(hDB, 0,
"/Equipment/Beamline/Settings", strcomb(beamline_settings_str));
450 db_create_record(hDB, 0,
"/Equipment/Beamline/Variables", strcomb(beamline_event_str));
451 db_create_record(hDB, 0,
"/Equipment/LEMVAC/Settings", strcomb(lemvac_settings_str));
452 db_create_record(hDB, 0,
"/Equipment/LEMVAC/Variables", strcomb(lemvac_event_str));
453 db_create_record(hDB, 0,
"/Equipment/ModCryo/Settings", strcomb(modcryo_settings_str));
454 db_create_record(hDB, 0,
"/Equipment/ModCryo/Variables", strcomb(modcryo_event_str));
455 db_create_record(hDB, 0,
"/Equipment/SampleCryo/Settings", strcomb(samplecryo_settings_str));
456 db_create_record(hDB, 0,
"/Equipment/SampleCryo/Variables", strcomb(samplecryo_event_str));
457 db_create_record(hDB, 0,
"/Equipment/SCS2001M/Settings", strcomb(scs2001m_settings_str));
458 db_create_record(hDB, 0,
"/Equipment/SCS2001M/Variables", strcomb(scs2001m_event_str));
459 db_create_record(hDB, 0,
"/Equipment/HV/Settings", strcomb(hv_settings_str));
460 db_create_record(hDB, 0,
"/Equipment/HV/Variables", strcomb(hv_event_str));
461 db_create_record(hDB, 0,
"/Equipment/HV Detectors/Settings", strcomb(hv_detectors_settings_str));
462 db_create_record(hDB, 0,
"/Equipment/HV Detectors/Variables", strcomb(hv_detectors_event_str));
466 if ( db_find_key(hDB, 0,
"/Equipment/Trigger/Settings", &hkey))
469 if ( db_find_key(hDB, 0,
"/Equipment/Trigger/Vme_Statistics", &hkey))
472 if ( db_find_key(hDB, 0,
"/Runinfo", &hkey))
473 db_open_record(hDB, hkey, &
runinfo,
sizeof(
runinfo), MODE_READ, NULL, NULL);
478 if (db_find_key(hDB, 0,
"/Info", &hkey))
479 db_open_record(hDB, hkey, &
info,
sizeof(
info), MODE_READ, NULL, NULL);
482 if ( db_find_key(hDB, 0,
"/Equipment/Beamline/Variables", &hkey))
484 if ( db_find_key(hDB, 0,
"/Equipment/LEMVAC/Variables", &hkey))
486 if ( db_find_key(hDB, 0,
"/Equipment/ModCryo/Variables", &hkey))
488 if ( db_find_key(hDB, 0,
"/Equipment/SampleCryo/Variables", &hkey))
494 if ( db_find_key(hDB, 0,
"/Equipment/Omega/Variables", &hkey))
496 if ( db_find_key(hDB, 0,
"/Equipment/SCS2001M/Variables", &hkey))
498 if ( db_find_key(hDB, 0,
"/Equipment/HV/Variables", &hkey))
499 db_open_record(hDB, hkey, &
hv_event,
sizeof(
hv_event), MODE_READ, NULL, NULL);
500 if ( db_find_key(hDB, 0,
"/Equipment/HV Detectors/Variables", &hkey))
519 cm_msg(MINFO,
"frontend_init",
"LINUX_VERSION = 0x%x",LINUX_VERSION_CODE);
521 if ( LINUX_VERSION_CODE < 0x20600 )
522 sprintf(vme_device,
"/dev/sis1100");
524 sprintf(vme_device,
"/dev/sis1100_00remote");
526 if ( (
hdev = open(vme_device, O_RDWR, 0)) < 0 )
528 cm_msg(MERROR,
"frontend_init",
"Error on opening VME device %s", vme_device);
541 cm_msg(MINFO,
"frontend_init",
"scaler flags, address 0x%8.8x = %d, 0x%8.8x = %d",
565 cm_msg(MERROR,
"frontend_exit",
566 "Error on access to SIS3820_0, key reset failed, return code %x\n", status);
573 cm_msg(MERROR,
"frontend_exit",
574 "Error on access to SIS3820_1, key reset failed, return code %x\n", status);
593 DWORD pattern_1stChip, pattern_2ndChip;
598 memset(&ch_pattern, 0x00,
sizeof(ch_pattern));
599 pattern_1stChip = pattern_2ndChip = 0;
605 pattern_1stChip = pattern_1stChip | (1<<i);
607 pattern_2ndChip = pattern_2ndChip | (1<<(i%32));
613 pattern_1stChip = pattern_1stChip | (1<<i);
615 pattern_2ndChip = pattern_2ndChip | (1<<(i%32));
621 pattern_1stChip = pattern_1stChip | (1<<i);
623 pattern_2ndChip = pattern_2ndChip | (1<<(i%32));
632 pattern_1stChip = pattern_1stChip | (1<<i);
634 pattern_2ndChip = pattern_2ndChip | (1<<(i%32));
646 pattern_1stChip = pattern_1stChip | (1<<i);
648 pattern_2ndChip = pattern_2ndChip | (1<<(i%32));
656 pattern_1stChip = pattern_1stChip | (1<<i);
658 pattern_2ndChip = pattern_2ndChip | (1<<(i%32));
667 cm_msg(MINFO,
"begin_of_run",
"pattern_1stChip = 0x%08x", pattern_1stChip);
668 cm_msg(MINFO,
"begin_of_run",
"pattern_2ndChip = 0x%08x", pattern_2ndChip);
670 ch_pattern[0] = pattern_1stChip & 0xFFFF;
671 ch_pattern[1] = (pattern_1stChip & 0xFFFF0000)>>16;
672 ch_pattern[2] = pattern_2ndChip & 0xFFFF;
673 ch_pattern[3] = (pattern_2ndChip & 0xFFFF0000)>>16;
675 #ifndef HAVE_TEST_RUN
677 for ( i = 0; i<2; i++){
680 cm_msg(MINFO,
"begin_of_run",
"V1190 1st Chip channel pattern: pattern = 0x%04x", ch_pattern[i]);
684 cm_msg(MERROR,
"begin_of_run",
"Error writing channel pattern to TDC V1190, return code %x\n", status);
691 for ( i = 2; i<4; i++){
694 cm_msg(MINFO,
"begin_of_run",
"V1190 2nd Chip channel pattern: pattern = 0x%04x", ch_pattern[i]);
698 cm_msg(MERROR,
"begin_of_run",
"Error writing channel pattern to TDC V1190, return code %x\n", status);
710 cm_msg(MERROR,
"begin_of_run",
711 "Error on resetting TDC V1190, return code %x\n", status);
723 cm_msg(MERROR,
"begin_of_run",
724 "Error on access to SIS3820_0, key disable failed, return code %x\n", status);
731 cm_msg(MERROR,
"begin_of_run",
732 "Error on access to SIS3820_0, key reset failed, return code %x\n", status);
741 cm_msg(MERROR,
"begin_of_run",
742 "Error on access to SIS3820_0, key enable failed, return code %x\n", status);
754 cm_msg(MERROR,
"begin_of_run",
755 "Error on access to SIS3820_1, key disable failed, return code %x\n", status);
762 cm_msg(MERROR,
"begin_of_run",
763 "Error on access to SIS3820_1, key reset failed, return code %x\n", status);
772 cm_msg(MERROR,
"begin_of_run",
773 "Error on access to SIS3820_1, key enable failed, return code %x\n", status);
832 cm_msg(MINFO,
"begin_of_run",
"Fast Muon event_defined = 0x%04x, master channel fast muon= %d",
835 cm_msg(MINFO,
"begin_of_run",
"Slow Muon event_defined = 0x%04x, master channel slow muon= %d",
850 fp = fopen(
"/data/nemu/fe.log",
"w");
851 if ( fp == NULL )
return FE_ERR_HW;
865 cm_msg(MINFO,
"end_of_run",
"V1190 Disabled all channels: return_code = 0x%08x", return_code);
873 cm_msg(MINFO,
"end_of_run",
"p_read = 0x%x, p_write = 0x%x",
p_read,
p_write);
874 cm_msg(MINFO,
"end_of_run",
"total Run time in TDC bins (double) = %18.0f",
vme_stats.
run_time);
900 cm_msg(MERROR,
"resume_run",
901 "Error on resetting TDC V1190, return code %x\n", status);
955 u_int32_t *output_buffer;
956 u_int32_t get_lwords, sum_lwords;
958 INT loop_counter, i, j, k;
959 INT tdc_time, channel, diffTimeSlowMuon, diffTimeFastMuon;
983 if (
runinfo.state != STATE_RUNNING )
987 diffTimeSlowMuon = diffTimeFastMuon = 0;
1009 #define BINNING 0.1953125 // TDC bin in ns
1010 double rate[4], ran;
1012 DWORD mincounter, tdctime;
1019 memset(&time, 0x00,
sizeof(time));
1021 for ( i=0; i<sum_lwords; i++ ){
1023 ran = (double) rand()/ (double) RAND_MAX;
1025 for (j=1; j<4; j++){
1026 ran = (double) rand()/ (double) RAND_MAX;
1027 time[j] = (-1./rate[j]*log(1.- ran))/
BINNING;
1031 for ( j = 0; j < 4; j++){
1033 for ( k =0; k < 4; k++){
1034 if ( j!=k && time[j] <= time[k]) mincounter++;
1036 if ( mincounter == 3)
break;
1043 tdctime = tdctime | (channel<<19);
1050 tdctime = tdctime | (channel<<19);
1051 ran = (double) rand()/(double) RAND_MAX;
1052 time[1] = time[1] + (
U_LONG) (-1./rate[j]*log(1. - ran))/
BINNING;;
1058 tdctime = tdctime | (channel<<19);
1059 ran = (double) rand()/(double) RAND_MAX;
1060 time[2] = time[2] + (
U_LONG) (-1./rate[j]*log(1. - ran))/
BINNING;;
1066 tdctime = tdctime | (channel<<19);
1067 ran = (double) rand()/(double) RAND_MAX;
1068 time[3] = time[3] + (
U_LONG) (-1./rate[j]*log(1. - ran))/
BINNING;;
1075 output_buffer[i] = tdctime;
1081 for ( i = 0; i < 32; i++){
1083 memcpy(output_buffer + sum_lwords, &blt_data, get_lwords *
sizeof(u_int32_t));
1084 sum_lwords += get_lwords;
1085 if ( return_code == 0x211)
1093 for ( i = 0; i < sum_lwords; i++ ){
1094 v1190_data = (
V1190_DATA *) &output_buffer[i];
1095 tdc_time = v1190_data->
data;
1096 channel = v1190_data->
channel;
1100 if ( v1190_data->
buffer == 4 ){
1104 fprintf(fp,
"found TDC error\n");
1113 fprintf(fp,
"Event reset due to channel %d overflow\n", channel);
1276 if ( diffTimeFastMuon < 0 && abs(diffTimeFastMuon) >=
t0_offset)
1278 else if ( diffTimeFastMuon < 0 && abs(diffTimeFastMuon) <
t0_offset )
1281 if ( diffTimeSlowMuon < 0 && abs(diffTimeSlowMuon) >=
t0_offset)
1283 else if ( diffTimeSlowMuon < 0 && abs(diffTimeSlowMuon) <
t0_offset )
1288 "raw data = %6d %3d %7d 0x%08x, vmeTime = %10.5e, difftime = %8d, ev.time = %8d, pu-flag = %2d, 0x%04x\n",
1289 i, channel, tdc_time, output_buffer[i],
1308 else if (channel ==
CLOCK ){
1314 if ( i == sum_lwords - 1)
1323 free(output_buffer);
1336 INT diff_toLastEvent;
1371 switch (event_type){
1408 fprintf(fp,
"runTime = %12d, PUend = %12d, pu = %04d, clean = %6d, good = %6d\n",
1491 INT i, j, k, diff_time, masterIndex;
1492 INT decChannel[8], decInd[8], bcChannel, bcInd, tdChannel, tdInd, m2Channel, m2Ind;
1493 DWORD tofPileupWindow, tofWindow, dataWindow;
1494 BOOL good_event, pos_event, bc_event, posL_event, posT_event, posR_event, posB_event;
1503 good_event = pos_event = bc_event = mcp2_event = FALSE;
1504 posL_event = posT_event = posR_event = posB_event = FALSE;
1522 bcChannel = bcInd = m2Channel = m2Ind = tdChannel = tdInd = -1;
1524 for ( i=0; i<8; i++)
1525 decChannel[i] = decInd[i] = -1;
1535 TD,
TD,
MCP2F, masterIndex, &tdChannel, &tdInd);
1542 &decChannel[0], &decInd[0]) ||
1544 &decChannel[1], &decInd[1]);
1546 &decChannel[2], &decInd[2]) ||
1548 &decChannel[3], &decInd[3]);
1550 &decChannel[4], &decInd[4]) ||
1552 &decChannel[5], &decInd[5]);
1554 &decChannel[6], &decInd[6]) ||
1556 &decChannel[7], &decInd[7]);
1557 pos_event = posL_event || posT_event || posR_event || posB_event;
1563 &bcChannel, &bcInd);
1566 &bcChannel, &bcInd);
1576 good_event = mcp2_event;
1581 good_event = bc_event;
1586 good_event = pos_event;
1591 good_event = pos_event && bc_event;
1595 good_event = mcp2_event && bc_event;
1599 good_event = mcp2_event && pos_event;
1603 good_event = mcp2_event && pos_event && bc_event;
1629 if ( bcChannel == -1 )
continue;
1632 if ( decChannel[0] == -1 )
continue;
1635 if ( decChannel[1] == -1 )
continue;
1638 if ( decChannel[2] == -1 )
continue;
1641 if ( decChannel[3] == -1 )
continue;
1644 if ( decChannel[4] == -1 )
continue;
1647 if ( decChannel[5] == -1 )
continue;
1650 if ( decChannel[6] == -1 )
continue;
1653 if ( decChannel[7] == -1 )
continue;
1665 if ( j < tdInd || tdInd == -1)
continue;
1672 if ( j < m2Ind || m2Ind == -1 )
continue;
1681 if ( m2Ind == -1)
continue;
1696 if ( i == decChannel[0] && j < decInd[0] )
1703 if ( i == decChannel[1] && j < decInd[1] )
1710 if ( i == decChannel[2] && j < decInd[2] )
1717 if ( i == decChannel[3] && j < decInd[3] )
1724 if ( i == decChannel[4] && j < decInd[4] )
1731 if ( i == decChannel[5] && j < decInd[5] )
1738 if ( i == decChannel[6] && j < decInd[6] )
1745 if ( i == decChannel[7] && j < decInd[7] )
1795 fprintf(fp,
"tdc data = %02d, %8d, channel %4d, hex = 0x%08x\n", j,
1817 INT i, j, k, diff_time, bcChannel, bcInd, decChannel, decInd, masterIndex;
1818 BOOL good_event, bc_event, pos_event;
1819 DWORD tofPileupWindow, tofWindow, dataWindow;
1823 fprintf(fp,
"evaluate_fast_muon_event, mcp1 = %10.0f, mcp1 clean = %10.0f\n",
1827 good_event = bc_event = pos_event = FALSE;
1832 bcChannel = bcInd = decChannel = decInd = -1;
1842 good_event = bc_event;
1846 good_event = pos_event;
1850 good_event = bc_event && pos_event;
1875 if ( bcChannel == -1 )
continue;
1879 if ( decChannel == -1 )
continue;
1902 if ( i == decChannel && j < decInd )
1938 fprintf(fp,
"tdc data = %02d, %8d, channel %4d, hex = 0x%08x, ch = %4d, index = %4d\n",
1970 INT *channel, INT *ind)
1973 INT difftime_now, difftime_last;
1976 difftime_now = difftime_last = 0;
1978 difftime_now = difftime_last = 2 * tofWindow;
1979 *channel = *ind = -1;
1980 for ( i = firstCh; i <= lastCh; i++){
1986 if ( difftime_now < tofWindow && difftime_now > 0){
1987 if ( difftime_now > difftime_last ){
1988 difftime_last = difftime_now;
2000 if ( difftime_now < tofWindow && difftime_now > 0){
2001 if ( difftime_now < difftime_last ){
2002 difftime_last = difftime_now;
2010 if ( *channel == -1 )
return FALSE;
2017 fprintf(fp,
" TOF pileup at channel %d, hit %d\n", *channel, *ind);
2039 INT *channel, INT *ind)
2042 INT difftime_now, difftime_last, difftime;
2045 difftime_now = difftime_last = 2*decWindow;
2046 *channel = *ind = -1;
2048 if ( coincWindow < 0 ){
2050 for ( i = firstCh; i <= lastCh; i++){
2054 if ( difftime_now < decWindow && difftime_now > 0){
2055 if ( difftime_now < difftime_last ){
2056 difftime_last = difftime_now;
2076 if ( difftime < coincWindow ){
2078 if ( difftime_now < decWindow && difftime_now > 0){
2079 if ( difftime_now < difftime_last ){
2080 difftime_last = difftime_now;
2090 if ( *channel == -1 )
return FALSE;
2123 case CMD_INTERRUPT_ENABLE:
2125 case CMD_INTERRUPT_DISABLE:
2127 case CMD_INTERRUPT_ATTACH:
2129 case CMD_INTERRUPT_DETACH:
2161 bk_create(pevent,
"TDC0", TID_DWORD, (
void**)&pdata);
2170 ndata = (*
p_read & 0x0000FFFF) + 1;
2172 for (i=0; i < ndata; i++){
2202 bk_close(pevent, pdata);
2203 return bk_size(pevent);
2223 u_int32_t data[100], channel;
2230 bk_create(pevent,
"SCL0", TID_DWORD, (
void**)&pdata);
2233 #ifdef HAVE_TEST_RUN
2244 *pdata++ = (100 + rand()%40-20) | channel;
2253 cm_msg(MERROR,
"read_scaler_event",
"Error reading data from VME Scaler SIS3820!");
2270 cm_msg(MERROR,
"read_scaler_event",
"Error reading data from VME Scaler SIS3820!");
2283 bk_close(pevent, pdata);
2284 return bk_size(pevent);
2301 bk_create(pevent,
"DBEA", TID_FLOAT, (
void**)&pdata);
2303 for (i = 0; i < n_max; i++)
2305 bk_close(pevent, pdata);
2308 bk_create(pevent,
"MBEA", TID_FLOAT, (
void**)&pdata);
2310 for (i = 0; i < n_max; i++)
2312 bk_close(pevent, pdata);
2315 bk_create(pevent,
"MVAC", TID_FLOAT, (
void**)&pdata);
2317 for (i = 0; i < n_max; i++)
2319 bk_close(pevent, pdata);
2322 bk_create(pevent,
"MMOD", TID_FLOAT, (
void**)&pdata);
2324 for (i = 0; i < n_max; i++)
2326 bk_close(pevent, pdata);
2329 bk_create(pevent,
"MSAM", TID_FLOAT, (
void**)&pdata);
2337 for (i = 0; i < n_max; i++)
2339 bk_close(pevent, pdata);
2342 bk_create(pevent,
"M900", TID_FLOAT, (
void**)&pdata);
2344 for (i = 0; i < n_max; i++)
2346 bk_close(pevent, pdata);
2349 bk_create(pevent,
"MHVT", TID_FLOAT, (
void**)&pdata);
2351 for (i = 0; i < n_max; i++)
2353 bk_close(pevent, pdata);
2356 bk_create(pevent,
"MHVD", TID_FLOAT, (
void**)&pdata);
2358 for (i = 0; i < n_max; i++)
2360 bk_close(pevent, pdata);
2362 return bk_size(pevent);
2389 cm_get_experiment_database(&hDB, NULL);
2395 db_find_key(hDB, 0,
"/Equipment/Scaler/Settings", &hkey);
2405 cm_msg(MERROR,
"scaler_mode",
"Error on setting mode of SIS3820, return code %x\n", status);
2415 cm_msg(MERROR,
"scaler_mode",
"Error on setting control status of SIS3820, return code %x\n", status);
2422 cm_msg(MERROR,
"scaler_mode",
"Error on reading control status of SIS3820, return code %x\n", status);
2424 cm_msg(MINFO,
"scaler_mode",
"SIS3820 control status reads: 0x%8.8x \n",control);
2429 cm_msg(MERROR,
"scaler_mode",
"Error on reading operation mode of SIS3820, return code %x\n", status);
2431 cm_msg(MINFO,
"scaler_mode",
"SIS3820 operation mode reads: 0x%8.8x \n",control);
2455 u_int32_t modid, control,
mode;
2460 cm_msg(MERROR,
"frontend_init",
2461 "Error on access to SIS3820 0x%8.8x, key reset failed, return code %x\n", module_address, status);
2471 cm_msg(MERROR,
"frontend_init",
2472 "Error on access to SIS3820, couldn't get module info, return code %x\n", status);
2476 cm_msg(MINFO,
"frontend_init",
"SIS3820 modid and firmware = 0x%8.8x", modid);
2477 cm_msg(MINFO,
"frontend_init",
"SIS3820 control status = 0x%8.8x", control);
2478 cm_msg(MINFO,
"frontend_init",
"SIS3820 operation mode = 0x%8.8x", mode);
2484 cm_msg(MERROR,
"frontend_init",
2485 "Error on access to SIS3820, key enable failed, return code %x\n", status);
2489 cm_msg(MINFO,
"frontent_init",
"SIS3820 enabled for counting");
2508 #ifdef HAVE_TEST_RUN
2514 cm_msg(MINFO,
"init_v1190",
"V1190 Module Reset: return_code = 0x%08x", return_code );
2516 if ( return_code != 0x0 )
return FE_ERR_HW;
2521 cm_msg(MINFO,
"init_v1190",
"V1190 Set_Detection: return_code = 0x%08x", return_code );
2523 if ( return_code != 0x0 )
return FE_ERR_HW;
2525 cm_msg(MINFO,
"init_v1190",
"V1190 Set_to_Leading_Edge: return_code = 0x%08x", return_code );
2527 if ( return_code != 0x0 )
return FE_ERR_HW;
2532 cm_msg(MINFO,
"init_v1190",
"V1190 Set_LSB: return_code = 0x%08x", return_code );
2534 if ( return_code != 0x0 )
return FE_ERR_HW;
2536 cm_msg(MINFO,
"init_v1190",
"V1190 Set_LSB_200ps: return_code = 0x%08x", return_code );
2538 if ( return_code != 0x0 )
return FE_ERR_HW;
2544 cm_msg(MINFO,
"init_v1190",
"V1190 Disable all channels: return_code = 0x%08x", return_code);
2551 cm_msg(MINFO,
"init_v1190",
"V1190 Set_Continuous storage: return_code = 0x%08x", return_code );
2554 if ( return_code != 0x0 )
return FE_ERR_HW;
2559 cm_msg(MINFO,
"init_v1190",
"V1190 Set_Almost_Full_Level: return_code = 0x%08x", return_code );
2565 cm_msg(MINFO,
"init_v1190",
"V1190 Control_Register: return_code = 0x%08x", return_code );
2570 cm_msg(MINFO,
"init_v1190",
"V1190 Almost Full Level: return_code = 0x%08x", return_code);
2571 cm_msg(MINFO,
"init_v1190",
"V1190 Almost Full Level: data = 0x%04x", data );
2575 cm_msg(MINFO,
"init_v1190",
"V1190 Modul status: return_code = 0x%08x", return_code);
2576 cm_msg(MINFO,
"init_v1190",
"V1190 Modul status: data = 0x%04x", data );
2580 cm_msg(MINFO,
"init_v1190",
"V1190 Control Register: return_code = 0x%08x", return_code);
2581 cm_msg(MINFO,
"init_v1190",
"V1190 Control Register: data = 0x%04x", data );
2584 if ( return_code != 0x0 )
return FE_ERR_HW;
2595 struct timeval tvNowTime, tvDiffTime;
2597 gettimeofday(&tvNowTime, 0);
2599 timersub(&tvNowTime, &
tvLastTime, &tvDiffTime);
2602 s3100_control_write(
hdev, 0x80, 1<<28);
2609 timersub(&tvNowTime, &
tvLastTime, &tvDiffTime);
2612 s3100_control_write(
hdev, 0x80, 1<<29);
double frontend_loop_counts
U_LONG pileup_end(INT pileupWindow)
static DWORD masterFlagSlowMuon
use either TD_EVENT or M2_EVENT as slow muon master
#define HV_DETECTORS_EVENT_STR(_name)
#define V1190_SET_TR_LEAD_LSB
#define BEAMLINE_EVENT_STR(_name)
#define HV_EVENT_STR(_name)
INT interrupt_configure(INT cmd, INT source, PTYPE adr)
static DWORD eventDefinedFastMuon
bit pattern containing trigger mode for fast muons (BC-M1)
static BOOL flag_external_on
flag to indicate "on/off", "red/green" mode
double channelCounts[N_TDC_CHANNELS]
#define SCS2001M_EVENT_STR(_name)
char * frontend_name
experiment specific ODB structures
#define HV_DETECTORS_SETTINGS_STR(_name)
static U_LONG runTime
absolute run time in TDC LSB units
#define LE_POSITRON_EVENT
INT do_channel(INT ch, INT time)
INT max_event_size_frag
maximum event size for fragmented events (EQ_FRAGMENTED)
DWORD period_onpuls_usec_
static BOOL flag_scaler_address_1
flags to indicate status of VME scalers
#define LEMVAC_SETTINGS_STR(_name)
static DWORD * databuffer
ring buffer for TDC data
static INT hdev
handle for VME-PCI device
struct TRIGGER_SETTINGS::@20 event_2_settings
#define V1190_ALMFULL_BIT
void scaler_mode(u_int32_t module_address)
DWORD doEvaluateFastMuonEvent
int sis3820_key_disable(int device, u_int32_t sis3820_base)
#define TD_EVENT
Event flags.
HV_DETECTORS_EVENT hvdet_event
U_LONG endBeamCounterEvent
#define HV_SETTINGS_STR(_name)
#define SAMPLECRYO_SETTINGS_STR(_name)
#define SIS3820_CONTROL_INPUT_MODE3
#define N_HITS
a single detector may have up to N_HITS hits for event evaluation
static DWORD dataWindowFastMuon
static DWORD dataWindowSlowMuon
#define V1190_MODULE_RESET
SCALER_SETTINGS scaler_settings
INT end_of_run(INT run_number, char *error)
#define DATABUFFER_SIZE
set size of FiFo (ring) buffer, 2^17
#define SIS3820_SCALER_DATA_FORMAT_32BIT
#define EXTON1_FLAG
flag for "red/green", "on/off" mode: ON
#define SIS3820_CONTROL_INPUT_MODE0
int sis3820_key_enable(int device, u_int32_t sis3820_base)
DWORD doEvaluateSlowMuonEvent
bit pattern for trigger condition:
INT pileup[N_TDC_CHANNELS][N_HITS]
save information for each hit if it had a pre pileup or not
#define V1190_CONTROL_REGISTER
#define SIS3820_SCALER_DATA_FORMAT_24BIT
INT foundChannel[N_TDC_CHANNELS]
count appearance of channel i
RUNINFO runinfo
/Runinfo ODB key, defined in from midas.h
int init_v1190(u_int32_t module_address)
static BOOL flag_on_puls
flag to indicate that "puls" was turned on, "on/off" or "red/green" mode
BEAMLINE_EVENT beamline_event
for slow control parameters
unsigned long long U_LONG
GNU C-Compiler 64bit integer.
static TDC_EVAL_EVENT tdc_eval_event
INT lastBeamCounterEventPileup
#define TDC_BIT_RANGE
2^19 is the bit range of the TDC in 100ps and 200ps mode
#define V1190_DISABLE_ALL_CHANNEL
#define SIS3820_ADDRESS_1
VME address of 2nd scaler module.
#define CTRL_REFERENCE_CH1_DISABLE
#define VME_STATS_STR(_name)
#define MODCRYO_EVENT_STR(_name)
DWORD tof_bc_pileup_window
INT lastMasterEvent1or2Pileup
BOOL check_tof_and_pileup(INT timing, INT tofWindow, INT firstCh, INT lastCh, INT masterChannel, INT masterIndex, INT *channel, INT *ind)
int sis3820_operation_mode_read(int device, u_int32_t sis3820_base, u_int32_t *mode)
INT set_t0
flag indicating if t0 has been set
static struct timeval tvLastTime
BOOL frontend_call_loop
frontend_loop is called periodically if this variable is TRUE
int sis3820_operation_mode_write(int device, u_int32_t sis3820_base, u_int32_t mode)
struct TRIGGER_SETTINGS::@17 events
static INT rate[N_SCALER]
#define TRIGGER_SETTINGS_STR(_name)
U_LONG endMasterEvent0
U_LONG==unsigned long long, GNU C-compiler 64bit integer.
int sis3820_control_read(int device, u_int32_t sis3820_base, u_int32_t *control_status)
static DWORD masterChannelSlowMuon
"master" TDC channel for slow muons (TD or M2)
struct TRIGGER_SETTINGS::@19 event_1_settings
INT max_event_size
maximum event size produced by this frontend
INT pause_run(INT run_number, char *error)
INT tdc_data[N_TDC_CHANNELS *DATA_N_HITS]
this array is actually the Midas event
#define V1190_STATUS_REGISTER
INT evaluate_fast_muon_event()
#define V1190_EDGE_LEADING_MODE
#define M1_POSITRON_EVENT
INT read_slowcontrol_event(char *pevent, INT off)
INT do_master_channel(INT ch, INT event_type)
INT mode
scaler mode, see scaler_mode()
double frontend_loop_readtdc
#define DATA_N_HITS
max. of DATA_N_HITS in data file
#define EVENT_1_TYPE
Event type 1 = (BC)-TD-MC2-(e+)
char sample_cryo[NAME_LENGTH]
#define LEMVAC_EVENT_STR(_name)
#define MODCRYO_SETTINGS_STR(_name)
MODCRYO_EVENT moddy_event
#define CTRL_REFERENCE_CH1_ENABLE
#define EXTOFF1_FLAG
flag for "red/green", "on/off" mode: OFF
INT event_time
absolute time in event after reset of structure
INT evaluate_slow_muon_event()
INT read_scaler_event(char *pevent, INT off)
INT event_buffer_size
buffer size to hold events
BOOL check_positron(INT decWindow, INT coincWindow, INT firstCh, INT lastCh, INT masterChannel, INT masterIndex, INT *channel, INT *ind)
#define V1190_SOFTWARE_CLEAR
INT lastMasterEvent0Pileup
INT read_trigger_event(char *pevent, INT off)
#define V1190_ALMOST_FULL_LEVEL
#define V1190_OUTPUT_BUFFER_SIZE
static BOOL flag_scaler_address_0
char * frontend_file_name
The frontend file name, don't change it.
int sis3820_key_reset(int device, u_int32_t sis3820_base)
INT poll_event(INT source, INT count, BOOL test)
#define V1190_ADDRESS
the VME address of the CAEN V1190 TDC
DWORD delay_offpuls_usec_
#define MAX_NUMBER_LWORDS
max number of block data transfer */
TRIGGER_SETTINGS trigger_settings
/Equipment/Trigger/Settings
#define N_TDC_CHANNELS
number of TDC channels
#define SCALER_SETTINGS_STR(_name)
#define SAMPLECRYO_EVENT_STR(_name)
SAMPLECRYO_EVENT sample_event
#define N_SCALER
total number of scaler channels
static DWORD masterChannelFastMuon
"master" TDC channel for BC-M1 (usually M1)
#define N_SCALER_MODULE
number of channels of one scaler module
#define MASTERLAST
timing flags
#define V1190_OPCODE_ADDRESS
#define SCS2001M_SETTINGS_STR(_name)
#define EXP_PARAM_STR(_name)
#define V1190_SET_DETECTION
static VME_STATS vme_stats
#define EVENT_2_TYPE
Event type 2 = TD-e+-(BC), LE-muSR.
#define CLOCK
TDC channel assignments.
static DWORD eventDefinedSlowMuon
bit pattern containing trigger mode for slow muons (BC-TD-M2)
#define BEAMLINE_SETTINGS_STR(_name)
int sis3820_scaler_read(int device, u_int32_t sis3820_base, int mode, int nwords, u_int32_t *data)
int sis3820_modid_read(int device, u_int32_t sis3820_base, u_int32_t *modid)
INT begin_of_run(INT run_number, char *error)
BOOL tdc_disable_atstartup
SCS2001M_EVENT scs2001m_event
static U_LONG nextGoodTime
absolute run time when new events are accepted (for on/off mode)
INT tdc_event[N_TDC_CHANNELS][N_HITS]
int sis3820_control_write(int device, u_int32_t sis3820_base, u_int32_t control_status)
LEMVAC_EVENT lemvac_event
int init_sis3820(u_int32_t module_address)
struct TRIGGER_SETTINGS::@18 event_0_settings
static TDC_PILEUP tdc_pileup
#define SIS3820_ADDRESS_0
Local definitions to connect to VME module.
INT display_period
a frontend status page is displayed with this frequency in ms
U_LONG endMasterEvent1or2
#define EVENT_0_TYPE
EVENT type 0 = BC-MCP1-(e+)
INT resume_run(INT run_number, char *error)
static DWORD * p_write
read and write pointers for data ring buffer
#define ALMOST_FULL_LEVEL