]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpMotifReader.cxx
In mapping:
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpMotifReader.cxx
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 "AliMpIntPair.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
49 /// \cond CLASSIMP
50 ClassImp(AliMpMotifReader)
51 /// \endcond
52
53 //_____________________________________________________________________________
54 AliMpMotifReader::AliMpMotifReader(const AliMpDataStreams& dataStreams,
55                                    AliMp::StationType station, 
56                                    AliMq::Station12Type station12,
57                                    AliMp::PlaneType plane) 
58   : TObject(),
59     fDataStreams(dataStreams),
60     fStationType(station),
61     fStation12Type(station12),
62     fPlaneType(plane)
63 {
64 /// Standard constructor
65 }
66
67 //_____________________________________________________________________________
68 AliMpMotifReader::~AliMpMotifReader() 
69 {
70 /// Destructor  
71 }
72
73 //
74 // public methods
75 //
76
77 //_____________________________________________________________________________
78 AliMpMotifType* AliMpMotifReader::BuildMotifType(const TString& motifTypeId)
79 {
80 /// Read the streams describing a motif in the "$MINSTALL/data" directory
81 /// and fill the AliMpMotifType structure with.
82 /// The streams mentioned are named padPos<maskName>.dat
83 /// and connect<maskName>.dat
84
85   // Open streams
86   //
87   istream& padPosStream 
88     = fDataStreams.
89         CreateDataStream(AliMpFiles::PadPosFilePath(
90                             fStationType, fStation12Type, fPlaneType, motifTypeId));
91   istream& bergToGCStream 
92     = fDataStreams.
93         CreateDataStream(AliMpFiles::BergToGCFilePath(fStationType, fStation12Type));
94       
95   istream& motifTypeStream 
96     = fDataStreams.
97         CreateDataStream(AliMpFiles::MotifFilePath(
98                             fStationType, fStation12Type, fPlaneType, motifTypeId));
99
100   AliMpMotifType*  motifType = new AliMpMotifType(motifTypeId); 
101
102   PadMapType 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 #ifdef WITH_STL
123     positions[key].first=i;
124     positions[key].second=j;
125 #endif
126 #ifdef WITH_ROOT
127     positions.Add( AliMpExMap::GetIndex(key), 
128                    AliMpExMap::GetIndex(AliMpIntPair(i,j)) ); 
129 #endif
130   } while (!padPosStream.eof());
131
132   const Int_t knbergpins = 
133     (fStationType == AliMp::kStation12 ) ? 80 : 100;
134   // Station1 & 2 Bergstak connectors have 80 pins, while for stations
135   // 3, 4 and 5 they have 100 pins.
136   Int_t gassiChannel[100];
137   while(1) {
138     Int_t bergNum;
139     TString gcStr;
140     bergToGCStream>>bergNum>>gcStr;
141     if (!bergToGCStream.good()) break;
142     if (gcStr=="GND") continue;
143     if (bergNum>knbergpins) {
144         Fatal("BuildMotifType","Berg number > 80 ...");
145         continue;
146     }
147     gassiChannel[bergNum-1]= atoi(gcStr);
148   }
149   
150   Int_t nofPadsX=0;
151   Int_t nofPadsY=0;
152
153   do {
154   
155     Int_t ix,iy,numBerg,numKapton,padNum,gassiNum;
156
157     TString lineStr,token;
158     lineStr.ReadLine(motifTypeStream);
159     if (!motifTypeStream.good()) break;
160 #if defined (__HP_aCC) || (__alpha)
161     strstream tokenList;
162     tokenList << lineStr.Data();
163 #else
164     istringstream tokenList(lineStr.Data());
165 #endif    
166     
167     token.ReadToken(tokenList);
168     if (!tokenList.good()) continue; // column is missing...
169     if ( (token.Length()>0) && (token[0]=='#') ) continue; // this is a comment line
170     
171     numBerg = atoi(token.Data());
172     if (numBerg==0) {
173       AliWarning(Form("Berg number %s invalid",token.Data()));
174       continue;
175     }
176     
177     token.ReadToken(tokenList);
178     if (!tokenList.good()) continue; // column is missing...
179     numKapton = atoi(token.Data());
180     if (numKapton==0) continue;
181
182     
183     token.ReadToken(tokenList);
184     if (!tokenList.good()) continue; // column is missing...
185     if (token=="GND") continue;
186     string padName = token.Data();
187     padNum = motifType->PadNum(token);
188     
189      token.ReadToken(tokenList);
190      if (token.IsNull() ) continue; // column is missing...
191 //     if (token[0]!='E') {
192 //       cerr<<"Problem : gassinumber isn't begining with E:"<<token<<endl;
193 //       continue;
194 //     }  else {
195 //        gassiNum = atoi(token.Data() +1 )-1;
196 //     }
197     if ( (numBerg<1) || (numBerg>knbergpins) ) {
198       AliWarning(Form("Berg number %d outside range (1..%d)",numBerg,knbergpins));
199       continue;
200     }
201     
202     gassiNum  = gassiChannel[numBerg-1];
203
204 #ifdef WITH_STL
205     PadMapTypeIterator iter = positions.find(padName);
206     if (iter==positions.end()) {
207       AliWarningStream()
208         << "Problem: Pad number " << padNum
209         << " for motif type " << motifTypeId.Data() 
210         << " found in the motifType stream, but not in the padPos stream" << endl;
211       continue;
212     }
213
214     ix= iter->second.first;
215     iy= iter->second.second;
216 #endif
217
218 #ifdef WITH_ROOT
219     Long_t value = positions.GetValue(AliMpExMap::GetIndex(padName));
220     if (!value) {
221       AliWarningStream()
222         << "Problem: Pad number " << padNum
223         << " for motif type " << motifTypeId.Data() 
224         << " found in the motifType stream, but not in the padPos stream" << endl;
225       continue;
226     }
227
228     ix = AliMpExMap::GetPair(value).GetFirst();
229     iy = AliMpExMap::GetPair(value).GetSecond();
230     
231 #endif
232
233     AliMpConnection* connection 
234       = new AliMpConnection(padNum,numBerg,numKapton,gassiNum, AliMpIntPair(ix,iy));
235     
236     motifType->AddConnection(AliMpIntPair(ix,iy),connection);
237                   
238     if (ix>=nofPadsX) nofPadsX=ix+1;
239     if (iy>=nofPadsY) nofPadsY=iy+1;
240
241   } while (!motifTypeStream.eof());    
242
243
244   motifType->SetNofPads(nofPadsX, nofPadsY);
245   
246   delete &padPosStream;
247   delete &bergToGCStream;
248   delete &motifTypeStream;
249
250   return motifType;
251 }
252
253 //_____________________________________________________________________________
254 AliMpMotifSpecial*  
255 AliMpMotifReader::BuildMotifSpecial(const TString& motifID,
256                                     AliMpMotifType* motifType,
257                                     Double_t scale)
258 {
259 /// Build a special motif by reading the file motifSpecial<motifId>.dat
260 /// in the data directory
261
262   // Open streams
263   //
264   istream& in 
265     = fDataStreams.
266         CreateDataStream(AliMpFiles::MotifSpecialFilePath(
267                              fStationType, fStation12Type, fPlaneType, motifID));
268
269   TString id = MotifSpecialName(motifID,scale);
270   
271   AliMpMotifSpecial* res = new AliMpMotifSpecial(id,motifType);
272   Int_t i,j;
273   Double_t x,y;
274   in >> i;
275   while (!in.eof()){
276     in >>j >>x >> y;
277     res->SetPadDimensions(AliMpIntPair(i,j),TVector2(x*scale/2.,y*scale/2.));
278     in >> i;
279   }
280   res->CalculateDimensions();
281   
282   delete &in;
283   
284   return res;
285 }
286
287 //_____________________________________________________________________________
288 TString 
289 AliMpMotifReader::MotifSpecialName(const TString& motifID, Double_t scale)
290 {
291   /// Build the name taking into the scale, if not 1.0
292   TString id;
293   
294   if ( scale != 1.0 )
295   {
296     id = Form("%s-%e",motifID.Data(),scale);
297   }
298   else
299   {
300     id = motifID;
301   }
302   return id;
303 }
304