Make the Scan method public
[u/mrichter/AliRoot.git] / MUON / AliMUON2DStoreValidator.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 "AliMUON2DStoreValidator.h"
19
20 #include "AliLog.h"
21 #include "AliMUONCheckItem.h"
22 #include "AliMUONVCalibParam.h"
23 #include "AliMUONVStore.h"
24 #include "AliMpConstants.h"
25 #include "AliMpDDLStore.h"
26 #include "AliMpDEManager.h"
27 #include "AliMpDetElement.h"
28 #include "AliMpManuIterator.h"
29 #include <Riostream.h>
30 #include <TList.h>
31 #include <TObjArray.h>
32 #include <TObjString.h>
33
34 //-----------------------------------------------------------------------------
35 /// \class AliMUON2DStoreValidator
36 ///
37 /// Determine which channels, manus, DEs, stations are missing
38 /// from a VStore, which must be 2D, and the 2 dimensions must be
39 /// (detElemId,manuId).
40 /// This is mainly to be used during (shuttle) preprocessing
41 /// to insure that what we'll put in the CDB is as complete as possible,
42 /// and to detect possible problem.
43 ///
44 /// We made an effort to present the result of the validation in the most
45 /// concise way (i.e. if all channels of a DE are missing, we do not list 
46 /// them, we just write "DE dead" ;-) )
47 /// 
48 /// The list of missing things is kept in a structure of objects defined as :
49 /// 
50 /// fMissing = TObjArray[0..N tracking chambers]
51 ///
52 /// fMissing[iChamber] = AliMUONCheckItem which contains n AliMUONCheckItem, 
53 /// where n is the number of DE for that chamber
54 ///
55 /// fMissing[iChamber]->GetItem(de) = AliMUONCheckItem which contains m
56 /// AliMUONCheckItem where m is the number of Manu for that DE
57 ///
58 /// fMissing[iChamber]->GetItem(de)->GetItem(manu) = AliMUONCheckItem which 
59 /// contains k TObjString = Form("%d",manuChannel)
60 ///
61 /// \author Laurent Aphecetche
62 //-----------------------------------------------------------------------------
63
64 /// \cond CLASSIMP
65 ClassImp(AliMUON2DStoreValidator)
66 /// \endcond
67
68 //_____________________________________________________________________________
69 AliMUON2DStoreValidator::AliMUON2DStoreValidator() 
70 : TObject(),
71   fChambers(0x0),
72   fStatus(0x0)
73 {
74     /// ctor
75 }
76
77 //_____________________________________________________________________________
78 AliMUON2DStoreValidator::~AliMUON2DStoreValidator()
79 {
80   /// dtor
81   delete fChambers;
82   delete fStatus;
83 }
84
85 //_____________________________________________________________________________
86 AliMUONCheckItem* 
87 AliMUON2DStoreValidator::GetChamber(Int_t chamberID)
88 {
89   /// Return (and create if not present) the given chamber
90   /// chamberID in 0..NCh()
91   
92   if ( chamberID < 0 || chamberID >= AliMpConstants::NofTrackingChambers() )
93   {
94     AliFatal(Form("Invalid chamber number %d",chamberID));
95     return 0x0;
96   }
97   
98   if (!fChambers) 
99   {
100     fChambers = new TObjArray(AliMpConstants::NofTrackingChambers());
101   }
102     
103   AliMUONCheckItem* chamber = 
104     static_cast<AliMUONCheckItem*>(fChambers->At(chamberID));
105   
106   if (!chamber)
107   {
108     chamber = new AliMUONCheckItem(chamberID,
109                                    AliMpDEManager::GetNofDEInChamber(chamberID),
110                                    "Chamber");
111     fChambers->AddAt(chamber,chamberID);
112   }
113   return chamber;
114 }
115
116 //_____________________________________________________________________________
117 AliMUONCheckItem* 
118 AliMUON2DStoreValidator::GetDE(Int_t detElemId)
119 {
120   /// Return (and create if not present) a given detection element
121   
122   Int_t chamberID = AliMpDEManager::GetChamberId(detElemId);
123   AliMUONCheckItem* chamber = GetChamber(chamberID);  
124   AliMUONCheckItem* de = 
125     static_cast<AliMUONCheckItem*>(chamber->GetItem(detElemId));
126   if (!de)
127   {
128     AliDebug(3,Form("Did not find DE %4d into chamber %d, will create it",
129                     detElemId,chamberID));
130     de = new AliMUONCheckItem(detElemId,
131                               AliMpDDLStore::Instance()->GetDetElement(detElemId)->NofManus(),
132                               "Detection Element");
133     Bool_t ok = chamber->AddItem(detElemId,de);
134     if (!ok)
135     {
136       AliError(Form("Could not add DE %4d into chamber %2d",detElemId,chamberID));
137     }
138   }
139   return de;
140 }
141
142 //_____________________________________________________________________________
143 AliMUONCheckItem* 
144 AliMUON2DStoreValidator::GetManu(Int_t detElemId, Int_t manuId)
145 {
146   /// Return (and create) a given manu
147   
148   AliMUONCheckItem* de = GetDE(detElemId);
149   AliMUONCheckItem* manu = static_cast<AliMUONCheckItem*>(de->GetItem(manuId));
150   if (!manu)
151   {
152     manu = new AliMUONCheckItem(manuId,AliMpDDLStore::Instance()->GetDetElement(detElemId)->NofChannelsInManu(manuId),"Manu");
153     Bool_t ok = de->AddItem(manuId,manu);
154     if (!ok)
155     {
156       AliError(Form("Could not add manu %4d into DE %4d",manuId,detElemId));
157     }
158     
159   }
160   return manu;
161 }
162
163 //_____________________________________________________________________________
164 void
165 AliMUON2DStoreValidator::AddMissingChannel(Int_t detElemId, 
166                                            Int_t manuId, Int_t manuChannel)
167 {
168   /// Add one missing channel to the list of missing things
169   
170   AliDebug(3,Form("DE %4d Manu %4d Channel %2d is missing",
171                   detElemId,manuId,manuChannel));
172
173   AliMUONCheckItem* manu = GetManu(detElemId,manuId);
174   Bool_t ok = manu->AddItem(manuChannel,new TObjString(Form("%2d",manuChannel)));
175   if (!ok)
176   {
177     AliError(Form("Could not add channel %2d to manuId %4d in DE %4d",
178                     manuChannel,manuId,detElemId));
179   }
180 }
181
182 //_____________________________________________________________________________
183 void
184 AliMUON2DStoreValidator::AddMissingManu(Int_t detElemId, Int_t manuId)
185 {
186   /// Add one missing manu to the list of missing things
187   
188   AliDebug(3,Form("DE %4d Manu %4d is completely missing",
189                   detElemId,manuId));
190
191   Int_t n(AliMpDDLStore::Instance()->GetDetElement(detElemId)->NofChannelsInManu(manuId));
192
193   for ( Int_t i = 0; i < n; ++i )
194   {
195     AddMissingChannel(detElemId,manuId,i);
196   }
197 }
198
199 //_____________________________________________________________________________
200 void
201 AliMUON2DStoreValidator::ReportManu(TList& lines, const AliMUONCheckItem& manu)
202 {  
203   /// Report list of missing channels from this manu
204   
205   TObjString* channel(0x0);
206   TIter next(manu.CreateIterator());
207   
208   while ( ( channel = static_cast<TObjString*>(next()) ) )
209   {
210     lines.Add(new TObjString(Form("\t\t\tChannel %s is missing or dead",
211                                   channel->GetString().Data())));
212   }
213   
214 }
215
216 //_____________________________________________________________________________
217 void
218 AliMUON2DStoreValidator::ReportDE(TList& lines, const AliMUONCheckItem& de)
219 {  
220   /// Report list of missing manus from this de
221   AliMUONCheckItem* manu(0x0);
222   
223   TIter next(de.CreateIterator());
224   
225   lines.Add(new TObjString(Form("DE %5d",de.GetID())));
226   
227   
228   while ( ( manu = static_cast<AliMUONCheckItem*>(next()) ) )
229   {
230     if ( manu->IsDead() )
231     {
232       lines.Add(new TObjString(Form("\t\tManu %4d is missing or dead",manu->GetID())));
233     }
234     else
235     {
236       ReportManu(lines,*manu);
237     }
238   }
239 }
240
241 //_____________________________________________________________________________
242 void
243 AliMUON2DStoreValidator::ReportChamber(TList& lines, const AliMUONCheckItem& chamber)
244 {  
245   /// Report list of missing de from this chamber
246   
247   AliMUONCheckItem* de(0x0);
248   TIter next(chamber.CreateIterator());
249   
250   while ( ( de = static_cast<AliMUONCheckItem*>(next()) ) )
251   {
252     if ( de->IsDead() )
253     {
254       lines.Add(new TObjString(Form("\tDE %4d is missing or dead",de->GetID())));
255     }
256     else
257     {
258       ReportDE(lines,*de);
259     }
260   }
261 }
262
263 //_____________________________________________________________________________
264 void
265 AliMUON2DStoreValidator::Report(TList& lines) const
266
267   /// 
268   if (fChambers) 
269   {
270     Report(lines,*fChambers); 
271   }
272 }
273
274 //_____________________________________________________________________________
275 void
276 AliMUON2DStoreValidator::Report(TList& lines, const TObjArray& chambers)
277 {
278   /// Reports what is missing, trying to be as concise as possible.
279   
280   for ( Int_t iChamber = 0; iChamber <= chambers.GetLast(); ++iChamber )
281   {
282     AliMUONCheckItem* chamber = static_cast<AliMUONCheckItem*>(chambers.At(iChamber));
283     if ( chamber )
284     {
285       if ( chamber->IsDead() )
286       {
287         lines.Add(new TObjString(Form("Chamber %2d is missing or dead",iChamber)));
288       }
289       else
290       {
291         ReportChamber(lines,*chamber);
292       }
293     }
294   }
295 }
296
297 //_____________________________________________________________________________
298 TObjArray* 
299 AliMUON2DStoreValidator::Validate(const AliMUONVStore& store,
300                                   AliMUONVStore* config)
301 {                                  
302   /// Validate the store. Check only the presence of all manus (i.e.
303   /// check nothing about the values themselves). 
304   /// Absence of manus which are not in the config is considered as normal.
305   
306   Bool_t (*kCheck)(const AliMUONVCalibParam&,Int_t) = 0x0;
307   return Validate(store,kCheck,config);
308 }
309
310 //_____________________________________________________________________________
311 TObjArray* 
312 AliMUON2DStoreValidator::Validate(const AliMUONVStore& store,
313                                   Bool_t (*check)(const AliMUONVCalibParam&,Int_t),
314                                   AliMUONVStore* config)
315 {
316   /// Validate the store. 
317   /// The check method is used to decide if a store content value
318   /// is valid or not.
319   
320   delete fChambers;
321   fChambers = 0x0;
322   
323   // Now checks if some full manus are missing
324
325   AliMpManuIterator it;
326
327   Int_t detElemId;
328   Int_t manuId;
329   
330   while ( it.Next(detElemId,manuId) )
331   {
332     AliMUONVCalibParam* test = 
333       static_cast<AliMUONVCalibParam*>(store.FindObject(detElemId,manuId));
334     if (!test)
335     {
336       // completely missing manu
337       if ( !config || ( config && config->FindObject(detElemId,manuId ) ) )
338       {
339         // manu is in the config but not in the store : that's an error
340         AddMissingManu(detElemId,manuId);
341       }
342     }
343     else
344     {
345       if (!check) continue;
346       
347       AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
348       
349       // manu is there, check all its channels
350       for ( Int_t manuChannel = 0 ; manuChannel < test->Size(); ++manuChannel )
351       {
352         if ( de->IsConnectedChannel(manuId,manuChannel) &&
353              !check(*test,manuChannel) )             
354         {
355           AddMissingChannel(detElemId,manuId,manuChannel);
356         }
357       }
358     }
359   }
360   return fChambers;
361   
362 }
363
364
365 //_____________________________________________________________________________
366 TObjArray* 
367 AliMUON2DStoreValidator::Validate(const AliMUONVStore& store,
368                                   Float_t invalidFloatValue,
369                                   AliMUONVStore* config)
370 {
371   /// Validate the store. 
372   /// The invalidFloatValue is used to decide if a store content value
373   /// is valid or not.
374   
375   delete fChambers;
376   fChambers = 0x0;
377   
378   // Now checks if some full manus are missing
379
380   AliMpManuIterator it;
381   Int_t detElemId;
382   Int_t manuId;
383   
384   while ( it.Next(detElemId,manuId) )
385   {
386     AliMUONVCalibParam* test = 
387       static_cast<AliMUONVCalibParam*>(store.FindObject(detElemId,manuId));
388     if (!test)
389     {
390       if ( !config || ( config && config->FindObject(detElemId,manuId ) ) )
391       {
392         // completely missing manu
393         AddMissingManu(detElemId,manuId);
394       }
395     }
396     else
397     {
398       // manu is there, check all its channels
399       AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
400       
401       for ( Int_t manuChannel = 0 ; manuChannel < test->Size(); ++manuChannel )
402       {
403         if ( de->IsConnectedChannel(manuId,manuChannel) &&
404              ( test->ValueAsFloat(manuChannel,0) == invalidFloatValue ||
405                test->ValueAsFloat(manuChannel,1) == invalidFloatValue ) )             
406         {
407           AddMissingChannel(detElemId,manuId,manuChannel);
408         }
409       }
410     }
411   }
412   return fChambers;
413 }
414
415