CbmRoot
Loading...
Searching...
No Matches
CbmBuildEventsFromTracksIdeal.cxx
Go to the documentation of this file.
1/* Copyright (C) 2017-2020 IKF-UFra, GSI
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Valentina Akishina [committer] */
4
11
12#include "CbmEvent.h"
13#include "CbmMCDataArray.h"
14#include "CbmMCDataManager.h"
15#include "CbmMCEventList.h"
16#include "CbmMCTrack.h"
17#include "CbmStsDigi.h"
18#include "CbmStsHit.h"
19#include "CbmStsTrack.h"
20#include "CbmTrackMatchNew.h"
21#include "FairRootManager.h"
22#include "TClonesArray.h"
23#include "TStopwatch.h"
24
25#include <Logger.h>
26
27#include <cassert>
28#include <iomanip>
29#include <iostream>
30#include <map>
31
32using namespace std;
33
34
35// ===== Constructor =====================================================
37 : FairTask("CbmBuildEventsFromTracksIdeal")
38 , fStsDigis(nullptr)
39 , fStsTracks(nullptr)
40 , fMCTracks(nullptr)
41 , fStsHits(nullptr)
42 , fMcPoints(nullptr)
43 , fEvents(nullptr)
44 , fStsTrackMatchArray(nullptr)
45 , fEventList(nullptr)
46{
47}
48// ===========================================================================
49
50
51// ===== Destructor ======================================================
56// ===========================================================================
57
58// ===== Task initialisation =============================================
60{
61
62
63 // --- Get FairRootManager instance
64 FairRootManager* ioman = FairRootManager::Instance();
65 assert(ioman);
66
67 // --- Get input array (CbmStsDigi)
68 // fStsDigis = (TClonesArray*) ioman->GetObject("StsDigi");
69 // assert ( fStsDigis );
70
71 CbmMCDataManager* mcManager = (CbmMCDataManager*) ioman->GetObject("MCDataManager");
72 if (mcManager == nullptr) LOG(fatal) << GetName() << ": No CbmMCDataManager!";
73
74 fMCTracks = (CbmMCDataArray*) mcManager->InitBranch("MCTrack");
75 if (fMCTracks == nullptr) LOG(fatal) << GetName() << ": No MCTrack data!";
76
77 fEventList = (CbmMCEventList*) ioman->GetObject("MCEventList.");
78 if (fEventList == 0) {
79 LOG(error) << GetName() << "MC Event List not found!";
80 return kERROR;
81 }
82
83 // open MCTrack array
84 fStsTracks = (TClonesArray*) ioman->GetObject("StsTrack");
85 assert(fStsTracks);
86
87 fStsTrackMatchArray = (TClonesArray*) ioman->GetObject("StsTrackMatch");
88 if (fStsTrackMatchArray == 0) {
89 LOG(error) << GetName() << "track match array not found!";
90 return kERROR;
91 }
92
93 fStsHits = (TClonesArray*) ioman->GetObject("StsHit");
94 assert(fStsHits);
95
96 fMcPoints = (TClonesArray*) ioman->GetObject("StsPoint");
97 assert(fMcPoints);
98
99
100 // Register output array (CbmStsDigi)
101 fEvents = new TClonesArray("CbmEvent", 100);
102 ioman->Register("CbmEvent", "Cbm_Event", fEvents, IsOutputBranchPersistent("CbmEvent"));
103
104 return kSUCCESS;
105}
106// ===========================================================================
107
108// ===== Task execution ==================================================
110{
111
112 TStopwatch timer;
113 timer.Start();
114 std::map<Int_t, CbmEvent*> eventMap;
115
116 // Clear output array
117 fEvents->Delete();
118
119 UInt_t nTracks = fStsTracks->GetEntriesFast();
120
121
122 vector<vector<UInt_t>> vKFPTrack1;
123
124 int nMCEvents = fEventList->GetNofEvents();
125
126 vKFPTrack1.resize(nMCEvents);
127
128
129 for (unsigned int iTrack = 0; iTrack < nTracks; iTrack++) {
130
131 // CbmStsTrack* track = (CbmStsTrack*) fStsTracks->At(iTrack);
132
133 CbmTrackMatchNew* stsTrackMatch = (CbmTrackMatchNew*) fStsTrackMatchArray->At(iTrack);
134 if (stsTrackMatch->GetNofLinks() == 0) continue;
135 Float_t bestWeight = 0.f;
136 Float_t totalWeight = 0.f;
137 Int_t mcTrackId = -1;
138 int mcEvent = -1;
139 CbmLink link;
140 for (int iLink = 0; iLink < stsTrackMatch->GetNofLinks(); iLink++) {
141 totalWeight += stsTrackMatch->GetLink(iLink).GetWeight();
142 if (stsTrackMatch->GetLink(iLink).GetWeight() > bestWeight) {
143 bestWeight = stsTrackMatch->GetLink(iLink).GetWeight();
144 int iMCTrack = stsTrackMatch->GetLink(iLink).GetIndex();
145 link = stsTrackMatch->GetLink(iLink);
146
147
148 mcEvent = link.GetEntry();
149 mcTrackId = iMCTrack;
150 }
151 }
152 if (bestWeight / totalWeight < 0.7 || mcTrackId < 0) continue;
153
154 // CbmMCTrack *mcTrack = (CbmMCTrack*)fMCTracks->Get(0, mcEvent, mcTrackId);
155
156 vKFPTrack1[mcEvent].push_back(iTrack);
157 }
158
159
160 for (unsigned int iEvent = 0; iEvent < vKFPTrack1.size(); iEvent++) {
161 CbmEvent* event = nullptr;
162 Int_t nEvents = fEvents->GetEntriesFast();
163
164 if (vKFPTrack1[iEvent].size() > 1) {
165
166 event = new ((*fEvents)[nEvents]) CbmEvent(iEvent);
167 event->SetStsTracks(vKFPTrack1[iEvent]);
168 }
169 }
170
171 timer.Stop();
172}
173
174
185
186
187// ===========================================================================
188
ClassImp(CbmConverterManager)
Data class for a reconstructed hit in the STS.
Data class for STS tracks.
static constexpr size_t size()
Definition KfSimdPseudo.h:2
Task class for associating digis to events.
TClonesArray * fMcPoints
Input array (class CbmStsDigi)
TClonesArray * fStsTracks
Input array (class CbmStsDigi)
TClonesArray * fStsHits
Input array (class CbmStsDigi)
TClonesArray * fEvents
Output array (class CbmEvent)
CbmMCDataArray * fMCTracks
Input array (class CbmStsDigi)
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
void SetStsTracks(std::vector< uint32_t > &indexVector)
Sets the index array for STS tracks. Old content will be overwritten.
Definition CbmEvent.h:183
Access to a MC data branch for time-based analysis.
Task class creating and managing CbmMCDataArray objects.
CbmMCDataObject * GetObject(const char *name)
CbmMCDataArray * InitBranch(const char *name)
Container class for MC events with number, file and start time.
std::size_t GetNofEvents() const
Number of events in the list @value Number of events.
const CbmLink & GetLink(int32_t i) const
Definition CbmMatch.h:39
int32_t GetNofLinks() const
Definition CbmMatch.h:42
Hash for CbmL1LinkKey.