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 AliMUONPayloadTrigger
22 /// Decodes rawdata from buffer and stores in TClonesArray.
24 /// First version implement for Trigger
26 /// \author Christian Finck
27 //-----------------------------------------------------------------------------
29 #include "AliMUONPayloadTrigger.h"
31 #include "AliMUONDarcHeader.h"
32 #include "AliMUONRegHeader.h"
33 #include "AliMUONLocalStruct.h"
34 #include "AliMUONDDLTrigger.h"
35 #include "AliMUONLogger.h"
40 ClassImp(AliMUONPayloadTrigger)
43 AliMUONPayloadTrigger::AliMUONPayloadTrigger()
47 fDDLTrigger(new AliMUONDDLTrigger()),
48 fRegHeader(new AliMUONRegHeader()),
49 fLocalStruct(new AliMUONLocalStruct()),
50 fLog(new AliMUONLogger(1000)),
59 /// create an object to read MUON raw digits
60 /// Default ctor for monitoring purposes
65 //___________________________________
66 AliMUONPayloadTrigger::~AliMUONPayloadTrigger()
78 //______________________________________________________
79 Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer)
81 /// decode trigger DDL
82 /// store only notified cards
84 // reading DDL for trigger
86 AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();
88 static Int_t kGlobalHeaderSize = darcHeader->GetGlobalHeaderLength();
89 static Int_t kDarcHeaderSize = darcHeader->GetDarcHeaderLength();
90 static Int_t kRegHeaderSize = fRegHeader->GetHeaderLength();
92 Bool_t scalerEvent = kFALSE;
96 memcpy(darcHeader->GetHeader(), &buffer[index], (kDarcHeaderSize)*4);
97 index += kDarcHeaderSize;
99 // if (!fNofRegSet) // if regional board number not set, set it with darc type
102 if (darcHeader->GetDarcType() == 4)
106 if (darcHeader->GetDarcType() == 6)
109 if(darcHeader->GetEventType() == 0) {
112 scalerEvent = kFALSE;
115 // overwrite the event type in case
116 // the raw-data contents contradicts with the
119 (buffer[index] == darcHeader->GetEndOfDarc()) &&
120 (buffer[index+darcHeader->GetDarcScalerLength()] != darcHeader->GetEndOfDarc())) {
121 // obviously not a scaler event
122 scalerEvent = kFALSE;
123 AliWarning("Overriding the event type obtained from the Darc header to physics event!");
126 (buffer[index] != darcHeader->GetEndOfDarc()) &&
127 (buffer[index+darcHeader->GetDarcScalerLength()] == darcHeader->GetEndOfDarc())) {
128 // obviously a scaler event
130 AliWarning("Overriding the event type obtained from the Darc header to software trigger event!");
134 // 6 DARC scaler words
135 memcpy(darcHeader->GetDarcScalers(), &buffer[index], darcHeader->GetDarcScalerLength()*4);
136 index += darcHeader->GetDarcScalerLength();
139 if (buffer[index++] != darcHeader->GetEndOfDarc()) {
141 const Char_t* msg = Form("Wrong end of Darc word %x instead of %x\n",
142 buffer[index-1], darcHeader->GetEndOfDarc());
143 if (fWarnings) AliWarning(msg);
144 AddErrorMessage(msg);
147 // 4 words of global board input + Global board output
148 memcpy(darcHeader->GetGlobalInput(), &buffer[index], (kGlobalHeaderSize)*4);
149 index += kGlobalHeaderSize;
152 // 10 Global scaler words
153 memcpy(darcHeader->GetGlobalScalers(), &buffer[index], darcHeader->GetGlobalScalerLength()*4);
154 index += darcHeader->GetGlobalScalerLength();
157 if (buffer[index++] != darcHeader->GetEndOfGlobal()) {
159 const Char_t* msg = Form("Wrong end of Global word %x instead of %x\n",
160 buffer[index-1], darcHeader->GetEndOfGlobal());
161 if (fWarnings) AliWarning(msg);
162 AddErrorMessage(msg);
166 for (Int_t iReg = 0; iReg < fMaxReg; iReg++) { //loop over regeonal card
168 memcpy(fRegHeader->GetHeader(), &buffer[index], kRegHeaderSize*4);
169 index += kRegHeaderSize;
171 fDDLTrigger->AddRegHeader(*fRegHeader);
172 // 11 regional scaler word
174 memcpy(fRegHeader->GetScalers(), &buffer[index], fRegHeader->GetScalerLength()*4);
175 index += fRegHeader->GetScalerLength();
178 if (buffer[index++] != fRegHeader->GetEndOfReg()) {
180 const Char_t* msg = Form("Wrong end of Regional word %x instead of %x\n",
181 buffer[index-1], fRegHeader->GetEndOfReg());
182 if (fWarnings) AliWarning(msg);
183 AddErrorMessage(msg);
186 // 16 local cards per regional board
187 for (Int_t iLoc = 0; iLoc < fMaxLoc; iLoc++) { //loop over local card
189 Int_t dataSize = fLocalStruct->GetLength();;
191 // 5 word trigger information
192 memcpy(fLocalStruct->GetData(), &buffer[index], dataSize*4);
195 // 45 regional scaler word
197 memcpy(fLocalStruct->GetScalers(), &buffer[index], fLocalStruct->GetScalerLength()*4);
198 index += fLocalStruct->GetScalerLength();
201 if (buffer[index++] != fLocalStruct->GetEndOfLocal()) {
203 const Char_t* msg = Form("Wrong end of Local word %x instead of %x\n",
204 buffer[index-1], fLocalStruct->GetEndOfLocal());
206 if (fWarnings) AliWarning(msg);
207 AddErrorMessage(msg);
210 // fill only if card notified
211 if (fLocalStruct->GetData(0) == fLocalStruct->GetDisableWord())
214 fDDLTrigger->AddLocStruct(*fLocalStruct, iReg);
218 } // regional card loop
224 //______________________________________________________
225 void AliMUONPayloadTrigger::ResetDDL()
227 /// reseting TClonesArray
230 AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();
231 darcHeader->GetRegHeaderArray()->Delete();
233 fGlobalEoWErrors = 0;
238 //______________________________________________________
239 void AliMUONPayloadTrigger::SetMaxReg(Int_t reg)
241 /// set regional card number
242 if (reg > 8) reg = 8;
248 //______________________________________________________
249 void AliMUONPayloadTrigger::SetMaxLoc(Int_t loc)
251 /// set local card number
252 if (loc > 16) loc = 16;
256 //______________________________________________________
257 void AliMUONPayloadTrigger::AddErrorMessage(const Char_t* msg)
259 /// adding message to logger
263 Int_t pos = tmp.First("\n");
266 fLog->Log(tmp.Data());