00001 #include "TVftxProc.h"
00002 #include "MBSUNPACK/TMbsCrateProc.h"
00003
00004 #include "TTimeStamp.h"
00005
00006 TVftxProc::TVftxProc(const char* name) : TCBMBeamtimeProc(name),fCrateInputEvent(0), fOutputEvent(0),fTriglogInputEvent(0)
00007 {
00008 TGo4Log::Info("**** TVftxProc: Create instance %s" , name );
00009
00010 fPar = (TVftxParam*) MakeParameter("VftxPar", "TVftxParam");
00011
00012
00013 iFirstModuleWithReference2 = -1;
00014 iFirstModuleWithReference1 = -1;
00015
00016
00017 if( -1 < fPar->iMainReferenceTdc)
00018 {
00019 if( -1 < fPar->iVftxReference1Channel[fPar->iMainReferenceTdc])
00020 iFirstModuleWithReference1 = fPar->iMainReferenceTdc;
00021 if( -1 < fPar->iVftxReference2Channel[fPar->iMainReferenceTdc])
00022 iFirstModuleWithReference2 = fPar->iMainReferenceTdc;
00023 }
00024
00025 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00026 {
00027 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00028 {
00029 fEventSizeHeader1[imodule] = MakeTH1('I', Form("FPGA/tdc%d/EvtSizeHeader1_%d",imodule,imodule),
00030 "Size of the event in event header", 256, -0.5, 255.5,"Size [words]");
00031 fEventSizeHeader2[imodule] = MakeTH1('I', Form("FPGA/tdc%d/EvtSizeHeader2_%d",imodule,imodule),
00032 "Size of the event in tdc header", 256, -0.5, 255.5,"Size [words]");
00033 fTriggerType[imodule] = MakeTH1('I', Form("FPGA/tdc%d/TriggerType%d",imodule,imodule),
00034 "Trigger type in tdc header", 4, -0.5, 3.5,"Type []");
00035 fTriggerTime[imodule] = MakeTH1('I', Form("FPGA/tdc%d/TriggerTime%d",imodule,imodule),
00036 "Time of the trigger in the coarse counter", 16383, 0, 16383,"Bin []");
00037
00038 fChanUsage[imodule] = MakeTH1('I', Form("FPGA/tdc%d/ChanUsage%d",imodule,imodule),
00039 "Data on channel?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Counts []");
00040 fChanEvents[imodule] = MakeTH1('I', Form("FPGA/ChanEvents%d",imodule),
00041 "Data on channel during this event?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Events []");
00042
00043 fChanFuture[imodule] = MakeTH1('I', Form("FPGA/tdc%d/ChanFuture%d",imodule,imodule),
00044 "Channel in future?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Counts []");
00045
00046 fChanDouble[imodule] = MakeTH1('I', Form("FPGA/tdc%d/ChanDouble%d",imodule,imodule),
00047 "Double on channel?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Counts []");
00048
00049 fChanMultip[imodule] = MakeTH2('I', Form("FPGA/tdc%d/fChanMultip%d",imodule,imodule),
00050 "Multiplicity per channel", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,
00051 TVftxBoardData::MaxMult+1, 0, TVftxBoardData::MaxMult+1, "Channel []","Multiplicity []","Counts []");
00052
00053 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00054 {
00055 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uTimeHistEnable )
00056 fTime[imodule][ichan] = MakeTH1('I', Form("FPGA/tdc%d/time/chan%02dTime%d",imodule,ichan,imodule),
00057 Form("Time to trigger Tdc %d channel %2d",imodule, ichan),
00058 8000, -700000, 100000, "Trigger time - Calibrated Time [ps]");
00059
00060 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uTimeHistSinglesEnable )
00061 fTimeSingles[imodule][ichan] = MakeTH1('I', Form("FPGA/tdc%d/timeSingles/chan%02dTimeSingles%d",imodule,ichan,imodule),
00062 Form("Time to trigger Tdc %d channel %2d for events with only one hit",imodule, ichan),
00063 8000, -700000, 100000, "Trigger time - Calibrated Time [ps]");
00064
00065 if( 1 == fPar->uMultiHitsDistanceHistoEnable)
00066 fMultihitsDistance[imodule][ichan]
00067 = MakeTH2('I', Form("FPGA/tdc%d/multiDist/chan%02dMultiDist%d",imodule,ichan,imodule),
00068 Form("Time to previous hit for multiple hits Tdc %d channel %2d",imodule, ichan),
00069 1000, 0, 100000,
00070 TVftxBoardData::MaxMult, 1, TVftxBoardData::MaxMult + 1,
00071 "T(n) - T(n-1) [ps]",
00072 "n (Multiple hits index) []");
00073
00074 if( 1 == fPar->uFineHistEnable )
00075 {
00076 TString sHistoName = Form("chan%02dFineTime%d",ichan,imodule);
00077 TString sHistoFullPath = Form("FPGA/tdc%d/ft/%s",imodule, sHistoName.Data() );
00078 TString sHistoTitle = Form("FineTime Tdc %d channel %2d",imodule, ichan);
00079 fFineTime[imodule][ichan] = MakeTH1('I', sHistoFullPath,
00080 sHistoTitle,
00081 TDC_FIFO_FINE_CT, -0.5, TDC_FIFO_FINE_CT - 0.5,
00082 "Fine Time [bin]");
00083 fFineTime[imodule][ichan]->Reset();
00084 TGo4Analysis::Instance()->ProtectObjects( sHistoName, "+C");
00085 }
00086
00087 iNbHitsForCalib[imodule][ichan] = 0;
00088 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00089 dCorr[imodule][ichan][ibin] = 0;
00090 }
00091 if( 1 == fPar->uFineEvolutionHistEnable )
00092 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00093 {
00094 fFineTimeEvo[imodule][ichan] = MakeTH2('I', Form("FPGA/tdc%d/ft_evo/chan%02dFineTimeEvo%d",imodule,ichan,imodule),
00095 Form("FineTime Tdc %d channel %2d",imodule, ichan),
00096 72, -0.5, 72 - 0.5,
00097 TDC_FIFO_FINE_CT, -0.5, TDC_FIFO_FINE_CT - 0.5,
00098 "Time [h]", "Fine Time [bin]");
00099 fBinSizeEvo[imodule][ichan] = MakeTH2('I', Form("FPGA/tdc%d/ft_evo/chan%02dBinSizeEvo%d",imodule,ichan,imodule),
00100 Form("Bin Size Tdc %d channel %2d",imodule, ichan),
00101 200, -0.5, 1000- 0.5,
00102 50, -0.5, 50 - 0.5,
00103 "Time [min]", "Bin Size [ps]");
00104 }
00105
00106
00107 if( 1 == fPar->uEnableCalib )
00108 {
00109 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00110 {
00111 fDnlCorr[imodule][ichan] = MakeTH1('D', Form("FPGA/tdc%d/Dnl/chan%02dDnlCorr%d",imodule,ichan,imodule),
00112 Form("DnlSum Tdc %d channel %2d",imodule, ichan),
00113 TDC_FIFO_FINE_CT, -0.5, TDC_FIFO_FINE_CT - 0.5,
00114 "Fine Time [bin]");
00115 }
00116
00117 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uTotHistoEnable )
00118 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN/2; ichan++)
00119 fToT[imodule][ichan] = MakeTH1('I', Form("FPGA/tdc%d/tot/chan%02dToT%d",imodule,ichan,imodule),
00120 Form("ToT Tdc %d channel %2d",imodule, ichan),
00121 30000, -150000, 150000, "ToT [ps]");
00122 }
00123
00124 if( 1 == fPar->uBitControl)
00125 {
00126 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00127 {
00128 bitcontrol[imodule][ichan] = MakeTH1('I',
00129 Form("FPGA/tdc%d/bits%d/chan%02dBitcontrol%d",imodule,imodule,ichan,imodule),
00130 Form("use of bits Tdc %d channel %2d",imodule, ichan),
00131 TDC_FIFO_COARSE_CT_SHIFT, 0, TDC_FIFO_COARSE_CT_SHIFT,"Bit []");
00132 bitcontrolCoarse[imodule][ichan] = MakeTH1('I',
00133 Form("FPGA/tdc%d/bits%dCoarse/chan%02dBitcontrol%dCoarse",imodule,imodule,ichan,imodule),
00134 Form("use of bits Tdc %d channel %2d",imodule, ichan),
00135 TDC_FIFO_FUTURE_BIT_SHIFT-TDC_FIFO_COARSE_CT_SHIFT,
00136 0, TDC_FIFO_FUTURE_BIT_SHIFT-TDC_FIFO_COARSE_CT_SHIFT,"Bit []");
00137 }
00138 }
00139
00140 if( 1 == fPar->uCoarseTimeHisto )
00141 {
00142 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00143 {
00144 fCoarseTime[imodule][ichan] = MakeTH1('I', Form("FPGA/tdc%d/ct/chan%02dCoarseTime%d",imodule,ichan,imodule),
00145 Form("CoarseTime Tdc %d channel %2d",imodule, ichan),
00146 TDC_FIFO_COARSE_CT >> TDC_FIFO_COARSE_CT_SHIFT, -0.5, (TDC_FIFO_COARSE_CT >> TDC_FIFO_COARSE_CT_SHIFT)-0.5,
00147 "Coarse Time [bin]");
00148 }
00149 }
00150
00151
00152 if( -1 < fPar->iVftxReference2Channel[imodule] )
00153 fRef2TimeTriggerDep[imodule] = MakeTH2('I', Form("FPGA/tdc%d/Ref2VsTrigger%d",imodule,imodule),
00154 Form("2nd reference (Diamond) Time to trigger depending on the active trigger, Tdc %d",imodule),
00155 800, -395000, 5000, 16, 0, 16,
00156 "Trigger time - 2nd reference (Diamond) Calibrated Time [ps]", "Trigger []");
00157
00158
00159
00160
00161 if( ( -1 == iFirstModuleWithReference1 || imodule == fPar->iMainReferenceTdc ) &&
00162 -1 < fPar->iVftxReference1Channel[imodule])
00163 iFirstModuleWithReference1 = imodule;
00164 else if( -1 < fPar->iVftxReference1Channel[imodule])
00165 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference1] &&
00166 1 == fPar->uVftxCalHistosEnabled[imodule] )
00167 fTdcResolutionRef1Check[imodule] = MakeTH1('I', Form("FPGA/Ref1Tdc%dVsTdc%d",imodule, iFirstModuleWithReference1 ),
00168 Form("Time 1st reference signal Tdc %d against Tdc %d",imodule, iFirstModuleWithReference1),
00169 30000, -15000, 15000,
00170 Form("tRef1_%d - tRef1_%d [ps]", imodule, iFirstModuleWithReference1));
00171
00172
00173
00174
00175 if( ( -1 == iFirstModuleWithReference2 || imodule == fPar->iMainReferenceTdc ) &&
00176 -1 < fPar->iVftxReference2Channel[imodule])
00177 iFirstModuleWithReference2 = imodule;
00178 else if( -1 < fPar->iVftxReference2Channel[imodule] && -1 < iFirstModuleWithReference2)
00179 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference2] &&
00180 1 == fPar->uVftxCalHistosEnabled[imodule] )
00181 fTdcResolutionRef2Check[imodule] = MakeTH1('I', Form("FPGA/Ref2Tdc%dVsTdc%d",imodule, iFirstModuleWithReference2 ),
00182 Form("Time 2nd reference (Diamond) signal Tdc %d against Tdc %d",imodule, iFirstModuleWithReference2),
00183 30000, -15000, 15000,
00184 Form("tref2_%d - tref2_%d [ps]", imodule, iFirstModuleWithReference2));
00185 }
00186 }
00187 uInitialMbsTime = 0;
00188 uInitialVulomSync = 0;
00189
00190 if( 1 == fPar->uVftxCoincidenceMap )
00191 {
00192 iMapIndex = 0;
00193 for( Int_t iModule1 = 0; iModule1 < MAX_FPGA_TDC; iModule1 ++)
00194 if( 1 == fPar->uVftxCalHistosEnabled[iModule1] )
00195 for( Int_t iModule2 = iModule1; iModule2 < MAX_FPGA_TDC; iModule2 ++)
00196 {
00197 if( MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2 < iMapIndex )
00198 {
00199 TGo4Log::Info("****Vftx monitor: Error creating mapping histos: index out of boundary : %d / %d (tdc #%d VS tdc #%d)",
00200 iMapIndex, MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2, iModule1, iModule2);
00201 break;
00202 }
00203 if( 1 == fPar->uVftxCalHistosEnabled[iModule2] )
00204 fTdcChanStripMapping[ iMapIndex ] =
00205 MakeTH2('I', Form("FPGA/Mapping/Mapp%d_%dVftx", iModule1, iModule2 ),
00206 Form("Channel during same event?, Tdc %d VS Tdc %d", iModule1, iModule2),
00207 FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,
00208 FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,
00209 Form("Channel Tdc #%d []", iModule1),
00210 Form("Channel Tdc #%d []", iModule2),"Events []");
00211 iMapIndex++;
00212 }
00213 }
00214
00215 if( 1 == fPar->uEnableCalib )
00216 {
00217 if( 1 == fPar->uSingleChannelCalibFilesEnable )
00218 {
00219 TString sInfoLoading = "Loaded initial calibration histograms for following VFTX channels:";
00220 TGo4Log::Info("%s", sInfoLoading.Data() );
00221 sInfoLoading = " ";
00222 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00223 sInfoLoading += Form("%2d ", ichan);
00224 TGo4Log::Info("%s", sInfoLoading.Data() );
00225
00226
00227 Bool_t bincontrol[TDC_FIFO_FINE_CT+1];
00228 Int_t iSum[MAX_FPGA_TDC][FPGA_TDC_NBCHAN];
00229
00230 oldDir = gDirectory;
00231
00232 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00233 {
00234 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00235 continue;
00236
00237 sInfoLoading = Form("tdc #%2d: ",imodule );
00238 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00239 {
00240 TString sInitialCalibFileName = Form("./Calib/Tdc%02dChan%02d.root ", fPar->uVftxInitalCalIndex[imodule], ichan);
00241 TString sInitalCalibHistoName = "";
00242 fileCalibrationIn = new TFile( sInitialCalibFileName, "READ");
00243 if( kTRUE == fileCalibrationIn->IsOpen() )
00244 {
00245 TH1* fInitialCalibHistoFromFile = 0;
00246 sInitalCalibHistoName = Form("CalibHisto_tdc%02d_chan%02d", fPar->uVftxInitalCalIndex[imodule], ichan);
00247 fileCalibrationIn->GetObject( sInitalCalibHistoName, fInitialCalibHistoFromFile);
00248
00249 if( 0 == fInitialCalibHistoFromFile )
00250 sInfoLoading += " 0 ";
00251 else
00252 {
00253 sInfoLoading += " 1 ";
00254 fInitialCalibHisto[imodule][ichan] = 0;
00255 fInitialCalibHisto[imodule][ichan] = (TH1*)fInitialCalibHistoFromFile->Clone(Form("CalibSingleChanFile_tdc%02d_chan%02d", imodule, ichan));
00256 fInitialCalibHisto[imodule][ichan]->SetDirectory( oldDir );
00257 if( 0 != fInitialCalibHisto[imodule][ichan])
00258 {
00259
00260 fDnlCorr[imodule][ichan]->Reset();
00261
00262 iSum[imodule][ichan] = 0;
00263 Double_t dTotalEntriesInHisto = (Double_t)(fInitialCalibHisto[imodule][ichan]->GetEntries() );
00264
00265 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00266 {
00267 Int_t iBinContent = (Int_t)(fFineTime[imodule][ichan]->GetBinContent(ibin+1)) +
00268 (Int_t)(fInitialCalibHisto[imodule][ichan]->GetBinContent(ibin+1));
00269
00270 if( iBinContent <= 0)
00271 {
00272 bincontrol[ibin] = kFALSE;
00273 }
00274 else if( iBinContent > 0)
00275 {
00276 bincontrol[ibin] = kTRUE;
00277 }
00278
00279
00280 if(bincontrol[ibin])
00281 {
00282 iSum[imodule][ichan] = iSum[imodule][ichan] + iBinContent;
00283 dCorr[imodule][ichan][ibin] = (Double_t)iSum[imodule][ichan] / dTotalEntriesInHisto;
00284 }
00285 else
00286 {
00287 if( 0 < ibin)
00288 dCorr[imodule][ichan][ibin] = dCorr[imodule][ichan][ibin-1];
00289 else dCorr[imodule][ichan][ibin]=0;
00290 }
00291 fDnlCorr[imodule][ichan]->Fill(ibin, dCorr[imodule][ichan][ibin] );
00292 }
00293 }
00294 }
00295 fileCalibrationIn->Close();
00296 }
00297 else sInfoLoading += " 0 ";
00298 }
00299 TGo4Log::Info("%s", sInfoLoading.Data() );
00300 }
00301 }
00302 else if( kTRUE != fPar->sInitialCalibrationFilename.EqualTo("") &&
00303 kTRUE != fPar->sInitialCalibrationFilename.EqualTo("-") )
00304 {
00305
00306 oldDir = gDirectory;
00307
00308 TString sInitalCalibHistoName = "";
00309 fileCalibrationIn = new TFile( fPar->sInitialCalibrationFilename, "READ");
00310
00311 if( kTRUE == fileCalibrationIn->IsOpen() )
00312 {
00313 TString sInfoLoading = "Loaded initial calibration histograms for following VFTX channels:";
00314 TGo4Log::Info("%s", sInfoLoading.Data() );
00315 sInfoLoading = " ";
00316 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00317 sInfoLoading += Form("%2d ", ichan);
00318 TGo4Log::Info("%s", sInfoLoading.Data() );
00319
00320
00321 Bool_t bincontrol[TDC_FIFO_FINE_CT+1];
00322 Int_t iSum[MAX_FPGA_TDC][FPGA_TDC_NBCHAN];
00323
00324
00325 TH1* fInitialCalibHistoFromFile = 0;
00326
00327 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00328 {
00329 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00330 continue;
00331
00332 sInfoLoading = Form("tdc #%2d: ",imodule );
00333 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00334 {
00335 fInitialCalibHistoFromFile = 0;
00336 fInitialCalibHisto[imodule][ichan] = 0;
00337
00338
00339 sInitalCalibHistoName = Form("CalibHisto_tdc%02d_chan%02d", fPar->uVftxInitalCalIndex[imodule], ichan);
00340 fileCalibrationIn->GetObject( sInitalCalibHistoName, fInitialCalibHistoFromFile);
00341
00342 if( 0 == fInitialCalibHistoFromFile )
00343 sInfoLoading += " 0 ";
00344 else
00345 {
00346 sInfoLoading += " 1 ";
00347
00348 fInitialCalibHisto[imodule][ichan] = (TH1*)fInitialCalibHistoFromFile->Clone(Form("CalibHistoFile_tdc%02d_chan%02d", imodule, ichan));
00349 fInitialCalibHisto[imodule][ichan]->SetDirectory( oldDir );
00350 }
00351
00352 if( 0 != fInitialCalibHisto[imodule][ichan])
00353 {
00354
00355 fDnlCorr[imodule][ichan]->Reset();
00356
00357 iSum[imodule][ichan] = 0;
00358 Double_t dTotalEntriesInHisto = (Double_t)(fInitialCalibHisto[imodule][ichan]->GetEntries() );
00359
00360 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00361 {
00362 Int_t iBinContent = (Int_t)(fFineTime[imodule][ichan]->GetBinContent(ibin+1)) +
00363 (Int_t)(fInitialCalibHisto[imodule][ichan]->GetBinContent(ibin+1));
00364
00365 if( iBinContent <= 0)
00366 {
00367 bincontrol[ibin] = kFALSE;
00368 }
00369 else if( iBinContent > 0)
00370 {
00371 bincontrol[ibin] = kTRUE;
00372 }
00373
00374
00375 if(bincontrol[ibin])
00376 {
00377 iSum[imodule][ichan] = iSum[imodule][ichan] + iBinContent;
00378 dCorr[imodule][ichan][ibin] = (Double_t)iSum[imodule][ichan] / dTotalEntriesInHisto;
00379 }else
00380 {
00381 if( 0 < ibin)
00382 dCorr[imodule][ichan][ibin] = dCorr[imodule][ichan][ibin-1];
00383 else dCorr[imodule][ichan][ibin]=0;
00384 }
00385 fDnlCorr[imodule][ichan]->Fill(ibin, dCorr[imodule][ichan][ibin] );
00386 }
00387 }
00388 }
00389 TGo4Log::Info("%s", sInfoLoading.Data() );
00390 }
00391
00392 fileCalibrationIn->Close();
00393 gDirectory->Cd(oldDir->GetPath());
00394 }
00395 else
00396 {
00397 TGo4Log::Info("Could not open %s to load initial VFTX calibration, please check setting in Vftx_options.txt",
00398 fPar->sInitialCalibrationFilename.Data() );
00399 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00400 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00401 fInitialCalibHisto[imodule][ichan] = 0;
00402 }
00403 }
00404 }
00405
00406
00407 }
00408
00409
00410 TVftxProc::~TVftxProc()
00411 {
00412 cout << "**** TVftxProc: Delete instance " << endl;
00413
00414 if( kTRUE != fPar->sInitialCalibrationFilename.EqualTo("") &&
00415 kTRUE != fPar->sInitialCalibrationFilename.EqualTo("-") &&
00416 1 == fPar->uEnableCalib &&
00417 kTRUE == fileCalibrationIn->IsOpen() )
00418 fileCalibrationIn->Close();
00419
00420 if( 1 == fPar->uEnableCalibOutput && 1 == fPar->uEnableCalib )
00421 {
00422 TTimeStamp timeCurrent;
00423 oldDir = gDirectory;
00424 TString sCalibOutFilename = Form("./VftxCalibHistos_%u_%u.root", timeCurrent.GetDate( kFALSE), timeCurrent.GetTime( kFALSE) );
00425 TFile* fileCalibrationOut = new TFile( sCalibOutFilename, "RECREATE",
00426 Form("Calibration Data for VFTX, saved from analysis on %s", timeCurrent.AsString("lc") ),
00427 9);
00428 if( kTRUE == fileCalibrationOut->IsOpen() )
00429 {
00430 sCalibOutFilename += ":/";
00431 gDirectory->Cd(sCalibOutFilename);
00432 TString sInfoSaving = "Saved initial calibration histograms for following VFTX channels:";
00433 TGo4Log::Info("%s", sInfoSaving.Data() );
00434 sInfoSaving = " ";
00435 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00436 sInfoSaving += Form("%2d ", ichan);
00437 TGo4Log::Info("%s", sInfoSaving.Data() );
00438 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00439 {
00440 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00441 continue;
00442 sInfoSaving = Form("tdc #%2d: ",imodule );
00443 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00444 {
00445 if( 0 < (fFineTime[imodule][ichan]->GetEntries() ) )
00446 {
00447 fFineTime[imodule][ichan]->Write( Form("CalibHisto_tdc%02d_chan%02d", imodule, ichan),
00448 TObject::kOverwrite);
00449 sInfoSaving += " 1 ";
00450 }
00451 else sInfoSaving += " 0 ";
00452 }
00453 TGo4Log::Info("%s", sInfoSaving.Data() );
00454 }
00455
00456 fileCalibrationOut->Close();
00457 TGo4Log::Info("Calibration data saved in %s", sCalibOutFilename.Data() );
00458 }
00459 else TGo4Log::Warn("Error when deleting TVftxProc: Unable to open root file %s to save calibration data, please check settings",
00460 sCalibOutFilename.Data() );
00461 gDirectory->Cd(oldDir->GetPath());
00462 }
00463 if( ( 1 == fPar->uSingleChannelCalibFilesOutput || 2 == fPar->uSingleChannelCalibFilesOutput )
00464 && 1 == fPar->uEnableCalib )
00465 {
00466 TString sInfoSaving = "Saved initial calibration histograms for following VFTX channels:";
00467 TGo4Log::Info("%s", sInfoSaving.Data() );
00468 sInfoSaving = " ";
00469 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00470 sInfoSaving += Form("%2d ", ichan);
00471 TGo4Log::Info("%s", sInfoSaving.Data() );
00472
00473 oldDir = gDirectory;
00474 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00475 {
00476 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00477 continue;
00478 sInfoSaving = Form("tdc #%2d: ",imodule );
00479 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00480 {
00481 TString sCalibOutFilename = Form("./Calib/Tdc%02dChan%02d.root", imodule, ichan );
00482 TFile* fileCalibrationOut = new TFile( sCalibOutFilename, "RECREATE",
00483 Form("Calibration Data for VFTX %02d channel %02d", imodule, ichan ),
00484 9);
00485 if( kTRUE == fileCalibrationOut->IsOpen() )
00486 {
00487 sCalibOutFilename += ":/";
00488 gDirectory->Cd(sCalibOutFilename);
00489 if( 1 == fPar->uSingleChannelCalibFilesOutput || 0 == fInitialCalibHisto[imodule][ichan] )
00490 {
00491
00492 if( 0 < (fFineTime[imodule][ichan]->GetEntries() ) )
00493 {
00494 fFineTime[imodule][ichan]->Write( Form("CalibHisto_tdc%02d_chan%02d", imodule, ichan),
00495 TObject::kOverwrite);
00496 sInfoSaving += " 1 ";
00497 }
00498 else sInfoSaving += " 0 ";
00499 }
00500 else
00501 {
00502
00503 if( 0 < (fFineTime[imodule][ichan]->GetEntries() ) )
00504 fInitialCalibHisto[imodule][ichan]->Add( fFineTime[imodule][ichan] );
00505 fInitialCalibHisto[imodule][ichan]->Write( Form("CalibHisto_tdc%02d_chan%02d", imodule, ichan),
00506 TObject::kOverwrite);
00507 sInfoSaving += " 1 ";
00508 }
00509 }
00510 else sInfoSaving += " 0 ";
00511
00512 fileCalibrationOut->Close();
00513 gDirectory->Cd(oldDir->GetPath());
00514 }
00515 TGo4Log::Info("%s", sInfoSaving.Data() );
00516 }
00517 gDirectory->Cd(oldDir->GetPath());
00518 }
00519 }
00520
00521 void TVftxProc::InitEvent(TGo4EventElement* outevnt)
00522 {
00523
00524
00525
00526
00527
00528
00529 if(fCrateInputEvent==0)
00530 {
00531 TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(GetInputEvent());
00532 if(btevent)
00533 {
00534 fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(btevent->GetSubEvent("MBSCRATE"));
00535 fTriglogInputEvent=dynamic_cast<TTriglogEvent*>(btevent->GetSubEvent("TRIGLOG"));
00536 }
00537 else
00538 {
00539 fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(GetInputEvent());
00540 }
00541 if(fCrateInputEvent==0) {
00542 GO4_STOP_ANALYSIS_MESSAGE("**** TVftxProc: Fatal error: input event is not a TMbsCrateEvent!!! STOP GO4");
00543 }
00544 if(fTriglogInputEvent==0) {
00545 GO4_STOP_ANALYSIS_MESSAGE("**** TVftxProc: Fatal error: input event has no TTriglogEvent!!! STOP GO4");
00546 }
00547 }
00548
00549
00550
00551
00552 if(fOutputEvent==0)
00553 {
00554 TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(outevnt);
00555 if(btevent)
00556 {
00557 fOutputEvent=dynamic_cast<TVftxEvent*>(btevent->GetSubEvent("VFTX"));
00558 }
00559 else
00560 {
00561
00562 fOutputEvent= dynamic_cast<TVftxEvent*>(outevnt);
00563 }
00564 if(fOutputEvent==0) {
00565 GO4_STOP_ANALYSIS_MESSAGE("**** TVftxProc: Fatal error: output event is not a TVftxEvent!!! STOP GO4");
00566 }
00567 else {
00568
00569 }
00570 }
00571 }
00572
00573 void TVftxProc::FinalizeEvent()
00574 {
00575
00576 if (fCrateInputEvent->IsValid())
00577 {
00578
00579 Int_t imodule = 0;
00580 Int_t iEvtSizeHeader1[MAX_FPGA_TDC];
00581 Int_t iEvtSizeHeader2[MAX_FPGA_TDC];
00582 for(imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00583 {
00584 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00585 {
00586 iFirstTime[imodule][ichan] = -1;
00587 iFirstCoarse[imodule][ichan] = -1;
00588 iFirstFine[imodule][ichan] = -1;
00589 dFirstTimecorr[imodule][ichan] = -1;
00590 dFirstFineTimecorr[imodule][ichan] = -1;
00591 iLastTime[imodule][ichan] = 0;
00592 for( Int_t imul = 0; imul< TVftxBoardData::MaxMult; imul++)
00593 {
00594 dTimeCorr[imodule][ichan][imul] = -1;
00595 dFineTimeCorr[imodule][ichan][imul] = -1;
00596 }
00597 uTotalMultiplicity[imodule][ichan] = 0;
00598 }
00599 iTriggerTime[imodule] = 0;
00600 }
00601 imodule = 0;
00602
00603 for (int fpga=0;fpga<MAX_FPGA_TDC;fpga++) {
00604 if( 0 == fPar->uVftxCalHistosEnabled[fpga] )
00605 continue;
00606
00607 unsigned num_hits = fCrateInputEvent->fFPGA[fpga].size();
00608 imodule = fpga;
00609
00610 if( 0 == num_hits && 0 == fCrateInputEvent->fFPGAHEAD[fpga].size() )
00611 continue;
00612 iEvtSizeHeader1[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).nr_data;
00613 iEvtSizeHeader2[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_nd;
00614 iTriggerTime[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_ct;
00615 headTime[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_ct;
00616
00617 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00618 {
00619 fEventSizeHeader1[imodule]->Fill( iEvtSizeHeader1[imodule] );
00620 fEventSizeHeader2[imodule]->Fill( iEvtSizeHeader2[imodule] );
00621 fTriggerType[imodule]->Fill(fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_tt);
00622 fTriggerTime[imodule]->Fill( iTriggerTime[imodule] );
00623 }
00624
00625 (fOutputEvent->fVftxBoards[imodule]).iTriggerTime = headTime[imodule];
00626
00627 for(unsigned i = 0; i<num_hits; i++)
00628 {
00629 uint32_t ichan = fCrateInputEvent->fFPGA[fpga].at(i).ch_ix;
00630 uint32_t bFutureBit = fCrateInputEvent->fFPGA[fpga].at(i).future_bit;
00631 int32_t iCoarseCounter = fCrateInputEvent->fFPGA[fpga].at(i).coarse_ct;
00632 int32_t iFineCounter = fCrateInputEvent->fFPGA[fpga].at(i).ch_tim;
00633
00634
00635 Int_t channel=ichan;
00636
00637 if( (imodule >= 0) && (imodule < MAX_FPGA_TDC) &&
00638 (channel >= 0) && (channel < FPGA_TDC_NBCHAN) )
00639 {
00640
00641 if( ((fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] < TVftxBoardData::TVftxBoardData::MaxMult) )
00642 {
00643 (fOutputEvent->fVftxBoards[imodule]).iFineTime[channel][ (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] ] = iFineCounter;
00644 (fOutputEvent->fVftxBoards[imodule]).iCoarseTime[channel][ (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] ] = iCoarseCounter;
00645 (fOutputEvent->fVftxBoards[imodule]).uFutureBit[channel][ (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] ] = bFutureBit;
00646 (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel]++;
00647 }
00648 uTotalMultiplicity[imodule][channel]++;
00649 }
00650 else continue;
00651
00652
00653 if( 0 == uInitialMbsTime )
00654 {
00655 uInitialMbsTime = fTriglogInputEvent->fMbsTimeSecs;
00656 uInitialVulomSync = fTriglogInputEvent->fVulomSyncNumber;
00657 }
00658 if( 1 == fPar->uFineHistEnable )
00659 {
00660 if( 0 == fFineTime[imodule][ichan]->GetEntries() )
00661 iNbHitsForCalib[imodule][ichan] = 0;
00662
00663 fFineTime[imodule][ichan]->Fill(iFineCounter);
00664
00665 iNbHitsForCalib[imodule][ichan] ++;
00666 if( fPar->iMinNbHitsCalib == iNbHitsForCalib[imodule][ichan] )
00667 TGo4Log::Info("FPGA TDC: Calibration data ok for module %d channel %d, after %d events", imodule, ichan, fTriglogInputEvent->fVulomSyncNumber - uInitialVulomSync);
00668 }
00669 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uFineEvolutionHistEnable )
00670 fFineTimeEvo[imodule][ichan]->Fill( UInt_t((fTriglogInputEvent->fMbsTimeSecs - uInitialMbsTime)/3600), iFineCounter);
00671
00672 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uCoarseTimeHisto )
00673 fCoarseTime[imodule][ichan]->Fill(iCoarseCounter);
00674
00675 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uBitControl )
00676 {
00677 for (uint16_t ibit = 0; ibit <= 9; ibit++)
00678 if ((iFineCounter >> ibit) & 0x1) bitcontrol[imodule][ichan]->Fill( ibit );
00679 for (uint16_t ibit = 0; ibit <= 15; ibit++)
00680 if ((iCoarseCounter >> ibit) & 0x1) bitcontrolCoarse[imodule][ichan]->Fill( ibit );
00681 }
00682
00683 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00684 {
00685 fChanUsage[imodule]->Fill(ichan);
00686 if (bFutureBit) fChanFuture[imodule]->Fill(ichan);
00687 }
00688
00689 if (iLastTime[imodule][ichan])
00690 {
00691 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00692 fChanDouble[imodule]->Fill(ichan);
00693 }
00694 else
00695 {
00696 iFirstCoarse[imodule][ichan] = iCoarseCounter;
00697 iFirstFine[imodule][ichan] = iFineCounter;
00698 iFirstTime[imodule][ichan] = (iCoarseCounter<<TDC_FIFO_COARSE_CT_SHIFT)
00699 + iFineCounter;
00700 }
00701
00702 iLastTime[imodule][ichan] = (iCoarseCounter<<TDC_FIFO_COARSE_CT_SHIFT) + iFineCounter;
00703 }
00704
00705 }
00706
00707 if( 1 == fPar->uEnableCalib )
00708 {
00709
00710 Bool_t bincontrol[TDC_FIFO_FINE_CT+1];
00711 Int_t iSum[MAX_FPGA_TDC][FPGA_TDC_NBCHAN];
00712
00713 for(imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00714 {
00715 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00716 continue;
00717
00718 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00719 {
00720
00721 if( fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][ichan] &&
00722 -1 < fPar->iMinNbHitsCalib)
00723 {
00724 if(
00725 0 == iNbHitsForCalib[imodule][ichan]%fPar->iMinNbHitsCalib )
00726 {
00727 fDnlCorr[imodule][ichan]->Reset();
00728
00729 iSum[imodule][ichan] = 0;
00730 Double_t dTotalEntriesInHisto = (Double_t)(fFineTime[imodule][ichan]->GetEntries() );
00731
00732 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00733 {
00734 Int_t iBinContent = (Int_t)(fFineTime[imodule][ichan]->GetBinContent(ibin+1));
00735
00736 if( iBinContent <= 0)
00737 {
00738 bincontrol[ibin] = kFALSE;
00739 }
00740 else if( iBinContent > 0)
00741 {
00742 bincontrol[ibin] = kTRUE;
00743 }
00744
00745
00746 if(bincontrol[ibin])
00747 {
00748 iSum[imodule][ichan] = iSum[imodule][ichan] + iBinContent;
00749 dCorr[imodule][ichan][ibin] = (Double_t)iSum[imodule][ichan] / dTotalEntriesInHisto;
00750 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uFineEvolutionHistEnable &&
00751 0 == iNbHitsForCalib[imodule][ichan]%10000 )
00752 fBinSizeEvo[imodule][ichan]->Fill( (Double_t)(fTriglogInputEvent->fMbsTimeSecs - uInitialMbsTime)/60.0,
00753 CLOCK_TIME*(Double_t)(iBinContent) / dTotalEntriesInHisto );
00754 }else
00755 {
00756 if( 0 < ibin)
00757 dCorr[imodule][ichan][ibin] = dCorr[imodule][ichan][ibin-1];
00758 else dCorr[imodule][ichan][ibin]=0;
00759 }
00760 fDnlCorr[imodule][ichan]->Fill(ibin, dCorr[imodule][ichan][ibin] );
00761 }
00762 }
00763 }
00764 else if( -1 < fPar->iMinNbHitsCalib )
00765 {
00766
00767
00768 if( 0 != fInitialCalibHisto[imodule][ichan] &&
00769 fPar->iMinNbHitsCalib - 1 == iNbHitsForCalib[imodule][ichan]%fPar->iMinNbHitsCalib )
00770 {
00771 fDnlCorr[imodule][ichan]->Reset();
00772
00773 iSum[imodule][ichan] = 0;
00774 Double_t dTotalEntriesInHisto = (Double_t)(fFineTime[imodule][ichan]->GetEntries() ) +
00775 (Double_t)(fInitialCalibHisto[imodule][ichan]->GetEntries() );
00776
00777 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00778 {
00779 Int_t iBinContent = (Int_t)(fFineTime[imodule][ichan]->GetBinContent(ibin+1)) +
00780 (Int_t)(fInitialCalibHisto[imodule][ichan]->GetBinContent(ibin+1));
00781
00782 if( iBinContent <= 0)
00783 {
00784 bincontrol[ibin] = kFALSE;
00785 }
00786 else if( iBinContent > 0)
00787 {
00788 bincontrol[ibin] = kTRUE;
00789 }
00790
00791
00792 if(bincontrol[ibin])
00793 {
00794 iSum[imodule][ichan] = iSum[imodule][ichan] + iBinContent;
00795 dCorr[imodule][ichan][ibin] = (Double_t)iSum[imodule][ichan] / dTotalEntriesInHisto;
00796 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uFineEvolutionHistEnable &&
00797 9999 == iNbHitsForCalib[imodule][ichan]%10000 )
00798 fBinSizeEvo[imodule][ichan]->Fill( (Double_t)(fTriglogInputEvent->fMbsTimeSecs - uInitialMbsTime)/60.0,
00799 CLOCK_TIME*(Double_t)(iBinContent) / dTotalEntriesInHisto );
00800 }else
00801 {
00802 if( 0 < ibin)
00803 dCorr[imodule][ichan][ibin] = dCorr[imodule][ichan][ibin-1];
00804 else dCorr[imodule][ichan][ibin]=0;
00805 }
00806 fDnlCorr[imodule][ichan]->Fill(ibin, dCorr[imodule][ichan][ibin] );
00807 }
00808 }
00809 }
00810
00811 if( ( -1<fPar->iMinNbHitsCalib && fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][ichan]) ||
00812 0 != fInitialCalibHisto[imodule][ichan] )
00813 {
00814 if( 0<=iFirstCoarse[imodule][ichan] || 0<=iFirstFine[imodule][ichan] )
00815 {
00816 dFirstTimecorr[imodule][ichan] = iFirstCoarse[imodule][ichan]*CLOCK_TIME
00817 + (1 - dCorr[imodule][ichan][iFirstFine[imodule][ichan]])*CLOCK_TIME;
00818 dFirstFineTimecorr[imodule][ichan] = dCorr[imodule][ichan][iFirstFine[imodule][ichan]]*CLOCK_TIME;
00819 }
00820 for( Int_t imul = 0; imul< TVftxBoardData::MaxMult; imul++)
00821 if( 0<=(fOutputEvent->fVftxBoards[imodule]).iFineTime[ichan][imul] ||
00822 0<=(fOutputEvent->fVftxBoards[imodule]).iCoarseTime[ichan][imul])
00823 {
00824 dTimeCorr[imodule][ichan][imul] = (fOutputEvent->fVftxBoards[imodule]).iCoarseTime[ichan][imul]*CLOCK_TIME
00825 + (1 - dCorr[imodule][ichan][(fOutputEvent->fVftxBoards[imodule]).iFineTime[ichan][imul]])*CLOCK_TIME;
00826 dFineTimeCorr[imodule][ichan][imul] = (1 - dCorr[imodule][ichan][(fOutputEvent->fVftxBoards[imodule]).iFineTime[ichan][imul]])*CLOCK_TIME;
00827
00828
00829 (fOutputEvent->fVftxBoards[imodule]).dTimeCorr[ichan][imul] = dTimeCorr[imodule][ichan][imul];
00830 (fOutputEvent->fVftxBoards[imodule]).dFineTimeCorr[ichan][imul] = dFineTimeCorr[imodule][ichan][imul];
00831 }
00832 }
00833
00834 }
00835
00836
00837 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00838 {
00839 #if defined(VERSION_VFTX) || defined(VERSION_VFTX_28) // 1 TDC mode, chan = Time, chan +1 = Tot
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870 #else
00871 if( 1 == fPar->uTimeHistEnable && fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][0])
00872 fTime[imodule][0]->Fill( (iTriggerTime[imodule] +1 -headTime[imodule] )*CLOCK_TIME - dFirstTimecorr[imodule][0]);
00873 if( 1 == fPar->uTotHistoEnable && fPar->iMinNbHitsCalib <= iNbHitsForCalib[0][0]
00874 && fPar->iMinNbHitsCalib <= iNbHitsForCalib[1][0] )
00875 fToT[0]->Fill(((Double_t)iTriggerTime[0]*(Double_t)CLOCK_TIME ) -dFirstTimecorr[0][0]
00876 - (((Double_t)iTriggerTime[1]*(Double_t)CLOCK_TIME ) -dFirstTimecorr[1][0]));
00877 Double_t dToT[FPGA_TDC_NBCHAN];
00878 for( Int_t ichan = 1; ichan < FPGA_TDC_NBCHAN; ichan ++)
00879 {
00880 if( 1 == fPar->uTimeHistEnable && fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][ichan] )
00881 fTime[imodule][ichan]->Fill( (iTriggerTime[imodule] +1 -headTime[imodule] )*CLOCK_TIME
00882 - dFirstTimecorr[imodule][ichan]);
00883 if( 1 == fPar->uTotHistoEnable &&
00884 0 < iFirstTime[0][ichan] && 0 < iFirstTime[1][ichan] &&
00885 0 < iFirstTime[0][0] && 0 < iFirstTime[1][0] &&
00886 fPar->iMinNbHitsCalib <= iNbHitsForCalib[0][0] &&
00887 fPar->iMinNbHitsCalib <= iNbHitsForCalib[1][1] &&
00888 fPar->iMinNbHitsCalib <= iNbHitsForCalib[0][0] &&
00889 fPar->iMinNbHitsCalib <= iNbHitsForCalib[1][0] )
00890 {
00891 dToT[ichan] = (iTriggerTime[0]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[0][ichan]
00892 - ((iTriggerTime[1]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[1][ichan])
00893 - ( (iTriggerTime[0]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[0][0]
00894 - ((iTriggerTime[1]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[1][0])) ;
00895 fToT[ichan]->Fill(dToT[ichan]);
00896 }
00897 }
00898 #endif
00899 }
00900 }
00901
00902
00903 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
00904 {
00905 if( 0 == fPar->uVftxCalHistosEnabled[iModule] )
00906 continue;
00907
00908 Double_t dTimeToTrigger;
00909 Double_t dToT;
00910 for(Int_t iChan=0; iChan < FPGA_TDC_NBCHAN; iChan++)
00911 {
00912 for( Int_t iHit = 0; iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[ iChan ]; iHit++)
00913 {
00914 if( 1 == fPar->uTimeHistEnable &&
00915 (fPar->iMinNbHitsCalib <= iNbHitsForCalib[iModule][iChan] || 0 != fInitialCalibHisto[iModule][iChan])&&
00916 0 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan][iHit] )
00917 {
00918 dTimeToTrigger = (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan][iHit]
00919 - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime*CLOCK_TIME;
00920 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit] - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime)
00921 dTimeToTrigger -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00922 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit] - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime < -1000 )
00923 dTimeToTrigger += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00924 fTime[iModule][iChan]->Fill( dTimeToTrigger );
00925
00926 if( 1 == fPar->uTimeHistSinglesEnable && 0 == iHit &&
00927 1 == (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[ iChan ])
00928 {
00929 Double_t dTimeToTriggerSingle =
00930 (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan][iHit]
00931 - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime*CLOCK_TIME;
00932 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit] - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime)
00933 dTimeToTriggerSingle -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00934 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit] - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime < -1000 )
00935 dTimeToTriggerSingle += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00936 fTimeSingles[iModule][iChan]->Fill( dTimeToTriggerSingle );
00937 }
00938
00939 if( 1 == fPar->uMultiHitsDistanceHistoEnable)
00940 if( 0 < iHit && iHit < TVftxBoardData::MaxMult +1)
00941 {
00942 Double_t dTimeToPreviousHit = (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan][iHit]
00943 - (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan][iHit - 1];
00944 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit]
00945 - (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit - 1])
00946 dTimeToPreviousHit -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00947 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit]
00948 - (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit - 1] < -1000 )
00949 dTimeToPreviousHit += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00950 fMultihitsDistance[iModule][iChan]->Fill( dTimeToPreviousHit, iHit);
00951 }
00952 }
00953 }
00954 if( 1 == fPar->uTotHistoEnable && iChan < FPGA_TDC_NBCHAN/2 )
00955 for( Int_t iHit = 0; iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[ iChan*2 ] &&
00956 iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[ iChan*2+1 ]; iHit++)
00957 {
00958 if( 0 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2][iHit] &&
00959 0 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2+1][iHit] &&
00960 (fPar->iMinNbHitsCalib <= iNbHitsForCalib[iModule][iChan*2] || 0 != fInitialCalibHisto[iModule][iChan*2] )&&
00961 (fPar->iMinNbHitsCalib <= iNbHitsForCalib[iModule][iChan*2+1] || 0 != fInitialCalibHisto[iModule][iChan*2+1]) )
00962 {
00963 dToT = (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2][iHit]
00964 - (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2+1][iHit];
00965 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2][iHit]
00966 - (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2+1][iHit] )
00967 dToT -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00968 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2][iHit]
00969 - (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2+1][iHit] < -1000 )
00970 dToT += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00971 fToT[iModule][iChan]->Fill(dToT);
00972 }
00973 }
00974
00975
00976 if( 1 == fPar->uVftxCoincidenceMap )
00977 iMapIndex = MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2
00978 - (MAX_FPGA_TDC-iModule)*((MAX_FPGA_TDC-iModule)+1)/2;
00979
00980 if( 1 == fPar->uVftxCalHistosEnabled[iModule] &&
00981 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[iChan] )
00982 {
00983 fChanEvents[iModule]->Fill(iChan);
00984 if( 1 == fPar->uVftxCoincidenceMap )
00985 {
00986 if( MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2 < iMapIndex )
00987 {
00988 TGo4Log::Info("****Vftx monitor: Error filling mapping histos: index out of boundary : %d / %d (tdc #%d VS tdc #%d)",
00989 iMapIndex, MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2, iModule, iModule);
00990 return;
00991 }
00992 for(Int_t iChan2=iChan+1; iChan2<FPGA_TDC_NBCHAN; iChan2++)
00993 if( 1 == fPar->uVftxCalHistosEnabled[iModule] && 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[iChan2] )
00994 {
00995 fTdcChanStripMapping[ iMapIndex ]->Fill( iChan, iChan2 );
00996 }
00997
00998 for(Int_t iModule2=iModule+1; iModule2<MAX_FPGA_TDC; iModule2++)
00999 {
01000
01001 iMapIndex = MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2
01002 - (MAX_FPGA_TDC-iModule)*((MAX_FPGA_TDC-iModule)+1)/2
01003 + (iModule2 - iModule);
01004 if( MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2 < iMapIndex )
01005 {
01006 TGo4Log::Info("****Vftx monitor: Error filling mapping histos: index out of boundary : %d / %d (tdc #%d VS tdc #%d)",
01007 iMapIndex, MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2, iModule, iModule2);
01008 return;
01009 }
01010 for(Int_t iChan2=0; iChan2<FPGA_TDC_NBCHAN; iChan2++)
01011 if( 1 == fPar->uVftxCalHistosEnabled[iModule2] && 0<(fOutputEvent->fVftxBoards[iModule2]).iMultiplicity[iChan2] )
01012 {
01013 fTdcChanStripMapping[ iMapIndex ]->Fill( iChan, iChan2 );
01014 }
01015 }
01016 }
01017 }
01018
01019 if( 1 == fPar->uVftxCalHistosEnabled[iModule] )
01020 fChanMultip[iModule]->Fill(iChan, uTotalMultiplicity[iModule][iChan] );
01021 }
01022 }
01023
01024
01025 Double_t dRef2TimeToTrigger = 0.0;
01026 for(Int_t iTrigger = 0; iTrigger<16; iTrigger++)
01027 if( 1 == ((fTriglogInputEvent->fVulomTriggerPattern>>iTrigger) & 0x1) )
01028 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
01029 if( -1 < fPar->iVftxReference2Channel[iModule] )
01030 for( Int_t iHit = 0; iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[fPar->iVftxReference2Channel[iModule] ]; iHit++)
01031 {
01032 dRef2TimeToTrigger = (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxReference2Channel[iModule]][iHit]
01033 - iTriggerTime[iModule]*CLOCK_TIME;
01034 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[fPar->iVftxReference2Channel[iModule]][iHit] - iTriggerTime[iModule])
01035 dRef2TimeToTrigger -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
01036 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[fPar->iVftxReference2Channel[iModule]][iHit] - iTriggerTime[iModule] < -1000 )
01037 dRef2TimeToTrigger += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
01038 fRef2TimeTriggerDep[iModule]->Fill( dRef2TimeToTrigger, iTrigger );
01039 }
01040
01041 if( -1 < iFirstModuleWithReference2)
01042 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference2] &&
01043 0<(fOutputEvent->fVftxBoards[iFirstModuleWithReference2]).iMultiplicity[fPar->iVftxReference2Channel[iFirstModuleWithReference2]] )
01044 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
01045 if( iModule != iFirstModuleWithReference2 && 1 == fPar->uVftxCalHistosEnabled[iModule] && -1 < fPar->iVftxReference2Channel[iModule] )
01046 if( 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[fPar->iVftxReference2Channel[iModule]] )
01047 if( -1 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxReference2Channel[iModule]][0] &&
01048 -1 < (fOutputEvent->fVftxBoards[iFirstModuleWithReference2]).dTimeCorr[fPar->iVftxReference2Channel[iFirstModuleWithReference2]][0] )
01049 fTdcResolutionRef2Check[iModule]->Fill( (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxReference2Channel[iModule]][0] -
01050 (fOutputEvent->fVftxBoards[iFirstModuleWithReference2]).dTimeCorr[fPar->iVftxReference2Channel[iFirstModuleWithReference2]][0] );
01051
01052 if( -1 < iFirstModuleWithReference1)
01053 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference1] &&
01054 0<(fOutputEvent->fVftxBoards[iFirstModuleWithReference1]).iMultiplicity[fPar->iVftxReference1Channel[iFirstModuleWithReference1]] )
01055 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
01056 if( iModule != iFirstModuleWithReference1 && 1 == fPar->uVftxCalHistosEnabled[iModule] && -1 < fPar->iVftxReference1Channel[iModule] )
01057 {
01058 if( 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[fPar->iVftxReference1Channel[iModule]] )
01059 if( -1 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxReference1Channel[iModule]][0] &&
01060 -1 < (fOutputEvent->fVftxBoards[iFirstModuleWithReference1]).dTimeCorr[fPar->iVftxReference1Channel[iFirstModuleWithReference1]][0] )
01061 fTdcResolutionRef1Check[iModule]->Fill( (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxReference1Channel[iModule]][0] -
01062 (fOutputEvent->fVftxBoards[iFirstModuleWithReference1]).dTimeCorr[fPar->iVftxReference1Channel[iFirstModuleWithReference1]][0] );
01063 }
01064
01065
01066
01067 if( 1 == fPar->uAutomaticOffsetEnable )
01068 {
01069 if( -1 < iFirstModuleWithReference1)
01070 {
01071 if( iFirstModuleWithReference1 == iFirstModuleWithReference2 &&
01072 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference1])
01073 {
01074
01075 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
01076 if( 1 == fPar->uVftxCalHistosEnabled[iModule] && iModule != iFirstModuleWithReference1 &&
01077 -1 < fPar->iVftxReference1Channel[iModule] && -1 < fPar->iVftxReference2Channel[iModule] )
01078 if( 5000 < ( fTdcResolutionRef1Check[iModule]->GetEntries() + fTdcResolutionRef2Check[iModule]->GetEntries() ) )
01079 {
01080 if( fTdcResolutionRef1Check[iModule]->GetMean() < - 2500 &&
01081 fTdcResolutionRef2Check[iModule]->GetMean() < - 2500 )
01082 fPar->iAutomaticTdcOffset[iModule] = 1;
01083 else if( 2500 < fTdcResolutionRef1Check[iModule]->GetMean() &&
01084 2500 < fTdcResolutionRef2Check[iModule]->GetMean() )
01085 fPar->iAutomaticTdcOffset[iModule] = -1;
01086 }
01087 }
01088 else if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference1] )
01089 {
01090
01091 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
01092 if( iModule != iFirstModuleWithReference1 && 1 == fPar->uVftxCalHistosEnabled[iModule] && -1 < fPar->iVftxReference1Channel[iModule] )
01093 if( 5000 < fTdcResolutionRef1Check[iModule]->GetEntries() )
01094 {
01095 if( fTdcResolutionRef1Check[iModule]->GetMean() < - 2500 )
01096 fPar->iAutomaticTdcOffset[iModule] = 1;
01097 else if( 2500 < fTdcResolutionRef1Check[iModule]->GetMean() )
01098 fPar->iAutomaticTdcOffset[iModule] = -1;
01099 }
01100 }
01101 }
01102 else if( -1 < iFirstModuleWithReference2)
01103 {
01104 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference2] )
01105 {
01106
01107 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
01108 if( iModule != iFirstModuleWithReference2 && 1 == fPar->uVftxCalHistosEnabled[iModule] && -1 < fPar->iVftxReference2Channel[iModule] )
01109 if( 5000 < fTdcResolutionRef2Check[iModule]->GetEntries() )
01110 {
01111 if( fTdcResolutionRef2Check[iModule]->GetMean() < - 2500 )
01112 fPar->iAutomaticTdcOffset[iModule] = 1;
01113 else if( 2500 < fTdcResolutionRef2Check[iModule]->GetMean() )
01114 fPar->iAutomaticTdcOffset[iModule] = -1;
01115 }
01116 }
01117 }
01118 }
01119
01120 fOutputEvent->SetValid(kTRUE);
01121 }
01122 else
01123 {
01124 if( 1 == fPar->uTimeHistEnable )
01125 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
01126 if( 1 == fPar->uVftxCalHistosEnabled[iModule] )
01127 for(Int_t iChan=0; iChan<FPGA_TDC_NBCHAN; iChan++)
01128 for( Int_t iMul = 0; iMul< TVftxBoardData::MaxMult; iMul++)
01129 {
01130 if( -1 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iMul] )
01131 fTime[iModule][iChan]->Fill(
01132 (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iMul]
01133 - iTriggerTime[iModule] );
01134 }
01135 }
01136 fOutputEvent->SetValid(kTRUE);
01137 }
01138 return;
01139 }