Separating run-dependent mapping data from data, which are not
[u/mrichter/AliRoot.git] / MUON / AliMUONQAChecker.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 // $Id$
17
18 #include "AliMUONQAChecker.h"
19
20 /// \class AliMUONQAChecker
21 ///
22 /// Implementation of AliQACheckerBase for MCH and MTR
23 ///
24 /// For the moment we only implement the checking of raw data QA for the tracker
25 /// by looking at the occupancy at the manu level.
26 /// We count the number of manus above a given occupancy threshold, and
27 /// depending on that number, the resulting QA flag is warning, error or fatal.
28 /// (there's no "info" type in this case).
29 ///
30 /// \author Laurent Aphecetche, Subatech
31
32 #include "AliQA.h"
33 #include "AliMUONVTrackerData.h"
34 #include "AliMpManuIterator.h"
35 #include <TDirectory.h>
36
37 /// \cond CLASSIMP
38 ClassImp(AliMUONQAChecker)
39 /// \endcond
40
41 //__________________________________________________________________
42 AliMUONQAChecker::AliMUONQAChecker() : 
43     AliQACheckerBase("MUON","MUON Quality Assurance Data Maker") 
44 {
45         /// ctor
46 }          
47
48 //__________________________________________________________________
49 AliMUONQAChecker::~AliMUONQAChecker() 
50 {
51         /// dtor
52 }
53
54 //__________________________________________________________________
55 AliMUONQAChecker::AliMUONQAChecker(const AliMUONQAChecker& qac) : 
56     AliQACheckerBase(qac.GetName(), qac.GetTitle()) 
57 {
58         /// copy ctor 
59 }   
60
61 //______________________________________________________________________________
62 const Double_t 
63 AliMUONQAChecker::Check(AliQA::ALITASK_t /*index*/)
64 {
65   /// Check data
66   
67   AliError(Form("This method is not implemented. Should it be ? fDataSubDir = %p (%s)",
68                 fDataSubDir, ( fDataSubDir ? fDataSubDir->GetPath() : "")));
69   return 0.0;
70 }
71
72 //______________________________________________________________________________
73 const Double_t 
74 AliMUONQAChecker::Check(AliQA::ALITASK_t index, TObjArray * list)
75 {
76   /// Check objects in list
77   
78   if ( index == AliQA::kRAW ) 
79   {
80     return CheckRaws(list);
81   }
82   
83   AliWarning(Form("Checker for task %d not implement for the moment",index));
84   return 0.0;
85 }
86
87 //______________________________________________________________________________
88 const Double_t 
89 AliMUONQAChecker::CheckRaws(TObjArray * list)
90 {
91         TIter next(list);
92         TObject* object;
93         AliMUONVTrackerData* data(0x0);
94   
95         while ( (object=next()) && !data )
96         {
97                 if (object->InheritsFrom("AliMUONVTrackerData"))
98                 {
99                         data = static_cast<AliMUONVTrackerData*>(object);
100                 }
101         }
102
103   if ( !data ) 
104   {
105     AliError("Did not find TrackerData in the list !");
106     return 0.0;
107   }
108   
109   AliMpManuIterator it;
110   Int_t detElemId;
111   Int_t manuId;
112   Int_t n50(0); // number of manus with occupancy above 0.5
113   Int_t n75(0); // number of manus with occupancy above 0.75
114   Int_t n(0); // number of manus with some occupancy
115   
116   while ( it.Next(detElemId,manuId) )
117   {
118     Float_t occ = data->Manu(detElemId,manuId,2);
119     if (occ > 0 ) ++n;
120     if (occ >= 0.5 ) ++n50;
121     if (occ >= 0.75 ) ++n75;    
122   }
123
124   AliInfo(Form("n %d n50 %d n75 %d",n,n50,n75));
125   
126   if ( n == 0 ) 
127   {
128     AliError("Oups. Got zero occupancy in all manus ?!");
129     return 0.0;
130   }
131
132   if ( n75 ) 
133   {
134     AliError(Form("Got %d manus with occupancy above 0.75",n75));
135     return 0.1;
136   }
137     
138   if ( n50 ) 
139   {
140     AliWarning(Form("Got %d manus with occupancy above 0.5",n50));
141     return 0.9;
142   }
143
144         return 1.0;
145 }
146
147 //______________________________________________________________________________
148 void 
149 AliMUONQAChecker::SetQA(AliQA::ALITASK_t index, const Double_t value) const
150 {
151         // sets the QA according the return value of the Check
152
153   AliQA * qa = AliQA::Instance(index);
154   
155   qa->UnSet(AliQA::kFATAL);
156   qa->UnSet(AliQA::kWARNING);
157   qa->UnSet(AliQA::kERROR);
158   qa->UnSet(AliQA::kINFO);
159   
160   if ( value == 1.0 ) 
161   {
162     qa->Set(AliQA::kINFO);
163   }
164   else if ( value == 0.0 )
165   {
166     qa->Set(AliQA::kFATAL);
167   }
168   else if ( value > 0.5 ) 
169   {
170     qa->Set(AliQA::kWARNING);
171   }
172   else
173   {
174     qa->Set(AliQA::kERROR);
175   }
176 }