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 **************************************************************************/
18 //-----------------------------------------------------------------------------
19 /// \class AliMUONRawStreamTrigger
20 /// This class provides access to MUON digits in raw data.
22 /// It loops over all MUON digits in the raw data given by the AliRawReader.
23 /// The Next method goes to the next local response. If there are no local response left
24 /// it returns kFALSE.
25 /// It can loop also over DDL and store the decoded rawdata in TClonesArrays
28 /// Version implement for Trigger
29 /// \author Christian Finck
30 //-----------------------------------------------------------------------------
34 #include "AliMUONRawStreamTrigger.h"
35 #include "AliMUONDarcHeader.h"
36 #include "AliMUONRegHeader.h"
37 #include "AliMUONLocalStruct.h"
38 #include "AliMUONDDLTrigger.h"
39 #include "AliMUONLogger.h"
41 #include "AliRawReader.h"
42 #include "AliRawDataHeader.h"
49 ClassImp(AliMUONRawStreamTrigger)
52 const Int_t AliMUONRawStreamTrigger::fgkMaxDDL = 2;
54 //___________________________________________
55 AliMUONRawStreamTrigger::AliMUONRawStreamTrigger()
57 fPayload(new AliMUONPayloadTrigger()),
59 fCurrentDDLIndex(fgkMaxDDL),
60 fCurrentDarcHeader(0x0),
61 fCurrentRegHeader(0x0),
62 fCurrentRegHeaderIndex(0),
63 fCurrentLocalStruct(0x0),
64 fCurrentLocalStructIndex(0),
65 fLocalStructRead(kFALSE),
68 fEnableErrorLogger(kFALSE)
71 /// create an object to read MUON raw digits
72 /// Default ctor for monitoring purposes
78 //_________________________________________________________________
79 AliMUONRawStreamTrigger::AliMUONRawStreamTrigger(AliRawReader* rawReader)
80 : AliMUONRawStream(rawReader),
81 fPayload(new AliMUONPayloadTrigger()),
83 fCurrentDDLIndex(fgkMaxDDL),
84 fCurrentDarcHeader(0x0),
85 fCurrentRegHeader(0x0),
86 fCurrentRegHeaderIndex(0),
87 fCurrentLocalStruct(0x0),
88 fCurrentLocalStructIndex(0),
89 fLocalStructRead(kFALSE),
92 fEnableErrorLogger(kFALSE)
95 /// ctor with AliRawReader as argument
96 /// for reconstruction purpose
101 //___________________________________
102 AliMUONRawStreamTrigger::~AliMUONRawStreamTrigger()
110 //_____________________________________________________________
111 Bool_t AliMUONRawStreamTrigger::Next(UChar_t& id, UChar_t& dec, Bool_t& trigY,
112 UChar_t& yPos, UChar_t& sXDev, UChar_t& xDev,
113 UChar_t& xPos, Bool_t& triggerY, Bool_t& triggerX,
114 TArrayS& xPattern, TArrayS& yPattern)
117 /// read the next raw digit (local structure)
118 /// returns kFALSE if there is no digit left
119 /// Should call First() before this method to start the iteration.
122 if ( IsDone() ) return kFALSE;
124 if ( fLocalStructRead ) {
126 Bool_t ok = GetNextLocalStruct();
134 fLocalStructRead = kTRUE;
136 id = fCurrentLocalStruct->GetId();
137 dec = fCurrentLocalStruct->GetDec();
138 trigY = fCurrentLocalStruct->GetTrigY();
139 yPos = fCurrentLocalStruct->GetYPos();
140 sXDev = fCurrentLocalStruct->GetSXDev();
141 xDev = fCurrentLocalStruct->GetXDev();
142 xPos = fCurrentLocalStruct->GetXPos();
144 triggerX = fCurrentLocalStruct->GetTriggerX();
145 triggerY = fCurrentLocalStruct->GetTriggerY();
147 fCurrentLocalStruct->GetXPattern(xPattern);
148 fCurrentLocalStruct->GetYPattern(yPattern);
153 //______________________________________________________
154 Bool_t AliMUONRawStreamTrigger::IsDone() const
156 /// Whether the iteration is finished or not
157 return (fCurrentLocalStruct==0);
160 //______________________________________________________
161 void AliMUONRawStreamTrigger::First()
163 /// Initialize the iteration process.
165 fCurrentDDLIndex = -1;
166 // Must reset all the pointers because if we return before calling
167 // GetNextLocalStruct() the user might call CurrentDDL(), CurrentBlockHeader(),
168 // CurrentRegHeader() or CurrentLocalStruct() which should return reasonable
169 // results in that case.
171 fCurrentDarcHeader = 0;
172 fCurrentRegHeader = 0;
173 fCurrentLocalStruct = 0;
175 // Find the first non-empty structure
176 if (not GetNextDDL()) return;
177 if (not GetNextRegHeader()) return;
178 GetNextLocalStruct();
181 //______________________________________________________
182 Bool_t AliMUONRawStreamTrigger::GetNextDDL()
184 /// Returns the next DDL present
186 assert( GetReader() != 0 );
188 Bool_t kFound(kFALSE);
190 while ( fCurrentDDLIndex < fgkMaxDDL-1 && !kFound )
193 GetReader()->Reset();
194 GetReader()->Select("MUONTRG",fCurrentDDLIndex,fCurrentDDLIndex);
195 if ( GetReader()->ReadHeader() )
203 // fCurrentDDLIndex is set to fgkMaxDDL so that we exit the above loop immediately
204 // for a subsequent call to this method, unless NextEvent is called in between.
205 fCurrentDDLIndex = fgkMaxDDL;
206 // We have not actually been able to complete the loading of the new DDL so
207 // we are still on the old one. In this case we do not need to reset fCurrentDDL.
209 if (IsErrorLogger()) AddErrorMessage();
213 Int_t totalDataWord = GetReader()->GetDataSize(); // in bytes
215 AliDebug(3, Form("DDL Number %d totalDataWord %d\n", fCurrentDDLIndex,
218 UInt_t *buffer = new UInt_t[totalDataWord/4];
220 if ( !GetReader()->ReadNext((UChar_t*)buffer, totalDataWord) )
222 // We have not actually been able to complete the loading of the new DDL so
223 // we are still on the old one. In this case we do not need to reset fCurrentDDL.
230 Swap(buffer, totalDataWord / sizeof(UInt_t)); // swap needed for mac power pc
233 fPayload->ResetDDL();
235 Bool_t ok = fPayload->Decode(buffer);
239 fCurrentDDL = fPayload->GetDDLTrigger();
241 fCurrentDarcHeader = fCurrentDDL->GetDarcHeader();
243 fCurrentRegHeaderIndex = -1;
250 //______________________________________________________
251 Bool_t AliMUONRawStreamTrigger::GetNextRegHeader()
253 /// Returns the next Reg Header present
255 assert( fCurrentDarcHeader != 0 );
256 assert( fCurrentDDL != 0 );
258 fCurrentRegHeader = 0;
260 Int_t i = fCurrentRegHeaderIndex;
262 while ( fCurrentRegHeader == 0 && i < fCurrentDarcHeader->GetRegHeaderEntries()-1 )
265 fCurrentRegHeader = fCurrentDarcHeader->GetRegHeaderEntry(i);
268 if ( !fCurrentRegHeader )
270 Bool_t ok = GetNextDDL();
277 return GetNextRegHeader();
281 fCurrentRegHeaderIndex = i;
283 fCurrentLocalStructIndex = -1;
288 //______________________________________________________
289 Bool_t AliMUONRawStreamTrigger::GetNextLocalStruct()
291 /// Find the next non-empty local structure
293 assert( fCurrentRegHeader != 0 );
295 fCurrentLocalStruct = 0;
297 Int_t i = fCurrentLocalStructIndex;
299 while ( fCurrentLocalStruct == 0 && i < fCurrentRegHeader->GetLocalEntries()-1 )
302 fCurrentLocalStruct = fCurrentRegHeader->GetLocalEntry(i);
305 if ( !fCurrentLocalStruct )
307 Bool_t ok = GetNextRegHeader();
314 return GetNextLocalStruct();
318 fCurrentLocalStructIndex = i;
320 fLocalStructRead = kFALSE;
325 //______________________________________________________
326 Bool_t AliMUONRawStreamTrigger::NextDDL()
328 /// reading tracker DDL
329 /// store local info into Array
330 /// store only non-empty structures
333 fPayload->ResetDDL();
336 // loop over the two ddl's
338 while ( fDDL < fgkMaxDDL ) {
339 GetReader()->Reset();
340 GetReader()->Select("MUONTRG", fDDL, fDDL); //Select the DDL file to be read
341 if (GetReader()->ReadHeader()) break;
342 AliDebug(3,Form("Skipping DDL %d which does not seem to be there",fDDL));
346 if (fDDL >= fgkMaxDDL) {
348 if (IsErrorLogger()) AddErrorMessage();
352 AliDebug(3, Form("DDL Number %d\n", fDDL ));
354 Int_t totalDataWord = GetReader()->GetDataSize(); // in bytes
356 UInt_t *buffer = new UInt_t[totalDataWord/4];
358 // check not necessary yet, but for future developments
359 if (!GetReader()->ReadNext((UChar_t*)buffer, totalDataWord)) return kFALSE;
362 Swap(buffer, totalDataWord / sizeof(UInt_t)); // swap needed for mac power pc
365 fPayload->Decode(buffer);
376 // //______________________________________________________
377 // void AliMUONRawStreamTrigger::SetMaxReg(Int_t reg)
379 // /// set regional card number
380 // fPayload->SetMaxReg(reg);
383 //______________________________________________________
384 void AliMUONRawStreamTrigger::SetMaxLoc(Int_t loc)
386 /// set local card number
387 fPayload->SetMaxLoc(loc);
390 //______________________________________________________
391 void AliMUONRawStreamTrigger::AddErrorMessage()
393 /// add message into logger of AliRawReader per event
397 AliMUONLogger* log = fPayload->GetErrorLogger();
400 while(log->Next(msg, occurance))
402 if (msg.Contains("Darc"))
403 GetReader()->AddMajorErrorLog(kDarcEoWErr, msg.Data());
405 if (msg.Contains("Global"))
406 GetReader()->AddMajorErrorLog(kGlobalEoWErr, msg.Data());
408 if (msg.Contains("Regional"))
409 GetReader()->AddMajorErrorLog(kRegEoWErr, msg.Data());
411 if (msg.Contains("Local"))
412 GetReader()->AddMajorErrorLog(kLocalEoWErr, msg.Data());
415 log->Clear(); // clear after each event