AliRoot Core  v5-06-30 (35d6c57)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliMUONDigitMaker.cxx
Go to the documentation of this file.
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 // $Id$
17 
18 //-----------------------------------------------------------------------------
43 //-----------------------------------------------------------------------------
44 
45 #include "AliMUONDigitMaker.h"
46 
47 #include "AliMUONDDLTrigger.h"
48 #include "AliMUONDarcHeader.h"
49 #include "AliMUONVDigit.h"
50 #include "AliMUONVDigitStore.h"
51 #include "AliMUONGlobalTrigger.h"
52 #include "AliMUONLocalStruct.h"
53 #include "AliMUONLocalTrigger.h"
54 #include "AliMUONLogger.h"
57 #include "AliMUONRegHeader.h"
58 #include "AliMUONVTriggerStore.h"
59 #include "AliMpCDB.h"
60 #include "AliMpDetElement.h"
61 #include "AliMpTriggerCrate.h"
62 #include "AliMpLocalBoard.h"
63 #include "AliMpCathodType.h"
64 #include "AliMpDDLStore.h"
65 #include "AliMpDEManager.h"
66 #include "AliMpPad.h"
67 #include "AliMpSegmentation.h"
68 #include "AliMpVSegmentation.h"
69 #include "AliCodeTimer.h"
70 #include "AliLog.h"
71 #include "AliRawReader.h"
72 #include <TArrayS.h>
73 
74 using std::endl;
75 using std::cout;
77 ClassImp(AliMUONDigitMaker) // Class implementation in ROOT context
79 
80 //__________________________________________________________________________
81 AliMUONDigitMaker::AliMUONDigitMaker(Bool_t enableErrorLogger, Bool_t a, Bool_t b) :
82 TObject(),
83 fScalerEvent(kFALSE),
84 fMakeTriggerDigits(kFALSE),
85 fMakeTrackerDigits(kFALSE),
86 fRawStreamTracker(new AliMUONRawStreamTrackerHP),
87 fRawStreamTrigger(new AliMUONRawStreamTriggerHP),
88 fDigitStore(0x0),
89 fTriggerStore(0x0),
90 fLogger(new AliMUONLogger(10000)){
92 
93  if ( !a || !b ) AliFatal("no longer supported");
94 
95  AliDebug(1,"");
96 
97  // Standard Constructor
98  if (enableErrorLogger)
99  {
100  fRawStreamTracker->EnabbleErrorLogger();
101  fRawStreamTrigger->EnabbleErrorLogger();
102  }
103  else
104  {
105  fRawStreamTracker->DisableWarnings();
106  }
107 
108  SetMakeTriggerDigits();
109  SetMakeTrackerDigits();
110 
111  // Load mapping
112  if ( ! AliMpCDB::LoadDDLStore() ) {
113  AliFatal("Could not access mapping from OCDB !");
114  }
115 }
116 
117 //__________________________________________________________________________
118 AliMUONDigitMaker::AliMUONDigitMaker(Bool_t enableErrorLogger) :
119 TObject(),
120  fScalerEvent(kFALSE),
121  fMakeTriggerDigits(kFALSE),
122  fMakeTrackerDigits(kFALSE),
123  fRawStreamTracker(new AliMUONRawStreamTrackerHP),
124  fRawStreamTrigger(new AliMUONRawStreamTriggerHP),
125  fDigitStore(0x0),
126  fTriggerStore(0x0),
127  fLogger(new AliMUONLogger(10000))
128 {
130 
131  AliDebug(1,"");
132 
133  // Standard Constructor
134  if (enableErrorLogger)
135  {
138  }
139  else
140  {
142  }
143 
146 
147  // Load mapping
148  if ( ! AliMpCDB::LoadDDLStore() ) {
149  AliFatal("Could not access mapping from OCDB !");
150  }
151 }
152 
153 //__________________________________________________________________________
155 {
158 
159  delete fRawStreamTracker;
160  delete fRawStreamTrigger;
161  delete fLogger;
162 }
163 
164 //____________________________________________________________________
165 void
166 AliMUONDigitMaker::Print(Option_t*) const
167 {
169 
170  cout << "RawStreamerTracker class=" << fRawStreamTracker->ClassName()
171  << " MakeTriggerDigits=" << fMakeTriggerDigits
172  << " ScalerEvent=" << fScalerEvent
173  << " DigitStore=" << fDigitStore
174  << " TriggerStore=" << fTriggerStore << endl;
175 
176  if ( fLogger ) fLogger->Print();
177 }
178 
179 //____________________________________________________________________
180 Int_t
181 AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader,
182  AliMUONVDigitStore* digitStore,
183  AliMUONVTriggerStore* triggerStore)
184 {
188 
189  AliDebug(1,Form("rawReader=%p digitStore=%p triggerStore=%p",
190  rawReader,digitStore,triggerStore));
191 
192  fDigitStore = digitStore;
193  fTriggerStore = triggerStore;
194 
195  if (!fDigitStore && !fTriggerStore)
196  {
197  fLogger->Log("No digit or trigger store given. Nothing to do...");
198  return kTriggerBAD & kTrackerBAD;
199  }
200 
201  Int_t tracker(kOK);
202  Int_t trigger(kOK);
203 
204  if ( fDigitStore ) fDigitStore->Clear(); // insure we start with an empty container
205 
206  if ( fMakeTrackerDigits ) {
207  if ( fDigitStore ) tracker = ReadTrackerDDL(rawReader);
208  else fLogger->Log("Asking for tracker digits but digitStore is null");
209  }
210 
212  {
214  if ( fMakeTriggerDigits && !fDigitStore )
215  {
216  fLogger->Log("Asking for trigger digits but digitStore is null");
217  }
218  else
219  {
220  trigger = ReadTriggerDDL(rawReader);
221  }
222  }
223 
224  return tracker | trigger;
225 }
226 
227 //____________________________________________________________________
228 Int_t
229 AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
230 {
233 
234  AliDebug(1,"");
235 
236  AliCodeTimerAuto("",0);
237 
238  // elex info
239  Int_t buspatchId;
240  UChar_t channelId;
241  UShort_t manuId;
242  UShort_t charge;
243 
244  fRawStreamTracker->SetReader(rawReader);
246 
247  while ( fRawStreamTracker->Next(buspatchId,manuId,channelId,charge,kTRUE) )
248  {
249  // getting DE from buspatch
250  Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(buspatchId);
251 
253 
254  if (!de)
255  {
256  fLogger->Log(Form("DE %04d does not exist !", detElemId));
257  continue;
258  }
259 
260  if (!de->IsConnectedChannel(manuId,channelId))
261  {
262  // non connected pad, do nothing (this is not an error !)
263  continue;
264  }
265 
266  const AliMpVSegmentation* seg
268  manuId);
269 
270  if (!seg)
271  {
272  fLogger->Log(Form("(DE,MANUID)=(%04d,%04d) is not valid",detElemId,manuId));
273  continue;
274  }
275 
276  AliMp::CathodType cathodeType = de->GetCathodType(seg->PlaneType());
277 
278  AliMpPad pad = seg->PadByLocation(manuId,channelId,kFALSE);
279 
280  if (!pad.IsValid())
281  {
282  fLogger->Log(Form("No pad for detElemId: %d, manuId: %d, channelId: %d",
283  detElemId, manuId, channelId));
284  continue;
285  }
286 
287  AliMUONVDigit* digit = fDigitStore->Add(detElemId,manuId,channelId,cathodeType,
289 
290  if (!digit)
291  {
292  fLogger->Log(Form("Digit DE %04d Manu %04d Channel %02d could not be added",
293  detElemId, manuId, channelId));
294  continue;
295  }
296 
297  digit->SetPadXY(pad.GetIx(),pad.GetIy());
298 
299  digit->SetADC(charge);
300 
301  }
302 
304  {
305  return kTrackerBAD;
306  }
307 
308  return kOK;
309 }
310 
311 //____________________________________________________________________
312 Int_t
313 AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
314 {
317 
318  const AliMUONRawStreamTriggerHP::AliHeader* darcHeader = 0x0;
319  const AliMUONRawStreamTriggerHP::AliRegionalHeader* regHeader = 0x0;
320  const AliMUONRawStreamTriggerHP::AliLocalStruct* localStruct = 0x0;
321 
322  Int_t loCircuit;
323 
324  fRawStreamTrigger->SetReader(rawReader);
325 
326  while (fRawStreamTrigger->NextDDL())
327  {
328  darcHeader = fRawStreamTrigger->GetHeaders();
329 
330  // fill global trigger information
331  if (fTriggerStore)
332  {
333  if (darcHeader->GetGlobalFlag())
334  {
335  AliMUONGlobalTrigger globalTrigger;
336  globalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput());
337  globalTrigger.SetFromGlobalInput(darcHeader->GetGlobalHeader()->fInput);
338  fTriggerStore->SetGlobal(globalTrigger);
339  }
340  }
341 
343 
344  for(Int_t iReg = 0; iReg < nReg ;iReg++)
345  { //reg loop
346 
347 
348  // crate info
350  GetTriggerCrate(fRawStreamTrigger->GetDDL(), iReg);
351 
352  if (!crate) {
353  fLogger->Log(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
354  continue;
355  }
356 
357  regHeader = fRawStreamTrigger->GetRegionalHeader(iReg);
358 
359  Int_t nLocal = regHeader->GetLocalStructCount();
360  for(Int_t iLocal = 0; iLocal < nLocal; iLocal++)
361  {
362 
363  localStruct = regHeader->GetLocalStruct(iLocal);
364 
365  // if card exist
366  if (localStruct) {
367 
368  loCircuit = crate->GetLocalBoardId(localStruct->GetId());
369 
370  if ( !loCircuit ) continue; // empty slot
371 
372 
373  if (fTriggerStore)
374  {
375  // fill local trigger
376  AliMUONLocalTrigger localTrigger;
377  localTrigger.SetLocalStruct(loCircuit, *localStruct);
378  fTriggerStore->Add(localTrigger);
379  }
380 
381  if ( fMakeTriggerDigits )
382  {
383  //FIXEME should find something better than a TArray
384  TArrayS xyPattern[2];
385 
386  localStruct->GetXPattern(xyPattern[0]);
387  localStruct->GetYPattern(xyPattern[1]);
388 
389  TriggerDigits(loCircuit, xyPattern, *fDigitStore);
390  }
391  } // if triggerY
392  } // iLocal
393  } // iReg
394  } // NextDDL
395 
396  return kOK;
397 }
398 
399 //____________________________________________________________________
401  const TArrayS* xyPattern,
402  AliMUONVDigitStore& digitStore, Bool_t warn) const
403 {
405 
406  AliCodeTimerAuto("",0);
407 
408  Int_t detElemId;
409 
410  AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(nBoard);
411 
412  if ( ! localBoard->IsNotified() ) {
413  // Copy board
414  // The mapping is not correct for copy boards
415  // Use the one of corresponding phyiscal board
416  nBoard = localBoard->GetInputXfrom();
417  }
418 
419  Int_t n,b;
420 
421  // loop over x1-4 and y1-4
422  for (Int_t iChamber = 0; iChamber < 4; ++iChamber)
423  {
424  for (Int_t iCath = 0; iCath < 2; ++iCath)
425  {
426  Int_t pattern = (Int_t)xyPattern[iCath].At(iChamber);
427  if (!pattern) continue;
428 
429  // get detElemId
430  detElemId = AliMpDDLStore::Instance()->GetDEfromLocalBoard(nBoard, iChamber);
431 
432  const AliMpVSegmentation* seg
434  ->GetMpSegmentation(detElemId, AliMp::GetCathodType(iCath));
435 
436  // loop over the 16 bits of pattern
437  for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy)
438  {
439  if ((pattern >> ibitxy) & 0x1)
440  {
441  // not quite sure about this
442  Int_t offset = 0;
443  if (iCath && localBoard->GetSwitch(AliMpLocalBoard::kZeroAllYLSB)) offset = -8;
444 
445  AliMpPad pad = seg->PadByLocation(nBoard,ibitxy+offset,warn);
446 
447  if (!pad.IsValid())
448  {
449  fLogger->Log(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
450  detElemId, nBoard, ibitxy));
451  continue;
452  }
453 
454  n = pad.GetLocalBoardId(0); // always take first location so that digits are not inserted several times
455  b = pad.GetLocalBoardChannel(0);
456 
457  AliDebug(1,Form("Using localBoard %d ixy %d instead of %d,%d",
458  n,b,nBoard,ibitxy));
459 
460  AliMUONVDigit* digit = digitStore.Add(detElemId,n,b,iCath,AliMUONVDigitStore::kDeny);
461 
462  if (!digit)
463  {
464  AliDebug(1, Form("Digit DE %04d LocalBoard %03d ibitxy %02d cath %d already in store",
465  detElemId,nBoard,ibitxy,iCath));
466  continue;
467  }
468 
469  Int_t padX = pad.GetIx();
470  Int_t padY = pad.GetIy();
471 
472  // fill digit
473  digit->SetPadXY(padX,padY);
474  digit->SetCharge(1.);
475  }// xyPattern
476  }// ibitxy
477  }// cath
478  } // ichamber
479 
480  return kTRUE;
481 }
482 
483 //______________________________________________________________________________
484 Bool_t
486  AliMUONVDigitStore& digitStore) const
487 {
488  //
490  //
491 
492  digitStore.Clear();
493 
494  AliMUONLocalTrigger* locTrg;
495  TIter next(triggerStore.CreateLocalIterator());
496 
497  while ( ( locTrg = static_cast<AliMUONLocalTrigger*>(next()) ) )
498  {
499  if (locTrg->IsNull()) continue;
500 
501  TArrayS xyPattern[2];
502  locTrg->GetXPattern(xyPattern[0]);
503  locTrg->GetYPattern(xyPattern[1]);
504 
505  Int_t nBoard = locTrg->LoCircuit();
506  TriggerDigits(nBoard, xyPattern, digitStore);
507  }
508  return kTRUE;
509 }
510 
511 //______________________________________________________________________________
512 void
514 {
518 }
void GetYPattern(TArrayS &array) const
return Y pattern array
virtual void EnabbleErrorLogger()
Enable error logging to the raw reader.
void GetXPattern(TArrayS &array) const
return X pattern array
A high performance stream decoder for muon tracking DDL streams.
const AliHeader * GetHeaders() const
Returns the DARC and global headers plus scalars if they exist.
Light weight interface class to the local trigger card data.
void SetFromGlobalInput(const UInt_t *globalInput)
Reading Raw data class for trigger and tracker chambers.
void SetMakeTriggerDigits(Bool_t flag=kFALSE)
Set flag whether or not we should generate digits for the trigger.
const AliMpVSegmentation * GetMpSegmentation(Int_t detElemId, AliMp::CathodType cath, Bool_t warn=true) const
virtual TIterator * CreateLocalIterator() const =0
Create iterator on local trigger.
AliMUONRawStreamTrackerHP * fRawStreamTracker
! pointer of raw stream for tracker
void SetFromGlobalResponse(UShort_t globalResponse)
Bool_t IsNotified() const
Return notified flag (not copy card)
virtual void SetReader(AliRawReader *rawReader)
Set object for reading the raw data.
AliMpLocalBoard * GetLocalBoard(Int_t localBoardId, Bool_t warn=true) const
Interface for a digit container.
void Print(Option_t *opt="") const
Bool_t GetGlobalFlag() const
Return global flag.
Int_t GetDEfromLocalBoard(Int_t localBoardId, Int_t chamberId) const
The class defines the properties of trigger crate.
virtual AliMp::PlaneType PlaneType() const =0
Return the plane type.
static AliMpSegmentation * Instance(Bool_t warn=true)
Int_t GetIy() const
Definition: AliMpPad.cxx:280
void SetLocalStruct(Int_t loCircuit, AliMUONLocalStruct &localStruct)
Int_t ReadTriggerDDL(AliRawReader *rawReader)
Int_t TriggerDigits(Int_t nBoard, const TArrayS *xyPattern, AliMUONVDigitStore &digitStore, Bool_t warn=kTRUE) const
virtual Bool_t NextDDL()
DDL iterator.
Int_t GetLocalBoardId(Int_t index) const
Int_t ReadTrackerDDL(AliRawReader *rawReader)
Light weight interface class to the DARC and global header data.
void GetXPattern(TArrayS &array) const
return X pattern array
void Print(Option_t *opt="") const
Int_t Log(const char *message)
virtual ~AliMUONDigitMaker(void)
Int_t GetDEfromBus(Int_t busPatchId) const
virtual void SetGlobal(const AliMUONGlobalTrigger &globalTrigger)=0
Set global trigger.
const AliRegionalHeader * GetRegionalHeader(UInt_t i) const
Return the i'th regional header or NULL if not found.
const AliMUONGlobalHeaderStruct * GetGlobalHeader() const
Return the global header's raw data.
static Bool_t LoadDDLStore(Bool_t warn=false)
Definition: AliMpCDB.cxx:149
Int_t GetSwitch(Int_t index) const
Get switch bit wise (return a inteter for backware compatibility)
Higher performance decoder stream class for reading MUON raw trigger data.
const AliMpVSegmentation * GetMpSegmentationByElectronics(Int_t detElemId, Int_t elCardID, Bool_t warn=true) const
AliMpDetElement * GetDetElement(Int_t detElemId, Bool_t warn=true) const
Class that manages the properties of the local board.
The class defines the electronics properties of detection element.
virtual void SetCharge(Float_t q)=0
Set the charge of this digit.
void DisableWarnings()
Set warnings flag to disable warnings on data errors.
Bool_t fMakeTriggerDigits
! whether or not we should generate digits for the trigger
Base class of a trigger information store.
const AliLocalStruct * GetLocalStruct(UInt_t i) const
Return the i'th local trigger structure in this regional structure.
Int_t Raw2Digits(AliRawReader *rawReader, AliMUONVDigitStore *digitContainer=0, AliMUONVTriggerStore *triggerStore=0)
ClassImp(TPCGenInfo)
Definition: AliTPCCmpNG.C:254
(1) reset the LSB for special configuration of board RC2L5B4 & RC2L6B1
AliMUONRawStreamTriggerHP * fRawStreamTrigger
! pointer of raw stream for trigger
A logger that keeps track of the number of times a message appeared.
Definition: AliMUONLogger.h:29
Bool_t TryRecover() const
Returns the "try to recover from errors" flag.
static AliMpDDLStore * Instance(Bool_t warn=true)
AliMUONLogger * fLogger
! to log messages
Reconstructed Local Trigger object.
AliMUONVTriggerStore * fTriggerStore
! not owner
virtual void SetADC(Int_t adc)=0
Set the ADC value.
UChar_t GetGlobalOutput() const
Return global output.
AliMUONVDigitStore * fDigitStore
! not owner
virtual Bool_t IsErrorMessage() const
check error/Warning presence
tracker part had readout errors
virtual void SetPadXY(Int_t padx, Int_t pady)=0
Set the ix and iy of this digit.
AliMp::CathodType GetCathodType(Int_t cathodNumber)
Convert integer number in enum;.
Int_t GetLocalBoardId(Int_t i) const
Definition: AliMpPad.cxx:347
Light weight interface class to the regional card header data.
void SetMakeTrackerDigits(Bool_t flag=kTRUE)
Set flag whether or not we should generate digits for the tracker.
void SetReader(AliRawReader *reader)
Set the raw reader.
Bool_t IsValid() const
Return validity.
Definition: AliMpPad.h:89
virtual Int_t GetDDL() const
Return number of the current DDL being handled in the range [0..1] and -1 if no DDL set...
void GetYPattern(TArrayS &array) const
return Y pattern array
virtual void First()
Initialize iterator.
Int_t GetIx() const
Definition: AliMpPad.cxx:272
AliMp::CathodType GetCathodType(AliMp::PlaneType planeType) const
Bool_t fMakeTrackerDigits
! whether or not we should generate digits for the tracker
The abstract base class for the segmentation.
Global trigger object.
ABC of a MUON digit.
Definition: AliMUONVDigit.h:18
UInt_t fInput[4]
Global input. 8-bit words comming from the each of the 16 regional controlers.
Class which encapsuate all information about a pad.
Definition: AliMpPad.h:22
UInt_t GetRegionalHeaderCount() const
Return the number of regional structures in the DDL payload.
virtual Bool_t Add(TObject *object)
Add an object, if of the right type.
void SetTryRecover(Bool_t flag)
virtual void Clear(Option_t *opt="")=0
Clear ourselves (i.e. Reset)
virtual void EnabbleErrorLogger()
Enable error info logger.
Bool_t IsConnectedChannel(Int_t manuId, Int_t manuChannel) const
Bool_t TriggerToDigitsStore(const AliMUONVTriggerStore &triggerStore, AliMUONVDigitStore &digitStore) const
virtual AliMpPad PadByLocation(Int_t manuId, Int_t manuChannel, Bool_t warning=true) const =0
Find pad by location.
AliMUONDigitMaker(Bool_t enableErrorLogger, Bool_t a, Bool_t b)
Declaration of the high performance decoder for muon trigger chamber raw streams. ...
Int_t GetLocalBoardChannel(Int_t i) const
Definition: AliMpPad.cxx:358
trigger part had readout errors
Int_t LoCircuit() const
Return Circuit number.
virtual Bool_t Next(Int_t &busPatchId, UShort_t &manuId, UChar_t &manuChannel, UShort_t &adc)
Advance one step in the iteration. Returns false if finished.
Int_t GetInputXfrom() const
Get Id from where the X input are copied.
virtual Bool_t Add(TObject *object)
Add an object, if it is of the right class.
UInt_t GetLocalStructCount() const
Returns the number of local trigger structures within this regional structure.
Bool_t fScalerEvent
! flag to generates scaler event