00001 #include "T1290Data.h"
00002
00003 #include <stdio.h>
00004 #include <stdlib.h>
00005 #include <math.h>
00006
00007 #include "TH1.h"
00008 #include "TH2.h"
00009
00010 #include "TGo4EventProcessor.h"
00011
00012 void T1290Data::Clear()
00013 {
00014 for (int n=0;n<T1290Data::NumChan;n++) {
00015 lead[n] = -1;
00016 trail[n] = -1;
00017 width[n] = -1;
00018
00019 hit_lead[n] = 0;
00020 hit_trail[n] = 0;
00021 for (int m=0;m<T1290Data::MaxHits;m++) {
00022 lead_multi[n][m] = -1;
00023 trail_multi[n][m] = -1;
00024 }
00025 }
00026 extended_trigger_time = -1;
00027 }
00028
00029
00030 void T1290Data::CalcWidth()
00031 {
00032 for (int n=0;n<NumChan;n++)
00033 width[n] = abs(trail[n]-lead[n]);
00034 }
00035
00036 int T1290Data::FindGeo(int* pdata, unsigned len)
00037 {
00038 for (unsigned iCha = 0; iCha < len; iCha++) {
00039 Int_t data32 = pdata[iCha];
00040 Int_t type_word = (data32 >> 27) & 0x1f;
00041 if (type_word==8) return (data32 & 0x1f);
00042 }
00043
00044 return 0;
00045 }
00046
00047
00048 void T1290Data::Unpack(int* pdata, unsigned len, int expected_geo)
00049 {
00050 if (len<2) {
00051 printf("Error unpack V1290 data - too few messages = %u\n", len);
00052 }
00053
00054 for (int n=0;n<NumChan;n++) {
00055 hit_lead[n] = 0;
00056 hit_trail[n] = 0;
00057 }
00058
00059 Int_t geo(0);
00060
00061 for (unsigned iCha = 0; iCha < len; iCha++) {
00062 Int_t data32 = pdata[iCha];
00063 Int_t type_word = (data32 >> 27) & 0x1f;
00064
00065
00066
00067 switch (type_word) {
00068 case 8: {
00069
00070 geo = data32 & 0x1f;
00071
00072
00073
00074 if ((expected_geo>0) && (expected_geo!=geo))
00075 printf("GEO mismatch, expected %d, is %d\n", expected_geo, geo);
00076
00077 break;
00078 }
00079 case 16: {
00080
00081
00082 CalcWidth();
00083
00084 static int errcnt = 0;
00085
00086 if (iCha+1!=len) {
00087 if (errcnt++<3)
00088 printf("Wrong V1290 data format - more messages after globar trailer\n");
00089 return;
00090 }
00091
00092 break;
00093 }
00094 case 1: {
00095
00096
00097
00098 break;
00099 }
00100 case 3: {
00101
00102
00103
00104 break;
00105 }
00106 case 4: {
00107 printf("??TDC ERROR GEO = %d??\n", geo);
00108 break;
00109 }
00110 case 0: {
00111 Int_t TDC_input = (data32 >> 21) & 0x1f;
00112 Int_t ch_data = data32 & 0x1fffff;
00113 Int_t front = (data32 >> 26) & 0x1;
00114
00115 if (front==0) {
00116 if (hit_lead[TDC_input] == 0) {
00117 lead[TDC_input] = ch_data;
00118 }
00119 if( hit_lead[ TDC_input] <MaxHits )
00120 lead_multi[TDC_input][ hit_lead[ TDC_input] ] = ch_data;
00121 hit_lead[TDC_input] ++;
00122
00123 } else {
00124 if (hit_trail[TDC_input] == 0) {
00125 trail[TDC_input] = ch_data;
00126 }
00127 if(hit_trail[ TDC_input] <MaxHits )
00128 trail_multi[TDC_input][hit_trail[ TDC_input] ] = ch_data;
00129 hit_trail[TDC_input] ++;
00130 }
00131 break;
00132 }
00133 case 17: {
00134 extended_trigger_time = data32 & 0x7ffffff;
00135 break;
00136 }
00137 default: {
00138 printf("GEO:%d Unknown tag %d\n", geo, type_word);
00139 break;
00140 }
00141 }
00142
00143 }
00144 }
00145
00146
00147 T1290Proc::T1290Proc()
00148 {
00149 fTDC_chan = 0;
00150 for (int n=0;n<T1290Data::NumChan;n++) {
00151 fTDC_lead[n] = 0;
00152 fTDC_trail[n] = 0;
00153 fTDC_width[n] = 0;
00154 }
00155 }
00156
00157 T1290Proc::~T1290Proc()
00158 {
00159 }
00160
00161 void T1290Proc::MakeHistos(TGo4EventProcessor* proc, const char* name)
00162 {
00163 TString obname, obtitle;
00164
00165 obname.Form("%s/%s_channels", name, name);
00166 obtitle.Form("Signal counts (L & T in same event) in each channel of %s", name);
00167 fTDC_chan = proc->MakeTH1('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan, "channel");
00168 obname.Form("%s/%s_channelsLeading", name, name);
00169 obtitle.Form("Leading edge counts in each channel of %s", name);
00170 fTDC_chanLead = proc->MakeTH1('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan, "channel; Leading edges");
00171 obname.Form("%s/%s_channelsTrailing", name, name);
00172 obtitle.Form("Trailing edge counts in each channel of %s", name);
00173 fTDC_chanTrail = proc->MakeTH1('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan, "channel; Trailing edges");
00174
00175 for (int ch=0;ch<T1290Data::NumChan;ch++) {
00176 obname.Form("%s/Lead/%s_%02d_Lead", name, name, ch);
00177 obtitle.Form("Leading edge of %s channel %d", name, ch);
00178 fTDC_lead[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00179 obname.Form("%s/Trail/%s_%02d_Trail", name, name, ch);
00180 obtitle.Form("Trailing edge of %s channel %d", name, ch);
00181 fTDC_trail[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00182 obname.Form("%s/Width/%s_%02d_Width", name, name, ch);
00183 obtitle.Form("Width of %s channel %d", name, ch);
00184 fTDC_width[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00185 }
00186
00187 obname.Form("%s/Multi/%s_channelsLeadingMulti", name, name);
00188 obtitle.Form("Nb multiple Leading edge counts in each channel of %s", name);
00189 fTDC_chanLeadMulti = proc->MakeTH2('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan,
00190 16, 0., 16., "channel; Leading edges");
00191 obname.Form("%s/Multi/%s_channelsTrailingMulti", name, name);
00192 obtitle.Form("Nb multiple Trailing edge counts in each channel of %s", name);
00193 fTDC_chanTrailMulti = proc->MakeTH2('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan,
00194 16, 0., 16., "channel; Trailing edges");
00195 }
00196 void T1290Proc::MakeDebugHistos(TGo4EventProcessor* proc, const char* name)
00197 {
00198 TString obname, obtitle;
00199
00200 for (int ch=0;ch<T1290Data::NumChan;ch++) {
00201
00202 obname.Form("%s/Multi/LeadNb/%s_%02d_Lead_nb", name, name, ch);
00203 obtitle.Form("nb multi lead vs Leading edge of %s channel %d", name, ch);
00204 fTDC_lead_nblead[ch] = proc->MakeTH2('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, 16, 0., 16.,"time; Leading edges");
00205
00206 obname.Form("%s/Multi/Lead/%s_%02d_Lead_Multi", name, name, ch);
00207 obtitle.Form("Second and later hits Leading edge of %s channel %d", name, ch);
00208 fTDC_lead_multi[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00209 obname.Form("%s/Multi/Trail/%s_%02d_Trail_Multi", name, name, ch);
00210 obtitle.Form("Second and later hits Trailing edge of %s channel %d", name, ch);
00211 fTDC_trail_multi[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00212 obname.Form("%s/Multi/Width/%s_%02d_Width_Multi", name, name, ch);
00213 obtitle.Form("Second and later hits Width of %s channel %d", name, ch);
00214 fTDC_width_multi[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, -25000, 25000, "time");
00215 }
00216 }
00217
00218
00219 void T1290Proc::FillHistos(T1290Data& data)
00220 {
00221 if (fTDC_chan==0) return;
00222
00223 for (int ch=0; ch<T1290Data::NumChan; ch++) {
00224 if (data.lead[ch]>0) {
00225 fTDC_lead[ch]->Fill(data.lead[ch]);
00226 fTDC_chanLead->Fill(ch);
00227 }
00228 if (data.trail[ch]>0) {
00229 fTDC_trail[ch]->Fill(data.trail[ch]);
00230 fTDC_chanTrail->Fill(ch);
00231 }
00232 if( data.lead[ch]>0 && data.trail[ch]>0)
00233 fTDC_chan->Fill(ch);
00234 if (data.width[ch]>0) {
00235 fTDC_width[ch]->Fill(data.width[ch]);
00236 }
00237 fTDC_chanLeadMulti->Fill(ch, data.hit_lead[ch]);
00238 fTDC_chanTrailMulti->Fill(ch, data.hit_trail[ch]);
00239 }
00240 }
00241 void T1290Proc::FillDebugHistos(T1290Data& data)
00242 {
00243 if (fTDC_chan==0) return;
00244
00245 for (int ch=0; ch<T1290Data::NumChan; ch++) {
00246 if (data.lead[ch]>0)
00247 fTDC_lead_nblead[ch]->Fill(data.lead[ch], data.hit_lead[ch]);
00248 for(int iMultiIndex = 0; iMultiIndex < data.hit_lead[ch]-1 && iMultiIndex<T1290Data::MaxHits; iMultiIndex++ )
00249 {
00250 fTDC_lead_multi[ch]->Fill(data.lead_multi[ch][iMultiIndex]);
00251 if( iMultiIndex < data.hit_trail[ch] -1)
00252 fTDC_width_multi[ch]->Fill(data.trail_multi[ch][iMultiIndex] - data.lead_multi[ch][iMultiIndex] );
00253 }
00254 for(int iMultiIndex = 0; iMultiIndex < data.hit_trail[ch]-1 && iMultiIndex<T1290Data::MaxHits; iMultiIndex++ )
00255 fTDC_trail_multi[ch]->Fill(data.trail_multi[ch][iMultiIndex]);
00256 }
00257 }
00258
00259
00260 void T1290Proc::MakeHistos(TGo4EventProcessor* proc, Bool_t bWithDebugHistos, Bool_t bWithTriggerTime,
00261 const char* name)
00262 {
00263 TString obname, obtitle;
00264
00265 obname.Form("CAEN/%s_channels", name);
00266 obtitle.Form("Signal counts (L & T in same event) in each channel of %s", name);
00267 fTDC_chan = proc->MakeTH1('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan, "channel");
00268 obname.Form("CAEN/%s_channelsLeading", name);
00269 obtitle.Form("Leading edge counts in each channel of %s", name);
00270 fTDC_chanLead = proc->MakeTH1('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan, "channel; Leading edges");
00271 obname.Form("CAEN/%s_channelsTrailing", name);
00272 obtitle.Form("Trailing edge counts in each channel of %s", name);
00273 fTDC_chanTrail = proc->MakeTH1('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan, "channel; Trailing edges");
00274
00275 for (int ch=0;ch<T1290Data::NumChan;ch++) {
00276 obname.Form("CAEN/%s/Lead/%s_%02d_Lead", name, name, ch);
00277 obtitle.Form("Leading edge of %s channel %d", name, ch);
00278 fTDC_lead[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00279 obname.Form("CAEN/%s/Trail/%s_%02d_Trail", name, name, ch);
00280 obtitle.Form("Trailing edge of %s channel %d", name, ch);
00281 fTDC_trail[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00282 obname.Form("CAEN/%s/Width/%s_%02d_Width", name, name, ch);
00283 obtitle.Form("Width of %s channel %d", name, ch);
00284 fTDC_width[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00285
00286 if( kTRUE == bWithDebugHistos ) {
00287 obname.Form("CAEN/%s/Multi/LeadNb/%s_%02d_Lead_nb", name, name, ch);
00288 obtitle.Form("nb multi lead vs Leading edge of %s channel %d", name, ch);
00289 fTDC_lead_nblead[ch] = proc->MakeTH2('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, 16, 0., 16.,"time; Leading edges");
00290
00291 obname.Form("CAEN/%s/Multi/Lead/%s_%02d_Lead_Multi", name, name, ch);
00292 obtitle.Form("Second and later hits Leading edge of %s channel %d", name, ch);
00293 fTDC_lead_multi[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00294 obname.Form("CAEN/%s/Multi/Trail/%s_%02d_Trail_Multi", name, name, ch);
00295 obtitle.Form("Second and later hits Trailing edge of %s channel %d", name, ch);
00296 fTDC_trail_multi[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, 0, 50000, "time");
00297 obname.Form("CAEN/%s/Multi/Width/%s_%02d_Width_Multi", name, name, ch);
00298 obtitle.Form("Second and later hits Width of %s channel %d", name, ch);
00299 fTDC_width_multi[ch] = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 5000, -25000, 25000, "time");
00300 }
00301 }
00302
00303 obname.Form("CAEN/%s/Multi/%s_channelsLeadingMulti", name, name);
00304 obtitle.Form("Nb multiple Leading edge counts in each channel of %s", name);
00305 fTDC_chanLeadMulti = proc->MakeTH2('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan,
00306 16, 0., 16., "channel; Leading edges");
00307 obname.Form("CAEN/%s/Multi/%s_channelsTrailingMulti", name, name);
00308 obtitle.Form("Nb multiple Trailing edge counts in each channel of %s", name);
00309 fTDC_chanTrailMulti = proc->MakeTH2('I', obname.Data(), obtitle.Data(), T1290Data::NumChan, 0, T1290Data::NumChan,
00310 16, 0., 16., "channel; Trailing edges");
00311
00312 if( kTRUE == bWithTriggerTime )
00313 {
00314 obname.Form("CAEN/%s/%s_TriggerTimeHigh", name, name);
00315 obtitle.Form("Higher bits for Trigger time from extended trigger time tag for CAEN %s", name);
00316 fTDC_CAEN_triggertimeHigh = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 2047, 0, 134152192, "Bin []");
00317 obname.Form("CAEN/%s/%s_TriggerTimeLow", name, name);
00318 obtitle.Form("Lower bits for Trigger time from extended trigger time tag for CAEN %s", name);
00319 fTDC_CAEN_triggertimeLow = proc->MakeTH1('I', obname.Data(), obtitle.Data(), 0xFFFF, 0, 0xFFFF, "Bin []");
00320 }
00321
00322 }
00323 void T1290Proc::FillHistos(T1290Data& data, Bool_t bWithDebugHistos, Bool_t bWithTriggerTime)
00324 {
00325 if (fTDC_chan==0) return;
00326
00327 for (int ch=0; ch<T1290Data::NumChan; ch++) {
00328 if (data.lead[ch]>0) {
00329 fTDC_lead[ch]->Fill(data.lead[ch]);
00330 fTDC_chanLead->Fill(ch);
00331 }
00332 if (data.trail[ch]>0) {
00333 fTDC_trail[ch]->Fill(data.trail[ch]);
00334 fTDC_chanTrail->Fill(ch);
00335 }
00336 if( data.lead[ch]>0 && data.trail[ch]>0)
00337 fTDC_chan->Fill(ch);
00338 if (data.width[ch]>0) {
00339 fTDC_width[ch]->Fill(data.width[ch]);
00340 }
00341 fTDC_chanLeadMulti->Fill(ch, data.hit_lead[ch]);
00342 fTDC_chanTrailMulti->Fill(ch, data.hit_trail[ch]);
00343
00344 if( kTRUE == bWithDebugHistos ) {
00345 if (data.lead[ch]>0)
00346 fTDC_lead_nblead[ch]->Fill(data.lead[ch], data.hit_lead[ch]);
00347 for(int iMultiIndex = 1; iMultiIndex < data.hit_lead[ch] && iMultiIndex<T1290Data::MaxHits; iMultiIndex++ )
00348 {
00349 fTDC_lead_multi[ch]->Fill(data.lead_multi[ch][iMultiIndex]);
00350 if( iMultiIndex < data.hit_trail[ch] -1)
00351 fTDC_width_multi[ch]->Fill(data.trail_multi[ch][iMultiIndex] - data.lead_multi[ch][iMultiIndex] );
00352 }
00353 for(int iMultiIndex = 1; iMultiIndex < data.hit_trail[ch] && iMultiIndex<T1290Data::MaxHits; iMultiIndex++ )
00354 fTDC_trail_multi[ch]->Fill(data.trail_multi[ch][iMultiIndex]);
00355 }
00356 }
00357
00358 if( kTRUE == bWithTriggerTime && -1 < data.extended_trigger_time )
00359 {
00360 fTDC_CAEN_triggertimeHigh->Fill( data.extended_trigger_time ) ;
00361 fTDC_CAEN_triggertimeLow->Fill( data.extended_trigger_time % 0x10000 ) ;
00362 }
00363 }