SND@LHC Software
Loading...
Searching...
No Matches
DigiTaskSND.cxx
Go to the documentation of this file.
1 #include <TClonesArray.h> // or TClonesArray
2 #include <TGenericClassInfo.h> // for TGenericClassInfo
3 #include <TMath.h> // for Sqrt
4 #include <TRandom.h> // for TRandom, gRandom
5 #include <TFile.h>
6 #include <TROOT.h>
7 #include <iostream> // for operator<<, basic_ostream, endl
8 #include <algorithm> // std::sort
9 #include <vector> // std::vector
10 #include "FairMCEventHeader.h" // for FairMCEventHeader
11 #include "FairLink.h" // for FairLink
12 #include "FairRunSim.h" // for FairRunSim
13 #include "FairRunAna.h" // for FairRunAna
14 #include "FairRootManager.h" // for FairRootManager
15 #include "DigiTaskSND.h" // for Digitization
16 #include "ScifiPoint.h" // for SciFi Point
17 #include "Scifi.h" // for SciFi detector
18 #include "MuFilterPoint.h" // for Muon Filter Point
19 #include "sndScifiHit.h" // for SciFi Hit
20 #include "MuFilterHit.h" // for Muon Filter Hit
21 #include "sndCluster.h" // for Clusters
22 #include "Hit2MCPoints.h" // for linking hits to true MC points
23
24using std::map;
25using std::vector;
26using std::pair;
27using std::make_pair;
28
30 : FairTask("DigTaskSND")
31 , fScifiPointArray(nullptr)
32 , fMuFilterPointArray(nullptr)
33 , fEventHeader(nullptr)
34 , fScifiDigiHitArray(nullptr)
35 , fScifiClusterArray(nullptr)
36 , fMuFilterDigiHitArray(nullptr)
37 , fScifiHit2MCPointsArray(nullptr)
38 , fMuFilterHit2MCPointsArray(nullptr)
39 , fMakeClusterScifi(true)
40 , fCopyEmulsionPoints(false)
41{}
42
44
46{
47 FairRootManager* ioman = FairRootManager::Instance();
48 if (!ioman) {
49 LOG(FATAL) << "DigiTaskSND::Init: RootManager not instantiated!";
50 }
51
52 // Get the SciFi detector and sipm to fibre mapping
53 scifi = dynamic_cast<Scifi*> (gROOT->GetListOfGlobals()->FindObject("Scifi") );
57
58 // Get event header
59 // Try classic FairRoot approach first
60 fMCEventHeader = static_cast<FairMCEventHeader*> (ioman->GetObject("MCEventHeader."));
61 // .. with a safety net for trailing dots mischief
62 if ( fMCEventHeader == nullptr ) {
63 fMCEventHeader = static_cast<FairMCEventHeader*>(gROOT->FindObjectAny("MCEventHeader."));
64 }
65 if ( fMCEventHeader == nullptr ) {
66 ioman->GetInTree()->SetBranchAddress("MCEventHeader.", &fMCEventHeader);
67 LOG(INFO) << "MCEventHeader. branch is found";
68 }
69 // Get input MC points
70 fScifiPointArray = static_cast<TClonesArray*>(ioman->GetObject("ScifiPoint"));
71 fvetoPointArray = static_cast<TClonesArray*>(ioman->GetObject("vetoPoint"));
72 fEmulsionPointArray = static_cast<TClonesArray*>(ioman->GetObject("EmulsionDetPoint"));
73 fMuFilterPointArray = static_cast<TClonesArray*>(ioman->GetObject("MuFilterPoint"));
75 LOG(ERROR) << "No Scifi and no MuFilter MC Point array!";
76 return kERROR;
77 }
78 // copy branches from input file:
79 fMCTrackArray = static_cast<TClonesArray*>(ioman->GetObject("MCTrack"));
80 ioman->Register("MCTrack", "ShipMCTrack", fMCTrackArray, kTRUE);
81 ioman->Register("vetoPoint", "vetoPoints", fvetoPointArray, kTRUE);
82 ioman->Register("EmulsionDetPoint", "EmulsionDetPoints", fEmulsionPointArray, fCopyEmulsionPoints);
83 ioman->Register("ScifiPoint", "ScifiPoints", fScifiPointArray, kTRUE);
84 ioman->Register("MuFilterPoint", "MuFilterPoints", fMuFilterPointArray, kTRUE);
85
86 // Event header
88 ioman->Register("EventHeader.", "sndEventHeader", fEventHeader, kTRUE);
89
90 // Create and register output array - for SciFi and MuFilter
91 fScifiDigiHitArray = new TClonesArray("sndScifiHit");
92 ioman->Register("Digi_ScifiHits", "DigiScifiHit_det", fScifiDigiHitArray, kTRUE);
93 // Branche containing links to MC truth info
94 fScifiHit2MCPointsArray = new TClonesArray("Hit2MCPoints");
95 ioman->Register("Digi_ScifiHits2MCPoints", "DigiScifiHits2MCPoints_det", fScifiHit2MCPointsArray, kTRUE);
96 fScifiHit2MCPointsArray->BypassStreamer(kTRUE);
97 if ( fMakeClusterScifi ) {
98 fScifiClusterArray = new TClonesArray("sndCluster");
99 ioman->Register("Cluster_Scifi", "ScifiCluster_det", fScifiClusterArray, kTRUE);
100 }
101 fMuFilterDigiHitArray = new TClonesArray("MuFilterHit");
102 ioman->Register("Digi_MuFilterHits", "DigiMuFilterHit_det", fMuFilterDigiHitArray, kTRUE);
103 // Branche containing links to MC truth info
104 fMuFilterHit2MCPointsArray = new TClonesArray("Hit2MCPoints");
105 ioman->Register("Digi_MuFilterHits2MCPoints", "DigiMuFilterHits2MCPoints_det", fMuFilterHit2MCPointsArray, kTRUE);
106 fMuFilterHit2MCPointsArray->BypassStreamer(kTRUE);
107
108 return kSUCCESS;
109}
110
111void DigiTaskSND::Exec(Option_t* /*opt*/)
112{
113
114 fScifiDigiHitArray->Clear("C");
115 if (fMakeClusterScifi) fScifiClusterArray->Clear("C");
116 fScifiHit2MCPointsArray->Clear("C");
117 fMuFilterDigiHitArray->Clear("C");
118 fMuFilterHit2MCPointsArray->Clear("C");
119
120 // Set event header
124
125 // Digitize MC points if any
128 {
131 }
132}
133
135{
136 // a map containing fibreID and vector(list) of points and weights
137 map<int, pair<vector<ScifiPoint*>, vector<float>> > hitContainer{};
138 Hit2MCPoints mcLinks;
139 map<pair<int, int>, double> mcPoints{};
140 map<int, double> norm{};
141 int globsipmChan{}, detID{};
142 int locFibreID{};
143
144 // Fill the map
145 for (int k = 0, kEnd = fScifiPointArray->GetEntries(); k < kEnd; k++)
146 {
147 ScifiPoint* point = static_cast<ScifiPoint*>(fScifiPointArray->At(k));
148 if (!point) continue;
149 // Collect all hits in same SiPM channel
150 detID = point->GetDetectorID();
151 locFibreID = detID%100000;
152 // Check if locFibreID in a dead area
153 if(siPMFibres.count(locFibreID)==0) continue;
154 double dE{};
155 float weight{};
156 for (auto sipmChan : siPMFibres[locFibreID])
157 {
158 globsipmChan = int(detID/100000)*100000+sipmChan.first;
159 weight = sipmChan.second[0];
160 hitContainer[globsipmChan].first.push_back(point);
161 hitContainer[globsipmChan].second.push_back(weight);
162 dE = point->GetEnergyLoss()*weight;
163 mcPoints[make_pair(globsipmChan, k)] = dE;
164 norm[globsipmChan]+= dE;
165 }
166 }// End filling map
167 int index = 0;
168 // Loop over entries of the hitContainer map and collect all hits in same detector element
169 for (auto it = hitContainer.begin(); it != hitContainer.end(); it++){
170 new ((*fScifiDigiHitArray)[index]) sndScifiHit(it->first, hitContainer[it->first].first, hitContainer[it->first].second);
171 index++;
172 for (auto mcit = mcPoints.begin(); mcit != mcPoints.end(); mcit++){
173 if(it->first == mcit->first.first) mcLinks.Add(it->first, mcit->first.second, mcPoints[make_pair(it->first, mcit->first.second)]/norm[it->first]);
174 }
175 }
176 new((*fScifiHit2MCPointsArray)[0]) Hit2MCPoints(mcLinks);
177}
178
180{
181 map<int, int > hitDict{};
182 vector<int> hitList{};
183 vector<int> tmp{};
184 int index{}, ncl{}, cprev{}, c{}, last{}, first{}, N{};
185
186 for (int k = 0, kEnd = fScifiDigiHitArray->GetEntries(); k < kEnd; k++) {
187 sndScifiHit* d = static_cast<sndScifiHit*>(fScifiDigiHitArray->At(k));
188 if (!d->isValid()) continue;
189 hitDict[d->GetDetectorID()] = k ;
190 hitList.push_back(d->GetDetectorID());
191 }
192 if (hitList.size() > 0)
193 {
194 sort(hitList.begin(), hitList.end());
195 tmp.push_back(hitList[0]);
196 cprev = hitList[0];
197 ncl = 0;
198 last = hitList.size()-1;
199 vector<sndScifiHit*> hitlist{};
200 for (int i =0; i<hitList.size(); i++)
201 {
202 if (i==0 && hitList.size()>1) continue;
203 c = hitList[i];
204 if (c-cprev ==1) tmp.push_back(c);
205 if (c-cprev !=1 || c==hitList[last]){
206 first = tmp[0];
207 N = tmp.size();
208 hitlist.clear();
209 for (int j=0; j<tmp.size(); j++)
210 {
211 sndScifiHit* aHit = static_cast<sndScifiHit*>(fScifiDigiHitArray->At(hitDict[tmp[j]]));
212 hitlist.push_back(aHit);
213 }
214 new ((*fScifiClusterArray)[index]) sndCluster(first, N, hitlist, scifi);
215 index++;
216 if (c!=hitList[last])
217 {
218 ncl++;
219 tmp.clear();
220 tmp.push_back(c);
221 }
222 }
223 cprev = c;
224 }
225 }
226}
227
229{
230 // a map with detID and vector(list) of points
231 map<int, vector<MuFilterPoint*> > hitContainer{};
232 Hit2MCPoints mcLinks;
233 map<pair<int, int>, double> mcPoints{};
234 map<int, double> norm{};
235 int detID{};
236
237 // Fill the map
238 for (int k = 0, kEnd = fMuFilterPointArray->GetEntries(); k < kEnd; k++) {
239 MuFilterPoint* point = static_cast<MuFilterPoint*>(fMuFilterPointArray->At(k));
240 if (!point) continue;
241 // Collect all hits in same detector element
242 detID = point->GetDetectorID();
243 hitContainer[detID].push_back(point);
244 mcPoints[make_pair(detID, k)] = point->GetEnergyLoss();
245 norm[detID]+= point->GetEnergyLoss();
246 }
247 int index = 0;
248 // Loop over entries of the hitContainer map and collect all hits in same detector element
249 for (auto it = hitContainer.begin(); it != hitContainer.end(); it++){
250 new ((*fMuFilterDigiHitArray)[index]) MuFilterHit(it->first, hitContainer[it->first]);
251 index++;
252 for (auto mcit = mcPoints.begin(); mcit != mcPoints.end(); mcit++){
253 if(it->first == mcit->first.first) mcLinks.Add(it->first, mcit->first.second, mcPoints[make_pair(it->first, mcit->first.second)]/norm[it->first]);
254 }
255 }
256 new((*fMuFilterHit2MCPointsArray)[0]) Hit2MCPoints(mcLinks);
257}
TClonesArray * fMuFilterHit2MCPointsArray
Definition DigiTaskSND.h:55
std::map< Int_t, std::map< Int_t, std::array< float, 2 > > > siPMFibres
Definition DigiTaskSND.h:44
TClonesArray * fMCTrackArray
Definition DigiTaskSND.h:59
TClonesArray * fScifiDigiHitArray
Definition DigiTaskSND.h:54
SNDLHCEventHeader * fEventHeader
Definition DigiTaskSND.h:52
std::map< Int_t, std::map< Int_t, std::array< float, 2 > > > fibresSiPM
Definition DigiTaskSND.h:43
TClonesArray * fMuFilterDigiHitArray
Definition DigiTaskSND.h:53
TClonesArray * fScifiPointArray
Definition DigiTaskSND.h:49
void digitizeMuFilter()
FairMCEventHeader * fMCEventHeader
Definition DigiTaskSND.h:47
TClonesArray * fEmulsionPointArray
Definition DigiTaskSND.h:58
virtual InitStatus Init()
void clusterScifi()
Scifi * scifi
Definition DigiTaskSND.h:42
TClonesArray * fMuFilterPointArray
Definition DigiTaskSND.h:48
TClonesArray * fScifiHit2MCPointsArray
Definition DigiTaskSND.h:56
TClonesArray * fvetoPointArray
Definition DigiTaskSND.h:57
virtual void Exec(Option_t *opt)
TClonesArray * fScifiClusterArray
Definition DigiTaskSND.h:50
void digitizeScifi()
bool fMakeClusterScifi
Definition DigiTaskSND.h:62
bool fCopyEmulsionPoints
Definition DigiTaskSND.h:63
void Add(int detID, int key, float w)
void SetBunchType(int16_t bunchType)
void SetRunId(uint64_t runid)
void SetEventNumber(int id)
Definition Scifi.h:20
std::map< Int_t, std::map< Int_t, std::array< float, 2 > > > GetFibresMap()
Definition Scifi.h:43
std::map< Int_t, std::map< Int_t, std::array< float, 2 > > > GetSiPMmap()
Definition Scifi.h:42
void SiPMmapping()
Definition Scifi.cxx:860