]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - MUON/AliMUON2DStoreValidator.cxx
#98358: Request to commit change in QAManager + Reconstruction + MUONReconstructor
[u/mrichter/AliRoot.git] / MUON / AliMUON2DStoreValidator.cxx
... / ...
CommitLineData
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
65ClassImp(AliMUON2DStoreValidator)
66/// \endcond
67
68//_____________________________________________________________________________
69AliMUON2DStoreValidator::AliMUON2DStoreValidator()
70: TObject(),
71 fChambers(0x0),
72 fStatus(0x0)
73{
74 /// ctor
75}
76
77//_____________________________________________________________________________
78AliMUON2DStoreValidator::~AliMUON2DStoreValidator()
79{
80 /// dtor
81 delete fChambers;
82 delete fStatus;
83}
84
85//_____________________________________________________________________________
86AliMUONCheckItem*
87AliMUON2DStoreValidator::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//_____________________________________________________________________________
117AliMUONCheckItem*
118AliMUON2DStoreValidator::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//_____________________________________________________________________________
143AliMUONCheckItem*
144AliMUON2DStoreValidator::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//_____________________________________________________________________________
164void
165AliMUON2DStoreValidator::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//_____________________________________________________________________________
183void
184AliMUON2DStoreValidator::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//_____________________________________________________________________________
200void
201AliMUON2DStoreValidator::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//_____________________________________________________________________________
217void
218AliMUON2DStoreValidator::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//_____________________________________________________________________________
242void
243AliMUON2DStoreValidator::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//_____________________________________________________________________________
264void
265AliMUON2DStoreValidator::Report(TList& lines) const
266{
267 ///
268 if (fChambers)
269 {
270 Report(lines,*fChambers);
271 }
272}
273
274//_____________________________________________________________________________
275void
276AliMUON2DStoreValidator::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//_____________________________________________________________________________
298TObjArray*
299AliMUON2DStoreValidator::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//_____________________________________________________________________________
311TObjArray*
312AliMUON2DStoreValidator::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//_____________________________________________________________________________
366TObjArray*
367AliMUON2DStoreValidator::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