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)) ) continue;
00142 mdcDigi = new MdcDigi(Identifier(curTag[0]>>2), curTag[1], curTag[2]);
00143 mdcDigi->setOverflow(curTag[3]);
00144 des->push_back(mdcDigi);
00145 }
00146 curTag[0] = 0;
00147 }
00148 }
00149 else {
00150 for ( vector<PairII>::iterator it = vmTDC.begin(); it != vmTDC.end(); ++it ) {
00151 curTag = m_mdcTag[it->first];
00152 uint32_t data = it->second;
00153 mdcDigi = new MdcDigi(Identifier(curTag[0]>>2), (data&0x7FFFFFFF), curTag[2]);
00154 mdcDigi->setOverflow( (curTag[3] & 0x16) | (data>>31) );
00155 des->push_back(mdcDigi);
00156 }
00157
00158 for ( vector<uint32_t>::iterator it = vHits.begin(); it != vHits.end(); ++it) {
00159 curTag = m_mdcTag[*it];
00160 mdcDigi = new MdcDigi(Identifier(curTag[0]>>2), curTag[1], curTag[2]);
00161 mdcDigi->setOverflow(curTag[3]);
00162 des->push_back(mdcDigi);
00163 curTag[0] = 0;
00164 }
00165 }
00166
00168 return StatusCode::SUCCESS;
00169 }