]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ACORDE/AliACORDEQADataMakerRec.cxx
Optional scoring for background studies in HALL.
[u/mrichter/AliRoot.git] / ACORDE / AliACORDEQADataMakerRec.cxx
index 18e12de203546a8033a8bafb02b51b3146638c45..ed9957db912253eef712d802c98791ab41f377d7 100755 (executable)
 //\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
@@ -36,6 +42,7 @@
 #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
@@ -73,6 +87,72 @@ void AliACORDEQADataMakerRec::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObj
 {\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
@@ -88,32 +168,57 @@ void AliACORDEQADataMakerRec::InitRaws()
 {\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
@@ -122,7 +227,7 @@ void AliACORDEQADataMakerRec::InitDigits()
   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
@@ -133,6 +238,8 @@ void AliACORDEQADataMakerRec::InitDigits()
   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
@@ -141,6 +248,8 @@ void AliACORDEQADataMakerRec::InitRecPoints()
 {\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
@@ -154,7 +263,7 @@ void AliACORDEQADataMakerRec::InitESDs()
   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
@@ -175,14 +284,15 @@ void AliACORDEQADataMakerRec::InitESDs()
        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
@@ -230,22 +340,30 @@ if(rawStream.Next())
         {\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
@@ -263,7 +381,7 @@ void AliACORDEQADataMakerRec::MakeDigits( TTree *digitsTree)
           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
@@ -273,17 +391,19 @@ void AliACORDEQADataMakerRec::MakeDigits( TTree *digitsTree)
 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