Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
FileWriter.cc
Go to the documentation of this file.
1
11
13#include "Geometry/LArTPC.h"
15
17
18#include "Objects/CaloHit.h"
19#include "Objects/MCParticle.h"
20#include "Objects/Track.h"
21
22#include "Pandora/Pandora.h"
24
26
27#include <algorithm>
28
29namespace pandora
30{
31
32FileWriter::FileWriter(const pandora::Pandora &pandora, const std::string &fileName) :
33 Persistency(pandora, fileName)
34{
35}
36
37//------------------------------------------------------------------------------------------------------------------------------------------
38
42
43//------------------------------------------------------------------------------------------------------------------------------------------
44
46{
47 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteHeader(GEOMETRY_CONTAINER));
48
50 return STATUS_CODE_FAILURE;
51
52 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteSubDetectorList());
53 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteLArTPCList());
54 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteDetectorGapList());
55
56 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteFooter());
57
58 return STATUS_CODE_SUCCESS;
59}
60
61//------------------------------------------------------------------------------------------------------------------------------------------
62
63StatusCode FileWriter::WriteEvent(const CaloHitList &caloHitList, const TrackList &trackList, const MCParticleList &mcParticleList,
64 const bool writeMCRelationships, const bool writeTrackRelationships)
65{
66 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteHeader(EVENT_CONTAINER));
67 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteCaloHitList(caloHitList));
68 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteTrackList(trackList));
69 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteMCParticleList(mcParticleList));
70
71 if (writeMCRelationships)
72 {
73 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteCaloHitToMCParticleRelationships(caloHitList));
74 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteTrackToMCParticleRelationships(trackList));
75 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteMCParticleRelationships(mcParticleList));
76 }
77
78 if (writeTrackRelationships)
79 {
80 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteTrackRelationships(trackList));
81 }
82
83 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteFooter());
84
85 return STATUS_CODE_SUCCESS;
86}
87
88//------------------------------------------------------------------------------------------------------------------------------------------
89
91{
92 for (const SubDetectorMap::value_type &mapEntry : m_pPandora->GetGeometry()->GetSubDetectorMap())
93 {
94 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteSubDetector(mapEntry.second));
95 }
96
97 return STATUS_CODE_SUCCESS;
98}
99
100//------------------------------------------------------------------------------------------------------------------------------------------
101
103{
104 for (const LArTPCMap::value_type &mapEntry : m_pPandora->GetGeometry()->GetLArTPCMap())
105 {
106 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteLArTPC(mapEntry.second));
107 }
108
109 return STATUS_CODE_SUCCESS;
110}
111
112//------------------------------------------------------------------------------------------------------------------------------------------
113
115{
116 for (const DetectorGap *const pDetectorGap : m_pPandora->GetGeometry()->GetDetectorGapList())
117 {
118 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteDetectorGap(pDetectorGap));
119 }
120
121 return STATUS_CODE_SUCCESS;
122}
123
124//------------------------------------------------------------------------------------------------------------------------------------------
125
127{
128 for (const Track *const pTrack : trackList)
129 {
130 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteTrack(pTrack));
131 }
132
133 return STATUS_CODE_SUCCESS;
134}
135
136//------------------------------------------------------------------------------------------------------------------------------------------
137
139{
140 for (const CaloHit *const pCaloHit : caloHitList)
141 {
142 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteCaloHit(pCaloHit));
143 }
144
145 return STATUS_CODE_SUCCESS;
146}
147
148//------------------------------------------------------------------------------------------------------------------------------------------
149
151{
152 for (const MCParticle *const pMCParticle : mcParticleList)
153 {
154 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteMCParticle(pMCParticle));
155 }
156
157 return STATUS_CODE_SUCCESS;
158}
159
160//------------------------------------------------------------------------------------------------------------------------------------------
161
163{
164 for (const CaloHit *const pCaloHit : caloHitList)
165 {
166 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteCaloHitToMCParticleRelationship(pCaloHit));
167 }
168
169 return STATUS_CODE_SUCCESS;
170}
171
172//------------------------------------------------------------------------------------------------------------------------------------------
173
175{
176 for (const Track *const pTrack : trackList)
177 {
178 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteTrackToMCParticleRelationship(pTrack));
179 }
180
181 return STATUS_CODE_SUCCESS;
182}
183
184//------------------------------------------------------------------------------------------------------------------------------------------
185
187{
188 for (const MCParticle *const pMCParticle : mcParticleList)
189 {
190 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteMCParticleRelationships(pMCParticle));
191 }
192
193 return STATUS_CODE_SUCCESS;
194}
195
196//------------------------------------------------------------------------------------------------------------------------------------------
197
199{
200 for (const Track *const pTrack : trackList)
201 {
202 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteTrackRelationships(pTrack));
203 }
204
205 return STATUS_CODE_SUCCESS;
206}
207
208//------------------------------------------------------------------------------------------------------------------------------------------
209
211{
213 return STATUS_CODE_FAILURE;
214
215 const MCParticleWeightMap &mcParticleWeightMap(pCaloHit->GetMCParticleWeightMap());
216
217 MCParticleVector mcParticleVector;
218 for (const MCParticleWeightMap::value_type &mapEntry : mcParticleWeightMap) mcParticleVector.push_back(mapEntry.first);
219 std::sort(mcParticleVector.begin(), mcParticleVector.end(), PointerLessThan<MCParticle>());
220
221 for (const MCParticle *const pMCParticle : mcParticleVector)
222 {
224 pMCParticle->GetUid(), mcParticleWeightMap.at(pMCParticle)));
225 }
226
227 return STATUS_CODE_SUCCESS;
228}
229
230//------------------------------------------------------------------------------------------------------------------------------------------
231
233{
235 return STATUS_CODE_FAILURE;
236
237 const MCParticleWeightMap &mcParticleWeightMap(pTrack->GetMCParticleWeightMap());
238
239 MCParticleVector mcParticleVector;
240 for (const MCParticleWeightMap::value_type &mapEntry : mcParticleWeightMap) mcParticleVector.push_back(mapEntry.first);
241 std::sort(mcParticleVector.begin(), mcParticleVector.end(), PointerLessThan<MCParticle>());
242
243 for (const MCParticle *const pMCParticle : mcParticleVector)
244 {
246 pMCParticle->GetUid(), mcParticleWeightMap.at(pMCParticle)));
247 }
248
249 return STATUS_CODE_SUCCESS;
250}
251
252//------------------------------------------------------------------------------------------------------------------------------------------
253
255{
257 return STATUS_CODE_FAILURE;
258
259 const Uid uid(pMCParticle->GetUid());
260 const MCParticleList &parentList(pMCParticle->GetParentList());
261 const MCParticleList &daughterList(pMCParticle->GetDaughterList());
262
263 for (const MCParticle *const pParentMCParticle : parentList)
264 {
265 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteRelationship(MC_PARENT_DAUGHTER_RELATIONSHIP, pParentMCParticle->GetUid(), uid));
266 }
267
268 for (const MCParticle *const pDaughterMCParticle : daughterList)
269 {
270 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteRelationship(MC_PARENT_DAUGHTER_RELATIONSHIP, uid, pDaughterMCParticle->GetUid()));
271 }
272
273 return STATUS_CODE_SUCCESS;
274}
275
276//------------------------------------------------------------------------------------------------------------------------------------------
277
279{
281 return STATUS_CODE_FAILURE;
282
283 const void *address(pTrack->GetParentAddress());
284 const TrackList &parentList(pTrack->GetParentList());
285 const TrackList &daughterList(pTrack->GetDaughterList());
286 const TrackList &siblingList(pTrack->GetSiblingList());
287
288 for (const Track *const pParentTrack : parentList)
289 {
290 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteRelationship(TRACK_PARENT_DAUGHTER_RELATIONSHIP, pParentTrack->GetParentAddress(), address));
291 }
292
293 for (const Track *const pDaughterTrack : daughterList)
294 {
295 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteRelationship(TRACK_PARENT_DAUGHTER_RELATIONSHIP, address, pDaughterTrack->GetParentAddress()));
296 }
297
298 for (const Track *const pSiblingTrack : siblingList)
299 {
300 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteRelationship(TRACK_SIBLING_RELATIONSHIP, address, pSiblingTrack->GetParentAddress()));
301 }
302
303 return STATUS_CODE_SUCCESS;
304}
305
306} // namespace pandora
Header file for the calo hit class.
Header file for the detector gap class.
Header file for the file writer class.
Header file for the geometry manager class.
Header file for the lar tpc class.
Header file for the mc particle class.
Header file for the pandora class.
Header file for the pandora content api class.
Header file for the pandora content api implementation class.
Header file defining relevant internal typedefs, sort and string conversion functions.
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:19
Header file for the sub detector class.
Header file for the track class.
CaloHit class.
Definition CaloHit.h:26
const MCParticleWeightMap & GetMCParticleWeightMap() const
Get mc particle weight map for the calo hit.
Definition CaloHit.h:525
const void * GetParentAddress() const
Get the address of the parent calo hit in the user framework.
Definition CaloHit.h:532
DetectorGap class.
Definition DetectorGap.h:25
virtual ~FileWriter()
Destructor.
Definition FileWriter.cc:39
virtual StatusCode WriteFooter()=0
Write the container footer to the file.
virtual StatusCode WriteHeader(const ContainerId containerId)=0
Write the container header to the file.
virtual StatusCode WriteSubDetector(const SubDetector *const pSubDetector)=0
Write a sub detector to the file.
StatusCode WriteTrackToMCParticleRelationships(const TrackList &trackList)
Write track to mc particle relationships for a specified track list.
StatusCode WriteSubDetectorList()
Write the sub detector parameters to the file.
Definition FileWriter.cc:90
StatusCode WriteTrackList(const TrackList &trackList)
Write a track list to the current position in the file.
virtual StatusCode WriteCaloHit(const CaloHit *const pCaloHit)=0
Write a calo hit to the current position in the file.
virtual StatusCode WriteLArTPC(const LArTPC *const pLArTPC)=0
Write a lar tpc to the file.
StatusCode WriteEvent(const CaloHitList &caloHitList, const TrackList &trackList, const MCParticleList &mcParticleList, const bool writeMCRelationships=true, const bool writeTrackRelationships=true)
Write the specified event components to the file.
Definition FileWriter.cc:63
StatusCode WriteTrackRelationships(const TrackList &trackList)
Write track relationships for a specified list of tracks.
StatusCode WriteCaloHitToMCParticleRelationships(const CaloHitList &caloHitList)
Write calo hit to mc particle relationships for a specified calo hit list.
virtual StatusCode WriteRelationship(const RelationshipId relationshipId, const void *address1, const void *address2, const float weight=1.f)=0
Write a relationship between two objects with specified addresses.
StatusCode WriteMCParticleRelationships(const MCParticleList &mcParticleList)
Write mc particle relationships for a specified mc particle list.
StatusCode WriteCaloHitToMCParticleRelationship(const CaloHit *const pCaloHit)
Write a calo hit to mc particle relationship to the current position in the file.
virtual StatusCode WriteTrack(const Track *const pTrack)=0
Write a track to the current position in the file.
StatusCode WriteCaloHitList(const CaloHitList &caloHitList)
Write a calo hit list to the current position in the file.
FileWriter(const pandora::Pandora &pandora, const std::string &fileName)
Constructor.
Definition FileWriter.cc:32
StatusCode WriteDetectorGapList()
Write the detector gap parameters to the file.
virtual StatusCode WriteMCParticle(const MCParticle *const pMCParticle)=0
Write a mc particle to the current position in the file.
StatusCode WriteTrackToMCParticleRelationship(const Track *const pTrack)
Write a track to mc particle relationship to the current position in the file.
virtual StatusCode WriteDetectorGap(const DetectorGap *const pDetectorGap)=0
Write the detector gap parameters to the file.
StatusCode WriteGeometry()
Write the current geometry information to the file.
Definition FileWriter.cc:45
StatusCode WriteMCParticleList(const MCParticleList &mcParticleList)
Write a mc particle list to the current position in the file.
StatusCode WriteLArTPCList()
Write the lar tpc parameters to the file.
const SubDetectorMap & GetSubDetectorMap() const
Get the map from name to sub detector parameters.
const DetectorGapList & GetDetectorGapList() const
Get the list of gaps in the active detector volume.
const LArTPCMap & GetLArTPCMap() const
Get the map from name to lar tpc parameters.
MCParticle class.
Definition MCParticle.h:26
Uid GetUid() const
Get the mc particle unique identifier.
Definition MCParticle.h:236
const MCParticleList & GetDaughterList() const
Get list of daughters of mc particle.
Definition MCParticle.h:306
const MCParticleList & GetParentList() const
Get list of parents of mc particle.
Definition MCParticle.h:299
Pandora class.
Definition Pandora.h:40
const GeometryManager * GetGeometry() const
Get the pandora geometry instance.
Definition Pandora.cc:189
Persistency class.
Definition Persistency.h:26
ContainerId m_containerId
The type of container currently being written to file.
Definition Persistency.h:76
const Pandora *const m_pPandora
Address of pandora instance to be used alongside the file writer.
Definition Persistency.h:73
Enable ordering of pointers based on properties of target objects.
Track class.
Definition Track.h:26
const TrackList & GetParentList() const
Get the parent track list.
Definition Track.h:421
const TrackList & GetDaughterList() const
Get the daughter track list.
Definition Track.h:435
const MCParticleWeightMap & GetMCParticleWeightMap() const
Get mc particle weight map for the track.
Definition Track.h:407
const TrackList & GetSiblingList() const
Get the sibling track list.
Definition Track.h:428
const void * GetParentAddress() const
Get the address of the parent track in the user framework.
Definition Track.h:414
MANAGED_CONTAINER< const MCParticle * > MCParticleList
std::unordered_map< const MCParticle *, float > MCParticleWeightMap
@ TRACK_TO_MC_RELATIONSHIP
Definition PandoraIO.h:59
@ CALO_HIT_TO_MC_RELATIONSHIP
Definition PandoraIO.h:58
@ TRACK_SIBLING_RELATIONSHIP
Definition PandoraIO.h:62
@ TRACK_PARENT_DAUGHTER_RELATIONSHIP
Definition PandoraIO.h:61
@ MC_PARENT_DAUGHTER_RELATIONSHIP
Definition PandoraIO.h:60
@ EVENT_CONTAINER
Definition PandoraIO.h:25
@ GEOMETRY_CONTAINER
Definition PandoraIO.h:26
const void * Uid
MANAGED_CONTAINER< const CaloHit * > CaloHitList
MANAGED_CONTAINER< const Track * > TrackList
std::vector< const MCParticle * > MCParticleVector
StatusCode
The StatusCode enum.