Fixing bug in setting scaler events for trigger
[u/mrichter/AliRoot.git] / MUON / AliMUONRawStreamTracker.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
17 ///////////////////////////////////////////////////////////////////////////////
18 ///
19 /// This class provides access to MUON digits in raw data.
20 ///
21 /// It loops over all MUON digits in the raw data given by the AliRawReader.
22 /// The Next method goes to the next digit. If there are no digits left
23 /// it returns kFALSE (under develpment)
24 /// It can loop also over DDL and store the decoded rawdata in TClonesArray
25 /// in Payload class.
26 /// 
27 /// First version implement for Tracker
28 ///
29 ///////////////////////////////////////////////////////////////////////////////
30
31 #include "AliMUONRawStreamTracker.h"
32
33 #include "AliRawReader.h"
34 #include "AliRawDataHeader.h"
35 #include "AliLog.h"
36
37 #include "AliMpBusPatch.h"
38
39 ClassImp(AliMUONRawStreamTracker)
40
41 AliMUONRawStreamTracker::AliMUONRawStreamTracker()
42   : TObject(),
43     fRawReader(0x0),
44     fDDL(0),
45     fBusPatchId(0),
46     fDspId(0),
47     fBlkId(0),
48     fNextDDL(kTRUE),
49     fMaxDDL(20)
50 {
51   //
52   // create an object to read MUON raw digits
53   // Default ctor for monitoring purposes
54   //
55
56   fPayload = new AliMUONPayloadTracker();
57
58 }
59
60 //_________________________________________________________________
61 AliMUONRawStreamTracker::AliMUONRawStreamTracker(AliRawReader* rawReader)
62   : TObject(),
63     fDDL(0),
64     fBusPatchId(0),
65     fDspId(0),
66     fBlkId(0),
67     fNextDDL(kTRUE),
68     fMaxDDL(20)
69 {
70   //
71   // ctor with AliRawReader as argument
72   // for reconstruction purpose
73   //
74
75   fRawReader = rawReader;
76   fPayload   = new AliMUONPayloadTracker();
77
78 }
79
80 //_________________________________________________________________
81 AliMUONRawStreamTracker::AliMUONRawStreamTracker(const AliMUONRawStreamTracker& stream) :
82   TObject(stream)
83
84   //
85   // copy ctor
86   //
87   AliFatal("copy constructor not implemented");
88 }
89
90 //______________________________________________________________________
91 AliMUONRawStreamTracker& AliMUONRawStreamTracker::operator = (const AliMUONRawStreamTracker& 
92                                               /* stream */)
93 {
94   // 
95   // assignment operator
96   //
97   AliFatal("assignment operator not implemented");
98   return *this;
99 }
100
101
102 //___________________________________
103 AliMUONRawStreamTracker::~AliMUONRawStreamTracker()
104 {
105   //
106   // clean up
107   //
108   delete fPayload;
109
110 }
111
112 //_____________________________________________________________
113 Bool_t AliMUONRawStreamTracker::Next()
114 {
115   //
116   // read the next raw digit (buspatch structure)
117   // returns kFALSE if there is no digit left
118   // (under development)
119
120 //      AliMUONDDLTracker*       ddlTracker = 0x0;
121 //      AliMUONBlockHeader*      blkHeader  = 0x0;
122 //      AliMUONDspHeader*        dspHeader  = 0x0;
123 //      Int_t nBusPatch;
124 //      Int_t nDsp;
125 //      Int_t nBlock;
126
127 //  next:  
128 //      if (fNextDDL){
129 //        printf("iDDL %d\n", fDDL+1);
130 //        fBlkId = 0;
131 //        fDspId = 0;
132 //        fBusPatchId = 0;
133 //        if(!NextDDL()) 
134 //       return kFALSE;
135 //      }
136 //      fNextDDL = kFALSE;
137
138 //      ddlTracker = GetDDLTracker();
139
140 //      nBlock = ddlTracker->GetBlkHeaderEntries();
141 //      if (fBlkId <  nBlock) {
142
143 //        blkHeader = ddlTracker->GetBlkHeaderEntry(fBlkId);
144 //        nDsp      = blkHeader->GetDspHeaderEntries();
145
146 //        if( fDspId < nDsp) {
147 //       dspHeader = blkHeader->GetDspHeaderEntry(fDspId);
148 //       nBusPatch = dspHeader->GetBusPatchEntries();
149
150 //       if (fBusPatchId < nBusPatch) {
151 //         fBusStructPtr = dspHeader->GetBusPatchEntry(fBusPatchId++);
152 //         return kTRUE;
153
154 //       } else {// iBusPatch
155 //         fDspId++;
156 //         fBusPatchId = 0;
157 //         goto next;
158 //         //   Next();
159 //       }
160
161 //        } else {// iDsp
162 //       fBlkId++;
163 //       fDspId = 0;
164 //       fBusPatchId = 0;
165 //       goto next;
166 //       //      Next();
167 //        }
168
169 //      } else {// iBlock
170 //        fBlkId = 0;
171 //        fDspId = 0;
172 //        fBusPatchId = 0;
173 //        fNextDDL = kTRUE;
174 //        //return kTRUE;
175 //        goto next; 
176 //      }
177
178      return kFALSE;
179 }
180
181 //______________________________________________________
182 Bool_t AliMUONRawStreamTracker::NextDDL()
183 {
184   // reading tracker DDL
185
186   fPayload->ResetDDL();
187
188
189   if (fDDL >= 20) {
190     fDDL = 0;
191     return kFALSE;
192   }
193   AliDebug(3, Form("DDL Number %d\n", fDDL ));
194
195   fRawReader->Reset();
196   fRawReader->Select(0X9, fDDL, fDDL);  //Select the DDL file to be read  
197
198   fRawReader->ReadHeader();
199
200   Int_t totalDataWord  = fRawReader->GetDataSize(); // in bytes
201
202   UInt_t *buffer = new UInt_t[totalDataWord/4];
203
204   fRawReader->ReadNext((UChar_t*)buffer, totalDataWord); 
205
206   fPayload->Decode(buffer, totalDataWord/4);
207
208   delete[] buffer;
209
210   fDDL++;
211
212   return kTRUE;
213 }
214
215 //______________________________________________________
216 void AliMUONRawStreamTracker::SetMaxDDL(Int_t ddl) 
217 {
218   // set DDL number
219   if (ddl > 20) ddl = 20;
220   fMaxDDL = ddl;
221
222 }
223
224 //______________________________________________________
225 void AliMUONRawStreamTracker::SetMaxBlock(Int_t blk) 
226 {
227   // set regional card number
228   fPayload->SetMaxBlock(blk);
229 }