BOSS 7.0.4
BESIII Offline Software System
Loading...
Searching...
No Matches
HltInfCnv.cxx
Go to the documentation of this file.
1#ifndef HltInfCnv_CXX
2#define HltInfCnv_CXX 1
3
4#include "GaudiKernel/MsgStream.h"
5#include "GaudiKernel/DataObject.h"
6
7#include "TClonesArray.h"
8
9#include "EventModel/EventModel.h"
10#include "Identifier/HltID.h"
11#include "HltEvent/HltEvent.h" //TDS object
12#include "HltEvent/HltInf.h" //TDS object
13#include "RootEventData/THltEvent.h" // standard root object
14#include "RootEventData/THltInf.h" // standard root object
15#include "RootCnvSvc/Hlt/HltCnv.h"
16#include "RootCnvSvc/Hlt/HltInfCnv.h"
17#include "RootCnvSvc/RootAddress.h"
18
19
20// Instantiation of a static factory class used by clients to create
21// instances of this service
22
23HltInfCnv::HltInfCnv(ISvcLocator* svc)
24 : RootEventBaseCnv(classID(), svc),
25 m_old(false)
26{
27 // Here we associate this converter with the /Event path on the TDS.
28 MsgStream log(msgSvc(), "HltInfCnv");
29 //log << MSG::DEBUG << "Constructor called for " << objType() << endreq;
30 m_rootBranchname ="m_hltInf";
31 //declareObject(EventModel::MC::HltInf, objType(), m_rootTreename, m_rootBranchname);
32 m_adresses.push_back(&m_hltInf);
33 m_hltInf=0;
34}
35
36StatusCode HltInfCnv::TObjectToDataObject(DataObject*& refpObject) {
37 // creation of TDS object from root object
38
39 MsgStream log(msgSvc(), "HltInfCnv");
40 log << MSG::DEBUG << "HltInfCnv::TObjectToDataObject" << endreq;
41 StatusCode sc=StatusCode::SUCCESS;
42
43 // create the TDS location for the trigger data
44 HltInf* hltInfTds = new HltInf;
45 refpObject=hltInfTds;
46
47 // now convert
48 if(!m_hltInf) return sc;
49
50 int evt = m_hltInf->getEventType();
51 int alg = m_hltInf->getAlgProcess();
52 int cri = m_hltInf->getCriteriaTable();
53 int ver = m_hltInf->getVersion();
54 float etot = m_hltInf->getTotalEnergy();
55 hltInfTds->setEventType(evt);
56 hltInfTds->setAlgProcess(alg);
57 hltInfTds->setCriteriaTable(cri);
58 hltInfTds->setVersion(ver);
59 hltInfTds->setTotalEnergy(etot);
60
61 try{
62 uint32_t nsub= m_hltInf->getNumber();
63 uint32_t ncon= m_hltInf->getNCON();
64 uint32_t nmdc= nsub &0XFF;
65 uint32_t ntof=(nsub>>8 )&0XFF;
66 uint32_t nemc=(nsub>>16)&0XFF;
67 uint32_t nmuc= nsub>>24;
68 if(nmuc>HltID::getID_MUC_MAX()+1 || nemc>HltID::getID_EMC_MAX()+1
69 ||ntof>HltID::getID_TOF_MAX()+1 || nmdc>HltID::getID_MDC_MAX()+1){
70 throw exception();
71 }
72 hltInfTds->setNumber(nsub);
73 hltInfTds->setNCON(ncon);
74
75 std::vector<Int_t> mdcRoot=m_hltInf->getMdcData();
76 if(mdcRoot.size()!=nmdc) {
77 throw exception();
78 }
79 std::vector<Int_t>::iterator it=mdcRoot.begin();
80 for(;it!=mdcRoot.end();it++){
81 uint32_t data=*it;
82 hltInfTds->push_mdc(data);
83 }
84 std::vector<Int_t> tofRoot=m_hltInf->getTofData();
85 if(tofRoot.size()!=ntof) {
86 throw exception();
87 }
88 it=tofRoot.begin();
89 for(;it!=tofRoot.end();it++){
90 uint32_t data=*it;
91 hltInfTds->push_tof(data);
92 }
93 std::vector<Int_t> emcRoot=m_hltInf->getEmcData();
94 if(emcRoot.size()!=nemc) {
95 throw exception();
96 }
97 it=emcRoot.begin();
98 for(;it!=emcRoot.end();it++){
99 uint32_t data=*it;
100 hltInfTds->push_emc(data);
101 }
102 std::vector<Int_t> mucRoot=m_hltInf->getMucData();
103 if(mucRoot.size()!=nmuc) {
104 throw exception();
105 }
106 it=mucRoot.begin();
107 for(;it!=mucRoot.end();it++){
108 uint32_t data=*it;
109 hltInfTds->push_muc(data);
110 }
111 std::vector<Int_t> conRoot=m_hltInf->getConData();
112 if(conRoot.size()!=ncon) {
113 throw exception();
114 }
115 it=conRoot.begin();
116 for(;it!=conRoot.end();it++){
117 uint32_t data=*it;
118 hltInfTds->push_con(data);
119 }
120 }
121 catch(...){
122 //log << MSG::ERROR << "***********************************************************" << endreq;
123 //log << MSG::ERROR << "Input ROOT object is older version, please reconstrut again" << endreq;
124 //log << MSG::ERROR << " or check out old RootCnvSvc! (mailto: [email protected])" << endreq;
125 //log << MSG::WARNING << "***** Continuing run may cause a little memory leakage ****" << endreq;
126 //m_old=true;
127 }
128
129 delete m_hltInf;
130 m_hltInf = 0;
131
132 return StatusCode::SUCCESS;
133}
134
135StatusCode HltInfCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
136
137 MsgStream log(msgSvc(), "HltInfCnv");
138 log << MSG::DEBUG << "HltInfCnv::DataObjectToTObject" << endreq;
139 StatusCode sc=StatusCode::SUCCESS;
140
141 HltInf * hltInfCnvTds=dynamic_cast<HltInf*> (obj);
142 if (!hltInfCnvTds) {
143 log << MSG::ERROR << "Could not downcast to HltInf" << endreq;
144 return StatusCode::FAILURE;
145 }
146
147 DataObject *evt;
148 m_eds->findObject(EventModel::Hlt::Event,evt);
149 if (evt==NULL) {
150 log << MSG::ERROR << "Could not get HltInf in TDS " << endreq;
151 return StatusCode::FAILURE;
152 }
153
154 HltEvent * devtTds=dynamic_cast<HltEvent *> (evt);
155 if (!devtTds) {
156 log << MSG::ERROR << "HltInfCnv:Could not downcast to TDS HltInf" << endreq;
157 }
158
159 IOpaqueAddress *addr;
160 m_cnvSvc->getHltCnv()->createRep(evt,addr);
161
163
164 const TObject *tHltInf = hltInf->getHltInf();
165 if (!tHltInf) return sc;
166 hltInf->clearHltInf();
167
168 Int_t type = hltInfCnvTds->getEventType();
169 Int_t alg = hltInfCnvTds->getAlgProcess();
170 Int_t cri = hltInfCnvTds->getCriteriaTable();
171 Int_t ver = hltInfCnvTds->getVersion();
172 Double_t etot = hltInfCnvTds->getTotalEnergy();
173 Int_t nsub = hltInfCnvTds->getNumber();
174 Int_t ncon = hltInfCnvTds->getNCON();
175
176 THltInf *hltInfRoot = new THltInf();
177
178 hltInfRoot->setEventType(type);
179 hltInfRoot->setAlgProcess(alg);
180 hltInfRoot->setCriteriaTable(cri);
181 hltInfRoot->setVersion(ver);
182 hltInfRoot->setTotalEnergy(etot);
183 hltInfRoot->setNumber(nsub);
184 hltInfRoot->setNCON(ncon);
185
186
187 std::vector<uint32_t> mdcTds=hltInfCnvTds->getDataVec(HltID::MDC);
188 std::vector<Int_t> mdcRoot;
189 std::vector<uint32_t>::iterator it= mdcTds.begin();
190 for(;it!=mdcTds.end();it++){
191 Int_t data=*it;
192 mdcRoot.push_back(data);
193 }
194 hltInfRoot->setMdcData(mdcRoot);
195
196 std::vector<uint32_t> tofTds=hltInfCnvTds->getDataVec(HltID::TOF);
197 std::vector<Int_t> tofRoot;
198 for(it= tofTds.begin();it!=tofTds.end();it++){
199 Int_t data=*it;
200 tofRoot.push_back(data);
201 }
202 hltInfRoot->setTofData(tofRoot);
203
204 std::vector<uint32_t> emcTds=hltInfCnvTds->getDataVec(HltID::EMC);
205 std::vector<Int_t> emcRoot;
206 for(it= emcTds.begin();it!=emcTds.end();it++){
207 Int_t data=*it;
208 emcRoot.push_back(data);
209 }
210 hltInfRoot->setEmcData(emcRoot);
211
212 std::vector<uint32_t> mucTds=hltInfCnvTds->getDataVec(HltID::MUC);
213 std::vector<Int_t> mucRoot;
214 for(it= mucTds.begin();it!=mucTds.end();it++){
215 Int_t data=*it;
216 mucRoot.push_back(data);
217 }
218 hltInfRoot->setMucData(mucRoot);
219
220 std::vector<uint32_t> conTds=hltInfCnvTds->getDataVec(HltID::CON);
221 std::vector<Int_t> conRoot;
222 for(it= conTds.begin();it!=conTds.end();it++){
223 Int_t data=*it;
224 conRoot.push_back(data);
225 }
226 hltInfRoot->setConData(conRoot);
227
228 hltInf->addHltInf(hltInfRoot);
229
230 return StatusCode::SUCCESS;
231}
232#endif
TTree * data
Double_t etot
static THltEvent * getWriteObject()
returns object to be written (maintained here for all DIGI-converters)
HltInfCnv(ISvcLocator *svc)
Definition: HltInfCnv.cxx:23
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
Definition: HltInfCnv.cxx:36
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
Definition: HltInfCnv.cxx:135
virtual void push_muc(uint32_t data)
virtual void push_mdc(uint32_t data)
std::vector< uint32_t > & getDataVec(const Identifier &)
Definition: HltInf.cxx:67
virtual void push_tof(uint32_t data)
virtual void push_con(uint32_t data)
virtual void push_emc(uint32_t data)
Definition of a Root address, derived from IOpaqueAddress.
IDataProviderSvc * m_eds
pointer to eventdataservice
std::vector< void * > m_adresses
each converter knows the corresponding adresses
std::string m_rootBranchname
root branchname (may be concatenated of severals)
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)
Convert the transient object to the requested representation.
void addHltInf(THltInf *hltInf)
Definition: THltEvent.cxx:76
const THltInf * getHltInf() const
Definition: THltEvent.cxx:79