]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/MUONmapping/AliMpMotifReader.cxx
Modified usage of macros:
[u/mrichter/AliRoot.git] / MUON / MUONmapping / AliMpMotifReader.cxx
CommitLineData
197883c2 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$
13985652 17// $MpId: AliMpMotifReader.cxx,v 1.10 2006/05/24 13:58:41 ivana Exp $
197883c2 18// Category: sector
3d1463c8 19
20//-----------------------------------------------------------------------------
197883c2 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
3d1463c8 26//-----------------------------------------------------------------------------
197883c2 27
197883c2 28#include "AliMpFiles.h"
228fd720 29#include "AliMpDataStreams.h"
197883c2 30#include "AliMpMotifReader.h"
31#include "AliMpMotifMap.h"
32#include "AliMpMotif.h"
33#include "AliMpMotifSpecial.h"
34#include "AliMpMotifType.h"
35#include "AliMpConnection.h"
168e9c4d 36#include "AliMpEncodePair.h"
197883c2 37
2c605e66 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
13985652 49/// \cond CLASSIMP
197883c2 50ClassImp(AliMpMotifReader)
13985652 51/// \endcond
197883c2 52
197883c2 53//_____________________________________________________________________________
21027e5a 54AliMpMotifReader::AliMpMotifReader(AliMp::StationType station,
4e51cfd2 55 AliMq::Station12Type station12,
21027e5a 56 AliMp::PlaneType plane)
197883c2 57 : TObject(),
58 fStationType(station),
4e51cfd2 59 fStation12Type(station12),
2c605e66 60 fPlaneType(plane)
197883c2 61{
62/// Standard constructor
63}
64
197883c2 65//_____________________________________________________________________________
66AliMpMotifReader::~AliMpMotifReader()
67{
68/// Destructor
69}
70
197883c2 71//
72// public methods
73//
74
75//_____________________________________________________________________________
21027e5a 76AliMpMotifType* AliMpMotifReader::BuildMotifType(
77 const AliMpDataStreams& dataStreams,
78 const TString& motifTypeId)
197883c2 79{
228fd720 80/// Read the streams describing a motif in the "$MINSTALL/data" directory
197883c2 81/// and fill the AliMpMotifType structure with.
228fd720 82/// The streams mentioned are named padPos<maskName>.dat
197883c2 83/// and connect<maskName>.dat
84
228fd720 85 // Open streams
86 //
87 istream& padPosStream
21027e5a 88 = dataStreams.
ab167304 89 CreateDataStream(AliMpFiles::PadPosFilePath(
4e51cfd2 90 fStationType, fStation12Type, fPlaneType, motifTypeId));
228fd720 91 istream& bergToGCStream
21027e5a 92 = dataStreams.
4e51cfd2 93 CreateDataStream(AliMpFiles::BergToGCFilePath(fStationType, fStation12Type));
228fd720 94
95 istream& motifTypeStream
21027e5a 96 = dataStreams.
ab167304 97 CreateDataStream(AliMpFiles::MotifFilePath(
4e51cfd2 98 fStationType, fStation12Type, fPlaneType, motifTypeId));
197883c2 99
228fd720 100 AliMpMotifType* motifType = new AliMpMotifType(motifTypeId);
197883c2 101
2294822d 102 TExMap positions;
197883c2 103
104 char line[256];
105 do {
228fd720 106 padPosStream.getline(line,255);
107 if (!padPosStream) break;
197883c2 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;
5006ec94 122 positions.Add( AliMpExMap::GetIndex(key),
168e9c4d 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
228fd720 127 } while (!padPosStream.eof());
197883c2 128
f29ba3e1 129 const Int_t knbergpins =
4e51cfd2 130 (fStationType == AliMp::kStation12 ) ? 80 : 100;
197883c2 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];
76e1274b 134 for (Int_t i=0; i<100; ++i) gassiChannel[i] = 0;
197883c2 135 while(1) {
136 Int_t bergNum;
137 TString gcStr;
228fd720 138 bergToGCStream>>bergNum>>gcStr;
139 if (!bergToGCStream.good()) break;
197883c2 140 if (gcStr=="GND") continue;
f29ba3e1 141 if (bergNum>knbergpins) {
197883c2 142 Fatal("BuildMotifType","Berg number > 80 ...");
143 continue;
144 }
2ca8e354 145 if ( bergNum <= 0 || bergNum >= 101 ) {
146 AliErrorStream() << "Wrong bergNum: " << bergNum << endl;
147 return 0;
148 }
197883c2 149 gassiChannel[bergNum-1]= atoi(gcStr);
150 }
197883c2 151
197883c2 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;
228fd720 160 lineStr.ReadLine(motifTypeStream);
161 if (!motifTypeStream.good()) break;
197883c2 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// }
f29ba3e1 199 if ( (numBerg<1) || (numBerg>knbergpins) ) {
200 AliWarning(Form("Berg number %d outside range (1..%d)",numBerg,knbergpins));
197883c2 201 continue;
202 }
203
204 gassiNum = gassiChannel[numBerg-1];
205
5006ec94 206 Long_t value = positions.GetValue(AliMpExMap::GetIndex(padName));
197883c2 207 if (!value) {
2c605e66 208 AliWarningStream()
209 << "Problem: Pad number " << padNum
228fd720 210 << " for motif type " << motifTypeId.Data()
211 << " found in the motifType stream, but not in the padPos stream" << endl;
197883c2 212 continue;
213 }
214
630711ed 215 AliMpConnection* connection
168e9c4d 216 = new AliMpConnection(padNum,numBerg,numKapton,gassiNum, --value);
630711ed 217
3635f34f 218 Bool_t ok = motifType->AddConnection(connection);
219
220 if (!ok)
221 {
222 AliFatal("Could not add connection");
223 }
630711ed 224
168e9c4d 225 ix = AliMp::PairFirst(value);
226 iy = AliMp::PairSecond(value);
227
197883c2 228 if (ix>=nofPadsX) nofPadsX=ix+1;
229 if (iy>=nofPadsY) nofPadsY=iy+1;
230
228fd720 231 } while (!motifTypeStream.eof());
197883c2 232
233
234 motifType->SetNofPads(nofPadsX, nofPadsY);
228fd720 235
236 delete &padPosStream;
237 delete &bergToGCStream;
238 delete &motifTypeStream;
197883c2 239
240 return motifType;
241}
242
197883c2 243//_____________________________________________________________________________
244AliMpMotifSpecial*
21027e5a 245AliMpMotifReader::BuildMotifSpecial(const AliMpDataStreams& dataStreams,
246 const TString& motifID,
d1c53ece 247 AliMpMotifType* motifType,
248 Double_t scale)
197883c2 249{
250/// Build a special motif by reading the file motifSpecial<motifId>.dat
251/// in the data directory
252
228fd720 253 // Open streams
254 //
255 istream& in
21027e5a 256 = dataStreams.
ab167304 257 CreateDataStream(AliMpFiles::MotifSpecialFilePath(
4e51cfd2 258 fStationType, fStation12Type, fPlaneType, motifID));
197883c2 259
0e8df63e 260 TString id = MotifSpecialName(motifID,scale);
261
262 AliMpMotifSpecial* res = new AliMpMotifSpecial(id,motifType);
197883c2 263 Int_t i,j;
264 Double_t x,y;
265 in >> i;
266 while (!in.eof()){
267 in >>j >>x >> y;
6e97fbb8 268 res->SetPadDimensions(i,j,x*scale/2.,y*scale/2.);
197883c2 269 in >> i;
270 }
d7885370 271 res->CalculateDimensions();
197883c2 272
228fd720 273 delete &in;
274
197883c2 275 return res;
276}
277
228fd720 278//_____________________________________________________________________________
279TString
280AliMpMotifReader::MotifSpecialName(const TString& motifID, Double_t scale)
281{
282 /// Build the name taking into the scale, if not 1.0
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