no cout anymore, please use AliDebug
[u/mrichter/AliRoot.git] / MUON / AliMUONPayloadTrigger.cxx
CommitLineData
939ae4b2 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
3d1463c8 16// $Id$
939ae4b2 17
3d1463c8 18//-----------------------------------------------------------------------------
00e86732 19/// \class AliMUONPayloadTrigger
939ae4b2 20/// Class Payload
21///
22/// Decodes rawdata from buffer and stores in TClonesArray.
23///
24/// First version implement for Trigger
25///
00e86732 26/// \author Christian Finck
3d1463c8 27//-----------------------------------------------------------------------------
939ae4b2 28
29#include "AliMUONPayloadTrigger.h"
30
939ae4b2 31#include "AliMUONDarcHeader.h"
32#include "AliMUONRegHeader.h"
33#include "AliMUONLocalStruct.h"
34#include "AliMUONDDLTrigger.h"
96a8629f 35#include "AliMUONLogger.h"
939ae4b2 36
1ed3c5c2 37#include "AliLog.h"
38
00e86732 39/// \cond CLASSIMP
939ae4b2 40ClassImp(AliMUONPayloadTrigger)
00e86732 41/// \endcond
939ae4b2 42
43AliMUONPayloadTrigger::AliMUONPayloadTrigger()
44 : TObject(),
45 fMaxReg(8),
9f5dcca3 46 fMaxLoc(16),
47 fDDLTrigger(new AliMUONDDLTrigger()),
48 fRegHeader(new AliMUONRegHeader()),
1db7b71c 49 fLocalStruct(new AliMUONLocalStruct()),
96a8629f 50 fLog(new AliMUONLogger(1000)),
1db7b71c 51 fDarcEoWErrors(0),
52 fGlobalEoWErrors(0),
53 fRegEoWErrors(0),
96a8629f 54 fLocalEoWErrors(0),
2470870a 55 fWarnings(kTRUE),
56 fNofRegSet(kFALSE)
939ae4b2 57{
00e86732 58 ///
59 /// create an object to read MUON raw digits
60 /// Default ctor for monitoring purposes
61 ///
939ae4b2 62
939ae4b2 63}
64
65//___________________________________
66AliMUONPayloadTrigger::~AliMUONPayloadTrigger()
67{
00e86732 68 ///
69 /// clean up
70 ///
939ae4b2 71 delete fDDLTrigger;
72 delete fLocalStruct;
73 delete fRegHeader;
96a8629f 74 delete fLog;
939ae4b2 75}
76
77
78//______________________________________________________
79Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer)
80{
00e86732 81 /// decode trigger DDL
5a92f8e6 82 /// store only notified cards
939ae4b2 83
84 // reading DDL for trigger
85
86 AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();
87
18d3ded7 88 static Int_t kGlobalHeaderSize = darcHeader->GetGlobalHeaderLength();
89 static Int_t kDarcHeaderSize = darcHeader->GetDarcHeaderLength();
90 static Int_t kRegHeaderSize = fRegHeader->GetHeaderLength();
91
92 Bool_t scalerEvent = kFALSE;
939ae4b2 93
94 Int_t index = 0;
18d3ded7 95
96 memcpy(darcHeader->GetHeader(), &buffer[index], (kDarcHeaderSize)*4);
97 index += kDarcHeaderSize;
939ae4b2 98
bfbfa5da 99// if (!fNofRegSet) // if regional board number not set, set it with darc type
100// {
2470870a 101 // darc type vardorh
102 if (darcHeader->GetDarcType() == 4)
103 fMaxReg = 1;
104
105 // darc type def.
106 if (darcHeader->GetDarcType() == 6)
107 fMaxReg = 8;
108
109 if(darcHeader->GetEventType() == 0) {
110 scalerEvent = kTRUE;
111 } else
112 scalerEvent = kFALSE;
bfbfa5da 113// }
2470870a 114
939ae4b2 115 if(scalerEvent) {
116 // 6 DARC scaler words
117 memcpy(darcHeader->GetDarcScalers(), &buffer[index], darcHeader->GetDarcScalerLength()*4);
118 index += darcHeader->GetDarcScalerLength();
119 }
120
1db7b71c 121 if (buffer[index++] != darcHeader->GetEndOfDarc()) {
1ed3c5c2 122
96a8629f 123 const Char_t* msg = Form("Wrong end of Darc word %x instead of %x\n",
124 buffer[index-1], darcHeader->GetEndOfDarc());
125 if (fWarnings) AliWarning(msg);
126 AddErrorMessage(msg);
1db7b71c 127 fDarcEoWErrors++;
128 }
939ae4b2 129 // 4 words of global board input + Global board output
18d3ded7 130 memcpy(darcHeader->GetGlobalInput(), &buffer[index], (kGlobalHeaderSize)*4);
131 index += kGlobalHeaderSize;
939ae4b2 132
133 if(scalerEvent) {
134 // 10 Global scaler words
135 memcpy(darcHeader->GetGlobalScalers(), &buffer[index], darcHeader->GetGlobalScalerLength()*4);
136 index += darcHeader->GetGlobalScalerLength();
137 }
138
1db7b71c 139 if (buffer[index++] != darcHeader->GetEndOfGlobal()) {
1ed3c5c2 140
96a8629f 141 const Char_t* msg = Form("Wrong end of Global word %x instead of %x\n",
142 buffer[index-1], darcHeader->GetEndOfGlobal());
143 if (fWarnings) AliWarning(msg);
144 AddErrorMessage(msg);
1db7b71c 145 fGlobalEoWErrors++;
146 }
939ae4b2 147 // 8 regional boards
148 for (Int_t iReg = 0; iReg < fMaxReg; iReg++) { //loop over regeonal card
149
150 memcpy(fRegHeader->GetHeader(), &buffer[index], kRegHeaderSize*4);
151 index += kRegHeaderSize;
152
153 fDDLTrigger->AddRegHeader(*fRegHeader);
154 // 11 regional scaler word
155 if(scalerEvent) {
156 memcpy(fRegHeader->GetScalers(), &buffer[index], fRegHeader->GetScalerLength()*4);
157 index += fRegHeader->GetScalerLength();
158 }
159
1db7b71c 160 if (buffer[index++] != fRegHeader->GetEndOfReg()) {
1ed3c5c2 161
96a8629f 162 const Char_t* msg = Form("Wrong end of Regional word %x instead of %x\n",
163 buffer[index-1], fRegHeader->GetEndOfReg());
164 if (fWarnings) AliWarning(msg);
165 AddErrorMessage(msg);
1db7b71c 166 fRegEoWErrors++;
167 }
939ae4b2 168 // 16 local cards per regional board
169 for (Int_t iLoc = 0; iLoc < fMaxLoc; iLoc++) { //loop over local card
170
171 Int_t dataSize = fLocalStruct->GetLength();;
172
173 // 5 word trigger information
174 memcpy(fLocalStruct->GetData(), &buffer[index], dataSize*4);
175 index += dataSize;
176
177 // 45 regional scaler word
178 if(scalerEvent) {
179 memcpy(fLocalStruct->GetScalers(), &buffer[index], fLocalStruct->GetScalerLength()*4);
180 index += fLocalStruct->GetScalerLength();
181 }
182
1db7b71c 183 if (buffer[index++] != fLocalStruct->GetEndOfLocal()) {
1ed3c5c2 184
96a8629f 185 const Char_t* msg = Form("Wrong end of Local word %x instead of %x\n",
186 buffer[index-1], fLocalStruct->GetEndOfLocal());
187
188 if (fWarnings) AliWarning(msg);
189 AddErrorMessage(msg);
1db7b71c 190 fLocalEoWErrors++;
191 }
5a92f8e6 192 // fill only if card notified
193 if (fLocalStruct->GetData(0) == fLocalStruct->GetDisableWord())
194 continue;
195
939ae4b2 196 fDDLTrigger->AddLocStruct(*fLocalStruct, iReg);
197
198 } // local card loop
199
200 } // regional card loop
201
202
203 return kTRUE;
204}
205
206//______________________________________________________
207void AliMUONPayloadTrigger::ResetDDL()
208{
00e86732 209 /// reseting TClonesArray
210 /// after each DDL
211 ///
939ae4b2 212 AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();
213 darcHeader->GetRegHeaderArray()->Delete();
1db7b71c 214 fDarcEoWErrors = 0;
215 fGlobalEoWErrors = 0;
216 fRegEoWErrors = 0;
217 fLocalEoWErrors = 0;
939ae4b2 218}
219
220//______________________________________________________
221void AliMUONPayloadTrigger::SetMaxReg(Int_t reg)
222{
00e86732 223 /// set regional card number
939ae4b2 224 if (reg > 8) reg = 8;
2470870a 225 fMaxReg = reg;
226
227 fNofRegSet = kTRUE;
939ae4b2 228}
229
230//______________________________________________________
231void AliMUONPayloadTrigger::SetMaxLoc(Int_t loc)
232{
00e86732 233 /// set local card number
939ae4b2 234 if (loc > 16) loc = 16;
235 fMaxLoc = loc;
236}
96a8629f 237
238//______________________________________________________
239void AliMUONPayloadTrigger::AddErrorMessage(const Char_t* msg)
240{
241/// adding message to logger
242
243 TString tmp(msg);
244
245 Int_t pos = tmp.First("\n");
246 tmp[pos] = 0;
247
248 fLog->Log(tmp.Data());
249}
250