X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONTriggerQADataMakerRec.cxx;h=db3288e096a8a50222e437b8cc477fba01a01ec4;hb=9da4ac4a5bc6155d19074dd83c817b08e9184f4a;hp=4e09b48f20d4f410d1ff144f5af8eb577465953e;hpb=a026ce9e0865b384ca5a058d30dbccc01999df9d;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONTriggerQADataMakerRec.cxx b/MUON/AliMUONTriggerQADataMakerRec.cxx index 4e09b48f20d..db3288e096a 100644 --- a/MUON/AliMUONTriggerQADataMakerRec.cxx +++ b/MUON/AliMUONTriggerQADataMakerRec.cxx @@ -34,6 +34,7 @@ ClassImp(AliMUONTriggerQADataMakerRec) #include "AliMpConstants.h" #include "AliMUONTriggerDisplay.h" #include "TH2.h" +#include "TH1F.h" #include "TString.h" #include "AliRecoParam.h" #include "AliMUONDigitStoreV2R.h" @@ -59,14 +60,28 @@ ClassImp(AliMUONTriggerQADataMakerRec) #include "AliMUONGlobalTriggerBoard.h" #include "AliMUONGlobalTrigger.h" #include "AliMUONGlobalCrateConfig.h" +#include "AliMUONQAIndices.h" +#include "AliMpPad.h" +#include "AliMpVSegmentation.h" +#include "AliMpSegmentation.h" +namespace +{ + Double_t ProtectedSqrt(Double_t x) + { + return ( x > 0.0 ? TMath::Sqrt(x) : 0.0 ); + } +} //____________________________________________________________________________ AliMUONTriggerQADataMakerRec::AliMUONTriggerQADataMakerRec(AliQADataMakerRec* master) : AliMUONVQADataMakerRec(master), fDigitMaker(new AliMUONDigitMaker(kFALSE)), -fCalibrationData(new AliMUONCalibrationData(AliCDBManager::Instance()->GetRun())), -fTriggerProcessor(new AliMUONTriggerElectronics(fCalibrationData)), -fDigitStore(0x0) +fCalibrationData(0x0), +fTriggerProcessor(0x0), +fDigitStore(0x0), +fDigitStoreFromRaw(0x0), +fTriggerStoreFromRaw(0x0), +fTriggerStoreReprocessRaw(0x0) { /// ctor } @@ -77,9 +92,12 @@ AliMUONTriggerQADataMakerRec::~AliMUONTriggerQADataMakerRec() { /// dtor delete fDigitMaker; - delete fDigitStore; delete fTriggerProcessor; delete fCalibrationData; + delete fDigitStore; + delete fDigitStoreFromRaw; + delete fTriggerStoreFromRaw; + delete fTriggerStoreReprocessRaw; } //____________________________________________________________________________ @@ -92,7 +110,6 @@ void AliMUONTriggerQADataMakerRec::EndOfDetectorCycleESDs(Int_t /*specie*/, TObj void AliMUONTriggerQADataMakerRec::EndOfDetectorCycleRecPoints(Int_t /*specie*/, TObjArray** /*list*/) { /// Normalize RecPoints histograms - } @@ -100,54 +117,100 @@ void AliMUONTriggerQADataMakerRec::EndOfDetectorCycleRecPoints(Int_t /*specie*/, void AliMUONTriggerQADataMakerRec::EndOfDetectorCycleRaws(Int_t /*specie*/, TObjArray** /*list*/) { /// create Raws histograms in Raws subdir - - DisplayTriggerInfo(); - - // Normalize RawData histos - Float_t nbevent = GetRawsData(kRawNAnalyzedEvents)->GetBinContent(1); + Int_t histoRawsIndex[] = { - kTriggerErrorSummary, - kTriggerCalibSummary, - kTriggerReadOutErrors, - kTriggerGlobalOutput + AliMUONQAIndices::kTriggerErrorSummary, + AliMUONQAIndices::kTriggerCalibSummary, + AliMUONQAIndices::kTriggerReadOutErrors, + AliMUONQAIndices::kTriggerGlobalOutput }; Int_t histoRawsScaledIndex[] = { - kTriggerErrorSummaryNorm, - kTriggerCalibSummaryNorm, - kTriggerReadOutErrorsNorm, - kTriggerGlobalOutputNorm + AliMUONQAIndices::kTriggerErrorSummaryNorm, + AliMUONQAIndices::kTriggerCalibSummaryNorm, + AliMUONQAIndices::kTriggerReadOutErrorsNorm, + AliMUONQAIndices::kTriggerGlobalOutputNorm }; + const Int_t kNrawsHistos = sizeof(histoRawsIndex)/sizeof(histoRawsIndex[0]); Float_t scaleFactor[kNrawsHistos] = {100., 100., 100., 1.}; - for(Int_t ihisto=0; ihisto 0 ) { - scaledHisto->Reset(); - scaledHisto->Add(inputHisto); - scaledHisto->Scale(scaleFactor[ihisto]/nbevent); - } - } // loop on histos - TH1* hYCopy = GetRawsData(kTriggerErrorLocalYCopy); //number of YCopy error per board - TH1* hYCopyTests = GetRawsData(kTriggerErrorLocalYCopyTest); //contains the number of YCopy test per board - TH1* hYCopyNorm = GetRawsData(kTriggerErrorLocalYCopyNorm); - hYCopyNorm->Reset(); - hYCopyNorm->Divide(hYCopy, hYCopyTests, 100., 1.); + for ( Int_t itc=-1; itcGetBinContent(1); + for(Int_t ihisto=0; ihisto 0 ) { + scaledHisto->Reset(); + scaledHisto->Add(inputHisto); + scaledHisto->Scale(scaleFactor[ihisto]/nbevent); + } + } // loop on histos + + + // The following histograms are surely there + // if the histogram with analyzed events is there: + // test on the existence of each histogram is not necessary + TH1* hYCopy = GetRawsData(AliMUONQAIndices::kTriggerErrorLocalYCopy,itc); //number of YCopy error per board + TH1* hYCopyTests = GetRawsData(AliMUONQAIndices::kTriggerErrorLocalYCopyTest,itc); //contains the number of YCopy test per board + TH1* hYCopyNorm = GetRawsData(AliMUONQAIndices::kTriggerErrorLocalYCopyNorm,itc); + hYCopyNorm->Reset(); + hYCopyNorm->Divide(hYCopy, hYCopyTests, 100., 1.); - Float_t mean = hYCopyNorm->Integral(); + Float_t mean = hYCopyNorm->Integral(); - TH1* hSummary = GetRawsData(kTriggerErrorSummary); - hSummary->SetBinContent(kAlgoLocalYCopy+1,mean/192.); //put the mean of the % of YCopy error in the kTriggerError's corresponding bin + TH1* hSummary = GetRawsData(AliMUONQAIndices::kTriggerErrorSummaryNorm,itc); + hSummary->SetBinContent(AliMUONQAIndices::kAlgoLocalYCopy+1,mean/192.); //put the mean of the % of YCopy error in the kTriggerError's corresponding bin + + TH1F* hTriggerRatio = (TH1F*)GetRawsData(AliMUONQAIndices::kTriggerLocalRatio4434,itc); + if ( hTriggerRatio ){ + hTriggerRatio->Divide(((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerNumberOf44Dec,itc)),((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerNumberOf34Dec,itc))); + + FillRatio4434Histos(1,itc,kTRUE); + + //reset bins temporary used to store informations + ((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerRatio4434AllEvents,itc))->SetBinContent(0,0); + Int_t nbins = ((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerRatio4434AllEvents,itc))->GetNbinsX(); + ((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerRatio4434AllEvents,itc))->SetBinContent(nbins+1,0); + + ((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerLocalRatio4434,itc))->SetMaximum(1.1); + ((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerRatio4434AllEvents,itc))->SetMaximum(1.1); + ((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerRatio4434SinceLastUpdate,itc))->SetMaximum(1.1); + } + + if ( GetRawsData(AliMUONQAIndices::kTriggerGlobalScalersNorm,itc) ) { + TH1* inputHisto = GetRawsData(AliMUONQAIndices::kTriggerGlobalScalers,itc); + TH1* scaledHisto = GetRawsData(AliMUONQAIndices::kTriggerGlobalScalersNorm,itc); + scaledHisto->Reset(); + scaledHisto->Add(inputHisto); + Float_t scaleValue = ((TH1F*)GetRawsData(AliMUONQAIndices::kTriggerScalersTime,itc))->GetBinContent(1); + if ( scaleValue > 0. ) scaledHisto->Scale(1./scaleValue); + } + } // loop on trigger classes } //____________________________________________________________________________ void AliMUONTriggerQADataMakerRec::InitRaws() { /// create Raws histograms in Raws subdir - + + // RS: Since there is no sense in cloning trigger scalers per trigger, I am (for the moment) forbidding their cloning + AliCodeTimerAuto("",0); + fDigitStoreFromRaw = new AliMUONDigitStoreV2R(); + fTriggerStoreFromRaw = new AliMUONTriggerStoreV1(); + fTriggerStoreReprocessRaw = new AliMUONTriggerStoreV1(); + const Bool_t expert = kTRUE ; const Bool_t saveCorr = kTRUE ; const Bool_t image = kTRUE ; @@ -166,7 +229,8 @@ void AliMUONTriggerQADataMakerRec::InitRaws() histo1D = new TH1F("hTriggerScalersTime", "Acquisition time from trigger scalers", 1, 0.5, 1.5); histo1D->GetXaxis()->SetBinLabel(1, "One-bin histogram: bin is filled at each scaler event."); histo1D->GetYaxis()->SetTitle("Cumulated scaler time (s)"); - Add2RawsList(histo1D, kTriggerScalersTime, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerScalersTime, expert, !image, !saveCorr); + ForbidCloning(histo1D); // RS for(Int_t iCath=0; iCathGetXaxis()->SetTitle(boardName.Data()); histo2D->GetYaxis()->SetTitle("Strip"); histo2D->SetOption("COLZ"); - Add2RawsList(histo2D, kTriggerScalers + AliMpConstants::NofTriggerChambers()*iCath + iChamber, expert, !image, !saveCorr); + Add2RawsList(histo2D, AliMUONQAIndices::kTriggerScalers + AliMpConstants::NofTriggerChambers()*iCath + iChamber, expert, !image, !saveCorr); + ForbidCloning(histo2D); // RS } // loop on chambers } // loop on cathodes @@ -191,14 +256,15 @@ void AliMUONTriggerQADataMakerRec::InitRaws() histo2D = (TH2F*)triggerDisplay.GetEmptyDisplayHisto(histoName, AliMUONTriggerDisplay::kDisplayStrips, iCath, iChamber, histoTitle); histo2D->SetOption("COLZ"); - Add2RawsList(histo2D, kTriggerScalersDisplay + AliMpConstants::NofTriggerChambers()*iCath + iChamber, expert, !image, !saveCorr); + Add2RawsList(histo2D, AliMUONQAIndices::kTriggerScalersDisplay + AliMpConstants::NofTriggerChambers()*iCath + iChamber, expert, !image, !saveCorr); + ForbidCloning(histo2D); // RS } // loop on chambers } // loop on cathodes - TString axisLabel[kNtrigCalibSummaryBins] = {"#splitline{Dead}{Channels}", "#splitline{Dead}{Local Boards}", "#splitline{Dead}{Regional Boards}", "#splitline{Dead}{Global Board}", "#splitline{Noisy}{Strips}"}; + TString axisLabel[AliMUONQAIndices::kNtrigCalibSummaryBins] = {"#splitline{Dead}{Channels}", "#splitline{Dead}{Local Boards}", "#splitline{Dead}{Regional Boards}", "#splitline{Dead}{Global Board}", "#splitline{Noisy}{Strips}"}; - TH1F* histoCalib = new TH1F("hTriggerCalibSummaryAll", "MTR calibration summary counts", kNtrigCalibSummaryBins, -0.5, (Float_t)kNtrigCalibSummaryBins - 0.5); - for (Int_t ibin=1; ibin<=kNtrigCalibSummaryBins; ibin++){ + TH1F* histoCalib = new TH1F("hTriggerCalibSummaryAll", "MTR calibration summary counts", AliMUONQAIndices::kNtrigCalibSummaryBins, -0.5, (Float_t)AliMUONQAIndices::kNtrigCalibSummaryBins - 0.5); + for (Int_t ibin=1; ibin<=AliMUONQAIndices::kNtrigCalibSummaryBins; ibin++){ histoCalib->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].Data()); } histoCalib->SetFillColor(kBlue); @@ -206,142 +272,169 @@ void AliMUONTriggerQADataMakerRec::InitRaws() // Copy of previous histo for scaling purposes TH1F* histoCalibNorm = (TH1F*)histoCalib->Clone("hTriggerCalibSummary"); histoCalibNorm->SetTitle("MTR calibration summary"); - histoCalibNorm->SetOption("bar2"); + histoCalibNorm->SetOption("bartext0"); histoCalibNorm->GetYaxis()->SetTitle("Percentage per event (%)"); // Adding both histos after cloning to avoid problems with the expert bit - Add2RawsList(histoCalib, kTriggerCalibSummary, expert, !image, !saveCorr); - Add2RawsList(histoCalibNorm, kTriggerCalibSummaryNorm, !expert, image, !saveCorr); + Add2RawsList(histoCalib, AliMUONQAIndices::kTriggerCalibSummary, expert, !image, !saveCorr); + ForbidCloning(histoCalib); // RS + + Add2RawsList(histoCalibNorm, AliMUONQAIndices::kTriggerCalibSummaryNorm, !expert, image, !saveCorr); + ForbidCloning(histoCalibNorm); // RS + } // Calibration reco param - Char_t *globalXaxisName[6] = {"US HPt", "US LPt", "LS HPt", "LS LPt", "SGL HPt", "SGL LPt"}; - Char_t *allLevelXaxisName[kNtrigAlgoErrorBins] = {"Local algo X", "Local algo Y", "Local LUT","Local Y Copy" , "Local2Regional", "Regional", "Regional2Global", "GlobalFromInGlobal", "GlobalFromInLocal", "GlobalFromOutLocal"}; - Char_t *readoutErrNames[kNtrigStructErrorBins]={"Local","Regional","Global","DARC"}; + const char *globalXaxisName[6] = {"US HPt", "US LPt", "LS HPt", "LS LPt", "SGL HPt", "SGL LPt"}; + const char *allLevelXaxisName[AliMUONQAIndices::kNtrigAlgoErrorBins] = {"Local algo X", "Local algo Y", "Local LUT","Local Y Copy" , "Local2Regional", "Regional", "Regional2Global", "GlobalFromInGlobal", "GlobalFromInLocal", "GlobalFromOutLocal"}; + const char *readoutErrNames[AliMUONQAIndices::kNtrigStructErrorBins]={"Local","Regional","Global","DARC"}; TString errorAxisTitle = "Number of errors"; - histo1D = new TH1F("ErrorLocalXPos", "ErrorLocalXPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalXPos", "ErrorLocalXPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalXPos, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalXPos, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalYPos", "ErrorLocalYPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalYPos", "ErrorLocalYPos",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalYPos, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalYPos, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalDev", "ErrorLocalDev",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalDev", "ErrorLocalDev",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalDev, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalDev, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalTriggerDec", "ErrorLocalTriggerDec",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalTriggerDec", "ErrorLocalTriggerDec",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalTriggerDec, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalTriggerDec, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalLPtLSB", "ErrorLocalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalLPtLSB", "ErrorLocalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalLPtLSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalLPtLSB, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalLPtMSB", "ErrorLocalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalLPtMSB", "ErrorLocalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalLPtMSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalLPtMSB, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalHPtLSB", "ErrorLocalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalHPtLSB", "ErrorLocalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalHPtLSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalHPtLSB, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalHPtMSB", "ErrorLocalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalHPtMSB", "ErrorLocalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalHPtMSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalHPtMSB, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocalTrigY", "ErrorLocalTrigY",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocalTrigY", "ErrorLocalTrigY",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocalTrigY, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocalTrigY, expert, !image, !saveCorr); + + if ( GetRecoParam()->GetEventSpecie() != AliRecoParam::kCalib ) { + histo1D = new TH1F("hTriggerRatio4434Local", "Ratio4434Local",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D->GetXaxis()->SetTitle(boardName.Data()); + histo1D->GetYaxis()->SetTitle("ratio 44/34"); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerLocalRatio4434, expert, !image, !saveCorr); + histo1D = new TH1F("hTriggerRatio4434AllEvents", "Ratio4434AllEvents",1,0,1); + histo1D->GetXaxis()->SetTitle("Event number"); + histo1D->GetYaxis()->SetTitle("ratio 44/34"); + histo1D->SetLineColor(4); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerRatio4434AllEvents, expert, !image, !saveCorr); + histo1D = new TH1F("hTriggerRatio4434SinceLastUpdate", "Ratio4434SinceLastUpdate",1,0,1); + histo1D->GetXaxis()->SetTitle("Event number"); + histo1D->GetYaxis()->SetTitle("ratio 44/34"); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerRatio4434SinceLastUpdate, expert, !image, !saveCorr); + } - histo1D = new TH1F("ErrorLocal2RegionalLPtLSB", "ErrorLocal2RegionalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocal2RegionalLPtLSB", "ErrorLocal2RegionalLPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocal2RegionalLPtLSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocal2RegionalLPtLSB, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocal2RegionalLPtMSB", "ErrorLocal2RegionalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocal2RegionalLPtMSB", "ErrorLocal2RegionalLPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocal2RegionalLPtMSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocal2RegionalLPtMSB, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocal2RegionalHPtLSB", "ErrorLocal2RegionalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocal2RegionalHPtLSB", "ErrorLocal2RegionalHPtLSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocal2RegionalHPtLSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocal2RegionalHPtLSB, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorLocal2RegionalHPtMSB", "ErrorLocal2RegionalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D = new TH1F("hTriggerErrorLocal2RegionalHPtMSB", "ErrorLocal2RegionalHPtMSB",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histo1D->GetXaxis()->SetTitle(boardName.Data()); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); - Add2RawsList(histo1D, kTriggerErrorLocal2RegionalHPtMSB, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorLocal2RegionalHPtMSB, expert, !image, !saveCorr); + + histo1D = new TH1F("hTriggerErrorOutGlobalFromInGlobal", "ErrorOutGlobalFromInGlobal",6,-0.5,6-0.5); + histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); + for (int ibin=0;ibin<6;ibin++){ + histo1D->GetXaxis()->SetBinLabel(ibin+1,globalXaxisName[ibin]); + } + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorOutGlobalFromInGlobal, expert, !image, !saveCorr); - histo1D = new TH1F("ErrorOutGlobalFromInGlobal", "ErrorOutGlobalFromInGlobal",6,-0.5,6-0.5); + histo1D = new TH1F("hTriggerErrorOutGlobalFromInLocal", "ErrorOutGlobalFromInLocal",6,-0.5,6-0.5); histo1D->GetYaxis()->SetTitle(errorAxisTitle.Data()); for (int ibin=0;ibin<6;ibin++){ histo1D->GetXaxis()->SetBinLabel(ibin+1,globalXaxisName[ibin]); } - Add2RawsList(histo1D, kTriggerErrorOutGlobalFromInGlobal, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerErrorOutGlobalFromInLocal, expert, !image, !saveCorr); - TH1F* histoAlgoErr = new TH1F("hTriggerAlgoNumOfErrors", "Trigger Algorithm total errors",kNtrigAlgoErrorBins,-0.5,(Float_t)kNtrigAlgoErrorBins-0.5); + TH1F* histoAlgoErr = new TH1F("hTriggerAlgoNumOfErrors", "Trigger Algorithm total errors",AliMUONQAIndices::kNtrigAlgoErrorBins,-0.5,(Float_t)AliMUONQAIndices::kNtrigAlgoErrorBins-0.5); histoAlgoErr->GetYaxis()->SetTitle("Number of events with errors"); - for (int ibin=0;ibinGetXaxis()->SetBinLabel(ibin+1,allLevelXaxisName[ibin]); } histoAlgoErr->SetFillColor(kBlue); // Copy of previous histo for scaling purposes TH1F* histoAlgoErrNorm = (TH1F*)histoAlgoErr->Clone("hTriggerAlgoErrors"); - histoAlgoErrNorm->SetOption("bar2"); + histoAlgoErrNorm->SetOption("bartext0"); histoAlgoErrNorm->SetTitle("Trigger algorithm errors"); histoAlgoErrNorm->GetYaxis()->SetTitle("% of events with errors"); // Adding both histos after cloning to avoid problems with the expert bit - Add2RawsList(histoAlgoErr, kTriggerErrorSummary, expert, !image, !saveCorr); - Add2RawsList(histoAlgoErrNorm, kTriggerErrorSummaryNorm, !expert, image, !saveCorr); + Add2RawsList(histoAlgoErr, AliMUONQAIndices::kTriggerErrorSummary, expert, !image, !saveCorr); + Add2RawsList(histoAlgoErrNorm, AliMUONQAIndices::kTriggerErrorSummaryNorm, !expert, image, !saveCorr); - histo1D = new TH1F("hTriggeredBoards", "Triggered boards", nbLocalBoard, 0.5, (Float_t)nbLocalBoard + 0.5); - Add2RawsList(histo1D, kTriggeredBoards, expert, !image, !saveCorr); + histo1D = new TH1F("hTriggerTriggeredBoards", "Triggered boards", nbLocalBoard, 0.5, (Float_t)nbLocalBoard + 0.5); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggeredBoards, expert, !image, !saveCorr); - histo2D = (TH2F*)triggerDisplay.GetEmptyDisplayHisto("hFiredBoardsDisplay", AliMUONTriggerDisplay::kDisplayBoards, + histo2D = (TH2F*)triggerDisplay.GetEmptyDisplayHisto("hTriggerFiredBoardsDisplay", AliMUONTriggerDisplay::kDisplayBoards, 0, 0, "Local board triggers / event"); histo2D->SetOption("COLZ"); - Add2RawsList(histo2D, kTriggerBoardsDisplay, expert, !image, !saveCorr); + Add2RawsList(histo2D, AliMUONQAIndices::kTriggerBoardsDisplay, expert, !image, !saveCorr); - TH1F* histoYCopyErr = new TH1F("ErrorLocalYCopy", "Number of YCopy errors",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + TH1F* histoYCopyErr = new TH1F("hTriggerErrorLocalYCopy", "Number of YCopy errors",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); histoYCopyErr->GetXaxis()->SetTitle(boardName.Data()); histoYCopyErr->GetYaxis()->SetTitle(errorAxisTitle.Data()); // Copy of previous histo for scaling purposes - TH1F* histoYCopyErrTest = (TH1F*)histoYCopyErr->Clone("ErrorLocalYCopyTest"); + TH1F* histoYCopyErrTest = (TH1F*)histoYCopyErr->Clone("hTriggerErrorLocalYCopyTest"); histoYCopyErrTest->SetTitle("Number of YCopy tested"); // Copy of previous histo for scaling purposes - TH1F* histoYCopyErrNorm = (TH1F*)histoYCopyErr->Clone("ErrorLocalYCopyNorm"); + TH1F* histoYCopyErrNorm = (TH1F*)histoYCopyErr->Clone("hTriggerErrorLocalYCopyNorm"); histoYCopyErrNorm->SetTitle("% of YCopy errors"); // Adding both histos after cloning to avoid problems with the expert bit - Add2RawsList(histoYCopyErr, kTriggerErrorLocalYCopy, expert, !image, !saveCorr); - Add2RawsList(histoYCopyErrTest, kTriggerErrorLocalYCopyTest, expert, !image, !saveCorr); - Add2RawsList(histoYCopyErrNorm, kTriggerErrorLocalYCopyNorm, expert, !image, !saveCorr); + Add2RawsList(histoYCopyErr, AliMUONQAIndices::kTriggerErrorLocalYCopy, expert, !image, !saveCorr); + Add2RawsList(histoYCopyErrTest, AliMUONQAIndices::kTriggerErrorLocalYCopyTest, expert, !image, !saveCorr); + Add2RawsList(histoYCopyErrNorm, AliMUONQAIndices::kTriggerErrorLocalYCopyNorm, expert, !image, !saveCorr); - TH1F* histoROerr = new TH1F("hTriggerReadoutNumOfErrors","Trigger Read-Out total errors", kNtrigStructErrorBins, -0.5, (Float_t)kNtrigStructErrorBins-0.5); + TH1F* histoROerr = new TH1F("hTriggerReadoutNumOfErrors","Trigger Read-Out total errors", AliMUONQAIndices::kNtrigStructErrorBins, -0.5, (Float_t)AliMUONQAIndices::kNtrigStructErrorBins-0.5); histoROerr->GetYaxis()->SetTitle("Fraction of errors"); histoROerr->SetFillColor(kBlue); - for (int ibin=0;ibinGetXaxis()->SetBinLabel(ibin+1,readoutErrNames[ibin]); } // Copy of previous histo for scaling purposes TH1F* histoROerrNorm = (TH1F*)histoROerr->Clone("hTriggerReadoutErrors"); histoROerrNorm->SetTitle("Trigger Read-Out errors"); - histoROerrNorm->SetOption("bar2"); + histoROerrNorm->SetOption("bartext0"); histoROerrNorm->GetYaxis()->SetTitle("% of errors per event"); // Adding both histos after cloning to avoid problems with the expert bit - Add2RawsList(histoROerr, kTriggerReadOutErrors, expert, !image, !saveCorr); - Add2RawsList(histoROerrNorm, kTriggerReadOutErrorsNorm, !expert, image, !saveCorr); + Add2RawsList(histoROerr, AliMUONQAIndices::kTriggerReadOutErrors, expert, !image, !saveCorr); + Add2RawsList(histoROerrNorm, AliMUONQAIndices::kTriggerReadOutErrorsNorm, !expert, image, !saveCorr); TH1F* histoGlobalMult = new TH1F("hTriggerGlobalOutMultiplicity","Trigger global outputs multiplicity", 6, -0.5, 6.-0.5); histoGlobalMult->GetYaxis()->SetTitle("Number of triggers"); @@ -353,19 +446,56 @@ void AliMUONTriggerQADataMakerRec::InitRaws() // Copy of previous histo for scaling purposes TH1F* histoGlobalMultNorm = (TH1F*)histoGlobalMult->Clone("hTriggerGlobalOutMultiplicityPerEvt"); histoGlobalMultNorm->SetTitle("Trigger global outputs multiplicity per event"); - histoGlobalMultNorm->SetOption("bar2"); - histoGlobalMultNorm->SetBarWidth(0.5); - histoGlobalMultNorm->SetBarOffset(0.25); + histoGlobalMultNorm->SetOption("bartext0"); + //histoGlobalMultNorm->SetBarWidth(0.5); + //histoGlobalMultNorm->SetBarOffset(0.25); histoGlobalMultNorm->GetYaxis()->SetTitle("Triggers per event"); // Adding both histos after cloning to avoid problems with the expert bit - Add2RawsList(histoGlobalMult, kTriggerGlobalOutput, expert, !image, !saveCorr); - Add2RawsList(histoGlobalMultNorm, kTriggerGlobalOutputNorm, expert, !image, !saveCorr); + Add2RawsList(histoGlobalMult, AliMUONQAIndices::kTriggerGlobalOutput, expert, !image, !saveCorr); + Add2RawsList(histoGlobalMultNorm, AliMUONQAIndices::kTriggerGlobalOutputNorm, expert, !image, !saveCorr); - histo1D = new TH1F("hRawNAnalyzedEvents", "Number of analyzed events per specie", 1, 0.5, 1.5); + histo1D = new TH1F("hTriggerRawNAnalyzedEvents", "Number of analyzed events per specie", 1, 0.5, 1.5); Int_t esindex = AliRecoParam::AConvert(CurrentEventSpecie()); histo1D->GetXaxis()->SetBinLabel(1, AliRecoParam::GetEventSpecieName(esindex)); histo1D->GetYaxis()->SetTitle("Number of analyzed events"); - Add2RawsList(histo1D, kRawNAnalyzedEvents, expert, !image, !saveCorr); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerRawNAnalyzedEvents, expert, !image, !saveCorr); + + if ( GetRecoParam()->GetEventSpecie() != AliRecoParam::kCalib ) { + histo1D = new TH1F("hTriggerNumberOf34Dec", "Number of 3/4",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D->GetXaxis()->SetTitle(boardName.Data()); + histo1D->GetYaxis()->SetTitle("Number of 3/4"); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerNumberOf34Dec, expert, !image, !saveCorr); + + histo1D = new TH1F("hTriggerNumberOf44Dec", "Number of 4/4",nbLocalBoard,0.5,(Float_t)nbLocalBoard+0.5); + histo1D->GetXaxis()->SetTitle(boardName.Data()); + histo1D->GetYaxis()->SetTitle("Number of 4/4"); + Add2RawsList(histo1D, AliMUONQAIndices::kTriggerNumberOf44Dec, expert, !image, !saveCorr); + } + + histo1D = new TH1F("hTriggerIsThere","trigger is there",1,0,1); + Add2RawsList(histo1D,AliMUONQAIndices::kTriggerIsThere,kTRUE,kFALSE,kFALSE); + + if ( GetRecoParam()->GetEventSpecie() == AliRecoParam::kCalib ) { + TH1F* histoGlobalScalers = new TH1F("hTriggerGlobalScalers","Trigger global scalers", 6, -0.5, 6.-0.5); + histoGlobalScalers->GetYaxis()->SetTitle("L0 counts"); + histoGlobalScalers->GetXaxis()->SetTitle("Global output"); + for (int ibin=0;ibin<6;ibin++){ + histoGlobalScalers->GetXaxis()->SetBinLabel(ibin+1,globalXaxisName[ibin]); + } + // Copy of previous histo for scaling purposes + TH1F* histoGlobalScalersNorm = (TH1F*)histoGlobalScalers->Clone("hTriggerGlobalScalersRate"); + histoGlobalScalersNorm->SetTitle("Trigger global L0 scalers rate"); + histoGlobalScalersNorm->SetOption("etext0"); + histoGlobalScalersNorm->GetYaxis()->SetTitle("L0 scalers rate (Hz)"); + // Adding both histos after cloning to avoid problems with the expert bit + Add2RawsList(histoGlobalScalers, AliMUONQAIndices::kTriggerGlobalScalers, expert, !image, !saveCorr); + ForbidCloning(histoGlobalScalers); // RS + Add2RawsList(histoGlobalScalersNorm, AliMUONQAIndices::kTriggerGlobalScalersNorm, expert, !image, !saveCorr); + ForbidCloning(histoGlobalScalersNorm); // RS + } + // + //ClonePerTrigClass(AliQAv1::kRAWS); // RS: this should be the last line DONE at parent level + // } //__________________________________________________________________ @@ -375,8 +505,12 @@ void AliMUONTriggerQADataMakerRec::InitDigits() const Bool_t expert = kTRUE ; const Bool_t image = kTRUE ; - TH1I* h0 = new TH1I("hDigitsDetElem", "Detection element distribution in Digits;Detection element Id;Counts", 400, 1100, 1500); + TH1I* h0 = new TH1I("hTriggerDigitsDetElem", "Detection element distribution in Digits;Detection element Id;Counts", 400, 1100, 1500); Add2DigitsList(h0, 0, !expert, image); + ForbidCloning(h0); + // + //ClonePerTrigClass(AliQAv1::kDIGITS); // this should be the last line DONE at parent level + // } //____________________________________________________________________________ @@ -390,26 +524,32 @@ void AliMUONTriggerQADataMakerRec::InitRecPoints() TH1F* histo1D = 0x0; - histo1D = new TH1F("hNAnalyzedEvents", "Number of analyzed events per specie", 1, 0.5, 1.5); + histo1D = new TH1F("hTriggerNAnalyzedEvents", "Number of analyzed events per specie", 1, 0.5, 1.5); Int_t esindex = AliRecoParam::AConvert(CurrentEventSpecie()); histo1D->GetXaxis()->SetBinLabel(1, AliRecoParam::GetEventSpecieName(esindex)); histo1D->GetYaxis()->SetTitle("Number of analyzed events"); - Add2RecPointsList(histo1D, kNAnalyzedEvents, expert, !image); + Add2RecPointsList(histo1D, AliMUONQAIndices::kTriggerNAnalyzedEvents, expert, !image); + ForbidCloning(histo1D); histo1D = new TH1F("hTriggerTrippedChambers", "Trigger RPCs in trip", 418, 1100-0.5, 1417+0.5); histo1D->GetXaxis()->SetTitle("DetElemId"); histo1D->GetYaxis()->SetTitle("# of trips"); histo1D->SetFillColor(kRed); histo1D->SetLineColor(kRed); - Add2RecPointsList(histo1D, kTriggerRPCtrips, !expert, image); - - FillTriggerDCSHistos(); + Add2RecPointsList(histo1D, AliMUONQAIndices::kTriggerRPCtrips, !expert, image); + ForbidCloning(histo1D); // RS this histo is not cloned + // + FillTriggerDCSHistos(); + // + //ClonePerTrigClass(AliQAv1::kRECPOINTS); DONE at parent level + // } //____________________________________________________________________________ void AliMUONTriggerQADataMakerRec::InitESDs() { + /// Empty implementation } //____________________________________________________________________________ @@ -419,9 +559,8 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) AliCodeTimerAuto("",0); - GetRawsData(kRawNAnalyzedEvents)->Fill(1.); - // Init Local/Regional/Global decision with fake values + // UInt_t globalInput[4]; for (Int_t bit=0; bit<4; bit++){ @@ -436,26 +575,9 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) //} //} - AliMUONDigitStoreV2R digitStore; - digitStore.Create(); - digitStore.Clear(); - - AliMUONDigitStoreV2R digitStoreAll; - digitStoreAll.Create(); - digitStoreAll.Clear(); - TArrayS xyPatternAll[2]; - for(Int_t icath=0; icathClear(); + fTriggerStoreFromRaw->Clear(); + fTriggerStoreReprocessRaw->Clear(); AliMUONGlobalTrigger inputGlobalTrigger; @@ -471,14 +593,18 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) const AliMUONRawStreamTriggerHP::AliLocalStruct* localStruct = 0x0; Int_t nDeadLocal = 0, nDeadRegional = 0, nDeadGlobal = 0, nNoisyStrips = 0; + Int_t nFiredStrips = 0, nStripsTot = 0; // When a crate is not present, the loop on boards is not performed // This should allow to correctly count the local boards Int_t countNotifiedBoards = 0, countAllBoards = 0; + Bool_t containTriggerData = kFALSE; AliMUONRawStreamTriggerHP rawStreamTrig(rawReader); while (rawStreamTrig.NextDDL()) - { + { + containTriggerData = kTRUE; + Bool_t scalerEvent = rawReader->GetDataHeader()->GetL1TriggerMessage() & 0x1; Bool_t fillScalerHistos = ( scalerEvent && @@ -492,36 +618,41 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) darcHeader = rawStreamTrig.GetHeaders(); if (darcHeader->GetGlobalFlag()){ - if ( fillScalerHistos ) { - UInt_t nOfClocks = darcHeader->GetGlobalClock(); - Double_t nOfSeconds = ((Double_t) nOfClocks) / 40e6; // 1 clock each 25 ns - ((TH1F*)GetRawsData(kTriggerScalersTime))->Fill(1., nOfSeconds); - } - - //Get Global datas - inputGlobalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput()); - Bool_t resp[6] = {inputGlobalTrigger.PairUnlikeHpt(), inputGlobalTrigger.PairUnlikeLpt(), - inputGlobalTrigger.PairLikeHpt(), inputGlobalTrigger.PairLikeLpt(), - inputGlobalTrigger.SingleHpt(), inputGlobalTrigger.SingleHpt()}; - for (Int_t bit=0; bit<6; bit++){ - if ( ! resp[bit] ){ - if ( fillScalerHistos ) - nDeadGlobal++; - } - else - ((TH1F*)GetRawsData(kTriggerGlobalOutput))->Fill(bit); - } - - //for (Int_t Bit=0; Bit<32; Bit++){ - //fTriggerInputGlobalDataLPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(0)>>Bit)&1); - //fTriggerInputGlobalDataLPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(1)>>Bit)&1); - //fTriggerInputGlobalDataHPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(2)>>Bit)&1); - //fTriggerInputGlobalDataHPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(3)>>Bit)&1); - //} - - for (Int_t i=0; i<4; i++){ - globalInput[i]=darcHeader->GetGlobalInput(i); - } + if ( fillScalerHistos ) { + UInt_t nOfClocks = darcHeader->GetGlobalClock(); + Double_t nOfSeconds = ((Double_t) nOfClocks) / 40e6; // 1 clock each 25 ns + FillRawsData(AliMUONQAIndices::kTriggerScalersTime, 1., nOfSeconds); + const UInt_t* globScaler = darcHeader->GetGlobalScaler(); + Int_t bitCorr[6] = {2,0,3,1,4,5}; + for (Int_t bit=0; bit<6; bit++){ + FillRawsData(AliMUONQAIndices::kTriggerGlobalScalers, bitCorr[bit],(double)(*(globScaler+bit))); + } + } + + //Get Global datas + inputGlobalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput()); + Int_t resp[6] = {inputGlobalTrigger.PairUnlikeHpt(), inputGlobalTrigger.PairUnlikeLpt(), + inputGlobalTrigger.PairLikeHpt(), inputGlobalTrigger.PairLikeLpt(), + inputGlobalTrigger.SingleHpt(), inputGlobalTrigger.SingleLpt()}; + for (Int_t bit=0; bit<6; bit++){ + if ( resp[bit] == 0 ){ + if ( fillScalerHistos ) + nDeadGlobal++; + } + else + FillRawsData(AliMUONQAIndices::kTriggerGlobalOutput, bit, resp[bit]); + } // loop on bits + + //for (Int_t Bit=0; Bit<32; Bit++){ + //fTriggerInputGlobalDataLPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(0)>>Bit)&1); + //fTriggerInputGlobalDataLPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(1)>>Bit)&1); + //fTriggerInputGlobalDataHPt[Bit/4][Bit%4]=((darcHeader->GetGlobalInput(2)>>Bit)&1); + //fTriggerInputGlobalDataHPt[Bit/4+8][Bit%4]=((darcHeader->GetGlobalInput(3)>>Bit)&1); + //} + + for (Int_t i=0; i<4; i++){ + globalInput[i]=darcHeader->GetGlobalInput(i); + } } Int_t nReg = rawStreamTrig.GetRegionalHeaderCount(); @@ -568,16 +699,14 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) AliMUONLocalTrigger inputLocalTrigger; inputLocalTrigger.SetLocalStruct(loCircuit, *localStruct); - inputTriggerStore.Add(inputLocalTrigger); + fTriggerStoreFromRaw->Add(inputLocalTrigger); countNotifiedBoards++; TArrayS xyPattern[2]; localStruct->GetXPattern(xyPattern[0]); localStruct->GetYPattern(xyPattern[1]); - fDigitMaker->TriggerDigits(loCircuit, xyPattern, digitStore); - if ( fillScalerHistos ) // Compute total number of strips - fDigitMaker->TriggerDigits(loCircuit, xyPatternAll, digitStoreAll); + fDigitMaker->TriggerDigits(loCircuit, xyPattern, *fDigitStoreFromRaw); //Get electronic Decisions from data @@ -587,7 +716,7 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) //Get local in/outputs if (Int_t(localStruct->GetDec())!=0){ - ((TH1F*)GetRawsData(kTriggeredBoards))->Fill(loCircuit); + FillRawsData(AliMUONQAIndices::kTriggeredBoards,loCircuit); } else if ( fillScalerHistos ){ nDeadLocal++; @@ -596,6 +725,10 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) // loop over strips if ( fillScalerHistos ) { Int_t cathode = localStruct->GetComptXY()%2; + + Int_t offset = 0; + if (cathode && localBoard->GetSwitch(AliMpLocalBoard::kZeroAllYLSB)) offset = -8; + for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) { if (ibitxy==0){ AliDebug(AliQAv1::GetQADebugLevel(),"Filling trigger scalers"); @@ -607,15 +740,34 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) localStruct->GetXY3(ibitxy), localStruct->GetXY4(ibitxy) }; - - for(Int_t ich=0; ich 0 ) - ((TH2F*)GetRawsData(kTriggerScalers + AliMpConstants::NofTriggerChambers()*cathode + ich)) - ->Fill(loCircuit, ibitxy, 2*(Float_t)scalerVal[ich]); - - if ( scalerVal[ich] >= maxNcounts ) - nNoisyStrips++; - } // loop on chamber + + + + for(Int_t ich=0; ichGetDEfromLocalBoard(loCircuit, ich); + + const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode)); + + + Int_t istrip = ibitxy + offset; + + AliMpPad pad = seg->PadByLocation(loCircuit,istrip,kFALSE); + if (!pad.IsValid()) continue; + nStripsTot++; + + // UShort_t pattern = (UShort_t)xyPattern[cathode].At(ich); + // if ((pattern >> ibitxy) & 0x1) nFiredStrips++; + + if ( scalerVal[ich] > 0 ) { + FillRawsData(AliMUONQAIndices::kTriggerScalers + AliMpConstants::NofTriggerChambers()*cathode + ich, + loCircuit, istrip, 2*(Float_t)scalerVal[ich]); + nFiredStrips++; + } + + if ( scalerVal[ich] >= maxNcounts ) + nNoisyStrips++; + } // loop on chamber } // loop on strips } // scaler event } // iLocal @@ -623,24 +775,28 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) nDeadRegional++; // Not necessary when regional output will work } // iReg - Float_t readoutErrors[kNtrigStructErrorBins] = { - ((Float_t)rawStreamTrig.GetLocalEoWErrors())/((Float_t)countAllBoards), + Float_t readoutErrors[AliMUONQAIndices::kNtrigStructErrorBins] = { + countAllBoards>0?((Float_t)rawStreamTrig.GetLocalEoWErrors())/((Float_t)countAllBoards):0, ((Float_t)rawStreamTrig.GetRegEoWErrors())/16., ((Float_t)rawStreamTrig.GetGlobalEoWErrors())/6., ((Float_t)rawStreamTrig.GetDarcEoWErrors())/2. }; - for (Int_t ibin=0; ibin 0 ) - ((TH1F*)GetRawsData(kTriggerReadOutErrors))->Fill(ibin, readoutErrors[ibin]); + FillRawsData(AliMUONQAIndices::kTriggerReadOutErrors, ibin, readoutErrors[ibin]); } } // NextDDL + if ( ! containTriggerData ) return; + + FillRawsData(AliMUONQAIndices::kTriggerRawNAnalyzedEvents,1.); + nDeadLocal += AliMUONConstants::NTriggerCircuit() - countNotifiedBoards; - Int_t nStripsTot = digitStoreAll.GetSize(); if ( nStripsTot > 0 ) { // The value is != 0 only for scaler events - Float_t fraction[kNtrigCalibSummaryBins] = { - ((Float_t)(nStripsTot - digitStore.GetSize())) / ((Float_t)nStripsTot), + AliDebug(AliQAv1::GetQADebugLevel(), Form("nStripsFired %i nStripsTot %i", nFiredStrips, nStripsTot)); + Float_t fraction[AliMUONQAIndices::kNtrigCalibSummaryBins] = { + ((Float_t)(nStripsTot - nFiredStrips)) / ((Float_t)nStripsTot), //(Float_t)nDeadLocal / ((Float_t)countNotifiedBoards), (Float_t)nDeadLocal / ((Float_t)AliMUONConstants::NTriggerCircuit()), (Float_t)nDeadRegional / 16., @@ -648,23 +804,32 @@ void AliMUONTriggerQADataMakerRec::MakeRaws(AliRawReader* rawReader) (Float_t)nNoisyStrips / ((Float_t)nStripsTot), }; - for(Int_t ibin = 0; ibin < kNtrigCalibSummaryBins; ibin++){ + for(Int_t ibin = 0; ibin < AliMUONQAIndices::kNtrigCalibSummaryBins; ibin++){ if ( fraction[ibin] > 0. ) - ((TH1F*)GetRawsData(kTriggerCalibSummary))->Fill(ibin, fraction[ibin]); + FillRawsData(AliMUONQAIndices::kTriggerCalibSummary,ibin, fraction[ibin]); } } - fTriggerProcessor->Digits2Trigger(digitStore,recoTriggerStore); + TriggerElectronics()->Digits2Trigger(*fDigitStoreFromRaw,*fTriggerStoreReprocessRaw); + + AliMUONGlobalTrigger* recoGlobalTriggerFromLocal; + recoGlobalTriggerFromLocal = fTriggerStoreReprocessRaw->Global(); //Reconstruct Global decision from Global inputs UChar_t recoResp = RawTriggerInGlobal2OutGlobal(globalInput); - AliMUONGlobalTrigger recoGlobalTrigger; - recoGlobalTrigger.SetFromGlobalResponse(recoResp); + AliMUONGlobalTrigger recoGlobalTriggerFromGlobal; + recoGlobalTriggerFromGlobal.SetFromGlobalResponse(recoResp); // Compare data and reconstructed decisions and fill histos - RawTriggerMatchOutLocal(inputTriggerStore, recoTriggerStore); + RawTriggerMatchOutLocal(); + //Fill ratio 44/34 histos + for ( Int_t itc=-1; itcGetEventSpecie() == AliRecoParam::kCalib ) return; - + if (!fDigitStore) fDigitStore = AliMUONVDigitStore::Create(*digitsTree); - + fDigitStore->Clear(); fDigitStore->Connect(*digitsTree, false); digitsTree->GetEvent(0); @@ -688,28 +853,30 @@ void AliMUONTriggerQADataMakerRec::MakeDigits(TTree* digitsTree) while ( ( dig = static_cast(next()) ) ) { - GetDigitsData(0)->Fill(dig->DetElemId()); - GetDigitsData(1)->Fill(dig->ADC()); + FillDigitsData(0,dig->DetElemId()); } } //____________________________________________________________________________ void AliMUONTriggerQADataMakerRec::MakeRecPoints(TTree* /*clustersTree*/) { + /// Fill histogram with total number of analyzed events for normalization purposes + // Do nothing in case of calibration event if ( GetRecoParam()->GetEventSpecie() == AliRecoParam::kCalib ) return; - GetRecPointsData(kNAnalyzedEvents)->Fill(1.); + FillRecPointsData(AliMUONQAIndices::kTriggerNAnalyzedEvents,1.); } //____________________________________________________________________________ void AliMUONTriggerQADataMakerRec::MakeESDs(AliESDEvent* /*esd*/) { + /// Empty implementation } //____________________________________________________________________________ -void AliMUONTriggerQADataMakerRec::DisplayTriggerInfo() +void AliMUONTriggerQADataMakerRec::DisplayTriggerInfo(Int_t itc) { // /// Display trigger information in a user-friendly way: @@ -718,34 +885,34 @@ void AliMUONTriggerQADataMakerRec::DisplayTriggerInfo() AliMUONTriggerDisplay triggerDisplay; - TH2F* histoStrips=0x0; - TH2F* histoDisplayStrips=0x0; - if ( GetRawsData(kTriggerScalers) ) { + TH2* histoStrips=0x0; + TH2* histoDisplayStrips=0x0; + if ( GetRawsData(AliMUONQAIndices::kTriggerScalers, itc) ) { AliMUONTriggerDisplay::EDisplayOption displayOption = AliMUONTriggerDisplay::kNormalizeToArea; for (Int_t iCath = 0; iCath < AliMpConstants::NofCathodes(); iCath++) { for (Int_t iChamber = 0; iChamber < AliMpConstants::NofTriggerChambers(); iChamber++) { - histoStrips = (TH2F*)GetRawsData(kTriggerScalers + AliMpConstants::NofTriggerChambers()*iCath + iChamber); + histoStrips = (TH2*)GetRawsData(AliMUONQAIndices::kTriggerScalers + AliMpConstants::NofTriggerChambers()*iCath + iChamber, itc); if(histoStrips->GetEntries()==0) continue; // No events found => No need to display - histoDisplayStrips = (TH2F*)GetRawsData(kTriggerScalersDisplay + AliMpConstants::NofTriggerChambers()*iCath + iChamber); + histoDisplayStrips = (TH2*)GetRawsData(AliMUONQAIndices::kTriggerScalersDisplay + AliMpConstants::NofTriggerChambers()*iCath + iChamber, itc); triggerDisplay.FillDisplayHistogram(histoStrips, histoDisplayStrips, AliMUONTriggerDisplay::kDisplayStrips, iCath, iChamber, displayOption); - Float_t scaleValue = ((TH1F*)GetRawsData(kTriggerScalersTime))->GetBinContent(1); + Float_t scaleValue = ((TH1*)GetRawsData(AliMUONQAIndices::kTriggerScalersTime, itc))->GetBinContent(1); if(scaleValue>0.) histoDisplayStrips->Scale(1./scaleValue); } // iChamber } // iCath } - - if ( GetRawsData(kTriggeredBoards) ){ - TH1F* histoBoards = (TH1F*)GetRawsData(kTriggeredBoards); - TH2F* histoDisplayBoards = (TH2F*)GetRawsData(kTriggerBoardsDisplay); + + if ( GetRawsData(AliMUONQAIndices::kTriggeredBoards, itc) ){ + TH1* histoBoards = (TH1*)GetRawsData(AliMUONQAIndices::kTriggeredBoards, itc); + TH2* histoDisplayBoards = (TH2*)GetRawsData(AliMUONQAIndices::kTriggerBoardsDisplay, itc); triggerDisplay.FillDisplayHistogram(histoBoards, histoDisplayBoards, AliMUONTriggerDisplay::kDisplayBoards, 0, 0); - Float_t scaleValue = GetRawsData(kRawNAnalyzedEvents)->GetBinContent(1); + Float_t scaleValue = GetRawsData(AliMUONQAIndices::kTriggerRawNAnalyzedEvents, itc)->GetBinContent(1); if(scaleValue>0.) histoDisplayBoards->Scale(1./scaleValue); } } @@ -756,10 +923,12 @@ Bool_t AliMUONTriggerQADataMakerRec::FillTriggerDCSHistos() { /// Get HV and currents values for one trigger chamber - + // RS: Note: the histos involved in this routin are forbidden to be cloned, -1 in GetRawsData returns the default histos + int itc = -1; + // AliCodeTimerAuto("",0); - - TMap* triggerDcsMap = fCalibrationData->TriggerDCS(); + + TMap* triggerDcsMap = CalibrationData()->TriggerDCS(); if ( !triggerDcsMap ) { @@ -890,11 +1059,11 @@ AliMUONTriggerQADataMakerRec::FillTriggerDCSHistos() Int_t iChamber = AliMpDEManager::GetChamberId(detElemId); Int_t ich = iChamber - AliMpConstants::NofTrackingChambers(); - histoIndex = kTriggerRPChv + ich; - histoName = Form("hRPCHVChamber%i", 11+ich); + histoIndex = AliMUONQAIndices::kTriggerRPChv + ich; + histoName = Form("hTriggerRPCHVChamber%i", 11+ich); histoTitle = Form("Chamber %i: RPC HV (kV)", 11+ich); - currHisto = (TH2F*)GetRecPointsData(histoIndex); + currHisto = (TH2F*)GetRecPointsData(histoIndex,itc); // RS this histo is not cloned if(!currHisto){ currHisto = new TH2F(histoName.Data(), histoTitle.Data(), @@ -907,6 +1076,7 @@ AliMUONTriggerQADataMakerRec::FillTriggerDCSHistos() currHisto->GetYaxis()->SetTitle("RPC"); currHisto->SetOption("TEXT45COLZ"); Add2RecPointsList(currHisto, histoIndex, expert, !image); + ForbidCloning(currHisto); // RS } Int_t slat = detElemId%100; @@ -966,7 +1136,7 @@ AliMUONTriggerQADataMakerRec::FillTriggerDCSHistos() previousVal = currVal; } // loop on values currHisto->SetBinContent(previousBin, slatBin, scaleFactor*sumValuesPerBin/((Double_t)nValuesPerBin)); // Fill last value - if ( isTrip ) ((TH1F*)GetRecPointsData(kTriggerRPCtrips))->Fill(detElemId); + if ( isTrip ) ((TH1*)GetRecPointsData(AliMUONQAIndices::kTriggerRPCtrips,itc))->Fill(detElemId); } // if ( values ) deIt.Next(); } // loop on detElem @@ -979,6 +1149,10 @@ TObjArray* AliMUONTriggerQADataMakerRec::GetDCSValues(Int_t iMeas, Int_t detElemId, TMap* triggerDcsMap, AliMpDCSNamer& triggerDcsNamer) { + // + /// Get values of DCS data points from the map + // + if ( AliMpDEManager::GetStationType(detElemId) != AliMp::kStationTrigger) return 0x0; TString currAlias = triggerDcsNamer.DCSChannelName(detElemId, 0, iMeas); @@ -987,15 +1161,15 @@ AliMUONTriggerQADataMakerRec::GetDCSValues(Int_t iMeas, Int_t detElemId, if (!triggerDcsPair) { - printf(Form("Did not find expected alias (%s) for DE %d\n", - currAlias.Data(),detElemId)); + AliError(Form("Did not find expected alias (%s) for DE %d\n", + currAlias.Data(),detElemId)); return 0x0; } TObjArray* values = static_cast(triggerDcsPair->Value()); if (!values) { - printf(Form("Could not get values for alias %s\n",currAlias.Data())); + AliError(Form("Could not get values for alias %s\n",currAlias.Data())); return 0x0; } @@ -1012,7 +1186,7 @@ UChar_t AliMUONTriggerQADataMakerRec::RawTriggerInGlobal2OutGlobal(UInt_t global AliCodeTimerAuto("",0); - AliMUONGlobalCrateConfig* globalConfig = fCalibrationData->GlobalTriggerCrateConfig(); + AliMUONGlobalCrateConfig* globalConfig = CalibrationData()->GlobalTriggerCrateConfig(); AliMUONGlobalTriggerBoard globalTriggerBoard; globalTriggerBoard.Reset(); @@ -1027,12 +1201,10 @@ UChar_t AliMUONTriggerQADataMakerRec::RawTriggerInGlobal2OutGlobal(UInt_t global } //____________________________________________________________________________ -void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocal(AliMUONVTriggerStore& inputTriggerStore, - AliMUONVTriggerStore& recoTriggerStore) +void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocal() { // /// Match data and reconstructed Local Trigger decision - // AliCodeTimerAuto("",0); @@ -1043,16 +1215,16 @@ void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocal(AliMUONVTriggerStore& // First search for YCopy errors. Int_t loCircuit = -1; - TIter next(recoTriggerStore.CreateLocalIterator()); + TIter next(fTriggerStoreReprocessRaw->CreateLocalIterator()); AliMUONLocalTrigger* recoLocalTrigger, *inputLocalTrigger; while ( ( recoLocalTrigger = static_cast(next()) ) ) { loCircuit = recoLocalTrigger->LoCircuit(); Int_t iboard = loCircuit - 1; - ((TH1F*)GetRawsData(kTriggerErrorLocalYCopyTest))->Fill(loCircuit); + FillRawsData(AliMUONQAIndices::kTriggerErrorLocalYCopyTest,loCircuit); - inputLocalTrigger = inputTriggerStore.FindLocal(loCircuit); + inputLocalTrigger = fTriggerStoreFromRaw->FindLocal(loCircuit); Int_t recoTrigPattern[4] = {recoLocalTrigger->GetY1Pattern(), recoLocalTrigger->GetY2Pattern(), recoLocalTrigger->GetY3Pattern(), recoLocalTrigger->GetY4Pattern()}; Int_t inputTrigPattern[4] = {inputLocalTrigger->GetY1Pattern(), inputLocalTrigger->GetY2Pattern(), inputLocalTrigger->GetY3Pattern(), inputLocalTrigger->GetY4Pattern()}; @@ -1074,77 +1246,94 @@ void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocal(AliMUONVTriggerStore& } } // loop on chambers if ( errorInCopyBoard ) - ((TH1F*)GetRawsData(kTriggerErrorLocalYCopy))->Fill(loCircuit); + FillRawsData(AliMUONQAIndices::kTriggerErrorLocalYCopy,loCircuit); } // loop on local boards if (errorInYCopy) - ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalYCopy); + FillRawsData(AliMUONQAIndices::kTriggerErrorSummary,AliMUONQAIndices::kAlgoLocalYCopy); Bool_t errorInXPosDev = kFALSE; Bool_t errorInYPosTrigY = kFALSE; Bool_t errorInLUT = kFALSE; next.Reset(); + Bool_t respBendPlane, respNonBendPlane; while ( ( recoLocalTrigger = static_cast(next()) ) ) { loCircuit = recoLocalTrigger->LoCircuit(); Int_t iboard = loCircuit - 1; - inputLocalTrigger = inputTriggerStore.FindLocal(loCircuit); + // Fill ratio 44/34 histos (if not scaler event) + if ( GetRecoParam()->GetEventSpecie() != AliRecoParam::kCalib ) { + Bool_t is34 = ( recoLocalTrigger->GetLoDecision() != 0 ); + Bool_t is44 = TriggerElectronics()->ModifiedLocalResponse(loCircuit, respBendPlane, respNonBendPlane, kTRUE); + if ( is34 ) FillRawsData(AliMUONQAIndices::kTriggerNumberOf34Dec,loCircuit); + if ( is44 ) FillRawsData(AliMUONQAIndices::kTriggerNumberOf44Dec,loCircuit); + + if ( is44 && ! is34 ) + AliWarning(Form("Local board %i satisfies the 4/4 conditions but not the 3/4", loCircuit)); + } + + inputLocalTrigger = fTriggerStoreFromRaw->FindLocal(loCircuit); if ( recoLocalTrigger->LoStripX() != inputLocalTrigger->LoStripX() ) { - ((TH1F*)GetRawsData(kTriggerErrorLocalXPos))->Fill(loCircuit); + FillRawsData(AliMUONQAIndices::kTriggerErrorLocalXPos,loCircuit); errorInXPosDev = kTRUE; } - + if ( recoLocalTrigger->GetDeviation() != inputLocalTrigger->GetDeviation() ) { - ((TH1F*)GetRawsData(kTriggerErrorLocalDev))->Fill(loCircuit); + FillRawsData(AliMUONQAIndices::kTriggerErrorLocalDev,loCircuit); errorInXPosDev = kTRUE; } - // Skip following checks in case we previously found YCopy errors - if ( skipBoard[iboard] ) continue; - - if ( recoLocalTrigger->GetLoDecision() != inputLocalTrigger->GetLoDecision() ) { - ((TH1F*)GetRawsData(kTriggerErrorLocalTriggerDec))->Fill(loCircuit); - } - - // Test Hpt and LPT - Int_t recoLut[2] = { recoLocalTrigger->LoLpt(), recoLocalTrigger->LoHpt() }; - Int_t inputLut[2] = {inputLocalTrigger->LoLpt(), inputLocalTrigger->LoHpt() }; - Int_t currIndex[2][2] = {{kTriggerErrorLocalLPtLSB, kTriggerErrorLocalLPtMSB}, - {kTriggerErrorLocalHPtMSB, kTriggerErrorLocalHPtMSB}}; - for (Int_t ilut=0; ilut<2; ilut++){ - Int_t bitDiff = recoLut[ilut]^inputLut[ilut]; - if ( bitDiff == 0 ) continue; - for (Int_t ibit=0; ibit<2; ibit++){ - Bool_t isBitDifferent = (bitDiff>>ibit)&1; - if ( isBitDifferent ){ - ((TH1F*)GetRawsData(currIndex[ilut][ibit]))->Fill(loCircuit); - errorInLUT = kTRUE; + // Skip following checks in case we previously found YCopy error and YPos or trigY errors + if ( (!skipBoard[iboard]) || ( (recoLocalTrigger->LoStripY() == inputLocalTrigger->LoStripY()) && (recoLocalTrigger->LoTrigY() == inputLocalTrigger->LoTrigY())) ) { + + if ( recoLocalTrigger->GetLoDecision() != inputLocalTrigger->GetLoDecision() ) { + FillRawsData(AliMUONQAIndices::kTriggerErrorLocalTriggerDec,loCircuit); + } + + // Test Hpt and LPT + Int_t recoLut[2] = { recoLocalTrigger->LoLpt(), recoLocalTrigger->LoHpt() }; + Int_t inputLut[2] = {inputLocalTrigger->LoLpt(), inputLocalTrigger->LoHpt() }; + Int_t currIndex[2][2] = {{AliMUONQAIndices::kTriggerErrorLocalLPtLSB, AliMUONQAIndices::kTriggerErrorLocalLPtMSB}, + {AliMUONQAIndices::kTriggerErrorLocalHPtMSB, AliMUONQAIndices::kTriggerErrorLocalHPtMSB}}; + for (Int_t ilut=0; ilut<2; ilut++){ + Int_t bitDiff = recoLut[ilut]^inputLut[ilut]; + if ( bitDiff == 0 ) continue; + for (Int_t ibit=0; ibit<2; ibit++){ + Bool_t isBitDifferent = (bitDiff>>ibit)&1; + if ( isBitDifferent ){ + FillRawsData(currIndex[ilut][ibit],loCircuit); + errorInLUT = kTRUE; + } + } } - } } + + + // Skip following checks in case we previously found YCopy errors + if ( skipBoard[iboard] ) continue; if ( recoLocalTrigger->LoStripY() != inputLocalTrigger->LoStripY() ) { - ((TH1F*)GetRawsData(kTriggerErrorLocalYPos))->Fill(loCircuit); + FillRawsData(AliMUONQAIndices::kTriggerErrorLocalYPos,loCircuit); errorInYPosTrigY = kTRUE; } if ( recoLocalTrigger->LoTrigY() != inputLocalTrigger->LoTrigY() ) { - ((TH1F*)GetRawsData(kTriggerErrorLocalTrigY))->Fill(loCircuit); + FillRawsData(AliMUONQAIndices::kTriggerErrorLocalTrigY,loCircuit); errorInYPosTrigY = kTRUE; } } // loop on local boards - + if (errorInXPosDev) - ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalX); + FillRawsData(AliMUONQAIndices::kTriggerErrorSummary,AliMUONQAIndices::kAlgoLocalX); if (errorInLUT) - ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalLUT); + FillRawsData(AliMUONQAIndices::kTriggerErrorSummary,AliMUONQAIndices::kAlgoLocalLUT); if (errorInYPosTrigY) - ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoLocalY); + FillRawsData(AliMUONQAIndices::kTriggerErrorSummary,AliMUONQAIndices::kAlgoLocalY); } /* @@ -1175,28 +1364,169 @@ void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutLocalInRegional() //____________________________________________________________________________ -void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutGlobalFromInGlobal(AliMUONGlobalTrigger& inputGlobalTrigger, - AliMUONGlobalTrigger& recoGlobalTrigger) +void AliMUONTriggerQADataMakerRec::RawTriggerMatchOutGlobal(AliMUONGlobalTrigger& inputGlobalTrigger, + AliMUONGlobalTrigger& recoGlobalTrigger, + Char_t histo) { // - /// Match data and reconstructed Global Trigger decision for a reconstruction from Global inputs + /// Match data and reconstructed Global Trigger decision for a reconstruction from Global inputs. + /// histo='G': fill FromGlobalInput histo='L': fill from Local input; // if ( recoGlobalTrigger.GetGlobalResponse() == inputGlobalTrigger.GetGlobalResponse() ) return; + Int_t histoToFill; + Int_t binToFill; + + if (histo=='G'){ + histoToFill=AliMUONQAIndices::kTriggerErrorOutGlobalFromInGlobal; + binToFill=AliMUONQAIndices::kAlgoGlobalFromGlobal; + }else{ + if (histo=='L'){ + histoToFill=AliMUONQAIndices::kTriggerErrorOutGlobalFromInLocal; + binToFill=AliMUONQAIndices::kAlgoGlobalFromLocal; + }else{ + AliWarning(Form("Global histos not filled, 3rd argument must be 'G' or 'L'")); + return; + } + } - ((TH1F*)GetRawsData(kTriggerErrorSummary))->Fill(kAlgoGlobalFromGlobal); + FillRawsData(AliMUONQAIndices::kTriggerErrorSummary,binToFill); + + Int_t inputResp[6] = {inputGlobalTrigger.PairUnlikeHpt(), inputGlobalTrigger.PairUnlikeLpt(), + inputGlobalTrigger.PairLikeHpt(), inputGlobalTrigger.PairLikeLpt(), + inputGlobalTrigger.SingleHpt(), inputGlobalTrigger.SingleLpt()}; + + Int_t recoResp[6] = {recoGlobalTrigger.PairUnlikeHpt(), recoGlobalTrigger.PairUnlikeLpt(), + recoGlobalTrigger.PairLikeHpt(), recoGlobalTrigger.PairLikeLpt(), + recoGlobalTrigger.SingleHpt(), recoGlobalTrigger.SingleLpt()}; + + for (int bit=0;bit<6;bit++){ + if ( recoResp[bit] != inputResp[bit] ) + FillRawsData(histoToFill,bit); + } +} - Bool_t inputResp[6] = {inputGlobalTrigger.PairUnlikeHpt(), inputGlobalTrigger.PairUnlikeLpt(), - inputGlobalTrigger.PairLikeHpt(), inputGlobalTrigger.PairLikeLpt(), - inputGlobalTrigger.SingleHpt(), inputGlobalTrigger.SingleHpt()}; +//____________________________________________________________________________ +void AliMUONTriggerQADataMakerRec::FillRatio4434Histos(Int_t evtInterval, Int_t itc, Bool_t isEndOfCycle) +{ + /// Fill ratio 44/34 histos + TH1* histoEvents = ( isEndOfCycle ) ? GetRawsData(AliMUONQAIndices::kTriggerRawNAnalyzedEvents,itc) : GetMatchingRawsHisto(AliMUONQAIndices::kTriggerRawNAnalyzedEvents,itc); + if ( ! histoEvents ) return; + Int_t numEvent = Int_t(histoEvents->GetBinContent(1)); - Bool_t recoResp[6] = {recoGlobalTrigger.PairUnlikeHpt(), recoGlobalTrigger.PairUnlikeLpt(), - recoGlobalTrigger.PairLikeHpt(), recoGlobalTrigger.PairLikeLpt(), - recoGlobalTrigger.SingleHpt(), recoGlobalTrigger.SingleHpt()}; + // Fill every fgkUpdateRatio4434 events + if (numEvent % evtInterval != 0) + return; + + TH1* histo44dec = ( isEndOfCycle ) ? GetRawsData(AliMUONQAIndices::kTriggerNumberOf44Dec,itc) : GetMatchingRawsHisto(AliMUONQAIndices::kTriggerNumberOf44Dec,itc); + TH1* histo34dec = ( isEndOfCycle ) ? GetRawsData(AliMUONQAIndices::kTriggerNumberOf34Dec,itc) : GetMatchingRawsHisto(AliMUONQAIndices::kTriggerNumberOf34Dec,itc); + + Float_t totalNumberOf44 = histo44dec->GetSumOfWeights(); + Float_t totalNumberOf34 = histo34dec->GetSumOfWeights(); - for (int bit=0;bit<6;bit++){ - if ( recoResp[bit] != inputResp[bit] ) - ((TH1F*)GetRawsData(kTriggerErrorOutGlobalFromInGlobal))->Fill(bit); + if ( totalNumberOf34 == 0 ) + return; + + TH1* histoAllEvents = ( isEndOfCycle ) ? GetRawsData(AliMUONQAIndices::kTriggerRatio4434AllEvents,itc) : GetMatchingRawsHisto(AliMUONQAIndices::kTriggerRatio4434AllEvents,itc); + + if ( ! histoAllEvents ) return; + Int_t nbins = histoAllEvents->GetNbinsX(); + Float_t maxBin = histoAllEvents->GetXaxis()->GetBinLowEdge(nbins+1); + + if ( numEvent - maxBin < 1) return; + + // Use the underflow and overflow to store the number of 34 and 44 + // in previous event + Float_t previousNumOf34 = histoAllEvents->GetBinContent(0); + Float_t previousNumOf44 = histoAllEvents->GetBinContent(nbins+1); + + Float_t numOf34Update = totalNumberOf34 - previousNumOf34; + Float_t numOf44Update = totalNumberOf44 - previousNumOf44; + + // Not enough new tracks since last update + //if ( numOf34Update == 0 && numOf44Update == 0 ) + if ( numOf34Update < evtInterval - 1 ) + return; + + Int_t newNbins = ( (Int_t)maxBin % fgkUpdateRatio4434 ) ? nbins : nbins+1; + TString cloneName; + + TH1* histoRatioSinceLastUpdate = ( isEndOfCycle ) ? GetRawsData(AliMUONQAIndices::kTriggerRatio4434SinceLastUpdate,itc) : GetMatchingRawsHisto(AliMUONQAIndices::kTriggerRatio4434SinceLastUpdate,itc); + + TH1* histos[2] = {histoAllEvents, histoRatioSinceLastUpdate}; + + for (Int_t ihisto=0; ihisto<2; ihisto++){ + TH1* currHisto = histos[ihisto]; + cloneName = Form("%sClone", currHisto->GetName()); + TArrayD newAxis(newNbins+1); + for (Int_t ibin=0; ibinGetXaxis()->GetBinLowEdge(ibin+1); + } + newAxis[newNbins] = numEvent; + TH1F* copyHisto = (TH1F*)currHisto->Clone(cloneName.Data()); + //currHisto->SetBins(newNbins, 0., fgkUpdateRatio4434*newNbins); + currHisto->SetBins(newNbins, newAxis.GetArray()); + for (Int_t ibin=1; ibinSetBinContent(ibin, copyHisto->GetBinContent(ibin)); + currHisto->SetBinError(ibin, copyHisto->GetBinError(ibin)); + } + delete copyHisto; } + + Float_t ratio4434 = totalNumberOf44/totalNumberOf34; + Float_t errorRatio4434 = ProtectedSqrt(totalNumberOf44*(1-ratio4434))/totalNumberOf34; + + histoAllEvents->SetBinContent(newNbins,ratio4434); + histoAllEvents->SetBinError(newNbins,errorRatio4434); + + Float_t ratio4434Update = 0.; + Float_t errorRatio4434Update = 0.; + + if(numOf34Update!=0){ + ratio4434Update = numOf44Update/numOf34Update; + if ( numOf44Update > numOf34Update ){ + AliWarning(Form("Number of 4/4 (%f) is higher than number of 3/4 (%f)", numOf44Update, numOf34Update)); + } + errorRatio4434Update = ProtectedSqrt(numOf44Update*(1-ratio4434Update))/numOf34Update; + } + + histoRatioSinceLastUpdate->SetBinContent(newNbins,ratio4434Update); + histoRatioSinceLastUpdate->SetBinError(newNbins,errorRatio4434Update); + + histoAllEvents->SetBinContent(0,totalNumberOf34); + histoAllEvents->SetBinContent(newNbins+1,totalNumberOf44); + +} + + +//____________________________________________________________________________ +AliMUONTriggerElectronics* AliMUONTriggerQADataMakerRec::TriggerElectronics() +{ + /// Return trigger electronics + /// (create it if necessary) + if ( ! fTriggerProcessor ) + fTriggerProcessor = new AliMUONTriggerElectronics(CalibrationData()); + return fTriggerProcessor; +} + + +//____________________________________________________________________________ +AliMUONCalibrationData* AliMUONTriggerQADataMakerRec::CalibrationData() +{ + /// Return calibration data + /// (create it if necessary) + if ( ! fCalibrationData ) fCalibrationData = new AliMUONCalibrationData(AliCDBManager::Instance()->GetRun()); + return fCalibrationData; +} + +//____________________________________________________________________________ +void AliMUONTriggerQADataMakerRec::ResetDetectorRaws(TObjArray* list) +{ + /// Reset the calibration data + ResetDetector(list); + delete fTriggerProcessor; + fTriggerProcessor = 0x0; + delete fCalibrationData; + fCalibrationData = 0x0; }