+//____________________________________________________________________________
+void AliMUONTrackerQADataMakerRec::EndOfDetectorCycleDigits(Int_t specie, TObjArray** list)
+{
+ /// create digits histograms in digits subdir
+
+ if ( TrackerCalData(specie) )
+ {
+ AliCodeTimerAuto("",0);
+
+ /// put the trackerdata in the pipeline
+ InsertTrackerData(specie,list,TrackerCalData(specie),AliMUONQAIndices::kTrackerData);
+
+ TH1* hbp = GetDigitsData(AliMUONQAIndices::kTrackerBusPatchOccupancy);
+ TH1* hnevents = GetDigitsData(AliMUONQAIndices::kTrackerNofGoodPhysicsEventsUsed);
+ TH1* hddl = GetDigitsData(AliMUONQAIndices::kTrackerDDLOccupancy);
+ TH1* hddlevents = GetDigitsData(AliMUONQAIndices::kTrackerDDLNofEventsUsed);
+
+ if ( !hbp || !hnevents || !hddl || !hddlevents)
+ {
+ AliError(Form("Missing some histograms : cannot work : hbp=%p hnevents=%p hddl=%p hddlevents=%p",hbp,hnevents,hddl,hddlevents));
+ return;
+ }
+
+ ProjectTrackerData(TrackerCalData(specie),
+ *hbp,*hnevents,*hddl,*hddlevents);
+ }
+}
+
+//____________________________________________________________________________
+AliMUONQADataMakerRec* AliMUONTrackerQADataMakerRec::Master() const
+{
+ /// Get our master
+ return static_cast<AliMUONQADataMakerRec*>(fMaster);
+}
+
+//____________________________________________________________________________
+void AliMUONTrackerQADataMakerRec::ProjectTrackerData(AliMUONVTrackerData* data,
+ TH1& hbp,
+ TH1& hnevents,
+ TH1& hddl,
+ TH1& hddlevents)
+{
+ /// Project tracker data into shifter-friendly histograms
+
+ AliCodeTimerAuto(Form("%s",data->Name()),0);
+
+ /// project the tracerdata into buspatch occupancies (for the experts)
+ hbp.Reset();
+ hbp.SetStats(kFALSE);
+
+ TIter nextBP(AliMpDDLStore::Instance()->CreateBusPatchIterator());
+ AliMpBusPatch* bp(0x0);
+ Int_t occDim = 2;
+
+ while ( ( bp = static_cast<AliMpBusPatch*>(nextBP())) )
+ {
+ Int_t busPatchId = bp->GetId();
+ Int_t bin = hbp.FindBin(busPatchId);
+ if ( data->HasBusPatch(busPatchId) )
+ {
+ hbp.SetBinContent(bin,data->BusPatch(busPatchId,occDim)*100.0); // occupancy, in percent
+ }
+ }
+
+ /// log the readout errors (for the shifter)
+ hnevents.Reset();
+ hnevents.SetStats(kFALSE);
+ hnevents.SetBinContent(1,data->NumberOfEvents(-1));
+
+ /// project tracker data into DDL occupancies (for the shifter)
+ hddl.Reset();
+ hddl.SetStats(kFALSE);
+ hddlevents.Reset();
+ hddlevents.SetStats(kFALSE);
+
+ const Int_t nddls = AliDAQ::NumberOfDdls("MUONTRK");
+ const Int_t offset = AliDAQ::DdlIDOffset("MUONTRK");
+
+ for ( Int_t iddl = 0; iddl < nddls; ++iddl )
+ {
+ AliMpDDL* ddl = AliMpDDLStore::Instance()->GetDDL(iddl);
+
+ Int_t ddlId = offset + ddl->GetId();
+ Int_t npads = 0;
+
+ Int_t nevents = data->NumberOfEvents(iddl);
+
+ hddlevents.Fill(ddlId,nevents);
+
+ Double_t occ(0.0);
+
+ if ( nevents > 0 )
+ {
+ for ( Int_t ide = 0; ide < ddl->GetNofDEs(); ++ide )
+ {
+ Int_t de = ddl->GetDEId(ide);
+
+ npads += TMath::Nint(data->DetectionElement(de,3));
+
+ occ += data->DetectionElement(de,4);
+ }
+
+ if ( npads > 0 )
+ {
+ occ = occ/npads/nevents;
+ }
+ else
+ {
+ occ = 0.0;
+ }
+ }
+
+ hddl.Fill(ddlId,100.0*occ); // occ in percent
+ }
+
+ TPaveText* text = new TPaveText(0.50,0.8,0.9,0.9,"NDC");
+
+ text->AddText(Form("MCH RUN %d - %d events",AliCDBManager::Instance()->GetRun(),data->NumberOfEvents(-1)));
+
+ hddl.GetListOfFunctions()->Add(text);
+}