00001 #include <iostream>
00002 #include <fstream>
00003 #include "TrigEvent/TrigMdc.h"
00004 #include <stdlib.h>
00005 using namespace std;
00006
00007 TrigMdc::TrigMdc(const char* name) : m_name(name){
00008
00009 m_mdchit_one = new int*[24];
00010 for (int i = 0; i < 24; i++) m_mdchit_one[i] = new int[256];
00011 m_mdchit_sone = new int*[24];
00012 for (int i = 0; i < 24; i++) m_mdchit_sone[i] = new int[256];
00013 m_mdchit_pre = new int*[24];
00014 for(int i=0; i<24; i++) m_mdchit_pre[i] = new int[256];
00015 m_mdchit_aft = new int*[24];
00016 for(int i=0; i<24; i++) m_mdchit_aft[i] = new int[256];
00017 m_mdchit_win = new uint32_t*[24];
00018 for(int i=0; i<24; i++) m_mdchit_win[i] = new uint32_t[256];
00019
00020 m_mdctsf_one = new int*[6];
00021 for (int i=0; i<6; i++) m_mdctsf_one[i] = new int[256];
00022 m_mdctsf_sone = new int*[6];
00023 for (int i=0; i<6; i++) m_mdctsf_sone[i] = new int[256];
00024 m_mdctsf_pre = new int*[6];
00025 for(int i=0; i<6; i++) m_mdctsf_pre[i] = new int[256];
00026 m_mdctsf_aft = new int*[6];
00027 for(int i=0; i<6; i++) m_mdctsf_aft[i] = new int[256];
00028 m_mdctsf_win = new uint32_t*[6];
00029 for(int i=0; i<6; i++) m_mdctsf_win[i] = new uint32_t[256];
00030
00031 m_mdcltrk_one = new int[128];
00032 m_mdcltrk_sone = new int[128];
00033 m_mdcltrk_pre = new int[128];
00034 m_mdcltrk_aft = new int[128];
00035 m_mdcltrk_win = new uint32_t[128];
00036
00037 m_mdcstrk_one = new int[128];
00038 m_mdcstrk_sone = new int[128];
00039 m_mdcstrk_pre = new int[128];
00040 m_mdcstrk_aft = new int[128];
00041 m_mdcstrk_win = new uint32_t[128];
00042
00043 m_mdcltrkc_one = new int[132];
00044 m_mdcltrkc_sone= new int[132];
00045
00046 m_mdcstrkc_one = new int[132];
00047 m_mdcstrkc_sone = new int[132];
00048
00049 m_mdcTrigCondi = new int[10];
00050
00051 filename = getenv("TRIGEVENTROOT");
00052 filename += "/dat/trig_mdc.txt";
00053 ifstream inputfile;
00054 inputfile.open(filename.c_str());
00055 string data[6];
00056 std::vector<uint32_t> vtmp;
00057 uint32_t mark = 226;
00058 for(uint32_t i = 0; i < 6; i++) inputfile >> data[i];
00059 for(uint32_t j = 0; j < 4680; j++) {
00060 for(uint32_t k = 0; k < 6; k++) inputfile >> data[k];
00061 if((uint32_t (atoi(data[0].c_str())) != mark) || j == 4679) {
00062 if(j == 4679) {
00063 for(int m = 1; m < 6; m++) vtmp.push_back(atoi(data[m].c_str()));
00064 }
00065 typedef pair<uint32_t, vector<uint32_t> > vpair;
00066 m_datamap.insert(vpair(mark,vtmp));
00067 mark = atoi(data[0].c_str());
00068 vtmp.clear();
00069 }
00070 if((uint32_t (atoi(data[0].c_str())) == mark) && j != 4679) {
00071 for(int l = 1; l < 6; l++) vtmp.push_back(atoi(data[l].c_str()));
00072 }
00073 }
00074 }
00075
00076 TrigMdc::~TrigMdc() {
00077 delete m_mdchit_one;
00078 delete m_mdctsf_one;
00079 delete m_mdchit_sone;
00080 delete m_mdctsf_sone;
00081
00082 delete m_mdchit_pre;
00083
00084
00085 delete m_mdcltrk_one;
00086 delete m_mdcstrk_one;
00087 delete m_mdcltrkc_one;
00088 delete m_mdcstrkc_one;
00089
00090 delete m_mdcltrk_sone;
00091 delete m_mdcstrk_sone;
00092 delete m_mdcltrkc_sone;
00093 delete m_mdcstrkc_sone;
00094
00095 delete m_mdcTrigCondi;
00096 }
00097
00098 void TrigMdc::initialize(){
00099
00100 for(int i = 0; i < 24; i++)
00101 for(int j = 0; j < 256; j++)
00102 {
00103 m_mdchit_one[i][j] = 0;
00104 m_mdchit_sone[i][j] = 0;
00105 m_mdchit_pre[i][j] = 0;
00106 m_mdchit_aft[i][j] = 0;
00107 m_mdchit_win[i][j] = 0;
00108 if(i < 6) {
00109 m_mdctsf_one[i][j] = 0;
00110 m_mdctsf_sone[i][j] = 0;
00111 m_mdctsf_pre[i][j] = 0;
00112 m_mdctsf_aft[i][j] = 0;
00113 m_mdctsf_win[i][j] = 0;
00114 }
00115 }
00116 for(int k = 0; k < 132; k++)
00117 {
00118 if(k < 10) m_mdcTrigCondi[k] = 0;
00119 m_mdcltrkc_one[k] = 0;
00120 m_mdcstrkc_one[k] = 0;
00121 m_mdcltrkc_sone[k] = 0;
00122 m_mdcstrkc_sone[k] = 0;
00123 if(k < 128) {
00124 m_mdcltrk_one[k] = 0;
00125 m_mdcltrk_sone[k] = 0;
00126 m_mdcltrk_pre[k] = 0;
00127 m_mdcltrk_aft[k] = 0;
00128 m_mdcltrk_win[k] = 0;
00129
00130 m_mdcstrk_one[k] = 0;
00131 m_mdcstrk_sone[k] = 0;
00132 m_mdcstrk_pre[k] = 0;
00133 m_mdcstrk_aft[k] = 0;
00134 m_mdcstrk_win[k] = 0;
00135
00136 }
00137 }
00138 }
00139
00140 void TrigMdc::setMdcTrigData( uint32_t boardId, uint32_t window, uint32_t datasize, const uint32_t* data){
00141 if(datasize%window != 0) cerr<<"ERROR: The data size is not completed in time windows"<<endl;
00142 uint32_t periods = datasize/window;
00143 std::map<uint32_t, std::vector<uint32_t> >::iterator iter=m_datamap.begin();
00144 for(; iter != m_datamap.end(); iter++){
00145 if(iter->first != boardId) continue;
00146 std::vector<uint32_t>::iterator iter1 = iter->second.begin();
00147 for(; iter1 != iter->second.end(); iter1+=5){
00148 uint32_t byteId = *(iter1+0) -1;
00149 uint32_t bitId = *(iter1+1);
00150 int layerId = *(iter1+2) -1;
00151 int wireId = *(iter1+3) -1;
00152 uint32_t data_type = *(iter1+4);
00153 int seriesOne = -100;
00154 bool firstSOne = true;
00155 bool flag_firstone(true), flag_lastone(true);
00156 for(uint32_t i=0; i<window; i++){
00157 if(layerId < 0 || wireId < 0) continue;
00158 if((iter->first) >= 226 && (iter->first) <= 233){
00159 if(data_type == 1){
00160 if((data[byteId + i*periods] >> bitId) & 1){
00161 if(layerId >= 36 && layerId <= 39 ){
00162 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdchit_pre[layerId-16][wireId] = i+1; flag_firstone = false;}
00163 if( ((i-seriesOne)!=1) && (m_mdchit_aft[layerId-16][wireId]!=0) ) flag_lastone = false;
00164 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdchit_aft[layerId-16][wireId]=i+1;
00165 if(((i-seriesOne)==1) && firstSOne) m_mdchit_sone[layerId-16][wireId] += 1;
00166 if(m_mdchit_sone[layerId-16][wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00167 seriesOne = i;
00168 m_mdchit_one[layerId-16][wireId] += 1;
00169 m_mdchit_win[layerId-16][wireId] += 1<<i;
00170 }
00171 else {
00172 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdchit_pre[layerId][wireId] = i+1; flag_firstone = false;}
00173 if( ((i-seriesOne)!=1) && (m_mdchit_aft[layerId][wireId]!=0) ) flag_lastone = false;
00174 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdchit_aft[layerId][wireId]=i+1;
00175 if(((i-seriesOne) == 1) && firstSOne) m_mdchit_sone[layerId][wireId] += 1;
00176 if(m_mdchit_sone[layerId][wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00177 seriesOne = i;
00178 m_mdchit_one[layerId][wireId] += 1;
00179 m_mdchit_win[layerId][wireId] += 1<<i;
00180 }
00181 }
00182 }
00183 if(data_type == 0) {
00184 if((data[byteId + i*periods] >> bitId) & 1) {
00185 if(layerId == 10) {
00186 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdctsf_pre[2][wireId] = i+1; flag_firstone = false;}
00187 if( ((i-seriesOne)!=1) && (m_mdctsf_aft[2][wireId]!=0) ) flag_lastone = false;
00188 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdctsf_aft[2][wireId]=i+1;
00189
00190 if((i-seriesOne) == 1 && firstSOne) m_mdctsf_sone[2][wireId] += 1;
00191 if(m_mdctsf_sone[2][wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00192 seriesOne = i;
00193 m_mdctsf_one[2][wireId] += 1;
00194 m_mdctsf_win[2][wireId] += 1<<i;
00195 }
00196 if(layerId == 14) {
00197 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdctsf_pre[3][wireId] = i+1; flag_firstone = false;}
00198 if( ((i-seriesOne)!=1) && (m_mdctsf_aft[3][wireId]!=0) ) flag_lastone = false;
00199 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdctsf_aft[3][wireId]=i+1;
00200
00201 if((i-seriesOne) == 1 && firstSOne) m_mdctsf_sone[3][wireId] += 1;
00202 if(m_mdctsf_sone[3][wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00203 seriesOne = i;
00204 m_mdctsf_one[3][wireId] += 1;
00205 m_mdctsf_win[3][wireId] += 1<<i;
00206 }
00207 if(layerId == 17) {
00208 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdctsf_pre[4][wireId] = i+1; flag_firstone = false;}
00209 if( ((i-seriesOne)!=1) && (m_mdctsf_aft[4][wireId]!=0) ) flag_lastone = false;
00210 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdctsf_aft[4][wireId]=i+1;
00211
00212 if((i-seriesOne) == 1 && firstSOne) m_mdctsf_sone[4][wireId] += 1;
00213 if(m_mdctsf_sone[4][wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00214 seriesOne = i;
00215 m_mdctsf_one[4][wireId] += 1;
00216 m_mdctsf_win[4][wireId] += 1<<i;
00217 }
00218 if(layerId == 37) {
00219 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdctsf_pre[5][wireId] = i+1; flag_firstone = false;}
00220 if( ((i-seriesOne)!=1) && (m_mdctsf_aft[5][wireId]!=0) ) flag_lastone = false;
00221 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdctsf_aft[5][wireId]=i+1;
00222
00223 if((i-seriesOne) == 1 && firstSOne) m_mdctsf_sone[5][wireId] += 1;
00224 if(m_mdctsf_sone[5][wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00225 seriesOne = i;
00226 m_mdctsf_one[5][wireId] += 1;
00227 m_mdctsf_win[5][wireId] += 1<<i;
00228 }
00229 }
00230 }
00231 if(data_type == 2) {
00232 if((data[byteId + i*periods] >> bitId) & 1) {
00233 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdcltrk_pre[wireId] = i+1; flag_firstone = false;}
00234 if( ((i-seriesOne)!=1) && (m_mdcltrk_aft[wireId]!=0) ) flag_lastone = false;
00235 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdcltrk_aft[wireId]=i+1;
00236
00237 if((i-seriesOne) == 1 && firstSOne) m_mdcltrk_sone[wireId] += 1;
00238 if(m_mdcltrk_sone[wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00239 seriesOne = i;
00240 m_mdcltrk_one[wireId] += 1;
00241 m_mdcltrk_win[wireId] += 1<<i;
00242 }
00243 }
00244 if(data_type == 3) {
00245 if((data[byteId + i*periods] >> bitId) & 1) {
00246 if(flag_firstone && (i-seriesOne!=1) && (i!=0)){ m_mdcstrk_pre[wireId] = i+1; flag_firstone = false;}
00247 if( ((i-seriesOne)!=1) && (m_mdcstrk_aft[wireId]!=0) ) flag_lastone = false;
00248 if( (flag_firstone==false) && ((i-seriesOne)==1) && flag_lastone) m_mdcstrk_aft[wireId]=i+1;
00249
00250 if((i-seriesOne) == 1 && firstSOne) m_mdcstrk_sone[wireId] += 1;
00251 if(m_mdcstrk_sone[wireId] != 0 && (i-seriesOne) != 1) firstSOne = false;
00252 seriesOne = i;
00253 m_mdcstrk_one[wireId] += 1;
00254 m_mdcstrk_win[wireId] += 1<<i;
00255 }
00256 }
00257 }
00258
00259 if((iter->first) == 234) {
00260 if(data_type == 0) {
00261 if((data[byteId + i*periods] >> bitId) & 1) {
00262 if(layerId == 2) {
00263 if((i - seriesOne) == 1 && firstSOne) m_mdctsf_sone[0][wireId] += 1;
00264 if(m_mdctsf_sone[0][wireId] != 0 && (i - seriesOne) != 1) firstSOne = false;
00265 seriesOne = i;
00266 m_mdctsf_one[0][wireId] += 1;
00267 }
00268 if(layerId == 6) {
00269 if((i - seriesOne) == 1 && firstSOne) m_mdctsf_sone[1][wireId] += 1;
00270 if(m_mdctsf_sone[1][wireId] != 0 && (i - seriesOne) != 1) firstSOne = false;
00271 seriesOne = i;
00272 m_mdctsf_one[1][wireId] += 1;
00273 }
00274 }
00275 }
00276 if(data_type == 1) {
00277 if((data[byteId + i*periods] >> bitId) & 1) {
00278 if((i - seriesOne) == 1 && firstSOne) m_mdchit_sone[layerId][wireId] += 1;
00279 if(m_mdchit_sone[layerId][wireId] != 0 && (i - seriesOne) != 1) firstSOne = false;
00280 seriesOne = i;
00281 m_mdchit_one[layerId][wireId] += 1;
00282 }
00283 }
00284 if(data_type == 4) {
00285 if((data[byteId + i*periods] >> bitId) & 1) {
00286 m_mdcTrigCondi[wireId] = 1;
00287 }
00288 }
00289 }
00290
00291 if((iter->first) == 235 || (iter->first) == 236) {
00292 if(data_type == 2) {
00293 if((data[byteId + i*periods] >> bitId) & 1) {
00294 if((i - seriesOne) == 1 && firstSOne) m_mdcltrkc_sone[wireId] += 1;
00295 if(m_mdcltrkc_sone[wireId] != 0 && (i - seriesOne) != 1) firstSOne = false;
00296 seriesOne = i;
00297 m_mdcltrkc_one[wireId] += 1;
00298 if(wireId >= 128) m_mdcTrigCondi[wireId - 126] = 1;
00299 }
00300 }
00301 if(data_type == 3) {
00302 if((data[byteId + i*periods] >> bitId) & 1) {
00303 if((i - seriesOne) == 1 && firstSOne) m_mdcstrkc_sone[wireId] += 1;
00304 if(m_mdcstrkc_sone[wireId] != 0 && (i - seriesOne) != 1) firstSOne = false;
00305 seriesOne = i;
00306 m_mdcstrkc_one[wireId] += 1;
00307 if(wireId >= 128) m_mdcTrigCondi[wireId - 122] = 1;
00308 }
00309 }
00310 }
00311
00312 }
00313
00314 }
00315 }
00316 }
00317
00318 void TrigMdc::print() {
00319 cout<<"The number of board is "<<m_datamap.size()<<endl;
00320 std::map<uint32_t, std::vector<uint32_t> >::iterator iter = m_datamap.begin();
00321 if(iter->first == 0xe2)
00322 cout<<"The data size of E2 board is "<<iter->second.size()<<endl;
00323
00324 for(int i = 0; i < 24; i++)
00325 for(int j = 0; j < 256; j++)
00326 {
00327 m_mdchit_one[i][j] = 0;
00328 m_mdchit_sone[i][j] = 0;
00329 cout<<"MDC hits: "<<i<<" "<<j<<" "<<m_mdchit_one[i][j]<<endl;
00330 cout<<"MDC hits: "<<i<<" "<<j<<" "<<m_mdchit_sone[i][j]<<endl;
00331 if(i < 6) {
00332 m_mdctsf_one[i][j] = 0;
00333 m_mdctsf_sone[i][j] = 0;
00334 cout<<"MDC tsf: "<<i<<" "<<j<<" "<<m_mdctsf_one[i][j]<<endl;
00335 cout<<"MDC tsf: "<<i<<" "<<j<<" "<<m_mdctsf_sone[i][j]<<endl;
00336 }
00337 }
00338 for(int k = 0; k < 132; k++)
00339 {
00340 m_mdcltrkc_one[k] = 0;
00341 m_mdcstrkc_one[k] = 0;
00342 m_mdcltrkc_sone[k] = 0;
00343 m_mdcstrkc_sone[k] = 0;
00344 cout<<"MDC ltrkc: "<<k<<" "<<m_mdcltrkc_one[k]<<endl;
00345 cout<<"MDC strkc: "<<k<<" "<<m_mdcstrkc_one[k]<<endl;
00346 cout<<"MDC ltrkc: "<<k<<" "<<m_mdcltrkc_sone[k]<<endl;
00347 cout<<"MDC strkc: "<<k<<" "<<m_mdcstrkc_sone[k]<<endl;
00348 if(k < 128) {
00349 m_mdcltrk_one[k] = 0;
00350 m_mdcstrk_one[k] = 0;
00351 m_mdcltrk_sone[k] = 0;
00352 m_mdcstrk_sone[k] = 0;
00353 cout<<"MDC ltrk: "<<k<<" "<<m_mdcltrk_one[k]<<endl;
00354 cout<<"MDC strk: "<<k<<" "<<m_mdcstrk_one[k]<<endl;
00355 cout<<"MDC ltrk: "<<k<<" "<<m_mdcltrk_sone[k]<<endl;
00356 cout<<"MDC strk: "<<k<<" "<<m_mdcstrk_sone[k]<<endl;
00357 }
00358 }
00359 }