]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/mapping/AliMpMotifMap.cxx
AliMpReader splitted into AliMpMotifReader and AliMpSectorReader
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpMotifMap.cxx
CommitLineData
5f91c9e8 1// $Id$
2// Category: motif
3//
4// Class AliMpMotifMap
5// -------------------
6// Class describing the motif map container, where motifs are
7// mapped to their string IDs.
dbe945cc 8// Included in AliRoot: 2003/05/02
5f91c9e8 9// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
10
11#include <Riostream.h>
7a854749 12#include <TVector2.h>
5f91c9e8 13
14#include "AliMpMotifMap.h"
15#include "AliMpVMotif.h"
16#include "AliMpMotif.h"
17#include "AliMpMotifSpecial.h"
18#include "AliMpMotifType.h"
19#include "AliMpMotifPosition.h"
20
21ClassImp(AliMpMotifMap)
22
f79c58a5 23#ifdef WITH_ROOT
24const Int_t AliMpMotifMap::fgkSeparator = 100;
25#endif
26
5f91c9e8 27//_____________________________________________________________________________
28AliMpMotifMap::AliMpMotifMap()
29 : TObject()
30{
31//
32}
33
34//_____________________________________________________________________________
35AliMpMotifMap::~AliMpMotifMap() {
36//
37
38 // Delete all registered motifs, motif types, motif positions
39
f79c58a5 40#ifdef WITH_STL
5f91c9e8 41 for (MotifMapIterator im=fMotifs.begin(); im != fMotifs.end(); im++) {
42 delete im->second;
43 }
f79c58a5 44
5f91c9e8 45 for (MotifTypeMapIterator it=fMotifTypes.begin();
46 it != fMotifTypes.end(); it++) {
47 delete it->second;
48 }
f79c58a5 49
5f91c9e8 50 for (MotifPositionMapIterator ip=fMotifPositions.begin();
51 ip != fMotifPositions.end(); ip++) {
52 delete ip->second;
53 }
f79c58a5 54#endif
55
56#ifdef WITH_ROOT
57 MotifMapIterator im(&fMotifs);
58 Long_t mkey, mvalue;
59 while ( im.Next(mkey, mvalue) ) delete (AliMpMotif*)mvalue;
60
61 MotifMapIterator it(&fMotifTypes);
62 Long_t tkey, tvalue;
63 while ( it.Next(tkey, tvalue) ) delete (AliMpMotifType*)tvalue;
64
65 MotifMapIterator ip(&fMotifPositions);
66 Long_t pkey, pvalue;
67 while ( it.Next(pkey, pvalue) ) delete (AliMpMotifPosition*)pvalue;
68#endif
5f91c9e8 69}
70
71//
72// private methods
73//
74
f79c58a5 75#ifdef WITH_ROOT
76//_____________________________________________________________________________
77Int_t AliMpMotifMap::GetIndex(const TString& s) const
78{
79// Converts the TString to integer.
80// ---
81
82 if (s.Length() > 5) {
83 Fatal("GetIndex", "String too long.");
84 return 0;
85 }
86
87 Int_t index = 0;
88 for (Int_t i=s.Length(); i>=0; --i) index = index*100 + int(s(i));
89 return index;
90}
91
92//______________________________________________________________________________
93Int_t AliMpMotifMap::GetIndex(const AliMpIntPair& pair) const
94{
95// Converts the pair of integers to integer.
96// ---
97
98 if (pair.GetFirst() >= fgkSeparator || pair.GetSecond() >= fgkSeparator)
99 Fatal("GetIndex", "Index out of limit.");
100
101 return pair.GetFirst()*fgkSeparator + pair.GetSecond() + 1;
102}
103
104//_____________________________________________________________________________
105TString AliMpMotifMap::GetString(Int_t index) const
106{
107// Converts the integer index to the string.
108// ---
109
110 TString s;
111 while (index >0) {
112 Char_t c = index%100;
113 s += c;
114 index = index/100;
115 }
116 return s;
117}
118
119//______________________________________________________________________________
120AliMpIntPair AliMpMotifMap::GetPair(Int_t index) const
121{
122// Converts the integer index to the pair of integers.
123// ---
124
125 return AliMpIntPair((index-1)/fgkSeparator, (index-1)%fgkSeparator);
126}
127#endif
128
129//_____________________________________________________________________________
130void AliMpMotifMap::PrintMotif(const AliMpVMotif* motif) const
131{
132// Prints the motif.
133// ---
134
135 cout << motif->GetID().Data() << " "
136 << motif->GetMotifType()->GetID() << " "
137 << motif->Dimensions().X() << " "
138 << motif->Dimensions().Y();
139}
140
141//_____________________________________________________________________________
142void AliMpMotifMap::PrintMotifType(const AliMpMotifType* motifType) const
143{
144// Prints the motif type.
145// ---
146
147 cout << motifType->GetID().Data() << " "
148 << motifType->GetNofPadsX() << " "
149 << motifType->GetNofPadsY() << " ";
150}
151
152//_____________________________________________________________________________
153void AliMpMotifMap::PrintMotifPosition(
154 const AliMpMotifPosition* motifPosition) const
155{
156// Prints the motif position.
157// ---
158
159 cout << motifPosition->GetID() << " "
160 << motifPosition->GetMotif()->GetID() << " "
161 << motifPosition->Position().X() << " "
162 << motifPosition->Position().Y() << " ";
163}
164
165//_____________________________________________________________________________
166void AliMpMotifMap::PrintMotifPosition2(
167 const AliMpMotifPosition* motifPosition) const
168{
169// Prints the motif position.
170// ---
171
172 cout << setw(3) << motifPosition->GetLowIndicesLimit().GetFirst() << " "
173 << setw(3) << motifPosition->GetLowIndicesLimit().GetSecond() << " "
174 << setw(3) << motifPosition->GetHighIndicesLimit().GetFirst() << " "
175 << setw(3) << motifPosition->GetHighIndicesLimit().GetSecond() << " "
176 << motifPosition->GetID() << " ";
177}
178
5f91c9e8 179//_____________________________________________________________________________
180void AliMpMotifMap::PrintMotifs() const
181{
182// Prints all the motifs and their motif types
183// for all motifs in the motifs map.
184// ---
185
f79c58a5 186#ifdef WITH_STL
5f91c9e8 187 if (fMotifs.size()) {
188 cout << "Dump of Motif Map - " << fMotifs.size() << " entries:" << endl;
189 Int_t counter = 0;
190 for (MotifMapIterator i=fMotifs.begin(); i != fMotifs.end(); i++) {
191 const TString& id = (*i).first;
5f91c9e8 192 cout << "Map element "
193 << setw(3) << counter++ << " "
f79c58a5 194 << id.Data() << " " ;
195 PrintMotif((*i).second);
196 cout << endl;
5f91c9e8 197 }
198 cout << endl;
199 }
f79c58a5 200#endif
201
202#ifdef WITH_ROOT
203 if (fMotifs.GetSize()) {
204 cout << "Dump of Motif Map - " << fMotifs.GetSize() << " entries:" << endl;
205 Int_t counter = 0;
206 MotifMapIterator i(&fMotifs);
207 Long_t key, value;
208 while ( i.Next(key, value) ) {
209 TString id = GetString(key);
210 AliMpVMotif* motif = (AliMpVMotif*)value;
211 cout << "Map element "
212 << setw(3) << counter++ << " "
213 << id.Data() << " " ;
214 PrintMotif(motif);
215 cout << endl;
216 }
217 cout << endl;
218 }
219#endif
5f91c9e8 220}
221
222//_____________________________________________________________________________
223void AliMpMotifMap::PrintMotifTypes() const
224{
225// Prints all the the motifs types and their motif dimensions
226// for all motif types in the motif types map.
227// ---
228
f79c58a5 229#ifdef WITH_STL
5f91c9e8 230 if (fMotifTypes.size()) {
231 cout << "Dump of Motif Type Map - " << fMotifTypes.size() << " entries:" << endl;
232 Int_t counter = 0;
233 for (MotifTypeMapIterator i=fMotifTypes.begin(); i != fMotifTypes.end(); i++) {
234 const TString& id = (*i).first;
5f91c9e8 235 cout << "Map element "
236 << setw(3) << counter++ << " "
f79c58a5 237 << id.Data() << " ";
238 PrintMotifType((*i).second);
239 cout << endl;
240 }
241 cout << endl;
242 }
243#endif
244
245#ifdef WITH_ROOT
246 if (fMotifTypes.GetSize()) {
247 cout << "Dump of Motif Type Map - " << fMotifTypes.GetSize() << " entries:" << endl;
248 Int_t counter = 0;
249 MotifTypeMapIterator i(&fMotifTypes);
250 Long_t key, value;
251 while ( i.Next(key, value) ) {
252 TString id = GetString(key);
253 AliMpMotifType* motifType = (AliMpMotifType*)value;
254 cout << "Map element "
255 << setw(3) << counter++ << " "
256 << id.Data() << " " ;
257 PrintMotifType(motifType);
258 cout << endl;
5f91c9e8 259 }
260 cout << endl;
261 }
f79c58a5 262#endif
5f91c9e8 263}
264
265//_____________________________________________________________________________
266void AliMpMotifMap::PrintMotifPositions() const
267{
268// Prints all the the motifs positions.
269// ---
270
f79c58a5 271#ifdef WITH_STL
5f91c9e8 272 if (fMotifPositions.size()) {
273 cout << "Dump of Motif Position Map - " << fMotifPositions.size() << " entries:" << endl;
274 Int_t counter = 0;
275 for (MotifPositionMapIterator i=fMotifPositions.begin();
276 i != fMotifPositions.end(); i++) {
277
5f91c9e8 278 cout << "Map element "
f79c58a5 279 << setw(3) << counter++ << " ";
280 PrintMotifPosition((*i).second);
281 cout << endl;
5f91c9e8 282 }
283 cout << endl;
284 }
f79c58a5 285#endif
286
287#ifdef WITH_ROOT
288 if (fMotifPositions.GetSize()) {
289 cout << "Dump of Motif Type Map - " << fMotifPositions.GetSize() << " entries:" << endl;
290 Int_t counter = 0;
291 MotifPositionMapIterator i(&fMotifPositions);
292 Long_t key, value;
293 while ( i.Next(key, value) ) {
294 AliMpMotifPosition* motifPosition = (AliMpMotifPosition*)value;
295 cout << "Map element "
296 << setw(3) << counter++ << " ";
297 PrintMotifPosition(motifPosition);
298 cout << endl;
299 }
300 cout << endl;
301 }
302#endif
5f91c9e8 303}
304
305//_____________________________________________________________________________
306void AliMpMotifMap::PrintMotifPositions2() const
307{
308// Prints all the the motifs positions from the second map
309// (by global indices)
310// ---
311
f79c58a5 312#ifdef WITH_STL
5f91c9e8 313 if (fMotifPositions2.size()) {
314 cout << "Dump of Motif Position Map 2 - " << fMotifPositions2.size() << " entries:" << endl;
315 Int_t counter = 0;
316 for (MotifPositionMap2Iterator i=fMotifPositions2.begin();
317 i != fMotifPositions2.end(); i++) {
318
5f91c9e8 319 cout << "Map element "
f79c58a5 320 << setw(3) << counter++ << " ";
321 PrintMotifPosition2((*i).second);
322 cout << endl;
323 }
324 cout << endl;
325 }
326#endif
327
328#ifdef WITH_ROOT
329 if (fMotifPositions2.GetSize()) {
330 cout << "Dump of Motif Position Map 2 - " << fMotifPositions2.GetSize() << " entries:" << endl;
331 Int_t counter = 0;
332 MotifPositionMapIterator i(&fMotifPositions2);
333 Long_t key, value;
334 while ( i.Next(key, value) ) {
335 AliMpMotifPosition* motifPosition = (AliMpMotifPosition*)value;
336 cout << "Map element "
337 << setw(3) << counter++ << " ";
338 PrintMotifPosition2(motifPosition);
339 cout << endl;
5f91c9e8 340 }
341 cout << endl;
342 }
f79c58a5 343#endif
5f91c9e8 344}
345
346//
347// public methods
348//
349
350//_____________________________________________________________________________
351Bool_t AliMpMotifMap::AddMotif(AliMpVMotif* motif, Bool_t warn)
352{
353// Adds the specified motif
354// if the motif with this ID is not yet present.
355// ---
356
357 AliMpVMotif* found = FindMotif(motif->GetID());
358 if (found) {
359 if (warn && found == motif)
360 Warning("AddMotif", "The motif is already in map.");
361 if (warn && found != motif)
362 Warning("AddMotif", "Another motif with the same ID is already in map.");
363 return false;
364 }
365
f79c58a5 366#ifdef WITH_STL
5f91c9e8 367 fMotifs[motif->GetID()] = motif;
f79c58a5 368#endif
369
370#ifdef WITH_ROOT
371 fMotifs.Add(GetIndex(motif->GetID()), (Long_t)motif);
372#endif
373
5f91c9e8 374 return true;
375}
376
377//_____________________________________________________________________________
378Bool_t AliMpMotifMap::AddMotifType(AliMpMotifType* motifType, Bool_t warn)
379{
380// Adds the specified motif type
381// if the motif with this ID is not yet present.
382// ---
383
384 AliMpMotifType* found = FindMotifType(motifType->GetID());
385 if (found) {
386 if (warn && found == motifType)
387 Warning("AddMotifType", "The motif type is already in map.");
388 if (warn && found != motifType)
389 Warning("AddMotifType",
390 "Another motif type with the same ID is already in map.");
391 return false;
392 }
393
f79c58a5 394#ifdef WITH_STL
5f91c9e8 395 fMotifTypes[motifType->GetID()] = motifType;
f79c58a5 396#endif
397
398#ifdef WITH_ROOT
399 fMotifTypes.Add(GetIndex(motifType->GetID()), (Long_t)motifType);
400#endif
401
5f91c9e8 402 return true;
403}
404
405//_____________________________________________________________________________
406Bool_t AliMpMotifMap::AddMotifPosition(AliMpMotifPosition* motifPosition, Bool_t warn)
407{
408// Adds the specified motif position
409// if this position is not yet present.
410// ---
411
412 AliMpMotifPosition* found = FindMotifPosition(motifPosition->GetID());
7a854749 413 if (found) {
414 if (warn && found == motifPosition) {
415 cerr << "ID: " << motifPosition->GetID()
416 << " found: " << found
417 << " new: " << motifPosition << endl;
5f91c9e8 418 Warning("AddMotifPosition", "This motif position is already in map.");
7a854749 419 }
420 if (warn && found != motifPosition) {
421 cerr << "ID: " << motifPosition->GetID()
422 << " found: " << found
423 << " new: " << motifPosition << endl;
5f91c9e8 424 Warning("AddMotifposition",
7a854749 425 "Another motif position with the same ID is already in map.");
426 }
5f91c9e8 427 return false;
428 }
429
f79c58a5 430#ifdef WITH_STL
5f91c9e8 431 fMotifPositions[motifPosition->GetID()] = motifPosition;
f79c58a5 432#endif
433
434#ifdef WITH_ROOT
435 fMotifPositions.Add(motifPosition->GetID(), (Long_t)motifPosition);
436#endif
437
5f91c9e8 438 return true;
439}
440
441//_____________________________________________________________________________
442void AliMpMotifMap::FillMotifPositionMap2()
443{
444// Fills the second map (by global indices) of motif positions.
445// ---
446
f79c58a5 447#ifdef WITH_STL
5f91c9e8 448 if (fMotifPositions2.size() > 0 ) {
449 Warning("FillMotifPositionMap2", "Map has been already filled.");
450 return;
451 }
452
453 for (MotifPositionMapIterator ip=fMotifPositions.begin();
454 ip != fMotifPositions.end(); ip++) {
455
456 fMotifPositions2[(*ip).second->GetLowIndicesLimit()] = (*ip).second;
457 }
f79c58a5 458#endif
459
460#ifdef WITH_ROOT
461 if (fMotifPositions2.GetSize() > 0 ) {
462 Warning("FillMotifPositionMap2", "Map has been already filled.");
463 return;
464 }
465
466 MotifPositionMapIterator i(&fMotifPositions);
467 Long_t key, value;
468 while ( i.Next(key, value) ) {
469 AliMpMotifPosition* motifPosition = (AliMpMotifPosition*)value;
470 fMotifPositions2.Add(GetIndex(motifPosition->GetLowIndicesLimit()),
471 (Long_t)motifPosition);
472 }
473#endif
5f91c9e8 474
475}
476
477//_____________________________________________________________________________
7a854749 478void AliMpMotifMap::Print(const char* /*option*/) const
5f91c9e8 479{
480// Prints the motifs and motif types maps.
481// ---
482
483 PrintMotifs();
484 PrintMotifTypes();
485 PrintMotifPositions();
486 PrintMotifPositions2();
487}
488
489//_____________________________________________________________________________
490void AliMpMotifMap::PrintGlobalIndices(const char* fileName) const
491{
492// Prints all the motifs positions and their global indices.
493// ---
494
495 ofstream out(fileName, ios::out);
496
f79c58a5 497#ifdef WITH_STL
5f91c9e8 498 if (fMotifPositions.size()) {
499 for (MotifPositionMapIterator i=fMotifPositions.begin();
500 i != fMotifPositions.end(); i++) {
501
502 AliMpMotifPosition* motifPosition = (*i).second;
503 out << setw(5) << motifPosition->GetID() << " "
504 << setw(3) << motifPosition->GetLowIndicesLimit().GetFirst() << " "
505 << setw(3) << motifPosition->GetLowIndicesLimit().GetSecond()
506 << endl;
507 }
508 out << endl;
509 }
f79c58a5 510#endif
511
512#ifdef WITH_ROOT
513 if (fMotifPositions.GetSize()) {
514 MotifPositionMapIterator i(&fMotifPositions);
515 Long_t key, value;
516 while ( i.Next(key, value) ) {
517 AliMpMotifPosition* motifPosition = (AliMpMotifPosition*)value;
518 out << setw(5) << motifPosition->GetID() << " "
519 << setw(3) << motifPosition->GetLowIndicesLimit().GetFirst() << " "
520 << setw(3) << motifPosition->GetLowIndicesLimit().GetSecond()
521 << endl;
522 }
523 out << endl;
524 }
525#endif
5f91c9e8 526}
527
528//_____________________________________________________________________________
529void AliMpMotifMap::UpdateGlobalIndices(const char* fileName)
530{
531// Updates the motifs positions global indices
532// from the file.
533// ---
534
535 ifstream in(fileName, ios::in);
536
537 Int_t motifPositionId, offx, offy;
538
539 do {
540 in >> motifPositionId >> offx >> offy;
541
542 if (in.eof()) {
543 FillMotifPositionMap2();
544 return;
545 }
546
547 AliMpMotifPosition* motifPosition = FindMotifPosition(motifPositionId);
548
549 if (motifPosition) {
550 cout << "Processing "
551 << motifPosition->GetID() << " " << offx << " " << offy << endl;
552
553 motifPosition->SetLowIndicesLimit(AliMpIntPair(offx, offy));
554
555 Int_t offx2
556 = offx + motifPosition->GetMotif()->GetMotifType()->GetNofPadsX() - 1;
557
558 Int_t offy2
559 = offy + motifPosition->GetMotif()->GetMotifType()->GetNofPadsY() - 1;
560
561 motifPosition->SetHighIndicesLimit(AliMpIntPair(offx2, offy2));
562 }
563 else {
564 cerr <<"Motif position " << motifPositionId << endl;
565 Warning("UpdateGlobalIndices", "Motif position not found !!!");
566 }
567 }
568 while (!in.eof());
569}
570
571
572//_____________________________________________________________________________
573AliMpVMotif* AliMpMotifMap::FindMotif(const TString& motifID) const
574{
575// Finds the motif with the specified ID.
576// ---
577
f79c58a5 578#ifdef WITH_STL
5f91c9e8 579 MotifMapIterator i = fMotifs.find(motifID);
5f91c9e8 580 if (i != fMotifs.end())
581 return (*i).second;
582 else
583 return 0;
f79c58a5 584#endif
585
586#ifdef WITH_ROOT
587 Long_t value = fMotifs.GetValue(GetIndex(motifID));
588 if (value)
589 return (AliMpVMotif*)value;
590 else
591 return 0;
592#endif
5f91c9e8 593}
594
595//_____________________________________________________________________________
596AliMpVMotif* AliMpMotifMap::FindMotif(const TString& motifID,
7a854749 597 const TString& motifTypeID,
598 const TVector2& padDimensions ) const
5f91c9e8 599{
600// Finds the motif with the specified ID and returns it
601// only if its motif type and motif dimensions agree
602// with the given motifTypeID and motifDimensions.
603// Disagreement causes fatal error.
604// ---
605
606 AliMpVMotif* motif = FindMotif(motifID);
607
608 if (motif && motif->GetMotifType()->GetID() != motifTypeID) {
609 Fatal("FindMotif",
610 "Motif has been already defined with a different type.");
611 return 0;
612 }
613
614 // check pad dimension in case of a normal motif
615 if (motif &&
616 dynamic_cast<AliMpMotif*>(motif) &&
617 ( motif->GetPadDimensions(0).X() != padDimensions.X() ||
618 motif->GetPadDimensions(0).Y() != padDimensions.Y())) {
619
620 Fatal("FindMotifType",
621 "Motif type has been already defined with different dimensions.");
622 return 0;
623
624 }
625
626 // check case of a special motif
627 if (motif &&
628 (padDimensions.X() == 0. && padDimensions.Y() == 0.) &&
629 !dynamic_cast<AliMpMotifSpecial*>(motif)) {
630
631 Fatal("FindMotifType",
632 "Motif type has been already defined with different dimensions.");
633 return 0;
634
635 }
636
637 return motif;
638}
639
640//_____________________________________________________________________________
641AliMpMotifType* AliMpMotifMap::FindMotifType(const TString& motifTypeID) const
642{
643// Finds the motif type with the specified motif type ID.
644// ---
645
f79c58a5 646#ifdef WITH_STL
5f91c9e8 647 MotifTypeMapIterator i = fMotifTypes.find(motifTypeID);
5f91c9e8 648 if (i != fMotifTypes.end())
649 return (*i).second;
650 else
651 return 0;
f79c58a5 652#endif
653
654#ifdef WITH_ROOT
655 Long_t value = fMotifTypes.GetValue(GetIndex(motifTypeID));
656 if (value)
657 return (AliMpMotifType*)value;
658 else
659 return 0;
660#endif
5f91c9e8 661}
662
663//_____________________________________________________________________________
7a854749 664AliMpMotifPosition*
665AliMpMotifMap::FindMotifPosition(Int_t motifPositionID) const
5f91c9e8 666{
667// Finds the motif position with the specified motif position ID.
668// ---
669
f79c58a5 670#ifdef WITH_STL
5f91c9e8 671 MotifPositionMapIterator i = fMotifPositions.find(motifPositionID);
5f91c9e8 672 if (i != fMotifPositions.end())
673 return (*i).second;
674 else
675 return 0;
f79c58a5 676#endif
677
678#ifdef WITH_ROOT
679 Long_t value = fMotifPositions.GetValue(motifPositionID);
680 if (value)
681 return (AliMpMotifPosition*)value;
682 else
683 return 0;
684#endif
5f91c9e8 685}
686
f79c58a5 687/*
5f91c9e8 688//_____________________________________________________________________________
7a854749 689AliMpMotifPosition*
690AliMpMotifMap::FindMotifPosition(const AliMpIntPair& indices) const
5f91c9e8 691{
692// Finds the last motif position which has the global indices (low limit)
693// less then the indices specified.
694// ---
695
f79c58a5 696#ifdef WITH_STL
5f91c9e8 697 MotifPositionMap2Iterator found
698 = fMotifPositions2.lower_bound(indices);
699
700 if (found == fMotifPositions2.end()) found--;
701
702 MotifPositionMap2Iterator i=found;
703 do {
704 AliMpIntPair low = (*i).second->GetLowIndicesLimit();
705 AliMpIntPair up = (*i).second->GetHighIndicesLimit();
706
707 if ( indices.GetFirst() >= low.GetFirst() &&
708 indices.GetSecond() >= low.GetSecond() &&
709 indices.GetFirst() <= up.GetFirst() &&
710 indices.GetSecond() <= up.GetSecond())
711
712 return (*i).second;
713 }
714 while ( i-- != fMotifPositions2.begin());
715
716 return 0;
f79c58a5 717#endif
718
719#ifdef WITH_ROOT
720 // HOW TO DO THIS WITH ROOT ????
721 // Fortunately it seems not to be used anywhere
722 Fatal("FindMotifPosition", "Difficult in Root to do this.");
723 return 0;
724#endif
5f91c9e8 725}
f79c58a5 726*/