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 purpeateose. It is      *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$
// $MpId: AliMpSt345Reader.cxx,v 1.11 2006/05/24 13:58:50 ivana Exp $

#include "AliMpSt345Reader.h"

#include "AliLog.h"
#include "AliMpSlatMotifMap.h"
#include "AliMpMotifReader.h"
#include "AliMpFiles.h"
#include "AliMpDataStreams.h"
#include "AliMpMotifType.h"
#include "AliMpPCB.h"
#include "AliMpSlat.h"
#include "AliMpMotifPosition.h"
#include "AliMpMotif.h"
#include "AliMpHelper.h"
#include "AliMpConstants.h"

#include "Riostream.h"
#include "TClass.h"
#include "TObjString.h"
#include "TString.h"

#include <sstream>

 
//-----------------------------------------------------------------------------
/// \class AliMpSt345Reader
//
/// Read slat and pcb ASCII files.
/// 
/// Basically this class provides two methods :
/// - AliMpSlat* ReadSlat()
/// - AliMpPCB ReadPCB()
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

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

//_____________________________________________________________________________
AliMpSt345Reader::AliMpSt345Reader(AliMpSlatMotifMap* motifMap)
: 
TObject(),
fMotifMap(motifMap)
{
  ///
  /// Default ctor.
  ///
} 

//_____________________________________________________________________________
AliMpSt345Reader::~AliMpSt345Reader()
{
  ///
  /// Dtor.
  ///
}

//_____________________________________________________________________________
AliMpPCB*
AliMpSt345Reader::ReadPCB(const AliMpDataStreams& dataStreams,
                          const char* pcbType)
{ 
  ///
  /// Create a new AliMpPCB object, by reading it from file.
  /// The returned object must be deleted by the client
  
  istream& in 
    = dataStreams.
        CreateDataStream(AliMpFiles::SlatPCBFilePath(
                             AliMp::kStation345, pcbType));
 
  AliMpMotifReader reader(AliMp::kStation345, AliMq::kNotSt12, AliMp::kNonBendingPlane); 
  // note that the nonbending
  // parameter is of no use for station345, as far as reading motif is 
  // concerned, as all motifs are supposed to be in the same directory
  // (as they are shared by bending/non-bending planes).
     
  char line[80];
  
  const TString kSizeKeyword("SIZES");
  const TString kMotifKeyword("MOTIF");
  
  AliMpPCB* pcb = 0;
  
  while ( in.getline(line,80) )
  {
    if ( line[0] == '#' ) continue;
    
    TString sline(line);
    
    if ( sline(0,kSizeKeyword.Length()) == kSizeKeyword )
    {
      std::istringstream sin(sline(kSizeKeyword.Length(),
                                   sline.Length()-kSizeKeyword.Length()).Data());
      double padSizeX = 0.0;
      double padSizeY = 0.0;
      double pcbSizeX = 0.0;
      double pcbSizeY = 0.0;
      sin >> padSizeX >> padSizeY >> pcbSizeX >> pcbSizeY;
      if (pcb)
      {
        AliError("pcb not null as expected");
      }
      pcb = new AliMpPCB(fMotifMap,pcbType,padSizeX,padSizeY,pcbSizeX,pcbSizeY);
    }
    
    if ( sline(0,kMotifKeyword.Length()) == kMotifKeyword )
    {
      std::istringstream sin(sline(kMotifKeyword.Length(),
                                   sline.Length()-kMotifKeyword.Length()).Data());
      TString sMotifType;
      int ix;
      int iy;
      sin >> sMotifType >> ix >> iy;
      
      AliMpMotifType* motifType = fMotifMap->FindMotifType(sMotifType);
      if (!motifType)
      {
        AliDebug(1,Form("Reading motifType %s from file",sMotifType.Data()));
        motifType = reader.BuildMotifType(dataStreams, sMotifType.Data());
        fMotifMap->AddMotifType(motifType);
      }
      else
      {
        AliDebug(1,Form("Got motifType %s from motifMap",sMotifType.Data()));
      }
      
      if (pcb) pcb->Add(motifType,ix,iy);
    }
  }
  
  delete &in;
  
  return pcb;
}

//_____________________________________________________________________________
AliMpSlat*
AliMpSt345Reader::ReadSlat(const AliMpDataStreams& dataStreams,
                           const char* slatType, AliMp::PlaneType planeType)
{
  ///
  /// Create a new AliMpSlat object, by reading it from file.
  /// The returned object must be deleted by the client.
  
  istream& in 
    = dataStreams.
        CreateDataStream(AliMpFiles::SlatFilePath(
                             AliMp::kStation345, slatType, planeType));

  char line[80];
  
  const TString kpcbKeyword("PCB");
  
  AliMpSlat* slat = new AliMpSlat(slatType, planeType);
  
  while ( in.getline(line,80) )
  {
    if ( line[0] == '#' ) continue;
    
    TString sline(AliMpHelper::Normalize(line));
    
    if ( sline(0,kpcbKeyword.Length()) == kpcbKeyword )
    {
      TString tmp(sline(kpcbKeyword.Length()+1,sline.Length()-kpcbKeyword.Length()));
      Ssiz_t blankPos = tmp.First(' ');
      if ( blankPos < 0 )
	    {
        AliErrorClass("Syntax error in PCB file, should get a list of "
                      "manu ids after the pcbname");
        delete slat;
        return 0;
	    }
      
      TString pcbName(tmp(0,blankPos));
      TString manus(tmp(blankPos+1,tmp.Length()-blankPos));
      
      AliMpPCB* pcbType = ReadPCB(dataStreams,pcbName.Data());
      if (!pcbType)
	    {
        AliErrorClass(Form("Cannot read pcbType=%s",pcbName.Data()));
	      delete slat;
	      return 0;
	    }      

      TArrayI manuList;
      AliMpHelper::DecodeName(manus,';',manuList);
      if ( manuList.GetSize() != Int_t(pcbType->GetSize()) )
	    {
        AliErrorClass(Form("Wrong number of manu ids for this PCB ("
                           "%s) : %d out of %d",pcbName.Data(),
                           manuList.GetSize(),pcbType->GetSize()));
        delete pcbType;
	      delete slat;
	      return 0;
      }

      for ( Int_t i = 0; i < manuList.GetSize(); ++i )
      {
        manuList[i] |= AliMpConstants::ManuMask(planeType);
      }
      slat->Add(*pcbType,manuList);
      delete pcbType;
    }
  }
  
  delete &in;
  
  return slat;
}  
                              

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