BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnDchHitProducer.cxx
Go to the documentation of this file.
1#include "BmnDchHitProducer.h"
2
3#include "BmnDchHit.h"
4#include "BmnDchPoint.h"
5#include "CbmMCTrack.h"
6#include "FairRootManager.h"
7#include "TFile.h"
8#include "TH1F.h"
9#include "TH2F.h"
10#include "TMath.h"
11#include "TRandom.h"
12#include "TString.h"
13
14using std::cout;
15
17
19 : FairTask("BmnDchHitProducer")
20 , fBmnPointsArray(nullptr)
21 , fMCTracksArray(nullptr)
22 , fBmnHitsArray(nullptr)
23 , fPlaneTypes(nullptr)
24 , hMCtr_ion_dc1(nullptr)
25 , hMCtr_ion_dc2(nullptr)
26 , hMCtr_ionID_dc1(nullptr)
27 , hMCtr_ionID_dc2(nullptr)
28{
29 fInputBranchName = "DCHPoint";
30 fOutputHitsBranchName = "BmnDchHit";
31 fhTestFlnm2 = "test.BmnDCH_MC.root";
32 // fhList2.Add(hSmearing);
33
34 hMCtr_ion_dc1 = new TH1F("hMCHits_ion_dc1", "ion MC hits in DCH1 ", 9, 0, 9);
35 hMCtr_ion_dc2 = new TH1F("hMCHits_ion_dc2", "ion MC hits in DCH2 ", 9, 0, 9);
36 hMCtr_ionID_dc1 = new TH1F("hMCHits_ionID_dc1", "ion MC hits ID in DCH1 ", 10000, 0, 10000);
37 hMCtr_ionID_dc2 = new TH1F("hMCHits_ionID_dc2", "ion MC hits ID in DCH2 ", 10000, 0, 10000);
42
43 fPlaneTypes = new TString[fNActivePlanes]{"vb", "va", "ub", "ua", "yb", "ya", "xb", "xa"};
44}
45
47{
48 if (fPlaneTypes) {
49 delete[] fPlaneTypes;
50 fPlaneTypes = nullptr;
51 }
52}
53
55{
56
57 // cout << " BmnDchHitProducer::Init() " << endl;
58 rand_gen.SetSeed(5); // needed for repeated simulation
59
60 // Get ROOT Manager
61 FairRootManager* ioman = FairRootManager::Instance();
62
63 fBmnPointsArray = (TClonesArray*)ioman->GetObject(fInputBranchName);
64
65 if (!fBmnPointsArray) {
66 cout << "BmnDchHitProducer::Init(): branch " << fInputBranchName << " not found! Task will be deactivated"
67 << endl;
68 SetActive(kFALSE);
69 return kERROR;
70 }
71
72 fMCTracksArray = (TClonesArray*)ioman->GetObject("MCTrack");
73
75 ioman->Register(fOutputHitsBranchName, "DCH", fBmnHitsArray, kTRUE);
76
77 return kSUCCESS;
78}
79
81{
82
83 if (!IsActive())
84 return;
85
86 fBmnHitsArray->Delete();
87
88 if (!fBmnPointsArray) {
89 Error("BmnDchHitProducer::Exec()", " !!! Unknown branch name !!! ");
90 return;
91 }
92
93 if (fVerbose)
94 cout << "======================== DCH hit finder exec started ====================" << endl;
95
96 for (Int_t iPoint = 0; iPoint < fBmnPointsArray->GetEntriesFast(); iPoint++) {
97
98 BmnDchPoint* dchPoint = (BmnDchPoint*)fBmnPointsArray->UncheckedAt(iPoint);
99
100 Int_t track_id = dchPoint->GetTrackID();
101 Double_t x = dchPoint->GetX();
102 Double_t y = dchPoint->GetY();
103 Double_t z = dchPoint->GetZ();
104 Double_t px = dchPoint->GetPx();
105 Double_t py = dchPoint->GetPy();
106 Double_t pz = dchPoint->GetPz();
107
108 Int_t currentPlaneNum = dchPoint->GetPlaneNumber();
109 Int_t dchId = (z < 600.) ? 1 : 2; // find out which dch the hit is from
110 Double_t pdg = dchPoint->GetPdgId();
111 Double_t charge = px * px + py * py + pz * pz;
112
113 if (dchPoint->GetCharge() == 0)
114 continue; // skip neutral particles
115 if (fabs(px * px + py * py + pz * pz) < .25)
116 continue; // skip low momentum particles
117
118 if (dchId == 1) {
119 hMCtr_ionID_dc1->Fill(pdg);
120 }
121 if (dchId == 2) {
122 hMCtr_ionID_dc2->Fill(pdg);
123 }
124 // X,Y GLOBAL shifts need to be set from a file for geomety creation (X,y pos.) and center
125 Double_t x_shift = 0.0;
126 Double_t y_shift = 0.0;
127
128 // Convert GLOBAL->LOCAL
129 Double_t x_loc = -(x - x_shift); // x-plane wires (inverted)
130 Double_t y_loc = y - y_shift; // y-plane wires
131 Double_t v_loc = (x_loc + y_loc) / TMath::Sqrt2(); // v-plane wires
132 Double_t u_loc = (y_loc - x_loc) / TMath::Sqrt2(); // u-plane wires
133
134 // current position in wire units
135 Double_t wire_pos = DBL_MAX; // default
136
137 // distance from the center of DCH to the outermost wire
138 Double_t owdist = (fPlaneTypes[currentPlaneNum][1] == 'a')
139 ? 119.0
140 : 118.5; // 119.0 and 118.0 are taken from N.Voytishin's code
141
142 if (fPlaneTypes[currentPlaneNum][0] == 'x')
143 wire_pos = x_loc + owdist;
144 if (fPlaneTypes[currentPlaneNum][0] == 'y')
145 wire_pos = y_loc + owdist;
146 if (fPlaneTypes[currentPlaneNum][0] == 'v')
147 wire_pos = v_loc + owdist;
148 if (fPlaneTypes[currentPlaneNum][0] == 'u')
149 wire_pos = u_loc + owdist;
150
151 // Int_t nearest_wire = (wire_pos - Int_t(wire_pos) < 0.5) ? Int_t(wire_pos) : Int_t(wire_pos) + 1;
152 Int_t nearest_wire;
153 Bool_t left = false; // pos. relative to the nearest wire (left or right)
154 if (wire_pos - Int_t(wire_pos) < 0.5) {
155 nearest_wire = Int_t(wire_pos);
156 left = false;
157 } else {
158 nearest_wire = Int_t(wire_pos) + 1;
159 left = true;
160 }
161
162 // distance from the point to the nearest wire
163 Double_t wdist = TMath::Abs(wire_pos - nearest_wire);
164
165 // sigma error dependent on the distance to the nearest wire
166 Double_t sigm_err = (wdist < 0.02) ? 0.08
167 : (wdist >= 0.02 && wdist < 0.1) ? 0.06
168 : (wdist >= 0.1 && wdist < 0.4) ? 0.015
169 : (wdist >= 0.4 && wdist < 0.41) ? 0.08
170 : 0.10;
171
172 Double_t dev = rand_gen.Gaus(0, sigm_err);
173 Double_t wdist_smeared = wdist + dev;
174
175 if (wdist_smeared > .5) { // return the point if outside of the possible interval
176 // continue;
177 wdist_smeared = 1. - wdist_smeared;
178 dev = -dev;
179 }
180
181 if (wdist_smeared < 0) { // return the point if outside of the possible interval
182 // continue;
183 dev = -dev;
184 wdist_smeared = -wdist_smeared;
185 }
186
187 // not needed for further reco for Nikolay's version, can be removed
188 // hit-1 with smearing
189 Double_t x1_smeared; // = -x_loc + x_shift + ;
190 Double_t y1_smeared; // = y_loc + y_shift ;
191 Double_t z1_smeared = z; // + dz1;
192
193 // hit-2 (symmetrical) with smearing
194 Double_t x2_smeared;
195 Double_t y2_smeared;
196 Double_t z2_smeared = z; // + dz2;
197
198 if (fPlaneTypes[currentPlaneNum][0] == 'x') {
199 if (left) {
200 x1_smeared = -(x_loc - dev) + x_shift;
201 y1_smeared = y_loc + y_shift;
202 x2_smeared = (x1_smeared - 2 * wdist_smeared) + x_shift;
203 y2_smeared = y1_smeared; // + dy2;
204 } else {
205 x1_smeared = -(x_loc + dev) + x_shift;
206 y1_smeared = y_loc + y_shift;
207 x2_smeared = (x1_smeared + 2 * wdist_smeared) + x_shift;
208 y2_smeared = y1_smeared;
209 }
210 }
211
212 if (fPlaneTypes[currentPlaneNum][0] == 'y') {
213 if (left) {
214 x1_smeared = -x_loc + x_shift;
215 y1_smeared = y_loc + y_shift - dev;
216 x2_smeared = x1_smeared;
217 y2_smeared = y1_smeared + 2 * wdist_smeared + y_shift;
218 } else {
219 x1_smeared = -x_loc + x_shift;
220 y1_smeared = y_loc + y_shift + dev;
221 x2_smeared = x1_smeared;
222 y2_smeared = y1_smeared - 2 * wdist_smeared + y_shift;
223 }
224 }
225
226 if (fPlaneTypes[currentPlaneNum][0] == 'v') {
227 if (left) {
228 x1_smeared = -(((v_loc - dev) - u_loc) / TMath::Sqrt2()) + x_shift;
229 y1_smeared = (((v_loc - dev) + u_loc) / TMath::Sqrt2()) + y_shift;
230 x2_smeared = -(((v_loc + 2 * wdist_smeared) - u_loc) / TMath::Sqrt2()) + x_shift;
231 y2_smeared = (((v_loc + 2 * wdist_smeared) + u_loc) / TMath::Sqrt2()) + y_shift;
232 } else {
233 x1_smeared = -(((v_loc + dev) - u_loc) / TMath::Sqrt2()) + x_shift;
234 y1_smeared = (((v_loc + dev) + u_loc) / TMath::Sqrt2()) + y_shift;
235 x2_smeared = -(((v_loc - 2 * wdist_smeared) - u_loc) / TMath::Sqrt2()) + x_shift;
236 y2_smeared = (((v_loc - 2 * wdist_smeared) + u_loc) / TMath::Sqrt2()) + y_shift;
237 }
238 }
239
240 if (fPlaneTypes[currentPlaneNum][0] == 'u') {
241 if (left) {
242 x1_smeared = -((v_loc - (u_loc - dev)) / TMath::Sqrt2()) + x_shift;
243 y1_smeared = ((v_loc + (u_loc - dev)) / TMath::Sqrt2()) + y_shift;
244 x2_smeared = -((v_loc - (u_loc + 2 * wdist_smeared)) / TMath::Sqrt2()) + x_shift;
245 y2_smeared = ((v_loc + (u_loc + 2 * wdist_smeared)) / TMath::Sqrt2()) + y_shift;
246 } else {
247 x1_smeared = -((v_loc - (u_loc + dev)) / TMath::Sqrt2()) + x_shift;
248 y1_smeared = ((v_loc + (u_loc + dev)) / TMath::Sqrt2()) + y_shift;
249 x2_smeared = -((v_loc - (u_loc - 2 * wdist_smeared)) / TMath::Sqrt2()) + x_shift;
250 y2_smeared = ((v_loc + (u_loc - 2 * wdist_smeared)) / TMath::Sqrt2()) + y_shift;
251 }
252 }
253
254 // Output information for debugging
255 Bool_t info_out = false;
256 if (info_out) {
257 cout << "(x:y:z) = ( " << x << " : " << y << " : " << z << " )\n";
258 cout << " pdg code " << dchPoint->GetPdgId() << " \n";
259 cout << " charge " << dchPoint->GetCharge() << " \n";
260
261 cout << " currentPlaneNum = " << currentPlaneNum << "\n";
262 cout << " PlaneType = " << fPlaneTypes[currentPlaneNum][0] << "\n";
263 cout << " dev " << dev << " wdist_smeared = " << wdist_smeared << "\n";
264 cout << " smeared1(x:y:z) = ( " << x1_smeared << " : " << y1_smeared << " : " << z1_smeared << " )\n";
265 cout << " smeared2(x:y:z) = ( " << x2_smeared << " : " << y2_smeared << " : " << z2_smeared << " )\n";
266 cout << " wdist = " << wdist << "\n";
267 cout << " wire_pos = " << wire_pos << "\n";
268 cout << " nearest_wire = " << nearest_wire << "\n";
269 cout << " sigm_err = " << sigm_err << "\n";
270 cout << " left = " << left << "\n";
271 cout << " dchId = " << dchId << "\n";
272
273 cout << "\n";
274 }
275
276 // adding a new hit with probability 90%
277 if (rand_gen.Uniform() <= 1.) {
278 // adding a hit with global x,y,z from sim and wire + smeared distance from wire for further reconstruction
279 BmnDchHit* hit = new ((*fBmnHitsArray)[fBmnHitsArray->GetEntriesFast()])
280 BmnDchHit(0, TVector3(x, y, z), TVector3(sigm_err, sigm_err, 0.0), iPoint);
281
282 currentPlaneNum += (dchId == 1) ? 0 : 8;
283
284 hit->SetDchLayerNumber(currentPlaneNum);
285 hit->SetDchId(dchId - 1);
286 hit->SetWirePosition(nearest_wire);
287 hit->SetDrift(wdist_smeared);
288 hit->SetPhi(charge);
289 hit->SetHitId(track_id);
290 }
291 }
292
293 if (fVerbose)
294 cout << "======================== DCH hit finder exec finished ===================" << endl;
295}
296
298{
299
300 if (fVerbose) {
301 TFile file(fhTestFlnm2.Data(), "RECREATE");
302 fhList2.Write();
303 file.Close();
304 }
305}
TString fhTestFlnm2
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
bool Bool_t
int Int_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
const char Option_t
void Error(const char *location, const char *msgfmt,...)
BmnDchHitProducer()
Default constructor.
virtual ~BmnDchHitProducer()
Destructor.
virtual InitStatus Init()
Virtual method Init.
TClonesArray * fMCTracksArray
Input array of MC Tracks.
virtual void Finish()
Virtual method Finish.
TClonesArray * fBmnHitsArray
Output array of Hits.
TClonesArray * fBmnPointsArray
Input array of Points.
virtual void Exec(Option_t *opt)
Virtual method Exec.
const UInt_t fNActivePlanes
void SetHitId(Int_t idx)
Definition BmnDchHit.h:73
void SetWirePosition(Double_t v)
Definition BmnDchHit.h:51
void SetPhi(Double_t phi)
Definition BmnDchHit.h:69
void SetDchLayerNumber(UShort_t id)
Definition BmnDchHit.h:64
void SetDrift(Double_t v)
Definition BmnDchHit.h:49
void SetDchId(UChar_t id)
Definition BmnDchHit.h:62
Double_t GetPdgId()
Definition BmnDchPoint.h:52
Int_t GetPlaneNumber()
Definition BmnDchPoint.h:56
Double_t GetCharge()
Definition BmnDchPoint.h:53
void Close(Option_t *option="") override
constexpr Double_t Sqrt2()
Double_t Abs(Double_t d)