26 #include <TGeoManager.h>
27 #include <TRefArray.h>
31 #include "AliAnalysisTask.h"
32 #include "AliAnalysisManager.h"
33 #include "AliESDEvent.h"
34 #include "AliAODEvent.h"
35 #include "AliVEvent.h"
36 #include "AliESDInputHandler.h"
37 #include "AliAODInputHandler.h"
38 #include "AliESDpid.h"
39 #include "AliTOFcalib.h"
40 #include "AliCDBManager.h"
41 #include "AliRunTag.h"
43 #include "AliTOFT0maker.h"
44 #include "AliVCluster.h"
45 #include "AliESDCaloCluster.h"
46 #include "AliVCaloCells.h"
47 #include "AliESDCaloCells.h"
48 #include "AliAODCaloCluster.h"
49 #include "AliAODCaloCells.h"
50 #include "AliEMCALGeometry.h"
51 #include "AliOADBContainer.h"
82 fReferenceRunByRunFileName(),
83 fPileupFromSPD(kFALSE),
86 fMostEneCellOnly(kFALSE),
104 fFillHeavyHisto(kFALSE),
105 fBadChannelMapArray(),
106 fBadChannelMapSet(kFALSE),
107 fSetBadChannelMapSource(0),
108 fBadChannelFileName(),
113 fhTOFT0vsEventNumber(0),
135 fhRawTimeEntriesBC(),
139 fhRawTimeEntriesLGBC(),
140 fhRawTimeSumSqLGBC(),
141 fhRawCorrTimeVsIdBC(),
142 fhRawCorrTimeVsIdLGBC(),
183 DefineInput(0, TChain::Class());
187 DefineOutput(1, TList::Class());
210 AliFatal(
"*** NO REFERENCE FILE");
212 AliDebug(1,
"*** OK TFILE");
217 if(
fhAllAverageBC[i]==0x0) AliFatal(Form(
"Reference histogram for BC%d does not exist",i));
218 if(
fhAllAverageBC[i]->GetEntries()==0)AliWarning(Form(
"fhAllAverageLGBC[%d]->GetEntries() = 0",i));
220 if(
fhAllAverageLGBC[i]==0x0) AliFatal(Form(
"Reference LG histogram for BC%d does not exist",i));
221 if(
fhAllAverageLGBC[i]->GetEntries()==0)AliFatal(Form(
"fhAllAverageLGBC[%d]->GetEntries() = 0",i));
231 AliFatal(
"You require to load reference histos from file but FILENAME is not provided");
243 if(referenceFile==0x0) {
244 AliFatal(
"*** NO REFERENCE R-B-R FILE");
251 TIter next(referenceFile->GetListOfKeys());
253 while ((key=(TKey*)next())) {
254 fL1PhaseList->AddLast((TH1F*)referenceFile->Get(key->GetName()) );
259 AliFatal(
"You require to load reference run-by-run histos from file but FILENAME is not provided");
271 AliFatal(
"Array with reference L1 phase histograms do not exist in memory");
275 AliFatal(
"Negative run number");
281 AliError(Form(
"Reference histogram for run %d does not exist. Use Default",
fRunNumber));
290 if(
fhRefRuns->GetEntries()==0)AliWarning(
"fhRefRuns->GetEntries() = 0");
291 AliDebug(1,Form(
"hRefRuns entries %d", (
Int_t)
fhRefRuns->GetEntries() ));
299 AliDebug(1,
"AnalysisTaskEMCalTimeCalib::NotifyRun()");
300 AliDebug(2,Form(
"Notify(): EMCal geometry: fgeom = %p, fGeometryName=%s\n ",
fgeom,
fGeometryName.Data()));
304 AliFatal(
"ERROR: InputEvent not set");
307 else AliDebug(1,
"Good, InputEvent set");
331 AliDebug(1,
"AliAnalysisTaskEMCALTimeCalib::SetEMCalGeometry()");
334 AliInfo(Form(
"Get EMCAL geometry name <%s> for run %d",
fgeom->GetName(),
fRunNumber));
337 AliInfo(Form(
"Set EMCAL geometry name to <%s>",
fGeometryName.Data()));
341 AliWarning(
"Make sure the EMCal geometry is set properly !");
343 AliDebug(1,Form(
"EMCal geometry properly set: fGeom = %p, fGeometryName=%s",
fgeom,
fGeometryName.Data()));
354 AliInfo(Form(
"<D> -- Run # = %d",
fRunNumber));
355 AliInfo(
"prepare TOFT0maker!!");
359 AliCDBManager * cdb = AliCDBManager::Instance();
360 cdb->SetDefaultStorage(
"raw://");
363 AliESDpid *extPID=
new AliESDpid();
385 AliDebug(1,
"AliAnalysisTaskEMCALTimeCalib::UserCreateOutputObjects()");
387 const Int_t nChannels = 17664;
403 fhEventType =
new TH1F(
"fhEventType",
"event type",10, 0.,10.);
405 fhEventType->GetXaxis()->SetBinLabel(1 ,
"1=No ESD");
406 fhEventType->GetXaxis()->SetBinLabel(2 ,
"2=Pileup");
407 fhEventType->GetXaxis()->SetBinLabel(3 ,
"3=No Trigger");
408 fhEventType->GetXaxis()->SetBinLabel(4 ,
"4=Evt Type != 7");
409 fhEventType->GetXaxis()->SetBinLabel(5 ,
"5=INT7,8");
410 fhEventType->GetXaxis()->SetBinLabel(6 ,
"6=EMC7,8");
411 fhEventType->GetXaxis()->SetBinLabel(7 ,
"7=L1 EMCal");
412 fhEventType->GetXaxis()->SetBinLabel(8 ,
"8=DMC7,8");
413 fhEventType->GetXaxis()->SetBinLabel(9 ,
"9=L1 DCal");
416 fhEventType ->GetYaxis()->SetTitle(
"Counts (a.u.)");
424 fhEneVsAbsIdHG =
new TH2F(
"fhEneVsAbsIdHG",
"energy vs ID for HG",1000,0,18000,200,0,10);
425 fhEneVsAbsIdLG =
new TH2F(
"fhEneVsAbsIdLG",
"energy vs ID for LG",1000,0,18000,200,0,40);
433 Form(
"cell Sum Square time HG, BC %d ", i),
438 fhTimeSum[i] =
new TH1F(Form(
"hTimeSum%d", i),
439 Form(
"cell Sum time HG, BC %d ", i),
444 fhTimeEnt[i] =
new TH1F(Form(
"hTimeEnt%d", i),
445 Form(
"cell Entries HG, BC %d ", i),
447 fhTimeEnt[i]->SetYTitle(
"Entries for Time ");
452 Form(
"cell Sum Square time LG, BC %d ", i),
458 Form(
"cell Sum time LG, BC %d ", i),
464 Form(
"cell Entries LG, BC %d ", i),
473 Form(
"cell raw time vs ID for high gain BC %d ", i),
480 Form(
"sum of cell raw time for high gain BC %d ", i),
486 Form(
"No. entries of cells raw time for high gain BC %d ", i),
492 Form(
"sum of (cell raw time)^2 for high gain BC %d ", i),
500 Form(
"cell raw time vs ID for low gain BC %d ", i),
507 Form(
"sum of cell raw time for low gain BC %d ", i),
513 Form(
"No. entries of cells raw time for low gain BC %d ", i),
519 Form(
"sum of (cell raw time)^2 for low gain BC %d ", i),
527 Form(
"cell L1 shift and 100ns corrected raw time vs ID for high gain BC %d ", i),
533 Form(
"cell L1 shift and 100ns corrected raw time vs ID for low gain BC %d ", i),
542 Form(
"cell time corrected for L1 shift, 100ns and L1 phase vs ID for high gain BC %d ", i),
548 Form(
"cell time corrected for L1 shift, 100ns and L1 phase vs ID for low gain BC %d ", i),
558 fhTimeDsupBC[j][i]=
new TH2F(Form(
"SupMod%dBC%d",j,i), Form(
"SupMod %d time_vs_E, high gain, BC %d",j,i),
fEnergyNbins,
fEnergyMin,
fEnergyMax,
fPassTimeNbins,
fPassTimeMin,
fPassTimeMax);
563 fhTimeDsupLGBC[j][i]=
new TH2F(Form(
"SupMod%dBC%dLG",j,i), Form(
"SupMod %d time_vs_E, low gain, BC %d",j,i),
fEnergyLGNbins,
fEnergyLGMin,
fEnergyLGMax,
fPassTimeNbins,
fPassTimeMin,
fPassTimeMax);
572 fhTimeDsup[jj] =
new TH2F(Form(
"SupMod%d",jj), Form(
"SupMod %d time_vs_E, high gain",jj),
fEnergyNbins,
fEnergyMin,
fEnergyMax,
fPassTimeNbins,
fPassTimeMin,
fPassTimeMax);
577 fhTimeDsupLG[jj] =
new TH2F(Form(
"SupMod%dLG",jj), Form(
"SupMod %d time_vs_E, low gain ",jj),
fEnergyLGNbins,
fEnergyLGMin,
fEnergyLGMax,
fPassTimeNbins,
fPassTimeMin,
fPassTimeMax);
657 AliDebug(2,Form(
"UserExec: EMCal geometry: fgeom = %p fGeometryName %s",
fgeom,
fGeometryName.Data()));
658 AliVEvent *
event = InputEvent();
661 AliDebug(2,Form(
"TOF time from header %f ps",event->GetTOFHeader()->GetDefaultEventTimeVal()));
666 AliError(
"ESD not available, exit");
672 if(event->IsPileupFromSPD(3,0.8,3.,2.,5.)){
673 AliDebug(1,
"Event: PileUp skip.");
679 TString triggerclasses =
event->GetFiredTriggerClasses();
680 if(triggerclasses==
"") {
685 Int_t eventType = ((AliVHeader*)event->GetHeader())->GetEventType();
687 AliDebug(1,Form(
"Triggerclasses %s, eventType %d",triggerclasses.Data(),eventType));
702 if(triggerclasses.Contains(
"CINT7-B-NOPF-ALLNOTRD") ||
703 triggerclasses.Contains(
"CINT7-I-NOPF-ALLNOTRD") ||
704 triggerclasses.Contains(
"CINT1-I-NOPF-ALLNOTRD") ||
705 triggerclasses.Contains(
"CINT1-B-NOPF-ALLNOTRD") ||
706 triggerclasses.Contains(
"CINT8") ||
707 triggerclasses.Contains(
"CINT7") ||
708 triggerclasses.Contains(
"CPBI2_B1-B-NOPF-ALLNOTRD") ) bMB = kTRUE;
710 if(triggerclasses.Contains(
"CEMC7-B-NOPF-CENTNOTRD") ||
711 triggerclasses.Contains(
"CEMC1-B-NOPF-CENTNOTRD") ||
712 triggerclasses.Contains(
"CEMC7") ||
713 triggerclasses.Contains(
"CEMC8") ||
714 triggerclasses.Contains(
"CEMC8-B-NOPF-CENTNOTRD") ) bL0 = kTRUE;
716 if(triggerclasses.Contains(
"CDMC7-B-NOPF-CENTNOTRD") ||
717 triggerclasses.Contains(
"CDMC1-B-NOPF-CENTNOTRD") ||
718 triggerclasses.Contains(
"CDMC7") ||
719 triggerclasses.Contains(
"CDMC8") ||
720 triggerclasses.Contains(
"CDMC8-B-NOPF-CENTNOTRD") ) bDL0 = kTRUE;
722 if(triggerclasses.Contains(
"CEMC7EG1-B-NOPF-CENTNOTRD") ||
723 triggerclasses.Contains(
"CEMC7EG2-B-NOPF-CENTNOTRD") ||
724 triggerclasses.Contains(
"CEMC8EG1-B-NOPF-CENTNOTRD") ||
725 triggerclasses.Contains(
"CEMC8EGA") ||
726 triggerclasses.Contains(
"CEMC7EGA") ||
727 triggerclasses.Contains(
"CEMC7EG1-B") ||
728 triggerclasses.Contains(
"CEMC7EG2-B") ||
729 triggerclasses.Contains(
"CPBI2EGA") ) bL1G = kTRUE;
731 if(triggerclasses.Contains(
"CDMC7DG1-B-NOPF-CENTNOTRD") ||
732 triggerclasses.Contains(
"CDMC7DG2-B-NOPF-CENTNOTRD") ||
733 triggerclasses.Contains(
"CDMC8DG1-B-NOPF-CENTNOTRD") ||
734 triggerclasses.Contains(
"CDMC8DGA") ||
735 triggerclasses.Contains(
"CDMC7DGA") ||
736 triggerclasses.Contains(
"CDMC7DG1-B") ||
737 triggerclasses.Contains(
"CDMC7DG2-B") ||
738 triggerclasses.Contains(
"CPBI2DGA") ) bDL1G = kTRUE;
740 if(triggerclasses.Contains(
"CEMC7EJ1-B-NOPF-CENTNOTRD") ||
741 triggerclasses.Contains(
"CEMC7EJ2-B-NOPF-CENTNOTRD") ||
742 triggerclasses.Contains(
"CEMC8EJ1-B-NOPF-CENTNOTRD") ||
743 triggerclasses.Contains(
"CEMC7EJE") ||
744 triggerclasses.Contains(
"CEMC8EJE") ||
745 triggerclasses.Contains(
"CEMC7EJ1-B") ||
746 triggerclasses.Contains(
"CEMC7EJ2-B") ||
747 triggerclasses.Contains(
"CPBI2EJE") ) bL1J = kTRUE;
749 if(triggerclasses.Contains(
"CDMC7DJ1-B-NOPF-CENTNOTRD") ||
750 triggerclasses.Contains(
"CDMC7DJ2-B-NOPF-CENTNOTRD") ||
751 triggerclasses.Contains(
"CDMC8DJ1-B-NOPF-CENTNOTRD") ||
752 triggerclasses.Contains(
"CDMC7DJE") ||
753 triggerclasses.Contains(
"CDMC8DJE") ||
754 triggerclasses.Contains(
"CDMC7DJ1-B") ||
755 triggerclasses.Contains(
"CDMC7DJ2-B") ||
756 triggerclasses.Contains(
"CPBI2DJE") ) bDL1J = kTRUE;
778 timeTOFtable=
fTOFmaker->ComputeT0TOF(dynamic_cast<AliESDEvent*>(event));
779 AliDebug(2,Form(
"TOF time %f ps, resolution %f ps, tracks at TOF %f/used %f",timeTOFtable[0],timeTOFtable[1],timeTOFtable[3],timeTOFtable[7]));
781 calcolot0=timeTOFtable[0];
786 if(calcolot0 != 0 && event->GetTOFHeader()->GetDefaultEventTimeVal() != 0 )
787 fhEvtTimeDiff->Fill(calcolot0-event->GetTOFHeader()->GetDefaultEventTimeVal());
790 TRefArray* caloClusters =
new TRefArray();
791 event->GetEMCALClusters(caloClusters);
794 Int_t BunchCrossNumber =
event->GetBunchCrossNumber();
798 Int_t L1phaseshift=0;
800 Int_t L1shiftOffset=0;
803 nBC = BunchCrossNumber%4;
809 Int_t nclus = caloClusters->GetEntries();
810 AliDebug(1,Form(
"###########Bunch Cross nb = %d nclus = %d",nBC,nclus ));
814 AliVCaloCells &cells= *(
event->GetEMCALCells());
816 Int_t nSupMod=-1, nModule=-1;
817 Int_t iphi=-1, ieta=-1, nIphi=-1, nIeta=-1;
825 for (
Int_t icl = 0; icl < nclus; icl++) {
827 AliVCluster* clus = (AliVCluster*)caloClusters->At(icl);
832 UShort_t * index = clus->GetCellsAbsId() ;
838 for(
Int_t i = 0; i < clus->GetNCells() ; i++) {
840 amp = cells.GetCellAmplitude(absId) ;
848 for(
Int_t i = 0; i < clus->GetNCells() ; i++) {
855 hkdtime = cells.GetCellTime(absId) * 1.0e09;
856 amp = cells.GetCellAmplitude(absId) ;
857 isHighGain = cells.GetCellHighGain(absId);
860 fgeom->GetCellIndex(absId, nSupMod, nModule, nIphi, nIeta);
861 fgeom->GetCellPhiEtaIndexInSModule(nSupMod,nModule,nIphi,nIeta, iphi,ieta);
895 fhTimeVsBC->Fill(1.*BunchCrossNumber,hkdtime-timeBCoffset);
897 if(isHighGain==kTRUE){
901 AliFatal(Form(
"Reference histogram for BC%d not properly loaded",nBC));
907 AliFatal(Form(
"Reference LG histogram for BC%d not properly loaded",nBC));
922 L1phase = L1phaseshift & 3;
924 offsetPerSM = (nBC - L1phase)*25;
926 offsetPerSM = (nBC - L1phase + 4)*25;
931 L1shiftOffset = L1phaseshift>>2;
934 if(nBC==0 || nBC==1) L1shiftOffset-=100.;
937 AliFatal(
"Reference histogram run-by-run not properly loaded");
953 fhTimeVsIdBC[nBC]->Fill(absId,hkdtime-L1shiftOffset-offsetPerSM);
955 fhTimeVsIdLGBC[nBC]->Fill(absId,hkdtime-L1shiftOffset-offsetPerSM);
962 fhTimeDsup[nSupMod]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
963 fhTimeDsupBC[nSupMod][nBC]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
965 fhTimeDsupLG[nSupMod]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
966 fhTimeDsupLGBC[nSupMod][nBC]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
974 fhTcellvsTOFT0->Fill(calcolot0, hkdtime-offset-offsetPerSM-L1shiftOffset);
977 hkdtime = hkdtime-timeBCoffset;
979 hkdtimecorr= hkdtime-offset-offsetPerSM-L1shiftOffset;
994 hkdtime = hkdtime - offsetPerSM - L1shiftOffset;
1014 caloClusters->Delete();
1015 delete caloClusters;
1043 AliDebug(1,
"ERROR: Output list not available");
1053 Int_t nCells = clus->GetNCells();
1058 AliDebug(1,
"very big cluster with enormous energy - cluster rejected");
1066 AliDebug(1,
"lambda0 loose cut failed - cluster rejected");
1073 Double_t Rtrack = TMath::Sqrt(Dx*Dx+Dz*Dz);
1076 AliDebug(1,
"track matched - cluster rejected");
1082 AliDebug(1,
"single cell cluster - cluster rejected");
1088 AliDebug(1,
"cluster energy < 1 GeV- cluster rejected");
1096 AliDebug(1,
"lambda0 strict cut failed - cluster rejected");
1110 UShort_t * index = clus->GetCellsAbsId() ;
1111 AliVCaloCells &cells= *(InputEvent()->GetEMCALCells());
1112 for(
Int_t i = 0; i < clus->GetNCells() ; i++) {
1113 if(cells.GetCellHighGain(index[i])==kFALSE)
return kTRUE;
1124 if(nSupMod < 10 || (nSupMod >= 12 && nSupMod <18) )
1126 if (0<=irow&&irow<8) iRCU=0;
1127 else if (8<=irow&&irow<16 && 0<=icol&&icol<24) iRCU=0;
1130 else if (8<=irow&&irow<16 && 24<=icol&&icol<48) iRCU=1;
1132 else if (16<=irow&&irow<24) iRCU=1;
1134 if (nSupMod%2==1) iRCU = 1 - iRCU;
1144 AliFatal(Form(
"Wrong EMCAL/DCAL RCU number = %d\n", iRCU));
1202 TFile *
file =
new TFile(inputFile.Data());
1219 TH1F *hAllTimeAvBC[4];
1220 TH1F *hAllTimeRMSBC[4];
1226 TH1F *hAllTimeAvLGBC[4];
1227 TH1F *hAllTimeRMSLGBC[4];
1229 if(isFinal==kFALSE){
1230 for(
Int_t i=0;i<4;i++){
1231 h1[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumBC%d",i));
1232 h2[i]=(TH1F *)list->FindObject(Form(
"RawTimeEntriesBC%d",i));
1233 h3[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumSqBC%d",i));
1235 h4[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumLGBC%d",i));
1236 h5[i]=(TH1F *)list->FindObject(Form(
"RawTimeEntriesLGBC%d",i));
1237 h6[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumSqLGBC%d",i));
1240 for(
Int_t i=0;i<4;i++){
1241 h1[i]=(TH1F *)list->FindObject(Form(
"hTimeSum%d",i));
1242 h2[i]=(TH1F *)list->FindObject(Form(
"hTimeEnt%d",i));
1243 h3[i]=(TH1F *)list->FindObject(Form(
"hTimeSumSq%d",i));
1245 h4[i]=(TH1F *)list->FindObject(Form(
"hTimeLGSum%d",i));
1246 h5[i]=(TH1F *)list->FindObject(Form(
"hTimeLGEnt%d",i));
1247 h6[i]=(TH1F *)list->FindObject(Form(
"hTimeLGSumSq%d",i));
1252 for(
Int_t i=0;i<4;i++){
1253 hAllTimeAvBC[i]=
new TH1F(Form(
"hAllTimeAvBC%d",i),Form(
"hAllTimeAvBC%d",i),h1[i]->GetNbinsX(),h1[i]->GetXaxis()->GetXmin(),h1[i]->GetXaxis()->GetXmax());
1254 hAllTimeRMSBC[i]=
new TH1F(Form(
"hAllTimeRMSBC%d",i),Form(
"hAllTimeRMSBC%d",i),h3[i]->GetNbinsX(),h3[i]->GetXaxis()->GetXmin(),h3[i]->GetXaxis()->GetXmax());
1256 hAllTimeAvLGBC[i]=
new TH1F(Form(
"hAllTimeAvLGBC%d",i),Form(
"hAllTimeAvLGBC%d",i),h4[i]->GetNbinsX(),h4[i]->GetXaxis()->GetXmin(),h4[i]->GetXaxis()->GetXmax());
1257 hAllTimeRMSLGBC[i]=
new TH1F(Form(
"hAllTimeRMSLGBC%d",i),Form(
"hAllTimeRMSLGBC%d",i),h6[i]->GetNbinsX(),h6[i]->GetXaxis()->GetXmin(),h6[i]->GetXaxis()->GetXmax());
1263 for(
Int_t i=0;i<4;i++){
1264 for(
Int_t j=1;j<=h1[i]->GetNbinsX();j++){
1266 if(h2[i]->GetBinContent(j)!=0){
1267 hAllTimeAvBC[i]->SetBinContent(j-1,h1[i]->GetBinContent(j)/h2[i]->GetBinContent(j));
1268 hAllTimeRMSBC[i]->SetBinContent(j-1,TMath::Sqrt(h3[i]->GetBinContent(j)/h2[i]->GetBinContent(j)) );
1270 hAllTimeAvBC[i]->SetBinContent(j-1,0.);
1271 hAllTimeRMSBC[i]->SetBinContent(j-1,0.);
1274 if(h5[i]->GetBinContent(j)!=0){
1275 hAllTimeAvLGBC[i]->SetBinContent(j-1,h4[i]->GetBinContent(j)/h5[i]->GetBinContent(j));
1276 hAllTimeRMSLGBC[i]->SetBinContent(j-1,TMath::Sqrt(h6[i]->GetBinContent(j)/h5[i]->GetBinContent(j)) );
1278 hAllTimeAvLGBC[i]->SetBinContent(j-1,0.);
1279 hAllTimeRMSLGBC[i]->SetBinContent(j-1,0.);
1286 TFile *fileNew=
new TFile(outputFile.Data(),
"recreate");
1287 for(
Int_t i=0;i<4;i++){
1288 hAllTimeAvBC[i]->Write();
1289 hAllTimeRMSBC[i]->Write();
1290 hAllTimeAvLGBC[i]->Write();
1291 hAllTimeRMSLGBC[i]->Write();
1299 for(
Int_t i=0;i<4;i++){
1300 delete hAllTimeAvBC[i];
1301 delete hAllTimeRMSBC[i];
1302 delete hAllTimeAvLGBC[i];
1303 delete hAllTimeRMSLGBC[i];
1369 TFile *
file =
new TFile(inputFile.Data());
1370 if(file==0x0)
return;
1376 ccBC[i]=(TH1F*) file->Get(Form(
"hAllTimeAvBC%d",i));
1377 shouldBeEmpty[i]=kFALSE;
1379 for(
Int_t j=0;j<upperLimit[19];j++){
1380 if(ccBC[i]->GetBinContent(j)>0.) emptyCounter++;
1382 if(emptyCounter<1500) shouldBeEmpty[i]=kTRUE;
1383 cout<<
"Non-zero channels "<<emptyCounter<<
" BC"<<i<<
" should be empty: "<<shouldBeEmpty[i]<<endl;
1386 TH1C *hRun=
new TH1C(Form(
"h%d",runNumber),Form(
"h%d",runNumber),19,0,19);
1389 Int_t minimumIndex=-1;
1393 TF1 *f1=
new TF1(
"f1",
"pol0",0,17664);
1400 for(
Int_t i=0;i<20;i++){
1403 if(shouldBeEmpty[j]) {
1407 fitResult=ccBC[j]->Fit(
"f1",
"CQ",
"",lowerLimit[i],upperLimit[i]);
1411 printf(
"Fit failed for SM %d BC%d, integral %f\n",i,j,ccBC[j]->Integral(lowerLimit[i],upperLimit[i]));
1414 fitParameter = f1->GetParameter(0);
1416 if(offset100 && (j==0 || j==1)) {
1420 meanBC[j]=fitParameter;
1422 if(fitParameter>0 && fitParameter<minimumValue){
1423 minimumValue = fitParameter;
1428 if( minimumValue/25-(
Int_t)(minimumValue/25)>0.5 ) {
1429 L1shift=(
Int_t)(minimumValue/25.)+1;
1431 L1shift=(
Int_t)(minimumValue/25.);
1434 if(TMath::Abs(minimumValue/25-(
Int_t)(minimumValue/25)-0.5)<0.05)
1435 printf(
"Run %d, SM %d, min %f, next_min %f, next+1_min %f, next+2_min %f, min/25 %f, min%%25 %d, next_min/25 %f, next+1_min/25 %f, next+2_min/25 %f, SMmin %d\n",runNumber,i,minimumValue,meanBC[(minimumIndex+1)%4],meanBC[(minimumIndex+2)%4],meanBC[(minimumIndex+3)%4],minimumValue/25., (
Int_t)((
Int_t)minimumValue%25), meanBC[(minimumIndex+1)%4]/25., meanBC[(minimumIndex+2)%4]/25., meanBC[(minimumIndex+3)%4]/25., L1shift*25);
1437 if(justL1phase) totalValue = minimumIndex;
1438 else totalValue = L1shift<<2 | minimumIndex ;
1441 hRun->SetBinContent(i,totalValue);
1443 for(iorder=minimumIndex;iorder<minimumIndex+4-1;iorder++){
1444 if( meanBC[(iorder+1)%4] <= meanBC[iorder%4] ) orderTest=kFALSE;
1447 printf(
"run %d, SM %d, min index %d meanBC %f %f %f %f, order ok? %d\n",runNumber,i,minimumIndex,meanBC[0],meanBC[1],meanBC[2],meanBC[3],orderTest);
1451 if(shouldBeEmpty[0] || shouldBeEmpty[1] || shouldBeEmpty[2] || shouldBeEmpty[3]){
1452 Double_t newMean = meanBC[minimumIndex]-600;
1453 if(newMean<=12.5) hRun->SetBinContent(i,minimumIndex);
1455 Int_t minIndexTmp=-1;
1456 if(newMean/25. - (
Int_t)(newMean/25.) <0.5)
1457 minIndexTmp = (
Int_t)(newMean/25.);
1459 minIndexTmp = 1+(
Int_t)(newMean/25.);
1461 hRun->SetBinContent(i,(4-minIndexTmp+minimumIndex)%4);
1464 cout <<
"run with missing BC; new L1 phase set to " << hRun->GetBinContent(i)<<endl;
1469 TFile *fileNew=
new TFile(outputFile.Data(),
"update");
1482 AliOADBContainer *contBC=
new AliOADBContainer(
"");
1483 contBC->InitFromFile(Form(
"%s/EMCALBadChannels.root",
"$ALICE_PHYSICS/OADB/EMCAL"),
"AliEMCALBadChannels");
1484 printf(
"contBC %p, ent %d\n",contBC,contBC->GetNumberOfEntries());
1487 AliInfo(
"Remove EMCAL bad cells");
1490 TH2I *hbm = (TH2I*)arrayBC->FindObject(Form(
"EMCALBadChannelMap_Mod%d",i));
1492 AliError(Form(
"Can not get EMCALBadChannelMap_Mod%d",i));
1495 hbm->SetDirectory(0);
1499 }
else AliInfo(
"Do NOT remove EMCAL bad channels\n");
1511 if(referenceFile==0x0) {
1512 AliFatal(
"*** NO bad channel map FILE");
1515 TH1F *hbm = (TH1F*)referenceFile->Get(
"h1");
1517 AliError(
"Can not get EMCALBadChannelMap");
Bool_t SetEMCalGeometry()
Set the EMCal Geometry.
TH1F * fhRawTimeEntriesLGBC[kNBCmask]
! 4 BCmask LG
Double_t fPassTimeMax
upper range of histo with time in passX
TH2F * fhEneVsAbsIdHG
! energy of each cell for high gain cells with strange time
TH1F * fhRawTimeSumLGBC[kNBCmask]
! 4 BCmask LG
virtual void UserCreateOutputObjects()
Bool_t AcceptCluster(AliVCluster *clus)
Selection criteria of good cluster are set here.
TH2F * fhRawTimeVsIdBC[kNBCmask]
! 4 BCmask HG
Int_t fFineNbins
number of bins of histo with T0 time
TH1F * fhRawTimeSumSqBC[kNBCmask]
! 4 BCmask HG
TString fGeometryName
geometry name
TH1F * fhTimeEnt[kNBCmask]
! 4
Double_t fMinLambda0
minimum cluster lambda0
Int_t fEnergyLGNbins
number of bins of histo with energy LG
Int_t GetEMCALChannelStatus(Int_t iSM, Int_t iCol, Int_t iRow) const
TH1F * fhcalcEvtTime
! spectrum calcolot0[0]
Bool_t fBadReco
flag to apply 100ns shift and L1 shift
Double_t fEnergyMin
lower range of histo with energy HG
TString fReferenceRunByRunFileName
name of reference file (run-by-run)
TObjArray * fL1PhaseList
array with phases for set of runs
TH2F * fhTimeVsBC
!cell time vs BC
Double_t fMinTime
minimum cluster time after correction
AliTOFT0maker * fTOFmaker
pointer to get T0 from TOF
Double_t fFineTmax
upper range of histo with T0 time
void SetDefaultCuts()
Set default cuts for calibration.
Int_t fSetBadChannelMapSource
switch to load BC map 0-no BC,1-OADB,2-file
AliAnalysisTaskEMCALTimeCalib()
void LoadBadChannelMap()
Load Bad Channel Map from different source.
Double_t fRawTimeMin
lower range of histo with raw time
TH2F * fhTcellvsSM
! cell time vs SM
TH2F * fhTimeDsupLG[kNSM]
! 20 SM low gain
TH1F * fhRawTimeSumSqLGBC[kNBCmask]
! 4 BCmask LG
Double_t fMaxRtrack
maximum cluster track distance
void LoadBadChannelMapOADB()
Double_t fMaxLambda0
maximum cluster lambda0
AliEMCALGeometry * fgeom
pointer to EMCal geometry
Double_t fRawTimeMax
upper range of histo with raw time
TH2F * fhTcellvsTOFT0HD
! time of cell vs TOF T0 time for higher energy threshold
TH2F * fhRawCorrTimeVsIdBC[kNBCmask]
! 4 BCmask HG
Bool_t fMostEneCellOnly
flag to use calibration on most energetic cell in cluster only
TH2F * fhRawCorrTimeVsIdLGBC[kNBCmask]
! 4 BCmask LG
Bool_t IsLowGainCellInCluster(AliVCluster *clus)
Check if low gain cell is in a cluster.
Double_t fMaxTime
maximum cluster time after correction
Double_t fEnergyMax
upper range of histo with energy HG
Double_t fMinClusterEnergy
minimum cluster energy
void LoadReferenceRunByRunHistos()
static void ProduceOffsetForSMsV2(Int_t runNumber, TString inputFile="Reference.root", TString outputFile="ReferenceSM.root", Bool_t offset100=kTRUE, Bool_t justL1phase=kTRUE)
TH1F * fhTimeLGEnt[kNBCmask]
! 4
TObjArray * fBadChannelMapArray
bad channel map array
Double_t fEnergyLGMax
upper range of histo with energy LG
Double_t fFineTmin
lower range of histo with T0 time
TString fReferenceFileName
! name of reference file (for one period)
Int_t fMaxNcells
maximum number of cells in cluster
virtual void UserExec(Option_t *option)
Main loop executed for each event.
virtual void PrepareTOFT0maker()
Get T0 time from TOF.
TH1F * fhTimeSumSq[kNBCmask]
! 4
Bool_t fPileupFromSPD
flag to set PileupFromSPD
TH1F * fhTimeLGSumSq[kNBCmask]
! 4
TH1F * fhRawTimeSumBC[kNBCmask]
! 4 BCmask HG
Double_t fMinCellEnergy
minimum cell energy
void LoadBadChannelMapFile()
Int_t fMinNcells
minimum number of cells in cluster
Double_t fEnergyLGMin
lower range of histo with energy LG
Task to work on Time Calibration for EMCal/DCal.
Double_t fMinLambda0LG
minimum cluster lambda0 Low Gain
Double_t fMaxClusterEnergy
maximum cluster energy
Bool_t fBadChannelMapSet
flag whether bad channel map is set
TH1F * fhEvtTimeHeader
! spectrum time from header
TH1F * fhEvtTimeDiff
! spectrum time difference
TH1F * fhAllAverageBC[kNBCmask]
TH2F * fhTcellvsTOFT0
! time of cell vs TOF T0 time
Double_t fPassTimeMin
lower range of histo with time in passX
Double_t fMaxLambda0LG
maximum cluster lambda0 Low Gain
static void ProduceCalibConsts(TString inputFile="time186319testWOL0.root", TString outputFile="Reference.root", Bool_t isFinal=kFALSE)
TH2F * fhEneVsAbsIdLG
! energy of each cell for low gain cells with strange time
Int_t fPassTimeNbins
number of bins of histo with time in passX
TList * fOutputList
pointer to output list
TH1F * fhRawTimeEntriesBC[kNBCmask]
! 4 BCmask HG
TH2F * fhTimeVsIdBC[kNBCmask]
! 4 BCmask HG
TH1C * fhRefRuns
4 BCmask Low gain
TFile * file
TList with histograms for a given trigger.
TH2F * fhTimeVsIdLGBC[kNBCmask]
! 4 BCmask LG
TH1F * fhEventType
! event type
void SetL1PhaseReferenceForGivenRun()
Bool_t CheckCellRCU(Int_t nSupMod, Int_t icol, Int_t irow)
Check RCU for cell given by Super Module, column index, row index.
TH2F * fhRawTimeVsIdLGBC[kNBCmask]
! 4 BCmask LG
void LoadReferenceHistos()
Load reference Histograms (for one period) from file.
TH1F * fhTimeSum[kNBCmask]
! 4
TString fBadChannelFileName
name of file with bad channels
virtual void Terminate(Option_t *)
TH1F * fhAllAverageLGBC[kNBCmask]
4 BCmask High gain
Bool_t fFillHeavyHisto
flag to fill heavy histograms
Int_t fEnergyNbins
number of bins of histo with energy HG
Int_t fRunNumber
! run number
Int_t fRawTimeNbins
number of bins of histo with raw time
TH2F * fhTimeDsup[kNSM]
! 20 SM high gain
TH1F * fhTimeLGSum[kNBCmask]
! 4
TH2F * fhTimeDsupBC[kNSM][kNBCmask]
! 20 x 4 high gain
TH2F * fhTimeDsupLGBC[kNSM][kNBCmask]
! 20 x 4 low gain