BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MucMcHitCnv.cxx
Go to the documentation of this file.
1#ifndef MucMcHitCnv_CXX
2#define MucMcHitCnv_CXX 1
3
4#include "GaudiKernel/DataObject.h"
5#include "GaudiKernel/MsgStream.h"
6#include "GaudiKernel/ObjectVector.h"
7
8#include "TClonesArray.h"
9
10#include "EventModel/EventModel.h"
11#include "McTruth/McEvent.h" //TDS object
12#include "McTruth/MucMcHit.h" //TDS object
13#include "RootCnvSvc/Mc/McCnv.h"
14#include "RootCnvSvc/Mc/MucMcHitCnv.h"
15#include "RootCnvSvc/RootAddress.h"
16#include "RootEventData/TMcEvent.h"
17#include "RootEventData/TMucMc.h" // standard root object
18
19// Instantiation of a static factory class used by clients to create
20// instances of this service
21// static CnvFactory<MucMcHitCnv> s_factory;
22// const ICnvFactory& MucMcHitCnvFactory = s_factory;
23
24MucMcHitCnv::MucMcHitCnv( ISvcLocator* svc ) : RootEventBaseCnv( classID(), svc ) {
25 // Here we associate this converter with the /Event path on the TDS.
26 MsgStream log( msgSvc(), "MucMcHitCnv" );
27 // log << MSG::DEBUG << "Constructor called for " << objType() << endmsg;
28 m_rootBranchname = "m_mucMcHitCol";
29 // declareObject(EventModel::MC::MucMcHitCol, objType(), m_rootTreename, m_rootBranchname);
30 m_adresses.push_back( &m_mucMcHitCol );
31 m_mucMcHitCol = 0;
32}
33
34StatusCode MucMcHitCnv::TObjectToDataObject( DataObject*& refpObject ) {
35 // creation of TDS object from root object
36
37 MsgStream log( msgSvc(), "MucMcHitCnv" );
38 log << MSG::DEBUG << "MucMcHitCnv::TObjectToDataObject" << endmsg;
39 StatusCode sc = StatusCode::SUCCESS;
40
41 // create the TDS location for the MdcMc Collection
42 MucMcHitCol* mucMcTdsCol = new MucMcHitCol;
43 refpObject = mucMcTdsCol;
44
45 // now convert
46 if ( !m_mucMcHitCol ) return sc;
47 TIter mucMcIter( m_mucMcHitCol );
48 TMucMc* mucMcRoot = 0;
49 while ( ( mucMcRoot = (TMucMc*)mucMcIter.Next() ) )
50 {
51 unsigned int id = mucMcRoot->getId();
52 unsigned int trackIndex = mucMcRoot->getTrackIndex();
53 double xPosition = mucMcRoot->getPositionX();
54 double yPosition = mucMcRoot->getPositionY();
55 double zPosition = mucMcRoot->getPositionZ();
56 double px = mucMcRoot->getPx();
57 double py = mucMcRoot->getPy();
58 double pz = mucMcRoot->getPz();
59
60 MucMcHit* mucMcTds = new MucMcHit;
61 m_common.m_rootMucMcHitMap[mucMcRoot] = mucMcTds;
62
63 mucMcTds->setIdentifier( id );
64 mucMcTds->setTrackIndex( trackIndex );
65 mucMcTds->setPositionX( xPosition );
66 mucMcTds->setPositionY( yPosition );
67 mucMcTds->setPositionZ( zPosition );
68 mucMcTds->setPx( px );
69 mucMcTds->setPy( py );
70 mucMcTds->setPz( pz );
71
72 mucMcTdsCol->push_back( mucMcTds );
73 }
74 // m_mucMcHitCol->Delete(); // wensp add 2005/12/30
75 delete m_mucMcHitCol;
76 m_mucMcHitCol = 0;
77 return StatusCode::SUCCESS;
78}
79
80StatusCode MucMcHitCnv::DataObjectToTObject( DataObject* obj, RootAddress* rootaddr ) {
81
82 MsgStream log( msgSvc(), "MucMcHitCnv" );
83 log << MSG::DEBUG << "MucMcHitCnv::DataObjectToTObject" << endmsg;
84 StatusCode sc = StatusCode::SUCCESS;
85
86 MucMcHitCol* mucMcHitCnvTds = dynamic_cast<MucMcHitCol*>( obj );
87 if ( !mucMcHitCnvTds )
88 {
89 log << MSG::ERROR << "Could not downcast to MucMcHitCol" << endmsg;
90 return StatusCode::FAILURE;
91 }
92
93 DataObject* evt;
94 m_eds->findObject( EventModel::MC::Event, evt );
95 if ( evt == NULL )
96 {
97 log << MSG::ERROR << "Could not get McEvent in TDS " << endmsg;
98 return StatusCode::FAILURE;
99 }
100 McEvent* devtTds = dynamic_cast<McEvent*>( evt );
101 if ( !devtTds )
102 { log << MSG::ERROR << "MucMcHitCnv:Could not downcast to TDS McEvent" << endmsg; }
103 IOpaqueAddress* addr;
104
105 m_cnvSvc->getMcCnv()->createRep( evt, addr );
106 TMcEvent* McEvt = m_cnvSvc->getMcCnv()->getWriteObject();
107
108 const TObjArray* m_mucMcHitCol = McEvt->getMucMcHitCol();
109 if ( !m_mucMcHitCol ) return sc;
110 McEvt->clearMucMcHitCol(); // necessary in case there is I/O at the same time since array is
111 // static
112 MucMcHitCol::const_iterator mucMcTds;
113
114 for ( mucMcTds = mucMcHitCnvTds->begin(); mucMcTds != mucMcHitCnvTds->end(); mucMcTds++ )
115 {
116 UInt_t id = ( ( *mucMcTds )->identify() ).get_value();
117 UInt_t trackIndex = ( *mucMcTds )->getTrackIndex();
118 Double_t xPosition = ( *mucMcTds )->getPositionX();
119 Double_t yPosition = ( *mucMcTds )->getPositionY();
120 Double_t zPosition = ( *mucMcTds )->getPositionZ();
121 Double_t px = ( *mucMcTds )->getPx();
122 Double_t py = ( *mucMcTds )->getPy();
123 Double_t pz = ( *mucMcTds )->getPz();
124
125 TMucMc* mucMcRoot = new TMucMc();
126 // m_common.m_mucMcHitMap[(*mucMcTds)] = mucMcRoot;
127
128 mucMcRoot->setId( id );
129 mucMcRoot->setTrackIndex( trackIndex );
130 mucMcRoot->setPositionX( xPosition );
131 mucMcRoot->setPositionY( yPosition );
132 mucMcRoot->setPositionZ( zPosition );
133 mucMcRoot->setPx( px );
134 mucMcRoot->setPy( py );
135 mucMcRoot->setPz( pz );
136
137 McEvt->addMucMc( mucMcRoot );
138 }
139
140 return StatusCode::SUCCESS;
141}
142#endif
ObjectVector< MucMcHit > MucMcHitCol
IMessageSvc * msgSvc()
MucMcHitCnv(ISvcLocator *svc)
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
void setPositionX(double positionX)
void setPositionZ(double positionZ)
void setPositionY(double positionY)
void setTrackIndex(unsigned int trackIndex)
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)
RootEventBaseCnv(const CLID &clid, ISvcLocator *svc)
void addMucMc(TMucMc *mcHit)
Muc.
Definition TMcEvent.cxx:107