1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 // $MpId: AliMpSlatPadIterator.cxx,v 1.6 2006/05/24 13:58:50 ivana Exp $
19 #include "AliMpSlatPadIterator.h"
22 #include "AliMpArea.h"
24 #include "AliMpSlat.h"
25 #include "AliMpPCBPadIterator.h"
28 //-----------------------------------------------------------------------------
29 /// \class AliMpSlatPadIterator
31 /// Implementation of AliMpVPadIterator for slats.
33 /// This class first split the input area (upon which to iterate)
34 /// into a set of areas of constant pad size.
35 /// Then each of those areas is iterated over, using
36 /// AliMpSlatZonePadIterator objects.
38 /// \author L. Aphecetche
39 //-----------------------------------------------------------------------------
42 ClassImp(AliMpSlatPadIterator)
45 //_____________________________________________________________________________
46 AliMpSlatPadIterator::AliMpSlatPadIterator()
47 : AliMpVPadIterator(),
51 fCurrentDelegateIndex(0)
54 /// Empty (default) ctor.
58 //_____________________________________________________________________________
59 AliMpSlatPadIterator::AliMpSlatPadIterator(const AliMpSlat* slat,
60 const AliMpArea& area)
61 : AliMpVPadIterator(),
65 fCurrentDelegateIndex(0)
69 /// The iteration will occur on the given slat over the specified area.
71 AliDebug(1,Form("this=%p ctor area=(%e,%e,%e,%e)",this,
72 area.LeftBorder(),area.DownBorder(),
73 area.RightBorder(),area.UpBorder()));
76 AliError("Iterator invalidated by improper initialization (e.g. incorrect area given ?)");
78 fDelegates.SetOwner(kTRUE);
81 //_____________________________________________________________________________
82 AliMpSlatPadIterator::~AliMpSlatPadIterator()
87 AliDebug(1,Form("this=%p dtor",this));
91 //_____________________________________________________________________________
93 AliMpSlatPadIterator::Intersect(const AliMpArea& a, const AliMpArea& b) const
96 /// Returns the common part of a and b.
98 AliDebug(4,Form("a=(%7.2f,%7.2f;%7.2f,%7.2f) b=(%7.2f,%7.2f;%7.2f,%7.2f)",
99 a.LeftBorder(),a.DownBorder(),a.RightBorder(),a.UpBorder(),
100 b.LeftBorder(),b.DownBorder(),b.RightBorder(),b.UpBorder()));
102 Double_t xmin = TMath::Max(a.LeftBorder(),b.LeftBorder());
103 Double_t xmax = TMath::Min(a.RightBorder(),b.RightBorder());
104 Double_t ymin = TMath::Max(a.DownBorder(),b.DownBorder());
105 Double_t ymax = TMath::Min(a.UpBorder(),b.UpBorder());
106 AliMpArea c( TVector2( (xmin+xmax)/2.0, (ymin+ymax)/2.0 ),
107 TVector2( (xmax-xmin)/2.0, (ymax-ymin)/2.0 ) );
109 AliDebug(4,Form("a intersect b = (%7.2f,%7.2f;%7.2f,%7.2f)",
110 c.LeftBorder(),c.DownBorder(),c.RightBorder(),c.UpBorder()));
114 //_____________________________________________________________________________
116 AliMpSlatPadIterator::Prepare(const AliMpArea& area)
119 /// Split area into smaller area intersecting pcbs,
120 /// and allocate the corresponding delegate iterators.
122 for ( AliMpSlat::Size_t i = 0; i < fkSlat->GetSize(); ++i )
124 const AliMpPCB* pcb = fkSlat->GetPCB(i);
125 AliMpArea pcbArea(pcb->Area());
126 AliMpArea zone = Intersect(pcbArea,area);
127 AliDebug(3,Form("i=%2d zone is %7.2f,%7.2f->%7.2f,%7.2f %d",i,
128 zone.LeftBorder(),zone.DownBorder(),
129 zone.RightBorder(),zone.UpBorder(),
131 if ( zone.IsValid() )
133 fDelegates.AddLast(new AliMpPCBPadIterator(fkSlat,zone));
136 AliDebug(3,Form("Number of delegates = %d",fDelegates.GetEntries()));
137 // StdoutToAliDebug(3,fDelegates.Print(););
138 return fDelegates.GetLast()>=0;
141 //_____________________________________________________________________________
143 AliMpSlatPadIterator::CurrentItem() const
146 /// Returns the current pad of the iteration.
148 if ( fCurrentDelegate )
150 return fCurrentDelegate->CurrentItem();
154 return AliMpPad::Invalid();
158 //_____________________________________________________________________________
160 AliMpSlatPadIterator::First()
163 /// (Re)starts the iteration.
165 if ( fDelegates.GetLast() < 0 )
167 AliError("Iterator is not valid, as it gets no delegates at all !");
171 fCurrentDelegateIndex = 0;
172 fCurrentDelegate = static_cast<AliMpVPadIterator*>(fDelegates.At(0));
173 fCurrentDelegate->First();
177 //_____________________________________________________________________________
179 AliMpSlatPadIterator::Invalidate()
182 /// Make the iterator invalid.
185 fCurrentDelegate = 0;
186 fCurrentDelegateIndex = 0;
189 //_____________________________________________________________________________
191 AliMpSlatPadIterator::IsDone() const
194 /// Returns whether the iteration is ended or not.
196 return ( !fCurrentDelegate ||
197 ( fCurrentDelegateIndex > fDelegates.GetLast() &&
198 fCurrentDelegate->IsDone() ) );
201 //_____________________________________________________________________________
203 AliMpSlatPadIterator::Next()
206 /// Next step of the iteration.
208 if (IsDone()) return;
210 fCurrentDelegate->Next();
212 if ( fCurrentDelegate->IsDone() )
214 AliDebug(3,"Moving to next delegate");
215 ++fCurrentDelegateIndex;
216 if ( fCurrentDelegateIndex <= fDelegates.GetLast() )
218 fCurrentDelegate = static_cast<AliMpVPadIterator*>(fDelegates.At(fCurrentDelegateIndex));
219 fCurrentDelegate->First();