• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

onlinemonitor/framework/T1290Data.cxx (r4864/r3205)

Go to the documentation of this file.
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; //data type
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; //data type
00064 
00065 //      printf("Msg:%2u Type:%d ", iCha, type_word);
00066 
00067       switch (type_word)  {
00068          case 8: {  //global_header
00069             // Int_t event_counter = (data32 & 0x07ffffff) >> 5;
00070             geo = data32 & 0x1f;
00071 //            printf("Found GEO %d", geo);
00072 
00073             // SL: check that geo corresponds to expected number
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: { //Global trailer
00080             // Int_t word_count = (data32 & 0x001fffe0) >> 5;
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: { //TDC Header
00095             // Int_t tdc = (data32 >> 24) & 0x03;
00096             // Int_t event_id = (data32 & 0x00fff000) >> 12;
00097             // Int_t bunch_id = data32 &0x00000fff;
00098             break;
00099          }
00100          case 3: { //TDC Trailer
00101             // Int_t tdc = (data32 & 0x03000000) >> 24;
00102             // Int_t event_id = (data32 & 0x00fff000) >> 12;
00103             // Int_t word_count = data32 &0x00000fff;
00104             break;
00105          }
00106          case 4: {  //TDC Error
00107             printf("??TDC ERROR  GEO = %d??\n", geo);
00108             break;
00109          }
00110          case 0: {  //TDC Data
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: { //Global trigger Time tag
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 //      printf("\n");
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 // Functions to allow for finer control on histograms
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      } // if( kTRUE == bWithDebugHistos )
00301   } // for (int ch=0;ch<T1290Data::NumChan;ch++)
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       } // if( kTRUE == bWithDebugHistos ) {
00356    } // for (int ch=0; ch<T1290Data::NumChan; ch++)
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 }

Generated on Tue Dec 10 2013 04:52:23 for ROCsoft by  doxygen 1.7.1