]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - MUON/mapping/AliMpMotifType.cxx
bugfix: correct range of DDL for specified detector
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpMotifType.cxx
... / ...
CommitLineData
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"
30#include "AliMpMotifTypePadIterator.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
43using std::cout;
44using std::endl;
45using std::ofstream;
46using std::setw;
47/// \cond CLASSIMP
48ClassImp(AliMpMotifType)
49/// \endcond
50
51const Int_t AliMpMotifType::fgkPadNumForA = 65;
52
53//______________________________________________________________________________
54AliMpMotifType::AliMpMotifType(const TString &id)
55: TObject(),
56fID(id),
57fNofPadsX(0),
58fNofPadsY(0),
59fNofPads(0),
60fMaxNofPads(AliMpConstants::ManuNofChannels()),
61fConnectionsByLocalIndices(fMaxNofPads*fMaxNofPads),
62fConnectionsByManuChannel(fMaxNofPads)
63{
64 /// Standard constructor \n
65 /// Please note that id should be of the form %s for station 1,2,
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//______________________________________________________________________________
74AliMpMotifType::AliMpMotifType(TRootIOCtor*)
75: TObject(),
76fID(""),
77fNofPadsX(0),
78fNofPadsY(0),
79fNofPads(0),
80fMaxNofPads(0),
81fConnectionsByLocalIndices(),
82fConnectionsByManuChannel()
83{
84 /// Default constructor
85 AliDebug(1,Form("this=%p",this));
86}
87
88//______________________________________________________________________________
89AliMpMotifType::AliMpMotifType(const AliMpMotifType& rhs)
90: TObject(),
91fID(""),
92fNofPadsX(0),
93fNofPadsY(0),
94fNofPads(0),
95fMaxNofPads(0),
96fConnectionsByLocalIndices(),
97fConnectionsByManuChannel()
98{
99 /// Copy constructor
100 AliDebug(1,Form("this=%p (copy ctor)",this));
101 rhs.Copy(*this);
102}
103
104//______________________________________________________________________________
105AliMpMotifType&
106AliMpMotifType::operator=(const AliMpMotifType& rhs)
107{
108 /// Assignment operator
109
110 TObject::operator=(rhs);
111 rhs.Copy(*this);
112 return *this;
113}
114
115//______________________________________________________________________________
116TObject*
117AliMpMotifType::Clone(const char* /*newname*/) const
118{
119 /// Returns a full copy of this object
120 return new AliMpMotifType(*this);
121}
122
123//______________________________________________________________________________
124void
125AliMpMotifType::Copy(TObject& object) const
126{
127 /// Copy object
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;
135 mt.fMaxNofPads = fMaxNofPads;
136 mt.fConnectionsByLocalIndices = fConnectionsByLocalIndices;
137 mt.fConnectionsByManuChannel = fConnectionsByManuChannel;
138}
139
140//______________________________________________________________________________
141AliMpMotifType::~AliMpMotifType()
142{
143 /// Destructor
144
145 AliDebug(1,Form("this=%p",this));
146}
147
148//______________________________________________________________________________
149AliMpVPadIterator* AliMpMotifType::CreateIterator() const
150{
151/// Create new motif type iterator
152
153 return new AliMpMotifTypePadIterator(this);
154}
155
156//______________________________________________________________________________
157void AliMpMotifType::SetNofPads(Int_t nofPadsX, Int_t nofPadsY)
158{
159 /// Change the number of pads in this motif
160
161 fNofPadsX = nofPadsX;
162 fNofPadsY = nofPadsY;
163}
164
165
166//______________________________________________________________________________
167Int_t AliMpMotifType::PadNum(const TString &padName) const
168{
169 /// Transform a pad name into the equivalent pad number
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//______________________________________________________________________________
178TString AliMpMotifType::PadName(Int_t padNum) const
179{
180 /// Transform a pad number into its equivalent pad name
181
182 if (padNum<fgkPadNumForA)
183 return Form("%d",padNum);
184 else
185 return char('A'+padNum-fgkPadNumForA);
186}
187
188//______________________________________________________________________________
189Bool_t
190AliMpMotifType::AddConnection(AliMpConnection* connection)
191{
192 /// Add the connection to the map
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
208 AliMpConnection* c = FindConnectionByLocalIndices(
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//______________________________________________________________________________
231AliMpConnection*
232AliMpMotifType::FindConnectionByPadNum(Int_t padNum) const
233{
234 /// Retrieve the AliMpConnection pointer from its pad num
235 /// This method is quite inefficient as we're looping over all connections
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//______________________________________________________________________________
248AliMpConnection*
249AliMpMotifType::FindConnectionByLocalIndices(MpPair_t localIndices) const
250{
251 /// Retrieve the AliMpConnection pointer from its position (in pad unit)
252
253 return FindConnectionByLocalIndices(AliMp::PairFirst(localIndices),
254 AliMp::PairSecond(localIndices));
255}
256
257//______________________________________________________________________________
258AliMpConnection*
259AliMpMotifType::FindConnectionByLocalIndices(Int_t ix, Int_t iy) const
260{
261 /// Retrieve the AliMpConnection pointer from its position (in pad unit)
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//______________________________________________________________________________
276AliMpConnection*
277AliMpMotifType::FindConnectionByGassiNum(Int_t gassiNum) const
278{
279 /// Return the connection for the given gassiplex number
280
281 if ( gassiNum >=0 && gassiNum < fMaxNofPads )
282 {
283 return static_cast<AliMpConnection*>(fConnectionsByManuChannel.UncheckedAt(gassiNum));
284 }
285
286 return 0x0;
287}
288
289//______________________________________________________________________________
290AliMpConnection*
291AliMpMotifType::FindConnectionByKaptonNum(Int_t kaptonNum) const
292{
293 /// Give the connection related to the given kapton number
294 /// Inefficient method as we loop over connections to find the right one
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//______________________________________________________________________________
307AliMpConnection*
308AliMpMotifType::FindConnectionByBergNum(Int_t bergNum) const
309{
310 /// Retrieve the connection from a Berg connector number
311 /// Inefficient method as we loop over connections to find the right one
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//______________________________________________________________________________
325MpPair_t AliMpMotifType::FindLocalIndicesByConnection(const AliMpConnection* connection) const
326{
327 /// Reurn the pad position from the connection pointer.
328
329 return connection->GetLocalIndices();
330}
331
332//______________________________________________________________________________
333MpPair_t AliMpMotifType::FindLocalIndicesByPadNum(Int_t padNum) const
334{
335 /// Retrieve the AliMpConnection pointer from its pad num
336
337 AliMpConnection* connection = FindConnectionByPadNum(padNum);
338
339 if ( ! connection) return -1;
340
341 return connection->GetLocalIndices();
342}
343
344//______________________________________________________________________________
345MpPair_t AliMpMotifType::FindLocalIndicesByGassiNum(Int_t gassiNum) const
346{
347 /// Return the connection for the given gassiplex number
348
349 AliMpConnection* connection = FindConnectionByGassiNum(gassiNum);
350
351 if ( ! connection) return -1;
352
353 return connection->GetLocalIndices();
354}
355
356//______________________________________________________________________________
357MpPair_t AliMpMotifType::FindLocalIndicesByKaptonNum(Int_t kaptonNum) const
358{
359 /// Give the connection related to the given kapton number
360
361 AliMpConnection* connection = FindConnectionByKaptonNum(kaptonNum);
362
363 if ( ! connection) return -1;
364
365 return connection->GetLocalIndices();
366}
367
368//______________________________________________________________________________
369MpPair_t AliMpMotifType::FindLocalIndicesByBergNum(Int_t bergNum) const
370{
371 /// Retrieve the connection from a Berg connector number
372
373 AliMpConnection* connection = FindConnectionByBergNum(bergNum);
374
375 if ( ! connection) return -1;
376
377 return connection->GetLocalIndices();
378}
379
380//______________________________________________________________________________
381Bool_t
382AliMpMotifType::HasPadByLocalIndices(MpPair_t localIndices) const
383{
384 /// Return true if the pad indexed by \a localIndices has a connection
385
386 return ( FindConnectionByLocalIndices(localIndices) != 0x0 );
387}
388
389//______________________________________________________________________________
390Bool_t
391AliMpMotifType::HasPadByLocalIndices(Int_t localIx, Int_t localIy) const
392{
393 /// Return true if the pad indexed by \a localIndices has a connection
394
395 return ( FindConnectionByLocalIndices(localIx, localIy) != 0x0 );
396}
397
398//______________________________________________________________________________
399Bool_t
400AliMpMotifType::HasPadByManuChannel(Int_t manuChannel) const
401{
402 /// Return true if the pad indexed by \a localIndices has a connection
403
404// if ( manuChannel >= fNofPads ) return kFALSE;
405
406 return ( FindConnectionByGassiNum(manuChannel) != 0x0 );
407}
408
409//______________________________________________________________________________
410void AliMpMotifType::Print(Option_t *option) const
411{
412 /// Print the map of the motif. In each cell, the value
413 /// printed depends of option, as the following:
414 /// - option="N" the "name" of the pad is written
415 /// - option="K" the Kapton connect. number attached to the pad is written
416 /// - option="B" the Berg connect. number attached to the pad is written
417 /// - option="G" the Gassiplex channel number attached to the pad is written
418 /// otherwise the number of the pad is written
419 ///
420 /// NOTE : this method is really not optimized, in case 'N' or '',
421 /// but the Print() this should not be very important in a Print() method
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++){
439 AliMpConnection *connexion = FindConnectionByLocalIndices(i,j);
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//_____________________________________________________________________________
464Bool_t
465AliMpMotifType::Save() const
466{
467/// Save this motif type
468
469 return Save(fID.Data());
470}
471
472//_____________________________________________________________________________
473Bool_t
474AliMpMotifType::Save(const char* motifName) const
475{
476 /// Generate the 2 files needed to describe the motif
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 {
511 AliMpConnection* con = FindConnectionByLocalIndices(ix,iy);
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