]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpMotifReader.cxx
PMD module
[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 "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
49 /// \cond CLASSIMP
50 ClassImp(AliMpMotifReader)
51 /// \endcond
52
53 //_____________________________________________________________________________
54 AliMpMotifReader::AliMpMotifReader(AliMp::StationType station,
55                                    AliMq::Station12Type station12,
56                                    AliMp::PlaneType plane)
57   : TObject(),
58     fStationType(station),
59     fStation12Type(station12),
60     fPlaneType(plane)
61 {
62 /// Standard constructor
63 }
64
65 //_____________________________________________________________________________
66 AliMpMotifReader::~AliMpMotifReader() 
67 {
68 /// Destructor  
69 }
70
71 //
72 // public methods
73 //
74
75 //_____________________________________________________________________________
76 AliMpMotifType* AliMpMotifReader::BuildMotifType(
77                                        const AliMpDataStreams& dataStreams,
78                                        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     = dataStreams.
89         CreateDataStream(AliMpFiles::PadPosFilePath(
90                             fStationType, fStation12Type, fPlaneType, motifTypeId));
91   istream& bergToGCStream 
92     = dataStreams.
93         CreateDataStream(AliMpFiles::BergToGCFilePath(fStationType, fStation12Type));
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 //_____________________________________________________________________________
244 AliMpMotifSpecial*  
245 AliMpMotifReader::BuildMotifSpecial(const AliMpDataStreams& dataStreams,
246                                     const TString& motifID,
247                                     AliMpMotifType* motifType,
248                                     Double_t scale)
249 {
250 /// Build a special motif by reading the file motifSpecial<motifId>.dat
251 /// in the data directory
252
253   // Open streams
254   //
255   istream& in 
256     = dataStreams.
257         CreateDataStream(AliMpFiles::MotifSpecialFilePath(
258                              fStationType, fStation12Type, fPlaneType, motifID));
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 {
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