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
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 )
00050 {
00051 uint32_t digi = *buf;
00052 if (((digi>>18) & 0x3FFF) == 0) {
00053
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 ) {
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
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;
00076 }
00077 else if (layer == 42 && wire >= 0 && wire <= 7){
00078 TEId = 268478464 + wire;
00079 curTag[3] |= 0x10;
00080 }
00081 else if (layer == 40 && wire >= 200 && wire <= 207){
00082 TEId += 8;
00083 curTag[3] |= 0x10;
00084 }
00085 else if (layer == 40 && wire >= 208 && wire <= 215){
00086 TEId -= 8;
00087 curTag[3] |= 0x10;
00088 }
00089 }
00090
00091 curTag[0] = (TEId << 2);
00092
00093 vHits.push_back( REId );
00094 }
00095
00096 if ( TETorQ == 0 ) {
00097 if ( (curTag[0]&1) == 0 ) {
00098 curTag[0] |= 1;
00099 curTag[1] = TEData;
00100 curTag[3] |= TEOverflow;
00101 }
00102 else {
00103 curTag[3] |= 0xC;
00104 if ( TEData >= curTag[1] ) {
00105 if ( TEOverflow ) TEData |= (1<<31);
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 {
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 ) {
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 {
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 }