X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONTriggerElectronics.cxx;h=0be01be86afd03e9e109b83b2a014378988c50be;hb=6bc85955e934154f2c3e8e2ae6b70718b6946e80;hp=b3c061f9b59e3e08aa9a1174e4f4dd81067f6543;hpb=516d3280097667c3124b0ceeeb72343d2170699d;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONTriggerElectronics.cxx b/MUON/AliMUONTriggerElectronics.cxx index b3c061f9b59..0be01be86af 100644 --- a/MUON/AliMUONTriggerElectronics.cxx +++ b/MUON/AliMUONTriggerElectronics.cxx @@ -16,202 +16,177 @@ /* $Id$ */ //*-- Author: Rachid Guernane (LPCCFd) +//* Manager class for muon trigger electronics +//* Client of trigger board classes +//* +//* #include "AliMUONTriggerElectronics.h" #include "AliMUONTriggerCrate.h" +#include "AliMUONTriggerCrateStore.h" #include "AliMUONConstants.h" #include "AliMUONLocalTriggerBoard.h" #include "AliMUONRegionalTriggerBoard.h" #include "AliMUONGlobalTriggerBoard.h" #include "AliMUONLocalTrigger.h" #include "AliMUONGlobalTrigger.h" -#include "AliLoader.h" +#include "AliMUON.h" #include "AliMUONData.h" #include "AliMUONDigit.h" +#include "AliMUONSegmentation.h" +#include "AliMUONCalibrationData.h" +#include "AliMUONVCalibParam.h" + +#include "AliMpVSegmentation.h" + #include "AliLog.h" #include "AliLoader.h" +#include "AliRun.h" -#include "Riostream.h" +//#include "Riostream.h" +#include "TBits.h" #include "TSystem.h" ClassImp(AliMUONTriggerElectronics) -const Int_t AliMUONTriggerElectronics::fgkNCrates = 16; - //___________________________________________ -AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data) +AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data, AliMUONCalibrationData* calibData) : TTask("AliMUONTriggerElectronics", "From trigger digits to Local and Global Trigger objects"), - fCrates(new TClonesArray("AliMUONTriggerCrate", fgkNCrates)), + fCrates(new AliMUONTriggerCrateStore), fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard), - fNCrates(0), fMUONData(Data) { +//* CONSTRUCTOR +//* if (!fMUONData) { AliFatal("NO MUON TRIGGER DATA"); } - for (Int_t i=0;i<16;i++) - { - fRegional[i] = 0; - for (Int_t j=0;j<16;j++) fLocal[i][j] = 0; - } - - fGlobal = 0; + SetDataSource(); + Factory(calibData); + LoadMasks(calibData); +} - SetDataSource(); - Factory(); +//______________________________________________________________________________ +AliMUONTriggerElectronics::AliMUONTriggerElectronics(const AliMUONTriggerElectronics& right) + : TTask(right) +{ +/// Protected copy constructor (not implemented) - AliWarning("ZERO-ALLY-LSB TO BE CHECKED!!!"); - AliWarning("AliMUONLocalTriggerBoard Y_pos DIVIDED BY 2 TO BE CONSISTENT W/ AliMUONTrackReconstructor!!!"); + AliFatal("Copy constructor not provided."); } //___________________________________________ AliMUONTriggerElectronics::~AliMUONTriggerElectronics() { +//* DESTRUCTOR +//* delete fGlobalTriggerBoard; delete fCrates; } -//___________________________________________ -void AliMUONTriggerElectronics::Factory() -{ - ifstream myInputFile(gSystem->ExpandPathName(fSourceFileName.Data()), ios::in); - - string sLine, sValue; - - if ( !myInputFile ) - { - AliError("TRIGGER ELECTRONICS CONFIGURATION FILE COULD NOT BE OPENED"); - } - else - { - while (getline(myInputFile,sLine)) - { - if (sLine.empty()) continue; // Ignore empty lines - else - { - const Int_t maxfields = 15; char **fields = new char*[maxfields]; - - char s[100]; - - if (sLine.find("Board",0) != string::npos) - { - strcpy(s,sLine.c_str()); - - Int_t numlines = 0; - - for (char *token = strtok(s, " "); - token != NULL; - token = strtok(NULL, " ")) - { - fields[numlines] = new char[strlen(token)+1]; - strcpy(fields[numlines++],token); - } - - char str[10]; strcpy(str, fields[6]); strcat(str, fields[7]); - - AliMUONTriggerCrate *crate = Crate(str); - - if (!crate) - { - AddCrate(str); crate = Crate(str); - - AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard(); - crate->AddBoard(rboard, 0); - } - -// CONVENTION: SLOT 0 HOLDS THE REGIONAL BOARD - Int_t sl = atoi(fields[10]); - - AliMUONLocalTriggerBoard *board = new AliMUONLocalTriggerBoard(fields[4], sl); - - crate->AddBoard(board, sl); - - while (getline(myInputFile,sLine)) if (sLine.find("transv",0) != string::npos) break; - - strcpy(s,sLine.c_str()); - - for (char *token = strtok(s, " "); - token != NULL; - token = strtok(NULL, " ")) if (!strcmp(token,"NONE")) board->SetTC(kFALSE); - - while (getline(myInputFile,sLine)) if (sLine.find("Switch",0) != string::npos) break; - - while (getline(myInputFile,sLine)) if (!sLine.empty()) break; - - strcpy(s,sLine.c_str()); +//______________________________________________________________________________ +AliMUONTriggerElectronics& +AliMUONTriggerElectronics::operator=(const AliMUONTriggerElectronics& right) +{ +/// Protected assignement operator (not implemented) - Int_t lines = 0; + // check assignement to self + if (this == &right) return *this; - for (char *token = strtok(s, " "); - token != NULL; - token = strtok(NULL, " ")) board->SetSwitch(lines++, atoi(token)); + AliFatal("Assignement operator not provided."); + + return *this; +} - for (Int_t i = 0; iReadFromFile(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); + } } //___________________________________________ -void AliMUONTriggerElectronics::Feed() +void AliMUONTriggerElectronics::FeedM() { +//* FILL INPUTS +//* for (Int_t ichamber=10; ichamber<14; ichamber++) { - TClonesArray *MuonDigits = fMUONData->Digits(ichamber); - Int_t ndigits = MuonDigits->GetEntriesFast(); + TClonesArray *muonDigits = fMUONData->Digits(ichamber); + Int_t ndigits = muonDigits->GetEntriesFast(); for (Int_t digit=0; digit(MuonDigits->UncheckedAt(digit)); - - Int_t ix = mdig->PadX(), iy = mdig->PadY(); - -// GET THE SUM OF THE CODED CHARGE -// SEE CODING CONVENTION IN AliMUONChamberTrigger::DisIntegration - Int_t schg = 0; + AliMUONDigit *mdig = static_cast(muonDigits->UncheckedAt(digit)); - // CHECKME ! The TrackCharge is not ok with new digitizerV3 ! +// CHECKME ! The TrackCharge is not ok with new digitizerV3 ! // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg); -// assert(schg==mdig->Signal()); - schg = mdig->Signal(); - +// assert(schg==mdig->Signal()); + Int_t schg = mdig->Signal(); + // APPLY CONDITION ON SOFT BACKGROUND Int_t tchg = schg - (Int_t(schg/10))*10; if (schg<=10 || tchg>0) { - Int_t cathode = mdig->Cathode(); +// mdig->Print(); -// Now identify local board from (ix,iy) - char name[10]; BoardName(ix,iy,name); + Int_t digitindex = digit; + Int_t detElemId = mdig->DetElemId(); + Int_t cathode = mdig->Cathode(); - for (Int_t i=0;iUncheckedAt(i); - - TObjArray *boards = cr->Boards(); - - AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->FindObject(name); + const AliMpVSegmentation *seg = ((AliMUON*)gAlice->GetDetector("MUON"))->GetSegmentation()->GetMpSegmentation(detElemId,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) { - Int_t digitindex = digit; -// if (b->GetSwitch(6) && cathode) -// b->Setbit(iy+8,cathode,ichamber-10); -// else - b->Setbit(iy,cathode,ichamber-10); - + if (cathode && b->GetSwitch(6)) ibitxy += 8; + + b->SetbitM(ibitxy,cathode,ichamber-10); + DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex); } + else + { + AliError(Form("Could not get local board number %d",b->GetNumber())); + } } - } + } } } @@ -225,13 +200,13 @@ void AliMUONTriggerElectronics::Feed() for (Int_t i=0; i<4; i++) { - crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratess[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 = (AliMUONTriggerCrate*)fCrates->FindObject(scratesd[i]); + crate = fCrates->Crate(scratesd[i]); bs = crate->Boards(); AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]); AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]); @@ -246,199 +221,137 @@ void AliMUONTriggerElectronics::Feed() // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3 fromcb->GetX34(cX); desycb->SetX34(cX); - UShort_t cY[2]; + UShort_t cY[4]; desybb->GetY(cY); frombb->SetY(cY); - } - -// TRANSVERSE CONNECTOR TO REPLICATE Y - for (Int_t i=0; iUncheckedAt(i); - - TObjArray *boards = cr->Boards(); - - for (Int_t j=1; jGetEntries()-1; j++) - { - TObject *o = boards->At(j); - - if (!o) break; - - AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o; - - AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1); - char **names = new char*[2]; - - names[0] = new char[20]; names[1] = new char[20]; - - currboard->Module(names[0]); neighbour->Module(names[1]); - -// CASCADE Y TO NEIGHBOUR (FROM 12 BOARD TO 34, 56...) - if (currboard->GetTC() && !strcmp(names[0],names[1])) - { - UShort_t cY[4]; - - currboard->GetY(cY); neighbour->SetY(cY); - } - } + frombb->GetY(cY); desxbb->SetY(cY); + fromcb->GetY(cY); desycb->SetY(cY); } - + // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE) - for (Int_t i=0; iFirstCrate(); + + while ( ( cr = fCrates->NextCrate() ) ) { - AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i); - - TObjArray *boards = cr->Boards(); - + TObjArray *boards = cr->Boards(); + for (Int_t j=1; jGetEntries()-1; j++) { TObject *o = boards->At(j); - + if (!o) break; - + AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o; - + AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1); - + UShort_t cXY[2][4]; - + if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);} - + // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3 if (jGetEntries()-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);} } } } -/* - for (Int_t i=0; iUncheckedAt(i); - - cout << "+++ CRATE " << cr->GetName() << endl; - - TObjArray *boards = cr->Boards(); - - for (Int_t j=1; jGetEntries()-1; j++) - { - TObject *o = boards->At(j); - - if (!o) break; - - AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o; - - AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1); - -// LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3 -if (jGetEntries()-2) -{ -AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2); - -cout << "currb: " << currboard->GetName() << endl; -cout << "board: " << neighbour->GetName() << endl; -cout << "nextb: " << nextboard->GetName() << endl; -currboard->Scan("CONF"); -currboard->Pattern("X"); -currboard->Pattern("Y"); -neighbour->Scan("CONF"); -neighbour->Pattern("X"); -neighbour->Pattern("Y"); -nextboard->Scan("CONF"); -nextboard->Pattern("X"); -nextboard->Pattern("Y"); -} } -} -*/ - } //___________________________________________ void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4]) { - for (Int_t i=0; iUncheckedAt(i); - - TObjArray *boards = cr->Boards(); - - for (Int_t j=1; jGetEntries(); j++) - { - TObject *o = boards->At(j); - - if (!o) break; - - AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; - - board->SetXY(pattern); - } + //* FILL INPUTS + //* + AliMUONTriggerCrate* cr; + + fCrates->FirstCrate(); + + while ( ( cr = fCrates->NextCrate() ) ) + { + TObjArray *boards = cr->Boards(); + + for (Int_t j=1; jGetEntries(); j++) + { + TObject *o = boards->At(j); + + if (!o) break; + + AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; + + board->SetXY(pattern); + } } } //___________________________________________ void AliMUONTriggerElectronics::DumpOS() { +//* DUMP IN THE OLD WAY +//* for (Int_t i=0;i<234;i++) { - char name[20]; - BuildName(i,name); - - for (Int_t i=0; iUncheckedAt(i); - - TObjArray *boards = cr->Boards(); - - AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)boards->FindObject(name); + AliMUONLocalTriggerBoard *board = fCrates->LocalBoard(i); - if (board) board->Scan("CONF RESPI BITP RESPF"); - } + if (board) board->Scan("ALL"); } } //___________________________________________ void AliMUONTriggerElectronics::Scan(Option_t *option) { - for (Int_t i=0; iUncheckedAt(i); - - TObjArray *boards = cr->Boards(); - - for (Int_t j=0; jGetEntries(); j++) - { - TObject *o = boards->At(j); - - TString op = option; - - Bool_t cdtion = kFALSE; - - if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class(); - if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class(); - if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class(); - - if (!o || !cdtion) continue; - - AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; - - board->Scan(); - } - } + //* SCAN + //* + + AliMUONTriggerCrate* cr; + + fCrates->FirstCrate(); + + while ( ( cr = fCrates->NextCrate() ) ) + { + TObjArray *boards = cr->Boards(); + + for (Int_t j=0; jGetEntries(); j++) + { + TObject *o = boards->At(j); + + TString op = option; + + Bool_t cdtion = kFALSE; + + if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class(); + if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class(); + if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class(); + + if (!o || !cdtion) continue; + + AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; + + board->Scan(); + } + } } //___________________________________________ void AliMUONTriggerElectronics::Reset() { - for (Int_t i=0; iFirstCrate(); + + while ( ( cr = fCrates->NextCrate() ) ) { - AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i); - TObjArray *boards = cr->Boards(); for (Int_t j=0; jGetEntries(); j++) @@ -450,16 +363,73 @@ void AliMUONTriggerElectronics::Reset() } } +//_______________________________________________________________________ +void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData) +{ + // LOAD MASKS FROM CDB + + + // SET MASKS + + AliMUONTriggerCrate* cr; + + fCrates->FirstCrate(); + + Int_t irb(0); + + while ( ( cr = fCrates->NextCrate() ) ) + { + TObjArray *boards = cr->Boards(); + + AliMUONRegionalTriggerBoard *regb = + (AliMUONRegionalTriggerBoard*)boards->At(0); + + AliMUONVCalibParam* regionalBoardMasks = calibData->RegionalTriggerBoardMasks(irb); + + for ( Int_t i = 0; i < regionalBoardMasks->Size(); ++i ) + { + UShort_t rmask = static_cast(regionalBoardMasks->ValueAsInt(i) & 0x3F); + regb->Mask(i,rmask); + } + + for (Int_t j=1; jGetEntries(); j++) + { + AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(j); + + Int_t cardNumber = b->GetNumber(); + + if (cardNumber) // interface board are not interested + { + AliMUONVCalibParam* localBoardMasks = calibData->LocalTriggerBoardMasks(cardNumber); + for ( Int_t i = 0; i < localBoardMasks->Size(); ++i ) + { + UShort_t lmask = static_cast(localBoardMasks->ValueAsInt(i) & 0xFFFF); + b->Mask(i,lmask); + } + } + } + ++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); + } +} + + //___________________________________________ void AliMUONTriggerElectronics::LocalResponse() { -// INTERFACE BOARDS + // INTERFACE BOARDS struct crates_t - { - TString name; - Int_t slots[5]; - Int_t ns; - } crate[6]; + { + TString name; + Int_t slots[5]; + Int_t ns; + } crate[6]; crate[0].name = "2R"; crate[0].ns = 1; crate[0].slots[0] = 16; crate[1].name = "2L"; crate[1].ns = 1; crate[1].slots[0] = 16; @@ -468,71 +438,76 @@ void AliMUONTriggerElectronics::LocalResponse() crate[4].name = "2-3R"; crate[4].ns = 2; crate[4].slots[0] = 1; crate[4].slots[1] = 9; crate[5].name = "2-3L"; crate[5].ns = 2; crate[5].slots[0] = 1; crate[5].slots[1] = 9; - for (Int_t i=0; iUncheckedAt(i); - - for (Int_t icr=0; icr<6; icr++) - { + AliMUONTriggerCrate* cr; + + fCrates->FirstCrate(); + + while ( ( cr = fCrates->NextCrate() ) ) + { + Int_t iib = -1; + + for (Int_t icr=0; icr<6; icr++) + { const char *n = (crate[icr].name).Data(); - AliMUONTriggerCrate *dcr = (AliMUONTriggerCrate*)fCrates->FindObject(n); - -// THIS CRATE CONTAINS AN INTERFACE BOARD - if ( dcr && !strcmp(cr->GetName(),dcr->GetName()) ) iib = icr; - } - - TObjArray *boards = cr->Boards(); - - AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0); - - for (Int_t j=1; jGetEntries(); j++) - { - TObject *o = boards->At(j); - - if (!o) break; - - AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; - - if (board) - { - board->Response(); + AliMUONTriggerCrate *dcr = fCrates->Crate(n); + + // THIS CRATE CONTAINS AN INTERFACE BOARD + if ( dcr && !strcmp(cr->GetName(),dcr->GetName()) ) iib = icr; + } + + 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=1; jGetEntries(); j++) + { + TObject *o = boards->At(j); + + if (!o) break; + + AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; + + if (board) + { + board->Response(); - fLocal[i][j-1] = board->GetResponse(); - -// CRATE CONTAINING INTERFACE BOARD - if ( iib>-1 ) - { - for (Int_t iid = 0; iidGetResponse(); + + // CRATE CONTAINING INTERFACE BOARD + if ( iib>-1 ) + { + for (Int_t iid = 0; iidGetName(),j,cr->GetName())); + if ( tmp != 0 ) + AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response", + board->GetName(),j,cr->GetName())); } } - } - } - - UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0; - - for (Int_t j=1; jGetEntries(); j++) thisl[j] = fLocal[i][j-1]; - - regb->SetLocalResponse(thisl); + } + + thisl[j-1] = tmp; } - } + } + + regb->SetLocalResponse(thisl); + } } //___________________________________________ void AliMUONTriggerElectronics::RegionalResponse() { - for (Int_t i=0; iUncheckedAt(i); - + /// Compute the response for all regional cards. + AliMUONTriggerCrate* cr; + + fCrates->FirstCrate(); + + while ( ( cr = fCrates->NextCrate() ) ) + { TObjArray *boards = cr->Boards(); AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0); @@ -540,8 +515,6 @@ void AliMUONTriggerElectronics::RegionalResponse() if (regb) { regb->Response(); - - fRegional[i] = regb->GetResponse(); } } } @@ -549,16 +522,38 @@ void AliMUONTriggerElectronics::RegionalResponse() //___________________________________________ void AliMUONTriggerElectronics::GlobalResponse() { - fGlobalTriggerBoard->SetRegionalResponse(fRegional); - - fGlobalTriggerBoard->Response(); - - fGlobal = fGlobalTriggerBoard->GetResponse(); + /// Compute the global response + + UShort_t regional[16]; + + AliMUONTriggerCrate* cr; + + fCrates->FirstCrate(); + Int_t irb(0); + + if ( !fCrates->NumberOfCrates() >= 16 ) + { + AliFatal(Form("Something is wrong : too many crates %d", + fCrates->NumberOfCrates())); + } + + while ( ( cr = fCrates->NextCrate() ) ) + { + AliMUONTriggerBoard* rb = + static_cast(cr->Boards()->At(0)); + regional[irb] = rb->GetResponse(); + ++irb; + } + + fGlobalTriggerBoard->SetRegionalResponse(regional); + fGlobalTriggerBoard->Response(); } //___________________________________________ void AliMUONTriggerElectronics::BoardName(Int_t ix, Int_t iy, char *name) { +//* BOARD NAME FROM PAD INFO (OLD MAPPING) +//* TString s = (ix>0) ? "R" : "L"; Int_t board = iy / 16, bid[4] = {12,34,56,78}; @@ -575,23 +570,12 @@ void AliMUONTriggerElectronics::BoardName(Int_t ix, Int_t iy, char *name) AliDebug(3, Form("Strip ( %d , %d ) connected to board %s ", ix, iy, name)); } -//___________________________________________ -void AliMUONTriggerElectronics::AddCrate(char *name) -{ - TClonesArray &lcrates = *fCrates; - new(lcrates[fNCrates++]) AliMUONTriggerCrate(name,17); -} - -//___________________________________________ -AliMUONTriggerCrate* AliMUONTriggerElectronics::Crate(char *name) -{ - return (AliMUONTriggerCrate*)fCrates->FindObject(name); -} - //___________________________________________ void AliMUONTriggerElectronics::BuildName(Int_t icirc, char name[20]) { - const Int_t CircuitId[234] = +//* GET BOARD NAME FROM OLD NUMBERING +//* + const Int_t kCircuitId[234] = { 111, 121, 131, 141, 151, 161, 171, 211, 212, 221, 222, 231, 232, 241, 242, 251, 252, 261, 262, 271, @@ -615,174 +599,151 @@ void AliMUONTriggerElectronics::BuildName(Int_t icirc, char name[20]) Int_t b[4] = {12, 34, 56, 78}; - Int_t code = TMath::Abs(CircuitId[icirc]); + Int_t code = TMath::Abs(kCircuitId[icirc]); - Int_t L = code / 100; + Int_t lL = code / 100; - Int_t C = ( code - 100 * L ) / 10; + Int_t cC = ( code - 100 * lL ) / 10; - Int_t B = code - 100 * L - 10 * C; + Int_t bB = code - 100 * lL - 10 * cC; - const char *Side = (CircuitId[icirc]>0) ? "R" : "L"; + const char *side = (kCircuitId[icirc]>0) ? "R" : "L"; -// L=1 AT TOP - L -= 9; L = abs(L); L++; +// lL=1 AT TOP + lL -= 9; lL = abs(lL); lL++; - sprintf(name,"%sC%dL%dB%d",Side,C,L,b[B-1]); + sprintf(name,"%sC%dL%dB%d",side,cC,lL,b[bB-1]); } //_______________________________________________________________________ void AliMUONTriggerElectronics::Exec(Option_t*) { +//* +//* Digits2Trigger(); } //_______________________________________________________________________ void AliMUONTriggerElectronics::Trigger() { - Feed(); +//* +//* + FeedM(); LocalResponse(); RegionalResponse(); GlobalResponse(); } -/* -//_______________________________________________________________________ -void AliMUONTriggerElectronics::DisableCrate(Int_t icrate) -{ - fRegional[icrate] = 0; -} -//_______________________________________________________________________ -void AliMUONTriggerElectronics::DisableCrate(char *Name) -{ - Int_t icrate; - - for (Int_t i=0; iUncheckedAt(i); - if (strcmp(cr->GetName(),Name) ) - continue; - else - { - icrate = i; - break; - } - } - - fRegional[icrate] = 0; -} - -//_______________________________________________________________________ -void AliMUONTriggerElectronics::DisableBoardInCrate(Int_t icrate, Int_t islot) -{ -// BEWARE, REGIONAL BOARD IS IN SLOT 0 - fLocal[icrate][islot] = 0; -} -*/ //_______________________________________________________________________ void AliMUONTriggerElectronics::Digits2Trigger() { - ClearDigitNumbers(); - - fMUONData->ResetTrigger(); - -// RUN THE FULL BEE CHAIN - Trigger(); - - // if ( AliDebugLevel() > 1 ) -// { -// DumpOS(); -// } - - for (Int_t i=0; iUncheckedAt(i); - - TObjArray *boards = cr->Boards(); - - for (Int_t j=1; jGetEntries(); j++) - { - TObject *o = boards->At(j); - - if (!o) break; - - AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; - - if (board) - { -// L0 TRIGGER - if (board->Triggered()) - { - Int_t localtr[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0}; - - Int_t icirc = board->GetI(); - - localtr[0] = icirc; - localtr[1] = board->GetStripX11(); - localtr[2] = board->GetDev(); - localtr[3] = board->GetStripY11(); - -// SAVE LUT OUTPUT - localtr[4] = (fLocal[i][j-1] & 12) >> 2; - localtr[5] = (fLocal[i][j-1] & 48) >> 4; - localtr[6] = (fLocal[i][j-1] & 3); - -// SAVE BIT PATTERN - localtr[7] = board->GetXY(0,0); - localtr[8] = board->GetXY(0,1); - localtr[9] = board->GetXY(0,2); - localtr[10] = board->GetXY(0,3); - - localtr[11] = board->GetXY(1,0); - localtr[12] = board->GetXY(1,1); - localtr[13] = board->GetXY(1,2); - localtr[14] = board->GetXY(1,3); - -// ADD A NEW LOCAL TRIGGER - AliMUONLocalTrigger *pLocTrig = new AliMUONLocalTrigger(localtr, fDigitNumbers[icirc]); - - fMUONData->AddLocalTrigger(*pLocTrig); - } - } + /// Main method to go from digits to trigger decision + + ClearDigitNumbers(); + + fMUONData->ResetTrigger(); + + // RUN THE FULL BEE CHAIN + Trigger(); + // DumpOS(); + + AliMUONTriggerCrate* cr; + + fCrates->FirstCrate(); + + while ( ( cr = fCrates->NextCrate() ) ) + { + TObjArray *boards = cr->Boards(); + + for (Int_t j=1; jGetEntries(); j++) + { + TObject *o = boards->At(j); + + if (!o) break; + + AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o; + + if (board) + { + // L0 TRIGGER + if (board->Triggered()) + { + Int_t localtr[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0}; + + Int_t icirc = board->GetNumber(); + + localtr[0] = icirc; + localtr[1] = board->GetStripX11(); + localtr[2] = board->GetDev(); + localtr[3] = board->GetStripY11(); + + // SAVE LUT OUTPUT + UShort_t response = board->GetResponse(); + localtr[4] = (response & 12) >> 2; + localtr[5] = (response & 48) >> 4; + localtr[6] = (response & 3); + + TBits rrr; + rrr.Set(6,&response); + + // SAVE BIT PATTERN + localtr[7] = board->GetXY(0,0); + localtr[8] = board->GetXY(0,1); + localtr[9] = board->GetXY(0,2); + localtr[10] = board->GetXY(0,3); + + localtr[11] = board->GetXY(1,0); + localtr[12] = board->GetXY(1,1); + localtr[13] = board->GetXY(1,2); + localtr[14] = board->GetXY(1,3); + + // ADD A NEW LOCAL TRIGGER + AliMUONLocalTrigger *pLocTrig = new AliMUONLocalTrigger(localtr, fDigitNumbers[icirc]); + + fMUONData->AddLocalTrigger(*pLocTrig); + } } - } - -// GLOBAL TRIGGER INFORMATION: [0] -> LOW PT -// [1] -> HIGH PT -// [2] -> ALL PT - Int_t GlobalSinglePlus[3], GlobalSingleMinus[3], GlobalSingleUndef[3]; - Int_t GlobalPairUnlike[3], GlobalPairLike[3]; - - GlobalPairUnlike[0] = (fGlobal & 16) >> 4; - GlobalPairUnlike[1] = (fGlobal & 256) >> 8; - GlobalPairUnlike[2] = (fGlobal & 1); - - GlobalPairLike[0] = (fGlobal & 32) >> 5; - GlobalPairLike[1] = (fGlobal & 512) >> 9; - GlobalPairLike[2] = (fGlobal & 2) >> 1; - - GlobalSinglePlus[0] = ((fGlobal & 192) >> 6) == 2; - GlobalSinglePlus[1] = ((fGlobal & 3072) >> 10) == 2; - GlobalSinglePlus[2] = ((fGlobal & 12) >> 2) == 2; - - GlobalSingleMinus[0] = ((fGlobal & 192) >> 6) == 1; - GlobalSingleMinus[1] = ((fGlobal & 3072) >> 10) == 1; - GlobalSingleMinus[2] = ((fGlobal & 12) >> 2) == 1; - - GlobalSingleUndef[0] = ((fGlobal & 192) >> 6) == 3; - GlobalSingleUndef[1] = ((fGlobal & 3072) >> 10) == 3; - GlobalSingleUndef[2] = ((fGlobal & 12) >> 2) == 3; - - AliMUONGlobalTrigger *pGloTrig = new AliMUONGlobalTrigger(GlobalSinglePlus, GlobalSingleMinus, - GlobalSingleUndef, GlobalPairUnlike, - GlobalPairLike); - -// ADD A LOCAL TRIGGER IN THE LIST - fMUONData->AddGlobalTrigger(*pGloTrig); - -// Now reset electronics - Reset(); + } + } + + // GLOBAL TRIGGER INFORMATION: [0] -> LOW PT + // [1] -> HIGH PT + // [2] -> ALL PT + Int_t globalSinglePlus[3], globalSingleMinus[3], globalSingleUndef[3]; + Int_t globalPairUnlike[3], globalPairLike[3]; + + UShort_t global = fGlobalTriggerBoard->GetResponse(); + + globalPairUnlike[0] = (global & 16) >> 4; + globalPairUnlike[1] = (global & 256) >> 8; + globalPairUnlike[2] = (global & 1); + + globalPairLike[0] = (global & 32) >> 5; + globalPairLike[1] = (global & 512) >> 9; + globalPairLike[2] = (global & 2) >> 1; + + globalSinglePlus[0] = ((global & 192) >> 6) == 2; + globalSinglePlus[1] = ((global & 3072) >> 10) == 2; + globalSinglePlus[2] = ((global & 12) >> 2) == 2; + + globalSingleMinus[0] = ((global & 192) >> 6) == 1; + globalSingleMinus[1] = ((global & 3072) >> 10) == 1; + globalSingleMinus[2] = ((global & 12) >> 2) == 1; + + globalSingleUndef[0] = ((global & 192) >> 6) == 3; + globalSingleUndef[1] = ((global & 3072) >> 10) == 3; + globalSingleUndef[2] = ((global & 12) >> 2) == 3; + + AliMUONGlobalTrigger *pGloTrig = new AliMUONGlobalTrigger(globalSinglePlus, globalSingleMinus, + globalSingleUndef, globalPairUnlike, + globalPairLike); + + // ADD A LOCAL TRIGGER IN THE LIST + fMUONData->AddGlobalTrigger(*pGloTrig); + + // NOW RESET ELECTRONICS + Reset(); } //_______________________________________________________________________