//\r
// Created: June 13th 2008\r
//---\r
+// Last update: Sept. 29th. 2011 (by Mario RC: mrodrigu@mail.cern.ch) \r
+// --> ACOMultiSL0_DQM_Shifter filling histogram fixed\r
+// --> Expert histogram updated: 2 histograms (Checks the hits for SL0 and AMU mode)\r
+// --> To be include in the next update: threshold settings from AliACORDEQAThreshold class (not yet)\r
+// Last update: May 5th. 2011 (by Mario RC: mrodrigu@mail.cern.ch) -->Creates QA expert histograms \r
+// and QA-shifter histograms also with threshold lines and visual alarm\r
// Last Update: Aug. 27th 2008 --> Implementation to declare QA expert histogram\r
-// Last update: Nov. 14t 2009 --> MRC <mrodrigu@mail.cern.ch> (FCFM-BUAP) \r
+// Last update: Nov. 14t 2009 --> MRC <mrodrigu@mail.cern.ch> (FCFM-BUAP) \r
// |--> Change in Multiplicity histogram for AMORE (to detect empty triggers events of ACORDE)\r
\r
\r
#include <TFile.h> \r
#include <TH1F.h> \r
#include <TDirectory.h>\r
+#include <TPaveText.h>\r
// --- Standard library ---\r
\r
// --- AliRoot header files ---\r
ClassImp(AliACORDEQADataMakerRec)\r
\r
//____________________________________________________________________________ \r
-AliACORDEQADataMakerRec::AliACORDEQADataMakerRec():AliQADataMakerRec(AliQAv1::GetDetName(AliQAv1::kACORDE), "ACORDE Quality Assurance Data Maker")\r
+ AliACORDEQADataMakerRec::AliACORDEQADataMakerRec():AliQADataMakerRec(AliQAv1::GetDetName(AliQAv1::kACORDE), "ACORDE Quality Assurance Data Maker")\r
{\r
\r
}\r
//____________________________________________________________________________ \r
-AliACORDEQADataMakerRec::AliACORDEQADataMakerRec(const AliACORDEQADataMakerRec& qadm):AliQADataMakerRec() \r
+AliACORDEQADataMakerRec::AliACORDEQADataMakerRec(const AliACORDEQADataMakerRec& qadm):\r
+ AliQADataMakerRec()\r
{\r
SetName((const char*)qadm.GetName()) ; \r
SetTitle((const char*)qadm.GetTitle()); \r
}\r
+\r
+//__________________________________________________________________\r
+AliACORDEQADataMakerRec::~AliACORDEQADataMakerRec()\r
+{\r
+}\r
+\r
//__________________________________________________________________\r
AliACORDEQADataMakerRec& AliACORDEQADataMakerRec::operator = (const AliACORDEQADataMakerRec& qadm )\r
{\r
{\r
//Detector specific actions at end of cycle\r
// do the QA checking\r
+ ResetEventTrigClasses(); // reset triggers list to select all histos\r
+ // Update for DQM GUI\r
+ //\r
+\r
+ for (Int_t specie = 0; specie < AliRecoParam::kNSpecies ; specie++) {\r
+ if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) continue ;\r
+ // \r
+ // RS Set event specie\r
+ SetEventSpecie(AliRecoParam::ConvertIndex(specie));\r
+ //\r
+ for (int itc=-1;itc<GetNTrigClasses();itc++) { // RS Loop over the trigger classes\r
+ //\r
+ TObjArray * parr = GetRawsDataOfTrigClass(itc);\r
+ if (!parr) continue;\r
+ TObjArray &harr = *parr;\r
+ TH1* h0 = (TH1*)harr[0];\r
+ TH1* h2 = (TH1*)harr[2];\r
+ if (!h0 || !h2) continue;\r
+\r
+ Double_t integralSL0 = 0;\r
+ Double_t integralAMU = 0;\r
+\r
+ if ((itc==-1) && ( (integralAMU=h2->Integral()==0) || (integralSL0=h0->Integral()==0) ) ) continue;\r
+\r
+ Float_t maxSL0 = 1.1*h0->GetMaximum();\r
+ Float_t scaleSL0 = 0.;\r
+ if (maxSL0!=0) scaleSL0 = 1./maxSL0;\r
+ else scaleSL0 = 1.;\r
+ h0->Scale(scaleSL0);\r
+\r
+\r
+ Float_t maxAMU = 1.1*h2->GetMaximum();\r
+ Float_t scaleAMU = 0.;\r
+ if (maxAMU!=0) scaleAMU = 1./maxAMU;\r
+ else scaleAMU = 1.;\r
+ h2->Scale(scaleAMU);\r
+ \r
+ Int_t indexActiveModuleSL0 = 0;\r
+ Int_t indexActiveModuleAMU = 0;\r
+\r
+ for(Int_t iModule = 0; iModule < 60; iModule++){\r
+ if (h0->GetBinContent(iModule) > 0) indexActiveModuleSL0++;\r
+ if (h2->GetBinContent(iModule) > 0) indexActiveModuleAMU++;\r
+ }\r
+ \r
+ Float_t meanHitsSL0 = 0.;\r
+ Float_t meanHitsAMU = 0.;\r
+ if ((indexActiveModuleSL0==0) || (indexActiveModuleAMU == 0)) continue;\r
+\r
+ meanHitsSL0 = h0->Integral()/indexActiveModuleSL0;\r
+ meanHitsAMU = h2->Integral()/indexActiveModuleAMU;\r
+\r
+ TH1* h4 = (TH1*)harr[4];\r
+ TH1* h5 = (TH1*)harr[5];\r
+\r
+ if (h4 && h5 && meanHitsAMU!=0 && meanHitsSL0!=0){\r
+ for (Int_t iModule = 0; iModule < 60; iModule++){\r
+ h4->Fill(h0->GetBinContent(iModule)/meanHitsSL0-1);\r
+ h5->Fill(h2->GetBinContent(iModule)/meanHitsAMU-1);\r
+ }\r
+ }\r
+\r
+ } // end of trigger classes loop\r
+ } // end specie loop\r
+ // QA Checker standar (to be updated)\r
+ //\r
AliQAChecker::Instance()->Run(AliQAv1::kACORDE, task, list) ;\r
}\r
\r
{\r
// create Raw histograms in Raw subdir\r
\r
- const Bool_t expert = kTRUE ; \r
- const Bool_t saveCorr = kTRUE ; \r
- const Bool_t image = kTRUE ; \r
- char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
- "1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",\r
- "2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",\r
- "3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",\r
- "4_0","4_1","4_2","4_3","4_4","4_5","4_6","4_7","4_8","4_9",\r
- "5_0","5_1","5_2","5_3","5_4","5_5","5_6","5_7","5_8","5_9"};\r
-\r
-\r
- TH1F *fhACORDEBitPattern[4];\r
- fhACORDEBitPattern[0] = new TH1F("ACORDEBitPatternfromRAWSingle","Distribution of ACORDE fired modules from RAW-Single;Modules;Counts",60,1,60);//AcordeSingleMuon BitPattern\r
- fhACORDEBitPattern[1] = new TH1F("ACORDEBitPatternfromRAWMulti","Distribution of ACORDE fired modules from RAW-Multi;Modules;Counts",60,1,60);//AcordeMultiMuon BitPattern\r
- fhACORDEBitPattern[2] = new TH1F("ACORDEMultiplicityfromRAWSingle","Number of fired ACORDE modules;No. of fired ACORDE modules;No. of events in ACORDE",60,-0.5,60);//AcordeSingleMuon Multiplicity\r
- fhACORDEBitPattern[3] = new TH1F("ACORDEMultiplicityfromRAWMulti","Number of fired ACORDE modules; No. of fired ACORDE modules;No. of events in ACORDE",60,-0.5,60);//AcordeMultiMuon Multiplicity\r
- for(Int_t i=0;i<4;i++) \r
- Add2RawsList(fhACORDEBitPattern[i],i,!expert, image, !saveCorr);\r
- \r
- for (Int_t iModule = 0; iModule<60; iModule++)\r
- {\r
- fhACORDEBitPattern[0]->GetXaxis()->SetBinLabel(iModule+1,acoModule[iModule]);\r
- fhACORDEBitPattern[1]->GetXaxis()->SetBinLabel(iModule+1,acoModule[iModule]);\r
- }\r
+ const Bool_t expert = kTRUE ; \r
+ const Bool_t saveCorr = kTRUE ; \r
+ const Bool_t image = kTRUE ; \r
+ TH1F * fhACORDEBitPatternDQM = new TH1F("ACOHitsSL0_DQM_Shifter","Distribution of ACORDE fired modules for DQM shifter; No. of module; Counts",60,-0.5,59.5);// Hits histogram for QA-shifter ACO-SL0 trigger mode\r
+ TH1F * fhACORDEMultiplicitySL0DQM = new TH1F("ACOMultiSL0_DQM_Shifter","Multiplicity of ACORDE fired modules for DQM shifter; No. of fired modules; No. of events",62,-1,60); // Multiplicity histo. for QA-shifter ACO-SL0 trigger mode\r
+ TH1F * fhACORDEBitPatternAMUDQM = new TH1F("ACOHitsAMU_DQM_Shifter","Distribution of ACORDE fired modules for DQM shifter; No. of module; Counts",60,-0.5,59.5);// Hits histogram for QA-shifter ACO-SL0 trigger mode\r
+ TH1F * fhACORDEMultiplicityAMUDQM = new TH1F("ACOMultiAMU_DQM_Shifter","Multiplicity of ACORDE fired modules for DQM shifter; No. of fired modules; No. of events",62,-1,60); // Multiplicity histo. for QA-shifter ACO-SL0 trigger mode\r
+ TH1F * fhACORDEBitPatternCheckDQMSL0 = new TH1F("ACOHitsTriggerCheck_DQMExpertSL0","Check the activity of ACORDE's modules; Hits per module/mean of Hits; Counts",100,-3,5); // Check the trigger status of ACORDE (SL0 vs AMU)\r
+ TH1F * fhACORDEBitPatternCheckDQMAMU = new TH1F("ACOHitsTriggerCheck_DQMExpertAMU","Check the activity of ACORDE's modules; Hits per module/mean of Hits; Counts",100,-3,5); // Check the trigger status of ACORDE (SL0 vs AMU)\r
+ // Expert histograms\r
+ // Check the hits multiplicity from trigger configuration\r
+ Add2RawsList(fhACORDEBitPatternCheckDQMSL0,4,expert,image,!saveCorr);\r
+ fhACORDEBitPatternCheckDQMSL0->SetFillColor(kOrange);\r
+ Add2RawsList(fhACORDEBitPatternCheckDQMAMU,5,expert,image,!saveCorr);\r
+ fhACORDEBitPatternCheckDQMAMU->SetFillColor(kRed+2);\r
+\r
+ \r
+ // AMORE diplay settings for shifter on GUI\r
+ \r
+ // For SL0 ACO trigger mode\r
+ \r
+ Add2RawsList(fhACORDEBitPatternDQM,0,!expert,image,!saveCorr);\r
+ ForbidCloning(fhACORDEBitPatternDQM);\r
+ Add2RawsList(fhACORDEMultiplicitySL0DQM,1,!expert,image,!saveCorr);\r
+ ForbidCloning(fhACORDEMultiplicitySL0DQM);\r
\r
+ // For Hits distribution on ACORDE\r
+ \r
+ fhACORDEBitPatternDQM->SetFillColor(kMagenta+2);\r
+ \r
+ // For ACORDE Multiplicity distribution of fired modules\r
+ \r
+ fhACORDEMultiplicitySL0DQM->SetFillColor(kMagenta);\r
+ \r
+ // For AMU ACO trigger mode\r
+ \r
+ Add2RawsList(fhACORDEBitPatternAMUDQM,2,!expert,image,!saveCorr);\r
+ Add2RawsList(fhACORDEMultiplicityAMUDQM,3,!expert,image,!saveCorr);\r
+ \r
+ // For Hits distribution on ACORDE\r
+ \r
+ fhACORDEBitPatternAMUDQM->SetFillColor(kViolet+7);\r
+ \r
+ // For ACORDE Multiplicity distribution of fired modules\r
+ \r
+ fhACORDEMultiplicityAMUDQM->SetFillColor(kViolet+6);\r
+ \r
+ //\r
+ ClonePerTrigClass(AliQAv1::kRAWS); // this should be the last line\r
}\r
+\r
//____________________________________________________________________________ \r
void AliACORDEQADataMakerRec::InitDigits()\r
{\r
const Bool_t expert = kTRUE ; \r
const Bool_t image = kTRUE ; \r
TH1F * fhDigitsModule;\r
- char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
+ const char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
"1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",\r
"2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",\r
"3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",\r
fhDigitsModule = new TH1F("ACORDEBitPatternfromDigits","Distribution of ACORDE from DIGITS;Modules;Counts",60,1,60);\r
Add2DigitsList(fhDigitsModule,0,!expert,image);\r
for (Int_t i=0;i<60;i++) fhDigitsModule->GetXaxis()->SetBinLabel(i+1,acoModule[i]); \r
+ //\r
+ ClonePerTrigClass(AliQAv1::kDIGITS); // this should be the last line\r
}\r
\r
//____________________________________________________________________________ \r
{\r
// create cluster histograms in RecPoint subdir\r
// Not needed for ACORDE by now !!!\r
+ //\r
+ ClonePerTrigClass(AliQAv1::kRECPOINTS); // this should be the last line\r
}\r
\r
//____________________________________________________________________________\r
TH1F * fhESDsSingle;\r
TH1F * fhESDsMulti;\r
TH1F * fhESDsMultiplicity;\r
- char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
+ const char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
"1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",\r
"2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",\r
"3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",\r
fhESDsSingle->GetXaxis()->SetBinLabel(i+1,acoModule[i]);\r
fhESDsMulti->GetXaxis()->SetBinLabel(i+1,acoModule[i]);\r
}\r
-\r
-\r
+ //\r
+ ClonePerTrigClass(AliQAv1::kESDS); // this should be the last line\r
}\r
//____________________________________________________________________________\r
void AliACORDEQADataMakerRec::MakeRaws(AliRawReader* rawReader)\r
{\r
//fills QA histos for RAW\r
-\r
+ IncEvCountCycleRaws();\r
+ IncEvCountTotalRaws();\r
rawReader->Reset();\r
AliACORDERawStream rawStream(rawReader);\r
size_t contSingle=0;\r
{\r
if(kroSingle[r]==1)\r
{\r
- GetRawsData(0)->Fill(r+1);\r
- contSingle=contSingle+1;\r
+ FillRawsData(0,r);\r
+ //FillRawsData(4,r);\r
+ contSingle++;\r
}\r
if(kroMulti[r]==1)\r
{\r
- GetRawsData(1)->Fill(r+1);\r
- contMulti++;\r
+ FillRawsData(2,r);\r
+ //FillRawsData(6,r);\r
+ contMulti++;\r
}\r
-\r
- }GetRawsData(2)->Fill(contSingle);GetRawsData(3)->Fill(contMulti);\r
+ \r
+ } \r
+ FillRawsData(1,contSingle); \r
+ FillRawsData(3,contMulti); \r
+ // FillRawsData(7,contMulti);\r
}\r
}\r
//____________________________________________________________________________\r
void AliACORDEQADataMakerRec::MakeDigits( TTree *digitsTree)\r
{\r
//fills QA histos for Digits\r
+ IncEvCountCycleDigits();\r
+ IncEvCountTotalDigits();\r
+\r
if (fDigitsArray) \r
fDigitsArray->Clear() ; \r
else \r
AliError("The unchecked digit doesn't exist");\r
continue ;\r
}\r
- GetDigitsData(0)->Fill(AcoDigit->GetModule()-1);\r
+ FillDigitsData(0,AcoDigit->GetModule()-1);\r
}\r
}\r
}\r
void AliACORDEQADataMakerRec::MakeESDs(AliESDEvent * esd)\r
{\r
//fills QA histos for ESD\r
-\r
+ IncEvCountCycleESDs();\r
+ IncEvCountTotalESDs();\r
+ //\r
AliESDACORDE * fESDACORDE= esd->GetACORDEData();\r
Int_t acoMulti=0;\r
for(int i=0;i<60;i++)\r
{\r
- if(fESDACORDE->GetHitChannel(i)) \r
- {\r
- GetESDsData(0)->Fill(i+1);\r
- GetESDsData(1)->Fill(i+1);\r
- acoMulti++;\r
+ if(fESDACORDE->GetHitChannel(i)) \r
+ {\r
+ FillESDsData(0,i+1);\r
+ FillESDsData(1,i+1);\r
+ acoMulti++;\r
}\r
- }GetESDsData(2)->Fill(acoMulti);\r
+ } FillESDsData(2,acoMulti);\r
\r
}\r