X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDAltroMapping.cxx;h=b093dfed5d4b201b6432f973d33a2201c47fa429;hb=38e6cbb2d4e72c5e3cc04e5ba0a3b0f27be42b7b;hp=e360e8f394841dacbe1a5a38bd4f1500ebbe5111;hpb=573322da712664fb93983235e21daed122153be1;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDAltroMapping.cxx b/FMD/AliFMDAltroMapping.cxx index e360e8f3948..b093dfed5d4 100644 --- a/FMD/AliFMDAltroMapping.cxx +++ b/FMD/AliFMDAltroMapping.cxx @@ -37,6 +37,7 @@ #include "AliFMDAltroMapping.h" // ALIFMDALTROMAPPING_H #include "AliFMDParameters.h" #include "AliLog.h" +#include "AliFMDDebug.h" #include #include @@ -69,27 +70,12 @@ AliFMDAltroMapping::CreateInvMapping() return kTRUE; } -//____________________________________________________________________ -Bool_t -AliFMDAltroMapping::Hardware2Detector(UInt_t ddl, UInt_t addr, - UShort_t& det, Char_t& ring, - UShort_t& sec, UShort_t& str) const -{ - // Translate a hardware address to detector coordinates. - // - // See also Hardware2Detector that accepts 4 inputs - UInt_t board = (addr >> 7) & 0x1F; - UInt_t altro = (addr >> 4) & 0x7; - UInt_t chan = (addr & 0xf); - return Hardware2Detector(ddl, board, altro, chan, det, ring, sec, str); -} //____________________________________________________________________ Bool_t -AliFMDAltroMapping::Hardware2Detector(UInt_t ddl, UInt_t board, - UInt_t altro, UInt_t chan, - UShort_t& det, Char_t& ring, - UShort_t& sec, UShort_t& str) const +AliFMDAltroMapping::Channel2StripBase(UShort_t board, UShort_t altro, + UShort_t chan, Char_t& ring, + UShort_t& sec, Short_t& str) const { // Translate a hardware address to detector coordinates. // The detector is simply @@ -110,7 +96,7 @@ AliFMDAltroMapping::Hardware2Detector(UInt_t ddl, UInt_t board, // the outer rings. // // The board number and ALTRO number together identifies the sensor, - // and hence. The lower board number (0 or 2) are the first N / 2 + // and hence. The lower board number (0 or 16) are the first N / 2 // sensors (where N is the number of sensors in the ring). // // There are 3 ALTRO's per card, and each ALTRO serves up to 4 @@ -140,51 +126,177 @@ AliFMDAltroMapping::Hardware2Detector(UInt_t ddl, UInt_t board, // number only. For the inner rings, the map is // // Channel 0 -> Sector 0, strips 0-127 - // Channel 1 -> Sector 1, strips 0-127 + // Channel 1 -> Sector 1, strips 127-0 // Channel 3 -> Sector 0, strips 128-255 - // Channel 4 -> Sector 1, strips 128-255 + // Channel 4 -> Sector 1, strips 255-128 // Channel 5 -> Sector 0, strips 256-383 - // Channel 6 -> Sector 1, strips 256-383 + // Channel 6 -> Sector 1, strips 383-256 // Channel 7 -> Sector 0, strips 384-511 - // Channel 8 -> Sector 1, strips 384-511 + // Channel 8 -> Sector 1, strips 511-384 // // There are only half as many strips in the outer sensors, so there // only 4 channels are used for a full sensor. The map is // // Channel 0 -> Sector 0, strips 0-127 - // Channel 1 -> Sector 1, strips 0-127 + // Channel 1 -> Sector 1, strips 127-0 // Channel 3 -> Sector 0, strips 128-255 - // Channel 4 -> Sector 1, strips 128-255 + // Channel 4 -> Sector 1, strips 255-128 // // With this information, we can decode the hardware address to give // us detector coordinates, unique at least up a 128 strips. We - // return the first strip in the given range. + // return the first strip, as seen by the ALTRO channel, in the + // given range. // - det = ddl + 1; - ring = (board % 2) == 0 ? 'I' : 'O'; + ring = Board2Ring(board); + UShort_t fsec = board < 16 ? 1 : 0; switch (ring) { case 'i': case 'I': - sec = ((board / 16) * 10 + (altro < 1 ? 0 : altro < 2 ? 4 : 6) + sec = (fsec * 10 + (altro < 1 ? 0 : altro < 2 ? 4 : 6) + 2 * (chan / 8) + chan % 2); str = ((chan % 8) / 2) * 128; break; case 'o': case 'O': - sec = ((board / 16) * 20 + (altro < 1 ? 0 : altro < 2 ? 8 : 12) + sec = (fsec * 20 + (altro < 1 ? 0 : altro < 2 ? 8 : 12) + 2 * (chan / 4) + chan % 2); str = ((chan % 4) / 2) * 128; break; } + if (sec % 2) str += 127; + // AliFMDDebug(1, ("%02x/%x/%x Base strip = %d", board, altro, chan, str)); return kTRUE; } +//____________________________________________________________________ +void +AliFMDAltroMapping::Timebin2Strip(UShort_t sec, + UShort_t timebin, + UShort_t preSamples, + UShort_t sampleRate, + Short_t& stripOff, + UShort_t& sample) const +{ + // Compute the strip off-set in the current channel from the sector + // and timebin. Also needed for this computation is the basic + // offset in timebins, as well as the sample rat. + UShort_t t = (timebin - preSamples); + sample = (t % sampleRate); + t -= sample; + stripOff = (sec % 2 ? -1 : 1) * t / sampleRate; +} + +#if 0 //____________________________________________________________________ Bool_t -AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring, - UShort_t sec, UShort_t str, - UInt_t& ddl, UInt_t& board, - UInt_t& altro, UInt_t& chan) const +AliFMDAltroMapping::Hardware2Detector(UInt_t ddl, UInt_t board, + UInt_t altro, UInt_t chan, + UShort_t& det, Char_t& ring, + UShort_t& sec, Short_t& str) const +{ + // See also Hardware2Detector that requires 3 inputs + det = DDL2Detector(ddl); + return Channel2StripBase(board, altro, chan, ring, sec, str); +} + + +//____________________________________________________________________ +Bool_t +AliFMDAltroMapping::Hardware2Detector(UInt_t ddl, UInt_t addr, + UShort_t& det, Char_t& ring, + UShort_t& sec, Short_t& str) const +{ + // Translate a hardware address to detector coordinates. + // + // See also Hardware2Detector that accepts 4 inputs + UShort_t board, altro, chan; + ChannelAddress(addr, board, altro, chan); + return Hardware2Detector(ddl,board, altro, chan, det,ring, sec, str); +} +#endif + +//____________________________________________________________________ +Bool_t +AliFMDAltroMapping::Hardware2Detector(UShort_t ddl, UShort_t board, + UShort_t altro, UShort_t chan, + UShort_t timebin, UShort_t preSamples, + UShort_t sampleRate, + UShort_t& det, Char_t& ring, + UShort_t& sec, Short_t& str, + UShort_t& sam) const +{ + // Full conversion from hardware address, including timebin number, + // to detector coordinates and sample number. Note, that this + // conversion depends on the oversampling rate and the number of + // pre-samples + Short_t baseStrip, stripOffset, tdet = DDL2Detector(ddl); + if (tdet < 0) return kFALSE; + det = tdet; + if (!Channel2StripBase(board, altro, chan, ring, sec, baseStrip)) + return kFALSE; + Timebin2Strip(sec, timebin, preSamples, sampleRate, stripOffset, sam); +#if 0 + AliFMDDebug(1, ("0x%x/0x%02x/0x%x/0x%x/%04d -> FMD%d%c[%2d,%3d]-%d " + "(pre=%d,rate=%d,base=%3d,off=%3d)", + ddl, + board, + altro, + chan, + timebin, + det, + ring, + sec, + str, + sam, + preSamples, + sampleRate, + baseStrip, + stripOffset)); +#endif + str = baseStrip + stripOffset; + return kTRUE; +} + +//____________________________________________________________________ +Bool_t +AliFMDAltroMapping::Hardware2Detector(UShort_t ddl, UShort_t addr, + UShort_t timebin, UShort_t preSamples, + UShort_t sampleRate, + UShort_t& det, Char_t& ring, + UShort_t& sec, Short_t& str, + UShort_t& sam) const +{ + // Translate a hardware address to detector coordinates. + // + // See also Hardware2Detector that accepts 4 inputs + UShort_t board, altro, chan; + ChannelAddress(addr, board, altro, chan); + return Hardware2Detector(ddl, board, altro, chan, + timebin, preSamples, sampleRate, + det, ring, sec, str, sam); +} + + +//____________________________________________________________________ +Short_t +AliFMDAltroMapping::Sector2Board(Char_t ring, UShort_t sec) const +{ + switch (ring) { + case 'I': + case 'i': + return (sec / 10) * 16; + case 'O': + case 'o': + return (sec / 20) * 16 + 1; + } + return -1; +} + +//_____________________________________________ _______________________ +Bool_t +AliFMDAltroMapping::Strip2Channel(Char_t ring, UShort_t sec, + UShort_t str, UShort_t& board, + UShort_t& altro, UShort_t& chan) const { // Translate detector coordinates to a hardware address. // The ddl is simply @@ -229,80 +341,165 @@ AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring, // Sector 0, strips 128-255 -> Channel 2 // Sector 0, strips 256-383 -> Channel 4 // Sector 0, strips 384-511 -> Channel 6 - // Sector 1, strips 0-127 -> Channel 1 - // Sector 1, strips 128-255 -> Channel 3 - // Sector 1, strips 256-383 -> Channel 5 - // Sector 1, strips 384-511 -> Channel 7 + // Sector 1, strips 127- 0 -> Channel 1 + // Sector 1, strips 255-128 -> Channel 3 + // Sector 1, strips 383-256 -> Channel 5 + // Sector 1, strips 511-384 -> Channel 7 // Sector 2, strips 0-127 -> Channel 8 // Sector 2, strips 128-255 -> Channel 10 // Sector 2, strips 256-383 -> Channel 12 // Sector 2, strips 384-511 -> Channel 14 - // Sector 3, strips 0-127 -> Channel 9 - // Sector 3, strips 128-255 -> Channel 11 - // Sector 3, strips 256-383 -> Channel 13 - // Sector 3, strips 384-511 -> Channel 15 + // Sector 3, strips 127- 0 -> Channel 9 + // Sector 3, strips 255-128 -> Channel 11 + // Sector 3, strips 383-256 -> Channel 13 + // Sector 3, strips 511-384 -> Channel 15 // // and so on, up to sector 19. For the outer, the map is // // Sector 0, strips 0-127 -> Channel 0 // Sector 0, strips 128-255 -> Channel 2 - // Sector 1, strips 0-127 -> Channel 1 - // Sector 1, strips 128-255 -> Channel 3 + // Sector 1, strips 127- 0 -> Channel 1 + // Sector 1, strips 255-128 -> Channel 3 // Sector 2, strips 0-127 -> Channel 4 // Sector 2, strips 128-255 -> Channel 6 - // Sector 3, strips 0-127 -> Channel 5 - // Sector 3, strips 128-255 -> Channel 7 + // Sector 3, strips 127- 0 -> Channel 5 + // Sector 3, strips 255-128 -> Channel 7 // Sector 4, strips 0-127 -> Channel 8 // Sector 4, strips 128-255 -> Channel 10 - // Sector 5, strips 0-127 -> Channel 9 - // Sector 5, strips 128-255 -> Channel 11 + // Sector 5, strips 127- 0 -> Channel 9 + // Sector 5, strips 255-128 -> Channel 11 // Sector 6, strips 0-127 -> Channel 12 // Sector 6, strips 128-255 -> Channel 14 - // Sector 7, strips 0-127 -> Channel 13 - // Sector 7, strips 128-255 -> Channel 15 + // Sector 7, strips 127- 0 -> Channel 13 + // Sector 7, strips 255-128 -> Channel 15 // // and so on upto sector 40. // // With this information, we can decode the detector coordinates to // give us a unique hardware address // - ddl = (det - 1); - UInt_t tmp = 0; + UInt_t tmp = 0; + UShort_t fboard = 0; switch (ring) { case 'I': case 'i': - board = (sec / 10) * 16; - altro = (sec % 10) < 4 ? 0 : (sec % 10) < 6 ? 1 : 2; - tmp = (sec % 10) - (altro == 0 ? 0 : altro == 1 ? 4 : 6); - chan = 2 * (str / 128) + (sec % 2) + ((tmp / 2) % 2) * 8; + fboard = sec < 10 ? 1 : 0; + board = fboard * 16; + altro = (sec % 10) < 4 ? 0 : (sec % 10) < 6 ? 1 : 2; + tmp = (sec % 10) - (altro == 0 ? 0 : altro == 1 ? 4 : 6); + chan = 2 * (str / 128) + (sec % 2) + ((tmp / 2) % 2) * 8; break; case 'O': case 'o': - board = (sec / 20) * 16 + 1; - altro = (sec % 20) < 8 ? 0 : (sec % 20) < 12 ? 1 : 2; - tmp = (sec % 20) - (altro == 0 ? 0 : altro == 1 ? 8 : 12); - chan = 2 * (str / 128) + (sec % 2) + ((tmp / 2) % 4) * 4; + fboard = sec < 20 ? 1 : 0; + board = fboard * 16 + 1; + altro = (sec % 20) < 8 ? 0 : (sec % 20) < 12 ? 1 : 2; + tmp = (sec % 20) - (altro == 0 ? 0 : altro == 1 ? 8 : 12); + chan = 2 * (str / 128) + (sec % 2) + ((tmp / 2) % 4) * 4; break; } return kTRUE; } +//_____________________________________________ _______________________ +UShort_t +AliFMDAltroMapping::Strip2Timebin(UShort_t sec, UShort_t strip, + UShort_t sam, UShort_t preSamples, + UShort_t sampleRate) const +{ + UShort_t timebin = preSamples; + if (sec % 2) timebin += (127 - (strip % 128)) * sampleRate; + else timebin += (strip % 128) * sampleRate; + timebin += sam; + return timebin; +} + +#if 0 +//_____________________________________________ _______________________ +Bool_t +AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring, + UShort_t sec, UShort_t str, + UShort_t& ddl, UShort_t& board, + UShort_t& altro, UShort_t& chan) const +{ + ddl = Detector2DDL(det); + return Strip2Channel(ring, sec, str, board, altro, chan); +} + + //____________________________________________________________________ Bool_t AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, UShort_t str, - UInt_t& ddl, UInt_t& addr) const + UShort_t& ddl, UShort_t& addr) const { // Translate detector coordinates to a hardware address. // // See also Detector2Hardware that returns 4 parameters. - UInt_t board = 0; - UInt_t altro = 0; - UInt_t chan = 0; + UShort_t board = 0; + UShort_t altro = 0; + UShort_t chan = 0; if (!Detector2Hardware(det,ring,sec,str,ddl,board,altro,chan)) return kFALSE; - addr = chan + (altro << 4) + (board << 7); + addr = ChannelAddress(board, altro, chan); return kTRUE; } +#endif + +//____________________________________________________________________ +Bool_t +AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring, + UShort_t sec, UShort_t str, + UShort_t sam, + UShort_t preSamples, + UShort_t sampleRate, + UShort_t& ddl, UShort_t& board, + UShort_t& altro, UShort_t& channel, + UShort_t& timebin) const +{ + ddl = Detector2DDL(det); + if (!Strip2Channel(ring,sec,str,board,altro,channel)) return kFALSE; + timebin = Strip2Timebin(sec, str, sam, preSamples, sampleRate); + return kTRUE; +} + + +//____________________________________________________________________ +Bool_t +AliFMDAltroMapping::Detector2Hardware(UShort_t det, Char_t ring, + UShort_t sec, UShort_t str, + UShort_t sam, + UShort_t preSamples, UShort_t sampleRate, + UShort_t& ddl, UShort_t& hwaddr, + UShort_t& timebin) const +{ + UShort_t board = 0; + UShort_t altro = 0; + UShort_t chan = 0; + if (!Detector2Hardware(det, ring, sec, str, sam, + preSamples, sampleRate, + ddl, board, altro, chan, timebin)) return kFALSE; + hwaddr = ChannelAddress(board, altro, chan); + return kTRUE; +} + + +//____________________________________________________________________ +UInt_t +AliFMDAltroMapping::ChannelAddress(UShort_t board, UShort_t altro, + UShort_t channel) const +{ + return (((board & 0x1F) << 7) | ((altro & 0x7) << 4) | (channel & 0xF)); +} + +//____________________________________________________________________ +void +AliFMDAltroMapping::ChannelAddress(UShort_t hwaddr, UShort_t& board, + UShort_t& altro, UShort_t& channel) const +{ + board = ((hwaddr >> 7) & 0x1F); + altro = ((hwaddr >> 4) & 0x07); + channel = ((hwaddr >> 0) & 0x0F); +} //____________________________________________________________________ Int_t @@ -317,11 +514,10 @@ AliFMDAltroMapping::GetHWAddress(Int_t sec, Int_t str, Int_t ring) // pad | strip // sector | ring // - UInt_t ddl, hwaddr; Char_t r = Char_t(ring); - if (!Detector2Hardware(1, r, sec, str, ddl, hwaddr)) - return -1; - return hwaddr; + UShort_t board, altro, channel; + Strip2Channel(r, sec, str, board, altro, channel); + return ChannelAddress(board, altro, channel); } //____________________________________________________________________ @@ -337,13 +533,13 @@ AliFMDAltroMapping::GetPadRow(Int_t hwaddr) const // pad | strip // sector | ring // - UShort_t det; Char_t ring; - UShort_t sec; - UShort_t str; - Int_t ddl = 0; - if (!Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) return -1; - return Int_t(sec); + UShort_t board, altro, channel, sector; + Short_t baseStrip; + ChannelAddress(hwaddr, board, altro, channel); + if (!Channel2StripBase(board, altro, channel, ring, sector, baseStrip)) + return -1; + return Int_t(sector); } //____________________________________________________________________ @@ -359,13 +555,13 @@ AliFMDAltroMapping::GetPad(Int_t hwaddr) const // pad | strip // sector | ring // - UShort_t det; Char_t ring; - UShort_t sec; - UShort_t str; - Int_t ddl = 0; - if (!Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) return -1; - return Int_t(str); + UShort_t board, altro, channel, sector; + Short_t baseStrip; + ChannelAddress(hwaddr, board, altro, channel); + if (!Channel2StripBase(board, altro, channel, ring, sector, baseStrip)) + return -1; + return Int_t(baseStrip); } //____________________________________________________________________ @@ -381,12 +577,12 @@ AliFMDAltroMapping::GetSector(Int_t hwaddr) const // pad | strip // sector | ring // - UShort_t det; Char_t ring; - UShort_t sec; - UShort_t str; - Int_t ddl = 0; - if (!Hardware2Detector(ddl, hwaddr, det, ring, sec, str)) return -1; + UShort_t board, altro, channel, sector; + Short_t baseStrip; + ChannelAddress(hwaddr, board, altro, channel); + if (!Channel2StripBase(board, altro, channel, ring, sector, baseStrip)) + return -1; return Int_t(ring); } @@ -396,8 +592,9 @@ AliFMDAltroMapping::Print(Option_t* option) const { TString opt(option); opt.ToLower(); - UInt_t ddl, board, chip, chan, addr; - UShort_t det, sec, str; + UShort_t ddl, board, chip, chan, addr; + UShort_t det, sec; + Short_t strBase; Char_t rng; if (opt.Contains("hw") || opt.Contains("hardware")) { @@ -407,23 +604,24 @@ AliFMDAltroMapping::Print(Option_t* option) const for (ddl = 0; ddl <= 2; ddl++) { Int_t boards[] = { 0, 16, (ddl == 0 ? 32 : 1), 17, 32}; Int_t* ptr = boards; + det = DDL2Detector(ddl); while ((board = *(ptr++)) < 32) { for (chip = 0; chip <= 2; chip++) { - UInt_t nchan = (chip == 1 ? 8 : 16); + UShort_t nchan = (chip == 1 ? 8 : 16); for (chan = 0; chan < nchan; chan++) { - Hardware2Detector(ddl, board, chip, chan, det, rng, sec, str); - addr = ((board & 0x1f) << 7) | ((chip & 0x7) << 4) | (chan & 0xf); + Channel2StripBase(board, chip, chan, rng, sec, strBase); + addr = ChannelAddress(board, chip, chan); std::cout << " " - << std::setw(3) << ddl << " | " - << std::setfill('0') << std::hex << " 0x" - << std::setw(2) << board << " | 0x" - << std::setw(1) << chip << " | 0x" - << std::setw(1) << chan << " | 0x" - << std::setw(3) << addr << " | " - << std::setfill(' ') << std::dec << " FMD" - << std::setw(1) << det << rng << "[" - << std::setw(2) << sec << "," << std::setw(3) << str - << "]" << std::endl; + << std::setw(3) << ddl << " | " + << std::setfill('0') << std::hex << " 0x" + << std::setw(2) << board << " | 0x" + << std::setw(1) << chip << " | 0x" + << std::setw(1) << chan << " | 0x" + << std::setw(3) << addr << " | " + << std::setfill(' ') << std::dec << " FMD" + << std::setw(1) << det << rng << "[" + << std::setw(2) << sec << "," + << std::setw(3) << strBase << "]" << std::endl; } // for chan ... if (chip == 2 && *ptr >= 32) continue; std::cout << " + + + + + " @@ -441,24 +639,24 @@ AliFMDAltroMapping::Print(Option_t* option) const for (det = 1; det <= 3; det++) { Char_t rings[] = { 'I', (det == 1 ? '\0' : 'O'),'\0' }; Char_t* ptr = rings; + ddl = Detector2DDL(det); while ((rng = *(ptr++)) != '\0') { UShort_t nsec = (rng == 'I' ? 20 : 40); UShort_t nstr = (rng == 'I' ? 512 : 256); for (sec = 0; sec < nsec; sec++) { - for (str = 0; str < nstr; str += 128) { - ddl = board = chip = chan; - Detector2Hardware(det,rng,sec,str,ddl,board,chip,chan); - addr = ((board & 0x1f) << 7) | ((chip & 0x7) << 4) | (chan & 0xf); - std::cout << std::setfill(' ') << std::dec << " FMD" - << std::setw(1) << det << rng << "[" - << std::setw(2) << sec << "," - << std::setw(3) << str << "] | " - << std::setw(3) << ddl << " | 0x" - << std::setfill('0') << std::hex - << std::setw(2) << board << " | 0x" - << std::setw(1) << chip << " | 0x" - << std::setw(1) << chan << " | 0x" - << std::setw(3) << addr << std::endl; + for (strBase = 0; strBase < nstr; strBase += 128) { + Strip2Channel(rng, sec, strBase, board, chip, chan); + addr = ChannelAddress(board, chip, chan); + std::cout << std::setfill(' ') << std::dec << " FMD" + << std::setw(1) << det << rng << "[" + << std::setw(2) << sec << "," + << std::setw(3) << strBase << "] | " + << std::setw(3) << ddl << " | 0x" + << std::setfill('0') << std::hex + << std::setw(2) << board << " | 0x" + << std::setw(1) << chip << " | 0x" + << std::setw(1) << chan << " | 0x" + << std::setw(3) << addr << std::endl; } // for str ... } // for sec ... if (*ptr == '\0') continue;