00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <stdio.h>
00014 #include <stdlib.h>
00015 #include <stdint.h>
00016 #include <string>
00017 #include <map>
00018 #include <utility>
00019 #include <algorithm>
00020
00021
00022 #include "midas.h"
00023
00024
00025 #include <TH1.h>
00026 #include <TH2.h>
00027 #include "TRandom3.h"
00028
00029
00030
00031 #include "TGlobalData.h"
00032 #include "TSetupData.h"
00033
00034 using std::string;
00035 using std::map;
00036 using std::vector;
00037 using std::pair;
00038
00039
00040 static INT module_init(void);
00041 static INT module_event_caen(EVENT_HEADER*, void*);
00042
00043 extern HNDLE hDB;
00044 extern TGlobalData* gData;
00045 extern TSetupData* gSetup;
00046
00049 static vector<string> caen_boston_bank_names;
00059 static unsigned int nPreSamples;
00062 static const int NCHAN = 4;
00063
00064 ANA_MODULE MDT5720ProcessRaw_module =
00065 {
00066 "MDT5720ProcessRaw",
00067 "Vladimir Tishchenko",
00068 module_event_caen,
00069 NULL,
00070 NULL,
00071 module_init,
00072 NULL,
00073 NULL,
00074 0,
00075 NULL,
00076 };
00077
00078
00079 INT module_init()
00080 {
00081
00082 std::map<std::string, std::string> bank_to_detector_map = gSetup->fBankToDetectorMap;
00083 for(std::map<std::string, std::string>::iterator mapIter = bank_to_detector_map.begin();
00084 mapIter != bank_to_detector_map.end(); mapIter++) {
00085
00086 std::string bankname = mapIter->first;
00087
00088
00089 if (TSetupData::IsBostonCAEN(bankname))
00090 caen_boston_bank_names.push_back(bankname);
00091 }
00092
00093
00094 char key[80];
00095 int size;
00096 unsigned int post_trigger_percentage, nSamples;
00097
00098
00099
00100
00101
00102 sprintf(key, "/Equipment/Crate 5/Settings/CAEN/waveform length");
00103 size = sizeof(nSamples);
00104 db_get_value(hDB, 0, key, &nSamples, &size, TID_DWORD, 1);
00105 sprintf(key, "/Equipment/Crate 5/Settings/CAEN/post_trigger_size");
00106 size = sizeof(post_trigger_percentage);
00107 db_get_value(hDB, 0, key, &post_trigger_percentage, &size, TID_BYTE, 1);
00108
00109 nPreSamples = 20;
00110
00111
00112
00113 return SUCCESS;
00114 }
00115
00116
00117 INT module_event_caen(EVENT_HEADER *pheader, void *pevent)
00118 {
00119
00120
00121 typedef map<string, vector<TPulseIsland*> > TStringPulseIslandMap;
00122 typedef pair<string, vector<TPulseIsland*> > TStringPulseIslandPair;
00123 typedef map<string, vector<TPulseIsland*> >::iterator map_iterator;
00124
00125
00126
00127 TStringPulseIslandMap& pulse_islands_map =
00128 gData->fPulseIslandToChannelMap;
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 int midas_event_number = pheader->serial_number;
00147
00148 BYTE *pdata;
00149
00150
00151
00152 char bank_name[8];
00153 sprintf(bank_name,"CND%i",0);
00154 unsigned int bank_len = bk_locate(pevent, bank_name, &pdata);
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 uint32_t *p32 = (uint32_t*)pdata;
00167 uint32_t *p32_0 = (uint32_t*)pdata;
00168
00169
00170 while ( (p32 - p32_0)*4 < bank_len )
00171 {
00172
00173 uint32_t caen_event_cw = p32[0]>>28;
00174
00175 if ( caen_event_cw != 0xA )
00176 {
00177 printf("***ERROR! Wrong data format it dt5720: incorrect control word 0x%08x\n", caen_event_cw);
00178 return SUCCESS;
00179 }
00180
00181 uint32_t caen_event_size = p32[0] & 0x0FFFFFFF;
00182
00183
00184 uint32_t caen_channel_mask = p32[1] & 0x000000FF;
00185
00186 int nchannels = 0;
00187 for (int ichannel=0; ichannel<NCHAN; ichannel++ )
00188 {
00189 if ( caen_channel_mask & (1<<ichannel) ) nchannels++;
00190 }
00191
00192
00193 uint32_t caen_event_counter = p32[2] & 0x00FFFFFF;
00194
00195
00196
00197 uint32_t caen_trigger_time = 2*p32[3];
00198
00199
00200
00201 unsigned int nsamples = ((caen_event_size-4)*2) / nchannels;
00202
00203
00204
00205 for (std::vector<std::string>::iterator bankNameIter = caen_boston_bank_names.begin();
00206 bankNameIter != caen_boston_bank_names.end(); bankNameIter++) {
00207
00208 vector<TPulseIsland*>& pulse_islands = pulse_islands_map[*(bankNameIter)];
00209 std::vector<int> sample_vector;
00210 int ichannel = bankNameIter - caen_boston_bank_names.begin();
00211
00212
00213
00214
00215
00216 if ( caen_channel_mask & (1<<ichannel) )
00217 {
00218
00219 unsigned int isample = 0;
00220 unsigned int nwords = nsamples/2;
00221
00222 for (int iword=0; iword<nwords; iword++)
00223 {
00224
00225 for (int isubword=0; isubword<2; isubword++)
00226 {
00227 uint32_t adc;
00228
00229 if (isubword == 0 )
00230 adc = (p32[4+iword+ichannel*nwords] & 0x3fff);
00231 else
00232 adc = ((p32[4+iword+ichannel*nwords] >> 16) & 0x3fff);
00233
00234
00235
00236 isample++;
00237
00238 sample_vector.push_back(adc);
00239
00240 }
00241 }
00242
00243 pulse_islands.push_back(new TPulseIsland(caen_trigger_time - nPreSamples, sample_vector, *bankNameIter));
00244 }
00245 }
00246
00247
00248 p32 += caen_event_size + (caen_event_size%2);
00249
00250
00251 }
00252
00253
00254 if(midas_event_number == 1) {
00255
00256 for (std::vector<std::string>::iterator bankNameIter = caen_boston_bank_names.begin();
00257 bankNameIter != caen_boston_bank_names.end(); bankNameIter++) {
00258
00259 vector<TPulseIsland*>& pulse_islands = pulse_islands_map[*(bankNameIter)];
00260 printf("TEST MESSAGE: Read %d events from bank %s in event %d\n",
00261 pulse_islands.size(),
00262 (*(bankNameIter)).c_str(),
00263 midas_event_number);
00264 }
00265 }
00266
00267 return SUCCESS;
00268 }
00269