X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONTriggerElectronics.cxx;h=a8b347b9efb92c0a1ef314b9f1c4a6dad69fe0c9;hb=93fd278f1ccf1b4dbef5472a77f63cbf2d28b39e;hp=8714a85651e4cbe795e65e67abe1468fd983ee6c;hpb=4a69b40c1a4669f4b938ebef01e27e73bb4bb77f;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONTriggerElectronics.cxx b/MUON/AliMUONTriggerElectronics.cxx index 8714a85651e..a8b347b9efb 100644 --- a/MUON/AliMUONTriggerElectronics.cxx +++ b/MUON/AliMUONTriggerElectronics.cxx @@ -15,67 +15,85 @@ /* $Id$ */ -//*-- Author: Rachid Guernane (LPCCFd) -//* Manager class for muon trigger electronics -//* Client of trigger board classes -//* -//* +//----------------------------------------------------------------------------- +// Class AliMUONTriggerElectronics +//-------------------------------- +// Manager class for muon trigger electronics +// Client of trigger board classes +// Debugged by Ph. Crochet & Ch. Finck +// Interfaced with new mapping Ch. Finck +// +// Author: Rachid Guernane (LPCCFd) +//----------------------------------------------------------------------------- -#include "AliMUONTriggerElectronics.h" -#include "AliMUONTriggerCrate.h" -#include "AliMUONTriggerCrateStore.h" -#include "AliMUONConstants.h" -#include "AliMUONLocalTriggerBoard.h" -#include "AliMUONRegionalTriggerBoard.h" +#include "AliLoader.h" +#include "AliLog.h" +#include "AliMUONCalibrationData.h" +#include "AliMUONVDigit.h" +#include "AliMUONVDigitStore.h" +#include "AliMUONGlobalTrigger.h" #include "AliMUONGlobalTriggerBoard.h" #include "AliMUONLocalTrigger.h" +#include "AliMUONLocalTriggerBoard.h" #include "AliMUONRegionalTrigger.h" -#include "AliMUONGlobalTrigger.h" -#include "AliMUON.h" -#include "AliMUONData.h" -#include "AliMUONDigit.h" -#include "AliMUONSegmentation.h" -#include "AliMUONCalibrationData.h" +#include "AliMUONRegionalTriggerBoard.h" +#include "AliMUONTriggerCrate.h" +#include "AliMUONTriggerCrateStore.h" +#include "AliMUONTriggerElectronics.h" +#include "AliMUONTriggerCrateConfig.h" +#include "AliMUONRegionalTriggerConfig.h" +#include "AliMUONGlobalCrateConfig.h" +#include "AliMUONVTriggerStore.h" #include "AliMUONVCalibParam.h" - +#include "AliMpCathodType.h" +#include "AliMpCDB.h" +#include "AliMpDEManager.h" #include "AliMpSegmentation.h" #include "AliMpVSegmentation.h" #include "AliMpCathodType.h" +#include "AliMpTriggerCrate.h" +#include "AliMpLocalBoard.h" +#include "AliMpDDLStore.h" +#include "AliMpExMap.h" +#include "AliMpIntPair.h" #include "AliLog.h" #include "AliLoader.h" #include "AliRun.h" +#include +#include -//#include "Riostream.h" -#include "TBits.h" -#include "TSystem.h" /// \cond CLASSIMP ClassImp(AliMUONTriggerElectronics) /// \endcond //___________________________________________ -AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data, AliMUONCalibrationData* calibData) -: TTask("AliMUONTriggerElectronics", - "From trigger digits to Local and Global Trigger objects"), - fSourceFileName(), +AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONCalibrationData* calibData) +: TObject(), fCrates(new AliMUONTriggerCrateStore), - fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard), - fMUONData(Data), - fLocalTrigger(new AliMUONLocalTrigger()), - fGlobalTrigger(new AliMUONGlobalTrigger()) - + fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard) { -/// CONSTRUCTOR + /// CONSTRUCTOR /// - if (!fMUONData) - { - AliWarning("NO MUON TRIGGER DATA"); + + for (Int_t i = 0; i < 2; ++i) { + fCopyXInput[i] = new TList(); + fCopyXInput[i]->SetOwner(); + fCopyYInput[i] = new TList(); + fCopyYInput[i]->SetOwner(); } - - SetDataSource(); + + // force loading of mapping if not already done + if ( !AliMpDDLStore::Instance(kFALSE) ) + { + AliMpCDB::LoadDDLStore(); + } + + SetCopyInput(); + Factory(calibData); - LoadMasks(calibData); + LoadMasks(calibData); } //___________________________________________ @@ -85,9 +103,61 @@ AliMUONTriggerElectronics::~AliMUONTriggerElectronics() /// delete fGlobalTriggerBoard; delete fCrates; - delete fLocalTrigger; - delete fGlobalTrigger; + for (Int_t i = 0; i < 2; ++i) { + delete fCopyXInput[i]; + delete fCopyYInput[i]; + } + +} +//___________________________________________ +void AliMUONTriggerElectronics::SetCopyInput() +{ + /// set list of copy input + + for (Int_t iDDL = 0; iDDL < 2; ++iDDL) { + + for(Int_t iReg = 0; iReg < 8; ++iReg){ //reg loop + + AliMpTriggerCrate* crateMapping = AliMpDDLStore::Instance()->GetTriggerCrate(iDDL, iReg); + + for(Int_t iLocal = 0; iLocal < crateMapping->GetNofLocalBoards(); ++iLocal) { + + Int_t localBoardFromId = crateMapping->GetLocalBoardId(iLocal); + if (!localBoardFromId) continue; //empty slot, should not happen + + AliMpLocalBoard* localBoardFrom = AliMpDDLStore::Instance()->GetLocalBoard(localBoardFromId); + Int_t localBoardToId; + if ((localBoardToId = localBoardFrom->GetInputXto())) { + AliMpLocalBoard* localBoardTo = AliMpDDLStore::Instance()->GetLocalBoard(localBoardToId); + TString crateFrom = localBoardFrom->GetCrate(); + Int_t slotFrom = localBoardFrom->GetSlot(); + TString crateTo = localBoardTo->GetCrate(); + Int_t slotTo = localBoardTo->GetSlot(); + + fCopyXInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom)); + fCopyXInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo)); + AliDebug(3, Form("copy xInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom, + crateTo.Data(), slotTo)); + } + + if ((localBoardToId = localBoardFrom->GetInputYto())) { + AliMpLocalBoard* localBoardTo = AliMpDDLStore::Instance()->GetLocalBoard(localBoardToId); + TString crateFrom = localBoardFrom->GetCrate(); + Int_t slotFrom = localBoardFrom->GetSlot(); + TString crateTo = localBoardTo->GetCrate(); + Int_t slotTo = localBoardTo->GetSlot(); + + fCopyYInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom)); + fCopyYInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo)); + AliDebug(3, Form("copy yInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom, + crateTo.Data(), slotTo)); + + } + + } + } + } } //___________________________________________ @@ -96,183 +166,164 @@ void AliMUONTriggerElectronics::Factory(AliMUONCalibrationData* calibData) /// BUILD ALL ELECTRONICS /// -// get coinc44 from AliMUON (added 12/09/06) - AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); - Int_t coinc44 = pMUON->GetTriggerCoinc44(); - if (coinc44 != 0 && coinc44 != 1) { - AliFatal("Coinc 44 should be equal to 0 or 1"); - return; - } - - fCrates->ReadFromFile(gSystem->ExpandPathName(fSourceFileName.Data())); - - if ( !calibData ) return; - - AliMUONTriggerLut* lut = calibData->TriggerLut(); - - if (!lut) return; - - AliMUONLocalTriggerBoard* localBoard; - - fCrates->FirstLocalBoard(); - - while ( (localBoard=fCrates->NextLocalBoard()) ) - { - localBoard->SetLUT(lut); - localBoard->SetCoinc44(coinc44); - } + fCrates->ReadFromFile(calibData); } //___________________________________________ -void AliMUONTriggerElectronics::FeedM() +void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore) { -/// FILL INPUTS -/// - for (Int_t ichamber=10; ichamber<14; ichamber++) + /// FILL INPUTS + /// + + TIter next(digitStore.CreateTriggerIterator()); + AliMUONVDigit* mdig; + + while ( ( mdig = static_cast(next()) ) ) + { + // CHECKME ! The TrackCharge is not ok with new digitizerV3 ! + // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg); + Int_t ichamber = AliMpDEManager::GetChamberId(mdig->DetElemId()); + Int_t schg = (Int_t)(mdig->Charge() + 0.5); + + // APPLY CONDITION ON SOFT BACKGROUND + Int_t tchg = schg - (Int_t(schg/10))*10; + + if (schg<=10 || tchg>0) { - TClonesArray *muonDigits = fMUONData->Digits(ichamber); - Int_t ndigits = muonDigits->GetEntriesFast(); + Int_t detElemId = mdig->DetElemId(); + Int_t cathode = mdig->Cathode(); + + const AliMpVSegmentation* seg = + AliMpSegmentation::Instance() + ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode)); + + Int_t ix = mdig->PadX(), iy = mdig->PadY(); + + AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy)); - for (Int_t digit=0; digitPadByIndices(ix,iy,kTRUE); + + for (Int_t i=0; i(muonDigits->UncheckedAt(digit)); - - // CHECKME ! The TrackCharge is not ok with new digitizerV3 ! - // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg); - Int_t schg = (Int_t)(mdig->Signal() + 0.5); - - // APPLY CONDITION ON SOFT BACKGROUND - Int_t tchg = schg - (Int_t(schg/10))*10; - - if (schg<=10 || tchg>0) - { - // mdig->Print(); - - Int_t detElemId = mdig->DetElemId(); - Int_t cathode = mdig->Cathode(); - - const AliMpVSegmentation *seg = - AliMpSegmentation::Instance() - ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode)); - - Int_t ix = mdig->PadX(), iy = mdig->PadY(); - - AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy)); - - AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE); - - for (Int_t i=0; iLocalBoard(nboard); - - if (b) - { - if (cathode && b->GetSwitch(6)) ibitxy += 8; - - b->SetbitM(ibitxy,cathode,ichamber-10); - - } - else - { - AliError(Form("Could not get local board number %d",b->GetNumber())); - } - } - } + Int_t nboard = pad.GetLocalBoardId(i); + + Int_t ibitxy = pad.GetLocalBoardChannel(i); + + AliMUONLocalTriggerBoard *b = fCrates->LocalBoard(nboard); + + if (b) + { + if (cathode && b->GetSwitch(6)) ibitxy += 8; + + b->SetbitM(ibitxy,cathode,ichamber-10); + } + else + { + AliError(Form("Could not get local board number %d",b->GetNumber())); + } } - } + } + } // Particular case of the columns with 22 local boards (2R(L) 3R(L)) + // fill copy input from mapping instead of hardcoded valued (Ch.F) AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0; - char *scratess[4] = { "2R", "2L", "3L", "3R"}; - char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"}; - Int_t slotf[4] = { 2, 2, 10, 10}; - Int_t slotd[4] = { 1, 1, 9, 9}; - - for (Int_t i = 0; i < 4; i++) + for (Int_t i = 0; i < fCopyXInput[0]->GetEntries(); ++i) { - crate = fCrates->Crate(scratess[i]); - bs = crate->Boards(); - AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14); - AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15); - AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16); - - crate = fCrates->Crate(scratesd[i]); - bs = crate->Boards(); - AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]); - AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]); - - UShort_t cX[2]; + AliMpIntPair* pair = (AliMpIntPair*)fCopyXInput[0]->At(i); + TString crateFrom = AliMpExMap::GetString(pair->GetFirst()); + Int_t slotFrom = pair->GetSecond(); - // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2 - // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3 - frombb->GetX34(cX); desxbb->SetX34(cX); + pair = (AliMpIntPair*)fCopyXInput[1]->At(i); + TString crateTo = AliMpExMap::GetString(pair->GetFirst()); + Int_t slotTo = pair->GetSecond(); - // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3 - // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3 - fromcb->GetX34(cX); desycb->SetX34(cX); + AliDebug(3, Form("copy xInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom, + crateTo.Data(), slotTo)); - UShort_t cY[4]; + UShort_t cX[2]; + crate = fCrates->Crate(crateFrom); + bs = crate->Boards(); + AliMUONLocalTriggerBoard *fromxb = (AliMUONLocalTriggerBoard*)bs->At(slotFrom); + crate = fCrates->Crate(crateTo); + bs = crate->Boards(); + AliMUONLocalTriggerBoard *desxb = (AliMUONLocalTriggerBoard*)bs->At(slotTo); + fromxb->GetX34(cX); desxb->SetX34(cX); - desybb->GetY(cY); frombb->SetY(cY); - frombb->GetY(cY); desxbb->SetY(cY); - fromcb->GetY(cY); desycb->SetY(cY); } + for (Int_t i = 0; i < fCopyYInput[0]->GetEntries(); ++i) + { + AliMpIntPair* pair = (AliMpIntPair*)fCopyYInput[0]->At(i); + TString crateFrom = AliMpExMap::GetString(pair->GetFirst()); + Int_t slotFrom = pair->GetSecond(); + + pair = (AliMpIntPair*)fCopyYInput[1]->At(i); + TString crateTo = AliMpExMap::GetString(pair->GetFirst()); + Int_t slotTo = pair->GetSecond(); + + AliDebug(3, Form("copy yInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom, + crateTo.Data(), slotTo)); + + UShort_t cY[4]; + crate = fCrates->Crate(crateFrom); + bs = crate->Boards(); + AliMUONLocalTriggerBoard *fromyb = (AliMUONLocalTriggerBoard*)bs->At(slotFrom); + crate = fCrates->Crate(crateTo); + bs = crate->Boards(); + AliMUONLocalTriggerBoard *desyb = (AliMUONLocalTriggerBoard*)bs->At(slotTo); + fromyb->GetY(cY); desyb->SetY(cY); + } + // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE) AliMUONTriggerCrate* cr; - - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + TIter next2(fCrates->CreateCrateIterator()); + + while ( ( cr = static_cast(next2()) ) ) { - TObjArray *boards = cr->Boards(); - - for (Int_t j = 1; j < boards->GetEntries()-1; j++) - { - TObject *o = boards->At(j); + TObjArray *boards = cr->Boards(); + + for (Int_t j = 1; j < boards->GetEntries()-1; j++) + { + TObject *o = boards->At(j); - if (!o) break; + if (!o) break; - AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o; + AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o; - AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1); + AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1); - UShort_t cXY[2][4]; + UShort_t cXY[2][4]; - if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);} + if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);} - // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3 - if (j < boards->GetEntries()-2) - { + // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3 + if (j < boards->GetEntries()-2) + { AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2); currboard->GetXY(cXY); neighbour->SetXYD(cXY); nextboard->GetXY(cXY); neighbour->SetXYU(cXY); if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);} - } } + } } + } + //___________________________________________ void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4]) { /// FILL INPUTS /// AliMUONTriggerCrate* cr; + TIter next(fCrates->CreateCrateIterator()); - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); @@ -309,10 +360,9 @@ void AliMUONTriggerElectronics::Scan(Option_t *option) /// AliMUONTriggerCrate* cr; + TIter next(fCrates->CreateCrateIterator()); - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); @@ -344,10 +394,8 @@ void AliMUONTriggerElectronics::Reset() /// AliMUONTriggerCrate* cr; - - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + TIter next(fCrates->CreateCrateIterator()); + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); @@ -360,35 +408,42 @@ void AliMUONTriggerElectronics::Reset() } } + //_______________________________________________________________________ void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData) { - // LOAD MASKS FROM CDB + /// Load mask from config in CDB + + // Set mask + AliMUONRegionalTriggerConfig* regionalConfig = calibData->RegionalTriggerConfig(); + if (!regionalConfig) + AliWarning("No valid regional trigger configuration in CDB"); - // SET MASKS AliMUONTriggerCrate* cr; - - fCrates->FirstCrate(); + TIter next(fCrates->CreateCrateIterator()); Int_t irb(0); - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); - AliMUONRegionalTriggerBoard *regb = - (AliMUONRegionalTriggerBoard*)boards->At(0); + AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0); - AliMUONVCalibParam* regionalBoardMasks = calibData->RegionalTriggerBoardMasks(irb); + AliMUONTriggerCrateConfig* crateConfig = regionalConfig->FindTriggerCrate(cr->GetName()); - for ( Int_t i = 0; i < regionalBoardMasks->Size(); ++i ) + if (!crateConfig) { - UShort_t rmask = static_cast(regionalBoardMasks->ValueAsInt(i) & 0x3F); - regb->Mask(i,rmask); + AliError(Form("Crate %s not present in configuration !!!", cr->GetName())); + return; } + UShort_t rmask= crateConfig->GetMask(); + + regb->Mask(rmask); + for (Int_t j = 1; j < boards->GetEntries(); j++) { AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(j); @@ -408,25 +463,26 @@ void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData) ++irb; } - AliMUONVCalibParam* globalBoardMasks = calibData->GlobalTriggerBoardMasks(); - for ( Int_t i = 0; i < globalBoardMasks->Size(); ++i ) - { - UShort_t gmask = static_cast(globalBoardMasks->ValueAsInt(i) & 0xFFF); - fGlobalTriggerBoard->Mask(i,gmask); - } + AliMUONGlobalCrateConfig * globalConfig = calibData->GlobalTriggerCrateConfig(); + if (!globalConfig) + AliWarning("No valid trigger crate configuration in CDB"); + + UInt_t gmask = 0; + for (Int_t i = 0; i < 4; i++) { + gmask = globalConfig->GetGlobalMask(i); + fGlobalTriggerBoard->Mask(i,gmask); + } } - //___________________________________________ void AliMUONTriggerElectronics::LocalResponse() { -/// \todo add comment +/// Compute the response for local cards AliMUONTriggerCrate* cr; + TIter next(fCrates->CreateCrateIterator()); - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); @@ -472,10 +528,9 @@ void AliMUONTriggerElectronics::RegionalResponse() { /// Compute the response for all regional cards. AliMUONTriggerCrate* cr; + TIter next(fCrates->CreateCrateIterator()); - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); @@ -496,8 +551,6 @@ void AliMUONTriggerElectronics::GlobalResponse() UShort_t regional[16]; AliMUONTriggerCrate* cr; - - fCrates->FirstCrate(); Int_t irb(0); if ( !fCrates->NumberOfCrates() >= 16 ) @@ -505,140 +558,138 @@ void AliMUONTriggerElectronics::GlobalResponse() AliFatal(Form("Something is wrong : too many crates %d", fCrates->NumberOfCrates())); } + + // send regional responses to the global trigger in right order + // do not used iterator order - while ( ( cr = fCrates->NextCrate() ) ) + for (Int_t iSide = 0; iSide < 2; iSide++) // right & left side { - AliMUONTriggerBoard* rb = - static_cast(cr->Boards()->At(0)); - regional[irb] = rb->GetResponse(); - ++irb; + for (Int_t iReg = 0; iReg < 8; iReg++) // 8 crates/regional boards for each side. + { + cr = fCrates->Crate(iSide, iReg); + + AliMUONTriggerBoard* rb = + static_cast(cr->Boards()->At(0)); + regional[irb] = rb->GetResponse(); + ++irb; + } } - + fGlobalTriggerBoard->SetRegionalResponse(regional); fGlobalTriggerBoard->Response(); } //_______________________________________________________________________ -void -AliMUONTriggerElectronics::Exec(Option_t*) -{ -/// \todo add comment -/// - Digits2Trigger(); -} - -//_______________________________________________________________________ -void AliMUONTriggerElectronics::Trigger() -{ -/// \todo add comment -/// - FeedM(); - LocalResponse(); - RegionalResponse(); - GlobalResponse(); -} - -//_______________________________________________________________________ -void AliMUONTriggerElectronics::Digits2Trigger() +void AliMUONTriggerElectronics::Digits2Trigger(const AliMUONVDigitStore& digitStore, + AliMUONVTriggerStore& triggerStore) { /// Main method to go from digits to trigger decision - AliMUONRegionalTrigger *pRegTrig = new AliMUONRegionalTrigger(); - fMUONData->ResetTrigger(); + AliMUONRegionalTrigger pRegTrig; + + triggerStore.Clear(); + // RUN THE FULL BEE CHAIN - Trigger(); -// DumpOS(); + Feed(digitStore); + LocalResponse(); + RegionalResponse(); + GlobalResponse(); + // DumpOS(); AliMUONTriggerCrate* cr; - + AliMUONLocalTrigger localTrigger; + // stored in right order // do not used iterator order - + for (Int_t iSide = 0; iSide < 2; iSide++) // right & left side { for (Int_t iReg = 0; iReg < 8; iReg++) // 8 crates/regional boards for each side. { cr = fCrates->Crate(iSide, iReg); TObjArray *boards = cr->Boards(); - + UInt_t regInpLpt = 0; UInt_t regInpHpt = 0; - + AliMUONRegionalTriggerBoard *regBoard = (AliMUONRegionalTriggerBoard*)boards->At(0); - + for (Int_t j = 1; j < boards->GetEntries(); j++) { - TObject *o = boards->At(j); - - if (!o) break; - - AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; - - if (board) - { - // L0 TRIGGER -// pcrochet 181206: MOOD needs ALL boards -// if (board->Triggered()) -// { - - Int_t icirc = board->GetNumber(); - if (icirc != 0) { // pcrochet 181206: MOOD needs ALL boards - - fLocalTrigger->SetLoCircuit(icirc); - fLocalTrigger->SetLoStripX(board->GetStripX11()); - fLocalTrigger->SetLoDev(board->GetDev()); - fLocalTrigger->SetLoStripY(board->GetStripY11()); - - // SAVE LUT OUTPUT - UShort_t response = board->GetResponse(); - fLocalTrigger->SetLoHpt((response & 12) >> 2); - fLocalTrigger->SetLoLpt(response & 3); - - // calculates regional inputs from local for the moment - UInt_t hPt = (response >> 2) & 0x3; - UInt_t lPt = response & 0x3; - - regInpHpt |= hPt << (30 - (j-1)*2); - regInpLpt |= lPt << (30 - (j-1)*2); - - TBits rrr; - rrr.Set(6,&response); - - // SAVE BIT PATTERN - fLocalTrigger->SetX1Pattern(board->GetXY(0,0)); - fLocalTrigger->SetX2Pattern(board->GetXY(0,1)); - fLocalTrigger->SetX3Pattern(board->GetXY(0,2)); - fLocalTrigger->SetX4Pattern(board->GetXY(0,3)); - - fLocalTrigger->SetY1Pattern(board->GetXY(1,0)); - fLocalTrigger->SetY2Pattern(board->GetXY(1,1)); - fLocalTrigger->SetY3Pattern(board->GetXY(1,2)); - fLocalTrigger->SetY4Pattern(board->GetXY(1,3)); + TObject *o = boards->At(j); + + if (!o) break; + + AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; + + if (board) + { + // L0 TRIGGER + // pcrochet 181206: MOOD needs ALL boards + // if (board->Triggered()) + // { - // ADD A NEW LOCAL TRIGGER - fMUONData->AddLocalTrigger(*fLocalTrigger); - - } - } + Int_t icirc = board->GetNumber(); + if (icirc != 0) { // pcrochet 181206: MOOD needs ALL boards + + localTrigger.SetLoCircuit(icirc); + localTrigger.SetLoStripX(board->GetStripX11()); + localTrigger.SetLoDev(board->GetDev()); + localTrigger.SetLoSdev(board->GetSdev()); + localTrigger.SetLoTrigY(board->GetTrigY()); + localTrigger.SetLoStripY(board->GetStripY11()); + + // SAVE LUT OUTPUT + UShort_t response = board->GetResponse(); + localTrigger.SetLoHpt((response & 12) >> 2); + localTrigger.SetLoLpt(response & 3); + + // calculates regional inputs from local for the moment + UInt_t hPt = (response >> 2) & 0x3; + UInt_t lPt = response & 0x3; + + regInpHpt |= hPt << (30 - (j-1)*2); + regInpLpt |= lPt << (30 - (j-1)*2); + + TBits rrr; + rrr.Set(6,&response); + + // SAVE BIT PATTERN + localTrigger.SetX1Pattern(board->GetXY(0,0)); + localTrigger.SetX2Pattern(board->GetXY(0,1)); + localTrigger.SetX3Pattern(board->GetXY(0,2)); + localTrigger.SetX4Pattern(board->GetXY(0,3)); + + localTrigger.SetY1Pattern(board->GetXY(1,0)); + localTrigger.SetY2Pattern(board->GetXY(1,1)); + localTrigger.SetY3Pattern(board->GetXY(1,2)); + localTrigger.SetY4Pattern(board->GetXY(1,3)); + + // ADD A NEW LOCAL TRIGGER + triggerStore.Add(localTrigger); + + } + } + } + pRegTrig.SetId(iReg + 8*iSide); + pRegTrig.SetLocalOutput(regInpLpt, 0); + pRegTrig.SetLocalOutput(regInpHpt, 1); + pRegTrig.SetOutput(regBoard->GetResponse()); + + triggerStore.Add(pRegTrig); } - pRegTrig->SetId(iReg + 8*iSide); - pRegTrig->SetLocalOutput(regInpLpt, 0); - pRegTrig->SetLocalOutput(regInpHpt, 1); - pRegTrig->SetOutput(regBoard->GetResponse()); - - fMUONData->AddRegionalTrigger(*pRegTrig); } - } - delete pRegTrig; // GLOBAL TRIGGER INFORMATION UShort_t global = fGlobalTriggerBoard->GetResponse(); - fGlobalTrigger->SetFromGlobalResponse(global); + UInt_t *globalInput = fGlobalTriggerBoard->GetGlobalInput(); + AliMUONGlobalTrigger globalTrigger; + globalTrigger.SetFromGlobalResponse(global); + globalTrigger.SetFromGlobalInput(globalInput); // ADD A LOCAL TRIGGER IN THE LIST - fMUONData->AddGlobalTrigger(*fGlobalTrigger); - + triggerStore.SetGlobal(globalTrigger); + // NOW RESET ELECTRONICS Reset(); } -