ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtHDF5WriteTask.cxx
Go to the documentation of this file.
1 #include "AtHDF5WriteTask.h"
2 
3 #include "AtEvent.h"
4 #include "AtHit.h"
5 
6 #include <FairLogger.h> // for LOG
7 #include <FairRootManager.h> // for FairRootManager
8 
9 #include <Math/Point3D.h> // for PositionVector3D
10 #include <TClonesArray.h>
11 #include <TObject.h> // for TObject
12 
13 #include <H5Cpp.h>
14 
15 #include <array> // for array
16 #include <utility> // for move
17 
18 AtHDF5WriteTask::AtHDF5WriteTask(TString fileName, TString branchName)
19  : fOutputFileName(std::move(fileName)), fInputBranchName(std::move(branchName))
20 {
21 }
22 
24 {
25 
26  FairRootManager *ioMan = FairRootManager::Instance();
27  if (ioMan == nullptr) {
28  LOG(ERROR) << "Cannot find RootManager!";
29  return kERROR;
30  }
31 
32  fEventArray = dynamic_cast<TClonesArray *>(ioMan->GetObject(fInputBranchName));
33 
34  fFile = std::make_unique<H5::H5File>(fOutputFileName, H5F_ACC_TRUNC);
35 
36  return kSUCCESS;
37 }
38 
39 void AtHDF5WriteTask::Exec(Option_t *opt)
40 {
41 
42  auto *event = dynamic_cast<AtEvent *>(fEventArray->At(0));
43  if (!event->IsGood())
44  return;
45 
46  Int_t nHits = event->GetNumHits();
47  const auto &traceEv = event->GetMesh();
48 
49  hsize_t hitdim[] = {(hsize_t)nHits};
50  hsize_t tracedim[] = {(hsize_t)traceEv.size()};
51  H5::DataSpace hitSpace(1, hitdim);
52  H5::DataSpace traceSpace(1, tracedim);
53 
58  AtHit_t hits[nHits];
59  auto hdf5Type = AtHit().GetHDF5Type();
60 
61  for (Int_t iHit = 0; iHit < nHits; iHit++) {
62  const AtHit &hit = event->GetHit(iHit);
63 
64  auto hitPos = hit.GetPosition();
65  hits[iHit].x = hitPos.X();
66  hits[iHit].y = hitPos.Y();
67  hits[iHit].z = hitPos.Z();
68  hits[iHit].t = hit.GetTimeStamp();
69  hits[iHit].A = hit.GetCharge();
70  }
71 
72  int eventNum = fUseEventNum ? event->GetEventID() : fEventNum;
73 
74  auto eventGroup = std::make_unique<H5::Group>(fFile->createGroup(TString::Format("/Event_[%d]", eventNum)));
75  H5::DataSet hitset = fFile->createDataSet(TString::Format("/Event_[%d]/HitArray", eventNum), hdf5Type, hitSpace);
76  hitset.write(hits, hdf5Type);
77 
78  H5::DataSet traceset =
79  fFile->createDataSet(TString::Format("/Event_[%d]/Trace", eventNum), H5::PredType::NATIVE_FLOAT, traceSpace);
80  traceset.write(traceEv.data(), H5::PredType::NATIVE_FLOAT);
81 
82  ++fEventNum;
83 }
84 
AtEvent::GetNumHits
Int_t GetNumHits() const
Definition: AtEvent.h:108
AtEvent.h
AtHDF5WriteTask::fUseEventNum
Bool_t fUseEventNum
If true events are indexed by ATTPCROOT event number. If false then use internal index [0-NumEventsIn...
Definition: AtHDF5WriteTask.h:29
AtHit_t::A
double A
Definition: AtHit.h:130
AtHit_t::y
double y
Definition: AtHit.h:127
AtEvent
Definition: AtEvent.h:22
ClassImp
ClassImp(AtHDF5WriteTask)
AtHit_t::x
double x
Definition: AtHit.h:126
AtHDF5WriteTask::AtHDF5WriteTask
AtHDF5WriteTask(TString fileName, TString branchName="AtEventH")
Definition: AtHDF5WriteTask.cxx:18
AtHDF5WriteTask
Definition: AtHDF5WriteTask.h:18
AtHit::GetTimeStamp
Int_t GetTimeStamp() const
Definition: AtHit.h:86
AtHit::GetPosition
const XYZPoint & GetPosition() const
Definition: AtHit.h:79
AtHit.h
AtHDF5WriteTask::Init
virtual InitStatus Init() override
Definition: AtHDF5WriteTask.cxx:23
AtHDF5WriteTask::fEventNum
Int_t fEventNum
Definition: AtHDF5WriteTask.h:31
AtHDF5WriteTask::fEventArray
TClonesArray * fEventArray
Definition: AtHDF5WriteTask.h:25
AtHit::GetHDF5Type
H5::CompType GetHDF5Type()
Returns the type specification of a hit.
Definition: AtHit.cxx:30
AtHit_t::z
double z
Definition: AtHit.h:128
AtHDF5WriteTask::fOutputFileName
TString fOutputFileName
Definition: AtHDF5WriteTask.h:21
AtHDF5WriteTask::fInputBranchName
TString fInputBranchName
Definition: AtHDF5WriteTask.h:22
AtHDF5WriteTask.h
AtHDF5WriteTask::fFile
std::unique_ptr< H5::H5File > fFile
Definition: AtHDF5WriteTask.h:24
AtHit_t
Definition: AtHit.h:125
AtHit::GetCharge
Double_t GetCharge() const
Definition: AtHit.h:82
AtHit
Point in space with charge.
Definition: AtHit.h:27
AtHDF5WriteTask::Exec
virtual void Exec(Option_t *opt) override
Definition: AtHDF5WriteTask.cxx:39
AtHit_t::t
int t
Definition: AtHit.h:129