#include "AliMUONLocalStruct.h"
#include "AliMUONLocalTrigger.h"
#include "AliMUONLogger.h"
-#include "AliMUONRawStreamTracker.h"
#include "AliMUONRawStreamTrackerHP.h"
-#include "AliMUONRawStreamTrigger.h"
#include "AliMUONRawStreamTriggerHP.h"
#include "AliMUONRegHeader.h"
-#include "AliMUONTriggerCircuit.h"
#include "AliMUONVTriggerStore.h"
+#include "AliMpCDB.h"
#include "AliMpDetElement.h"
#include "AliMpTriggerCrate.h"
#include "AliMpLocalBoard.h"
#include "AliRawReader.h"
#include <TArrayS.h>
+using std::endl;
+using std::cout;
/// \cond CLASSIMP
ClassImp(AliMUONDigitMaker) // Class implementation in ROOT context
/// \endcond
//__________________________________________________________________________
-AliMUONDigitMaker::AliMUONDigitMaker(
- Bool_t enableErrorLogger,
- Bool_t useFastTrackerDecoder, Bool_t useFastTriggerDecoder
- ) :
- TObject(),
+AliMUONDigitMaker::AliMUONDigitMaker(Bool_t enableErrorLogger, Bool_t a, Bool_t b) :
+TObject(),
+fScalerEvent(kFALSE),
+fMakeTriggerDigits(kFALSE),
+fRawStreamTracker(new AliMUONRawStreamTrackerHP),
+fRawStreamTrigger(new AliMUONRawStreamTriggerHP),
+fDigitStore(0x0),
+fTriggerStore(0x0),
+fLogger(new AliMUONLogger(10000)){
+ /// ctor
+
+ if ( !a || !b ) AliFatal("no longer supported");
+
+ AliDebug(1,"");
+
+ // Standard Constructor
+ if (enableErrorLogger)
+ {
+ fRawStreamTracker->EnabbleErrorLogger();
+ fRawStreamTrigger->EnabbleErrorLogger();
+ }
+ else
+ {
+ fRawStreamTracker->DisableWarnings();
+ }
+
+ SetMakeTriggerDigits();
+
+ // Load mapping
+ if ( ! AliMpCDB::LoadDDLStore() ) {
+ AliFatal("Could not access mapping from OCDB !");
+ }
+}
+
+//__________________________________________________________________________
+AliMUONDigitMaker::AliMUONDigitMaker(Bool_t enableErrorLogger) :
+TObject(),
fScalerEvent(kFALSE),
fMakeTriggerDigits(kFALSE),
- fRawStreamTracker(NULL),
- fRawStreamTrigger(NULL),
+ fRawStreamTracker(new AliMUONRawStreamTrackerHP),
+ fRawStreamTrigger(new AliMUONRawStreamTriggerHP),
fDigitStore(0x0),
fTriggerStore(0x0),
fLogger(new AliMUONLogger(10000))
AliDebug(1,"");
- CreateRawStreamTracker(useFastTrackerDecoder);
- CreateRawStreamTrigger(useFastTriggerDecoder);
-
// Standard Constructor
- if (enableErrorLogger) {
+ if (enableErrorLogger)
+ {
fRawStreamTracker->EnabbleErrorLogger();
fRawStreamTrigger->EnabbleErrorLogger();
}
+ else
+ {
+ fRawStreamTracker->DisableWarnings();
+ }
SetMakeTriggerDigits();
+ // Load mapping
+ if ( ! AliMpCDB::LoadDDLStore() ) {
+ AliFatal("Could not access mapping from OCDB !");
+ }
}
//__________________________________________________________________________
delete fLogger;
}
-//__________________________________________________________________________
-void AliMUONDigitMaker::CreateRawStreamTracker(Bool_t useFastDecoder)
-{
-/// Create raw stream tracker according to the passed option
-
- if (useFastDecoder)
- {
- fRawStreamTracker = new AliMUONRawStreamTrackerHP();
- }
- else {
- AliInfo("Using non-high performance tracker decoder.");
- fRawStreamTracker = new AliMUONRawStreamTracker();
- }
-}
-
-//__________________________________________________________________________
-void AliMUONDigitMaker::CreateRawStreamTrigger(Bool_t useFastDecoder)
-{
-/// Create raw stream trigger according to the passed option
-
- if (useFastDecoder)
- {
- fRawStreamTrigger = new AliMUONRawStreamTriggerHP();
- }
- else {
- AliInfo("Using non-high performance tracker decoder.");
- fRawStreamTrigger = new AliMUONRawStreamTrigger();
- }
-}
-
//____________________________________________________________________
void
AliMUONDigitMaker::Print(Option_t*) const
AliDebug(1,"");
- AliCodeTimerAuto("");
+ AliCodeTimerAuto("",0);
// elex info
Int_t buspatchId;
fRawStreamTracker->SetReader(rawReader);
fRawStreamTracker->First();
- while ( fRawStreamTracker->Next(buspatchId,manuId,channelId,charge) )
+ while ( fRawStreamTracker->Next(buspatchId,manuId,channelId,charge,kTRUE) )
{
// getting DE from buspatch
Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(buspatchId);
if (!de)
{
- fLogger->Log(Form("DE %04d does not exist !"));
+ fLogger->Log(Form("DE %04d does not exist !", detElemId));
continue;
}
AliMp::CathodType cathodeType = de->GetCathodType(seg->PlaneType());
- AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kFALSE);
+ AliMpPad pad = seg->PadByLocation(manuId,channelId,kFALSE);
if (!pad.IsValid())
{
continue;
}
- digit->SetPadXY(pad.GetIndices().GetFirst(),
- pad.GetIndices().GetSecond());
+ digit->SetPadXY(pad.GetIx(),pad.GetIy());
- digit->SetADC(charge);
+ digit->SetADC(charge);
}
//____________________________________________________________________
Int_t
AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
-{
- /// reading tracker DDL
- /// filling the fTriggerStore container, which must not be null
-
- AliDebug(1,"");
-
- AliMUONDDLTrigger* ddlTrigger = 0x0;
- AliMUONDarcHeader* darcHeader = 0x0;
- AliMUONRegHeader* regHeader = 0x0;
- AliMUONLocalStruct* localStruct = 0x0;
-
- Int_t loCircuit;
-
- AliCodeTimerAuto("");
-
- if (UsingFastTriggerDecoder()) return ReadTriggerDDLFast(rawReader);
-
- fRawStreamTrigger->SetReader(rawReader);
-
- while (fRawStreamTrigger->NextDDL())
- {
- ddlTrigger = fRawStreamTrigger->GetDDLTrigger();
- darcHeader = ddlTrigger->GetDarcHeader();
-
- // fill global trigger information
- if (fTriggerStore)
- {
- if (darcHeader->GetGlobalFlag())
- {
- AliMUONGlobalTrigger globalTrigger;
- globalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput());
- fTriggerStore->SetGlobal(globalTrigger);
- }
- }
-
- Int_t nReg = darcHeader->GetRegHeaderEntries();
-
- for(Int_t iReg = 0; iReg < nReg ;iReg++)
- { //reg loop
-
-
- // crate info
- AliMpTriggerCrate* crate = AliMpDDLStore::Instance()->
- GetTriggerCrate(fRawStreamTrigger->GetDDL(), iReg);
-
- if (!crate)
- fLogger->Log(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
-
-
- regHeader = darcHeader->GetRegHeaderEntry(iReg);
-
- Int_t nLocal = regHeader->GetLocalEntries();
- for(Int_t iLocal = 0; iLocal < nLocal; iLocal++)
- {
-
- localStruct = regHeader->GetLocalEntry(iLocal);
-
- // if card exist
- if (localStruct) {
-
- loCircuit = crate->GetLocalBoardId(localStruct->GetId());
-
- if ( !loCircuit ) continue; // empty slot
-
- AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(loCircuit, false);
-
- // skip copy cards
- if( !localBoard->IsNotified())
- continue;
-
- if (fTriggerStore)
- {
- // fill local trigger
- AliMUONLocalTrigger localTrigger;
- localTrigger.SetLocalStruct(loCircuit, *localStruct);
- fTriggerStore->Add(localTrigger);
- }
-
- if ( fMakeTriggerDigits )
- {
- //FIXEME should find something better than a TArray
- TArrayS xyPattern[2];
-
- localStruct->GetXPattern(xyPattern[0]);
- localStruct->GetYPattern(xyPattern[1]);
-
- TriggerDigits(loCircuit, xyPattern, *fDigitStore);
- }
- } // if triggerY
- } // iLocal
- } // iReg
- } // NextDDL
-
- return kOK;
-}
-
-//____________________________________________________________________
-Int_t
-AliMUONDigitMaker::ReadTriggerDDLFast(AliRawReader* rawReader)
{
/// reading tracker DDL like ReadTriggerDDL but with fast decoder interface.
/// filling the fTriggerStore container, which must not be null
Int_t loCircuit;
fRawStreamTrigger->SetReader(rawReader);
- AliMUONRawStreamTriggerHP* rawStreamTrigger =
- dynamic_cast<AliMUONRawStreamTriggerHP*>(fRawStreamTrigger);
while (fRawStreamTrigger->NextDDL())
{
- darcHeader = rawStreamTrigger->GetHeaders();
+ darcHeader = fRawStreamTrigger->GetHeaders();
// fill global trigger information
if (fTriggerStore)
{
AliMUONGlobalTrigger globalTrigger;
globalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput());
+ globalTrigger.SetFromGlobalInput(darcHeader->GetGlobalHeader()->fInput);
fTriggerStore->SetGlobal(globalTrigger);
}
}
- Int_t nReg = rawStreamTrigger->GetRegionalHeaderCount();
+ Int_t nReg = fRawStreamTrigger->GetRegionalHeaderCount();
for(Int_t iReg = 0; iReg < nReg ;iReg++)
{ //reg loop
AliMpTriggerCrate* crate = AliMpDDLStore::Instance()->
GetTriggerCrate(fRawStreamTrigger->GetDDL(), iReg);
- if (!crate)
+ if (!crate) {
fLogger->Log(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
-
+ continue;
+ }
- regHeader = rawStreamTrigger->GetRegionalHeader(iReg);
+ regHeader = fRawStreamTrigger->GetRegionalHeader(iReg);
Int_t nLocal = regHeader->GetLocalStructCount();
for(Int_t iLocal = 0; iLocal < nLocal; iLocal++)
// if card exist
if (localStruct) {
- loCircuit = crate->GetLocalBoardId(localStruct->GetId());
-
- if ( !loCircuit ) continue; // empty slot
-
- AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(loCircuit, kTRUE);
-
- // skip copy cards
- if( !localBoard->IsNotified())
- continue;
+ loCircuit = crate->GetLocalBoardId(localStruct->GetId());
+
+ if ( !loCircuit ) continue; // empty slot
+
if (fTriggerStore)
{
// fill local trigger
AliMUONLocalTrigger localTrigger;
- localTrigger.SetLoCircuit(loCircuit);
- localTrigger.SetLoStripX((Int_t)localStruct->GetXPos());
- localTrigger.SetLoStripY((Int_t)localStruct->GetYPos());
- localTrigger.SetLoDev((Int_t)localStruct->GetXDev());
- localTrigger.SetLoSdev((Int_t)localStruct->GetSXDev());
- localTrigger.SetLoTrigY((Int_t)localStruct->GetTrigY());
- localTrigger.SetLoLpt(localStruct->GetLpt());
- localTrigger.SetLoHpt(localStruct->GetHpt());
- localTrigger.SetX1Pattern(localStruct->GetX1());
- localTrigger.SetX2Pattern(localStruct->GetX2());
- localTrigger.SetX3Pattern(localStruct->GetX3());
- localTrigger.SetX4Pattern(localStruct->GetX4());
- localTrigger.SetY1Pattern(localStruct->GetY1());
- localTrigger.SetY2Pattern(localStruct->GetY2());
- localTrigger.SetY3Pattern(localStruct->GetY3());
- localTrigger.SetY4Pattern(localStruct->GetY4());
+ localTrigger.SetLocalStruct(loCircuit, *localStruct);
fTriggerStore->Add(localTrigger);
}
//FIXEME should find something better than a TArray
TArrayS xyPattern[2];
- localStruct->GetXPattern(xyPattern[0]);
- localStruct->GetYPattern(xyPattern[1]);
+ localStruct->GetXPattern(xyPattern[0]);
+ localStruct->GetYPattern(xyPattern[1]);
TriggerDigits(loCircuit, xyPattern, *fDigitStore);
}
//____________________________________________________________________
Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard,
- TArrayS* xyPattern,
- AliMUONVDigitStore& digitStore) const
+ const TArrayS* xyPattern,
+ AliMUONVDigitStore& digitStore, Bool_t warn) const
{
/// make digits for trigger from pattern, and add them to digitStore
- AliCodeTimerAuto("");
+ AliCodeTimerAuto("",0);
Int_t detElemId;
AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(nBoard);
+
+ if ( ! localBoard->IsNotified() ) {
+ // Copy board
+ // The mapping is not correct for copy boards
+ // Use the one of corresponding phyiscal board
+ nBoard = localBoard->GetInputXfrom();
+ }
Int_t n,b;
{
// not quite sure about this
Int_t offset = 0;
- if (iCath && localBoard->GetSwitch(6)) offset = -8;
+ if (iCath && localBoard->GetSwitch(AliMpLocalBoard::kZeroAllYLSB)) offset = -8;
- AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE);
+ AliMpPad pad = seg->PadByLocation(nBoard,ibitxy+offset,warn);
if (!pad.IsValid())
{
continue;
}
- n = pad.GetLocation(0).GetFirst(); // always take first location so that digits are not inserted several times
- b = pad.GetLocation(0).GetSecond();
+ n = pad.GetLocalBoardId(0); // always take first location so that digits are not inserted several times
+ b = pad.GetLocalBoardChannel(0);
AliDebug(1,Form("Using localBoard %d ixy %d instead of %d,%d",
n,b,nBoard,ibitxy));
continue;
}
- Int_t padX = pad.GetIndices().GetFirst();
- Int_t padY = pad.GetIndices().GetSecond();
+ Int_t padX = pad.GetIx();
+ Int_t padY = pad.GetIy();
// fill digit
digit->SetPadXY(padX,padY);
return kTRUE;
}
-//____________________________________________________________________
-Bool_t AliMUONDigitMaker::UsingFastTrackerDecoder() const
-{
-/// Returns kTRUE if the digit maker is using the high performance decoder for
-/// tracker DDL stream decoding.
-
- return (fRawStreamTracker->IsA() == AliMUONRawStreamTrackerHP::Class());
-}
-
-//____________________________________________________________________
-Bool_t AliMUONDigitMaker::UsingFastTriggerDecoder() const
-{
-/// Returns kTRUE if the digit maker is using the high performance decoder for
-/// trigger DDL stream decoding.
-
- return (fRawStreamTrigger->IsA() == AliMUONRawStreamTriggerHP::Class());
-}
-
-//____________________________________________________________________
-void AliMUONDigitMaker::SetFastTrackerDecoder(Bool_t useFastDecoder)
-{
-/// Set fast raw data decoder
-
- delete fRawStreamTracker;
- CreateRawStreamTracker(useFastDecoder);
-}
-
-//____________________________________________________________________
-void AliMUONDigitMaker::SetFastTriggerDecoder(Bool_t useFastDecoder)
+//______________________________________________________________________________
+void
+AliMUONDigitMaker::SetTryRecover(Bool_t flag)
{
-/// Set fast raw data decoder
-
- delete fRawStreamTrigger;
- CreateRawStreamTrigger(useFastDecoder);
+ /// Instruct the decoder to try to recover corrupted raw data.
+ /// Only use for specific cases for which you know it will work...
+ fRawStreamTracker->TryRecover(flag);
}
-