ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

#include "AliMUONCheckItem.h"

#include "AliLog.h"
#include "AliMpExMap.h"
#include "AliMpExMapIterator.h"
#include "Riostream.h"

//-----------------------------------------------------------------------------
/// \class AliMUONCheckItem
///
/// A structure used to gather information at different levels (ch,manu,de,chamber)
///
/// Used by AliMUON2DStoreValidator to present results in a concise way
///
/// 
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

using std::endl;
using std::cout;
/// \cond CLASSIMP
ClassImp(AliMUONCheckItem)
/// \endcond

//_____________________________________________________________________________
AliMUONCheckItem::AliMUONCheckItem(Int_t id, Int_t maxNumber, const char* name) : 
TNamed(name,name),
fID(id),
fDead(-1),
fMaximum(maxNumber),
fMissing(new AliMpExMap)
{
  /// ctor. id is the number of that item, maxNumber is the maximum number
  /// of sub-item it can contains, and name is a label, e.g. de, chamber, manu.
  /// Note that name="manu" has a special influence on the IsDead() method.
  
  fMissing->SetSize(fMaximum);
  AliDebug(1,Form("ID %d maxNumber %d name %s",id,maxNumber,name));
}

//_____________________________________________________________________________
AliMUONCheckItem::~AliMUONCheckItem()
{
  /// dtor
  delete fMissing;
}

//_____________________________________________________________________________
Bool_t AliMUONCheckItem::AddItem(Int_t id, TObject* item)
{
  /// Add an item, if possible.
  
  if ( IsFull() ) 
  {
    AliError("I'm already full!");
    return kFALSE;
  }
  
  TObject* test = GetItem(id);
  if (test) 
  {
    AliError(Form("id %d is already there !",id));
    return kFALSE;
  }
  else
  {
    fMissing->Add(id,item);
    fDead=-1;
  }  
  return kTRUE;
}

//_____________________________________________________________________________
void
AliMUONCheckItem::ComputeDead() const
{
  /// Decide whether this item is completely dead, which is determined by
  /// the fact that all its sub-items are dead, or for name="manu", by
  /// the fact that all channels are missing, i.e. IsFull()==kTRUE
  
  TString name(GetName());
  name.ToLower();

  if ( name.Contains("manu") )
  {
    if ( IsFull() ) 
    {
      fDead=1;
    }
    else
    {
      fDead=0;
    }
  }
  else
  {
      TIter next(CreateIterator());
    AliMUONCheckItem* item;
    Int_t ndead(0);
    fDead=0;
    while ( ( item = dynamic_cast<AliMUONCheckItem*>(next()) ) )
    {
      if ( item->IsDead() ) ++ndead;
    }
    if ( ndead == fMaximum ) fDead = 1;
  }
}

//_____________________________________________________________________________
TIterator*
AliMUONCheckItem::CreateIterator() const
{
    /// Create iterator on this item
    return fMissing->CreateIterator();
}

//_____________________________________________________________________________
TObject* 
AliMUONCheckItem::GetItem(Int_t id) const
{
  /// Return item of a given id
  return fMissing->GetValue(id);
}

//_____________________________________________________________________________
Bool_t 
AliMUONCheckItem::IsDead() const
{
  /// Return (and compute it first if not done already) dead status
  if ( fDead == -1 )
  {
    ComputeDead();
  }
  return (fDead==1);
}

//_____________________________________________________________________________
Bool_t 
AliMUONCheckItem::IsFull() const
{
  /// Whether we have as many sub-items as possible
  return (fMissing->GetSize() == fMaximum);
}
  
//_____________________________________________________________________________
void
AliMUONCheckItem::Print(Option_t* opt) const
{
  /// output to screen
  cout << Form("<AliMUONCheckItem> %s ID %d has %d items over %d max. Dead %d",
               GetName(),fID,fMissing->GetSize(),fMaximum,IsDead()) << endl;  
  TString sopt(opt);
  sopt.ToLower();
  if (sopt.Contains("all") )
  {
    TObject* object(0x0);
  
      TIter next(CreateIterator());
  
    while ( ( object = next() ) )
    {
      object->Print(opt);
    }
  }
}
 AliMUONCheckItem.cxx:1
 AliMUONCheckItem.cxx:2
 AliMUONCheckItem.cxx:3
 AliMUONCheckItem.cxx:4
 AliMUONCheckItem.cxx:5
 AliMUONCheckItem.cxx:6
 AliMUONCheckItem.cxx:7
 AliMUONCheckItem.cxx:8
 AliMUONCheckItem.cxx:9
 AliMUONCheckItem.cxx:10
 AliMUONCheckItem.cxx:11
 AliMUONCheckItem.cxx:12
 AliMUONCheckItem.cxx:13
 AliMUONCheckItem.cxx:14
 AliMUONCheckItem.cxx:15
 AliMUONCheckItem.cxx:16
 AliMUONCheckItem.cxx:17
 AliMUONCheckItem.cxx:18
 AliMUONCheckItem.cxx:19
 AliMUONCheckItem.cxx:20
 AliMUONCheckItem.cxx:21
 AliMUONCheckItem.cxx:22
 AliMUONCheckItem.cxx:23
 AliMUONCheckItem.cxx:24
 AliMUONCheckItem.cxx:25
 AliMUONCheckItem.cxx:26
 AliMUONCheckItem.cxx:27
 AliMUONCheckItem.cxx:28
 AliMUONCheckItem.cxx:29
 AliMUONCheckItem.cxx:30
 AliMUONCheckItem.cxx:31
 AliMUONCheckItem.cxx:32
 AliMUONCheckItem.cxx:33
 AliMUONCheckItem.cxx:34
 AliMUONCheckItem.cxx:35
 AliMUONCheckItem.cxx:36
 AliMUONCheckItem.cxx:37
 AliMUONCheckItem.cxx:38
 AliMUONCheckItem.cxx:39
 AliMUONCheckItem.cxx:40
 AliMUONCheckItem.cxx:41
 AliMUONCheckItem.cxx:42
 AliMUONCheckItem.cxx:43
 AliMUONCheckItem.cxx:44
 AliMUONCheckItem.cxx:45
 AliMUONCheckItem.cxx:46
 AliMUONCheckItem.cxx:47
 AliMUONCheckItem.cxx:48
 AliMUONCheckItem.cxx:49
 AliMUONCheckItem.cxx:50
 AliMUONCheckItem.cxx:51
 AliMUONCheckItem.cxx:52
 AliMUONCheckItem.cxx:53
 AliMUONCheckItem.cxx:54
 AliMUONCheckItem.cxx:55
 AliMUONCheckItem.cxx:56
 AliMUONCheckItem.cxx:57
 AliMUONCheckItem.cxx:58
 AliMUONCheckItem.cxx:59
 AliMUONCheckItem.cxx:60
 AliMUONCheckItem.cxx:61
 AliMUONCheckItem.cxx:62
 AliMUONCheckItem.cxx:63
 AliMUONCheckItem.cxx:64
 AliMUONCheckItem.cxx:65
 AliMUONCheckItem.cxx:66
 AliMUONCheckItem.cxx:67
 AliMUONCheckItem.cxx:68
 AliMUONCheckItem.cxx:69
 AliMUONCheckItem.cxx:70
 AliMUONCheckItem.cxx:71
 AliMUONCheckItem.cxx:72
 AliMUONCheckItem.cxx:73
 AliMUONCheckItem.cxx:74
 AliMUONCheckItem.cxx:75
 AliMUONCheckItem.cxx:76
 AliMUONCheckItem.cxx:77
 AliMUONCheckItem.cxx:78
 AliMUONCheckItem.cxx:79
 AliMUONCheckItem.cxx:80
 AliMUONCheckItem.cxx:81
 AliMUONCheckItem.cxx:82
 AliMUONCheckItem.cxx:83
 AliMUONCheckItem.cxx:84
 AliMUONCheckItem.cxx:85
 AliMUONCheckItem.cxx:86
 AliMUONCheckItem.cxx:87
 AliMUONCheckItem.cxx:88
 AliMUONCheckItem.cxx:89
 AliMUONCheckItem.cxx:90
 AliMUONCheckItem.cxx:91
 AliMUONCheckItem.cxx:92
 AliMUONCheckItem.cxx:93
 AliMUONCheckItem.cxx:94
 AliMUONCheckItem.cxx:95
 AliMUONCheckItem.cxx:96
 AliMUONCheckItem.cxx:97
 AliMUONCheckItem.cxx:98
 AliMUONCheckItem.cxx:99
 AliMUONCheckItem.cxx:100
 AliMUONCheckItem.cxx:101
 AliMUONCheckItem.cxx:102
 AliMUONCheckItem.cxx:103
 AliMUONCheckItem.cxx:104
 AliMUONCheckItem.cxx:105
 AliMUONCheckItem.cxx:106
 AliMUONCheckItem.cxx:107
 AliMUONCheckItem.cxx:108
 AliMUONCheckItem.cxx:109
 AliMUONCheckItem.cxx:110
 AliMUONCheckItem.cxx:111
 AliMUONCheckItem.cxx:112
 AliMUONCheckItem.cxx:113
 AliMUONCheckItem.cxx:114
 AliMUONCheckItem.cxx:115
 AliMUONCheckItem.cxx:116
 AliMUONCheckItem.cxx:117
 AliMUONCheckItem.cxx:118
 AliMUONCheckItem.cxx:119
 AliMUONCheckItem.cxx:120
 AliMUONCheckItem.cxx:121
 AliMUONCheckItem.cxx:122
 AliMUONCheckItem.cxx:123
 AliMUONCheckItem.cxx:124
 AliMUONCheckItem.cxx:125
 AliMUONCheckItem.cxx:126
 AliMUONCheckItem.cxx:127
 AliMUONCheckItem.cxx:128
 AliMUONCheckItem.cxx:129
 AliMUONCheckItem.cxx:130
 AliMUONCheckItem.cxx:131
 AliMUONCheckItem.cxx:132
 AliMUONCheckItem.cxx:133
 AliMUONCheckItem.cxx:134
 AliMUONCheckItem.cxx:135
 AliMUONCheckItem.cxx:136
 AliMUONCheckItem.cxx:137
 AliMUONCheckItem.cxx:138
 AliMUONCheckItem.cxx:139
 AliMUONCheckItem.cxx:140
 AliMUONCheckItem.cxx:141
 AliMUONCheckItem.cxx:142
 AliMUONCheckItem.cxx:143
 AliMUONCheckItem.cxx:144
 AliMUONCheckItem.cxx:145
 AliMUONCheckItem.cxx:146
 AliMUONCheckItem.cxx:147
 AliMUONCheckItem.cxx:148
 AliMUONCheckItem.cxx:149
 AliMUONCheckItem.cxx:150
 AliMUONCheckItem.cxx:151
 AliMUONCheckItem.cxx:152
 AliMUONCheckItem.cxx:153
 AliMUONCheckItem.cxx:154
 AliMUONCheckItem.cxx:155
 AliMUONCheckItem.cxx:156
 AliMUONCheckItem.cxx:157
 AliMUONCheckItem.cxx:158
 AliMUONCheckItem.cxx:159
 AliMUONCheckItem.cxx:160
 AliMUONCheckItem.cxx:161
 AliMUONCheckItem.cxx:162
 AliMUONCheckItem.cxx:163
 AliMUONCheckItem.cxx:164
 AliMUONCheckItem.cxx:165
 AliMUONCheckItem.cxx:166
 AliMUONCheckItem.cxx:167
 AliMUONCheckItem.cxx:168
 AliMUONCheckItem.cxx:169
 AliMUONCheckItem.cxx:170
 AliMUONCheckItem.cxx:171
 AliMUONCheckItem.cxx:172
 AliMUONCheckItem.cxx:173
 AliMUONCheckItem.cxx:174
 AliMUONCheckItem.cxx:175
 AliMUONCheckItem.cxx:176
 AliMUONCheckItem.cxx:177
 AliMUONCheckItem.cxx:178
 AliMUONCheckItem.cxx:179
 AliMUONCheckItem.cxx:180
 AliMUONCheckItem.cxx:181
 AliMUONCheckItem.cxx:182