All the details of the mapping problem can be found in this ticket. This page is a summary of the problem, solution, and the implementation.
During Run 10 a problem with the BSMD mapping was discovered (details here). It was decided to continue taking data with the 2 fibers swapped for future running, and simply correct the mapping in the DB to reflect the hardware configuration before production. The mapping for the BSMD phi plane (BSMDP) was corrected (completely swapped 2 fibers in the DB) before produvtion to match the Run 10 hardware configuration, so there were no problems with BSMDP mapping in production.
Problem:
The correction to the BSMD eta plane (BSMDE) mapping, however, was incomplete and did not swap the 2 fibers in the DB completely. Ahmed found this mapping problem in "Phase I" of the 200GeV QM production (production series P10ij). All Run 10 data produced in the P10ih and P10ij production series have this BSMDE mapping issue.
Solution:
a) For "Phase II" of the Run 10 data production in the P10ik production series an updated DBV was used to include the correct mapping for both the BSMDE and BSMDP planes. This data should be analyzed as usual, with no need for a patch.
b) In an effort to recover the data produced with the BSMDE mapping problem (P10ih and P10ij) a patch was included in the SL10k and future libraries to correctly swap the BSMDE channels as an afterburner using StEmcDecoder.
Implementation:
The implementation of part b) of the solution above is similar to the patch for previous tower mapping problems. The software patch includes 3 libraries StEmcDecoder, StEmcADCtoEMaker, StEmcRawMaker.
////////////////////////////////////////////////////////////////////////////////////////////////////////// StEmcDecoder* decoder = new StEmcDecoder(date, time); // date and time correspond to the event timestamp StMuEmcCollection* muEmc = muMk->muDst()->muEmcCollection(); // get the MuEmcCollection from muDST //................... BSMDE ....................
nh=muEmc->getNSmdHits(det); if(det == BSMDE) { for(Int_t j=0;j<nh;j++) { StMuEmcHit* hit=muEmc->getSmdHit(j,det); ID = hit->getId(); ADC = hit->getAdc(); CAP = hit->getCalType(); int shift = 0; decoder->GetSmdBugCorrectionShift(ID,shift); newID = ID + shift; // newID is correct softID for this hit if(newID < 0) continue; // mask lost channels // user code starts here
} } //////////////////////////////////////////////////////////////////////////////////////////////////////////