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$
// $MpId: AliMpDEStore.cxx,v 1.4 2006/05/24 13:58:34 ivana Exp $
// Category: management

//-----------------------------------------------------------------------------
// Class AliMpDEStore
// --------------------
// The container class for detection element objects
// Authors: Ivana Hrivnacova, IPN Orsay
//          Laurent Aphecetche, Christian Finck, SUBATECH Nantes
//-----------------------------------------------------------------------------

#include <cstdlib>
#include "AliMpDEStore.h"
#include "AliMpDEManager.h"
#include "AliMpDetElement.h"
#include "AliMpConstants.h"
#include "AliMpFiles.h"
#include "AliMpDataStreams.h"
#include "AliMpHelper.h"
#include "AliMpConstants.h"
#include "AliMpExMapIterator.h"

#include "AliLog.h"

#include <Riostream.h>
#include <TClass.h>
#include <TSystem.h>
#include <TObjString.h>
#include <TObjArray.h>
#include <TMap.h>

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

AliMpDEStore* AliMpDEStore::fgInstance = 0;
const char    AliMpDEStore::fgkCommentPrefix = '#'; 

//
// static methods
//

//______________________________________________________________________________
AliMpDEStore* AliMpDEStore::Instance(Bool_t warn)
{
/// Create the DE store if it does not yet exist
/// and return its instance

  if ( ! fgInstance && warn  ) {
    AliWarningClass("DE Store has not been loaded");
  }  
     
  return fgInstance;
}    

//______________________________________________________________________________
AliMpDEStore* AliMpDEStore::ReadData(const AliMpDataStreams& dataStreams, 
                                     Bool_t warn)
{
/// Load the DE store data from ASCII data files
/// and return its instance

  if ( fgInstance ) {
    if ( warn )
      AliWarningClass("DE Store has been already loaded");
    return fgInstance;
  }  
  
  if ( dataStreams.GetReadFromFiles() )
    AliInfoClass("Reading DE Store from ASCII files.");

  fgInstance = new AliMpDEStore(dataStreams);
  return fgInstance;
}    

//
// ctors, dtor
//

//______________________________________________________________________________
AliMpDEStore::AliMpDEStore(const AliMpDataStreams& dataStreams)
: TObject(),
  fDetElements()
{  
/// Standard constructor

  AliDebug(1,"");
  fDetElements.SetOwner(true);

  // Create all detection elements
  FillDEs(dataStreams);
}

//______________________________________________________________________________
AliMpDEStore::AliMpDEStore(TRootIOCtor* ioCtor)
: TObject(),
  fDetElements(ioCtor)
{  
/// Constructor for IO

  AliDebug(1,"");

  fgInstance = this;
}


//______________________________________________________________________________
AliMpDEStore::~AliMpDEStore()
{
/// Destructor

  AliDebug(1,"");

  // Segmentations are deleted with fMpSegmentations 
  // El cards arrays are deleted with fElCardsMap
  
  fgInstance = 0;
}

//
// private methods
//

//______________________________________________________________________________
Bool_t AliMpDEStore::IsPlaneType(const TString& planeTypeName)
{
/// Return true if the planeTypeName corresponds to a valid plane type

  if ( planeTypeName == PlaneTypeName(AliMp::kBendingPlane) ||
       planeTypeName == PlaneTypeName(AliMp::kNonBendingPlane) ) 
    return true;   

  return false;
}  

//______________________________________________________________________________
Bool_t
AliMpDEStore::ReadDENames(const AliMpDataStreams& dataStreams,
                          AliMp::StationType station,
                          AliMq::Station12Type station12)
{ 
/// Read det element names for cath = 0 from the file specified by name
/// and fill the map 

  // Open stream
  istream& in 
    = dataStreams.
        CreateDataStream(AliMpFiles::DENamesFilePath(station, station12));
  
  // Read plane types per cathods
  //
  char line[80];
  TString word;
  TString cathName1, cathName2;
  in >> word;
  while ( ! in.eof() && cathName1.Length() == 0 ) {
    if ( word[0] == '#' ) 
      in.getline(line, 80);
    else { 
      cathName1 = word;
      in >> cathName2;
    }
    in >> word;
  }
  
  Bool_t isCathNameDefined = false;
  if ( IsPlaneType(cathName1) &&  IsPlaneType(cathName2) )
    isCathNameDefined = true;
    
  // Read DE names
  //
  Int_t detElemId;
  TString name, name0, name1, name2;
  AliMp::PlaneType planeForCathode[2];
  
  while ( ! in.eof() ) 
  {
    if ( word[0] == '#' ) 
    {
      in.getline(line, 80);
    }
    else 
    {  
      detElemId = word.Atoi();
      in >> name;
      in >> name0;
      // warning : important to check non bending first (=nbp),
      // as bp is contained within nbp...
      if ( name0.Contains(PlaneTypeName(AliMp::kNonBendingPlane)) )
      {
        planeForCathode[0] = AliMp::kNonBendingPlane;
      }
      else
      {
        planeForCathode[0] = AliMp::kBendingPlane;
      }
 
      if ( !isCathNameDefined ) 
      { 
        in >> name2;
	name1 = name0; 
        Ssiz_t pos = name1.First(AliMpDetElement::GetNameSeparator());
        name0 = name1(0,pos);

        // Other cathode is other plane...
        planeForCathode[1] = OtherPlaneType(planeForCathode[0]);
      }
      else 
      {
        name1 = name0 + AliMpDetElement::GetNameSeparator() + cathName1;
        name2 = name0 + AliMpDetElement::GetNameSeparator() + cathName2;
        if ( name2.Contains(PlaneTypeName(AliMp::kNonBendingPlane)) )
        {
          planeForCathode[1] = AliMp::kNonBendingPlane;
        }
        else
        {
          planeForCathode[1] = AliMp::kBendingPlane;
        }        
      }   

      if ( planeForCathode[0]==planeForCathode[1] )
      {
        AliFatalClass(Form("Got the same cathode type for both planes"
                      " of DetElemId %d",detElemId));
      }
      
      AliMpDetElement* detElement = new AliMpDetElement(detElemId, name, name0, planeForCathode[0]);
      
      if ( ! fDetElements.GetValue(detElemId) ) 
      {
        AliDebugClassStream(3)  
          << "Adding DE name "  << detElemId << "  " << name << endl;
        fDetElements.Add(detElemId, detElement); 
      } 
      else 
      {
        AliWarningClassStream()
          << "Det element "  << detElemId << "  " << name << " already defined." << endl;
      }	
    } 
    in >> word;
  }
  
  delete &in;

  return true;
}

//______________________________________________________________________________
void AliMpDEStore::FillDEs(const AliMpDataStreams& dataStreams)
{
/// Fill DE names from files
  AliDebugClass(2,"");
  Bool_t result1 = ReadDENames(dataStreams, AliMp::kStation12, AliMq::kStation1);
  Bool_t result2 = ReadDENames(dataStreams, AliMp::kStation12, AliMq::kStation2);
  Bool_t result3 = ReadDENames(dataStreams, AliMp::kStation345);
  Bool_t result4 = ReadDENames(dataStreams, AliMp::kStationTrigger);
  
  Bool_t result = result1 && result2 && result3 && result4;
  if ( ! result ) {
    AliErrorClassStream() << "Error in reading DE names files" << endl;
  }  
  AliDebug(1,Form("%d detection elements were read in",fDetElements.GetSize()));
}

//
// public methods
//


//______________________________________________________________________________
AliMpDetElement* AliMpDEStore::GetDetElement(Int_t detElemId, Bool_t warn) const
{
/// Return det element for given detElemId

  AliMpDetElement* detElement
    = (AliMpDetElement*)fDetElements.GetValue(detElemId);
    
  if ( ! detElement && warn ) {  
    AliErrorClassStream() 
        << "Detection element " << detElemId << " not defined." << endl;
  }	

  return detElement;
}    

//______________________________________________________________________________
AliMpDetElement* AliMpDEStore::GetDetElement(const TString& deName, Bool_t warn) const
{
/// Return det element for given deName

  TIter next(fDetElements.CreateIterator());
  AliMpDetElement* detElement;
  
  while ( ( detElement = static_cast<AliMpDetElement*>(next()) ) )
  {
             
    if (deName.CompareTo(detElement->GetDEName()) == 0) 

      return detElement;
  }

  if (warn) {  
    AliErrorClassStream() 
	<< "Detection element with name" << deName.Data() << " not defined." << endl;
  }	

  return 0x0;   

}
 AliMpDEStore.cxx:1
 AliMpDEStore.cxx:2
 AliMpDEStore.cxx:3
 AliMpDEStore.cxx:4
 AliMpDEStore.cxx:5
 AliMpDEStore.cxx:6
 AliMpDEStore.cxx:7
 AliMpDEStore.cxx:8
 AliMpDEStore.cxx:9
 AliMpDEStore.cxx:10
 AliMpDEStore.cxx:11
 AliMpDEStore.cxx:12
 AliMpDEStore.cxx:13
 AliMpDEStore.cxx:14
 AliMpDEStore.cxx:15
 AliMpDEStore.cxx:16
 AliMpDEStore.cxx:17
 AliMpDEStore.cxx:18
 AliMpDEStore.cxx:19
 AliMpDEStore.cxx:20
 AliMpDEStore.cxx:21
 AliMpDEStore.cxx:22
 AliMpDEStore.cxx:23
 AliMpDEStore.cxx:24
 AliMpDEStore.cxx:25
 AliMpDEStore.cxx:26
 AliMpDEStore.cxx:27
 AliMpDEStore.cxx:28
 AliMpDEStore.cxx:29
 AliMpDEStore.cxx:30
 AliMpDEStore.cxx:31
 AliMpDEStore.cxx:32
 AliMpDEStore.cxx:33
 AliMpDEStore.cxx:34
 AliMpDEStore.cxx:35
 AliMpDEStore.cxx:36
 AliMpDEStore.cxx:37
 AliMpDEStore.cxx:38
 AliMpDEStore.cxx:39
 AliMpDEStore.cxx:40
 AliMpDEStore.cxx:41
 AliMpDEStore.cxx:42
 AliMpDEStore.cxx:43
 AliMpDEStore.cxx:44
 AliMpDEStore.cxx:45
 AliMpDEStore.cxx:46
 AliMpDEStore.cxx:47
 AliMpDEStore.cxx:48
 AliMpDEStore.cxx:49
 AliMpDEStore.cxx:50
 AliMpDEStore.cxx:51
 AliMpDEStore.cxx:52
 AliMpDEStore.cxx:53
 AliMpDEStore.cxx:54
 AliMpDEStore.cxx:55
 AliMpDEStore.cxx:56
 AliMpDEStore.cxx:57
 AliMpDEStore.cxx:58
 AliMpDEStore.cxx:59
 AliMpDEStore.cxx:60
 AliMpDEStore.cxx:61
 AliMpDEStore.cxx:62
 AliMpDEStore.cxx:63
 AliMpDEStore.cxx:64
 AliMpDEStore.cxx:65
 AliMpDEStore.cxx:66
 AliMpDEStore.cxx:67
 AliMpDEStore.cxx:68
 AliMpDEStore.cxx:69
 AliMpDEStore.cxx:70
 AliMpDEStore.cxx:71
 AliMpDEStore.cxx:72
 AliMpDEStore.cxx:73
 AliMpDEStore.cxx:74
 AliMpDEStore.cxx:75
 AliMpDEStore.cxx:76
 AliMpDEStore.cxx:77
 AliMpDEStore.cxx:78
 AliMpDEStore.cxx:79
 AliMpDEStore.cxx:80
 AliMpDEStore.cxx:81
 AliMpDEStore.cxx:82
 AliMpDEStore.cxx:83
 AliMpDEStore.cxx:84
 AliMpDEStore.cxx:85
 AliMpDEStore.cxx:86
 AliMpDEStore.cxx:87
 AliMpDEStore.cxx:88
 AliMpDEStore.cxx:89
 AliMpDEStore.cxx:90
 AliMpDEStore.cxx:91
 AliMpDEStore.cxx:92
 AliMpDEStore.cxx:93
 AliMpDEStore.cxx:94
 AliMpDEStore.cxx:95
 AliMpDEStore.cxx:96
 AliMpDEStore.cxx:97
 AliMpDEStore.cxx:98
 AliMpDEStore.cxx:99
 AliMpDEStore.cxx:100
 AliMpDEStore.cxx:101
 AliMpDEStore.cxx:102
 AliMpDEStore.cxx:103
 AliMpDEStore.cxx:104
 AliMpDEStore.cxx:105
 AliMpDEStore.cxx:106
 AliMpDEStore.cxx:107
 AliMpDEStore.cxx:108
 AliMpDEStore.cxx:109
 AliMpDEStore.cxx:110
 AliMpDEStore.cxx:111
 AliMpDEStore.cxx:112
 AliMpDEStore.cxx:113
 AliMpDEStore.cxx:114
 AliMpDEStore.cxx:115
 AliMpDEStore.cxx:116
 AliMpDEStore.cxx:117
 AliMpDEStore.cxx:118
 AliMpDEStore.cxx:119
 AliMpDEStore.cxx:120
 AliMpDEStore.cxx:121
 AliMpDEStore.cxx:122
 AliMpDEStore.cxx:123
 AliMpDEStore.cxx:124
 AliMpDEStore.cxx:125
 AliMpDEStore.cxx:126
 AliMpDEStore.cxx:127
 AliMpDEStore.cxx:128
 AliMpDEStore.cxx:129
 AliMpDEStore.cxx:130
 AliMpDEStore.cxx:131
 AliMpDEStore.cxx:132
 AliMpDEStore.cxx:133
 AliMpDEStore.cxx:134
 AliMpDEStore.cxx:135
 AliMpDEStore.cxx:136
 AliMpDEStore.cxx:137
 AliMpDEStore.cxx:138
 AliMpDEStore.cxx:139
 AliMpDEStore.cxx:140
 AliMpDEStore.cxx:141
 AliMpDEStore.cxx:142
 AliMpDEStore.cxx:143
 AliMpDEStore.cxx:144
 AliMpDEStore.cxx:145
 AliMpDEStore.cxx:146
 AliMpDEStore.cxx:147
 AliMpDEStore.cxx:148
 AliMpDEStore.cxx:149
 AliMpDEStore.cxx:150
 AliMpDEStore.cxx:151
 AliMpDEStore.cxx:152
 AliMpDEStore.cxx:153
 AliMpDEStore.cxx:154
 AliMpDEStore.cxx:155
 AliMpDEStore.cxx:156
 AliMpDEStore.cxx:157
 AliMpDEStore.cxx:158
 AliMpDEStore.cxx:159
 AliMpDEStore.cxx:160
 AliMpDEStore.cxx:161
 AliMpDEStore.cxx:162
 AliMpDEStore.cxx:163
 AliMpDEStore.cxx:164
 AliMpDEStore.cxx:165
 AliMpDEStore.cxx:166
 AliMpDEStore.cxx:167
 AliMpDEStore.cxx:168
 AliMpDEStore.cxx:169
 AliMpDEStore.cxx:170
 AliMpDEStore.cxx:171
 AliMpDEStore.cxx:172
 AliMpDEStore.cxx:173
 AliMpDEStore.cxx:174
 AliMpDEStore.cxx:175
 AliMpDEStore.cxx:176
 AliMpDEStore.cxx:177
 AliMpDEStore.cxx:178
 AliMpDEStore.cxx:179
 AliMpDEStore.cxx:180
 AliMpDEStore.cxx:181
 AliMpDEStore.cxx:182
 AliMpDEStore.cxx:183
 AliMpDEStore.cxx:184
 AliMpDEStore.cxx:185
 AliMpDEStore.cxx:186
 AliMpDEStore.cxx:187
 AliMpDEStore.cxx:188
 AliMpDEStore.cxx:189
 AliMpDEStore.cxx:190
 AliMpDEStore.cxx:191
 AliMpDEStore.cxx:192
 AliMpDEStore.cxx:193
 AliMpDEStore.cxx:194
 AliMpDEStore.cxx:195
 AliMpDEStore.cxx:196
 AliMpDEStore.cxx:197
 AliMpDEStore.cxx:198
 AliMpDEStore.cxx:199
 AliMpDEStore.cxx:200
 AliMpDEStore.cxx:201
 AliMpDEStore.cxx:202
 AliMpDEStore.cxx:203
 AliMpDEStore.cxx:204
 AliMpDEStore.cxx:205
 AliMpDEStore.cxx:206
 AliMpDEStore.cxx:207
 AliMpDEStore.cxx:208
 AliMpDEStore.cxx:209
 AliMpDEStore.cxx:210
 AliMpDEStore.cxx:211
 AliMpDEStore.cxx:212
 AliMpDEStore.cxx:213
 AliMpDEStore.cxx:214
 AliMpDEStore.cxx:215
 AliMpDEStore.cxx:216
 AliMpDEStore.cxx:217
 AliMpDEStore.cxx:218
 AliMpDEStore.cxx:219
 AliMpDEStore.cxx:220
 AliMpDEStore.cxx:221
 AliMpDEStore.cxx:222
 AliMpDEStore.cxx:223
 AliMpDEStore.cxx:224
 AliMpDEStore.cxx:225
 AliMpDEStore.cxx:226
 AliMpDEStore.cxx:227
 AliMpDEStore.cxx:228
 AliMpDEStore.cxx:229
 AliMpDEStore.cxx:230
 AliMpDEStore.cxx:231
 AliMpDEStore.cxx:232
 AliMpDEStore.cxx:233
 AliMpDEStore.cxx:234
 AliMpDEStore.cxx:235
 AliMpDEStore.cxx:236
 AliMpDEStore.cxx:237
 AliMpDEStore.cxx:238
 AliMpDEStore.cxx:239
 AliMpDEStore.cxx:240
 AliMpDEStore.cxx:241
 AliMpDEStore.cxx:242
 AliMpDEStore.cxx:243
 AliMpDEStore.cxx:244
 AliMpDEStore.cxx:245
 AliMpDEStore.cxx:246
 AliMpDEStore.cxx:247
 AliMpDEStore.cxx:248
 AliMpDEStore.cxx:249
 AliMpDEStore.cxx:250
 AliMpDEStore.cxx:251
 AliMpDEStore.cxx:252
 AliMpDEStore.cxx:253
 AliMpDEStore.cxx:254
 AliMpDEStore.cxx:255
 AliMpDEStore.cxx:256
 AliMpDEStore.cxx:257
 AliMpDEStore.cxx:258
 AliMpDEStore.cxx:259
 AliMpDEStore.cxx:260
 AliMpDEStore.cxx:261
 AliMpDEStore.cxx:262
 AliMpDEStore.cxx:263
 AliMpDEStore.cxx:264
 AliMpDEStore.cxx:265
 AliMpDEStore.cxx:266
 AliMpDEStore.cxx:267
 AliMpDEStore.cxx:268
 AliMpDEStore.cxx:269
 AliMpDEStore.cxx:270
 AliMpDEStore.cxx:271
 AliMpDEStore.cxx:272
 AliMpDEStore.cxx:273
 AliMpDEStore.cxx:274
 AliMpDEStore.cxx:275
 AliMpDEStore.cxx:276
 AliMpDEStore.cxx:277
 AliMpDEStore.cxx:278
 AliMpDEStore.cxx:279
 AliMpDEStore.cxx:280
 AliMpDEStore.cxx:281
 AliMpDEStore.cxx:282
 AliMpDEStore.cxx:283
 AliMpDEStore.cxx:284
 AliMpDEStore.cxx:285
 AliMpDEStore.cxx:286
 AliMpDEStore.cxx:287
 AliMpDEStore.cxx:288
 AliMpDEStore.cxx:289
 AliMpDEStore.cxx:290
 AliMpDEStore.cxx:291
 AliMpDEStore.cxx:292
 AliMpDEStore.cxx:293
 AliMpDEStore.cxx:294
 AliMpDEStore.cxx:295
 AliMpDEStore.cxx:296
 AliMpDEStore.cxx:297
 AliMpDEStore.cxx:298
 AliMpDEStore.cxx:299
 AliMpDEStore.cxx:300
 AliMpDEStore.cxx:301
 AliMpDEStore.cxx:302
 AliMpDEStore.cxx:303
 AliMpDEStore.cxx:304
 AliMpDEStore.cxx:305
 AliMpDEStore.cxx:306
 AliMpDEStore.cxx:307
 AliMpDEStore.cxx:308
 AliMpDEStore.cxx:309
 AliMpDEStore.cxx:310
 AliMpDEStore.cxx:311
 AliMpDEStore.cxx:312
 AliMpDEStore.cxx:313
 AliMpDEStore.cxx:314
 AliMpDEStore.cxx:315
 AliMpDEStore.cxx:316
 AliMpDEStore.cxx:317
 AliMpDEStore.cxx:318
 AliMpDEStore.cxx:319
 AliMpDEStore.cxx:320
 AliMpDEStore.cxx:321
 AliMpDEStore.cxx:322
 AliMpDEStore.cxx:323
 AliMpDEStore.cxx:324
 AliMpDEStore.cxx:325
 AliMpDEStore.cxx:326
 AliMpDEStore.cxx:327