]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONDigitStoreVImplIterator.cxx
bug fixed
[u/mrichter/AliRoot.git] / MUON / AliMUONDigitStoreVImplIterator.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
18 //-----------------------------------------------------------------------------
19 /// \class AliMUONDigitStoreVImplIterator
20 ///
21 /// Implementation of AliMUONVDataIterator for AliMUONDigitStoreVImpl
22 ///
23 /// \author Laurent Aphecetche, Subatech
24 ///
25 //-----------------------------------------------------------------------------
26
27 #include "AliMUONDigitStoreVImplIterator.h"
28
29 #include "AliMUONVDigit.h"
30 #include "AliMUONDigitStoreVImpl.h"
31 #include "AliMUON2DMap.h"
32 #include "AliMUONVCalibParam.h"
33 #include <TClonesArray.h>
34 #include <TError.h>
35
36 /// \cond CLASSIMP
37 ClassImp(AliMUONDigitStoreVImplIterator)
38 /// \endcond
39
40 //_____________________________________________________________________________
41 AliMUONDigitStoreVImplIterator::AliMUONDigitStoreVImplIterator(const AliMUONDigitStoreVImpl* store)
42 : TIterator(),
43 fStore(store),
44 fFirstDetElemId(100),
45 fLastDetElemId(1417),
46 fCathode(2),
47 fStoreIterator(store->fMap->CreateIterator()),
48 fCurrentCalibParam(0x0),
49 fCurrentCalibParamIndex(-1)
50 {
51   /// ctor for full iteration
52 }
53
54 //_____________________________________________________________________________
55 AliMUONDigitStoreVImplIterator::AliMUONDigitStoreVImplIterator(const AliMUONDigitStoreVImpl* store,
56                                                                Int_t firstDE,
57                                                                Int_t lastDE,
58                                                                Int_t cathode)
59 : TIterator(),
60 fStore(store),
61 fFirstDetElemId(firstDE),
62 fLastDetElemId(lastDE),
63 fCathode(cathode),
64 fStoreIterator(store->fMap->CreateIterator(firstDE,lastDE)),
65 fCurrentCalibParam(0x0),
66 fCurrentCalibParamIndex(-1)
67 {
68   /// ctor for partial iteration
69 }
70
71 //_____________________________________________________________________________
72 AliMUONDigitStoreVImplIterator&
73 AliMUONDigitStoreVImplIterator::operator=(const TIterator&)
74 {
75   // overriden assignment operator (imposed by Root's declaration of Titerator ?)
76   Fatal("TIterator::operator=","Not implementeable"); // because there's no clone in TIterator :-(
77   return *this;
78 }
79
80 //_____________________________________________________________________________
81 AliMUONDigitStoreVImplIterator::~AliMUONDigitStoreVImplIterator()
82 {
83   /// dtor
84   delete fStoreIterator;
85 }
86
87 //_____________________________________________________________________________
88 TObject*
89 AliMUONDigitStoreVImplIterator::Next()
90 {
91   /// Return next digit in store
92   if ( !fCurrentCalibParam ) 
93   {
94     fCurrentCalibParam = static_cast<AliMUONVCalibParam*>(fStoreIterator->Next());
95     fCurrentCalibParamIndex = 0;
96     if ( !fCurrentCalibParam ) return 0x0;
97   }
98   
99   Int_t ix(-1);
100   AliMUONVDigit* d(0x0);
101   
102   if ( fCathode == 2 ) 
103   {
104     while ( fCurrentCalibParamIndex < 64 && ix < 0 )
105     {
106       ix = fCurrentCalibParam->ValueAsInt(fCurrentCalibParamIndex++);
107     };
108     
109     if (ix>=0)
110     {
111       d = static_cast<AliMUONVDigit*>(fStore->fDigits->UncheckedAt(ix));
112     }  
113   }
114   else
115   {
116     while ( d == 0x0 ) 
117     {
118       while ( fCurrentCalibParamIndex < 64 && ix < 0 )
119       {
120         ix = fCurrentCalibParam->ValueAsInt(fCurrentCalibParamIndex++);
121       };
122     
123       if (ix>=0)
124       {
125         d = static_cast<AliMUONVDigit*>(fStore->fDigits->UncheckedAt(ix));
126         
127         if (  fCathode == 2 || d->Cathode() == fCathode ) 
128         {
129           break;
130         }
131         d = 0x0;
132         ix = -1;
133       }
134       else
135       {
136         break;
137       }
138     }
139   }
140   
141   if (ix<0) 
142   {
143     fCurrentCalibParam = 0x0;
144     return Next();
145   }
146   
147   return d;
148 }
149
150 //_____________________________________________________________________________
151 void
152 AliMUONDigitStoreVImplIterator::Reset()
153 {
154   /// Reset the iterator
155   fCurrentCalibParam = 0x0;
156   fCurrentCalibParamIndex = 0;  
157   fStoreIterator->Reset();
158 }