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 "AliMpUID.h"

#include "AliLog.h"
#include "Riostream.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TSystem.h"

///
/// station/chamber/de/bp/manu
///
/// station/chamber/pcb/manu

using std::cout;
using std::endl;
ClassImp(AliMpUID)

namespace
{
  const char* nameTemplateMANU = "MANU %d";
  const char* nameTemplateDE = "DE %d";
  const char* nameTemplateBP = "BusPatch %d";
  const char* nameTemplateCHAMBER = "Chamber %d";
  const char* nameTemplateSTATION = "Station %d";
  const char* nameTemplatePCB = "PCB %d";
  
  const char* pathTemplateMANU = "Cathode%d/Station%d/Chamber%d/DE%04d/BUSPATCH%04d/MANU%04d";
  const char* pathTemplateBP = "Cathode%d/Station%d/Chamber%d/DE%04d/BUSPATCH%04d";
  const char* pathTemplateDE = "Cathode%d/Station%d/Chamber%d/DE%04d";
  const char* pathTemplateCHAMBER = "Cathode%d/Station%d/Chamber%d";
  const char* pathTemplateSTATION = "Cathode%d/Station%d";

  const char* pathTemplateMANUPCB = "Cathode%d/Station%d/Chamber%d/DE%04d/PCB%d/MANU%04d";
  const char* pathTemplatePCB = "Cathode%d/Station%d/Chamber%d/DE%04d/PCB%d";
}

//_____________________________________________________________________________
AliMpUID::AliMpUID()
: 
fCathodeId(-1),
fStationId(-1),
fChamberId(-1),
fDetElemId(-1),
fBusPatchId(-1),
fManuId(-1),
fPCBId(-1)
{
  /// empty ctor
}

//_____________________________________________________________________________
AliMpUID::AliMpUID(AliMp::CathodType cathodeType, Int_t station, Int_t chamber, Int_t de, Int_t bp, Int_t manu, Int_t pcb)
: 
fCathodeId(cathodeType),
fStationId(station),
fChamberId(chamber),
fDetElemId(de),
fBusPatchId(bp),
fManuId(manu),
fPCBId(pcb)
{
  /// default ctor
}

//_____________________________________________________________________________
AliMpUID::AliMpUID(AliMp::CathodType cathodeType, const AliMpUID& b)
: 
fCathodeId(cathodeType),
fStationId(b.StationId()),
fChamberId(b.ChamberId()),
fDetElemId(b.DetElemId()),
fBusPatchId(b.BusPatchId()),
fManuId(b.ManuId()),
fPCBId(b.PCBId())
{
  /// build the id from b, but using the given cathodeType
}

//_____________________________________________________________________________
AliMpUID::AliMpUID(AliMp::CathodType cathodeType, const char* pathname)
:
fCathodeId(cathodeType),
fStationId(-1),
fChamberId(-1),
fDetElemId(-1),
fBusPatchId(-1),
fManuId(-1),
fPCBId(-1)
{
  /// build id from path, but using the given cathodeType
  
  if ( CheckTemplate(pathname,pathTemplateMANUPCB,fPCBId) && fPCBId >= 0 ) return;
  if ( CheckTemplate(pathname,pathTemplatePCB,fPCBId) && fPCBId >= 0 ) return;
  
  if ( CheckTemplate(pathname,pathTemplateMANU,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateBP,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateDE,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateCHAMBER,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateSTATION,fBusPatchId) ) return;
}


//_____________________________________________________________________________
AliMpUID::AliMpUID(const char* pathname)
:
fCathodeId(2),
fStationId(-1),
fChamberId(-1),
fDetElemId(-1),
fBusPatchId(-1),
fManuId(-1),
fPCBId(-1)
{
  /// Build id from path
  
  if ( CheckTemplate(pathname,pathTemplateMANUPCB,fPCBId) && fPCBId >= 0 ) return;
  if ( CheckTemplate(pathname,pathTemplatePCB,fPCBId) && fPCBId >= 0 ) return;
  
  if ( CheckTemplate(pathname,pathTemplateMANU,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateBP,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateDE,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateCHAMBER,fBusPatchId) ) return;
  if ( CheckTemplate(pathname,pathTemplateSTATION,fBusPatchId) ) return;
}

//_____________________________________________________________________________
TString
AliMpUID::BaseName() const
{
  /// Get the basename
  return gSystem->BaseName(PathName().Data());
}

//_____________________________________________________________________________
AliMp::CathodType 
AliMpUID::CathodeId() const
{
  /// return cathode id (not always valid)
  return AliMp::GetCathodType(fCathodeId);
}

//_____________________________________________________________________________
Bool_t
AliMpUID::CheckTemplate(const char* name, const char* pathTemplateName, Int_t& value)
{
  /// Check a name against a template
  
  if ( TString(name).Contains("Cathode") ) 
  {
    sscanf(name,pathTemplateName,&fCathodeId,&fStationId,&fChamberId,&fDetElemId,&value,&fManuId);
  }
  else
  {
    TString templ(pathTemplateName);
    Int_t i = templ.Index("/");
    templ = templ(i+1,templ.Length()-i-1);
    sscanf(name,templ.Data(),&fStationId,&fChamberId,&fDetElemId,&value,&fManuId);
  }
  return IsValid();
}

//_____________________________________________________________________________
TString
AliMpUID::DirName() const
{
  /// Get dirname
  return gSystem->DirName(PathName().Data());
}

//_____________________________________________________________________________
Bool_t 
AliMpUID::IsStation() const
{
  /// Whether we identify a station
  return fCathodeId >= 0 && fStationId >= 0 && fChamberId == -1 ;
}

//_____________________________________________________________________________
Bool_t 
AliMpUID::IsChamber() const
{
  /// Whether we identify a chamber

  return fCathodeId >= 0 && fStationId >= 0 && fChamberId >= 0 && fDetElemId == -1;
}

//_____________________________________________________________________________
Bool_t 
AliMpUID::IsDetectionElement() const
{
  /// whether we identify a detection element
  return fCathodeId >= 0 &&  fStationId >= 0 && fChamberId >= 0 && fDetElemId >= 0 && fBusPatchId==-1 && fPCBId == -1;
}

//_____________________________________________________________________________
Bool_t 
AliMpUID::IsBusPatch() const
{
  /// whether we identify a bus patch
  return fCathodeId >= 0 && fStationId >= 0 && fChamberId >= 0 && fDetElemId >= 0 && fBusPatchId>=0 && fManuId ==-1;
}

//_____________________________________________________________________________
Bool_t AliMpUID::IsManu() const
{
  /// whether we identify a manu
  return 
  fCathodeId >= 0 && 
  fStationId >= 0 && 
  fChamberId >= 0 && 
  fDetElemId >= 0 && 
  ( fBusPatchId>=0 || fPCBId >=0 ) && 
  fManuId >=0;
}

//_____________________________________________________________________________
Bool_t AliMpUID::IsPCB() const
{
  /// Whether we identify a PCB
  return fCathodeId >= 0 && fPCBId >= 0 && fManuId == -1;
}

//_____________________________________________________________________________
Bool_t AliMpUID::IsValid() const
{
  /// Whether we're a valid UID...
  return IsStation() || IsChamber() || IsDetectionElement() || IsBusPatch() || IsManu() || IsPCB();
}

//_____________________________________________________________________________
TString 
AliMpUID::Name() const
{
  /// Get our name
  if ( IsManu() ) 
  {
    return Form(nameTemplateMANU,ManuId());
  }
  
  if ( IsPCB() ) 
  {
    return Form(nameTemplatePCB,PCBId());
  }
  
  if ( IsBusPatch() ) 
  {
    return Form(nameTemplateBP,BusPatchId());
  }
  
  if ( IsDetectionElement() ) 
  {
    return Form(nameTemplateDE,DetElemId());
  }
  
  if ( IsChamber() ) 
  {
    return Form(nameTemplateCHAMBER,ChamberId());
  }
  
  if ( IsStation() ) 
  {
    return Form(nameTemplateSTATION,StationId());
  }
  
  return "INVALID NAME";
}

//_____________________________________________________________________________
TString 
AliMpUID::PathName() const
{
  /// Get our pathname
  if ( IsManu() ) 
  {
    if ( fPCBId >= 0 ) 
    {
      return StripCathode(Form(pathTemplateMANUPCB,CathodeId(),StationId(),ChamberId(),DetElemId(),PCBId(),ManuId()));
    }
    else
    {
      return StripCathode(Form(pathTemplateMANU,CathodeId(),StationId(),ChamberId(),DetElemId(),BusPatchId(),ManuId()));
    }
  }
  
  if ( IsPCB() ) 
  {
    return StripCathode(Form(pathTemplatePCB,CathodeId(),StationId(),ChamberId(),DetElemId(),PCBId()));
  }
  
  if ( IsBusPatch() ) 
  {
    return StripCathode(Form(pathTemplateBP,CathodeId(),StationId(),ChamberId(),DetElemId(),BusPatchId()));
  }
  
  if ( IsDetectionElement() ) 
  {
    return StripCathode(Form(pathTemplateDE,CathodeId(),StationId(),ChamberId(),DetElemId()));
  }
  
  if ( IsChamber() ) 
  {
    return StripCathode(Form(pathTemplateCHAMBER,CathodeId(),StationId(),ChamberId()));
  }
  
  if ( IsStation() ) 
  {
    return StripCathode(Form(pathTemplateSTATION,CathodeId(),StationId()));
  }
  
  return "INVALID PATHNAME";
}

//_____________________________________________________________________________
void 
AliMpUID::Print(Option_t*) const
{
  /// Printout
  cout << Name().Data() << " (" << PathName().Data() << ")" << endl;
}

//_____________________________________________________________________________
TString
AliMpUID::StripCathode(const char* name) const
{
  /// Remove cathode information if both cathodes are present
  
  TString rv(name);
  
  if ( fCathodeId == 2 ) 
  {
    rv.ReplaceAll("Cathode2/","");
  }
  
  return rv;
}

//_____________________________________________________________________________
TString
AliMpUID::Type() const
{
  /// Remove cathode information if both cathodes are present
  TString n(Name());
  TObjArray* s = n.Tokenize(" ");
  TString rv(static_cast<TObjString*>(s->At(0))->String());
  delete s;
  return rv;
}

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