* provided "as is" without express or implied warranty. *
**************************************************************************/
+// $Id$
+
+//-----------------------------------------------------------------------------
/// \class AliMUONDigitMaker
/// MUON Digit maker from rawdata.
///
/// and for trigger. Create trigger inverse mapping.
///
/// \author Ch. Finck, oct 06
+//-----------------------------------------------------------------------------
#include "AliMUONDigitMaker.h"
-#include "AliLog.h"
#include "AliMUONDDLTrigger.h"
#include "AliMUONDarcHeader.h"
#include "AliMUONVDigit.h"
#include "AliMUONGlobalTrigger.h"
#include "AliMUONLocalStruct.h"
#include "AliMUONLocalTrigger.h"
-#include "AliMUONLocalTriggerBoard.h"
+#include "AliMUONLogger.h"
#include "AliMUONRawStreamTracker.h"
+#include "AliMUONRawStreamTrackerHP.h"
#include "AliMUONRawStreamTrigger.h"
+#include "AliMUONRawStreamTriggerHP.h"
#include "AliMUONRegHeader.h"
#include "AliMUONTriggerCircuit.h"
-#include "AliMUONTriggerCrate.h"
-#include "AliMUONTriggerCrateStore.h"
#include "AliMUONVTriggerStore.h"
+#include "AliMpDetElement.h"
+#include "AliMpTriggerCrate.h"
+#include "AliMpLocalBoard.h"
#include "AliMpCathodType.h"
#include "AliMpDDLStore.h"
#include "AliMpDEManager.h"
#include "AliMpPad.h"
#include "AliMpSegmentation.h"
#include "AliMpVSegmentation.h"
+#include "AliCodeTimer.h"
+#include "AliLog.h"
#include "AliRawReader.h"
#include <TArrayS.h>
/// \endcond
//__________________________________________________________________________
-AliMUONDigitMaker::AliMUONDigitMaker()
- : TObject(),
+AliMUONDigitMaker::AliMUONDigitMaker(
+ Bool_t enableErrorLogger,
+ Bool_t useFastTrackerDecoder, Bool_t useFastTriggerDecoder
+ ) :
+ TObject(),
fScalerEvent(kFALSE),
fMakeTriggerDigits(kFALSE),
- fRawStreamTracker(new AliMUONRawStreamTracker()),
- fRawStreamTrigger(new AliMUONRawStreamTrigger()),
- fCrateManager(0x0),
- fTrackerTimer(),
- fTriggerTimer(),
- fMappingTimer(),
+ fRawStreamTracker(NULL),
+ fRawStreamTrigger(NULL),
fDigitStore(0x0),
- fTriggerStore(0x0)
+ fTriggerStore(0x0),
+ fLogger(new AliMUONLogger(10000))
{
/// ctor
AliDebug(1,"");
+
+ CreateRawStreamTracker(useFastTrackerDecoder);
+ CreateRawStreamTrigger(useFastTriggerDecoder);
// Standard Constructor
+ if (enableErrorLogger) {
+ fRawStreamTracker->EnabbleErrorLogger();
+ fRawStreamTrigger->EnabbleErrorLogger();
+ }
- fTrackerTimer.Start(kTRUE); fTrackerTimer.Stop();
- fTriggerTimer.Start(kTRUE); fTriggerTimer.Stop();
- fMappingTimer.Start(kTRUE); fMappingTimer.Stop();
-
SetMakeTriggerDigits();
}
delete fRawStreamTracker;
delete fRawStreamTrigger;
+ delete fLogger;
+}
- AliDebug(1, Form("Execution time for MUON tracker : R:%.2fs C:%.2fs",
- fTrackerTimer.RealTime(),fTrackerTimer.CpuTime()));
- AliDebug(1, Form(" Execution time for MUON tracker (mapping calls part) "
- ": R:%.2fs C:%.2fs",
- fMappingTimer.RealTime(),fMappingTimer.CpuTime()));
- AliDebug(1, Form("Execution time for MUON trigger : R:%.2fs C:%.2fs",
- fTriggerTimer.RealTime(),fTriggerTimer.CpuTime()));
+//__________________________________________________________________________
+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();
+ }
}
//____________________________________________________________________
-Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader,
- AliMUONVDigitStore* digitStore,
- AliMUONVTriggerStore* triggerStore)
+void
+AliMUONDigitMaker::Print(Option_t*) const
+{
+ /// Printout
+
+ cout << "RawStreamerTracker class=" << fRawStreamTracker->ClassName()
+ << " MakeTriggerDigits=" << fMakeTriggerDigits
+ << " ScalerEvent=" << fScalerEvent
+ << " DigitStore=" << fDigitStore
+ << " TriggerStore=" << fTriggerStore << endl;
+
+ if ( fLogger ) fLogger->Print();
+}
+
+//____________________________________________________________________
+Int_t
+AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader,
+ AliMUONVDigitStore* digitStore,
+ AliMUONVTriggerStore* triggerStore)
{
/// Main method to creates digit
/// for tracker
if (!fDigitStore && !fTriggerStore)
{
- AliError("No digit or trigger store given. Nothing to do...");
- return kFALSE;
+ fLogger->Log("No digit or trigger store given. Nothing to do...");
+ return kTriggerBAD & kTrackerBAD;
}
+ Int_t tracker(kOK);
+ Int_t trigger(kOK);
+
if ( fDigitStore )
{
fDigitStore->Clear(); // insure we start with an empty container
- ReadTrackerDDL(rawReader);
+ tracker = ReadTrackerDDL(rawReader);
}
if ( fTriggerStore || fMakeTriggerDigits )
if ( fTriggerStore ) fTriggerStore->Clear();
if ( fMakeTriggerDigits && !fDigitStore )
{
- AliError("Asking for trigger digits but digitStore is null");
+ fLogger->Log("Asking for trigger digits but digitStore is null");
}
else
{
- ReadTriggerDDL(rawReader);
+ trigger = ReadTriggerDDL(rawReader);
}
}
- return kTRUE;
+ return tracker | trigger;
}
//____________________________________________________________________
-Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
+Int_t
+AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
{
/// Reading tracker DDL
/// filling the fDigitStore container, which must not be null
AliDebug(1,"");
- fTrackerTimer.Start(kFALSE);
+ AliCodeTimerAuto("");
// elex info
Int_t buspatchId;
// getting DE from buspatch
Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(buspatchId);
+ AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
+
+ if (!de)
+ {
+ fLogger->Log(Form("DE %04d does not exist !"));
+ continue;
+ }
+
+ if (!de->IsConnectedChannel(manuId,channelId))
+ {
+ // non connected pad, do nothing (this is not an error !)
+ continue;
+ }
+
const AliMpVSegmentation* seg
= AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,
manuId);
- AliMp::CathodType cathodeType = AliMpDEManager::GetCathod(detElemId,
- seg->PlaneType());
+ if (!seg)
+ {
+ fLogger->Log(Form("(DE,MANUID)=(%04d,%04d) is not valid",detElemId,manuId));
+ continue;
+ }
+
+ AliMp::CathodType cathodeType = de->GetCathodType(seg->PlaneType());
AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kFALSE);
-
+
if (!pad.IsValid())
{
- AliError(Form("No pad for detElemId: %d, manuId: %d, channelId: %d",
+ fLogger->Log(Form("No pad for detElemId: %d, manuId: %d, channelId: %d",
detElemId, manuId, channelId));
continue;
}
-
+
AliMUONVDigit* digit = fDigitStore->Add(detElemId,manuId,channelId,cathodeType,
AliMUONVDigitStore::kDeny);
+
if (!digit)
{
- AliError(Form("Digit DE %04d Manu %04d Channel %02d could not be added",
+ fLogger->Log(Form("Digit DE %04d Manu %04d Channel %02d could not be added",
detElemId, manuId, channelId));
continue;
}
}
- fTrackerTimer.Stop();
-
- return kTRUE;
+ if ( fRawStreamTracker->IsErrorMessage() )
+ {
+ return kTrackerBAD;
+ }
+
+ return kOK;
}
//____________________________________________________________________
-Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
+Int_t
+AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
{
/// reading tracker DDL
/// filling the fTriggerStore container, which must not be null
Int_t loCircuit;
- fTriggerTimer.Start(kFALSE);
+ AliCodeTimerAuto("");
+
+ if (UsingFastTriggerDecoder()) return ReadTriggerDDLFast(rawReader);
fRawStreamTrigger->SetReader(rawReader);
for(Int_t iReg = 0; iReg < nReg ;iReg++)
{ //reg loop
- // crate info
- if (!fCrateManager) AliFatal("Crate Store not defined");
- AliMUONTriggerCrate* crate = fCrateManager->Crate(fRawStreamTrigger->GetDDL(), iReg);
+
+ // crate info
+ AliMpTriggerCrate* crate = AliMpDDLStore::Instance()->
+ GetTriggerCrate(fRawStreamTrigger->GetDDL(), iReg);
if (!crate)
- AliWarning(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
-
- TObjArray *boards = crate->Boards();
+ fLogger->Log(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
+
regHeader = darcHeader->GetRegHeaderEntry(iReg);
// if card exist
if (localStruct) {
- AliMUONLocalTriggerBoard* localBoard =
- (AliMUONLocalTriggerBoard*)boards->At(localStruct->GetId()+1);
-
- // skip copy cards
- if( !(loCircuit = localBoard->GetNumber()) )
- continue;
+ 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)
{
{
//FIXEME should find something better than a TArray
TArrayS xyPattern[2];
- xyPattern[0].Set(4);
- xyPattern[1].Set(4);
-
- xyPattern[0].AddAt(localStruct->GetX1(),0);
- xyPattern[0].AddAt(localStruct->GetX2(),1);
- xyPattern[0].AddAt(localStruct->GetX3(),2);
- xyPattern[0].AddAt(localStruct->GetX4(),3);
- xyPattern[1].AddAt(localStruct->GetY1(),0);
- xyPattern[1].AddAt(localStruct->GetY2(),1);
- xyPattern[1].AddAt(localStruct->GetY3(),2);
- xyPattern[1].AddAt(localStruct->GetY4(),3);
+ localStruct->GetXPattern(xyPattern[0]);
+ localStruct->GetYPattern(xyPattern[1]);
TriggerDigits(loCircuit, xyPattern, *fDigitStore);
}
} // iReg
} // NextDDL
- fTriggerTimer.Stop();
+ return kOK;
+}
- return kTRUE;
+//____________________________________________________________________
+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
+
+ const AliMUONRawStreamTriggerHP::AliHeader* darcHeader = 0x0;
+ const AliMUONRawStreamTriggerHP::AliRegionalHeader* regHeader = 0x0;
+ const AliMUONRawStreamTriggerHP::AliLocalStruct* localStruct = 0x0;
+
+ Int_t loCircuit;
+
+ fRawStreamTrigger->SetReader(rawReader);
+ AliMUONRawStreamTriggerHP* rawStreamTrigger =
+ dynamic_cast<AliMUONRawStreamTriggerHP*>(fRawStreamTrigger);
+ while (fRawStreamTrigger->NextDDL())
+ {
+ darcHeader = rawStreamTrigger->GetHeaders();
+
+ // fill global trigger information
+ if (fTriggerStore)
+ {
+ if (darcHeader->GetGlobalFlag())
+ {
+ AliMUONGlobalTrigger globalTrigger;
+ globalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput());
+ fTriggerStore->SetGlobal(globalTrigger);
+ }
+ }
+
+ Int_t nReg = rawStreamTrigger->GetRegionalHeaderCount();
+
+ 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 = rawStreamTrigger->GetRegionalHeader(iReg);
+
+ Int_t nLocal = regHeader->GetLocalStructCount();
+ for(Int_t iLocal = 0; iLocal < nLocal; iLocal++)
+ {
+
+ localStruct = regHeader->GetLocalStruct(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;
+
+ 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());
+ 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;
}
//____________________________________________________________________
{
/// make digits for trigger from pattern, and add them to digitStore
+ AliCodeTimerAuto("");
+
+ Int_t detElemId;
+
+ AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(nBoard);
+
+ Int_t n,b;
+
// loop over x1-4 and y1-4
for (Int_t iChamber = 0; iChamber < 4; ++iChamber)
{
if (!pattern) continue;
// get detElemId
- AliMUONTriggerCircuit triggerCircuit;
- AliMUONLocalTriggerBoard* localBoard = fCrateManager->LocalBoard(nBoard);
- Int_t detElemId = triggerCircuit.DetElemId(iChamber+10, localBoard->GetName());//FIXME +/-10 (should be ok with new mapping)
+ detElemId = AliMpDDLStore::Instance()->GetDEfromLocalBoard(nBoard, iChamber);
const AliMpVSegmentation* seg
= AliMpSegmentation::Instance()
if (!pad.IsValid())
{
- AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
+ fLogger->Log(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
detElemId, nBoard, ibitxy));
continue;
}
-
- AliMUONVDigit* digit = digitStore.Add(detElemId,nBoard,ibitxy,iCath,AliMUONVDigitStore::kDeny);
+
+ n = pad.GetLocation(0).GetFirst(); // always take first location so that digits are not inserted several times
+ b = pad.GetLocation(0).GetSecond();
+
+ AliDebug(1,Form("Using localBoard %d ixy %d instead of %d,%d",
+ n,b,nBoard,ibitxy));
+
+ AliMUONVDigit* digit = digitStore.Add(detElemId,n,b,iCath,AliMUONVDigitStore::kDeny);
if (!digit)
{
- AliError(Form("Could not add digit DE %04d LocalBoard %03d ibitxy %02d cath %d",
- detElemId,nBoard,ibitxy,iCath));
- continue;
+ AliDebug(1, Form("Digit DE %04d LocalBoard %03d ibitxy %02d cath %d already in store",
+ detElemId,nBoard,ibitxy,iCath));
+ continue;
}
Int_t padX = pad.GetIndices().GetFirst();
} // ichamber
return kTRUE;
-}
+}
+
//____________________________________________________________________
-void
-AliMUONDigitMaker::GetCrateName(Char_t* name, Int_t iDDL, Int_t iReg) const
+Bool_t AliMUONDigitMaker::UsingFastTrackerDecoder() const
{
- /// set crate name from DDL & reg number
- /// method same as in RawWriter, not so nice
- /// should be put in AliMUONTriggerCrateStore
-
- switch(iReg) {
- case 0:
- case 1:
- sprintf(name,"%d", iReg+1);
- break;
- case 2:
- strcpy(name, "2-3");
- break;
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- sprintf(name,"%d", iReg);
- break;
- }
+/// Returns kTRUE if the digit maker is using the high performance decoder for
+/// tracker DDL stream decoding.
- // crate Right for first DDL
- if (iDDL == 0)
- strcat(name, "R");
- else
- strcat(name, "L");
+ 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)
+{
+/// Set fast raw data decoder
+
+ delete fRawStreamTrigger;
+ CreateRawStreamTrigger(useFastDecoder);
+}
+