BmnRoot
Loading...
Searching...
No Matches
CbmKF.cxx
Go to the documentation of this file.
1#include "CbmKF.h"
2
3#include "BmnFieldPar.h"
4#include "BmnTOF1GeoPar.h" //YP
5#include "CbmGeoStsPar.h"
6#include "CbmGeoSttPar.h" //AZ
7#include "CbmKFFieldMath.h"
8#include "CbmKFHit.h"
9#include "CbmMvdGeoPar.h"
10#include "CbmStsStation.h"
11#include "FairBaseParSet.h"
12#include "FairGeoNode.h"
13#include "FairGeoPassivePar.h"
14#include "FairRunAna.h"
15#include "FairRuntimeDb.h"
16
17#include <TGeoTube.h> //AZ-171023
18#include <cmath>
19#include <iostream>
20
21using namespace std;
22
23CbmKF* CbmKF::fInstance = 0;
24
25CbmKF::CbmKF(const char* name, Int_t iVerbose)
26 : BmnTask(name, iVerbose)
27 , vMaterial()
28 ,
29
30 vMvdMaterial()
31 , vStsMaterial()
32 , vSttMaterial()
33 , vTargets()
34 , vPipe()
35 ,
36
37 vPassiveTube()
38 , vPassiveWall()
39 , vPassiveBox()
40 ,
41
42 MvdStationIDMap()
43 , StsStationIDMap()
44 , SttStationIDMap()
45 ,
46
47 StsDigi()
48 , fMagneticField(0)
49 , fMethod(2)
50 , fMaterialID2IndexMap()
51{
52 if (!fInstance)
53 fInstance = this;
55}
56
58{
59 fInstance = 0;
60}
61
63{
64 // FairRunAna* ana = FairRunAna::Instance();
65 // FairRuntimeDb* rtdb=ana->GetRuntimeDb();
66 FairRuntimeDb* rtdb = FairRuntimeDb::instance();
67 rtdb->getContainer("FairBaseParSet");
68 rtdb->getContainer("FairGeoParSet");
69 rtdb->getContainer("FairGeoPassivePar");
70 rtdb->getContainer("CbmMvdGeoPar");
71 rtdb->getContainer("CbmGeoStsPar");
72 rtdb->getContainer("BmnTOF1GeoPar"); // YP
73 rtdb->getContainer("CbmGeoSttPar"); // AZ
74 rtdb->getContainer("BmnFieldPar");
75 rtdb->getContainer("CbmStsDigiPar");
76}
77
78InitStatus CbmKF::ReInit()
79{
80 // AZ StsDigi.Clear();
81 StsDigi->Clear();
82 return Init();
83}
84
85InitStatus CbmKF::Init()
86{
87 vMvdMaterial.clear();
88 vStsMaterial.clear();
89 vSttMaterial.clear();
90 vPipe.clear();
91 vTargets.clear();
92 vPassiveTube.clear();
93 vPassiveWall.clear();
94 vPassiveBox.clear();
95 vMaterial.clear();
96
97 StsStationIDMap.clear();
98 SttStationIDMap.clear();
99 MvdStationIDMap.clear();
100
101 fMaterialID2IndexMap.clear();
102
103 FairRuntimeDb* RunDB = FairRuntimeDb::instance();
104
105 {
106 CbmGeoStsPar* StsPar = reinterpret_cast<CbmGeoStsPar*>(RunDB->findContainer("CbmGeoStsPar"));
107 CbmStsDigiPar* digiPar = reinterpret_cast<CbmStsDigiPar*>(RunDB->findContainer("CbmStsDigiPar"));
108 // AZ StsDigi.Init(StsPar, digiPar);
109 StsDigi->Init(StsPar, digiPar);
110 }
111
112 if (fVerbose)
113 cout << "KALMAN FILTER : === INIT MAGNETIC FIELD ===" << endl;
114 // BmnNewFieldMap *field = (BmnNewFieldMap*) fMagneticField; // GP
115
116 fMagneticField =
117 (BmnNewFieldMap*)(FairRunAna::Instance()->GetField()); // reinterpret_cast<FairField*>(Run->GetField());
118 if (fVerbose && fMagneticField)
119 cout << "Magnetic field done" << endl;
120
122 // fill vector of material
123
124 //=== Mvd ===
125
126 CbmMvdGeoPar* MvdPar = reinterpret_cast<CbmMvdGeoPar*>(RunDB->findContainer("CbmMvdGeoPar"));
127
128 if (MvdPar) { //=== Mvd stations ===
129
130 if (fVerbose)
131 cout << "KALMAN FILTER : === READ MVD MATERIAL ===" << endl;
132
133 int NMvdStations;
134
135 TObjArray* mvdNodes = MvdPar->GetGeoSensitiveNodes();
136 if (!mvdNodes) {
137 cout << "-E- " << GetName() << "::GetGeometry: No MVD node array" << endl;
138 NMvdStations = 0;
139 return kERROR;
140 }
141
142 NMvdStations = mvdNodes->GetEntries();
143
144 for (Int_t ist = 0; ist < NMvdStations; ist++) {
145 FairGeoNode* mvdNode = reinterpret_cast<FairGeoNode*>(mvdNodes->At(ist));
146 if (!mvdNode) {
147 cout << "-W- CbmKF::Init: station#" << ist << " not found among sensitive nodes " << endl;
148 continue;
149 }
150
151 CbmKFTube tube;
152 if (ReadTube(tube, mvdNode))
153 continue;
154 tube.ID = 1101 + ist;
155 vMvdMaterial.push_back(tube);
156 MvdStationIDMap.insert(pair<Int_t, Int_t>(tube.ID, ist));
157
158 if (fVerbose)
159 cout << " Mvd detector " << tube.Info() << endl;
160 }
161 }
162
163 CbmGeoStsPar* StsPar = reinterpret_cast<CbmGeoStsPar*>(RunDB->findContainer("CbmGeoStsPar"));
164
165 if (StsPar) { //=== Sts stations ===
166
167 if (fVerbose)
168 cout << "KALMAN FILTER : === READ STS MATERIAL ===" << endl;
169
170 // AZ int NStations = StsDigi.GetNStations();
172
173 for (Int_t ist = 0; ist < NStations; ist++) {
174 // AZ CbmStsStation *st = StsDigi.GetStation(ist);
175 CbmStsStation* st = StsDigi->GetStation(ist);
176 if (!st)
177 continue;
178
179 CbmKFTube tube;
180
181 tube.ID = 1000 + st->GetStationNr();
182 tube.F = 1.;
183 tube.z = st->GetZ();
184 tube.dz = st->GetD();
185 tube.RadLength = st->GetRadLength();
186 tube.r = st->GetRmin();
187 tube.R = st->GetRmax();
188 tube.rr = tube.r * tube.r;
189 tube.RR = tube.R * tube.R;
190 tube.ZThickness = tube.dz;
191 tube.ZReference = tube.z;
192
193 vStsMaterial.push_back(tube);
194 StsStationIDMap.insert(pair<Int_t, Int_t>(tube.ID, ist));
195
196 if (fVerbose)
197 cout << " Sts material ( id, z, dz, r, R, RadL )= ( " << tube.ID << ", " << tube.z << ", " << tube.dz
198 << ", " << tube.r << ", " << tube.R << ", " << tube.RadLength << " )" << endl;
199 }
200 }
201
202 //=== Stt stations ===
203
204 CbmGeoSttPar* sttPar = reinterpret_cast<CbmGeoSttPar*>(RunDB->findContainer("CbmGeoSttPar"));
205
206 if (sttPar) {
207
208 /*
209 if( fVerbose ) cout<<"KALMAN FILTER : === READ STT PASSIVE MATERIAL ==="<<endl;
210 if( fVerbose==1 ) cout<<"printout skipped for Verbose mode 1"<<endl;
211 TObjArray *Nodes = sttPar->GetGeoPassiveNodes();
212 for( Int_t i=0;i<Nodes->GetEntries(); i++) {
213 FairGeoNode *node = dynamic_cast<FairGeoNode*> (Nodes->At(i));
214 if ( !node ) continue;
215 TString name = node->getName();
216 CbmKFMaterial * kfmat = ReadPassive( node );
217 if( !kfmat ) continue;
218 if( fVerbose>=1 ) cout<<" Stt material "<<name<<" : "<<kfmat->Info()<<endl;
219 }
220 */
221
222 if (fVerbose)
223 cout << "KALMAN FILTER : === READ STT DETECTORS ===" << endl;
224
225 TObjArray* Nodes = sttPar->GetGeoSensitiveNodes();
226 // double zold = 0;
227 int ista = 0; //-1;
228 for (Int_t i = 0; i < Nodes->GetEntries(); ++i) {
229 FairGeoNode* node = dynamic_cast<FairGeoNode*>(Nodes->At(i));
230 if (!node)
231 continue;
232
233 TString name = node->getName();
234 if (name.Contains("C2gas"))
235 continue; // chamber #2 - skip it
236 CbmKFTube tube;
237 if (ReadTube(tube, node))
238 continue;
239 CbmKFWall wall;
240 wall.RadLength = tube.RadLength;
241 // wall.F = 1.015*1.1*1.0322;
242 Double_t dist = 1.;
243 if (name.Contains("stt1"))
244 wall.F = 7.552e-4 / 1.653e-4;
245 else {
246 wall.F = 8.378e-4 / 2.479e-4;
247 dist = 1.2;
248 }
249 wall.F = TMath::Sqrt(wall.F);
250 wall.ZThickness = tube.ZThickness;
251
252 for (Int_t lay = 0; lay < 6; ++lay) {
253 // Loop over layers
254 Int_t iii = lay % 2;
255 Int_t jjj = lay / 2;
256 wall.ZReference = tube.ZReference + iii * dist + jjj * 6.; // distance between layers
257 wall.ID = tube.ID + lay;
258
259 // Int_t jsta = ( TMath::Abs( wall.ZReference - zold ) <10. ) ?ista :ista+1;
260 // Int_t jsta = ( TMath::Abs( wall.ZReference - zold ) <1. ) ?ista :ista+1;
261
262 if (fVerbose)
263 cout << " Stt detector " << name << ": " << wall.Info() << ", station " << ista << endl;
264
265 // if( jsta==ista ) continue; // same station
266 // zold = wall.ZReference;
267 // SttStationIDMap.insert(pair<Int_t,Int_t>(ista+1, ista));
268 SttStationIDMap.insert(pair<Int_t, Int_t>(wall.ID, ista));
269 ista++;
270 vSttMaterial.push_back(wall);
271 }
272 }
273 }
274
275 //=== Tof material ===
276
277 // CbmGeoTofPar *TofPar = reinterpret_cast<CbmGeoTofPar*>(RunDB->findContainer("CbmGeoTofPar"));
278 BmnTOF1GeoPar* TofPar = reinterpret_cast<BmnTOF1GeoPar*>(RunDB->findContainer("BmnTOF1GeoPar"));
279
280 if (TofPar) {
281
282 if (fVerbose)
283 cout << "KALMAN FILTER : === READ TOF PASSIVE MATERIAL ===" << endl;
284 if (fVerbose == 1)
285 cout << "printout skipped for Verbose mode 1" << endl;
286 TObjArray* Nodes = TofPar->GetGeoPassiveNodes();
287 for (Int_t i = 0; i < Nodes->GetEntries(); i++) {
288 FairGeoNode* node = dynamic_cast<FairGeoNode*>(Nodes->At(i));
289 if (!node)
290 continue;
291 TString name = node->getName();
292 CbmKFMaterial* kfmat = ReadPassive(node);
293 if (!kfmat)
294 continue;
295 if (fVerbose > 1)
296 cout << " Tof material " << name << " : " << kfmat->Info() << endl;
297 }
298
299 if (fVerbose)
300 cout << "KALMAN FILTER : === READ TOF DETECTORS ===" << endl;
301
302 Nodes = TofPar->GetGeoSensitiveNodes(); // AZ
303 for (Int_t i = 0; i < Nodes->GetEntries(); i++) {
304 FairGeoNode* node = dynamic_cast<FairGeoNode*>(Nodes->At(i));
305 if (!node)
306 continue;
307 TString name = node->getName();
308 CbmKFMaterial* kfmat = ReadPassive(node);
309 if (!kfmat)
310 continue;
311 if (fVerbose > 1)
312 cout << " Tof material " << name << " : " << kfmat->Info() << endl;
313 }
314 }
315
316 // === Passive Material ===
317
318 FairGeoPassivePar* PassivePar = reinterpret_cast<FairGeoPassivePar*>(RunDB->findContainer("FairGeoPassivePar"));
319
320 if (PassivePar) {
321
322 TObjArray* Nodes = PassivePar->GetGeoPassiveNodes();
323 FairGeoNode* node = 0;
324
325 if (fVerbose)
326 cout << "KALMAN FILTER : === READ BEAM PIPE MATERIAL ===" << endl;
327
328 node = dynamic_cast<FairGeoNode*>(Nodes->FindObject("pipe1"));
329
330 if (node) {
331
332 TString name = node->getName();
333 TString Sname = node->getShapePointer()->GetName();
334
335 FairGeoVector nodeV(0, 0, 0);
336 if (node->getMotherNode())
337 nodeV = node->getLabTransform()->getTranslation(); // in cm
338 FairGeoVector centerV = node->getCenterPosition().getTranslation();
339 TArrayD* P = node->getParameters();
340 Int_t NP = node->getShapePointer()->getNumParam();
341 FairGeoMedium* material = node->getMedium();
342 material->calcRadiationLength();
343
344 Double_t z = nodeV.Z() + centerV.Z();
345
346 if (Sname == "PCON") {
347 Int_t Nz = (NP - 3) / 3;
348 for (Int_t i = 0; i < Nz - 1; i++) {
349 CbmKFCone cone;
350 cone.ID = node->getMCid();
351 cone.z1 = P->At(3 + i * 3 + 0) + z;
352 cone.r1 = P->At(3 + i * 3 + 1);
353 cone.R1 = P->At(3 + i * 3 + 2);
354 cone.z2 = P->At(3 + (i + 1) * 3 + 0) + z;
355 cone.r2 = P->At(3 + (i + 1) * 3 + 1);
356 cone.R2 = P->At(3 + (i + 1) * 3 + 2);
357 cone.RadLength = material->getRadiationLength();
358 cone.F = 1.0322;
359 cone.ZReference = (cone.z1 + cone.z2) / 2;
360 cone.ZThickness = 0;
361
362 if (i <= 3)
363 vPipe.push_back(cone);
364
365 if (fVerbose)
366 cout << " Pipe material ( id, {z1, r1, R1}, {z2, r2, R2}, RL )= ( " << node->getMCid() << ", {"
367 << cone.z1 << ", " << cone.r1 << ", " << cone.R1 << "}, {" << cone.z2 << ", " << cone.r2
368 << ", " << cone.R2 << "}, " << cone.RadLength << " )" << endl;
369 }
370 } else {
371 cout << " unknown pipe shape : " << Sname << endl;
372 }
373 }
374
375 if (fVerbose)
376 cout << "KALMAN FILTER : === READ TARGET MATERIAL ===" << endl;
377 // Nodes=gGeoManager->GetTopVolume()->GetNodes(); //GP
378
379 TGeoVolume* trg = nullptr; // AZ-171023
380 if (gGeoManager != nullptr)
381 trg = gGeoManager->GetVolume("targ"); // AZ-171023
382 // node->setRootVolume(trg); //why can't use "classical root geometry ?"
383 // node = dynamic_cast<FairGeoNode*> (trg);
384
385 if (!trg) {
386 // AZ-170722 CbmKFTube tube1( 100500, 0,0,0/*-21.9*/, 2.*0.25, 0, 0.5, 0.5 ); //hard-coded target with Pb
387 // rad. lenght, -23.4 z pos. CbmKFTube tube1( 100500, 0,0,0/*-21.9*/, 2.*0.25, 0, 0.5, 30420. ); //AZ-170722
388 // - hard-coded target with Air rad. length, 0.0 z pos. CbmKFTube tube1( 100500, 0.375, -0.006, 0.175/2,
389 // 0.175, 0, 1.6, 1.85 ); //AZ-171023 - hard-coded CsI target
390 CbmKFTube tube1(100500, 0.375, -0.006, 0.175 / 2, 0.175, 0, 1.6,
391 30420.0); // AZ-171023 - hard-coded air target
392 vTargets.push_back(tube1);
393 if (fVerbose)
394 cout << " Target material " << tube1.Info() << endl;
395 } else {
396 // AZ-171023 Read tube from ROOT geometry
397 CbmKFTube tube;
398 if (!ReadTube(tube, trg)) {
399 vTargets.push_back(tube);
400 if (fVerbose)
401 cout << " Target material " << tube.Info() << endl;
402 cout << " Target material " << tube.Info() << endl;
403 }
404 }
405 /*AZ-171023
406 node = dynamic_cast<FairGeoNode*> (Nodes->FindObject("targ_0")); // classes can't be cast
407 //cout<<" node: "<<node<<endl;
408 if( node ){
409 CbmKFTube tube;
410 if( !ReadTube( tube, node) ){
411 vTargets.push_back( tube );
412 if( fVerbose ) cout<<" Target material "<<tube.Info()<<endl;
413 }
414 }
415 */
416 }
417
418 {
419 for (vector<CbmKFCone>::iterator i = vPipe.begin(); i != vPipe.end(); ++i) {
420 vMaterial.push_back(&*i);
421 }
422
423 for (vector<CbmKFTube>::iterator i = vTargets.begin(); i != vTargets.end(); ++i) {
424 vMaterial.push_back(&*i);
425 }
426
427 for (vector<CbmKFTube>::iterator i = vMvdMaterial.begin(); i != vMvdMaterial.end(); ++i) {
428 vMaterial.push_back(&*i);
429 }
430
431 for (vector<CbmKFTube>::iterator i = vStsMaterial.begin(); i != vStsMaterial.end(); ++i) {
432 vMaterial.push_back(&*i);
433 }
434
435 for (vector<CbmKFWall>::iterator i = vSttMaterial.begin(); i != vSttMaterial.end(); ++i) {
436 vMaterial.push_back(&*i);
437 }
438
439 for (vector<CbmKFTube>::iterator i = vPassiveTube.begin(); i != vPassiveTube.end(); ++i) {
440 vMaterial.push_back(&*i);
441 }
442 for (vector<CbmKFWall>::iterator i = vPassiveWall.begin(); i != vPassiveWall.end(); ++i) {
443 vMaterial.push_back(&*i);
444 }
445 for (vector<CbmKFBox>::iterator i = vPassiveBox.begin(); i != vPassiveBox.end(); ++i) {
446 vMaterial.push_back(&*i);
447 }
448
449 sort(vMaterial.begin(), vMaterial.end(), CbmKFMaterial::comparePDown);
450 for (unsigned i = 0; i < vMaterial.size(); i++) {
451 fMaterialID2IndexMap.insert(pair<Int_t, Int_t>(vMaterial[i]->ID, i));
452 if (fVerbose)
453 cout << " KF TOTAL MATIREAL: " << vMaterial[i]->ID << endl;
454 }
455 }
456 return kSUCCESS;
457}
458
460{
461 map<Int_t, Int_t>::iterator i = fMaterialID2IndexMap.find(uid);
462 if (i != fMaterialID2IndexMap.end()) {
463 return i->second;
464 }
465 return -1;
466}
467
468//__________________________________________________________________________
469
470Int_t CbmKF::ReadTube(CbmKFTube& tube, TGeoVolume* vol)
471{
472 // AZ-171023 Read tube parameters from ROOT geometry - tested only for the target !!!
473
474 if (!vol)
475 return 1;
476
477 // Go to cave
478 TGeoNode* cave = gGeoManager->FindNode(1000, 1000, 1000);
479 if (TString(cave->GetName()) != "cave_1")
480 return 1;
481
482 int nd = cave->GetNdaughters(), ok = 0;
483
484 for (int i = 0; i < nd; ++i) {
485 TGeoNode* dnode = cave->GetDaughter(i);
486 if (TString(dnode->GetName()) != "targ_0")
487 continue;
488 ok = 1;
489 const Double_t* shift = dnode->GetMatrix()->GetTranslation();
490 tube.x = shift[0];
491 tube.y = shift[1];
492 tube.z = shift[2];
493 }
494 if (!ok)
495 return 1;
496
497 Double_t radLeng = vol->GetMedium()->GetMaterial()->GetRadLen();
498 tube.ID = 100500;
499 tube.RadLength = radLeng;
500 tube.F = 1.;
501 tube.Fe = 0.02145;
502
503 TGeoTube* tu = (TGeoTube*)vol->GetShape();
504 tube.r = tu->GetRmin();
505 tube.R = tu->GetRmax();
506 tube.dz = 2. * tu->GetDz();
507
508 tube.rr = tube.r * tube.r;
509 tube.RR = tube.R * tube.R;
510 tube.ZThickness = tube.dz;
511 tube.ZReference = tube.z;
512 return 0;
513}
514
515//__________________________________________________________________________
516
517Int_t CbmKF::ReadTube(CbmKFTube& tube, FairGeoNode* node)
518{
519
520 if (!node)
521 return 1;
522
523 TString name = node->getName();
524 TString Sname = node->getShapePointer()->GetName();
525 FairGeoVector nodeV = node->getLabTransform()->getTranslation(); // in cm
526 FairGeoVector centerV = node->getCenterPosition().getTranslation();
527 TArrayD* P = node->getParameters();
528 Int_t NP = node->getShapePointer()->getNumParam();
529 FairGeoMedium* material = node->getMedium();
530 material->calcRadiationLength();
531
532 tube.ID = node->getMCid();
533 tube.RadLength = material->getRadiationLength();
534 tube.F = 1.;
535
536 tube.Fe = 0.02145;
537 TString Mname = material->GetName();
538 if (Mname == "MUCHWolfram") {
539 tube.Fe = 0.009029;
540 } else if (Mname == "MUCHiron") {
541 tube.Fe = 0.02219;
542 } else if (Mname == "carbon") {
543 tube.Fe = 0.08043;
544 }
545
546 tube.x = nodeV.X() + centerV.X();
547 tube.y = nodeV.Y() + centerV.Y();
548 tube.z = nodeV.Z() + centerV.Z();
549 /*
550 int np = node->getNumPoints();
551 cout<<"points:"<<endl;
552 for( int i=0; i<np; i++ ){
553 FairGeoVector *v = node->getPoint(i);
554 cout<<v->X()<<" "<<v->Y()<<" "<<v->Z()<<endl;
555 }
556 */
557 if (Sname == "TUBS" || Sname == "TUBE") {
558 tube.r = P->At(0);
559 tube.R = P->At(1);
560 tube.dz = 2. * P->At(2);
561 } else if (Sname == "TRAP") {
562 tube.r = 0;
563 tube.R = 1000;
564 tube.dz = 2. * P->At(0);
565 } else if (Sname == "SPHE") {
566 tube.r = 0;
567 tube.R = 1000;
568 tube.z += 0.5 * (P->At(0) + P->At(1)); // inner & outer radius
569 tube.dz = (P->At(1) - P->At(0));
570 } else if (Sname == "PCON") {
571 Int_t Nz = (NP - 3) / 3;
572 double Z = -100000, R = -100000, z = 100000, r = 100000;
573 for (Int_t i = 0; i < Nz; i++) {
574 double z1 = P->At(3 + i * 3 + 0);
575 double r1 = P->At(3 + i * 3 + 1);
576 double R1 = P->At(3 + i * 3 + 2);
577 if (r1 < r)
578 r = r1;
579 if (R1 > R)
580 R = R1;
581 if (z1 < z)
582 z = z1;
583 if (z1 > Z)
584 Z = z1;
585 }
586
587 tube.r = r;
588 tube.R = R;
589 tube.z += (z + Z) / 2.;
590 tube.dz = (Z - z);
591 } else if (Sname == "PGON") {
592 Int_t Nz = (NP - 4) / 3;
593 double Z = -100000, R = -100000, z = 100000, r = 100000;
594 for (Int_t i = 0; i < Nz; i++) {
595 double z1 = P->At(4 + i * 3 + 0);
596 double r1 = P->At(4 + i * 3 + 1);
597 double R1 = P->At(4 + i * 3 + 2);
598 if (r1 < r)
599 r = r1;
600 if (R1 > R)
601 R = R1;
602 if (z1 < z)
603 z = z1;
604 if (z1 > Z)
605 Z = z1;
606 }
607 tube.r = r;
608 tube.R = R;
609 tube.z += (z + Z) / 2.;
610 tube.dz = (Z - z);
611 } else if (Sname == "BOX ") {
612 double dx = 2 * P->At(0);
613 double dy = 2 * P->At(1);
614 double dz = 2 * P->At(2);
615 tube.r = 0;
616 tube.R = TMath::Sqrt(dx * dx + dy * dy);
617 tube.dz = dz;
618 } else {
619 cout << " -E- unknown shape : " << Sname << endl;
620 cout << " -E- It does not make sense to go on" << endl;
621 cout << " -E- Stop execution here" << endl;
622 Fatal("CbmKF::ReadTube", "Unknown Shape");
623 }
624 tube.rr = tube.r * tube.r;
625 tube.RR = tube.R * tube.R;
626 tube.ZThickness = tube.dz;
627 tube.ZReference = tube.z;
628 return 0;
629}
630
631CbmKFMaterial* CbmKF::ReadPassive(FairGeoNode* node)
632{
633
634 if (!node)
635 return 0;
636
637 TString name = node->getName();
638 TString Sname = node->getShapePointer()->GetName();
639
640 FairGeoTransform trans(*node->getLabTransform());
641 FairGeoNode* nxt = node;
642 while ((nxt = nxt->getMotherNode())) {
643 FairGeoTransform* tm = nxt->getLabTransform();
644 if (!tm)
645 break;
646 trans.transFrom(*tm);
647 }
648
649 // FairGeoVector nodeV = node->getLabTransform()->getTranslation(); //in cm
650 // FairGeoVector centerV = node->getCenterPosition().getTranslation();
651
652 FairGeoVector nodeV = trans.getTranslation(); // in cm
653 FairGeoVector centerV = nodeV + node->getCenterPosition().getTranslation();
654
655 TArrayD* P = node->getParameters();
656 Int_t NP = node->getShapePointer()->getNumParam();
657 FairGeoMedium* material = node->getMedium();
658 material->calcRadiationLength();
659
660 Int_t ID = node->getMCid();
661 Double_t RadLength = material->getRadiationLength();
662 // Double_t F = 1.;
663 Double_t x0 = centerV.X();
664 Double_t y0 = centerV.Y();
665 Double_t z0 = centerV.Z();
666
667 CbmKFMaterial* ret = 0;
668
669 if (Sname == "TUBS" || Sname == "TUBE") {
670 CbmKFTube tube(ID, x0, y0, z0, 2. * P->At(2), P->At(0), P->At(1), RadLength);
671 vPassiveTube.push_back(tube);
672 ret = &(vPassiveTube.back());
673 } else if (Sname == "SPHE") {
674 CbmKFTube tube(ID, x0, y0, z0 + 0.5 * (P->At(0) + P->At(1)), (P->At(1) - P->At(0)), 0, 1000, RadLength);
675 vPassiveTube.push_back(tube);
676 ret = &(vPassiveTube.back());
677 } else if (Sname == "PCON") {
678 Int_t Nz = (NP - 3) / 3;
679 double Z = -100000, R = -100000, z = 100000, r = 100000;
680 for (Int_t i = 0; i < Nz; i++) {
681 double z1 = P->At(3 + i * 3 + 0);
682 double r1 = P->At(3 + i * 3 + 1);
683 double R1 = P->At(3 + i * 3 + 2);
684 if (r1 < r)
685 r = r1;
686 if (R1 > R)
687 R = R1;
688 if (z1 < z)
689 z = z1;
690 if (z1 > Z)
691 Z = z1;
692 }
693 CbmKFTube tube(ID, x0, y0, z0 + 0.5 * (z + Z), (Z - z), r, R, RadLength);
694 vPassiveTube.push_back(tube);
695 ret = &(vPassiveTube.back());
696 } else if (Sname == "PGON") {
697 Int_t Nz = (NP - 4) / 3;
698 double Z = -100000, R = -100000, z = 100000, r = 100000;
699 for (Int_t i = 0; i < Nz; i++) {
700 double z1 = P->At(4 + i * 3 + 0);
701 double r1 = P->At(4 + i * 3 + 1);
702 double R1 = P->At(4 + i * 3 + 2);
703 if (r1 < r)
704 r = r1;
705 if (R1 > R)
706 R = R1;
707 if (z1 < z)
708 z = z1;
709 if (z1 > Z)
710 Z = z1;
711 }
712 CbmKFTube tube(ID, x0, y0, z0 + 0.5 * (z + Z), (Z - z), r, R, RadLength);
713 vPassiveTube.push_back(tube);
714 ret = &(vPassiveTube.back());
715 } else if (Sname == "BOX ") {
716 CbmKFBox box(ID, x0, y0, z0, 2 * P->At(0), 2 * P->At(1), 2 * P->At(2), RadLength);
717 vPassiveBox.push_back(box);
718 ret = &(vPassiveBox.back());
719 } else if (Sname == "TRAP") {
720 int np = node->getNumPoints();
721 FairGeoVector vMin = *node->getPoint(0), vMax = vMin;
722 for (int i = 0; i < np; i++) {
723 FairGeoVector* v = node->getPoint(i);
724 for (int j = 0; j < 3; j++) {
725 if (vMin(j) > (*v)(j))
726 (&vMin.X())[j] = (*v)(j);
727 if (vMax(j) < (*v)(j))
728 (&vMax.X())[j] = (*v)(j);
729 }
730 }
731 FairGeoVector v0 = (vMin + vMax);
732 v0 *= .5 / 10.;
733 FairGeoVector dv = vMax - vMin;
734 dv /= 10.;
735 CbmKFBox box(ID, x0 + v0(0), y0 + v0(1), z0 + v0(2), dv(0), dv(1), dv(2), RadLength);
736 vPassiveBox.push_back(box);
737 ret = &(vPassiveBox.back());
738 } else {
739 cout << " -E- unknown shape : " << Sname << endl;
740 cout << " -E- It does not make sense to go on" << endl;
741 cout << " -E- Stop execution here" << endl;
742 Fatal("CbmKF::ReadPassive", "Unknown Shape");
743 }
744 return ret;
745}
746
747Int_t CbmKF::Propagate(Double_t* T, Double_t* C, Double_t z_out, Double_t QP0, Bool_t line)
748{
749
750 if (line)
751 fMethod = 0;
752 else
753 fMethod = 2;
754
755 Bool_t err = 0;
756 if (fabs(T[5] - z_out) < 1.e-5)
757 return 0;
758
759 // AZ
760 Double_t zmax = 0.0;
761 BmnNewFieldMap* field = nullptr;
762 if (fMagneticField) {
763 field = (BmnNewFieldMap*)fMagneticField; // GP
764 zmax = field->GetZmax() + field->GetPositionZ();
765 // cout <<"asdassd: " << field->GetZmax() << " " << field->GetPositionZ() << " " << zmax << endl;
766 }
767 // AZ
768 // cout<<"extrap1: "<<z_out<<endl;
769 // AZ if ( !fMagneticField || (300<=z_out && 300<=T[5]) )
770 // AZ-251123 if ( !fMagneticField || z_out>400 )//(zmax<=z_out ))// && zmax<=T[5]) )
771 if (!fMagneticField || z_out > 500) //(zmax<=z_out ))// && zmax<=T[5]) ) //AZ-251123
772 {
773 // cout<<"extrap2: "<<z_out<<endl;
774 // CbmKFFieldMath::ExtrapolateLine( T, C, T, C, z_out );
775 CbmKFFieldMath::ExtrapolateALight(T, C, T, C, z_out, QP0, field); // fMagneticField );
776 return 0;
777 }
778 Double_t zz = z_out;
779 // AZ if ( z_out<300. && 300<=T[5] ) CbmKFFieldMath::ExtrapolateLine( T, C, T, C, 300. );
780 if (z_out < zmax && zmax <= T[5])
781 CbmKFFieldMath::ExtrapolateLine(T, C, T, C, zmax);
782
783 // AZ if ( T[5]<300. && 300.<z_out )
784 if (T[5] < zmax && zmax < z_out) {
785 // AZ zz = 300.;
786 zz = zmax;
787 }
788 Bool_t repeat = 1;
789 while (!err && repeat) {
790 const Double_t max_step = 5.;
791 Double_t zzz;
792 if (fabs(T[5] - zz) > max_step)
793 zzz = T[5] + ((zz > T[5]) ? max_step : -max_step);
794 else {
795 zzz = zz;
796 repeat = 0;
797 }
798 switch (fMethod) {
799 case 0: {
800 CbmKFFieldMath::ExtrapolateLine(T, C, T, C, zzz);
801 break;
802 }
803 case 1: {
804 err = err || CbmKFFieldMath::ExtrapolateALight(T, C, T, C, zzz, QP0, field);
805 break;
806 }
807 case 2: {
808 err = err || CbmKFFieldMath::ExtrapolateRK4(T, C, T, C, zzz, QP0, field);
809 break;
810 }
811 /*
812 case 3:
813 {
814 CbmKFFieldMath::ExtrapolateACentral( T, C, T, C, zzz , QP0, fMagneticField );
815 break;
816 }
817 case 4:
818 {
819 CbmKFFieldMath::ExtrapolateAnalytic( T, C, T, C, zzz , QP0, fMagneticField, 1 );
820 break;
821 }
822 case 5:
823 {
824 CbmKFFieldMath::ExtrapolateAnalytic( T, C, T, C, zzz , QP0, fMagneticField, 2 );
825 break;
826 }
827 case 6:
828 {
829 CbmKFFieldMath::ExtrapolateAnalytic( T, C, T, C, zzz , QP0, fMagneticField, 3 );
830 break;
831 }
832 */
833 }
834 }
835 if (T[5] != z_out)
836 CbmKFFieldMath::ExtrapolateLine(T, C, T, C, z_out);
837 return err;
838}
839
840Int_t CbmKF::PassMaterial(CbmKFTrackInterface& track, Double_t& QP0, Int_t ifst, Int_t ilst)
841{
842 Bool_t downstream = (ilst > ifst);
843 Bool_t err = 0;
844 Int_t iend = downstream ? ilst + 1 : ilst - 1;
845 for (Int_t i = ifst; i != iend; downstream ? ++i : --i) {
846 err = err || vMaterial[i]->Pass(track, downstream, QP0);
847 }
848 return err;
849}
850
851Int_t CbmKF::PassMaterialBetween(CbmKFTrackInterface& track, Double_t& QP0, Int_t ifst, Int_t ilst)
852{
853 Bool_t downstream = (ilst > ifst);
854 Bool_t err = 0;
855 Int_t istart = downstream ? ifst + 1 : ifst - 1;
856 for (Int_t i = istart; i != ilst; downstream ? ++i : --i) {
857 err = err || vMaterial[i]->Pass(track, downstream, QP0);
858 }
859 return err;
860}
861
862Int_t CbmKF::PassMaterialBetween(CbmKFTrackInterface& track, Double_t& QP0, CbmKFHit* fst, CbmKFHit* lst)
863{
864 return PassMaterialBetween(track, QP0, fst->MaterialIndex, lst->MaterialIndex);
865}
vector< Double_t > dist(vector< Double_t > qp, Double_t mu)
Definition BmnMath.cxx:869
const Float_t z0
Definition BmnMwpcHit.cxx:6
const int NStations
Definition L1AlgoPulls.h:9
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
__m128 v
Definition P4_F32vec4.h:1
int i
Definition P4_F32vec4.h:22
Double_t GetPositionZ() const
Definition BmnFieldMap.h:87
Double_t GetZmax() const
Definition BmnFieldMap.h:74
TObjArray * GetGeoSensitiveNodes()
TObjArray * GetGeoPassiveNodes()
BmnTask.
Definition BmnTask.h:13
TObjArray * GetGeoSensitiveNodes()
Double_t R2
Double_t z2
Double_t R1
Double_t r1
Double_t r2
Double_t z1
static Int_t ExtrapolateRK4(const Double_t T_in[], const Double_t C_in[], Double_t T_out[], Double_t C_out[], Double_t z_out, Double_t qp0, FairField *MF)
static void ExtrapolateLine(const Double_t T_in[], const Double_t C_in[], Double_t T_out[], Double_t C_out[], Double_t z_out)
static Int_t ExtrapolateALight(const Double_t T_in[], const Double_t C_in[], Double_t T_out[], Double_t C_out[], Double_t z_out, Double_t qp0, FairField *MF)
Int_t MaterialIndex
Definition CbmKFHit.h:23
Double_t ZReference
virtual TString Info() const
Double_t RadLength
static Bool_t comparePDown(const CbmKFMaterial *a, const CbmKFMaterial *b)
Double_t ZThickness
Double_t R
Double_t rr
Double_t RR
Double_t x
TString Info() const
Double_t r
Double_t dz
Double_t y
Double_t z
Definition CbmKF.h:28
Int_t Propagate(Double_t *T, Double_t *C, Double_t z_out, Double_t QP0, Bool_t line=false)
Definition CbmKF.cxx:747
std::vector< CbmKFTube > vPassiveTube
Definition CbmKF.h:66
std::vector< CbmKFMaterial * > vMaterial
Definition CbmKF.h:58
std::map< Int_t, Int_t > MvdStationIDMap
Definition CbmKF.h:75
Int_t PassMaterialBetween(CbmKFTrackInterface &track, Double_t &QP0, Int_t ifst, Int_t ilst)
Definition CbmKF.cxx:851
void SetParContainers()
Definition CbmKF.cxx:62
std::vector< CbmKFWall > vPassiveWall
Definition CbmKF.h:67
std::vector< CbmKFWall > vSttMaterial
Definition CbmKF.h:62
std::vector< CbmKFTube > vTargets
Definition CbmKF.h:63
std::vector< CbmKFCone > vPipe
Definition CbmKF.h:64
std::map< Int_t, Int_t > StsStationIDMap
Definition CbmKF.h:76
std::map< Int_t, Int_t > SttStationIDMap
Definition CbmKF.h:77
Int_t GetMaterialIndex(Int_t uid)
Definition CbmKF.cxx:459
std::vector< CbmKFBox > vPassiveBox
Definition CbmKF.h:68
~CbmKF()
Definition CbmKF.cxx:57
std::vector< CbmKFTube > vStsMaterial
Definition CbmKF.h:61
CbmKF(const char *name="KF", Int_t iVerbose=1)
Definition CbmKF.cxx:25
CbmStsDigiScheme * StsDigi
Definition CbmKF.h:84
Int_t PassMaterial(CbmKFTrackInterface &track, Double_t &QP0, Int_t ifst, Int_t ilst)
Definition CbmKF.cxx:840
std::vector< CbmKFTube > vMvdMaterial
Definition CbmKF.h:60
InitStatus Init()
Definition CbmKF.cxx:85
InitStatus ReInit()
Definition CbmKF.cxx:78
TObjArray * GetGeoSensitiveNodes()
static CbmStsDigiScheme * Instance(int version=1)
CbmStsStation * GetStation(Int_t iStation)
Double_t GetRadLength() const
Double_t GetD() const
Double_t GetRmin() const
Double_t GetZ(Int_t it=0)
Double_t GetRmax() const
Int_t GetStationNr() const
TObjArray * GetGeoPassiveNodes()
name
Definition setup.py:7
STL namespace.