X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONDigitMaker.cxx;h=5bc70b373b69062f0a485d318c53628414959876;hb=296ee45877b9434095f1349a34d4a28fa7a1615f;hp=97b2e9b325efa0080150b61c86886a9e34dbb70a;hpb=1bc885f3c2ee669f44c679b478ee67bd3e1b5b9a;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONDigitMaker.cxx b/MUON/AliMUONDigitMaker.cxx index 97b2e9b325e..5bc70b373b6 100644 --- a/MUON/AliMUONDigitMaker.cxx +++ b/MUON/AliMUONDigitMaker.cxx @@ -13,6 +13,9 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +// $Id$ + +//----------------------------------------------------------------------------- /// \class AliMUONDigitMaker /// MUON Digit maker from rawdata. /// @@ -37,80 +40,100 @@ /// and for trigger. Create trigger inverse mapping. /// /// \author Ch. Finck, oct 06 +//----------------------------------------------------------------------------- #include "AliMUONDigitMaker.h" -#include "AliMUONDigit.h" - -#include "AliMUONConstants.h" -#include "AliMUONData.h" - -#include "AliMUONRawStreamTracker.h" -#include "AliMUONDDLTracker.h" -#include "AliMUONDspHeader.h" -#include "AliMUONBlockHeader.h" -#include "AliMUONBusStruct.h" -#include "AliMUONRawStreamTrigger.h" #include "AliMUONDDLTrigger.h" #include "AliMUONDarcHeader.h" -#include "AliMUONRegHeader.h" +#include "AliMUONVDigit.h" +#include "AliMUONVDigitStore.h" +#include "AliMUONGlobalTrigger.h" #include "AliMUONLocalStruct.h" - -#include "AliMUONTriggerCrateStore.h" -#include "AliMUONTriggerCrate.h" -#include "AliMUONLocalTriggerBoard.h" #include "AliMUONLocalTrigger.h" -#include "AliMUONGlobalTrigger.h" +#include "AliMUONLogger.h" +#include "AliMUONRawStreamTrackerHP.h" +#include "AliMUONRawStreamTriggerHP.h" +#include "AliMUONRegHeader.h" #include "AliMUONTriggerCircuit.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 "AliMpPad.h" -#include "AliMpDEManager.h" -#include "AliMpDDLStore.h" -#include "AliMpCathodType.h" - -#include "AliRawReader.h" -#include "AliRawDataHeader.h" +#include "AliCodeTimer.h" #include "AliLog.h" -#include "AliRun.h" - -#include +#include "AliRawReader.h" #include - /// \cond CLASSIMP ClassImp(AliMUONDigitMaker) // Class implementation in ROOT context /// \endcond //__________________________________________________________________________ -AliMUONDigitMaker::AliMUONDigitMaker(Bool_t flag) - : TObject(), - fMUONData(0x0), +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(); + +} + +//__________________________________________________________________________ +AliMUONDigitMaker::AliMUONDigitMaker(Bool_t enableErrorLogger) : +TObject(), fScalerEvent(kFALSE), - fDigitFlag(flag), - fTriggerFlag(kTRUE), - fDisplayFlag(kFALSE), - fRawStreamTracker(new AliMUONRawStreamTracker()), - fRawStreamTrigger(new AliMUONRawStreamTrigger()), - fDigit(new AliMUONDigit()), - fLocalTrigger(new AliMUONLocalTrigger()), - fGlobalTrigger(new AliMUONGlobalTrigger()), - fCrateManager(0x0), - fTrackerTimer(), - fTriggerTimer(), - fMappingTimer() + fMakeTriggerDigits(kFALSE), + fRawStreamTracker(new AliMUONRawStreamTrackerHP), + fRawStreamTrigger(new AliMUONRawStreamTriggerHP), + fDigitStore(0x0), + fTriggerStore(0x0), + fLogger(new AliMUONLogger(10000)) { - /// ctor with AliMUONData as argument - /// for reconstruction + /// ctor AliDebug(1,""); - + // Standard Constructor + if (enableErrorLogger) + { + fRawStreamTracker->EnabbleErrorLogger(); + fRawStreamTrigger->EnabbleErrorLogger(); + } + else + { + fRawStreamTracker->DisableWarnings(); + } - fTrackerTimer.Start(kTRUE); fTrackerTimer.Stop(); - fTriggerTimer.Start(kTRUE); fTriggerTimer.Stop(); - fMappingTimer.Start(kTRUE); fMappingTimer.Stop(); + SetMakeTriggerDigits(); } @@ -122,50 +145,81 @@ AliMUONDigitMaker::~AliMUONDigitMaker() delete fRawStreamTracker; delete fRawStreamTrigger; + delete fLogger; +} - delete fDigit; - delete fLocalTrigger; - delete fGlobalTrigger; +//____________________________________________________________________ +void +AliMUONDigitMaker::Print(Option_t*) const +{ + /// Printout - 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())); + cout << "RawStreamerTracker class=" << fRawStreamTracker->ClassName() + << " MakeTriggerDigits=" << fMakeTriggerDigits + << " ScalerEvent=" << fScalerEvent + << " DigitStore=" << fDigitStore + << " TriggerStore=" << fTriggerStore << endl; - return; + if ( fLogger ) fLogger->Print(); } //____________________________________________________________________ -Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader) +Int_t +AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader, + AliMUONVDigitStore* digitStore, + AliMUONVTriggerStore* triggerStore) { /// Main method to creates digit /// for tracker /// and trigger - // generate digits - ReadTrackerDDL(rawReader); - - // generate trigger - if( fTriggerFlag) - ReadTriggerDDL(rawReader); - else - AliInfo("Reading trigger rawdata disable"); - - return kTRUE; - + AliDebug(1,Form("rawReader=%p digitStore=%p triggerStore=%p", + rawReader,digitStore,triggerStore)); + + fDigitStore = digitStore; + fTriggerStore = triggerStore; + + if (!fDigitStore && !fTriggerStore) + { + 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 + tracker = ReadTrackerDDL(rawReader); + } + + if ( fTriggerStore || fMakeTriggerDigits ) + { + if ( fTriggerStore ) fTriggerStore->Clear(); + if ( fMakeTriggerDigits && !fDigitStore ) + { + fLogger->Log("Asking for trigger digits but digitStore is null"); + } + else + { + trigger = ReadTriggerDDL(rawReader); + } + } + + 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 - /// reading tracker DDL - /// filling the TClonesArray in MUONData - - fTrackerTimer.Start(kFALSE); + AliDebug(1,""); + + AliCodeTimerAuto(""); // elex info Int_t buspatchId; @@ -173,324 +227,281 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader) UShort_t manuId; UShort_t charge; - Int_t iChamber; - fRawStreamTracker->SetReader(rawReader); fRawStreamTracker->First(); - while ( fRawStreamTracker->Next(buspatchId,manuId,channelId,charge) ) + while ( fRawStreamTracker->Next(buspatchId,manuId,channelId,charge,kTRUE) ) { - fDigit->SetSignal(charge); - fDigit->SetPhysicsSignal(charge); - fDigit->SetADC(charge); + // getting DE from buspatch + Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(buspatchId); - // Get Back the hits at pads - Int_t error = GetMapping(buspatchId,manuId,channelId,fDigit); - if (error) - { - AliWarning("Mapping Error\n"); - continue; - } - - // debugging - if (AliLog::GetGlobalDebugLevel() == 3) - { - Int_t padX = fDigit->PadX(); - Int_t padY = fDigit->PadY(); - Int_t iCath = fDigit->Cathode(); - Int_t idDE = fDigit->DetElemId(); - - AliDebug(1,Form("output IdDE %d busPatchid %d PadX %d PadY %d iCath %d \n", - idDE, buspatchId, padX, padY, iCath)); - - AliDebug(3,Form("idDE %d Padx %d Pady %d, Cath %d, charge %d", - idDE, padX, padY, iCath, charge)); - } - - // fill digits - iChamber = AliMpDEManager::GetChamberId(fDigit->DetElemId()); - - if (fDigitFlag || fDisplayFlag) + AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId); + + if (!de) { - fMUONData->AddDigit(iChamber, *fDigit); + fLogger->Log(Form("DE %04d does not exist !")); + continue; } - else + + if (!de->IsConnectedChannel(manuId,channelId)) { - fMUONData->AddSDigit(iChamber, *fDigit); + // non connected pad, do nothing (this is not an error !) + continue; } - } - - fTrackerTimer.Stop(); - return kTRUE; -} + const AliMpVSegmentation* seg + = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, + manuId); -//____________________________________________________________________ -Int_t AliMUONDigitMaker::GetMapping(Int_t busPatchId, UShort_t manuId, - UChar_t channelId, AliMUONDigit* digit ) -{ - /// mapping for tracker + if (!seg) + { + fLogger->Log(Form("(DE,MANUID)=(%04d,%04d) is not valid",detElemId,manuId)); + continue; + } + + AliMp::CathodType cathodeType = de->GetCathodType(seg->PlaneType()); - fMappingTimer.Start(kFALSE); - - // getting DE from buspatch - Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(busPatchId); - AliDebug(3,Form("detElemId: %d busPatchId %d\n", detElemId, busPatchId)); + AliMpPad pad = seg->PadByLocation(manuId,channelId,kFALSE); - const AliMpVSegmentation* seg - = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, manuId); - AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kTRUE); + if (!pad.IsValid()) + { + fLogger->Log(Form("No pad for detElemId: %d, manuId: %d, channelId: %d", + detElemId, manuId, channelId)); + continue; + } - if (!pad.IsValid()) - { - AliWarning(Form("No pad for detElemId: %d, busPatchId %d, manuId: %d, channelId: %d\n", - detElemId, busPatchId, manuId, channelId)); - fMappingTimer.Stop(); - return kTRUE; - } // return error - - // Getting padX, padY and cathode number. - Int_t padX = pad.GetIndices().GetFirst(); - Int_t padY = pad.GetIndices().GetSecond(); - Int_t iCath = AliMpDEManager::GetCathod(detElemId,seg->PlaneType()); - - // storing into digits - digit->SetPadX(padX); - digit->SetPadY(padY); - digit->SetCathode(iCath); - digit->SetDetElemId(detElemId); - digit->SetElectronics(manuId,channelId); + AliMUONVDigit* digit = fDigitStore->Add(detElemId,manuId,channelId,cathodeType, + AliMUONVDigitStore::kDeny); + + if (!digit) + { + fLogger->Log(Form("Digit DE %04d Manu %04d Channel %02d could not be added", + detElemId, manuId, channelId)); + continue; + } + + digit->SetPadXY(pad.GetIx(),pad.GetIy()); + + digit->SetADC(charge); + + } - AliDebug(3,Form("detElemId: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d\n", - detElemId, busPatchId, manuId, channelId, padX, padY)); -// StdoutToAliDebug(3,digit->Print();); + if ( fRawStreamTracker->IsErrorMessage() ) + { + return kTrackerBAD; + } - fMappingTimer.Stop(); - return kFALSE; + return kOK; } //____________________________________________________________________ -Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader) +Int_t +AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader) { - /// reading tracker DDL - /// filling the TClonesArray in MUONData + /// reading tracker DDL like ReadTriggerDDL but with fast decoder interface. + /// filling the fTriggerStore container, which must not be null - AliMUONDDLTrigger* ddlTrigger = 0x0; - AliMUONDarcHeader* darcHeader = 0x0; - AliMUONRegHeader* regHeader = 0x0; - AliMUONLocalStruct* localStruct = 0x0; + const AliMUONRawStreamTriggerHP::AliHeader* darcHeader = 0x0; + const AliMUONRawStreamTriggerHP::AliRegionalHeader* regHeader = 0x0; + const AliMUONRawStreamTriggerHP::AliLocalStruct* localStruct = 0x0; Int_t loCircuit; - TList digitList; - - fTriggerTimer.Start(kFALSE); fRawStreamTrigger->SetReader(rawReader); - while(fRawStreamTrigger->NextDDL()) { + while (fRawStreamTrigger->NextDDL()) + { + darcHeader = fRawStreamTrigger->GetHeaders(); - ddlTrigger = fRawStreamTrigger->GetDDLTrigger(); - darcHeader = ddlTrigger->GetDarcHeader(); - - // fill global trigger information in Digit Tree - if (fDigitFlag) { - if (darcHeader->GetGlobalFlag()) { - if (!fDisplayFlag) { - fGlobalTrigger->SetFromGlobalResponse(darcHeader->GetGlobalOutput()); - fMUONData->AddGlobalTrigger(*fGlobalTrigger); - } + // fill global trigger information + if (fTriggerStore) + { + if (darcHeader->GetGlobalFlag()) + { + AliMUONGlobalTrigger globalTrigger; + globalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput()); + globalTrigger.SetFromGlobalInput(darcHeader->GetGlobalHeader()->fInput); + fTriggerStore->SetGlobal(globalTrigger); } } - - Int_t nReg = darcHeader->GetRegHeaderEntries(); - - 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); - + + Int_t nReg = fRawStreamTrigger->GetRegionalHeaderCount(); + + for(Int_t iReg = 0; iReg < nReg ;iReg++) + { //reg loop + + + // 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(); - - regHeader = darcHeader->GetRegHeaderEntry(iReg); - - Int_t nLocal = regHeader->GetLocalEntries(); - for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) { - - localStruct = regHeader->GetLocalEntry(iLocal); + fLogger->Log(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL())); + + + regHeader = fRawStreamTrigger->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 card exist - if (localStruct) { + if ( !loCircuit ) continue; // empty slot - AliMUONLocalTriggerBoard* localBoard = - (AliMUONLocalTriggerBoard*)boards->At(localStruct->GetId()+1); + AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(loCircuit, kTRUE); // skip copy cards - if( !(loCircuit = localBoard->GetNumber()) ) + if( !localBoard->IsNotified()) continue; - - if (fDigitFlag) { - // fill local trigger - fLocalTrigger->SetLocalStruct(loCircuit, *localStruct); - fMUONData->AddLocalTrigger(*fLocalTrigger); - - } else { - // Make SDigit - - digitList.Clear(); - //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); - - if( TriggerDigits(loCircuit, xyPattern, digitList) ) { - - for (Int_t iEntry = 0; iEntry < digitList.GetEntries(); iEntry++) { - - AliMUONDigit* digit = (AliMUONDigit*)digitList.At(iEntry); - - // filling S container - Int_t iChamber = AliMpDEManager::GetChamberId(digit->DetElemId()); - if (!fDisplayFlag) { - fMUONData->AddSDigit(iChamber, *digit); - } else { - fMUONData->AddDigit(iChamber, *digit); - } - - } - - } // trigger digits - } // S flag - - } // if triggerY + + 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 - - fTriggerTimer.Stop(); - - return kTRUE; - + + return kOK; } //____________________________________________________________________ Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard, - TArrayS* xyPattern, - TList& digitList) + TArrayS* xyPattern, + AliMUONVDigitStore& digitStore) const { - /// make (S)Digit for trigger + /// make digits for trigger from pattern, and add them to digitStore + AliCodeTimerAuto(""); + Int_t detElemId; - Int_t previousDetElemId[4] = {0}; - Int_t previousBoard[4] = {0}; + + 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){ - for(Int_t iCath = 0; iCath < 2; ++iCath){ - + for (Int_t iChamber = 0; iChamber < 4; ++iChamber) + { + for (Int_t iCath = 0; iCath < 2; ++iCath) + { Int_t pattern = (Int_t)xyPattern[iCath].At(iChamber); if (!pattern) continue; - + // get detElemId - AliMUONTriggerCircuit triggerCircuit; - AliMUONLocalTriggerBoard* localBoard = fCrateManager->LocalBoard(nBoard); - detElemId = triggerCircuit.DetElemId(iChamber+10, localBoard->GetName());//FIXME +/-10 (should be ok with new mapping) - - - if(iCath == 1){ // FIXME should find a more elegant way - // Don't save twice the same digit - // (since strips in non bending plane can cross several boards) - Int_t prevDetElemId = previousDetElemId[iChamber]; - Int_t prevBoard = previousBoard[iChamber]; - previousDetElemId[iChamber] = detElemId; - previousBoard[iChamber] = nBoard; - - if(detElemId == prevDetElemId){ - if(nBoard-prevBoard==1) continue; - } - } - - const AliMpVSegmentation* seg - = AliMpSegmentation::Instance() - ->GetMpSegmentation(detElemId, AliMp::GetCathodType(iCath)); - - // loop over the 16 bits of pattern - for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) { - - if ((pattern >> ibitxy) & 0x1) { - - // not quite sure about this - Int_t offset = 0; - if (iCath && localBoard->GetSwitch(6)) offset = -8; - - AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE); - - AliMUONDigit* digit = new AliMUONDigit(); - if (!pad.IsValid()) { - AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n", - detElemId, nBoard, ibitxy)); - continue; - } // - - Int_t padX = pad.GetIndices().GetFirst(); - Int_t padY = pad.GetIndices().GetSecond(); - - // file digit - digit->SetPadX(padX); - digit->SetPadY(padY); - digit->SetSignal(1.); - digit->SetCathode(iCath); - digit->SetDetElemId(detElemId); - digit->SetElectronics(nBoard, ibitxy); - digitList.Add(digit); - - }// xyPattern - }// ibitxy + detElemId = AliMpDDLStore::Instance()->GetDEfromLocalBoard(nBoard, iChamber); + + const AliMpVSegmentation* seg + = AliMpSegmentation::Instance() + ->GetMpSegmentation(detElemId, AliMp::GetCathodType(iCath)); + + // loop over the 16 bits of pattern + for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) + { + if ((pattern >> ibitxy) & 0x1) + { + // not quite sure about this + Int_t offset = 0; + if (iCath && localBoard->GetSwitch(6)) offset = -8; + + AliMpPad pad = seg->PadByLocation(nBoard,ibitxy+offset,kTRUE); + + if (!pad.IsValid()) + { + fLogger->Log(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n", + detElemId, nBoard, ibitxy)); + continue; + } + + 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)); + + AliMUONVDigit* digit = digitStore.Add(detElemId,n,b,iCath,AliMUONVDigitStore::kDeny); + + if (!digit) + { + AliDebug(1, Form("Digit DE %04d LocalBoard %03d ibitxy %02d cath %d already in store", + detElemId,nBoard,ibitxy,iCath)); + continue; + } + + Int_t padX = pad.GetIx(); + Int_t padY = pad.GetIy(); + + // fill digit + digit->SetPadXY(padX,padY); + digit->SetCharge(1.); + }// xyPattern + }// ibitxy }// cath } // ichamber - + return kTRUE; -} -//____________________________________________________________________ -void AliMUONDigitMaker::GetCrateName(Char_t* name, Int_t iDDL, Int_t iReg) 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; - } +} - // crate Right for first DDL - if (iDDL == 0) - strcat(name, "R"); - else - strcat(name, "L"); +//______________________________________________________________________________ +Bool_t +AliMUONDigitMaker::TriggerToDigitsStore(const AliMUONVTriggerStore& triggerStore, + AliMUONVDigitStore& digitStore) const +{ + // + /// make (S)Digit for trigger + // + + digitStore.Clear(); + + AliMUONLocalTrigger* locTrg; + TIter next(triggerStore.CreateLocalIterator()); + + while ( ( locTrg = static_cast(next()) ) ) + { + if (locTrg->IsNull()) continue; + + TArrayS xyPattern[2]; + locTrg->GetXPattern(xyPattern[0]); + locTrg->GetYPattern(xyPattern[1]); + + Int_t nBoard = locTrg->LoCircuit(); + TriggerDigits(nBoard, xyPattern, digitStore); + } + return kTRUE; }