00001 #include "HltAlgorithms/EFtoTDS.h"
00002 #include "HltDataTypes/EFResult.h"
00003
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/SmartDataPtr.h"
00006
00007
00008
00009
00010 #include "EventModel/Event.h"
00011 #include "EventModel/EventHeader.h"
00012 #include "HltEvent/HltEvent.h"
00013 #include "HltEvent/HltRaw.h"
00014 #include "Identifier/Identifier.h"
00015 #include "Identifier/HltID.h"
00016
00017 using namespace std;
00018 using namespace Event;
00019
00021
00022 EFtoTDS::EFtoTDS(const std::string& name, ISvcLocator* pSvcLocator) :
00023 Algorithm(name, pSvcLocator) {
00024 declareProperty("OutputLevel", m_outputLevel);
00025 }
00026
00027 EFtoTDS::~EFtoTDS()
00028 {
00029 }
00030
00031 StatusCode EFtoTDS::initialize(){
00032
00033 MsgStream log(msgSvc(), name());
00034 log << MSG::INFO << "in initialize()" << endreq;
00035
00036 StatusCode sc = service( "HltStoreSvc", m_HltStoreSvc);
00037 if( sc.isFailure() ) {
00038 log << MSG::FATAL << name() << ": Unable to locate Service HltStoreSvc" << endreq;
00039 return sc;
00040 }
00041
00042 return StatusCode::SUCCESS;
00043 }
00044
00045 StatusCode EFtoTDS::execute() {
00046
00047 MsgStream log(msgSvc(), name());
00048 log << MSG::DEBUG << "in execute()" << endreq;
00049
00050 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00051 if (!eventHeader) {
00052 log << MSG::FATAL << "Could not find Event Header" << endreq;
00053 return StatusCode::FAILURE;
00054 }
00055
00056 int eventId = eventHeader->eventNumber() ;
00057 int runId = eventHeader->runNumber();
00058 log << MSG::INFO << "retrieved event: " <<"Event Number "<<eventId<<" run: "<<runId<<endreq;
00059
00060 HltRawCol* aEF=new HltRawCol;
00061
00062 EFResult* efResult;
00063 string answer="";
00064 StatusCode sc = m_HltStoreSvc->get("EventType", efResult);
00065 if ( sc.isFailure() ) {
00066 log << MSG::ERROR << "Could not find EFResult (EventType)" << endreq;
00067 answer="Error";
00068 }
00069 else {
00070 if (efResult->getAnswerIndex() == -1) {
00071 log << MSG::DEBUG << "Unvalid EFResult(AnswerIndex=-1)" << endreq;
00072 answer="Error";
00073 }
00074 answer = efResult->getAnswer();
00075 }
00076 log << MSG::INFO << "The answer is " << answer << endreq;
00077
00078 uint32_t type=0;
00079 if(answer=="Junk") type=1<<0;
00080 else if(answer=="GJunk") type=(1<<1);
00081 else if(answer=="Beamgas") type=1<<2;
00082 else if(answer=="GBeamgas") type=(1<<3);
00083 else if(answer=="Cosmic") type=1<<4;
00084 else if(answer=="GCosmic") type=(1<<5);
00085 else if(answer=="EBhabha") type=1<<6;
00086 else if(answer=="GEBhabha") type=(1<<7);
00087 else if(answer=="BBhabha") type=1<<8;
00088 else if(answer=="GBBhabha") type=(1<<9);
00089 else if(answer=="Dimuon") type=1<<10;
00090 else if(answer=="GDimuon") type=(1<<11);
00091 else if(answer=="Diphoton") type=1<<12;
00092 else if(answer=="GDiphoton") type=(1<<13);
00093 else if(answer=="Hadron") type=1<<14;
00094 else if(answer=="GHadron") type=(1<<15);
00095 else if(answer=="Twophoton") type=1<<16;
00096 else if(answer=="GTwophoton") type=(1<<17);
00097 else if(answer=="RandomTrg") type=1<<31;
00098 else if(answer=="Error") type=1<<30;
00099 else if(answer=="Other") type=1<<29;
00100 else type=1<<28;
00101
00102 uint32_t id=0x50000000;
00103 HltRaw* efType=new HltRaw(id);
00104 efType->setIntChannel(type);
00105 aEF->push_back(efType);
00106
00107 sc = m_HltStoreSvc->get("EFResult", efResult) ;
00108 if ( sc.isFailure() ) {
00109 log << MSG::FATAL << "Could not find EFResult (EFResult)" << endreq;
00110 return StatusCode::FAILURE;
00111 }
00112 else {
00113 uint32_t alg= efResult->getEFVec(0);
00114 id++;
00115 HltRaw* efAlg=new HltRaw(id);
00116 uint32_t alg8=alg&0xFF;
00117 efAlg->setIntChannel(alg8);
00118 aEF->push_back(efAlg);
00119 id++;
00120 uint32_t cri=alg>>8;
00121 HltRaw* efCri=new HltRaw(id);
00122 efCri->setIntChannel(cri);
00123 aEF->push_back(efCri);
00124 id++;
00125 HltRaw* efVer=new HltRaw(id);
00126 efVer->setIntChannel(0);
00127 aEF->push_back(efVer);
00128 uint32_t etot= efResult->getEFVec(31);
00129 id++;
00130 HltRaw* efEtot=new HltRaw(id);
00131 efEtot->setFloatChannel(*((float*)&etot));
00132 aEF->push_back(efEtot);
00133
00134 uint32_t num=efResult->getEFVec(1);
00135 int nmdc=num&0xFF;
00136 int ntof=(num>>8)&0xFF;
00137 int nemc=(num>>16)&0xFF;
00138 int nmuc=(num>>24)&0xFF;
00139 int ndata=1;
00140
00141 uint32_t ndatap = nmdc+ntof+nemc+nmuc;
00142 ndata += ndatap;
00143 int ndec=efResult->getDecNum();
00144 if(ndec>0) ndata +=(ndec+1);
00145
00146 log << MSG::DEBUG << "ndata=" << ndata << "; nmdc=" << nmdc << ", ntof=" << ntof
00147 << ", nemc=" << nemc << ", nmuc=" << nmuc << ", ndec=" << ndec << endreq;
00148
00149 if((alg&4)&&(!(alg&2))) log << MSG::WARNING<<"sub-algorithms error!"<<endreq;
00150
00151 uint32_t* var=new uint32_t[ndata];
00152 if(ndata==1){
00153 var[0]=0;
00154 }
00155 else{
00156 var[0]=num;
00157 int i=1;
00158 for(int j=5;j<5+nmdc;j++){
00159 var[i]=efResult->getEFVec(j);
00160 ++i;
00161 }
00162 for(int j=25;j<25+ntof;j++){
00163 var[i]=efResult->getEFVec(j);
00164 ++i;
00165 }
00166 for(int j=30;j<30+nemc;j++){
00167 var[i]=efResult->getEFVec(j);
00168 ++i;
00169 }
00170 for(int j=52;j<52+nmuc;j++){
00171 var[i]=efResult->getEFVec(j);
00172 ++i;
00173 }
00174 if(ndec>0) {
00175 var[i]=ndec;
00176 ++i;
00177 for(int j=54;j<54+ndec;++j){
00178 var[i]=efResult->getEFVec(j);
00179 ++i;
00180 }
00181 }
00182 if(i!=ndata) log << MSG::FATAL << "number of datat error!" << endreq;
00183 }
00184
00185 id++;
00186 HltRaw* efTag=new HltRaw(id);
00187 efTag->setIntChannel(var[0]);
00188 aEF->push_back(efTag);
00189
00190 for(int i=1;i<ndata;i++){
00191 id++;
00192 HltRaw* efVar=new HltRaw(HltID::convert(id,nmdc,ntof,nemc,nmuc));
00193 efVar->setFloatChannel(*((float*)&var[i]));
00194 efVar->setIntChannel(var[i]);
00195 aEF->push_back(efVar);
00196 }
00197 delete var;
00198 }
00199
00200 uint32_t atype=0,alg=0,cri=0,ver=0;
00201 float etot=0.;
00202
00203 DataObject *aHltEvent;
00204 eventSvc()->findObject("/Event/Hlt", aHltEvent);
00205 if(aHltEvent==NULL){
00206 log<<MSG::INFO<< "HltEvent has not existed, so register it now!" <<endreq;
00207 HltEvent* aHlt=new HltEvent();
00208 sc = eventSvc()->registerObject(EventModel::Hlt::Event,aHlt);
00209 if(sc!=StatusCode::SUCCESS) {
00210 log<<MSG::FATAL<< "Could not register Hlt!!!" <<endreq;
00211 return( StatusCode::FAILURE);
00212 }
00213 }
00214 else{
00215 log<<MSG::WARNING<< "HltEvent has existed!" <<endreq;
00216 }
00217
00218 DataObject *aHltRawEvent;
00219 eventSvc()->findObject("/Event/Hlt/HltRawCol", aHltRawEvent);
00220 if(aHltRawEvent!=NULL) {
00221 SmartDataPtr<HltRawCol> hltRawCol(eventSvc(),"/Event/Hlt/HltRawCol");
00222 HltRawCol::iterator iter = hltRawCol->begin();
00223 for (;iter != hltRawCol->end(); iter++ ) {
00224 Identifier id = (*iter)->identify();
00225 if(HltID::is_eventtype(id)) atype=(*iter)->getIntChannel();
00226 if(HltID::is_algorithm(id)) alg=(*iter)->getIntChannel();
00227 if(HltID::is_criteria(id)) cri=(*iter)->getIntChannel();
00228 if(HltID::is_version(id)) ver=(*iter)->getIntChannel();
00229 if(HltID::is_energy(id)) etot=(*iter)->getFloatChannel();
00230 }
00231 log<<MSG::DEBUG<<"old type="<<atype<<", alg="<<alg<<", criteria="<<cri
00232 <<", version="<<ver<<", energy="<<etot<<endreq;
00233
00234 sc = eventSvc()->unregisterObject("/Event/Hlt/HltRawCol");
00235 delete aHltRawEvent;
00236 log << MSG::INFO << "Old raw collection has been unregistered" << endreq;
00237 if(sc!=StatusCode::SUCCESS) {
00238 log << MSG::FATAL << "Could not unregister HLT raw collection" << endreq;
00239 return( StatusCode::FAILURE);
00240 }
00241 }
00242
00243
00244 sc = eventSvc()->registerObject(EventModel::Hlt::HltRawCol,aEF);
00245 if(sc!=StatusCode::SUCCESS) {
00246 log<<MSG::FATAL<< "Still could not register HltRawCol" <<endreq;
00247 return StatusCode::FAILURE;
00248 }
00249
00250 SmartDataPtr<HltRawCol> hltRawCol(eventSvc(),"/Event/Hlt/HltRawCol");
00251 if (!hltRawCol) {
00252 log << MSG::FATAL << "Could not find HltRawCol!" << endreq;
00253 return StatusCode::FAILURE;
00254 }
00255
00256 HltRawCol::iterator iter = hltRawCol->begin();
00257 for (;iter != hltRawCol->end(); iter++ ) {
00258 Identifier id = (*iter)->identify();
00259 if(HltID::is_eventtype(id)) atype=(*iter)->getIntChannel();
00260 if(HltID::is_algorithm(id)) alg=(*iter)->getIntChannel();
00261 if(HltID::is_criteria(id)) cri=(*iter)->getIntChannel();
00262 if(HltID::is_version(id)) ver=(*iter)->getIntChannel();
00263 if(HltID::is_energy(id)) etot=(*iter)->getFloatChannel();
00264 }
00265 log<<MSG::DEBUG<<" type="<<atype<<", alg="<<alg<<", criteria="<<cri
00266 <<", version="<<ver<<", energy="<<etot<<endreq;
00267
00268 return StatusCode::SUCCESS;
00269 }
00270
00271 StatusCode EFtoTDS::finalize() {
00272
00273 MsgStream log(msgSvc(), name());
00274 log << MSG::INFO << "in finalize()" << endreq;
00275
00276 return StatusCode::SUCCESS;
00277 }
00278