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 **************************************************************************/
17 /// \class AliMUONPayloadTrigger
20 /// Decodes rawdata from buffer and stores in TClonesArray.
22 /// First version implement for Trigger
24 /// \author Christian Finck
26 #include "AliMUONPayloadTrigger.h"
28 #include "AliMUONDarcHeader.h"
29 #include "AliMUONRegHeader.h"
30 #include "AliMUONLocalStruct.h"
31 #include "AliMUONDDLTrigger.h"
36 ClassImp(AliMUONPayloadTrigger)
39 AliMUONPayloadTrigger::AliMUONPayloadTrigger()
43 fDDLTrigger(new AliMUONDDLTrigger()),
44 fRegHeader(new AliMUONRegHeader()),
45 fLocalStruct(new AliMUONLocalStruct()),
52 /// create an object to read MUON raw digits
53 /// Default ctor for monitoring purposes
58 //___________________________________
59 AliMUONPayloadTrigger::~AliMUONPayloadTrigger()
70 //______________________________________________________
71 Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer)
73 /// decode trigger DDL
74 /// store only notified cards
76 // reading DDL for trigger
78 AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();
80 static Int_t kGlobalHeaderSize = darcHeader->GetGlobalHeaderLength();
81 static Int_t kDarcHeaderSize = darcHeader->GetDarcHeaderLength();
82 static Int_t kRegHeaderSize = fRegHeader->GetHeaderLength();
84 Bool_t scalerEvent = kFALSE;
88 memcpy(darcHeader->GetHeader(), &buffer[index], (kDarcHeaderSize)*4);
89 index += kDarcHeaderSize;
91 if(darcHeader->GetEventType() == 0) {
97 // 6 DARC scaler words
98 memcpy(darcHeader->GetDarcScalers(), &buffer[index], darcHeader->GetDarcScalerLength()*4);
99 index += darcHeader->GetDarcScalerLength();
102 if (buffer[index++] != darcHeader->GetEndOfDarc()) {
104 AliWarning(Form("Wrong end of Darc word %x instead of %x\n",
105 buffer[index-1], darcHeader->GetEndOfDarc()));
108 // 4 words of global board input + Global board output
109 memcpy(darcHeader->GetGlobalInput(), &buffer[index], (kGlobalHeaderSize)*4);
110 index += kGlobalHeaderSize;
113 // 10 Global scaler words
114 memcpy(darcHeader->GetGlobalScalers(), &buffer[index], darcHeader->GetGlobalScalerLength()*4);
115 index += darcHeader->GetGlobalScalerLength();
118 if (buffer[index++] != darcHeader->GetEndOfGlobal()) {
120 AliWarning(Form("Wrong end of Global word %x instead of %x\n",
121 buffer[index-1], darcHeader->GetEndOfGlobal()));
125 for (Int_t iReg = 0; iReg < fMaxReg; iReg++) { //loop over regeonal card
127 memcpy(fRegHeader->GetHeader(), &buffer[index], kRegHeaderSize*4);
128 index += kRegHeaderSize;
130 fDDLTrigger->AddRegHeader(*fRegHeader);
131 // 11 regional scaler word
133 memcpy(fRegHeader->GetScalers(), &buffer[index], fRegHeader->GetScalerLength()*4);
134 index += fRegHeader->GetScalerLength();
137 if (buffer[index++] != fRegHeader->GetEndOfReg()) {
139 AliWarning(Form("Wrong end of Reg word %x instead of %x\n",
140 buffer[index-1], fRegHeader->GetEndOfReg()));
143 // 16 local cards per regional board
144 for (Int_t iLoc = 0; iLoc < fMaxLoc; iLoc++) { //loop over local card
146 Int_t dataSize = fLocalStruct->GetLength();;
148 // 5 word trigger information
149 memcpy(fLocalStruct->GetData(), &buffer[index], dataSize*4);
152 // 45 regional scaler word
154 memcpy(fLocalStruct->GetScalers(), &buffer[index], fLocalStruct->GetScalerLength()*4);
155 index += fLocalStruct->GetScalerLength();
158 if (buffer[index++] != fLocalStruct->GetEndOfLocal()) {
160 AliWarning(Form("Wrong end of local word %x instead of %x\n",
161 buffer[index-1], fLocalStruct->GetEndOfLocal()));
164 // fill only if card notified
165 if (fLocalStruct->GetData(0) == fLocalStruct->GetDisableWord())
168 fDDLTrigger->AddLocStruct(*fLocalStruct, iReg);
172 } // regional card loop
178 //______________________________________________________
179 void AliMUONPayloadTrigger::ResetDDL()
181 /// reseting TClonesArray
184 AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();
185 darcHeader->GetRegHeaderArray()->Delete();
187 fGlobalEoWErrors = 0;
192 //______________________________________________________
193 void AliMUONPayloadTrigger::SetMaxReg(Int_t reg)
195 /// set regional card number
196 if (reg > 8) reg = 8;
200 //______________________________________________________
201 void AliMUONPayloadTrigger::SetMaxLoc(Int_t loc)
203 /// set local card number
204 if (loc > 16) loc = 16;