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 iFirstModuleWithDiamond = -1;
00014 iFirstModuleWithReference = -1;
00015 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00016 {
00017 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00018 {
00019 fEventSizeHeader1[imodule] = MakeTH1('I', Form("FPGA/tdc%d/EvtSizeHeader1_%d",imodule,imodule),
00020 "Size of the event in event header", 256, -0.5, 255.5,"Size [words]");
00021 fEventSizeHeader2[imodule] = MakeTH1('I', Form("FPGA/tdc%d/EvtSizeHeader2_%d",imodule,imodule),
00022 "Size of the event in tdc header", 256, -0.5, 255.5,"Size [words]");
00023 fTriggerType[imodule] = MakeTH1('I', Form("FPGA/tdc%d/TriggerType%d",imodule,imodule),
00024 "Trigger type in tdc header", 4, -0.5, 3.5,"Type []");
00025 fTriggerTime[imodule] = MakeTH1('I', Form("FPGA/tdc%d/TriggerTime%d",imodule,imodule),
00026 "Time of the trigger in the coarse counter", 16383, 0, 16383,"Bin []");
00027
00028 fChanUsage[imodule] = MakeTH1('I', Form("FPGA/tdc%d/ChanUsage%d",imodule,imodule),
00029 "Data on channel?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Counts []");
00030 fChanEvents[imodule] = MakeTH1('I', Form("FPGA/ChanEvents%d",imodule),
00031 "Data on channel during this event?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Events []");
00032
00033 fChanFuture[imodule] = MakeTH1('I', Form("FPGA/tdc%d/ChanFuture%d",imodule,imodule),
00034 "Channel in future?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Counts []");
00035
00036 fChanDouble[imodule] = MakeTH1('I', Form("FPGA/tdc%d/ChanDouble%d",imodule,imodule),
00037 "Double on channel?", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,"Channel []","Counts []");
00038
00039 fChanMultip[imodule] = MakeTH2('I', Form("FPGA/tdc%d/fChanMultip%d",imodule,imodule),
00040 "Multiplicity per channel", FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,
00041 TVftxBoardData::MaxMult+1, 0, TVftxBoardData::MaxMult+1, "Channel []","Multiplicity []","Counts []");
00042
00043 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00044 {
00045 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uTimeHistEnable )
00046 fTime[imodule][ichan] = MakeTH1('I', Form("FPGA/tdc%d/time/chan%2dTime%d",imodule,ichan,imodule),
00047 Form("Time to trigger Tdc %d channel %2d",imodule, ichan),
00048 8000, -700000, 100000, "Trigger time - Calibrated Time [ps]");
00049
00050 if( 1 == fPar->uFineHistEnable )
00051 {
00052 TString sHistoName = Form("chan%2dFineTime%d",ichan,imodule);
00053 TString sHistoFullPath = Form("FPGA/tdc%d/ft/%s",imodule, sHistoName.Data() );
00054 TString sHistoTitle = Form("FineTime Tdc %d channel %2d",imodule, ichan);
00055 fFineTime[imodule][ichan] = MakeTH1('I', sHistoFullPath,
00056 sHistoTitle,
00057 TDC_FIFO_FINE_CT, -0.5, TDC_FIFO_FINE_CT - 0.5,
00058 "Fine Time [bin]");
00059 fFineTime[imodule][ichan]->Reset();
00060 TGo4Analysis::Instance()->ProtectObjects( sHistoName, "+C");
00061 }
00062
00063 iNbHitsForCalib[imodule][ichan] = 0;
00064 }
00065 if( 1 == fPar->uFineEvolutionHistEnable )
00066 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00067 {
00068 fFineTimeEvo[imodule][ichan] = MakeTH2('I', Form("FPGA/tdc%d/ft_evo/chan%2dFineTimeEvo%d",imodule,ichan,imodule),
00069 Form("FineTime Tdc %d channel %2d",imodule, ichan),
00070 72, -0.5, 72 - 0.5,
00071 TDC_FIFO_FINE_CT, -0.5, TDC_FIFO_FINE_CT - 0.5,
00072 "Time [h]", "Fine Time [bin]");
00073 fBinSizeEvo[imodule][ichan] = MakeTH2('I', Form("FPGA/tdc%d/ft_evo/chan%2dBinSizeEvo%d",imodule,ichan,imodule),
00074 Form("Bin Size Tdc %d channel %2d",imodule, ichan),
00075 200, -0.5, 1000- 0.5,
00076 50, -0.5, 50 - 0.5,
00077 "Time [min]", "Bin Size [ps]");
00078 }
00079
00080
00081 if( 1 == fPar->uEnableCalib )
00082 {
00083 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00084 {
00085 fDnlCorr[imodule][ichan] = MakeTH1('D', Form("FPGA/tdc%d/Dnl/chan%2dDnlCorr%d",imodule,ichan,imodule),
00086 Form("DnlSum Tdc %d channel %2d",imodule, ichan),
00087 TDC_FIFO_FINE_CT, -0.5, TDC_FIFO_FINE_CT - 0.5,
00088 "Fine Time [bin]");
00089 }
00090
00091 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uTotHistoEnable )
00092 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN/2; ichan++)
00093 fToT[imodule][ichan] = MakeTH1('I', Form("FPGA/tdc%d/tot/chan%2dToT%d",imodule,ichan,imodule),
00094 Form("ToT Tdc %d channel %2d",imodule, ichan),
00095 30000, -150000, 150000, "ToT [ps]");
00096 }
00097
00098 if( 1 == fPar->uBitControl)
00099 {
00100 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00101 {
00102 bitcontrol[imodule][ichan] = MakeTH1('I',
00103 Form("FPGA/tdc%d/bits%d/chan%2dBitcontrol%d",imodule,imodule,ichan,imodule),
00104 Form("use of bits Tdc %d channel %2d",imodule, ichan),
00105 TDC_FIFO_COARSE_CT_SHIFT, 0, TDC_FIFO_COARSE_CT_SHIFT,"Bit []");
00106 bitcontrolCoarse[imodule][ichan] = MakeTH1('I',
00107 Form("FPGA/tdc%d/bits%dCoarse/chan%2dBitcontrol%dCoarse",imodule,imodule,ichan,imodule),
00108 Form("use of bits Tdc %d channel %2d",imodule, ichan),
00109 TDC_FIFO_FUTURE_BIT_SHIFT-TDC_FIFO_COARSE_CT_SHIFT,
00110 0, TDC_FIFO_FUTURE_BIT_SHIFT-TDC_FIFO_COARSE_CT_SHIFT,"Bit []");
00111 }
00112 }
00113
00114 if( 1 == fPar->uCoarseTimeHisto )
00115 {
00116 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00117 {
00118 fCoarseTime[imodule][ichan] = MakeTH1('I', Form("FPGA/tdc%d/ct/chan%2dCoarseTime%d",imodule,ichan,imodule),
00119 Form("CoarseTime Tdc %d channel %2d",imodule, ichan),
00120 TDC_FIFO_COARSE_CT >> TDC_FIFO_COARSE_CT_SHIFT, -0.5, (TDC_FIFO_COARSE_CT >> TDC_FIFO_COARSE_CT_SHIFT)-0.5,
00121 "Coarse Time [bin]");
00122 }
00123 }
00124
00125
00126 if( -1 < fPar->iVftxDiamondChannel[imodule] )
00127 fDiamondTimeTriggerDep[imodule] = MakeTH2('I', Form("FPGA/tdc%d/DiamondVsTrigger%d",imodule,imodule),
00128 Form("Diamond Time to trigger depending on the active trigger, Tdc %d",imodule),
00129 800, -395000, 5000, 16, 0, 16,
00130 "Trigger time - Diamond Calibrated Time [ps]", "Trigger []");
00131
00132
00133 if( -1 == iFirstModuleWithDiamond &&
00134 -1 < fPar->iVftxDiamondChannel[imodule])
00135 iFirstModuleWithDiamond = imodule;
00136 else if( -1 < fPar->iVftxDiamondChannel[imodule] && -1 < iFirstModuleWithDiamond)
00137 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithDiamond] &&
00138 1 == fPar->uVftxCalHistosEnabled[imodule] )
00139 fTdcResolutionDiamCheck[imodule - 1] = MakeTH1('I', Form("FPGA/DiamTdc%dVsTdc%d",imodule, iFirstModuleWithDiamond ),
00140 Form("Diamond signal Tdc %d against Tdc %d",imodule, iFirstModuleWithDiamond),
00141 30000, -15000, 15000,
00142 Form("tDiamond%d - tDiamond%d [ps]", imodule, iFirstModuleWithDiamond));
00143
00144
00145 if( -1 == iFirstModuleWithReference &&
00146 -1 < fPar->iVftxReferenceChannel[imodule])
00147 iFirstModuleWithReference = imodule;
00148 else if( -1 < fPar->iVftxReferenceChannel[imodule])
00149 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference] &&
00150 1 == fPar->uVftxCalHistosEnabled[imodule] )
00151 fTdcResolutionRefCheck[imodule - 1] = MakeTH1('I', Form("FPGA/RefTdc%dVsTdc%d",imodule, iFirstModuleWithReference ),
00152 Form("Time reference signal Tdc %d against Tdc %d",imodule, iFirstModuleWithReference),
00153 30000, -15000, 15000,
00154 Form("tRef%d - tRef%d [ps]", imodule, iFirstModuleWithReference));
00155 }
00156 }
00157 uInitialMbsTime = 0;
00158 uInitialVulomSync = 0;
00159
00160 if( 1 == fPar->uVftxCoincidenceMap )
00161 {
00162 iMapIndex = 0;
00163 for( Int_t iModule1 = 0; iModule1 < MAX_FPGA_TDC; iModule1 ++)
00164 if( 1 == fPar->uVftxCalHistosEnabled[iModule1] )
00165 for( Int_t iModule2 = iModule1; iModule2 < MAX_FPGA_TDC; iModule2 ++)
00166 {
00167 if( MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2 < iMapIndex )
00168 {
00169 TGo4Log::Info("****Vftx monitor: Error creating mapping histos: index out of boundary : %d / %d (tdc #%d VS tdc #%d)",
00170 iMapIndex, MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2, iModule1, iModule2);
00171 break;
00172 }
00173 if( 1 == fPar->uVftxCalHistosEnabled[iModule2] )
00174 fTdcChanStripMapping[ iMapIndex ] =
00175 MakeTH2('I', Form("FPGA/Mapping/Mapp%d_%dVftx", iModule1, iModule2 ),
00176 Form("Channel during same event?, Tdc %d VS Tdc %d", iModule1, iModule2),
00177 FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,
00178 FPGA_TDC_NBCHAN, -0.5, FPGA_TDC_NBCHAN - 0.5,
00179 Form("Channel Tdc #%d []", iModule1),
00180 Form("Channel Tdc #%d []", iModule2),"Events []");
00181 iMapIndex++;
00182 }
00183 }
00184
00185 if( kTRUE != fPar->sInitialCalibrationFilename.EqualTo("") &&
00186 kTRUE != fPar->sInitialCalibrationFilename.EqualTo("-") &&
00187 1 == fPar->uEnableCalib )
00188 {
00189 TString sInitalCalibHistoName = "";
00190 fileCalibrationIn = new TFile( fPar->sInitialCalibrationFilename, "READ");
00191
00192 if( kTRUE == fileCalibrationIn->IsOpen() )
00193 {
00194 TString sInfoLoading = "Loaded initial calibration histograms for following VFTX channels:";
00195 TGo4Log::Info("%s", sInfoLoading.Data() );
00196 sInfoLoading = " ";
00197 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00198 sInfoLoading += Form("%2d ", ichan);
00199 TGo4Log::Info("%s", sInfoLoading.Data() );
00200
00201
00202 Bool_t bincontrol[TDC_FIFO_FINE_CT+1];
00203 Int_t iSum[MAX_FPGA_TDC][FPGA_TDC_NBCHAN];
00204
00205 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00206 {
00207 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00208 continue;
00209
00210 sInfoLoading = Form("tdc #%2d: ",imodule );
00211 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00212 {
00213 fInitialCalibHisto[imodule][ichan] = 0;
00214 sInitalCalibHistoName = Form("CalibHisto_tdc%02d_chan%02d", fPar->uVftxInitalCalIndex[imodule], ichan);
00215 fileCalibrationIn->GetObject( sInitalCalibHistoName, fInitialCalibHisto[imodule][ichan]);
00216
00217 if( 0 == fInitialCalibHisto[imodule][ichan] )
00218 sInfoLoading += " 0 ";
00219 else sInfoLoading += " 1 ";
00220
00221 if( -1 == fPar->iMinNbHitsCalib && 0 != fInitialCalibHisto[imodule][ichan])
00222 {
00223
00224 fDnlCorr[imodule][ichan]->Reset();
00225
00226 iSum[imodule][ichan] = 0;
00227 Double_t dTotalEntriesInHisto = (Double_t)(fInitialCalibHisto[imodule][ichan]->GetEntries() );
00228
00229 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00230 {
00231 Int_t iBinContent = (Int_t)(fFineTime[imodule][ichan]->GetBinContent(ibin+1)) +
00232 (Int_t)(fInitialCalibHisto[imodule][ichan]->GetBinContent(ibin+1));
00233
00234 if( iBinContent <= 0)
00235 {
00236 bincontrol[ibin] = kFALSE;
00237 }
00238 else if( iBinContent > 0)
00239 {
00240 bincontrol[ibin] = kTRUE;
00241 }
00242
00243
00244 if(bincontrol[ibin])
00245 {
00246 iSum[imodule][ichan] = iSum[imodule][ichan] + iBinContent;
00247 dCorr[imodule][ichan][ibin] = (Double_t)iSum[imodule][ichan] / dTotalEntriesInHisto;
00248 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uFineEvolutionHistEnable &&
00249 2 == iNbHitsForCalib[imodule][ichan]%10000 )
00250 fBinSizeEvo[imodule][ichan]->Fill( (Double_t)(fTriglogInputEvent->fMbsTimeSecs - uInitialMbsTime)/60.0,
00251 CLOCK_TIME*(Double_t)(iBinContent) / dTotalEntriesInHisto );
00252 }else
00253 {
00254 if( 0 < ibin)
00255 dCorr[imodule][ichan][ibin] = dCorr[imodule][ichan][ibin-1];
00256 else dCorr[imodule][ichan][ibin]=0;
00257 }
00258 fDnlCorr[imodule][ichan]->Fill(ibin, dCorr[imodule][ichan][ibin] );
00259 }
00260 }
00261 }
00262 TGo4Log::Info("%s", sInfoLoading.Data() );
00263 }
00264 }
00265 else
00266 {
00267 TGo4Log::Info("Could not open %s to load initial VFTX calibration, please check setting in Vftx_options.txt",
00268 fPar->sInitialCalibrationFilename.Data() );
00269 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00270 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00271 fInitialCalibHisto[imodule][ichan] = 0;
00272 }
00273
00274 }
00275
00276
00277 }
00278
00279
00280 TVftxProc::~TVftxProc()
00281 {
00282 cout << "**** TVftxProc: Delete instance " << endl;
00283
00284 if( kTRUE != fPar->sInitialCalibrationFilename.EqualTo("") &&
00285 kTRUE != fPar->sInitialCalibrationFilename.EqualTo("-") &&
00286 1 == fPar->uEnableCalib &&
00287 kTRUE == fileCalibrationIn->IsOpen() )
00288 fileCalibrationIn->Close();
00289
00290 if( 1 == fPar->uEnableCalibOutput && 1 == fPar->uEnableCalib )
00291 {
00292 TTimeStamp timeCurrent;
00293 oldDir = gDirectory;
00294 TString sCalibOutFilename = Form("./VftxCalibHistos_%u_%u.root", timeCurrent.GetDate( kFALSE), timeCurrent.GetTime( kFALSE) );
00295 TFile* fileCalibrationOut = new TFile( sCalibOutFilename, "RECREATE",
00296 Form("Calibration Data for VFTX, saved from analysis on %s", timeCurrent.AsString("lc") ),
00297 9);
00298 if( kTRUE == fileCalibrationOut->IsOpen() )
00299 {
00300 sCalibOutFilename += ":/";
00301 gDirectory->Cd(sCalibOutFilename);
00302 TString sInfoSaving = "Saved initial calibration histograms for following VFTX channels:";
00303 TGo4Log::Info("%s", sInfoSaving.Data() );
00304 sInfoSaving = " ";
00305 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00306 sInfoSaving += Form("%2d ", ichan);
00307 TGo4Log::Info("%s", sInfoSaving.Data() );
00308 for( Int_t imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00309 {
00310 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00311 continue;
00312 sInfoSaving = Form("tdc #%2d: ",imodule );
00313 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00314 {
00315 if( 0 < (fFineTime[imodule][ichan]->GetEntries() ) )
00316 {
00317 fFineTime[imodule][ichan]->Write( Form("CalibHisto_tdc%02d_chan%02d", imodule, ichan),
00318 TObject::kOverwrite);
00319 sInfoSaving += " 1 ";
00320 }
00321 else sInfoSaving += " 0 ";
00322 }
00323 TGo4Log::Info("%s", sInfoSaving.Data() );
00324 }
00325
00326 fileCalibrationOut->Close();
00327 TGo4Log::Info("Calibration data saved in %s", sCalibOutFilename.Data() );
00328 }
00329 else TGo4Log::Warn("Error when deleting TVftxProc: Unable to open root file %s to save calibration data, please check settings",
00330 sCalibOutFilename.Data() );
00331 gDirectory->Cd(oldDir->GetPath());
00332 }
00333 }
00334
00335 void TVftxProc::InitEvent(TGo4EventElement* outevnt)
00336 {
00337
00338
00339
00340
00341
00342
00343 if(fCrateInputEvent==0)
00344 {
00345 TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(GetInputEvent());
00346 if(btevent)
00347 {
00348 fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(btevent->GetSubEvent("MBSCRATE"));
00349 fTriglogInputEvent=dynamic_cast<TTriglogEvent*>(btevent->GetSubEvent("TRIGLOG"));
00350 }
00351 else
00352 {
00353 fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(GetInputEvent());
00354 }
00355 if(fCrateInputEvent==0) {
00356 GO4_STOP_ANALYSIS_MESSAGE("**** TVftxProc: Fatal error: input event is not a TMbsCrateEvent!!! STOP GO4");
00357 }
00358 if(fTriglogInputEvent==0) {
00359 GO4_STOP_ANALYSIS_MESSAGE("**** TVftxProc: Fatal error: input event has no TTriglogEvent!!! STOP GO4");
00360 }
00361 }
00362
00363
00364
00365
00366 if(fOutputEvent==0)
00367 {
00368 TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(outevnt);
00369 if(btevent)
00370 {
00371 fOutputEvent=dynamic_cast<TVftxEvent*>(btevent->GetSubEvent("VFTX"));
00372 }
00373 else
00374 {
00375
00376 fOutputEvent= dynamic_cast<TVftxEvent*>(outevnt);
00377 }
00378 if(fOutputEvent==0) {
00379 GO4_STOP_ANALYSIS_MESSAGE("**** TVftxProc: Fatal error: output event is not a TVftxEvent!!! STOP GO4");
00380 }
00381 else {
00382
00383 }
00384 }
00385 }
00386
00387 void TVftxProc::FinalizeEvent()
00388 {
00389
00390 if (fCrateInputEvent->IsValid())
00391 {
00392
00393 Int_t imodule = 0;
00394 Int_t iEvtSizeHeader1[MAX_FPGA_TDC];
00395 Int_t iEvtSizeHeader2[MAX_FPGA_TDC];
00396 for(imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00397 {
00398 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00399 {
00400 iFirstTime[imodule][ichan] = -1;
00401 iFirstCoarse[imodule][ichan] = -1;
00402 iFirstFine[imodule][ichan] = -1;
00403 dFirstTimecorr[imodule][ichan] = -1;
00404 dFirstFineTimecorr[imodule][ichan] = -1;
00405 iLastTime[imodule][ichan] = 0;
00406 for( Int_t imul = 0; imul< TVftxBoardData::MaxMult; imul++)
00407 {
00408 dTimeCorr[imodule][ichan][imul] = -1;
00409 dFineTimeCorr[imodule][ichan][imul] = -1;
00410 }
00411 uTotalMultiplicity[imodule][ichan] = 0;
00412 }
00413 iTriggerTime[imodule] = 0;
00414 }
00415 imodule = 0;
00416
00417 for (int fpga=0;fpga<MAX_FPGA_TDC;fpga++) {
00418 if( 0 == fPar->uVftxCalHistosEnabled[fpga] )
00419 continue;
00420
00421 unsigned num_hits = fCrateInputEvent->fFPGA[fpga].size();
00422 imodule = fpga;
00423
00424 if( 0 == num_hits && 0 == fCrateInputEvent->fFPGAHEAD[fpga].size() )
00425 continue;
00426 iEvtSizeHeader1[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).nr_data;
00427 iEvtSizeHeader2[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_nd;
00428 iTriggerTime[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_ct;
00429 headTime[imodule] = fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_ct;
00430
00431 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00432 {
00433 fEventSizeHeader1[imodule]->Fill( iEvtSizeHeader1[imodule] );
00434 fEventSizeHeader2[imodule]->Fill( iEvtSizeHeader2[imodule] );
00435 fTriggerType[imodule]->Fill(fCrateInputEvent->fFPGAHEAD[fpga].at(0).fpga_fifo_tt);
00436 fTriggerTime[imodule]->Fill( iTriggerTime[imodule] );
00437 }
00438
00439 (fOutputEvent->fVftxBoards[imodule]).iTriggerTime = headTime[imodule];
00440
00441 for(unsigned i = 0; i<num_hits; i++)
00442 {
00443 uint32_t ichan = fCrateInputEvent->fFPGA[fpga].at(i).ch_ix;
00444 uint32_t bFutureBit = fCrateInputEvent->fFPGA[fpga].at(i).future_bit;
00445 int32_t iCoarseCounter = fCrateInputEvent->fFPGA[fpga].at(i).coarse_ct;
00446 int32_t iFineCounter = fCrateInputEvent->fFPGA[fpga].at(i).ch_tim;
00447
00448
00449 Int_t channel=ichan;
00450
00451 if( (imodule >= 0) && (imodule < MAX_FPGA_TDC) &&
00452 (channel >= 0) && (channel < FPGA_TDC_NBCHAN) )
00453 {
00454
00455 if( ((fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] < TVftxBoardData::TVftxBoardData::MaxMult) )
00456 {
00457 (fOutputEvent->fVftxBoards[imodule]).iFineTime[channel][ (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] ] = iFineCounter;
00458 (fOutputEvent->fVftxBoards[imodule]).iCoarseTime[channel][ (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] ] = iCoarseCounter;
00459 (fOutputEvent->fVftxBoards[imodule]).uFutureBit[channel][ (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel] ] = bFutureBit;
00460 (fOutputEvent->fVftxBoards[imodule]).iMultiplicity[channel]++;
00461 }
00462 uTotalMultiplicity[imodule][channel]++;
00463 }
00464 else continue;
00465
00466
00467 if( 0 == uInitialMbsTime )
00468 {
00469 uInitialMbsTime = fTriglogInputEvent->fMbsTimeSecs;
00470 uInitialVulomSync = fTriglogInputEvent->fVulomSyncNumber;
00471 }
00472 if( 1 == fPar->uFineHistEnable )
00473 {
00474 if( 0 == fFineTime[imodule][ichan]->GetEntries() )
00475 iNbHitsForCalib[imodule][ichan] = 0;
00476
00477 fFineTime[imodule][ichan]->Fill(iFineCounter);
00478
00479 iNbHitsForCalib[imodule][ichan] ++;
00480 if( fPar->iMinNbHitsCalib == iNbHitsForCalib[imodule][ichan] )
00481 TGo4Log::Info("FPGA TDC: Calibration data ok for module %d channel %d, after %d events", imodule, ichan, fTriglogInputEvent->fVulomSyncNumber - uInitialVulomSync);
00482 }
00483 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uFineEvolutionHistEnable )
00484 fFineTimeEvo[imodule][ichan]->Fill( UInt_t((fTriglogInputEvent->fMbsTimeSecs - uInitialMbsTime)/3600), iFineCounter);
00485
00486 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uCoarseTimeHisto )
00487 fCoarseTime[imodule][ichan]->Fill(iCoarseCounter);
00488
00489 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uBitControl )
00490 {
00491 for (uint16_t ibit = 0; ibit <= 9; ibit++)
00492 if ((iFineCounter >> ibit) & 0x1) bitcontrol[imodule][ichan]->Fill( ibit );
00493 for (uint16_t ibit = 0; ibit <= 15; ibit++)
00494 if ((iCoarseCounter >> ibit) & 0x1) bitcontrolCoarse[imodule][ichan]->Fill( ibit );
00495 }
00496
00497 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00498 {
00499 fChanUsage[imodule]->Fill(ichan);
00500 if (bFutureBit) fChanFuture[imodule]->Fill(ichan);
00501 }
00502
00503 if (iLastTime[imodule][ichan])
00504 {
00505 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00506 fChanDouble[imodule]->Fill(ichan);
00507 }
00508 else
00509 {
00510 iFirstCoarse[imodule][ichan] = iCoarseCounter;
00511 iFirstFine[imodule][ichan] = iFineCounter;
00512 iFirstTime[imodule][ichan] = (iCoarseCounter<<TDC_FIFO_COARSE_CT_SHIFT)
00513 + iFineCounter;
00514 }
00515
00516 iLastTime[imodule][ichan] = (iCoarseCounter<<TDC_FIFO_COARSE_CT_SHIFT) + iFineCounter;
00517 }
00518
00519 }
00520
00521 if( 1 == fPar->uEnableCalib )
00522 {
00523
00524 Bool_t bincontrol[TDC_FIFO_FINE_CT+1];
00525 Int_t iSum[MAX_FPGA_TDC][FPGA_TDC_NBCHAN];
00526
00527 for(imodule = 0; imodule < MAX_FPGA_TDC; imodule ++)
00528 {
00529 if( 0 == fPar->uVftxCalHistosEnabled[imodule] )
00530 continue;
00531
00532 for( Int_t ichan = 0; ichan< FPGA_TDC_NBCHAN; ichan++)
00533 {
00534
00535 if( fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][ichan] &&
00536 -1 < fPar->iMinNbHitsCalib)
00537 {
00538 if(
00539 0 == iNbHitsForCalib[imodule][ichan]%fPar->iMinNbHitsCalib )
00540 {
00541 fDnlCorr[imodule][ichan]->Reset();
00542
00543 iSum[imodule][ichan] = 0;
00544 Double_t dTotalEntriesInHisto = (Double_t)(fFineTime[imodule][ichan]->GetEntries() );
00545
00546 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00547 {
00548 Int_t iBinContent = (Int_t)(fFineTime[imodule][ichan]->GetBinContent(ibin+1));
00549
00550 if( iBinContent <= 0)
00551 {
00552 bincontrol[ibin] = kFALSE;
00553 }
00554 else if( iBinContent > 0)
00555 {
00556 bincontrol[ibin] = kTRUE;
00557 }
00558
00559
00560 if(bincontrol[ibin])
00561 {
00562 iSum[imodule][ichan] = iSum[imodule][ichan] + iBinContent;
00563 dCorr[imodule][ichan][ibin] = (Double_t)iSum[imodule][ichan] / dTotalEntriesInHisto;
00564 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uFineEvolutionHistEnable &&
00565 0 == iNbHitsForCalib[imodule][ichan]%10000 )
00566 fBinSizeEvo[imodule][ichan]->Fill( (Double_t)(fTriglogInputEvent->fMbsTimeSecs - uInitialMbsTime)/60.0,
00567 CLOCK_TIME*(Double_t)(iBinContent) / dTotalEntriesInHisto );
00568 }else
00569 {
00570 if( 0 < ibin)
00571 dCorr[imodule][ichan][ibin] = dCorr[imodule][ichan][ibin-1];
00572 else dCorr[imodule][ichan][ibin]=0;
00573 }
00574 fDnlCorr[imodule][ichan]->Fill(ibin, dCorr[imodule][ichan][ibin] );
00575 }
00576 }
00577 }
00578 else if( -1 < fPar->iMinNbHitsCalib )
00579 {
00580
00581
00582 if( 0 != fInitialCalibHisto[imodule][ichan] &&
00583 2 == iNbHitsForCalib[imodule][ichan]%fPar->iMinNbHitsCalib )
00584 {
00585 fDnlCorr[imodule][ichan]->Reset();
00586
00587 iSum[imodule][ichan] = 0;
00588 Double_t dTotalEntriesInHisto = (Double_t)(fFineTime[imodule][ichan]->GetEntries() ) +
00589 (Double_t)(fInitialCalibHisto[imodule][ichan]->GetEntries() );
00590
00591 for(Int_t ibin=0; ibin <= (Int_t)TDC_FIFO_FINE_CT; ibin++)
00592 {
00593 Int_t iBinContent = (Int_t)(fFineTime[imodule][ichan]->GetBinContent(ibin+1)) +
00594 (Int_t)(fInitialCalibHisto[imodule][ichan]->GetBinContent(ibin+1));
00595
00596 if( iBinContent <= 0)
00597 {
00598 bincontrol[ibin] = kFALSE;
00599 }
00600 else if( iBinContent > 0)
00601 {
00602 bincontrol[ibin] = kTRUE;
00603 }
00604
00605
00606 if(bincontrol[ibin])
00607 {
00608 iSum[imodule][ichan] = iSum[imodule][ichan] + iBinContent;
00609 dCorr[imodule][ichan][ibin] = (Double_t)iSum[imodule][ichan] / dTotalEntriesInHisto;
00610 if( 1 == fPar->uVftxCalHistosEnabled[imodule] && 1 == fPar->uFineEvolutionHistEnable &&
00611 2 == iNbHitsForCalib[imodule][ichan]%10000 )
00612 fBinSizeEvo[imodule][ichan]->Fill( (Double_t)(fTriglogInputEvent->fMbsTimeSecs - uInitialMbsTime)/60.0,
00613 CLOCK_TIME*(Double_t)(iBinContent) / dTotalEntriesInHisto );
00614 }else
00615 {
00616 if( 0 < ibin)
00617 dCorr[imodule][ichan][ibin] = dCorr[imodule][ichan][ibin-1];
00618 else dCorr[imodule][ichan][ibin]=0;
00619 }
00620 fDnlCorr[imodule][ichan]->Fill(ibin, dCorr[imodule][ichan][ibin] );
00621 }
00622 }
00623 }
00624
00625 if( ( -1<fPar->iMinNbHitsCalib && fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][ichan]) ||
00626 0 != fInitialCalibHisto[imodule][ichan] )
00627 {
00628 if( 0<=iFirstCoarse[imodule][ichan] || 0<=iFirstFine[imodule][ichan] )
00629 {
00630 dFirstTimecorr[imodule][ichan] = iFirstCoarse[imodule][ichan]*CLOCK_TIME
00631 + (1 - dCorr[imodule][ichan][iFirstFine[imodule][ichan]])*CLOCK_TIME;
00632 dFirstFineTimecorr[imodule][ichan] = dCorr[imodule][ichan][iFirstFine[imodule][ichan]]*CLOCK_TIME;
00633 }
00634 for( Int_t imul = 0; imul< TVftxBoardData::MaxMult; imul++)
00635 if( 0<=(fOutputEvent->fVftxBoards[imodule]).iFineTime[ichan][imul] ||
00636 0<=(fOutputEvent->fVftxBoards[imodule]).iCoarseTime[ichan][imul])
00637 {
00638 dTimeCorr[imodule][ichan][imul] = (fOutputEvent->fVftxBoards[imodule]).iCoarseTime[ichan][imul]*CLOCK_TIME
00639 + (1 - dCorr[imodule][ichan][(fOutputEvent->fVftxBoards[imodule]).iFineTime[ichan][imul]])*CLOCK_TIME;
00640 dFineTimeCorr[imodule][ichan][imul] = (1 - dCorr[imodule][ichan][(fOutputEvent->fVftxBoards[imodule]).iFineTime[ichan][imul]])*CLOCK_TIME;
00641
00642
00643 (fOutputEvent->fVftxBoards[imodule]).dTimeCorr[ichan][imul] = dTimeCorr[imodule][ichan][imul];
00644 (fOutputEvent->fVftxBoards[imodule]).dFineTimeCorr[ichan][imul] = dFineTimeCorr[imodule][ichan][imul];
00645 }
00646 }
00647
00648 }
00649
00650
00651 if( 1 == fPar->uVftxCalHistosEnabled[imodule] )
00652 {
00653 #if defined(VERSION_VFTX) || defined(VERSION_VFTX_28) // 1 TDC mode, chan = Time, chan +1 = Tot
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684 #else
00685 if( 1 == fPar->uTimeHistEnable && fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][0])
00686 fTime[imodule][0]->Fill( (iTriggerTime[imodule] +1 -headTime[imodule] )*CLOCK_TIME - dFirstTimecorr[imodule][0]);
00687 if( 1 == fPar->uTotHistoEnable && fPar->iMinNbHitsCalib <= iNbHitsForCalib[0][0]
00688 && fPar->iMinNbHitsCalib <= iNbHitsForCalib[1][0] )
00689 fToT[0]->Fill(((Double_t)iTriggerTime[0]*(Double_t)CLOCK_TIME ) -dFirstTimecorr[0][0]
00690 - (((Double_t)iTriggerTime[1]*(Double_t)CLOCK_TIME ) -dFirstTimecorr[1][0]));
00691 Double_t dToT[FPGA_TDC_NBCHAN];
00692 for( Int_t ichan = 1; ichan < FPGA_TDC_NBCHAN; ichan ++)
00693 {
00694 if( 1 == fPar->uTimeHistEnable && fPar->iMinNbHitsCalib <= iNbHitsForCalib[imodule][ichan] )
00695 fTime[imodule][ichan]->Fill( (iTriggerTime[imodule] +1 -headTime[imodule] )*CLOCK_TIME
00696 - dFirstTimecorr[imodule][ichan]);
00697 if( 1 == fPar->uTotHistoEnable &&
00698 0 < iFirstTime[0][ichan] && 0 < iFirstTime[1][ichan] &&
00699 0 < iFirstTime[0][0] && 0 < iFirstTime[1][0] &&
00700 fPar->iMinNbHitsCalib <= iNbHitsForCalib[0][0] &&
00701 fPar->iMinNbHitsCalib <= iNbHitsForCalib[1][1] &&
00702 fPar->iMinNbHitsCalib <= iNbHitsForCalib[0][0] &&
00703 fPar->iMinNbHitsCalib <= iNbHitsForCalib[1][0] )
00704 {
00705 dToT[ichan] = (iTriggerTime[0]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[0][ichan]
00706 - ((iTriggerTime[1]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[1][ichan])
00707 - ( (iTriggerTime[0]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[0][0]
00708 - ((iTriggerTime[1]*(Double_t)CLOCK_TIME ) - dFirstTimecorr[1][0])) ;
00709 fToT[ichan]->Fill(dToT[ichan]);
00710 }
00711 }
00712 #endif
00713 }
00714 }
00715
00716
00717 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
00718 {
00719 if( 0 == fPar->uVftxCalHistosEnabled[iModule] )
00720 continue;
00721
00722 Double_t dTimeToTrigger;
00723 Double_t dToT;
00724 for(Int_t iChan=0; iChan < FPGA_TDC_NBCHAN; iChan++)
00725 {
00726 for( Int_t iHit = 0; iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[ iChan ]; iHit++)
00727 {
00728 if( 1 == fPar->uTimeHistEnable &&
00729 (fPar->iMinNbHitsCalib <= iNbHitsForCalib[iModule][iChan] || 0 != fInitialCalibHisto[iModule][iChan])&&
00730 0 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan][iHit] )
00731 {
00732 dTimeToTrigger = (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan][iHit]
00733 - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime*CLOCK_TIME;
00734 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit] - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime)
00735 dTimeToTrigger -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00736 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iHit] - (fOutputEvent->fVftxBoards[iModule]).iTriggerTime < -1000 )
00737 dTimeToTrigger += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00738 fTime[iModule][iChan]->Fill( dTimeToTrigger );
00739 }
00740 }
00741 if( 1 == fPar->uTotHistoEnable && iChan < FPGA_TDC_NBCHAN/2 )
00742 for( Int_t iHit = 0; iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[ iChan*2 ] &&
00743 iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[ iChan*2+1 ]; iHit++)
00744 {
00745 if( 0 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2][iHit] &&
00746 0 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2+1][iHit] &&
00747 (fPar->iMinNbHitsCalib <= iNbHitsForCalib[iModule][iChan*2] || 0 != fInitialCalibHisto[iModule][iChan*2] )&&
00748 (fPar->iMinNbHitsCalib <= iNbHitsForCalib[iModule][iChan*2+1] || 0 != fInitialCalibHisto[iModule][iChan*2+1]) )
00749 {
00750 dToT = (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2][iHit]
00751 - (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[iChan*2+1][iHit];
00752 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2][iHit]
00753 - (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2+1][iHit] )
00754 dToT -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00755 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2][iHit]
00756 - (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan*2+1][iHit] < -1000 )
00757 dToT += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00758 fToT[iModule][iChan]->Fill(dToT);
00759 }
00760 }
00761
00762
00763 if( 1 == fPar->uVftxCoincidenceMap )
00764 iMapIndex = MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2
00765 - (MAX_FPGA_TDC-iModule)*((MAX_FPGA_TDC-iModule)+1)/2;
00766
00767 if( 1 == fPar->uVftxCalHistosEnabled[iModule] &&
00768 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[iChan] )
00769 {
00770 fChanEvents[iModule]->Fill(iChan);
00771 if( 1 == fPar->uVftxCoincidenceMap )
00772 {
00773 if( MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2 < iMapIndex )
00774 {
00775 TGo4Log::Info("****Vftx monitor: Error filling mapping histos: index out of boundary : %d / %d (tdc #%d VS tdc #%d)",
00776 iMapIndex, MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2, iModule, iModule);
00777 return;
00778 }
00779 for(Int_t iChan2=iChan+1; iChan2<FPGA_TDC_NBCHAN; iChan2++)
00780 if( 1 == fPar->uVftxCalHistosEnabled[iModule] && 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[iChan2] )
00781 {
00782 fTdcChanStripMapping[ iMapIndex ]->Fill( iChan, iChan2 );
00783 }
00784
00785 for(Int_t iModule2=iModule+1; iModule2<MAX_FPGA_TDC; iModule2++)
00786 {
00787
00788 iMapIndex = MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2
00789 - (MAX_FPGA_TDC-iModule)*((MAX_FPGA_TDC-iModule)+1)/2
00790 + (iModule2 - iModule);
00791 if( MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2 < iMapIndex )
00792 {
00793 TGo4Log::Info("****Vftx monitor: Error filling mapping histos: index out of boundary : %d / %d (tdc #%d VS tdc #%d)",
00794 iMapIndex, MAX_FPGA_TDC*(MAX_FPGA_TDC+1)/2, iModule, iModule2);
00795 return;
00796 }
00797 for(Int_t iChan2=0; iChan2<FPGA_TDC_NBCHAN; iChan2++)
00798 if( 1 == fPar->uVftxCalHistosEnabled[iModule2] && 0<(fOutputEvent->fVftxBoards[iModule2]).iMultiplicity[iChan2] )
00799 {
00800 fTdcChanStripMapping[ iMapIndex ]->Fill( iChan, iChan2 );
00801 }
00802 }
00803 }
00804 }
00805
00806 if( 1 == fPar->uVftxCalHistosEnabled[iModule] )
00807 fChanMultip[iModule]->Fill(iChan, uTotalMultiplicity[iModule][iChan] );
00808 }
00809 }
00810
00811
00812 Double_t dDiamondTimeToTrigger = 0.0;
00813 for(Int_t iTrigger = 0; iTrigger<16; iTrigger++)
00814 if( 1 == ((fTriglogInputEvent->fVulomTriggerPattern>>iTrigger) & 0x1) )
00815 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
00816 if( -1 < fPar->iVftxDiamondChannel[iModule] )
00817 for( Int_t iHit = 0; iHit < (fOutputEvent->fVftxBoards[iModule]).iMultiplicity[fPar->iVftxDiamondChannel[iModule] ]; iHit++)
00818 {
00819 dDiamondTimeToTrigger = (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxDiamondChannel[iModule]][iHit]
00820 - iTriggerTime[iModule]*CLOCK_TIME;
00821 if( 1000 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[fPar->iVftxDiamondChannel[iModule]][iHit] - iTriggerTime[iModule])
00822 dDiamondTimeToTrigger -= ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00823 if( (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[fPar->iVftxDiamondChannel[iModule]][iHit] - iTriggerTime[iModule] < -1000 )
00824 dDiamondTimeToTrigger += ((TDC_FIFO_COARSE_CT>>TDC_FIFO_COARSE_CT_SHIFT)+1)*(Double_t)CLOCK_TIME;
00825 fDiamondTimeTriggerDep[iModule]->Fill( dDiamondTimeToTrigger, iTrigger );
00826 }
00827
00828 if( -1 < iFirstModuleWithDiamond)
00829 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithDiamond] &&
00830 0<(fOutputEvent->fVftxBoards[iFirstModuleWithDiamond]).iMultiplicity[fPar->iVftxDiamondChannel[iFirstModuleWithDiamond]] )
00831 for(Int_t iModule=1; iModule<MAX_FPGA_TDC; iModule++)
00832 if( 1 == fPar->uVftxCalHistosEnabled[iModule] && fPar->iVftxDiamondChannel[iModule] )
00833 if( 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[fPar->iVftxDiamondChannel[iModule]] )
00834 if( -1 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxDiamondChannel[iModule]][0] &&
00835 -1 < (fOutputEvent->fVftxBoards[iFirstModuleWithDiamond]).dTimeCorr[fPar->iVftxDiamondChannel[iFirstModuleWithDiamond]][0] )
00836 fTdcResolutionDiamCheck[iModule-1]->Fill( (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxDiamondChannel[iModule]][0] -
00837 (fOutputEvent->fVftxBoards[iFirstModuleWithDiamond]).dTimeCorr[fPar->iVftxDiamondChannel[iFirstModuleWithDiamond]][0] );
00838
00839 if( -1 < iFirstModuleWithReference)
00840 if( 1 == fPar->uVftxCalHistosEnabled[iFirstModuleWithReference] &&
00841 0<(fOutputEvent->fVftxBoards[iFirstModuleWithReference]).iMultiplicity[fPar->iVftxReferenceChannel[iFirstModuleWithReference]] )
00842 for(Int_t iModule=1; iModule<MAX_FPGA_TDC; iModule++)
00843 if( 1 == fPar->uVftxCalHistosEnabled[iModule] && fPar->iVftxReferenceChannel[iModule] )
00844 {
00845 if( 0<(fOutputEvent->fVftxBoards[iModule]).iMultiplicity[fPar->iVftxReferenceChannel[iModule]] )
00846 if( -1 < (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxReferenceChannel[iModule]][0] &&
00847 -1 < (fOutputEvent->fVftxBoards[iFirstModuleWithReference]).dTimeCorr[fPar->iVftxReferenceChannel[iFirstModuleWithReference]][0] )
00848 fTdcResolutionRefCheck[iModule-1]->Fill( (fOutputEvent->fVftxBoards[iModule]).dTimeCorr[fPar->iVftxReferenceChannel[iModule]][0] -
00849 (fOutputEvent->fVftxBoards[iFirstModuleWithReference]).dTimeCorr[fPar->iVftxReferenceChannel[iFirstModuleWithReference]][0] );
00850
00851 if( 1 == fPar->uAutomaticOffsetEnable )
00852 if( 5000 < fTdcResolutionRefCheck[iModule-1]->GetEntries() )
00853 {
00854 if( fTdcResolutionRefCheck[iModule-1]->GetMean() < - 2500 )
00855 fPar->iAutomaticTdcOffset[iModule] = 1;
00856 else if( 2500 < fTdcResolutionRefCheck[iModule-1]->GetMean() )
00857 fPar->iAutomaticTdcOffset[iModule] = -1;
00858 }
00859 }
00860
00861 fOutputEvent->SetValid(kTRUE);
00862 }
00863 else
00864 {
00865 if( 1 == fPar->uTimeHistEnable )
00866 for(Int_t iModule=0; iModule<MAX_FPGA_TDC; iModule++)
00867 if( 1 == fPar->uVftxCalHistosEnabled[iModule] )
00868 for(Int_t iChan=0; iChan<FPGA_TDC_NBCHAN; iChan++)
00869 for( Int_t iMul = 0; iMul< TVftxBoardData::MaxMult; iMul++)
00870 {
00871 if( -1 < (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iMul] )
00872 fTime[iModule][iChan]->Fill(
00873 (fOutputEvent->fVftxBoards[iModule]).iCoarseTime[iChan][iMul]
00874 - iTriggerTime[iModule] );
00875 }
00876 }
00877 fOutputEvent->SetValid(kTRUE);
00878 }
00879 return;
00880 }