File indexing completed on 2025-08-05 08:15:09
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include "TPCMLDataInterface.h"
0012
0013 #include <tpc/TpcDefs.h>
0014
0015 #include <g4detectors/PHG4Cell.h>
0016 #include <g4detectors/PHG4CellContainer.h>
0017 #include <g4detectors/PHG4CylinderCellGeom.h>
0018 #include <g4detectors/PHG4CylinderCellGeomContainer.h>
0019
0020
0021 #include <g4main/PHG4Hit.h>
0022 #include <g4main/PHG4HitContainer.h>
0023 #include <g4main/PHG4Particle.h>
0024 #include <g4main/PHG4TruthInfoContainer.h>
0025
0026 #include <g4eval/SvtxEvalStack.h>
0027 #include <g4eval/SvtxEvaluator.h>
0028 #include <g4eval/SvtxHitEval.h>
0029 #include <g4eval/SvtxTruthEval.h>
0030
0031 #include <trackbase/TrkrClusterContainer.h>
0032 #include <trackbase/TrkrClusterHitAssoc.h>
0033 #include <trackbase/TrkrClusterv1.h>
0034 #include <trackbase/TrkrHit.h>
0035 #include <trackbase/TrkrHitSet.h>
0036 #include <trackbase/TrkrHitSetContainer.h>
0037
0038 #include <fun4all/Fun4AllHistoManager.h>
0039 #include <fun4all/Fun4AllReturnCodes.h>
0040 #include <fun4all/Fun4AllServer.h>
0041 #include <fun4all/PHTFileServer.h>
0042
0043 #include <phhepmc/PHHepMCGenEvent.h>
0044 #include <phhepmc/PHHepMCGenEventMap.h>
0045 #include <phool/PHCompositeNode.h>
0046 #include <phool/getClass.h>
0047
0048 #include <TDatabasePDG.h>
0049 #include <TFile.h>
0050 #include <TH1D.h>
0051 #include <TH2D.h>
0052 #include <TString.h>
0053 #include <TTree.h>
0054 #include <TVector3.h>
0055
0056 #include <HepMC/GenEvent.h>
0057
0058 #include <CLHEP/Units/SystemOfUnits.h>
0059
0060 #include <H5Cpp.h>
0061
0062 #include <boost/format.hpp>
0063
0064 #include <algorithm>
0065 #include <array>
0066 #include <cassert>
0067 #include <cmath>
0068 #include <iostream>
0069 #include <limits>
0070 #include <stdexcept>
0071
0072 using namespace std;
0073 using namespace CLHEP;
0074 using namespace H5;
0075
0076 TPCMLDataInterface::TPCMLDataInterface(
0077 unsigned int minLayer,
0078 unsigned int m_maxLayer,
0079 const std::string& outputfilename)
0080 : SubsysReco("TPCMLDataInterface")
0081 , m_svtxevalstack(nullptr)
0082 , m_strict(false)
0083 , m_saveDataStreamFile(true)
0084 , m_outputFileNameBase(outputfilename)
0085 , m_h5File(nullptr)
0086 , m_minLayer(minLayer)
0087 , m_maxLayer(m_maxLayer)
0088 , m_evtCounter(-1)
0089 , m_vertexZAcceptanceCut(10)
0090 , m_etaAcceptanceCut(1.1)
0091 , m_momentumCut(.1)
0092 , m_hDataSize(nullptr)
0093 , m_hWavelet(nullptr)
0094 , m_hNChEta(nullptr)
0095 , m_hLayerWaveletSize(nullptr)
0096 , m_hLayerHit(nullptr)
0097 , m_hLayerZBinHit(nullptr)
0098 , m_hLayerZBinADC(nullptr)
0099 , m_hLayerDataSize(nullptr)
0100 , m_hLayerSumHit(nullptr)
0101 , m_hLayerSumDataSize(nullptr)
0102 {
0103 }
0104
0105 TPCMLDataInterface::~TPCMLDataInterface()
0106 {
0107 if (m_h5File) delete m_h5File;
0108 }
0109
0110 int TPCMLDataInterface::Init(PHCompositeNode* topNode)
0111 {
0112 return Fun4AllReturnCodes::EVENT_OK;
0113 }
0114
0115 int TPCMLDataInterface::End(PHCompositeNode* topNode)
0116 {
0117 if (Verbosity() >= VERBOSITY_SOME)
0118 cout << "TPCMLDataInterface::End - write to " << m_outputFileNameBase + ".root" << endl;
0119 PHTFileServer::get().cd(m_outputFileNameBase + ".root");
0120
0121 Fun4AllHistoManager* hm = getHistoManager();
0122 assert(hm);
0123 for (unsigned int i = 0; i < hm->nHistos(); i++)
0124 hm->getHisto(i)->Write();
0125
0126
0127 TTree* T_Index = new TTree("T_Index", "T_Index");
0128 assert(T_Index);
0129 T_Index->Write();
0130
0131 if (m_h5File)
0132 {
0133 delete m_h5File;
0134 m_h5File = nullptr;
0135 }
0136
0137 return Fun4AllReturnCodes::EVENT_OK;
0138 }
0139
0140 int TPCMLDataInterface::InitRun(PHCompositeNode* topNode)
0141 {
0142 PHG4CylinderCellGeomContainer* seggeo = findNode::getClass<PHG4CylinderCellGeomContainer>(topNode, "CYLINDERCELLGEOM_SVTX");
0143 if (!seggeo)
0144 {
0145 cout << "could not locate geo node "
0146 << "CYLINDERCELLGEOM_SVTX" << endl;
0147 exit(1);
0148 }
0149
0150 int nZBins = 0;
0151 for (int layer = m_minLayer; layer <= m_maxLayer; ++layer)
0152 {
0153 PHG4CylinderCellGeom* layerGeom =
0154 seggeo->GetLayerCellGeom(layer);
0155 assert(layerGeom);
0156
0157 if (nZBins <= 0)
0158 {
0159 nZBins = layerGeom->get_zbins();
0160 assert(nZBins > 0);
0161 }
0162 else
0163 {
0164 if ((int) nZBins != layerGeom->get_zbins())
0165 {
0166 cout << "TPCMLDataInterface::InitRun - Fatal Error - nZBin at layer " << layer << " is " << layerGeom->get_zbins()
0167 << ", which is different from previous layers of nZBin = " << nZBins << endl;
0168 exit(1);
0169 }
0170 }
0171 }
0172
0173 if (Verbosity() >= VERBOSITY_SOME)
0174 cout << "TPCMLDataInterface::get_HistoManager - Making PHTFileServer " << m_outputFileNameBase + ".root"
0175 << endl;
0176 PHTFileServer::get().open(m_outputFileNameBase + ".root", "RECREATE");
0177
0178 Fun4AllHistoManager* hm = getHistoManager();
0179 assert(hm);
0180
0181 TH1D* h = new TH1D("hNormalization",
0182 "Normalization;Items;Summed quantity", 10, .5, 10.5);
0183 int i = 1;
0184 h->GetXaxis()->SetBinLabel(i++, "Event count");
0185 h->GetXaxis()->SetBinLabel(i++, "Collision count");
0186 h->GetXaxis()->SetBinLabel(i++, "TPC G4Hit");
0187 h->GetXaxis()->SetBinLabel(i++, "TPC G4Hit Edep");
0188 h->GetXaxis()->SetBinLabel(i++, "TPC Hit");
0189 h->GetXaxis()->SetBinLabel(i++, "TPC Wavelet");
0190 h->GetXaxis()->SetBinLabel(i++, "TPC DataSize");
0191
0192 h->GetXaxis()->LabelsOption("v");
0193 hm->registerHisto(h);
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204 hm->registerHisto(m_hDataSize =
0205 new TH1D("hDataSize",
0206 "TPC Data Size per Event;Data size [Byte];Count",
0207 10000, 0, 20e6));
0208
0209 hm->registerHisto(m_hWavelet =
0210 new TH1D("hWavelet",
0211 "TPC Recorded Wavelet per Event;Wavelet count;Count",
0212 10000, 0, 4e6));
0213
0214 hm->registerHisto(m_hNChEta =
0215 new TH1D("hNChEta",
0216 "Charged particle #eta distribution;#eta;Count",
0217 1000, -5, 5));
0218
0219 hm->registerHisto(m_hLayerWaveletSize =
0220 new TH2D("hLayerWaveletSize",
0221 "Number of Recorded ADC sample per Wavelet;Layer ID;ADC Sample Count per Wavelet",
0222 m_maxLayer - m_minLayer + 1, m_minLayer - .5, m_maxLayer + .5,
0223 nZBins, -.5, nZBins - .5));
0224
0225 hm->registerHisto(m_hLayerHit =
0226 new TH2D("hLayerHit",
0227 "Number of Recorded ADC sample per channel;Layer ID;ADC Sample Count",
0228 m_maxLayer - m_minLayer + 1, m_minLayer - .5, m_maxLayer + .5,
0229 nZBins, -.5, nZBins - .5));
0230
0231 hm->registerHisto(m_hLayerDataSize =
0232 new TH2D("hLayerDataSize",
0233 "Data size per channel;Layer ID;Data size [Byte]",
0234 m_maxLayer - m_minLayer + 1, m_minLayer - .5, m_maxLayer + .5,
0235 2 * nZBins, 0, 2 * nZBins));
0236
0237 hm->registerHisto(m_hLayerSumHit =
0238 new TH2D("hLayerSumHit",
0239 "Number of Recorded ADC sample per layer;Layer ID;ADC Sample Count",
0240 m_maxLayer - m_minLayer + 1, m_minLayer - .5, m_maxLayer + .5,
0241 10000, -.5, 99999.5));
0242
0243 hm->registerHisto(m_hLayerSumDataSize =
0244 new TH2D("hLayerSumDataSize",
0245 "Data size per trigger per layer;Layer ID;Data size [Byte]",
0246 m_maxLayer - m_minLayer + 1, m_minLayer - .5, m_maxLayer + .5,
0247 1000, 0, .5e6));
0248
0249 hm->registerHisto(m_hLayerZBinHit =
0250 new TH2D("hLayerZBinHit",
0251 "Number of Recorded ADC sample per Time Bin;z bin ID;Layer ID",
0252 nZBins, -.5, nZBins - .5,
0253 m_maxLayer - m_minLayer + 1, m_minLayer - .5, m_maxLayer + .5));
0254
0255 hm->registerHisto(m_hLayerZBinADC =
0256 new TH2D("hLayerZBinADC",
0257 "Sum ADC per Time Bin;z bin ID;Layer ID",
0258 nZBins, -.5, nZBins - .5,
0259 m_maxLayer - m_minLayer + 1, m_minLayer - .5, m_maxLayer + .5));
0260
0261
0262
0263 if (Verbosity() >= VERBOSITY_SOME)
0264 cout << "TPCMLDataInterface::get_HistoManager - Making H5File " << m_outputFileNameBase + ".h5"
0265 << endl;
0266 m_h5File = new H5File(m_outputFileNameBase + ".h5", H5F_ACC_TRUNC);
0267
0268 return Fun4AllReturnCodes::EVENT_OK;
0269 }
0270
0271 int TPCMLDataInterface::process_event(PHCompositeNode* topNode)
0272 {
0273 m_evtCounter += 1;
0274
0275 assert(m_h5File);
0276
0277 Fun4AllHistoManager* hm = getHistoManager();
0278 assert(hm);
0279 TH1D* h_norm = dynamic_cast<TH1D*>(hm->getHisto("hNormalization"));
0280 assert(h_norm);
0281 h_norm->Fill("Event count", 1);
0282
0283 if (!m_svtxevalstack)
0284 {
0285 m_svtxevalstack = new SvtxEvalStack(topNode);
0286 m_svtxevalstack->set_strict(m_strict);
0287 m_svtxevalstack->set_verbosity(Verbosity());
0288 m_svtxevalstack->set_use_initial_vertex(m_use_initial_vertex);
0289 m_svtxevalstack->set_use_genfit_vertex(m_use_genfit_vertex);
0290 m_svtxevalstack->next_event(topNode);
0291 }
0292 else
0293 {
0294 m_svtxevalstack->next_event(topNode);
0295 }
0296
0297 SvtxHitEval* hiteval = m_svtxevalstack->get_hit_eval();
0298 SvtxTruthEval* trutheval = m_svtxevalstack->get_truth_eval();
0299
0300 float gpx = 0;
0301 float gpy = 0;
0302 float gpz = 0;
0303
0304 PHG4HitContainer* g4hit = findNode::getClass<PHG4HitContainer>(topNode, "G4HIT_TPC");
0305 cout << "TPCMLDataInterface::process_event - g4 hit node G4HIT_TPC" << endl;
0306 if (!g4hit)
0307 {
0308 cout << "TPCMLDataInterface::process_event - Could not locate g4 hit node G4HIT_TPC" << endl;
0309 return Fun4AllReturnCodes::ABORTRUN;
0310 }
0311
0312
0313 TrkrHitSetContainer* hits = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
0314 if (!hits)
0315 {
0316 cout << PHWHERE << "ERROR: Can't find node TRKR_HITSET" << endl;
0317 return Fun4AllReturnCodes::ABORTRUN;
0318 }
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328 PHG4CylinderCellGeomContainer* seggeo = findNode::getClass<PHG4CylinderCellGeomContainer>(topNode, "CYLINDERCELLGEOM_SVTX");
0329 if (!seggeo)
0330 {
0331 cout << "TPCMLDataInterface::process_event - could not locate geo node "
0332 << "CYLINDERCELLGEOM_SVTX" << endl;
0333 exit(1);
0334 }
0335
0336 PHHepMCGenEventMap* geneventmap = findNode::getClass<PHHepMCGenEventMap>(topNode, "PHHepMCGenEventMap");
0337 if (!geneventmap)
0338 {
0339 static bool once = true;
0340 if (once)
0341 {
0342 once = false;
0343
0344 cout << "TPCMLDataInterface::process_event - - missing node PHHepMCGenEventMap. Skipping HepMC stat." << std::endl;
0345 }
0346 }
0347 else
0348 {
0349 h_norm->Fill("Collision count", geneventmap->size());
0350 }
0351
0352 PHG4TruthInfoContainer* truthInfoList = findNode::getClass<PHG4TruthInfoContainer>(topNode,
0353 "G4TruthInfo");
0354 if (!truthInfoList)
0355 {
0356 cout << "TPCMLDataInterface::process_event - Fatal Error - "
0357 << "unable to find DST node "
0358 << "G4TruthInfo" << endl;
0359 assert(truthInfoList);
0360 }
0361
0362 PHG4TruthInfoContainer::ConstRange primary_range =
0363 truthInfoList->GetPrimaryParticleRange();
0364
0365 for (PHG4TruthInfoContainer::ConstIterator particle_iter =
0366 primary_range.first;
0367 particle_iter != primary_range.second;
0368 ++particle_iter)
0369 {
0370 const PHG4Particle* p = particle_iter->second;
0371 assert(p);
0372
0373 TParticlePDG* pdg_p = TDatabasePDG::Instance()->GetParticle(
0374 p->get_pid());
0375 assert(pdg_p);
0376
0377 if (fabs(pdg_p->Charge()) > 0)
0378 {
0379 TVector3 pvec(p->get_px(), p->get_py(), p->get_pz());
0380
0381 if (pvec.Perp2() > 0)
0382 {
0383 assert(m_hNChEta);
0384 m_hNChEta->Fill(pvec.PseudoRapidity());
0385 }
0386 }
0387
0388 }
0389
0390 for (int layer = m_minLayer; layer <= m_maxLayer; ++layer)
0391 {
0392 PHG4HitContainer::ConstRange hit_begin_end = g4hit->getHits(layer);
0393
0394 for (PHG4HitContainer::ConstIterator hiter = hit_begin_end.first; hiter != hit_begin_end.second; ++hiter)
0395 {
0396 const double edep = hiter->second->get_edep();
0397 h_norm->Fill("TPC G4Hit Edep", edep);
0398 h_norm->Fill("TPC G4Hit", 1);
0399 }
0400
0401 }
0402
0403
0404 string h5GroupName = boost::str(boost::format("TimeFrame_%1%") % m_evtCounter);
0405 unique_ptr<Group> h5Group(new Group(m_h5File->createGroup("/" + h5GroupName)));
0406 h5Group->setComment(boost::str(boost::format("Collection of ADC data matrixes in Time Frame #%1%") % m_evtCounter));
0407 if (Verbosity())
0408 cout << "TPCMLDataInterface::process_event - save to H5 group " << h5GroupName << endl;
0409 map<int, shared_ptr<DataSet>> layerH5DataSetMap;
0410 map<int, shared_ptr<DataSet>> layerH5SignalBackgroundMap;
0411 map<int, shared_ptr<DataSpace>> layerH5DataSpaceMap;
0412 map<int, shared_ptr<DataSpace>> layerH5SignalBackgroundDataSpaceMap;
0413
0414
0415 vector<uint32_t> layerWaveletDataSize(m_maxLayer + 1, 0);
0416 vector<hsize_t> layerSize(1);
0417 layerSize[0] = static_cast<hsize_t>(m_maxLayer - m_minLayer + 1);
0418 shared_ptr<DataSpace> H5DataSpaceLayerWaveletDataSize(new DataSpace(1, layerSize.data()));
0419 shared_ptr<DataSet> H5DataSetLayerWaveletDataSize(new DataSet(h5Group->createDataSet(
0420 "sPHENIXRawDataSizeBytePerLayer",
0421 PredType::NATIVE_UINT32,
0422 *(H5DataSpaceLayerWaveletDataSize))));
0423
0424
0425 int nZBins = 0;
0426 vector<array<vector<int>, 2>> layerChanHit(m_maxLayer + 1);
0427 vector<array<vector<int>, 2>> layerChanDataSize(m_maxLayer + 1);
0428 vector<vector<uint16_t>> layerDataBuffer(m_maxLayer + 1);
0429 vector<vector<uint8_t>> layerSignalBackgroundBuffer(m_maxLayer + 1);
0430 vector<vector<hsize_t>> layerDataBufferSize(m_maxLayer + 1, vector<hsize_t>({0, 0}));
0431 vector<vector<hsize_t>> layerSignalBackgroundDataBufferSize(m_maxLayer + 1, vector<hsize_t>({0, 0}));
0432
0433 int nWavelet = 0;
0434 int sumDataSize = 0;
0435 for (int layer = m_minLayer; layer <= m_maxLayer; ++layer)
0436 {
0437 PHG4CylinderCellGeom* layerGeom =
0438 seggeo->GetLayerCellGeom(layer);
0439 assert(layerGeom);
0440
0441
0442 const int nphibins = layerGeom->get_phibins();
0443 assert(nphibins > 0);
0444
0445 if (Verbosity() >= VERBOSITY_MORE)
0446 {
0447 cout << "TPCMLDataInterface::process_event - init layer " << layer << " with "
0448 << "nphibins = " << nphibins
0449 << ", layerGeom->get_zbins() = " << layerGeom->get_zbins() << endl;
0450 }
0451
0452 if (nZBins <= 0)
0453 {
0454 nZBins = layerGeom->get_zbins();
0455 assert(nZBins > 0);
0456 }
0457 else
0458 {
0459 if ((int) nZBins != layerGeom->get_zbins())
0460 {
0461 cout << "TPCMLDataInterface::process_event - Fatal Error - nZBin at layer " << layer << " is " << layerGeom->get_zbins()
0462 << ", which is different from previous layers of nZBin = " << nZBins << endl;
0463 exit(1);
0464 }
0465 }
0466
0467 for (unsigned int side = 0; side < 2; ++side)
0468 {
0469 layerChanHit[layer][side].resize(nphibins, 0);
0470
0471 layerChanDataSize[layer][side].resize(nphibins, 0);
0472 }
0473
0474
0475 layerDataBufferSize[layer][0] = nphibins;
0476 layerDataBufferSize[layer][1] = layerGeom->get_zbins();
0477 layerSignalBackgroundDataBufferSize[layer][0] = nphibins;
0478 layerSignalBackgroundDataBufferSize[layer][1] = layerGeom->get_zbins();
0479 layerDataBuffer[layer].resize(layerDataBufferSize[layer][0] * layerDataBufferSize[layer][1], 0);
0480 layerSignalBackgroundBuffer[layer].resize(layerSignalBackgroundDataBufferSize[layer][0] * layerSignalBackgroundDataBufferSize[layer][1], 0);
0481
0482 static const vector<hsize_t> cdims({32, 32});
0483 DSetCreatPropList ds_creatplist;
0484 ds_creatplist.setChunk(2, cdims.data());
0485 ds_creatplist.setDeflate(6);
0486
0487 layerH5DataSpaceMap[layer] = shared_ptr<DataSpace>(new DataSpace(2, layerDataBufferSize[layer].data()));
0488 layerH5SignalBackgroundDataSpaceMap[layer] = shared_ptr<DataSpace>(new DataSpace(2, layerSignalBackgroundDataBufferSize[layer].data()));
0489
0490 layerH5DataSetMap[layer] = shared_ptr<DataSet>(new DataSet(h5Group->createDataSet(
0491 boost::str(boost::format("Data_Layer%1%") % (layer - m_minLayer)),
0492 PredType::NATIVE_UINT16,
0493 *(layerH5DataSpaceMap[layer]),
0494 ds_creatplist)));
0495
0496 layerH5SignalBackgroundMap[layer] = shared_ptr<DataSet>(new DataSet(h5Group->createDataSet(
0497 boost::str(boost::format("Data_Layer_SignalBackground%1%") % (layer - m_minLayer)),
0498 PredType::NATIVE_UINT8,
0499 *(layerH5SignalBackgroundDataSpaceMap[layer]),
0500 ds_creatplist)));
0501
0502 }
0503
0504 assert(nZBins > 0);
0505
0506
0507 int last_layer = -1;
0508 int last_side = -1;
0509 int last_phibin = -1;
0510 int last_zbin = -1;
0511 vector<unsigned int> last_wavelet;
0512 int last_wavelet_hittime = -1;
0513
0514
0515
0516
0517
0518 TrkrHitSetContainer::ConstRange hitsetrange = hits->getHitSets(TrkrDefs::TrkrId::tpcId);
0519 for (TrkrHitSetContainer::ConstIterator hitsetitr = hitsetrange.first;
0520 hitsetitr != hitsetrange.second;
0521 ++hitsetitr)
0522 {
0523 TrkrHitSet* hitset = hitsetitr->second;
0524
0525 if (Verbosity() > 2) hitset->identify();
0526
0527
0528
0529 const int layer = TrkrDefs::getLayer(hitsetitr->first);
0530
0531 if (Verbosity() >= 2)
0532 {
0533 cout << "TPCMLDataInterface::process_event - TrkrHitSet @ layer " << layer << " with " << hitset->size() << " hits" << endl;
0534 }
0535
0536 if (layer < m_minLayer or layer > m_maxLayer) continue;
0537
0538
0539
0540 TrkrHitSet::ConstRange hitrangei = hitset->getHits();
0541 for (TrkrHitSet::ConstIterator hitr = hitrangei.first;
0542 hitr != hitrangei.second;
0543 ++hitr)
0544 {
0545
0546
0547 int phibin = TpcDefs::getPad(hitr->first);
0548 int zbin = TpcDefs::getTBin(hitr->first);
0549 const int side = (zbin < nZBins / 2) ? 0 : 1;
0550
0551 if (Verbosity() >= 2)
0552 {
0553 cout << "TPCMLDataInterface::process_event - hit @ layer " << layer << " phibin = " << phibin << " zbin = " << zbin << " side = " << side << endl;
0554 }
0555
0556 assert(phibin >= 0);
0557 assert(zbin >= 0);
0558 assert(side >= 0);
0559
0560
0561 if (last_layer != layer or last_phibin != phibin or last_side != side or abs(last_zbin - zbin) != 1)
0562 {
0563
0564 if (last_wavelet.size() > 0)
0565 {
0566 const int datasize = writeWavelet(last_layer, last_side, last_phibin, last_wavelet_hittime, last_wavelet);
0567 assert(datasize > 0);
0568
0569 nWavelet += 1;
0570 sumDataSize += datasize;
0571 layerChanDataSize[last_layer][last_side][last_phibin] += datasize;
0572
0573 last_wavelet.clear();
0574 last_zbin = -1;
0575 }
0576
0577
0578 PHG4CylinderCellGeom* layerGeom =
0579 seggeo->GetLayerCellGeom(layer);
0580 assert(layerGeom);
0581
0582 const double z_abs = fabs(layerGeom->get_zcenter(zbin));
0583 const double r = layerGeom->get_radius();
0584 TVector3 acceptanceVec(r, 0, z_abs - m_vertexZAcceptanceCut);
0585 const double eta = acceptanceVec.PseudoRapidity();
0586
0587 if (eta > m_etaAcceptanceCut) continue;
0588
0589
0590 last_layer = layer;
0591 last_side = side;
0592 last_phibin = phibin;
0593
0594
0595 last_wavelet_hittime = (side == 0) ? (zbin) : (nZBins - 1 - zbin);
0596 assert(last_wavelet_hittime >= 0);
0597 assert(last_wavelet_hittime <= nZBins / 2);
0598
0599 }
0600
0601 if (Verbosity() >= VERBOSITY_A_LOT)
0602 {
0603 cout << "TPCMLDataInterface::process_event - layer " << layer << " hit with "
0604
0605 << "phibin = " << phibin
0606 << ",zbin = " << zbin
0607 << ",side = " << side
0608 << ",last_wavelet.size() = " << last_wavelet.size()
0609 << ",last_zbin = " << last_zbin
0610 << endl;
0611 }
0612
0613
0614 if (last_wavelet.size() > 0)
0615 {
0616
0617
0618 assert(zbin - last_zbin == 1);
0619
0620
0621
0622
0623
0624 }
0625
0626
0627 unsigned int adc = hitr->second->getAdc();
0628 last_wavelet.push_back(adc);
0629 last_zbin = zbin;
0630
0631
0632 layerChanHit[layer][side][phibin] += 1;
0633 assert(m_hLayerZBinHit);
0634 m_hLayerZBinHit->Fill(zbin, layer, 1);
0635 assert(m_hLayerZBinADC);
0636 m_hLayerZBinADC->Fill(zbin, layer, adc);
0637 assert(adc < (1 << 10));
0638 assert((hsize_t) phibin < layerDataBufferSize[layer][0]);
0639 assert((hsize_t) zbin < layerDataBufferSize[layer][1]);
0640 const size_t hitindex(layerDataBufferSize[layer][1] * phibin + zbin);
0641 assert((hsize_t) phibin < layerSignalBackgroundDataBufferSize[layer][0]);
0642 assert((hsize_t) zbin < layerSignalBackgroundDataBufferSize[layer][1]);
0643 const size_t hitindexSB(layerSignalBackgroundDataBufferSize[layer][1] * phibin + zbin);
0644 assert(hitindex < layerDataBuffer[layer].size());
0645 assert(hitindexSB < layerSignalBackgroundBuffer[layer].size());
0646
0647 if (layerDataBuffer[layer][hitindex] != 0)
0648 {
0649 cout << "TPCMLDataInterface::process_event - WARNING - hit @ layer "
0650 << layer << " phibin = " << phibin << " zbin = " << zbin << " side = " << side
0651 << " overwriting previous hit with ADC = " << layerDataBuffer[layer][hitindex]
0652 << endl;
0653 }
0654 layerDataBuffer[layer][hitindex] = adc;
0655
0656 if (layerSignalBackgroundBuffer[layer][hitindexSB] != 0)
0657 {
0658 cout << "TPCMLDataInterface::process_event - WARNING - signal/background @ layer "
0659 << layer << " phibin = " << phibin << " zbin = " << zbin << " side = " << side
0660 << " overwriting previous hit with = " << layerSignalBackgroundBuffer[layer][hitindexSB]
0661 << endl;
0662 }
0663
0664
0665
0666 bool signal_or_bgd = false;
0667
0668 TrkrDefs::hitkey hit_key = hitr->first;
0669
0670 std::set<PHG4Hit*> g4hit_set = hiteval->all_truth_hits(hit_key);
0671
0672 for (PHG4Hit* g4hit : g4hit_set)
0673 {
0674 PHG4Particle* g4particle = trutheval->get_particle(g4hit);
0675
0676 if (g4particle != nullptr)
0677 {
0678 gpx = g4particle->get_px();
0679 gpy = g4particle->get_py();
0680 gpz = g4particle->get_pz();
0681 }
0682
0683 if (sqrt(gpx * gpx + gpy * gpy + gpz * gpz) > m_momentumCut) signal_or_bgd = true;
0684
0685 }
0686
0687 layerSignalBackgroundBuffer[layer][hitindexSB] = signal_or_bgd;
0688
0689 }
0690
0691 }
0692
0693
0694 if (last_wavelet.size() > 0)
0695 {
0696 const int datasize = writeWavelet(last_layer, last_side, last_phibin, last_wavelet_hittime, last_wavelet);
0697 assert(datasize > 0);
0698
0699 nWavelet += 1;
0700 sumDataSize += datasize;
0701 layerChanDataSize[last_layer][last_side][last_phibin] += datasize;
0702 }
0703
0704
0705 for (int layer = m_minLayer; layer <= m_maxLayer; ++layer)
0706 {
0707 for (unsigned int side = 0; side < 2; ++side)
0708 {
0709 int sumHit = 0;
0710 for (const int& hit : layerChanHit[layer][side])
0711 {
0712 sumHit += hit;
0713
0714 assert(m_hLayerHit);
0715 m_hLayerHit->Fill(layer, hit);
0716 h_norm->Fill("TPC Hit", hit);
0717
0718 if (Verbosity() >= VERBOSITY_MORE)
0719 {
0720 cout << "TPCMLDataInterface::process_event - layerChanHit: "
0721 << "hit = " << hit
0722 << "at layer = " << layer
0723 << ", side = " << side
0724 << endl;
0725 }
0726 }
0727
0728 if (Verbosity() >= VERBOSITY_MORE)
0729 {
0730 cout << "TPCMLDataInterface::process_event - hLayerSumCellHit->Fill(" << layer << ", " << sumHit << ")" << endl;
0731 }
0732 assert(m_hLayerSumHit);
0733 m_hLayerSumHit->Fill(layer, sumHit);
0734
0735 double sumData = 0;
0736 for (const int& data : layerChanDataSize[layer][side])
0737 {
0738 sumData += data;
0739
0740 assert(m_hLayerDataSize);
0741 m_hLayerDataSize->Fill(layer, data);
0742 }
0743
0744 assert(m_hLayerSumDataSize);
0745 m_hLayerSumDataSize->Fill(layer, sumData);
0746 layerWaveletDataSize[(layer - m_minLayer)] += sumData;
0747 }
0748
0749
0750
0751 assert(layerH5DataSetMap[layer]);
0752 assert(layerH5SignalBackgroundMap[layer]);
0753 layerH5DataSetMap[layer]->write(layerDataBuffer[layer].data(), PredType::NATIVE_UINT16);
0754 layerH5SignalBackgroundMap[layer]->write(layerSignalBackgroundBuffer[layer].data(), PredType::NATIVE_UINT8);
0755 H5DataSetLayerWaveletDataSize->write(layerWaveletDataSize.data(), PredType::NATIVE_UINT32);
0756
0757 }
0758
0759 assert(m_hWavelet);
0760 m_hWavelet->Fill(nWavelet);
0761 h_norm->Fill("TPC Wavelet", nWavelet);
0762 assert(m_hDataSize);
0763 m_hDataSize->Fill(sumDataSize);
0764 h_norm->Fill("TPC DataSize", sumDataSize);
0765
0766 return Fun4AllReturnCodes::EVENT_OK;
0767 }
0768
0769 int TPCMLDataInterface::writeWavelet(int layer, int side, int phibin, int hittime, const vector<unsigned int>& wavelet)
0770 {
0771 static const int headersize = 2;
0772
0773
0774 const int datasizebit = wavelet.size() * 10;
0775 int datasizebyte = datasizebit / 8;
0776 if (datasizebyte * 8 < datasizebit) datasizebyte += 1;
0777
0778 assert(m_hLayerWaveletSize);
0779 m_hLayerWaveletSize->Fill(layer, wavelet.size());
0780
0781 return headersize + datasizebyte;
0782 }
0783
0784 Fun4AllHistoManager*
0785 TPCMLDataInterface::getHistoManager()
0786 {
0787 static string histname("TPCMLDataInterface_HISTOS");
0788
0789 Fun4AllServer* se = Fun4AllServer::instance();
0790 Fun4AllHistoManager* hm = se->getHistoManager(histname);
0791
0792 if (not hm)
0793 {
0794 cout
0795 << "TPCMLDataInterface::get_HistoManager - Making Fun4AllHistoManager " << histname
0796 << endl;
0797 hm = new Fun4AllHistoManager(histname);
0798 se->registerHistoManager(hm);
0799 }
0800
0801 assert(hm);
0802
0803 return hm;
0804 }