27 #include <TGeoManager.h> 28 #include <TRefArray.h> 32 #include "AliAnalysisTask.h" 33 #include "AliAnalysisManager.h" 34 #include "AliESDEvent.h" 35 #include "AliAODEvent.h" 36 #include "AliVEvent.h" 37 #include "AliESDInputHandler.h" 38 #include "AliAODInputHandler.h" 41 #include "AliCDBManager.h" 42 #include "AliRunTag.h" 45 #include "AliVCluster.h" 46 #include "AliESDCaloCluster.h" 47 #include "AliVCaloCells.h" 48 #include "AliESDCaloCells.h" 49 #include "AliAODCaloCluster.h" 50 #include "AliAODCaloCells.h" 51 #include "AliEMCALGeometry.h" 52 #include "AliOADBContainer.h" 53 #include "AliDataFile.h" 84 fReferenceRunByRunFileName(),
85 fPileupFromSPD(kFALSE),
88 fMostEneCellOnly(kFALSE),
106 fFillHeavyHisto(kFALSE),
107 fBadChannelMapArray(),
108 fBadChannelMapSet(kFALSE),
109 fSetBadChannelMapSource(0),
110 fBadChannelFileName(),
115 fhTOFT0vsEventNumber(0),
137 fhRawTimeEntriesBC(),
141 fhRawTimeEntriesLGBC(),
142 fhRawTimeSumSqLGBC(),
143 fhRawCorrTimeVsIdBC(),
144 fhRawCorrTimeVsIdLGBC(),
185 DefineInput(0, TChain::Class());
189 DefineOutput(1, TList::Class());
212 AliFatal(
"*** NO REFERENCE FILE");
214 AliDebug(1,
"*** OK TFILE");
219 if(
fhAllAverageBC[i]==0x0) AliFatal(Form(
"Reference histogram for BC%d does not exist",i));
220 if(
fhAllAverageBC[i]->GetEntries()==0)AliWarning(Form(
"fhAllAverageLGBC[%d]->GetEntries() = 0",i));
222 if(
fhAllAverageLGBC[i]==0x0) AliFatal(Form(
"Reference LG histogram for BC%d does not exist",i));
223 if(
fhAllAverageLGBC[i]->GetEntries()==0)AliFatal(Form(
"fhAllAverageLGBC[%d]->GetEntries() = 0",i));
233 AliFatal(
"You require to load reference histos from file but FILENAME is not provided");
245 if(referenceFile==0x0) {
246 AliFatal(
"*** NO REFERENCE R-B-R FILE");
253 TIter next(referenceFile->GetListOfKeys());
255 while ((key=(TKey*)next())) {
256 fL1PhaseList->AddLast((TH1F*)referenceFile->Get(key->GetName()) );
261 AliFatal(
"You require to load reference run-by-run histos from file but FILENAME is not provided");
273 AliFatal(
"Array with reference L1 phase histograms do not exist in memory");
277 AliFatal(
"Negative run number");
283 AliError(Form(
"Reference histogram for run %d does not exist. Use Default",
fRunNumber));
292 if(
fhRefRuns->GetEntries()==0)AliWarning(
"fhRefRuns->GetEntries() = 0");
293 AliDebug(1,Form(
"hRefRuns entries %d", (
Int_t)
fhRefRuns->GetEntries() ));
301 AliFatal(
"fCurrentPARs not properly set! Unable to get PAR information.");
314 if(refName.CompareTo(correctName)==0)
return;
319 AliFatal(
"Array with reference L1 phase histograms do not exist in memory");
323 AliFatal(
"Negative run number");
336 if(
fhRefRuns->GetEntries()==0)AliWarning(
"fhRefRuns->GetEntries() = 0");
337 AliDebug(1,Form(
"hRefRuns entries %d", (
Int_t)
fhRefRuns->GetEntries() ));
346 AliDebug(1,
"AnalysisTaskEMCalTimeCalib::NotifyRun()");
347 AliDebug(2,Form(
"Notify(): EMCal geometry: fgeom = %p, fGeometryName=%s\n ",
fgeom,
fGeometryName.Data()));
351 AliFatal(
"ERROR: InputEvent not set");
354 else AliDebug(1,
"Good, InputEvent set");
385 AliDebug(1,
"AliAnalysisTaskEMCALTimeCalib::SetEMCalGeometry()");
388 AliInfo(Form(
"Get EMCAL geometry name <%s> for run %d",
fgeom->GetName(),
fRunNumber));
391 AliInfo(Form(
"Set EMCAL geometry name to <%s>",
fGeometryName.Data()));
395 AliWarning(
"Make sure the EMCal geometry is set properly !");
397 AliDebug(1,Form(
"EMCal geometry properly set: fGeom = %p, fGeometryName=%s",
fgeom,
fGeometryName.Data()));
408 AliInfo(Form(
"<D> -- Run # = %d",
fRunNumber));
409 AliInfo(
"prepare TOFT0maker!!");
413 AliCDBManager * cdb = AliCDBManager::Instance();
414 cdb->SetDefaultStorage(
"raw://");
439 AliDebug(1,
"AliAnalysisTaskEMCALTimeCalib::UserCreateOutputObjects()");
441 const Int_t nChannels = 17664;
457 fhEventType =
new TH1F(
"fhEventType",
"event type",10, 0.,10.);
459 fhEventType->GetXaxis()->SetBinLabel(1 ,
"1=No ESD");
460 fhEventType->GetXaxis()->SetBinLabel(2 ,
"2=Pileup");
461 fhEventType->GetXaxis()->SetBinLabel(3 ,
"3=No Trigger");
462 fhEventType->GetXaxis()->SetBinLabel(4 ,
"4=Evt Type != 7");
463 fhEventType->GetXaxis()->SetBinLabel(5 ,
"5=INT7,8");
464 fhEventType->GetXaxis()->SetBinLabel(6 ,
"6=EMC7,8");
465 fhEventType->GetXaxis()->SetBinLabel(7 ,
"7=L1 EMCal");
466 fhEventType->GetXaxis()->SetBinLabel(8 ,
"8=DMC7,8");
467 fhEventType->GetXaxis()->SetBinLabel(9 ,
"9=L1 DCal");
470 fhEventType ->GetYaxis()->SetTitle(
"Counts (a.u.)");
478 fhEneVsAbsIdHG =
new TH2F(
"fhEneVsAbsIdHG",
"energy vs ID for HG",1000,0,18000,200,0,10);
479 fhEneVsAbsIdLG =
new TH2F(
"fhEneVsAbsIdLG",
"energy vs ID for LG",1000,0,18000,200,0,40);
484 if(!mgr) AliFatal(
"No Analysis Manager available...\n");
485 Int_t runNum = mgr->GetRunFromPath();
489 AliFatal(
"Run Number not correctly set in UserCreateOutputObjects()!");
496 TH2F* fRawTimeSinglePAR;
497 TH2F* fRawTimeLGSinglePAR;
498 std::vector<TH2F*> vecRawTimePAR;
499 std::vector<TH2F*> vecRawTimeLGPAR;
501 fRawTimeSinglePAR =
new TH2F(Form(
"RawTimeBeforePAR%dBC%d",iPAR+1, iBC),
502 Form(
"cell raw time vs ID for high gain BC %d ", iBC),
504 fRawTimeLGSinglePAR =
new TH2F(Form(
"RawTimeLGBeforePAR%dBC%d",iPAR+1, iBC),
505 Form(
"cell raw time vs ID for low gain BC %d ", iBC),
507 vecRawTimePAR.push_back(fRawTimeSinglePAR);
508 vecRawTimeLGPAR.push_back(fRawTimeLGSinglePAR);
520 Form(
"cell Sum Square time HG, BC %d ", i),
525 fhTimeSum[i] =
new TH1F(Form(
"hTimeSum%d", i),
526 Form(
"cell Sum time HG, BC %d ", i),
531 fhTimeEnt[i] =
new TH1F(Form(
"hTimeEnt%d", i),
532 Form(
"cell Entries HG, BC %d ", i),
534 fhTimeEnt[i]->SetYTitle(
"Entries for Time ");
539 Form(
"cell Sum Square time LG, BC %d ", i),
545 Form(
"cell Sum time LG, BC %d ", i),
551 Form(
"cell Entries LG, BC %d ", i),
560 Form(
"cell raw time vs ID for high gain BC %d ", i),
567 Form(
"sum of cell raw time for high gain BC %d ", i),
573 Form(
"No. entries of cells raw time for high gain BC %d ", i),
579 Form(
"sum of (cell raw time)^2 for high gain BC %d ", i),
587 Form(
"cell raw time vs ID for low gain BC %d ", i),
594 Form(
"sum of cell raw time for low gain BC %d ", i),
600 Form(
"No. entries of cells raw time for low gain BC %d ", i),
606 Form(
"sum of (cell raw time)^2 for low gain BC %d ", i),
614 Form(
"cell L1 shift and 100ns corrected raw time vs ID for high gain BC %d ", i),
620 Form(
"cell L1 shift and 100ns corrected raw time vs ID for low gain BC %d ", i),
629 Form(
"cell time corrected for L1 shift, 100ns and L1 phase vs ID for high gain BC %d ", i),
635 Form(
"cell time corrected for L1 shift, 100ns and L1 phase vs ID for low gain BC %d ", i),
645 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);
650 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);
659 fhTimeDsup[jj] =
new TH2F(Form(
"SupMod%d",jj), Form(
"SupMod %d time_vs_E, high gain",jj),
fEnergyNbins,
fEnergyMin,
fEnergyMax,
fPassTimeNbins,
fPassTimeMin,
fPassTimeMax);
664 fhTimeDsupLG[jj] =
new TH2F(Form(
"SupMod%dLG",jj), Form(
"SupMod %d time_vs_E, low gain ",jj),
fEnergyLGNbins,
fEnergyLGMin,
fEnergyLGMax,
fPassTimeNbins,
fPassTimeMin,
fPassTimeMax);
752 AliDebug(2,Form(
"UserExec: EMCal geometry: fgeom = %p fGeometryName %s",
fgeom,
fGeometryName.Data()));
753 AliVEvent *
event = InputEvent();
756 AliDebug(2,Form(
"TOF time from header %f ps",event->GetTOFHeader()->GetDefaultEventTimeVal()));
761 AliError(
"ESD not available, exit");
767 if(event->IsPileupFromSPD(3,0.8,3.,2.,5.)){
768 AliDebug(1,
"Event: PileUp skip.");
774 TString triggerclasses =
event->GetFiredTriggerClasses();
775 if(triggerclasses==
"") {
780 Int_t eventType = ((AliVHeader*)event->GetHeader())->GetEventType();
782 AliDebug(1,Form(
"Triggerclasses %s, eventType %d",triggerclasses.Data(),eventType));
797 if(triggerclasses.Contains(
"CINT7-B-NOPF-ALLNOTRD") ||
798 triggerclasses.Contains(
"CINT7-I-NOPF-ALLNOTRD") ||
799 triggerclasses.Contains(
"CINT1-I-NOPF-ALLNOTRD") ||
800 triggerclasses.Contains(
"CINT1-B-NOPF-ALLNOTRD") ||
801 triggerclasses.Contains(
"CINT8") ||
802 triggerclasses.Contains(
"CINT7") ||
803 triggerclasses.Contains(
"CPBI2_B1-B-NOPF-ALLNOTRD") ) bMB = kTRUE;
805 if(triggerclasses.Contains(
"CEMC7-B-NOPF-CENTNOTRD") ||
806 triggerclasses.Contains(
"CEMC1-B-NOPF-CENTNOTRD") ||
807 triggerclasses.Contains(
"CEMC7") ||
808 triggerclasses.Contains(
"CEMC8") ||
809 triggerclasses.Contains(
"CEMC8-B-NOPF-CENTNOTRD") ) bL0 = kTRUE;
811 if(triggerclasses.Contains(
"CDMC7-B-NOPF-CENTNOTRD") ||
812 triggerclasses.Contains(
"CDMC1-B-NOPF-CENTNOTRD") ||
813 triggerclasses.Contains(
"CDMC7") ||
814 triggerclasses.Contains(
"CDMC8") ||
815 triggerclasses.Contains(
"CDMC8-B-NOPF-CENTNOTRD") ) bDL0 = kTRUE;
817 if(triggerclasses.Contains(
"CEMC7EG1-B-NOPF-CENTNOTRD") ||
818 triggerclasses.Contains(
"CEMC7EG2-B-NOPF-CENTNOTRD") ||
819 triggerclasses.Contains(
"CEMC8EG1-B-NOPF-CENTNOTRD") ||
820 triggerclasses.Contains(
"CEMC8EGA") ||
821 triggerclasses.Contains(
"CEMC7EGA") ||
822 triggerclasses.Contains(
"CEMC7EG1-B") ||
823 triggerclasses.Contains(
"CEMC7EG2-B") ||
824 triggerclasses.Contains(
"CPBI2EGA") ) bL1G = kTRUE;
826 if(triggerclasses.Contains(
"CDMC7DG1-B-NOPF-CENTNOTRD") ||
827 triggerclasses.Contains(
"CDMC7DG2-B-NOPF-CENTNOTRD") ||
828 triggerclasses.Contains(
"CDMC8DG1-B-NOPF-CENTNOTRD") ||
829 triggerclasses.Contains(
"CDMC8DGA") ||
830 triggerclasses.Contains(
"CDMC7DGA") ||
831 triggerclasses.Contains(
"CDMC7DG1-B") ||
832 triggerclasses.Contains(
"CDMC7DG2-B") ||
833 triggerclasses.Contains(
"CPBI2DGA") ) bDL1G = kTRUE;
835 if(triggerclasses.Contains(
"CEMC7EJ1-B-NOPF-CENTNOTRD") ||
836 triggerclasses.Contains(
"CEMC7EJ2-B-NOPF-CENTNOTRD") ||
837 triggerclasses.Contains(
"CEMC8EJ1-B-NOPF-CENTNOTRD") ||
838 triggerclasses.Contains(
"CEMC7EJE") ||
839 triggerclasses.Contains(
"CEMC8EJE") ||
840 triggerclasses.Contains(
"CEMC7EJ1-B") ||
841 triggerclasses.Contains(
"CEMC7EJ2-B") ||
842 triggerclasses.Contains(
"CPBI2EJE") ) bL1J = kTRUE;
844 if(triggerclasses.Contains(
"CDMC7DJ1-B-NOPF-CENTNOTRD") ||
845 triggerclasses.Contains(
"CDMC7DJ2-B-NOPF-CENTNOTRD") ||
846 triggerclasses.Contains(
"CDMC8DJ1-B-NOPF-CENTNOTRD") ||
847 triggerclasses.Contains(
"CDMC7DJE") ||
848 triggerclasses.Contains(
"CDMC8DJE") ||
849 triggerclasses.Contains(
"CDMC7DJ1-B") ||
850 triggerclasses.Contains(
"CDMC7DJ2-B") ||
851 triggerclasses.Contains(
"CPBI2DJE") ) bDL1J = kTRUE;
885 TRefArray* caloClusters =
new TRefArray();
886 event->GetEMCALClusters(caloClusters);
889 Int_t BunchCrossNumber =
event->GetBunchCrossNumber();
893 Int_t L1phaseshift=0;
895 Int_t L1shiftOffset=0;
898 nBC = BunchCrossNumber%4;
904 Int_t nclus = caloClusters->GetEntries();
905 AliDebug(1,Form(
"###########Bunch Cross nb = %d nclus = %d",nBC,nclus ));
909 AliVCaloCells &cells= *(
event->GetEMCALCells());
911 Int_t nSupMod=-1, nModule=-1;
912 Int_t iphi=-1, ieta=-1, nIphi=-1, nIeta=-1;
922 ULong64_t eventBC = (ULong64_t)event->GetBunchCrossNumber();
923 ULong64_t eventOrbit = ((ULong64_t)(3564))*((ULong64_t)
event->GetOrbitNumber());
924 ULong64_t eventPeriod = ((ULong64_t)(59793994260))*((ULong64_t)(
event->GetPeriodNumber()));
926 ULong64_t globalBC = eventBC + eventOrbit + eventPeriod;
936 for (
Int_t icl = 0; icl < nclus; icl++) {
938 AliVCluster* clus = (AliVCluster*)caloClusters->At(icl);
943 UShort_t * index = clus->GetCellsAbsId() ;
949 for(
Int_t i = 0; i < clus->GetNCells() ; i++) {
951 amp = cells.GetCellAmplitude(absId) ;
959 for(
Int_t i = 0; i < clus->GetNCells() ; i++) {
966 hkdtime = cells.GetCellTime(absId) * 1.0e09;
967 amp = cells.GetCellAmplitude(absId) ;
968 isHighGain = cells.GetCellHighGain(absId);
971 fgeom->GetCellIndex(absId, nSupMod, nModule, nIphi, nIeta);
972 fgeom->GetCellPhiEtaIndexInSModule(nSupMod,nModule,nIphi,nIeta, iphi,ieta);
1018 fhTimeVsBC->Fill(1.*BunchCrossNumber,hkdtime-timeBCoffset);
1020 if(isHighGain==kTRUE){
1024 AliFatal(Form(
"Reference histogram for BC%d not properly loaded",nBC));
1030 AliFatal(Form(
"Reference LG histogram for BC%d not properly loaded",nBC));
1045 L1phase = L1phaseshift & 3;
1047 offsetPerSM = (nBC - L1phase)*25;
1049 offsetPerSM = (nBC - L1phase + 4)*25;
1054 L1shiftOffset = L1phaseshift>>2;
1057 if(nBC==0 || nBC==1) L1shiftOffset-=100.;
1060 AliFatal(
"Reference histogram run-by-run not properly loaded");
1076 fhTimeVsIdBC[nBC]->Fill(absId,hkdtime-L1shiftOffset-offsetPerSM);
1078 fhTimeVsIdLGBC[nBC]->Fill(absId,hkdtime-L1shiftOffset-offsetPerSM);
1085 fhTimeDsup[nSupMod]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
1086 fhTimeDsupBC[nSupMod][nBC]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
1088 fhTimeDsupLG[nSupMod]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
1089 fhTimeDsupLGBC[nSupMod][nBC]->Fill(amp,hkdtime-offset-offsetPerSM-L1shiftOffset);
1100 hkdtime = hkdtime-timeBCoffset;
1102 hkdtimecorr= hkdtime-offset-offsetPerSM-L1shiftOffset;
1117 hkdtime = hkdtime - offsetPerSM - L1shiftOffset;
1137 caloClusters->Delete();
1138 delete caloClusters;
1166 AliDebug(1,
"ERROR: Output list not available");
1176 Int_t nCells = clus->GetNCells();
1181 AliDebug(1,
"very big cluster with enormous energy - cluster rejected");
1189 AliDebug(1,
"lambda0 loose cut failed - cluster rejected");
1196 Double_t Rtrack = TMath::Sqrt(Dx*Dx+Dz*Dz);
1199 AliDebug(1,
"track matched - cluster rejected");
1205 AliDebug(1,
"single cell cluster - cluster rejected");
1211 AliDebug(1,
"cluster energy < 1 GeV- cluster rejected");
1219 AliDebug(1,
"lambda0 strict cut failed - cluster rejected");
1233 UShort_t * index = clus->GetCellsAbsId() ;
1234 AliVCaloCells &cells= *(InputEvent()->GetEMCALCells());
1235 for(
Int_t i = 0; i < clus->GetNCells() ; i++) {
1236 if(cells.GetCellHighGain(index[i])==kFALSE)
return kTRUE;
1247 if(nSupMod < 10 || (nSupMod >= 12 && nSupMod <18) )
1249 if (0<=irow&&irow<8) iRCU=0;
1250 else if (8<=irow&&irow<16 && 0<=icol&&icol<24) iRCU=0;
1253 else if (8<=irow&&irow<16 && 24<=icol&&icol<48) iRCU=1;
1255 else if (16<=irow&&irow<24) iRCU=1;
1257 if (nSupMod%2==1) iRCU = 1 - iRCU;
1267 AliFatal(Form(
"Wrong EMCAL/DCAL RCU number = %d\n", iRCU));
1325 TFile *
file =
new TFile(inputFile.Data());
1343 while((obj = next())){
1345 if(name.BeginsWith(
"RawTimeBeforePAR")) counter++;
1348 numPARs =
Int_t(counter/4) - 1;
1349 printf(
"number of PARs found to be %d!\n", numPARs);
1351 if(numPARs == -1) isPAR = kFALSE;
1357 TH1F *hAllTimeAvBC[4];
1358 TH1F *hAllTimeRMSBC[4];
1364 TH1F *hAllTimeAvLGBC[4];
1365 TH1F *hAllTimeRMSLGBC[4];
1368 TH1F *h1PAR[numPARs+1][4];
1369 TH1F *h2PAR[numPARs+1][4];
1371 TH1F *hAllTimeAvBCPAR[numPARs+1][4];
1372 TH1F *hAllTimeRMSBCPAR[numPARs+1][4];
1374 TH1F *h4PAR[numPARs+1][4];
1375 TH1F *h5PAR[numPARs+1][4];
1377 TH1F *hAllTimeAvLGBCPAR[numPARs+1][4];
1378 TH1F *hAllTimeRMSLGBCPAR[numPARs+1][4];
1383 if(isFinal==kFALSE){
1384 for(
Int_t i=0;i<4;i++){
1385 h1[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumBC%d",i));
1386 h2[i]=(TH1F *)list->FindObject(Form(
"RawTimeEntriesBC%d",i));
1387 h3[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumSqBC%d",i));
1389 h4[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumLGBC%d",i));
1390 h5[i]=(TH1F *)list->FindObject(Form(
"RawTimeEntriesLGBC%d",i));
1391 h6[i]=(TH1F *)list->FindObject(Form(
"RawTimeSumSqLGBC%d",i));
1394 for(
Int_t iPAR = 0; iPAR <= numPARs; iPAR++){
1395 raw2D[i] = (
TH2D*)list->FindObject(Form(
"RawTimeBeforePAR%dBC%d", iPAR+1, i));
1396 rawLG2D[i] = (
TH2D*)list->FindObject(Form(
"RawTimeLGBeforePAR%dBC%d", iPAR+1, i));
1397 h1PAR[iPAR][i] =
new TH1F(Form(
"hAllTimeSumPAR%dBC%d",iPAR, i), Form(
"hAlltimeSumPAR%dBC%d",iPAR, i), raw2D[i]->GetXaxis()->GetNbins(), raw2D[i]->GetXaxis()->GetXmin(), raw2D[i]->GetXaxis()->GetXmax());
1398 hAllTimeAvBCPAR[iPAR][i] =
new TH1F(Form(
"hAllTimeAvPAR%dBC%d",iPAR, i), Form(
"hAlltimeAvPAR%dBC%d",iPAR, i), raw2D[i]->GetXaxis()->GetNbins(), raw2D[i]->GetXaxis()->GetXmin(), raw2D[i]->GetXaxis()->GetXmax());
1399 h2PAR[iPAR][i] = (TH1F*)raw2D[i]->ProjectionX(Form(
"hAllTimeEntriesPAR%dBC%d",iPAR, i), 0, raw2D[i]->GetYaxis()->GetNbins());
1401 h4PAR[iPAR][i] =
new TH1F(Form(
"hAllTimeSumLGPAR%dBC%d",iPAR, i), Form(
"hAllTimeSumLGPAR%dBC%d",iPAR, i), raw2D[i]->GetXaxis()->GetNbins(), raw2D[i]->GetXaxis()->GetXmin(), raw2D[i]->GetXaxis()->GetXmax());
1402 hAllTimeAvLGBCPAR[iPAR][i] =
new TH1F(Form(
"hAllTimeAvLGPAR%dBC%d",iPAR, i), Form(
"hAlltimeAvLGPAR%dBC%d",iPAR, i), raw2D[i]->GetXaxis()->GetNbins(), raw2D[i]->GetXaxis()->GetXmin(), raw2D[i]->GetXaxis()->GetXmax());
1403 h5PAR[iPAR][i] = (TH1F*)raw2D[i]->ProjectionX(Form(
"hAllTimeEntriesPAR%dLGBC%d",iPAR, i), 0, raw2D[i]->GetYaxis()->GetNbins());
1404 for(
int ixbin = 0; ixbin < raw2D[i]->GetXaxis()->GetNbins(); ixbin++){
1405 float sumtime = 0.0;
1406 float sumLGtime = 0.0;
1407 for(
int iybin = 0; iybin < raw2D[i]->GetYaxis()->GetNbins(); iybin++){
1408 sumtime += raw2D[i]->GetBinContent(ixbin, iybin)*raw2D[i]->GetYaxis()->GetBinCenter(iybin);
1409 sumLGtime += rawLG2D[i]->GetBinContent(ixbin, iybin)*rawLG2D[i]->GetYaxis()->GetBinCenter(iybin);
1411 h1PAR[iPAR][i]->SetBinContent(ixbin, sumtime);
1412 h4PAR[iPAR][i]->SetBinContent(ixbin, sumLGtime);
1413 if(h2PAR[iPAR][i]->GetBinContent(ixbin) ==0){
1414 hAllTimeAvBCPAR[iPAR][i]->SetBinContent(ixbin, 0);
1416 hAllTimeAvBCPAR[iPAR][i]->SetBinContent(ixbin, h1PAR[iPAR][i]->GetBinContent(ixbin)/h2PAR[iPAR][i]->GetBinContent(ixbin));
1419 if(h5PAR[iPAR][i]->GetBinContent(ixbin) ==0){
1420 hAllTimeAvLGBCPAR[iPAR][i]->SetBinContent(ixbin, 0);
1422 hAllTimeAvLGBCPAR[iPAR][i]->SetBinContent(ixbin, h4PAR[iPAR][i]->GetBinContent(ixbin)/h5PAR[iPAR][i]->GetBinContent(ixbin));
1430 for(
Int_t i=0;i<4;i++){
1431 h1[i]=(TH1F *)list->FindObject(Form(
"hTimeSum%d",i));
1432 h2[i]=(TH1F *)list->FindObject(Form(
"hTimeEnt%d",i));
1433 h3[i]=(TH1F *)list->FindObject(Form(
"hTimeSumSq%d",i));
1435 h4[i]=(TH1F *)list->FindObject(Form(
"hTimeLGSum%d",i));
1436 h5[i]=(TH1F *)list->FindObject(Form(
"hTimeLGEnt%d",i));
1437 h6[i]=(TH1F *)list->FindObject(Form(
"hTimeLGSumSq%d",i));
1442 for(
Int_t i=0;i<4;i++){
1443 hAllTimeAvBC[i]=
new TH1F(Form(
"hAllTimeAvBC%d",i),Form(
"hAllTimeAvBC%d",i),h1[i]->GetNbinsX(),h1[i]->GetXaxis()->GetXmin(),h1[i]->GetXaxis()->GetXmax());
1444 hAllTimeRMSBC[i]=
new TH1F(Form(
"hAllTimeRMSBC%d",i),Form(
"hAllTimeRMSBC%d",i),h3[i]->GetNbinsX(),h3[i]->GetXaxis()->GetXmin(),h3[i]->GetXaxis()->GetXmax());
1446 hAllTimeAvLGBC[i]=
new TH1F(Form(
"hAllTimeAvLGBC%d",i),Form(
"hAllTimeAvLGBC%d",i),h4[i]->GetNbinsX(),h4[i]->GetXaxis()->GetXmin(),h4[i]->GetXaxis()->GetXmax());
1447 hAllTimeRMSLGBC[i]=
new TH1F(Form(
"hAllTimeRMSLGBC%d",i),Form(
"hAllTimeRMSLGBC%d",i),h6[i]->GetNbinsX(),h6[i]->GetXaxis()->GetXmin(),h6[i]->GetXaxis()->GetXmax());
1453 for(
Int_t i=0;i<4;i++){
1454 for(
Int_t j=1;j<=h1[i]->GetNbinsX();j++){
1456 if(h2[i]->GetBinContent(j)!=0){
1457 hAllTimeAvBC[i]->SetBinContent(j-1,h1[i]->GetBinContent(j)/h2[i]->GetBinContent(j));
1458 hAllTimeRMSBC[i]->SetBinContent(j-1,TMath::Sqrt(h3[i]->GetBinContent(j)/h2[i]->GetBinContent(j)) );
1460 hAllTimeAvBC[i]->SetBinContent(j-1,0.);
1461 hAllTimeRMSBC[i]->SetBinContent(j-1,0.);
1464 if(h5[i]->GetBinContent(j)!=0){
1465 hAllTimeAvLGBC[i]->SetBinContent(j-1,h4[i]->GetBinContent(j)/h5[i]->GetBinContent(j));
1466 hAllTimeRMSLGBC[i]->SetBinContent(j-1,TMath::Sqrt(h6[i]->GetBinContent(j)/h5[i]->GetBinContent(j)) );
1468 hAllTimeAvLGBC[i]->SetBinContent(j-1,0.);
1469 hAllTimeRMSLGBC[i]->SetBinContent(j-1,0.);
1476 TFile *fileNew=
new TFile(outputFile.Data(),
"recreate");
1477 for(
Int_t i=0;i<4;i++){
1479 for(
Int_t iPAR = 0; iPAR <= numPARs; iPAR++){
1480 hAllTimeAvBCPAR[iPAR][i]->Write();
1482 hAllTimeAvLGBCPAR[iPAR][i]->Write();
1486 hAllTimeAvBC[i]->Write();
1487 hAllTimeRMSBC[i]->Write();
1488 hAllTimeAvLGBC[i]->Write();
1489 hAllTimeRMSLGBC[i]->Write();
1498 for(
Int_t i=0;i<4;i++){
1499 delete hAllTimeAvBC[i];
1500 delete hAllTimeRMSBC[i];
1501 delete hAllTimeAvLGBC[i];
1502 delete hAllTimeRMSLGBC[i];
1571 if(PARFilename.Length() != 0){
1572 std::ifstream input;
1573 int inputrunnumber = 0, numPARs = 0;
1575 input.open(PARFilename.Data());
1577 printf(
"PAR info file not accessable: %s\n", PARFilename.Data());
1580 while(input.good()){
1581 input >> inputrunnumber >> numPARs;
1582 if(!input.good())
break;
1586 if(numPARs <= 0 || numPARs > 10){
1587 printf(
"Number of PARS incorrectly found to be %d!\n", numPARs);
1590 for(
int iPAR = 0; iPAR < numPARs; iPAR++){
1605 printf(
"info.runNumber = %d\n", info.
runNumber);
1606 printf(
"info.numPARs = %d\n", info.
numPARs);
1607 for(
int i = 0; i < info.
numPARs; i++){
1608 printf(
"info.PARGlobalBCs[%d] = %llu\n", i, info.
PARGlobalBCs[i]);
1613 TFile *
file =
new TFile(inputFile.Data());
1614 if(file==0x0)
return;
1618 TH1F *ccBCPAR[info.
numPARs+1][4];
1625 ccBCPAR[iPAR][i] = (TH1F*)file->Get(Form(
"hAllTimeAvPAR%dBC%d", iPAR, i));
1626 shouldBeEmptyPAR[iPAR][i]=kFALSE;
1628 for(
Int_t j=0;j<upperLimit[19];j++){
1629 if(ccBCPAR[iPAR][i]->GetBinContent(j)>0.) emptyCounter++;
1631 if(emptyCounter<1500) shouldBeEmptyPAR[iPAR][i]=kTRUE;
1632 printf(
"Non-zero channels %d BC %d should be empty: %d \n",emptyCounter,i,shouldBeEmptyPAR[iPAR][i]);
1636 ccBC[i]=(TH1F*) file->Get(Form(
"hAllTimeAvBC%d",i));
1637 shouldBeEmpty[i]=kFALSE;
1639 for(
Int_t j=0;j<upperLimit[19];j++){
1640 if(ccBC[i]->GetBinContent(j)>0.) emptyCounter++;
1642 if(emptyCounter<1500) shouldBeEmpty[i]=kTRUE;
1643 printf(
"Non-zero channels %d BC %d should be empty: %d \n",emptyCounter,i,shouldBeEmpty[i]);
1648 TH1C *hRun=
new TH1C(Form(
"h%d",runNumber),Form(
"h%d",runNumber),19,0,19);
1649 TH1C *hPARRun[info.
numPARs+1];
1652 Int_t minimumIndex=-1;
1656 TF1 *f1=
new TF1(
"f1",
"pol0",0,17664);
1665 hPARRun[iPAR] =
new TH1C(Form(
"h%d_%llu", runNumber, info.
PARGlobalBCs[iPAR]), Form(
"h%d_%llu", runNumber, info.
PARGlobalBCs[iPAR]),19,0,19);
1667 hPARRun[iPAR] =
new TH1C(Form(
"h%d", runNumber), Form(
"h%d", runNumber),19,0,19);
1669 for(
Int_t i=0;i<20;i++){
1673 if(shouldBeEmptyPAR[iPAR][j]){
1678 if(shouldBeEmpty[j]) {
1684 fitResult=ccBCPAR[iPAR][j]->Fit(
"f1",
"CQ",
"", lowerLimit[i],upperLimit[i]);
1686 fitResult=ccBC[j]->Fit(
"f1",
"CQ",
"",lowerLimit[i],upperLimit[i]);
1692 printf(
"Fit failed for SM %d BC%d, integral %f\n",i,j,ccBCPAR[iPAR][j]->Integral(lowerLimit[i],upperLimit[i]));
1694 printf(
"Fit failed for SM %d BC%d, integral %f\n",i,j,ccBC[j]->Integral(lowerLimit[i],upperLimit[i]));
1698 fitParameter = f1->GetParameter(0);
1700 if(offset100 && (j==0 || j==1)) {
1704 meanBC[j]=fitParameter;
1706 if(fitParameter>0 && fitParameter<minimumValue){
1707 minimumValue = fitParameter;
1712 if( minimumValue/25-(
Int_t)(minimumValue/25)>0.5 ) {
1713 L1shift=(
Int_t)(minimumValue/25.)+1;
1715 L1shift=(
Int_t)(minimumValue/25.);
1718 if(TMath::Abs(minimumValue/25-(
Int_t)(minimumValue/25)-0.5)<0.05)
1719 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);
1721 if(justL1phase) totalValue = minimumIndex;
1722 else totalValue = L1shift<<2 | minimumIndex ;
1726 hPARRun[iPAR]->SetBinContent(i,totalValue);
1728 hRun->SetBinContent(i,totalValue);
1731 for(iorder=minimumIndex;iorder<minimumIndex+4-1;iorder++){
1732 if( meanBC[(iorder+1)%4] <= meanBC[iorder%4] ) orderTest=kFALSE;
1735 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);
1739 if(shouldBeEmpty[0] || shouldBeEmpty[1] || shouldBeEmpty[2] || shouldBeEmpty[3]){
1740 Double_t newMean = meanBC[minimumIndex]-600;
1743 hPARRun[iPAR]->SetBinContent(i,minimumIndex);
1745 hRun->SetBinContent(i,minimumIndex);
1748 Int_t minIndexTmp=-1;
1749 if(newMean/25. - (
Int_t)(newMean/25.) <0.5)
1750 minIndexTmp = (
Int_t)(newMean/25.);
1752 minIndexTmp = 1+(
Int_t)(newMean/25.);
1755 hPARRun[iPAR]->SetBinContent(i,(4-minIndexTmp+minimumIndex)%4);
1757 hRun->SetBinContent(i,(4-minIndexTmp+minimumIndex)%4);
1762 printf(
"run with missing BC; new L1 phase set to %d\n",(
Int_t)hPARRun[iPAR]->GetBinContent(i));
1764 printf(
"run with missing BC; new L1 phase set to %d\n",(
Int_t)hRun->GetBinContent(i));
1771 TFile *fileNew=
new TFile(outputFile.Data(),
"update");
1774 hPARRun[iPAR]->Write();
1790 AliOADBContainer *contBC=
new AliOADBContainer(
"");
1791 contBC->InitFromFile(AliDataFile::GetFileNameOADB(
"EMCAL/EMCALBadChannels.root").data(),
"AliEMCALBadChannels");
1792 printf(
"contBC %p, ent %d\n",contBC,contBC->GetNumberOfEntries());
1795 AliInfo(
"Remove EMCAL bad cells");
1798 TH2I *hbm = (TH2I*)arrayBC->FindObject(Form(
"EMCALBadChannelMap_Mod%d",i));
1800 AliError(Form(
"Can not get EMCALBadChannelMap_Mod%d",i));
1803 hbm->SetDirectory(0);
1807 }
else AliInfo(
"Do NOT remove EMCAL bad channels\n");
1819 if(referenceFile==0x0) {
1820 AliFatal(
"*** NO bad channel map FILE");
1823 TH1F *hbm = (TH1F*)referenceFile->Get(
"h1");
1825 AliError(
"Can not get EMCALBadChannelMap");
1843 std::ifstream input;
1844 int runnumber = 0, numPARs = 0, numRuns=0;
1846 gSystem->ExpandPathName(PARFileName);
1848 if(PARFileName.Contains(
"alien://")){
1850 TFile::Cp(PARFileName.Data(), localFileName.Data());
1851 PARFileName = localFileName;
1853 input.open(PARFileName.Data());
1855 AliFatal(Form(
"PAR info file not accessable: %s", PARFileName.Data()));
1857 while(input.good()){
1858 input >> runnumber >> numPARs;
1859 if(!input.good())
break;
1864 if(numPARs <= 0 || numPARs > 10){
1865 AliFatal(Form(
"Number of PARS incorrectly found to be %d!", numPARs));
1867 for(
int iPAR = 0; iPAR < numPARs; iPAR++){
1874 printf(
"number of runs processed in PAR file: %d\n", numRuns);
1881 if(runnum < 200000) AliFatal(Form(
"Bad Run Number %d passed to GetPARInfo!", runnum));
1885 for(
int iPARrun = 0; iPARrun <
fPARvec.size(); iPARrun++){
1896 for(
int ipar = 0; ipar <
fPARvec[iPARrun].numPARs; ipar++){
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 fCurrentPARIndex
Par Info for current Run Number.
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
std::vector< std::vector< TH2F * > > fhRawTimeLGPARs
!
TH2F * fhTimeVsBC
!cell time vs BC
Double_t fMinTime
minimum cluster time after correction
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
void SetL1PhaseReferencePAR()
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
std::vector< std::vector< TH2F * > > fhRawTimePARs
!
Double_t fEnergyMax
upper range of histo with energy HG
Double_t fMinClusterEnergy
minimum cluster energy
void LoadReferenceRunByRunHistos()
TH1F * fhTimeLGEnt[kNBCmask]
! 4
TObjArray * fBadChannelMapArray
bad channel map array
static void ProduceCalibConsts(TString inputFile="time186319testWOL0.root", TString outputFile="Reference.root", Bool_t isFinal=kFALSE, Bool_t isPAR=kFALSE)
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
std::vector< PARInfo > fPARvec
vector of PAR info for all runs
void SetPARInfo(TString PARfilename)
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 ProduceOffsetForSMsV2(Int_t runNumber, TString inputFile="Reference.root", TString outputFile="ReferenceSM.root", Bool_t offset100=kTRUE, Bool_t justL1phase=kTRUE, TString PARfilename="")
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
Bool_t fIsPARRun
Which PAR the currnt event is after.
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
std::vector< ULong64_t > PARGlobalBCs
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
void GetPARInfoForRunNumber(Int_t runnum)
Does current run have PAR info?
TH2F * fhTimeDsupBC[kNSM][kNBCmask]
! 20 x 4 high gain
TH2F * fhTimeDsupLGBC[kNSM][kNBCmask]
! 20 x 4 low gain