AliRoot Core  da88d91 (da88d91)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliMpMotifReader.cxx
Go to the documentation of this file.
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Author: The ALICE Off-line Project. *
5  * Contributors are mentioned in the code where appropriate. *
6  * *
7  * Permission to use, copy, modify and distribute this software and its *
8  * documentation strictly for non-commercial purposes is hereby granted *
9  * without fee, provided that the above copyright notice appears in all *
10  * copies and that both the copyright notice and this permission notice *
11  * appear in the supporting documentation. The authors make no claims *
12  * about the suitability of this software for any purpose. It is *
13  * provided "as is" without express or implied warranty. *
14  **************************************************************************/
15 
16 // $Id$
17 // $MpId: AliMpMotifReader.cxx,v 1.10 2006/05/24 13:58:41 ivana Exp $
18 // Category: sector
19 
20 //-----------------------------------------------------------------------------
21 // Class AliMpMotifReader
22 // -------------------
23 // Class that takes care of reading the sector data.
24 // Included in AliRoot: 2003/05/02
25 // Authors: David Guez, Ivana Hrivnacova; IPN Orsay
26 //-----------------------------------------------------------------------------
27 
28 #include "AliMpFiles.h"
29 #include "AliMpDataStreams.h"
30 #include "AliMpMotifReader.h"
31 #include "AliMpMotifMap.h"
32 #include "AliMpMotif.h"
33 #include "AliMpMotifSpecial.h"
34 #include "AliMpMotifType.h"
35 #include "AliMpConnection.h"
36 #include "AliMpEncodePair.h"
37 
38 #include "AliLog.h"
39 
40 #include <TSystem.h>
41 #include <TMath.h>
42 #include <Riostream.h>
43 #include <Rstrstream.h>
44 
45 #if !defined(__HP_aCC) && !defined(__alpha)
46  #include <sstream>
47 #endif
48 
52 
53 //_____________________________________________________________________________
55  AliMq::Station12Type station12,
56  AliMp::PlaneType plane)
57  : TObject(),
58  fStationType(station),
59  fStation12Type(station12),
60  fPlaneType(plane)
61 {
63 }
64 
65 //_____________________________________________________________________________
67 {
69 }
70 
71 //
72 // public methods
73 //
74 
75 //_____________________________________________________________________________
77  const AliMpDataStreams& dataStreams,
78  const TString& motifTypeId)
79 {
84 
85  // Open streams
86  //
87  istream& padPosStream
88  = dataStreams.
89  CreateDataStream(AliMpFiles::PadPosFilePath(
90  fStationType, fStation12Type, fPlaneType, motifTypeId));
91  istream& bergToGCStream
92  = dataStreams.
94 
95  istream& motifTypeStream
96  = dataStreams.
97  CreateDataStream(AliMpFiles::MotifFilePath(
98  fStationType, fStation12Type, fPlaneType, motifTypeId));
99 
100  AliMpMotifType* motifType = new AliMpMotifType(motifTypeId);
101 
102  TExMap positions;
103 
104  char line[256];
105  do {
106  padPosStream.getline(line,255);
107  if (!padPosStream) break;
108 
109 #if defined (__HP_aCC) || (__alpha)
110  strstream strline;
111  strline << line;
112 #else
113  istringstream strline(line);
114 #endif
115  string key;
116 
117  strline>>key;
118  if ((key=="#") || (key=="") ) continue;
119 
120  int i,j;
121  strline>>i>>j;
122  positions.Add( AliMpExMap::GetIndex(key),
123  AliMp::Pair(i,j) + 1 );
124  // we have to add 1 to the AliMp::Pair in order to
125  // its value always != 0, as the TExMap returns 0 value
126  // if given key does not exists
127  } while (!padPosStream.eof());
128 
129  const Int_t knbergpins =
130  (fStationType == AliMp::kStation12 ) ? 80 : 100;
131  // Station1 & 2 Bergstak connectors have 80 pins, while for stations
132  // 3, 4 and 5 they have 100 pins.
133  Int_t gassiChannel[100];
134  for (Int_t i=0; i<100; ++i) gassiChannel[i] = 0;
135  while(1) {
136  Int_t bergNum;
137  TString gcStr;
138  bergToGCStream>>bergNum>>gcStr;
139  if (!bergToGCStream.good()) break;
140  if (gcStr=="GND") continue;
141  if (bergNum>knbergpins) {
142  Fatal("BuildMotifType","Berg number > 80 ...");
143  continue;
144  }
145  if ( bergNum <= 0 || bergNum >= 101 ) {
146  AliErrorStream() << "Wrong bergNum: " << bergNum << endl;
147  return 0;
148  }
149  gassiChannel[bergNum-1]= atoi(gcStr);
150  }
151 
152  Int_t nofPadsX=0;
153  Int_t nofPadsY=0;
154 
155  do {
156 
157  Int_t ix,iy,numBerg,numKapton,padNum,gassiNum;
158 
159  TString lineStr,token;
160  lineStr.ReadLine(motifTypeStream);
161  if (!motifTypeStream.good()) break;
162 #if defined (__HP_aCC) || (__alpha)
163  strstream tokenList;
164  tokenList << lineStr.Data();
165 #else
166  istringstream tokenList(lineStr.Data());
167 #endif
168 
169  token.ReadToken(tokenList);
170  if (!tokenList.good()) continue; // column is missing...
171  if ( (token.Length()>0) && (token[0]=='#') ) continue; // this is a comment line
172 
173  numBerg = atoi(token.Data());
174  if (numBerg==0) {
175  AliWarning(Form("Berg number %s invalid",token.Data()));
176  continue;
177  }
178 
179  token.ReadToken(tokenList);
180  if (!tokenList.good()) continue; // column is missing...
181  numKapton = atoi(token.Data());
182  if (numKapton==0) continue;
183 
184 
185  token.ReadToken(tokenList);
186  if (!tokenList.good()) continue; // column is missing...
187  if (token=="GND") continue;
188  string padName = token.Data();
189  padNum = motifType->PadNum(token);
190 
191  token.ReadToken(tokenList);
192  if (token.IsNull() ) continue; // column is missing...
193 // if (token[0]!='E') {
194 // cerr<<"Problem : gassinumber isn't begining with E:"<<token<<endl;
195 // continue;
196 // } else {
197 // gassiNum = atoi(token.Data() +1 )-1;
198 // }
199  if ( (numBerg<1) || (numBerg>knbergpins) ) {
200  AliWarning(Form("Berg number %d outside range (1..%d)",numBerg,knbergpins));
201  continue;
202  }
203 
204  gassiNum = gassiChannel[numBerg-1];
205 
206  Long_t value = positions.GetValue(AliMpExMap::GetIndex(padName));
207  if (!value) {
208  AliWarningStream()
209  << "Problem: Pad number " << padNum
210  << " for motif type " << motifTypeId.Data()
211  << " found in the motifType stream, but not in the padPos stream" << endl;
212  continue;
213  }
214 
215  AliMpConnection* connection
216  = new AliMpConnection(padNum,numBerg,numKapton,gassiNum, --value);
217 
218  Bool_t ok = motifType->AddConnection(connection);
219 
220  if (!ok)
221  {
222  AliFatal("Could not add connection");
223  }
224 
225  ix = AliMp::PairFirst(value);
226  iy = AliMp::PairSecond(value);
227 
228  if (ix>=nofPadsX) nofPadsX=ix+1;
229  if (iy>=nofPadsY) nofPadsY=iy+1;
230 
231  } while (!motifTypeStream.eof());
232 
233 
234  motifType->SetNofPads(nofPadsX, nofPadsY);
235 
236  delete &padPosStream;
237  delete &bergToGCStream;
238  delete &motifTypeStream;
239 
240  return motifType;
241 }
242 
243 //_____________________________________________________________________________
246  const TString& motifID,
247  AliMpMotifType* motifType,
248  Double_t scale)
249 {
252 
253  // Open streams
254  //
255  istream& in
256  = dataStreams.
257  CreateDataStream(AliMpFiles::MotifSpecialFilePath(
259 
260  TString id = MotifSpecialName(motifID,scale);
261 
262  AliMpMotifSpecial* res = new AliMpMotifSpecial(id,motifType);
263  Int_t i,j;
264  Double_t x,y;
265  in >> i;
266  while (!in.eof()){
267  in >>j >>x >> y;
268  res->SetPadDimensions(i,j,x*scale/2.,y*scale/2.);
269  in >> i;
270  }
271  res->CalculateDimensions();
272 
273  delete &in;
274 
275  return res;
276 }
277 
278 //_____________________________________________________________________________
279 TString
280 AliMpMotifReader::MotifSpecialName(const TString& motifID, Double_t scale)
281 {
283  TString id;
284 
285  if ( scale != 1.0 )
286  {
287  id = Form("%s-%e",motifID.Data(),scale);
288  }
289  else
290  {
291  id = motifID;
292  }
293  return id;
294 }
295 
Int_t PadNum(const TString &padName) const
void SetPadDimensions(MpPair_t localIndices, Double_t dx, Double_t dy)
station 1,2 (quadrants)
A connection properties.
A special motif with varying pad dimensions.
AliMpMotifSpecial * BuildMotifSpecial(const AliMpDataStreams &dataStreams, const TString &motifID, AliMpMotifType *motifType, Double_t scale=1.0)
TString MotifSpecialName(const TString &motifID, Double_t scale)
static TString PadPosFilePath(AliMp::StationType station, AliMq::Station12Type station12Type, AliMp::PlaneType plane, const TString &motifTypeID)
Definition: AliMpFiles.cxx:439
AliMp::PlaneType fPlaneType
plane type
MpPair_t Pair(Int_t first, Int_t second)
Encode the pair of integers to another integer.
AliMq::Station12Type fStation12Type
station12 type
static TString MotifFilePath(AliMp::StationType station, AliMq::Station12Type station12Type, AliMp::PlaneType plane, const TString &motifTypeID)
Definition: AliMpFiles.cxx:419
AliMpMotifType * BuildMotifType(const AliMpDataStreams &dataStreams, const TString &motifTypeId)
Float_t scale[5]
void SetNofPads(Int_t nofPadsX, Int_t nofPadY)
ClassImp(TPCGenInfo)
Definition: AliTPCCmpNG.C:254
static TString MotifSpecialFilePath(AliMp::StationType station, AliMq::Station12Type station12Type, AliMp::PlaneType plane, const TString &motifID)
Definition: AliMpFiles.cxx:460
Int_t PairFirst(MpPair_t pair)
Decode the first integer from encoded pair.
Class that takes care of reading the motifs data.
Bool_t AddConnection(AliMpConnection *connection)
static TString BergToGCFilePath(AliMp::StationType station, AliMq::Station12Type station12Type)
Definition: AliMpFiles.cxx:472
static Long_t GetIndex(const TString &s)
Definition: AliMpExMap.cxx:69
Int_t PairSecond(MpPair_t pair)
Decode the second integer from encoded pair.
void res(Char_t i)
Definition: Resolution.C:2
Class that defines the motif properties.
AliMp::StationType fStationType
station type
virtual ~AliMpMotifReader()
Mapping data streams provider.