X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=MUON%2FAliMUONTriggerElectronics.cxx;h=388c3447d900ffcd50471c297f610f3298550a9f;hp=79f938f34cc8762296312e049483c2624327d704;hb=fc2293be3210f0436f281ea4bd047546feed3c79;hpb=03af98cb0972fcc9ff0ab6dd2d4129207360e64e diff --git a/MUON/AliMUONTriggerElectronics.cxx b/MUON/AliMUONTriggerElectronics.cxx index 79f938f34cc..388c3447d90 100644 --- a/MUON/AliMUONTriggerElectronics.cxx +++ b/MUON/AliMUONTriggerElectronics.cxx @@ -28,7 +28,6 @@ #include "AliLoader.h" #include "AliLog.h" -#include "AliMUON.h" #include "AliMUONCalibrationData.h" #include "AliMUONVDigit.h" #include "AliMUONVDigitStore.h" @@ -41,9 +40,13 @@ #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" @@ -60,6 +63,8 @@ #include #include +#include "AliCodeTimer.h" + /// \cond CLASSIMP ClassImp(AliMUONTriggerElectronics) @@ -81,9 +86,16 @@ AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONCalibrationData* cal fCopyYInput[i]->SetOwner(); } + // force loading of mapping if not already done + if ( !AliMpDDLStore::Instance(kFALSE) ) + { + AliMpCDB::LoadDDLStore(); + } + SetCopyInput(); + Factory(calibData); - LoadMasks(calibData); + LoadMasks(calibData); } //___________________________________________ @@ -99,22 +111,23 @@ AliMUONTriggerElectronics::~AliMUONTriggerElectronics() } } + //___________________________________________ void AliMUONTriggerElectronics::SetCopyInput() { -/// set list of copy input - + /// 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())) { @@ -123,25 +136,25 @@ void AliMUONTriggerElectronics::SetCopyInput() 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)); - + } } @@ -155,31 +168,7 @@ 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(); - - 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); } //___________________________________________ @@ -187,6 +176,8 @@ void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore) { /// FILL INPUTS /// + + AliCodeTimerAuto("",0); TIter next(digitStore.CreateTriggerIterator()); AliMUONVDigit* mdig; @@ -214,32 +205,42 @@ void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore) AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy)); - AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE); + AliMpPad pad = seg->PadByIndices(ix,iy,kTRUE); for (Int_t i=0; iLocalBoard(nboard); if (b) { - if (cathode && b->GetSwitch(6)) ibitxy += 8; + if (cathode && b->GetSwitch(AliMpLocalBoard::kZeroAllYLSB)) ibitxy += 8; b->SetbitM(ibitxy,cathode,ichamber-10); } else { - AliError(Form("Could not get local board number %d",b->GetNumber())); + AliError(Form("Could not get local board number %d",nboard)); } } } } + FeedCopyNeighbours(); +} + + +//___________________________________________ +void AliMUONTriggerElectronics::FeedCopyNeighbours() +{ + // + /// Feed the local copies + /// and complete the feed with the information of neighbours + // + // 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; @@ -294,10 +295,9 @@ void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore) // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE) AliMUONTriggerCrate* cr; + TIter next2(fCrates->CreateCrateIterator()); - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next2()) ) ) { TObjArray *boards = cr->Boards(); @@ -337,10 +337,9 @@ 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(); @@ -371,16 +370,15 @@ void AliMUONTriggerElectronics::DumpOS() } //___________________________________________ -void AliMUONTriggerElectronics::Scan(Option_t *option) +void AliMUONTriggerElectronics::Scan(const Option_t *option) { /// SCAN /// AliMUONTriggerCrate* cr; + TIter next(fCrates->CreateCrateIterator()); - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); @@ -412,10 +410,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(); @@ -428,30 +424,40 @@ void AliMUONTriggerElectronics::Reset() } } + //_______________________________________________________________________ void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData) { - /// LOAD MASKS FROM CDB + /// Load mask from config in CDB - - // SET MASKS + // Set mask - AliMUONTriggerCrate* cr; + AliMUONRegionalTriggerConfig* regionalConfig = calibData->RegionalTriggerConfig(); + if (!regionalConfig) { + AliError("No valid regional trigger configuration in CDB"); + return; + } - fCrates->FirstCrate(); + AliMUONTriggerCrate* cr; + 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()); + + if (!crateConfig) + { + AliError(Form("Crate %s not present in configuration !!!", cr->GetName())); + return; + } - UShort_t rmask = static_cast(regionalBoardMasks->ValueAsInt(0) & 0xFFFF); + UShort_t rmask= crateConfig->GetMask(); regb->Mask(rmask); @@ -474,32 +480,39 @@ 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) & 0xFF); - fGlobalTriggerBoard->Mask(i,gmask); - } -} + AliMUONGlobalCrateConfig * globalConfig = calibData->GlobalTriggerCrateConfig(); + if (!globalConfig) { + AliError("No valid trigger crate configuration in CDB"); + return; + } + UInt_t gmask = 0; + for (Int_t i = 0; i < 4; i++) { + gmask = globalConfig->GetGlobalMask(i); + fGlobalTriggerBoard->Mask(i,gmask); + } +} //___________________________________________ void AliMUONTriggerElectronics::LocalResponse() { /// Compute the response for local cards + + AliCodeTimerAuto("",0); AliMUONTriggerCrate* cr; + TIter next(fCrates->CreateCrateIterator()); + + UShort_t thisl[16]; - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0); - UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0; + for (Int_t j=0; j<16; ++j) thisl[j] = 0; for (Int_t j = 1; j < boards->GetEntries(); j++) { @@ -508,26 +521,23 @@ void AliMUONTriggerElectronics::LocalResponse() if (!o) break; AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; - - if (board) // check if empty slot - { - board->Response(); - - UShort_t response = board->GetResponse(); - - // CRATE CONTAINING INTERFACE BOARD - if (board->GetNumber() == 0) // copy boards - { - if ( response != 0 ) - AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response", - board->GetName(),j,cr->GetName())); - AliDebug(1, Form("local slot %d, number %d in crate %s\n", j, board->GetNumber(), cr->GetName())); - } + board->Response(); + + UShort_t response = board->GetResponse(); - thisl[j-1] = response; + // CRATE CONTAINING INTERFACE BOARD + if (board->GetNumber() == 0) // copy boards + { + if ( response != 0 ) + AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response", + board->GetName(),j,cr->GetName())); + AliDebug(1, Form("local slot %d, number %d in crate %s\n", j, board->GetNumber(), cr->GetName())); + } - } + + thisl[j-1] = response; + } regb->SetLocalResponse(thisl); } @@ -537,20 +547,20 @@ void AliMUONTriggerElectronics::LocalResponse() void AliMUONTriggerElectronics::RegionalResponse() { /// Compute the response for all regional cards. + + AliCodeTimerAuto("",0); + AliMUONTriggerCrate* cr; + TIter next(fCrates->CreateCrateIterator()); - fCrates->FirstCrate(); - - while ( ( cr = fCrates->NextCrate() ) ) + while ( ( cr = static_cast(next()) ) ) { TObjArray *boards = cr->Boards(); AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0); - - if (regb) - { - regb->Response(); - } + + regb->Response(); + } } @@ -559,11 +569,11 @@ void AliMUONTriggerElectronics::GlobalResponse() { /// Compute the global response + AliCodeTimerAuto("",0); + UShort_t regional[16]; AliMUONTriggerCrate* cr; - - fCrates->FirstCrate(); Int_t irb(0); if ( !fCrates->NumberOfCrates() >= 16 ) @@ -571,15 +581,23 @@ 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(); } @@ -588,10 +606,15 @@ void AliMUONTriggerElectronics::GlobalResponse() void AliMUONTriggerElectronics::Digits2Trigger(const AliMUONVDigitStore& digitStore, AliMUONVTriggerStore& triggerStore) { + AliCodeTimerAuto("",0); + /// Main method to go from digits to trigger decision AliMUONRegionalTrigger pRegTrig; triggerStore.Clear(); + + // NOW RESET ELECTRONICS + Reset(); // RUN THE FULL BEE CHAIN Feed(digitStore); @@ -686,13 +709,132 @@ void AliMUONTriggerElectronics::Digits2Trigger(const AliMUONVDigitStore& digitSt // GLOBAL TRIGGER INFORMATION UShort_t global = fGlobalTriggerBoard->GetResponse(); - + UInt_t *globalInput = fGlobalTriggerBoard->GetGlobalInput(); + AliMUONGlobalTrigger globalTrigger; globalTrigger.SetFromGlobalResponse(global); + globalTrigger.SetFromGlobalInput(globalInput); // ADD A LOCAL TRIGGER IN THE LIST triggerStore.SetGlobal(globalTrigger); - - // NOW RESET ELECTRONICS + +} + +//___________________________________________ +void AliMUONTriggerElectronics::Feed(const AliMUONVTriggerStore& triggerStore) +{ + // + /// Fill inputs from reconstructed local trigger store + // + AliMUONLocalTrigger* locTrg; + TIter next(triggerStore.CreateLocalIterator()); + TArrayS xyPattern[2]; + UShort_t xy[2][4]; + Int_t loCircuit; + while ( ( locTrg = static_cast( next() )) != NULL ){ + locTrg->GetXPattern(xyPattern[0]); + locTrg->GetYPattern(xyPattern[1]); + loCircuit = locTrg->LoCircuit(); + AliMUONLocalTriggerBoard* localBoard = fCrates->LocalBoard(loCircuit); + for (Int_t icath = 0; icath<2; ++icath){ + for (Int_t ich = 0; ich < 4; ++ich){ + xy[icath][ich] = xyPattern[icath][ich]; + } + } + localBoard->SetXY(xy); + } + + FeedCopyNeighbours(); +} + +//_______________________________________________________________________ +Bool_t AliMUONTriggerElectronics::ModifiedLocalResponse(Int_t loCircuit, + Bool_t& bendingPlaneResp, + Bool_t& nonBendingPlaneResp, + Bool_t isCoinc44, + Int_t removeChamber) +{ + // + /// Re-compute the local trigger response + /// with some modifications (i.e. setting coinc44 or after removing one chamber) + // + + bendingPlaneResp = kFALSE; + nonBendingPlaneResp = kFALSE; + + Bool_t isTriggered = kFALSE; + + AliMUONLocalTriggerBoard* currBoard = fCrates->LocalBoard(loCircuit); + + if ( ! currBoard ) return isTriggered; + + AliMUONLocalTriggerBoard localBoard (*currBoard); + + if (removeChamber>=0 && removeChamber<=3){ + + // Set the bit pattern of selected chamber to 0 + UShort_t xy[2][4]; + UShort_t xyu[2][4]; + UShort_t xyd[2][4]; + + localBoard.GetXY(xy); + localBoard.GetXYU(xyu); + localBoard.GetXYD(xyd); + + for(Int_t icath=0; icath<2; icath++){ + xy[icath][removeChamber] = 0; + xyu[icath][removeChamber] = 0; + xyd[icath][removeChamber] = 0; + } + + localBoard.SetXY(xy); + localBoard.SetXYU(xyu); + localBoard.SetXYD(xyd); + } + + localBoard.ResetResponse(); + + localBoard.SetCoinc44((Int_t)isCoinc44); + localBoard.Response(); + + bendingPlaneResp = localBoard.IsTrigX(); + nonBendingPlaneResp = localBoard.IsTrigY(); + isTriggered = localBoard.Triggered(); + + return isTriggered; +} + + +//_______________________________________________________________________ +void AliMUONTriggerElectronics::ResponseRemovingChambers(AliMUONVTriggerStore& triggerStore) +{ + /// Update local board information with the trigger response after removing each chamber + + AliCodeTimerAuto("", 0); + Reset(); + Feed(triggerStore); + + AliMUONLocalTrigger* locTrg; + TIter next(triggerStore.CreateLocalIterator()); + Int_t loCircuit; + Bool_t planeResp[2], isTrig44; + Bool_t bendPlaneRespNoCh, nonBendPlaneRespNoCh, isTrigWithoutCh; + while ( ( locTrg = static_cast( next() )) != NULL ){ + if ( ! ( locTrg->IsTrigX() && locTrg->IsTrigY() ) ) continue; + loCircuit = locTrg->LoCircuit(); + isTrig44 = ModifiedLocalResponse(loCircuit, planeResp[0], planeResp[1], kTRUE); + for (Int_t ich=0; ich<4; ++ich){ + if ( ! isTrig44 ){ + isTrigWithoutCh = ModifiedLocalResponse(loCircuit, bendPlaneRespNoCh, nonBendPlaneRespNoCh, kFALSE, ich); + if ( ! isTrigWithoutCh ) continue; + for (Int_t icath=0; icath<2; icath++){ + if ( ! planeResp[icath] ) + locTrg->SetNoHitInPlane(icath, ich); + } // loop on cathodes + } + locTrg->SetTriggerWithoutChamber(ich); + } // loop on chambers + AliDebug(1, Form("Is44 %i triggers %i pattern %i", isTrig44, locTrg->GetTriggerWithoutChamber(), locTrg->GetHitPatternFromResponse())); + } }