/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Event/RawDataCnv/RawDataCnv-00-04-35/src/Util/MdcConverter.cxx

Go to the documentation of this file.
00001 #include "Identifier/MdcID.h"
00002 #include "RawDataCnv/Util/MdcConverter.h"
00003 
00004 MdcConverter* MdcConverter::s_instance = 0;
00005 
00006 MdcConverter* MdcConverter::instance(int runMode)
00007 {
00008    if ( s_instance == 0 ) {
00009       s_instance = new MdcConverter(runMode);
00010    }
00011 
00012    return s_instance;
00013 }
00014 
00015 void MdcConverter::destroy()
00016 {
00017    if ( s_instance != 0 ) {
00018       delete s_instance;
00019       s_instance = 0;
00020    }
00021 }
00022 
00023 void MdcConverter::init(int runFrom, int runTo)
00024 {
00025    m_runFrom = runFrom;
00026    m_runTo   = runTo;
00027 
00028    memset((void*)m_mdcTag, 0, 16384*4*4);
00029 }
00030 
00031 StatusCode MdcConverter::convert(const BufferHolder& src, MdcDigiCol* des)
00032 {
00033    //int digiId = 0;
00034    uint32_t TEId, REId, TEData, TEOverflow, TETorQ;
00035 
00036    typedef pair<uint32_t, uint32_t> PairII;
00037    vector<uint32_t>  vHits;
00038    vector<PairII>    vmTDC;
00039 
00040    uint32_t* curTag;
00042 
00043    uint32_t nbuf = src.nBuf();
00044 
00045    for (uint32_t i = 0; i < nbuf; ++i)
00046    {
00047       uint32_t* buf = src(i);
00048       uint32_t* bufend= buf + src.bufSize(i);
00049       for ( ; buf < bufend; ++buf /*, ++digiId*/)
00050       {
00051          uint32_t digi = *buf;
00052          if (((digi>>18) & 0x3FFF) == 0) {
00053             //digiId--;
00054             continue;
00055          }
00056 
00057          m_builder.unPack(digi, REId, TEData, TEOverflow, TETorQ);
00058 
00059          TEId = m_builder.getTEID( REId );
00060          if ( TEId == 0xFFFFFFFF ) continue;
00061 
00062          curTag = m_mdcTag[REId];
00063 
00064          if ( curTag[0] == 0 ) {  //1st signal from detector-unit-REId
00065             curTag[1] = 0x7FFFFFFF;
00066             curTag[2] = 0x7FFFFFFF;
00067             curTag[3] = 0;
00068 
00069             int layer = MdcID::layer(Identifier(TEId));
00070             int wire = MdcID::wire(Identifier(TEId));
00071             //yzhang exchange pre-amplifier
00072             if ( m_runId >= m_runFrom && m_runId <= m_runTo ) {
00073                if (layer == 20 && wire >= 0 && wire <= 7){ 
00074                   TEId = 268456960 + wire;
00075                   curTag[3] |= 0x10;  //16
00076                }
00077                else if (layer == 42 && wire >= 0 && wire <= 7){ 
00078                   TEId = 268478464 + wire;
00079                   curTag[3] |= 0x10;  //16
00080                }
00081                else if (layer == 40 && wire >= 200 && wire <= 207){ 
00082                   TEId += 8;
00083                   curTag[3] |= 0x10;  //16
00084                }
00085                else if (layer == 40 && wire >= 208 && wire <= 215){ 
00086                   TEId -= 8;
00087                   curTag[3] |= 0x10;  //16
00088                }
00089             }
00090 
00091             curTag[0] = (TEId << 2);
00092 
00093             vHits.push_back( REId );
00094          }
00095 
00096          if ( TETorQ == 0 ) {  //T
00097             if ( (curTag[0]&1) == 0 ) {  //1st-found-T
00098                curTag[0] |= 1;
00099                curTag[1] = TEData;
00100                curTag[3] |= TEOverflow;  //0 or 1
00101             }
00102             else {  //multi-T
00103                curTag[3] |= 0xC;  //12, set the multi-T and 1st-T bits
00104                if ( TEData >= curTag[1] ) {
00105                   if ( TEOverflow ) TEData |= (1<<31);  //LastBit
00106                   vmTDC.push_back( make_pair(REId, TEData) );
00107                }
00108                else {
00109                   if ( curTag[3] & 1 ) curTag[1] |= (1<<31);
00110                   vmTDC.push_back( make_pair(REId, curTag[1]) );
00111                   curTag[1] = TEData;
00112                   curTag[3] &= (0xFFFFFFFF-1);
00113                   curTag[3] |= TEOverflow;
00114                }
00115             }
00116          }
00117          else {  //Q
00118             curTag[0] |= 2;
00119             curTag[2] = TEData;
00120             if ( TEOverflow ) curTag[3] |= 2;
00121          }
00122       }
00123    }
00124 
00125    MdcDigi* mdcDigi;
00126    if ( m_runMode == 1 ) {  //OnlineMode, discard the hits that only have T or Q
00127       for ( vector<PairII>::iterator it = vmTDC.begin(); it != vmTDC.end(); ++it ) {
00128          curTag   = m_mdcTag[it->first];
00129          if ( (curTag[0]&3) == 3 ) {
00130             uint32_t  data  = it->second;
00131             if(data>>31) continue;
00132             mdcDigi = new MdcDigi(Identifier(curTag[0]>>2), (data&0x7FFFFFFF), curTag[2]);
00133             mdcDigi->setOverflow( (curTag[3] & 0x16) | (data>>31) );
00134             des->push_back(mdcDigi);
00135          }
00136       }
00137 
00138       for ( vector<uint32_t>::iterator it = vHits.begin(); it != vHits.end(); ++it) {
00139          curTag   = m_mdcTag[*it];
00140          if ( (curTag[0]&3) == 3 ) {
00141             if( ((curTag[3]&3)>0) || (((curTag[3]&12)!=12) && ((curTag[3]&12)!=0)) ) {
00142                curTag[0] = 0;
00143                continue; 
00144             }
00145             mdcDigi = new MdcDigi(Identifier(curTag[0]>>2), curTag[1], curTag[2]);
00146             mdcDigi->setOverflow(curTag[3]);
00147             des->push_back(mdcDigi);
00148          }
00149          curTag[0] = 0;
00150       }
00151    }
00152    else {  //Not OnlineMode, keep all the hits found
00153       for ( vector<PairII>::iterator it = vmTDC.begin(); it != vmTDC.end(); ++it ) {
00154          curTag   = m_mdcTag[it->first];
00155          uint32_t  data     = it->second;
00156          mdcDigi = new MdcDigi(Identifier(curTag[0]>>2), (data&0x7FFFFFFF), curTag[2]);
00157          mdcDigi->setOverflow( (curTag[3] & 0x16) | (data>>31) );
00158          des->push_back(mdcDigi);
00159       }
00160 
00161       for ( vector<uint32_t>::iterator it = vHits.begin(); it != vHits.end(); ++it) {
00162          curTag   = m_mdcTag[*it];
00163          mdcDigi = new MdcDigi(Identifier(curTag[0]>>2), curTag[1], curTag[2]);
00164          mdcDigi->setOverflow(curTag[3]);
00165          des->push_back(mdcDigi);
00166          curTag[0] = 0;
00167       }
00168    }
00169 
00171    return StatusCode::SUCCESS;
00172 }
00173 
00174 StatusCode MdcConverter::convert(MdcDigiCol* src, WriteRawEvent*& des)
00175 {
00176    return m_builder.pack(src, des);
00177 }
00178 
00179 MdcConverter::MdcConverter(int runMode)
00180    : m_runMode( runMode )
00181 {
00182 }
00183 
00184 MdcConverter::~MdcConverter()
00185 {
00186 }

Generated on Tue Nov 29 22:58:32 2016 for BOSS_7.0.2 by  doxygen 1.4.7