Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

MdcConverter Class Reference

#include <MdcConverter.h>

List of all members.

Public Member Functions

StatusCode convert (MdcDigiCol *src, WriteRawEvent *&des)
StatusCode convert (const BufferHolder &src, MdcDigiCol *des)
StatusCode convert (MdcDigiCol *src, WriteRawEvent *&des)
StatusCode convert (const BufferHolder &src, MdcDigiCol *des)
void init (int runFrom, int runTo)
void init (int runFrom, int runTo)
void setRunId (int runId)
void setRunId (int runId)

Static Public Member Functions

void destroy ()
void destroy ()
MdcConverterinstance (int runMode=2)
MdcConverterinstance (int runMode=2)

Private Member Functions

 MdcConverter ()
 MdcConverter (int runMode)
 MdcConverter ()
 MdcConverter (int runMode)
 ~MdcConverter ()
 ~MdcConverter ()

Private Attributes

MdcBuilder m_builder
uint32_t m_mdcTag [16384][4]
int m_runFrom
int m_runId
int m_runMode
int m_runTo

Static Private Attributes

MdcConverters_instance
MdcConverters_instance = 0


Constructor & Destructor Documentation

MdcConverter::MdcConverter int  runMode  )  [private]
 

00177    : m_runMode( runMode )
00178 {
00179 }

MdcConverter::~MdcConverter  )  [private]
 

00182 {
00183 }

MdcConverter::MdcConverter  )  [private]
 

MdcConverter::MdcConverter int  runMode  )  [private]
 

MdcConverter::~MdcConverter  )  [private]
 

MdcConverter::MdcConverter  )  [private]
 


Member Function Documentation

StatusCode MdcConverter::convert MdcDigiCol src,
WriteRawEvent *&  des
 

StatusCode MdcConverter::convert const BufferHolder src,
MdcDigiCol des
 

StatusCode MdcConverter::convert MdcDigiCol src,
WriteRawEvent *&  des
 

00172 {
00173    return m_builder.pack(src, des);
00174 }

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)) ) 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 {  //Not OnlineMode, keep all the hits found
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 }

void MdcConverter::destroy  )  [static]
 

void MdcConverter::destroy  )  [static]
 

00016 {
00017    if ( s_instance != 0 ) {
00018       delete s_instance;
00019       s_instance = 0;
00020    }
00021 }

void MdcConverter::init int  runFrom,
int  runTo
 

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 }

MdcConverter* MdcConverter::instance int  runMode = 2  )  [static]
 

MdcConverter * MdcConverter::instance int  runMode = 2  )  [static]
 

00007 {
00008    if ( s_instance == 0 ) {
00009       s_instance = new MdcConverter(runMode);
00010    }
00011 
00012    return s_instance;
00013 }

void MdcConverter::setRunId int  runId  )  [inline]
 

00019 { m_runId = runId; }

void MdcConverter::setRunId int  runId  )  [inline]
 

00019 { m_runId = runId; }


Member Data Documentation

MdcBuilder MdcConverter::m_builder [private]
 

uint32_t MdcConverter::m_mdcTag [private]
 

int MdcConverter::m_runFrom [private]
 

int MdcConverter::m_runId [private]
 

int MdcConverter::m_runMode [private]
 

int MdcConverter::m_runTo [private]
 

MdcConverter* MdcConverter::s_instance [static, private]
 

MdcConverter * MdcConverter::s_instance = 0 [static, private]
 


The documentation for this class was generated from the following files:
Generated on Wed Feb 2 16:24:19 2011 for BOSS6.5.5 by  doxygen 1.3.9.1