AliRoot Core  v5-06-15 (45dab64)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliMpMotifType.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: AliMpMotifType.cxx,v 1.10 2006/05/24 13:58:41 ivana Exp $
18 // Category: motif
19 
20 //-----------------------------------------------------------------------------
21 // Class AliMpMotifType
22 // --------------------
23 // Class that defines the motif properties.
24 // Included in AliRoot: 2003/05/02
25 // Authors: David Guez, Ivana Hrivnacova; IPN Orsay
26 //-----------------------------------------------------------------------------
27 
28 #include "AliMpMotifType.h"
29 #include "AliMpExMapIterator.h"
31 #include "AliMpConnection.h"
32 #include "AliMpConstants.h"
33 #include "AliMpFiles.h"
34 #include "AliMpEncodePair.h"
35 
36 #include "AliLog.h"
37 
38 #include <TSystem.h>
39 #include <Riostream.h>
40 
41 #include <cstdlib>
42 
43 using std::cout;
44 using std::endl;
45 using std::ofstream;
46 using std::setw;
50 
51 const Int_t AliMpMotifType::fgkPadNumForA = 65;
52 
53 //______________________________________________________________________________
54 AliMpMotifType::AliMpMotifType(const TString &id)
55 : TObject(),
56 fID(id),
57 fNofPadsX(0),
58 fNofPadsY(0),
59 fNofPads(0),
60 fMaxNofPads(AliMpConstants::ManuNofChannels()),
61 fConnectionsByLocalIndices(fMaxNofPads*fMaxNofPads),
62 fConnectionsByManuChannel(fMaxNofPads)
63 {
66  // %s-%e-%e for station345 and %sx%e for stationTrigger
67 
68  fConnectionsByLocalIndices.SetOwner(kTRUE);
69  fConnectionsByManuChannel.SetOwner(kFALSE);
70  AliDebug(1,Form("this=%p id=%s",this,id.Data()));
71 }
72 
73 //______________________________________________________________________________
75 : TObject(),
76 fID(""),
77 fNofPadsX(0),
78 fNofPadsY(0),
79 fNofPads(0),
80 fMaxNofPads(0),
81 fConnectionsByLocalIndices(),
82 fConnectionsByManuChannel()
83 {
85  AliDebug(1,Form("this=%p",this));
86 }
87 
88 //______________________________________________________________________________
90 : TObject(),
91 fID(""),
92 fNofPadsX(0),
93 fNofPadsY(0),
94 fNofPads(0),
95 fMaxNofPads(0),
96 fConnectionsByLocalIndices(),
97 fConnectionsByManuChannel()
98 {
100  AliDebug(1,Form("this=%p (copy ctor)",this));
101  rhs.Copy(*this);
102 }
103 
104 //______________________________________________________________________________
107 {
109 
110  TObject::operator=(rhs);
111  rhs.Copy(*this);
112  return *this;
113 }
114 
115 //______________________________________________________________________________
116 TObject*
117 AliMpMotifType::Clone(const char* /*newname*/) const
118 {
120  return new AliMpMotifType(*this);
121 }
122 
123 //______________________________________________________________________________
124 void
125 AliMpMotifType::Copy(TObject& object) const
126 {
128 
129  TObject::Copy(object);
130  AliMpMotifType& mt = static_cast<AliMpMotifType&>(object);
131  mt.fID = fID;
132  mt.fNofPadsX = fNofPadsX;
133  mt.fNofPadsY = fNofPadsY;
134  mt.fNofPads = fNofPads;
138 }
139 
140 //______________________________________________________________________________
142 {
144 
145  AliDebug(1,Form("this=%p",this));
146 }
147 
148 //______________________________________________________________________________
150 {
152 
153  return new AliMpMotifTypePadIterator(this);
154 }
155 
156 //______________________________________________________________________________
157 void AliMpMotifType::SetNofPads(Int_t nofPadsX, Int_t nofPadsY)
158 {
160 
161  fNofPadsX = nofPadsX;
162  fNofPadsY = nofPadsY;
163 }
164 
165 
166 //______________________________________________________________________________
167 Int_t AliMpMotifType::PadNum(const TString &padName) const
168 {
170 
171  if ( (padName[0]>='A') && (padName[0]<='Z') )
172  return fgkPadNumForA+padName[0]-'A';
173  else
174  return atoi(padName.Data());
175 }
176 
177 //______________________________________________________________________________
178 TString AliMpMotifType::PadName(Int_t padNum) const
179 {
181 
182  if (padNum<fgkPadNumForA)
183  return Form("%d",padNum);
184  else
185  return char('A'+padNum-fgkPadNumForA);
186 }
187 
188 //______________________________________________________________________________
189 Bool_t
191 {
193 
194  if (!connection) return kFALSE;
195 
196  Int_t ix = connection->GetLocalIx();
197  Int_t iy = connection->GetLocalIy();
198 
199  Int_t manuChannel = connection->GetManuChannel();
200 
201  if ( ix >=0 && ix < fMaxNofPads &&
202  iy >=0 && iy < fMaxNofPads &&
203  manuChannel >= 0 && manuChannel < AliMpConstants::ManuNofChannels())
204  {
205 
206  Int_t index = ix + iy*AliMpConstants::ManuNofChannels();
207 
209  connection->GetLocalIndices());
210 
211  if (c)
212  {
213  AliError(Form("Connection already exists for ix=%d iy=%d",ix,iy));
214  return kFALSE;
215  }
216 
217  ++fNofPads;
218 
219  fConnectionsByLocalIndices[index] = connection;
220  fConnectionsByManuChannel[manuChannel] = connection;
221 
222  connection->SetOwner(this);
223 
224  return kTRUE;
225 
226  }
227  return kFALSE;
228 }
229 
230 //______________________________________________________________________________
233 {
236 
237  TIter next(&fConnectionsByManuChannel);
238  AliMpConnection* connection;
239 
240  while ( ( connection = static_cast<AliMpConnection*>(next()) ) )
241  {
242  if (connection->GetPadNum()==padNum) return connection;
243  }
244  return 0x0;
245 }
246 
247 //______________________________________________________________________________
250 {
252 
253  return FindConnectionByLocalIndices(AliMp::PairFirst(localIndices),
254  AliMp::PairSecond(localIndices));
255 }
256 
257 //______________________________________________________________________________
260 {
262 
263  if ( ix < fNofPadsX && iy < fNofPadsY && ix >= 0 && iy >= 0 )
264  {
265  Int_t index = ix + iy*fMaxNofPads;
266 
267  return static_cast<AliMpConnection*>(fConnectionsByLocalIndices.UncheckedAt(index));
268  }
269  else
270  {
271  return 0x0;
272  }
273 }
274 
275 //______________________________________________________________________________
278 {
280 
281  if ( gassiNum >=0 && gassiNum < fMaxNofPads )
282  {
283  return static_cast<AliMpConnection*>(fConnectionsByManuChannel.UncheckedAt(gassiNum));
284  }
285 
286  return 0x0;
287 }
288 
289 //______________________________________________________________________________
292 {
295 
296  TIter next(&fConnectionsByManuChannel);
297  AliMpConnection* connection;
298 
299  while ( ( connection = static_cast<AliMpConnection*>(next()) ) )
300  {
301  if ( connection && connection->GetKaptonNum()==kaptonNum) return connection;
302  }
303  return 0x0;
304 }
305 
306 //______________________________________________________________________________
309 {
312 
313  TIter next(&fConnectionsByManuChannel);
314  AliMpConnection* connection;
315 
316  while ( ( connection = static_cast<AliMpConnection*>(next()) ) )
317  {
318  if ( connection && connection->GetBergNum()==bergNum) return connection;
319  }
320  return 0x0;
321 }
322 
323 
324 //______________________________________________________________________________
326 {
328 
329  return connection->GetLocalIndices();
330 }
331 
332 //______________________________________________________________________________
334 {
336 
337  AliMpConnection* connection = FindConnectionByPadNum(padNum);
338 
339  if ( ! connection) return -1;
340 
341  return connection->GetLocalIndices();
342 }
343 
344 //______________________________________________________________________________
346 {
348 
349  AliMpConnection* connection = FindConnectionByGassiNum(gassiNum);
350 
351  if ( ! connection) return -1;
352 
353  return connection->GetLocalIndices();
354 }
355 
356 //______________________________________________________________________________
358 {
360 
361  AliMpConnection* connection = FindConnectionByKaptonNum(kaptonNum);
362 
363  if ( ! connection) return -1;
364 
365  return connection->GetLocalIndices();
366 }
367 
368 //______________________________________________________________________________
370 {
372 
373  AliMpConnection* connection = FindConnectionByBergNum(bergNum);
374 
375  if ( ! connection) return -1;
376 
377  return connection->GetLocalIndices();
378 }
379 
380 //______________________________________________________________________________
381 Bool_t
383 {
385 
386  return ( FindConnectionByLocalIndices(localIndices) != 0x0 );
387 }
388 
389 //______________________________________________________________________________
390 Bool_t
391 AliMpMotifType::HasPadByLocalIndices(Int_t localIx, Int_t localIy) const
392 {
394 
395  return ( FindConnectionByLocalIndices(localIx, localIy) != 0x0 );
396 }
397 
398 //______________________________________________________________________________
399 Bool_t
400 AliMpMotifType::HasPadByManuChannel(Int_t manuChannel) const
401 {
403 
404 // if ( manuChannel >= fNofPads ) return kFALSE;
405 
406  return ( FindConnectionByGassiNum(manuChannel) != 0x0 );
407 }
408 
409 //______________________________________________________________________________
410 void AliMpMotifType::Print(Option_t *option) const
411 {
422 
423  switch (option[0]){
424  case 'N':cout<<"Name mapping";
425  break;
426  case 'K':cout<<"Kapton mapping";
427  break;
428  case 'B':cout<<"Berg mapping";
429  break;
430  case 'G':cout<<"Gassiplex number mapping";
431  break;
432  default:cout<<"Pad mapping";
433  }
434  cout<<" in the motif "<<fID<<endl;
435  cout<<"-----------------------------------"<<endl;
436 
437  for (Int_t j=fNofPadsY-1;j>=0;j--){
438  for (Int_t i=0;i<fNofPadsX;i++){
440  TString str;
441  if (connexion){
442  AliDebug(1,Form("i,j=%2d,%2d connexion=%p",i,j,connexion));
443 
444  switch (option[0]){
445  case 'N':str=PadName(connexion->GetPadNum());
446  break;
447  case 'K':str=Form("%d",connexion->GetKaptonNum());
448  break;
449  case 'B':str=Form("%d",connexion->GetBergNum());
450  break;
451  case 'G':str=Form("%d",connexion->GetManuChannel());
452  break;
453  default:str= Form("%d",connexion->GetPadNum());
454  }
455  cout<<setw(2)<<str;
456  } else cout<<setw(2)<<"--";
457  cout<<" ";
458  }
459  cout<<endl;
460  }
461 }
462 
463 //_____________________________________________________________________________
464 Bool_t
466 {
468 
469  return Save(fID.Data());
470 }
471 
472 //_____________________________________________________________________________
473 Bool_t
474 AliMpMotifType::Save(const char* motifName) const
475 {
477 
478  TString padPosFileName(AliMpFiles::PadPosFileName(motifName));
479 
480  TString motifTypeFileName(AliMpFiles::MotifFileName(motifName));
481 
482  // first a protection : do not allow overwriting existing files...
483  Bool_t test = gSystem->AccessPathName(padPosFileName.Data());
484  if (test==kFALSE) // AccessPathName has a strange return value convention...
485  {
486  AliError("Cannot overwrite existing padPos file");
487  return kFALSE;
488  }
489  test = gSystem->AccessPathName(motifTypeFileName.Data());
490  if (test==kFALSE)
491  {
492  AliError("Cannot overwrite existing motifType file");
493  return kFALSE;
494  }
495 
496  ofstream padPosFile(padPosFileName.Data());
497  ofstream motifFile(motifTypeFileName.Data());
498 
499  motifFile << "# Motif " << motifName << endl
500  << "#" << endl
501  << "#connecteur_berg kapton padname not_used" << endl
502  << "#for slats there's no kapton connector, so it's always 1"
503  << " (zero make the reader" << endl
504  << "#exit, so it's not a valid value here)." << endl
505  << "#" << endl;
506 
507  for ( Int_t ix = 0; ix < GetNofPadsX(); ++ix )
508  {
509  for ( Int_t iy = 0; iy < GetNofPadsY(); ++iy )
510  {
512  if (con)
513  {
514  motifFile << con->GetBergNum() << "\t1\t" << con->GetPadNum() << "\t-" << endl;
515  padPosFile << con->GetPadNum() << "\t" << ix << "\t" << iy << endl;
516  }
517  }
518  }
519 
520  padPosFile.close();
521  motifFile.close();
522 
523  return kTRUE;
524 }
525 
526 
527 
Int_t fNofPads
total number of pads (= the number of non-void entries in the arrays below)
Int_t PadNum(const TString &padName) const
A connection properties.
virtual AliMpVPadIterator * CreateIterator() const
AliMpConnection * FindConnectionByGassiNum(Int_t gassiNum) const
An iterator over the pads of a given motif type.
AliMpConnection * FindConnectionByKaptonNum(Int_t kaptonNum) const
Int_t GetLocalIx() const
MpPair_t FindLocalIndicesByPadNum(Int_t padNum) const
Int_t fNofPadsX
number of pads in x direction
virtual ~AliMpMotifType()
AliMpConnection * FindConnectionByLocalIndices(MpPair_t localIndices) const
void Copy(TObject &o) const
Int_t GetBergNum() const
Return Berg connector number.
MpPair_t GetLocalIndices() const
Return encoded local indices.
TString PadName(Int_t padNum) const
MpPair_t FindLocalIndicesByGassiNum(Int_t gassiNum) const
AliMpMotifType & operator=(const AliMpMotifType &rhs)
TObject * Clone(const char *newname="") const
TObjArray fConnectionsByManuChannel
array [manuChannel] -> AliMpConnection*
void SetNofPads(Int_t nofPadsX, Int_t nofPadY)
ClassImp(TPCGenInfo)
Definition: AliTPCCmpNG.C:254
static const Int_t fgkPadNumForA
the pad number for the pad "A"
static Int_t ManuNofChannels()
Max number of channels per manu.
AliMpMotifType()
Not implemented.
AliMpConnection * FindConnectionByBergNum(Int_t bergNum) const
Int_t GetKaptonNum() const
Return kapton connector number.
Int_t GetNofPadsX() const
Return number of pads in x direction.
Int_t fNofPadsY
number of pads in y direction
Bool_t Save() const
void SetOwner(AliMpMotifType *owner)
Set the motif type which contains this connection.
Int_t GetNofPadsY() const
Return number of pads in y direction.
Bool_t HasPadByLocalIndices(MpPair_t localIndices) const
Bool_t HasPadByManuChannel(Int_t manuChannel) const
An interface for an iterator over pads.
MpPair_t FindLocalIndicesByConnection(const AliMpConnection *connection) const
Int_t fMaxNofPads
max number of pads we can hold
Int_t GetPadNum() const
Return pad number.
Int_t GetLocalIy() const
MpPair_t FindLocalIndicesByBergNum(Int_t bergNum) const
virtual void Print(Option_t *option="") const
Int_t MpPair_t
Int_t GetManuChannel() const
Return manu channel number.
Int_t PairFirst(MpPair_t pair)
Decode the first integer from encoded pair.
Bool_t AddConnection(AliMpConnection *connection)
MpPair_t FindLocalIndicesByKaptonNum(Int_t kaptonNum) const
TObjArray fConnectionsByLocalIndices
array [ix + 64*iy ] -> AliMpConnection*
Globally used constants definition.
Int_t PairSecond(MpPair_t pair)
Decode the second integer from encoded pair.
TString fID
unique motif ID
AliMpConnection * FindConnectionByPadNum(Int_t padNum) const
Class that defines the motif properties.
static TString MotifFileName(const TString &motifTypeID)
Definition: AliMpFiles.cxx:411
static TString PadPosFileName(const TString &motifTypeID)
Definition: AliMpFiles.cxx:431