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: AliMpMotifReader.cxx,v 1.10 2006/05/24 13:58:41 ivana Exp $
// Category: sector

//-----------------------------------------------------------------------------
// Class AliMpMotifReader
// -------------------
// Class that takes care of reading the sector data.
// Included in AliRoot: 2003/05/02
// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
//-----------------------------------------------------------------------------

#include "AliMpFiles.h"
#include "AliMpDataStreams.h"
#include "AliMpMotifReader.h"
#include "AliMpMotifMap.h"
#include "AliMpMotif.h"
#include "AliMpMotifSpecial.h"
#include "AliMpMotifType.h"
#include "AliMpConnection.h"
#include "AliMpEncodePair.h"

#include "AliLog.h"

#include <TSystem.h>
#include <TMath.h>
#include <Riostream.h>
#include <Rstrstream.h>

#if !defined(__HP_aCC) && !defined(__alpha)
  #include <sstream>
#endif

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

//_____________________________________________________________________________
AliMpMotifReader::AliMpMotifReader(AliMp::StationType station,
                                   AliMq::Station12Type station12,
                                   AliMp::PlaneType plane)
  : TObject(),
    fStationType(station),
    fStation12Type(station12),
    fPlaneType(plane)
{
/// Standard constructor
}

//_____________________________________________________________________________
AliMpMotifReader::~AliMpMotifReader() 
{
/// Destructor  
}

//
// public methods
//

//_____________________________________________________________________________
AliMpMotifType* AliMpMotifReader::BuildMotifType(
                                       const AliMpDataStreams& dataStreams,
                                       const TString& motifTypeId)
{
/// Read the streams describing a motif in the "$MINSTALL/data" directory
/// and fill the AliMpMotifType structure with.
/// The streams mentioned are named padPos<maskName>.dat
/// and connect<maskName>.dat

  // Open streams
  //
  istream& padPosStream 
    = dataStreams.
        CreateDataStream(AliMpFiles::PadPosFilePath(
                            fStationType, fStation12Type, fPlaneType, motifTypeId));
  istream& bergToGCStream 
    = dataStreams.
        CreateDataStream(AliMpFiles::BergToGCFilePath(fStationType, fStation12Type));
      
  istream& motifTypeStream 
    = dataStreams.
        CreateDataStream(AliMpFiles::MotifFilePath(
                            fStationType, fStation12Type, fPlaneType, motifTypeId));

  AliMpMotifType*  motifType = new AliMpMotifType(motifTypeId);	

  TExMap positions;

  char line[256];
  do {
    padPosStream.getline(line,255);
    if (!padPosStream) break;

#if defined (__HP_aCC) || (__alpha)
    strstream strline;
    strline << line;
#else
    istringstream strline(line);
#endif    
    string key;

    strline>>key;
    if ((key=="#") || (key=="") ) continue;

    int i,j;
    strline>>i>>j;
    positions.Add( AliMpExMap::GetIndex(key), 
                   AliMp::Pair(i,j) + 1 );
              // we have to add 1 to the AliMp::Pair in order to 
              // its value always != 0, as the TExMap returns 0 value
              // if given key does not exists      
  } while (!padPosStream.eof());

  const Int_t knbergpins = 
    (fStationType == AliMp::kStation12 ) ? 80 : 100;
  // Station1 & 2 Bergstak connectors have 80 pins, while for stations
  // 3, 4 and 5 they have 100 pins.
  Int_t gassiChannel[100];
  for (Int_t i=0; i<100; ++i) gassiChannel[i] = 0;
  while(1) {
    Int_t bergNum;
    TString gcStr;
    bergToGCStream>>bergNum>>gcStr;
    if (!bergToGCStream.good()) break;
    if (gcStr=="GND") continue;
    if (bergNum>knbergpins) {
        Fatal("BuildMotifType","Berg number > 80 ...");
        continue;
    }
    if ( bergNum <= 0 || bergNum >= 101 ) {
      AliErrorStream() << "Wrong bergNum: " << bergNum << endl;
      return 0;
    }  
    gassiChannel[bergNum-1]= atoi(gcStr);
  }
  
  Int_t nofPadsX=0;
  Int_t nofPadsY=0;

  do {
  
    Int_t ix,iy,numBerg,numKapton,padNum,gassiNum;

    TString lineStr,token;
    lineStr.ReadLine(motifTypeStream);
    if (!motifTypeStream.good()) break;
#if defined (__HP_aCC) || (__alpha)
    strstream tokenList;
    tokenList << lineStr.Data();
#else
    istringstream tokenList(lineStr.Data());
#endif    
    
    token.ReadToken(tokenList);
    if (!tokenList.good()) continue; // column is missing...
    if ( (token.Length()>0) && (token[0]=='#') ) continue; // this is a comment line
    
    numBerg = atoi(token.Data());
    if (numBerg==0) {
      AliWarning(Form("Berg number %s invalid",token.Data()));
      continue;
    }
    
    token.ReadToken(tokenList);
    if (!tokenList.good()) continue; // column is missing...
    numKapton = atoi(token.Data());
    if (numKapton==0) continue;

    
    token.ReadToken(tokenList);
    if (!tokenList.good()) continue; // column is missing...
    if (token=="GND") continue;
    string padName = token.Data();
    padNum = motifType->PadNum(token);
    
     token.ReadToken(tokenList);
     if (token.IsNull() ) continue; // column is missing...
//     if (token[0]!='E') {
//       cerr<<"Problem : gassinumber isn't begining with E:"<<token<<endl;
//       continue;
//     }  else {
//        gassiNum = atoi(token.Data() +1 )-1;
//     }
    if ( (numBerg<1) || (numBerg>knbergpins) ) {
      AliWarning(Form("Berg number %d outside range (1..%d)",numBerg,knbergpins));
      continue;
    }
    
    gassiNum  = gassiChannel[numBerg-1];

    Long_t value = positions.GetValue(AliMpExMap::GetIndex(padName));
    if (!value) {
      AliWarningStream()
        << "Problem: Pad number " << padNum
        << " for motif type " << motifTypeId.Data() 
	<< " found in the motifType stream, but not in the padPos stream" << endl;
      continue;
    }

    AliMpConnection* connection 
      = new AliMpConnection(padNum,numBerg,numKapton,gassiNum, --value);
    
    Bool_t ok = motifType->AddConnection(connection);
    
    if (!ok)
    {
      AliFatal("Could not add connection");
    }
                  
    ix = AliMp::PairFirst(value);
    iy = AliMp::PairSecond(value);
    
    if (ix>=nofPadsX) nofPadsX=ix+1;
    if (iy>=nofPadsY) nofPadsY=iy+1;

  } while (!motifTypeStream.eof());    


  motifType->SetNofPads(nofPadsX, nofPadsY);
  
  delete &padPosStream;
  delete &bergToGCStream;
  delete &motifTypeStream;

  return motifType;
}

//_____________________________________________________________________________
AliMpMotifSpecial*  
AliMpMotifReader::BuildMotifSpecial(const AliMpDataStreams& dataStreams,
                                    const TString& motifID,
                                    AliMpMotifType* motifType,
                                    Double_t scale)
{
/// Build a special motif by reading the file motifSpecial<motifId>.dat
/// in the data directory

  // Open streams
  //
  istream& in 
    = dataStreams.
        CreateDataStream(AliMpFiles::MotifSpecialFilePath(
                             fStationType, fStation12Type, fPlaneType, motifID));

  TString id = MotifSpecialName(motifID,scale);
  
  AliMpMotifSpecial* res = new AliMpMotifSpecial(id,motifType);
  Int_t i,j;
  Double_t x,y;
  in >> i;
  while (!in.eof()){
    in >>j >>x >> y;
    res->SetPadDimensions(i,j,x*scale/2.,y*scale/2.);
    in >> i;
  }
  res->CalculateDimensions();
  
  delete &in;
  
  return res;
}

//_____________________________________________________________________________
TString 
AliMpMotifReader::MotifSpecialName(const TString& motifID, Double_t scale)
{
  /// Build the name taking into the scale, if not 1.0
  TString id;
  
  if ( scale != 1.0 )
  {
    id = Form("%s-%e",motifID.Data(),scale);
  }
  else
  {
    id = motifID;
  }
  return id;
}

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