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$

//-----------------------------------------------------------------------------
/// \class AliMUONVStore
///
/// A store is a container, which can be searched for (using FindObject methods),
/// iterated upon (using CreateIterator() method), and into which you can 
/// add objects (using Add)
///
/// In addition, a store can be connected to a TTree.
///
/// The general way of dealing with I/O for MUON is a two stage process :
/// 
/// 1) first get a TTree pointer using the AliLoader mechanism (this is AliRoot
///    general)
///
/// 2) connect that TTree to a MUON (virtual) data container using
///    the container's Connect(TTree&) method (this is MUON specific)
///
/// Example for reading digits for nevents
///
/// \code
///
/// AliMUONVDigitStore* digitStore(0x0);
///
/// AliLoader* loader = ... ( get loader from somewhere, e.g. AliRunLoader::GetDetectorLoader());
/// loader->LoadDigits("READ"); // load digits
///
/// for ( Int_t i = 0; i < nevents; ++i ) 
/// {
///   TTree* treeD = loader->TreeD(); // get the tree
///   if (!digitStore) digitStore = static_cast<AliMUONVDigitStore*>
///     (AliMUONVDigitStore::CreateStore(*treeD,"Digit")); // creates a container for digits 
///   (concrete class is given by the tree itself)
///   digitStore->Connect(*treeD);
///   treeD->GetEvent(0); // actual reading of the data
///
///   the digitStore is now filled and ready to be used
///   ....
///
///   digitStore->Clear(); // reset once used
/// }
///
/// \endcode
///
/// Please note that for reading data, you do *not* need to know the concrete
/// container class, as it is given to you by the TTree
///
/// Example for writing digits
///
/// \code
///
/// get the loader and do a loader->LoadDigits("RECREATE" or "UPDATE") 
/// (generally done by the framework itself)
///
/// AliMUONVDigitStore* digitStore = new AliMUONDigitStoreV1
/// // for writing, must decide on the concrete store class to use
///
/// for ( Int_t i = 0; i < nevents; ++i ) 
/// {
///   TTree* treeD = loader->TreeD();
///   digitStore->Connect(*treeD);
///   
///   ... put some digits in the digitStore
///
///   treeD->Fill();
///
///   loader->WriteDigits("OVERWRITE");
/// }
///
/// delete digitStore;
///
/// loader->UnloadDigits();
///
/// \endcode
///
/// In the write case, one *must* specify a concrete class for the container
///
//-----------------------------------------------------------------------------

#include "AliMUONVStore.h"

#include "AliMUONTreeManager.h"
#include "AliLog.h"

#include <TRegexp.h>
#include <TClass.h>

/// \cond CLASSIMP
ClassImp(AliMUONVStore)
/// \endcond

//_____________________________________________________________________________
AliMUONVStore::AliMUONVStore() : TObject()
{
  /// ctor
}

//_____________________________________________________________________________
AliMUONVStore::~AliMUONVStore()
{
  /// dtor
}

//_____________________________________________________________________________
Bool_t
AliMUONVStore::Connect(TTree&, Bool_t) const
{
  /// Connect to a Ttree
  AliError("Not implemented");
  return kFALSE;
}

//_____________________________________________________________________________
AliMUONVStore* 
AliMUONVStore::Create(TTree& tree, const char* what)
{
  /// Create a store from a tree. Forwarded to AliMUONTreeManager::CreateStore
  AliMUONTreeManager tman;

  TObject* o = tman.CreateObject(tree,what);;
  if (o)
  {
    AliMUONVStore* c = dynamic_cast<AliMUONVStore*>(o);
    if (!c)
    {
      AliErrorClass(Form("Object of class %s cannot be cast to an AliMUONVStore",
                    o->ClassName()));
    }
    return c;
  }
  return 0x0;
}

//_____________________________________________________________________________
TObject*
AliMUONVStore::FindObject(Int_t, Int_t) const
{
  /// Find an object using 2 identifiers
  AliError("(Int_t,Int_t) : Not implemented");
  return 0;
}

//______________________________________________________________________________
TObject*
AliMUONVStore::FindObject(const char *name) const
{
  // Find an object in this collection using its name. Requires a sequential
  // scan till the object has been found. Returns 0 if object with specified
  // name is not found.
  
  TIter next(CreateIterator());
  TObject *obj;
  
  while ((obj = next()))
    if (!strcmp(name, obj->GetName())) return obj;
  return 0;
}

//______________________________________________________________________________
TObject*
AliMUONVStore::FindObject(const TObject *obj) const
{
  // Find an object in this store using the object's IsEqual()
  // member function. Requires a sequential scan till the object has
  // been found. Returns 0 if object is not found.
  // Typically this function is overridden by a more efficient version
  // in concrete collection classes.
  
  TIter next(CreateIterator());
  TObject *ob;
  
  while ((ob = next()))
    if (ob->IsEqual(obj)) return ob;
  return 0;
}

//_____________________________________________________________________________
TObject* 
AliMUONVStore::FindObject(UInt_t uniqueID) const
{
  /// Generic find method. Should be overriden by derived class if it can
  /// be made more efficient there.
  
  AliDebug(1,Form("uniqueID=%u",uniqueID));
  
  TIter next(CreateIterator());
  TObject* o;
  while ( ( o = next() ) ) 
  {
    if ( o->GetUniqueID() == uniqueID ) return o;
  }
  return 0x0;
}

//______________________________________________________________________________
Int_t
AliMUONVStore::GetSize(Int_t /*i*/) const
{
  /// Number of objects store for "i", whatever that can means
  AliError("Not implemented");
  return 0;
}

//______________________________________________________________________________
void 
AliMUONVStore::Print(Option_t *wildcard) const
{
  // Print all objects in this store.
  // Wildcarding is supported, e.g. wildcard="xxx*" prints only objects
  // with names matching xxx*.
  
  if (!wildcard) wildcard = "";
  TRegexp re(wildcard, kTRUE);
  Int_t nch = strlen(wildcard);
  TIter next(CreateIterator());
  TObject *object;
  
  while ((object = next())) {
    TString s = object->GetName();
    if (nch && s != wildcard && s.Index(re) == kNPOS) continue;
    object->Print();
  }
}

//_____________________________________________________________________________
void 
AliMUONVStore::Print(Option_t *wildcard, Option_t *option) const
{
  // Print all objects in this store, passing option to the
  // objects Print() method.
  // Wildcarding is supported, e.g. wildcard="xxx*" prints only objects
  // with names matching xxx*.
  
  if (!wildcard) wildcard = "";
  TRegexp re(wildcard, kTRUE);
  Int_t nch = strlen(wildcard);
  TIter next(CreateIterator());
  TObject *object;
  
  while ((object = next())) {
    TString s = object->GetName();
    if (nch && s != wildcard && s.Index(re) == kNPOS) continue;
    object->Print(option);
  }
}

 AliMUONVStore.cxx:1
 AliMUONVStore.cxx:2
 AliMUONVStore.cxx:3
 AliMUONVStore.cxx:4
 AliMUONVStore.cxx:5
 AliMUONVStore.cxx:6
 AliMUONVStore.cxx:7
 AliMUONVStore.cxx:8
 AliMUONVStore.cxx:9
 AliMUONVStore.cxx:10
 AliMUONVStore.cxx:11
 AliMUONVStore.cxx:12
 AliMUONVStore.cxx:13
 AliMUONVStore.cxx:14
 AliMUONVStore.cxx:15
 AliMUONVStore.cxx:16
 AliMUONVStore.cxx:17
 AliMUONVStore.cxx:18
 AliMUONVStore.cxx:19
 AliMUONVStore.cxx:20
 AliMUONVStore.cxx:21
 AliMUONVStore.cxx:22
 AliMUONVStore.cxx:23
 AliMUONVStore.cxx:24
 AliMUONVStore.cxx:25
 AliMUONVStore.cxx:26
 AliMUONVStore.cxx:27
 AliMUONVStore.cxx:28
 AliMUONVStore.cxx:29
 AliMUONVStore.cxx:30
 AliMUONVStore.cxx:31
 AliMUONVStore.cxx:32
 AliMUONVStore.cxx:33
 AliMUONVStore.cxx:34
 AliMUONVStore.cxx:35
 AliMUONVStore.cxx:36
 AliMUONVStore.cxx:37
 AliMUONVStore.cxx:38
 AliMUONVStore.cxx:39
 AliMUONVStore.cxx:40
 AliMUONVStore.cxx:41
 AliMUONVStore.cxx:42
 AliMUONVStore.cxx:43
 AliMUONVStore.cxx:44
 AliMUONVStore.cxx:45
 AliMUONVStore.cxx:46
 AliMUONVStore.cxx:47
 AliMUONVStore.cxx:48
 AliMUONVStore.cxx:49
 AliMUONVStore.cxx:50
 AliMUONVStore.cxx:51
 AliMUONVStore.cxx:52
 AliMUONVStore.cxx:53
 AliMUONVStore.cxx:54
 AliMUONVStore.cxx:55
 AliMUONVStore.cxx:56
 AliMUONVStore.cxx:57
 AliMUONVStore.cxx:58
 AliMUONVStore.cxx:59
 AliMUONVStore.cxx:60
 AliMUONVStore.cxx:61
 AliMUONVStore.cxx:62
 AliMUONVStore.cxx:63
 AliMUONVStore.cxx:64
 AliMUONVStore.cxx:65
 AliMUONVStore.cxx:66
 AliMUONVStore.cxx:67
 AliMUONVStore.cxx:68
 AliMUONVStore.cxx:69
 AliMUONVStore.cxx:70
 AliMUONVStore.cxx:71
 AliMUONVStore.cxx:72
 AliMUONVStore.cxx:73
 AliMUONVStore.cxx:74
 AliMUONVStore.cxx:75
 AliMUONVStore.cxx:76
 AliMUONVStore.cxx:77
 AliMUONVStore.cxx:78
 AliMUONVStore.cxx:79
 AliMUONVStore.cxx:80
 AliMUONVStore.cxx:81
 AliMUONVStore.cxx:82
 AliMUONVStore.cxx:83
 AliMUONVStore.cxx:84
 AliMUONVStore.cxx:85
 AliMUONVStore.cxx:86
 AliMUONVStore.cxx:87
 AliMUONVStore.cxx:88
 AliMUONVStore.cxx:89
 AliMUONVStore.cxx:90
 AliMUONVStore.cxx:91
 AliMUONVStore.cxx:92
 AliMUONVStore.cxx:93
 AliMUONVStore.cxx:94
 AliMUONVStore.cxx:95
 AliMUONVStore.cxx:96
 AliMUONVStore.cxx:97
 AliMUONVStore.cxx:98
 AliMUONVStore.cxx:99
 AliMUONVStore.cxx:100
 AliMUONVStore.cxx:101
 AliMUONVStore.cxx:102
 AliMUONVStore.cxx:103
 AliMUONVStore.cxx:104
 AliMUONVStore.cxx:105
 AliMUONVStore.cxx:106
 AliMUONVStore.cxx:107
 AliMUONVStore.cxx:108
 AliMUONVStore.cxx:109
 AliMUONVStore.cxx:110
 AliMUONVStore.cxx:111
 AliMUONVStore.cxx:112
 AliMUONVStore.cxx:113
 AliMUONVStore.cxx:114
 AliMUONVStore.cxx:115
 AliMUONVStore.cxx:116
 AliMUONVStore.cxx:117
 AliMUONVStore.cxx:118
 AliMUONVStore.cxx:119
 AliMUONVStore.cxx:120
 AliMUONVStore.cxx:121
 AliMUONVStore.cxx:122
 AliMUONVStore.cxx:123
 AliMUONVStore.cxx:124
 AliMUONVStore.cxx:125
 AliMUONVStore.cxx:126
 AliMUONVStore.cxx:127
 AliMUONVStore.cxx:128
 AliMUONVStore.cxx:129
 AliMUONVStore.cxx:130
 AliMUONVStore.cxx:131
 AliMUONVStore.cxx:132
 AliMUONVStore.cxx:133
 AliMUONVStore.cxx:134
 AliMUONVStore.cxx:135
 AliMUONVStore.cxx:136
 AliMUONVStore.cxx:137
 AliMUONVStore.cxx:138
 AliMUONVStore.cxx:139
 AliMUONVStore.cxx:140
 AliMUONVStore.cxx:141
 AliMUONVStore.cxx:142
 AliMUONVStore.cxx:143
 AliMUONVStore.cxx:144
 AliMUONVStore.cxx:145
 AliMUONVStore.cxx:146
 AliMUONVStore.cxx:147
 AliMUONVStore.cxx:148
 AliMUONVStore.cxx:149
 AliMUONVStore.cxx:150
 AliMUONVStore.cxx:151
 AliMUONVStore.cxx:152
 AliMUONVStore.cxx:153
 AliMUONVStore.cxx:154
 AliMUONVStore.cxx:155
 AliMUONVStore.cxx:156
 AliMUONVStore.cxx:157
 AliMUONVStore.cxx:158
 AliMUONVStore.cxx:159
 AliMUONVStore.cxx:160
 AliMUONVStore.cxx:161
 AliMUONVStore.cxx:162
 AliMUONVStore.cxx:163
 AliMUONVStore.cxx:164
 AliMUONVStore.cxx:165
 AliMUONVStore.cxx:166
 AliMUONVStore.cxx:167
 AliMUONVStore.cxx:168
 AliMUONVStore.cxx:169
 AliMUONVStore.cxx:170
 AliMUONVStore.cxx:171
 AliMUONVStore.cxx:172
 AliMUONVStore.cxx:173
 AliMUONVStore.cxx:174
 AliMUONVStore.cxx:175
 AliMUONVStore.cxx:176
 AliMUONVStore.cxx:177
 AliMUONVStore.cxx:178
 AliMUONVStore.cxx:179
 AliMUONVStore.cxx:180
 AliMUONVStore.cxx:181
 AliMUONVStore.cxx:182
 AliMUONVStore.cxx:183
 AliMUONVStore.cxx:184
 AliMUONVStore.cxx:185
 AliMUONVStore.cxx:186
 AliMUONVStore.cxx:187
 AliMUONVStore.cxx:188
 AliMUONVStore.cxx:189
 AliMUONVStore.cxx:190
 AliMUONVStore.cxx:191
 AliMUONVStore.cxx:192
 AliMUONVStore.cxx:193
 AliMUONVStore.cxx:194
 AliMUONVStore.cxx:195
 AliMUONVStore.cxx:196
 AliMUONVStore.cxx:197
 AliMUONVStore.cxx:198
 AliMUONVStore.cxx:199
 AliMUONVStore.cxx:200
 AliMUONVStore.cxx:201
 AliMUONVStore.cxx:202
 AliMUONVStore.cxx:203
 AliMUONVStore.cxx:204
 AliMUONVStore.cxx:205
 AliMUONVStore.cxx:206
 AliMUONVStore.cxx:207
 AliMUONVStore.cxx:208
 AliMUONVStore.cxx:209
 AliMUONVStore.cxx:210
 AliMUONVStore.cxx:211
 AliMUONVStore.cxx:212
 AliMUONVStore.cxx:213
 AliMUONVStore.cxx:214
 AliMUONVStore.cxx:215
 AliMUONVStore.cxx:216
 AliMUONVStore.cxx:217
 AliMUONVStore.cxx:218
 AliMUONVStore.cxx:219
 AliMUONVStore.cxx:220
 AliMUONVStore.cxx:221
 AliMUONVStore.cxx:222
 AliMUONVStore.cxx:223
 AliMUONVStore.cxx:224
 AliMUONVStore.cxx:225
 AliMUONVStore.cxx:226
 AliMUONVStore.cxx:227
 AliMUONVStore.cxx:228
 AliMUONVStore.cxx:229
 AliMUONVStore.cxx:230
 AliMUONVStore.cxx:231
 AliMUONVStore.cxx:232
 AliMUONVStore.cxx:233
 AliMUONVStore.cxx:234
 AliMUONVStore.cxx:235
 AliMUONVStore.cxx:236
 AliMUONVStore.cxx:237
 AliMUONVStore.cxx:238
 AliMUONVStore.cxx:239
 AliMUONVStore.cxx:240
 AliMUONVStore.cxx:241
 AliMUONVStore.cxx:242
 AliMUONVStore.cxx:243
 AliMUONVStore.cxx:244
 AliMUONVStore.cxx:245
 AliMUONVStore.cxx:246
 AliMUONVStore.cxx:247
 AliMUONVStore.cxx:248
 AliMUONVStore.cxx:249
 AliMUONVStore.cxx:250
 AliMUONVStore.cxx:251
 AliMUONVStore.cxx:252
 AliMUONVStore.cxx:253
 AliMUONVStore.cxx:254
 AliMUONVStore.cxx:255
 AliMUONVStore.cxx:256
 AliMUONVStore.cxx:257
 AliMUONVStore.cxx:258
 AliMUONVStore.cxx:259
 AliMUONVStore.cxx:260
 AliMUONVStore.cxx:261
 AliMUONVStore.cxx:262