14 #include "FairRootManager.h"
16 #include "FairRunAna.h"
17 #include "FairRuntimeDb.h"
18 #include "FairTrackParH.h"
22 #include "TClonesArray.h"
23 #include "TGeoManager.h"
24 #include "TGeoVolume.h"
26 #include "TGeoMatrix.h"
49 cout <<
"-I- PndMdtTrkProducer::Init: "
50 <<
"INITIALIZATION *********************" << endl;
56 FairRootManager* ioman = FairRootManager::Instance();
58 cout <<
"-E- PndMdtTrkProducer::Init: "
59 <<
"RootManager not instantiated!" << endl;
63 fHitArray = (TClonesArray*) ioman->GetObject(
"MdtHit");
65 cout <<
"-W- PndMdtTrkProducer::Init: "
66 <<
"No MdtHit array!" << endl;
72 fLheGenTrack = (TClonesArray*) ioman->GetObject(
"LheGenTrack");
74 cout <<
"-W- PndMdtTrkProducer::Init: "
75 <<
"No LheGenTrack array!" << endl;
81 fTrkArray =
new TClonesArray(
"PndMdtTrk");
87 cout <<
"-I- PndMdtTrkProducer: Intialization successfull" << endl;
98 FairRun*
run = FairRun::Instance();
99 if ( ! run ) Fatal(
"PndMdtTrkProducer:: SetParContainers",
"No analysis run");
101 FairRuntimeDb* db = run->GetRuntimeDb();
102 if ( ! db ) Fatal(
"PndMdtTrkProducer:: SetParContainers",
"No runtime database");
112 for (Int_t
mm=0;
mm<3;
mm++)
113 for (Int_t ll=0; ll<20;ll++)
132 if (
gGeoManager->FindVolumeFast(
"MdtBarrelLayer00")) version = 1;
133 if (
gGeoManager->FindVolumeFast(
"MdtBarrelOct0")) version = 2;
136 cout <<
"PndMdtTrkProducer::SetGeometry : Warning - No MDT Barrel Geometry" << endl;
140 for (Int_t ll=0; ll<15; ll++)
143 Int_t sec = 0, box = 0;
144 sprintf(buffer,
"MDT%is%il%ib%iw%i", 1, sec, ll, box, 0);
151 sprintf(buffer,
"MDT%is%il%ib%iw%i", 1, sec, ll, box, 0);
153 sprintf(lbuffer,
"cave_1/Mdt_1/MdtBarrel_1/MdtBarrelLayer0%i_1/%s_%i",ll,buffer,8*ll);
155 sprintf(lbuffer,
"cave_1/Mdt_1/MdtBarrel_1/MdtBarrelLayer%i_1/%s_%i",ll,buffer,8*ll);
160 sprintf(buffer,
"MDT%is%il%ib%iw%i", 1, sec, ll, box, 0);
162 sprintf(lbuffer,
"cave_1/MdtBarrel_0/MdtBarrelOct%i_%i/MdtBarrelOct%iLayer0%i_0/BP1%i%i%i0_%i/BA1%i%i%i0_%i/%s_0",sec,sec,sec,ll,sec,ll,box,box,sec,ll,box,box,buffer);
164 sprintf(lbuffer,
"cave_1/MdtBarrel_0/MdtBarrelOct%i_%i/MdtBarrelOct%iLayer%i_0/BP1%i%i%i0_%i/BA1%i%i%i0_%i/%s_0",sec,sec,sec,ll,sec,ll,box,box,sec,ll,box,box,buffer);
176 const Double_t *origin = ((TGeoBBox*)
gGeoManager->GetCurrentVolume()->GetShape())->GetOrigin();
177 if (version==1) local[1] = ((TGeoBBox*)
gGeoManager->GetCurrentVolume()->GetShape())->GetDY()+origin[1];
178 if (version==2) local[2] = ((TGeoBBox*)
gGeoManager->GetCurrentVolume()->GetShape())->GetDZ()+origin[2];
184 if (
fVerbose>1) cout <<
"mdtLayerPos[0][" << ll <<
"] = " <<
mdtLayerPos[0][ll] <<
";" << endl;
192 if (
gGeoManager->FindVolumeFast(
"BP20000")) version = 2;
193 for (Int_t ll=0; ll<10; ll++)
196 sprintf(buffer,
"MDT%is%il%ib%iw%i", 2, 0, ll, 0, 0);
202 sprintf(lbuffer,
"cave_1/Mdt_1/MdtEndcap_1/MdtEndcapLayer0%i_1/%s_%i",ll,buffer,200+8*ll);
206 sprintf(lbuffer,
"cave_1/MdtEndcap_0/MdtEndcapLayer0%i_0/BP20%i00_0/BA20%i00_0/%s_0",ll,ll,ll,buffer);
214 if (
fVerbose>1) cout <<
"mdtLayerPos[1][" << ll <<
"] = " <<
mdtLayerPos[1][ll] <<
";" << endl;
222 if (
gGeoManager->FindVolumeFast(
"MF")) version = 2;
223 for (Int_t ll=0; ll<10; ll++)
226 sprintf(buffer,
"MDT%is%il%ib%iw%i", 3, 0, ll, 0, 0);
232 sprintf(lbuffer,
"cave_1/Mdt_1/MdtMuonFilter_1/MdtMuonFilterLayer0%i_1/%s_%i",ll,buffer,300+8*ll);
236 sprintf(lbuffer,
"cave_1/MF_0/MdtMFLayer0%i_0/BP30%i00_0/BA30%i00_0/%s_0",ll,ll,ll,buffer);
244 if (
fVerbose>1) cout <<
"mdtLayerPos[1][" << ll+ec_laymax <<
"] = " <<
mdtLayerPos[1][ll+ec_laymax] <<
";" << endl;
253 for (Int_t ll=0; ll<17; ll++)
256 sprintf(buffer,
"MDT%is%il%ib%iw%i", 4, 0, ll, 0, 0);
262 sprintf(lbuffer,
"cave_1/Mdt_1/MdtForward_1/%s_%i",buffer,ll);
267 sprintf(lbuffer,
"cave_1/Forward_0/MdtForwardLayer0%i_0/BP40%i00_%i/BA40%i00_0/%s_0",ll,ll,ll,ll,buffer);
269 sprintf(lbuffer,
"cave_1/Forward_0/MdtForwardLayer%i_0/BP40%i00_%i/BA40%i00_0/%s_0",ll,ll,ll,ll,buffer);
278 if (
fVerbose>1) cout <<
"mdtLayerPos[2][" << ll <<
"] = " <<
mdtLayerPos[2][ll] <<
";" << endl;
293 TVector3 direction(1., 0., 0.);
294 Float_t deltaAngle = -1.;
299 TVector3 oldPos(0., 0., 0.);
300 TVector3 newPos(0., 0., 0.);
301 for (
size_t iMap = 0; iMap < vecMdt0.size(); iMap++)
303 Int_t layerCount = 1, maxLayer = 0;
304 Float_t layerDist = 0.; Float_t ironDist = 0.;
307 map<Int_t, TVector3>::const_iterator hit_direction_iter;
308 map<Int_t, Float_t>::const_iterator hit_distance_iter;
316 direction = (*hit_direction_iter).second;
317 Float_t dist_layer0_lhetrack = (*hit_distance_iter).second;
324 mdtHit0->Position(oldPos);
331 map<Int_t, vector<Int_t> >::const_iterator layer_iter;
334 if (((*layer_iter).first)==0)
continue;
335 if (((*layer_iter).first-maxLayer) > 1)
break;
337 vector<Int_t>vecMdt = (*layer_iter).second;
338 Float_t corrDist = -1;
340 TVector3 corrPos(0., 0., 0.);
342 for (
size_t hit_iter = 0; hit_iter < vecMdt.size(); ++hit_iter)
345 mdtHit->Position(newPos);
346 Float_t hitDist = (oldPos-newPos).Mag2();
347 deltaAngle = direction.Angle(newPos-oldPos);
348 direction = newPos-oldPos;
349 if ( (corrDist<0.) || (corrDist > hitDist) )
352 corrId = vecMdt[hit_iter];
355 if ( (hitDist>0.) && ((
TMath::Sqrt(hitDist)/layerDist) < 2.5) ) layerMult++;
358 if ( (corrDist>0.) && ((
TMath::Sqrt(corrDist)/layerDist) < 2.5) )
366 maxLayer = (*layer_iter).first;
376 map<Int_t, vector<Int_t> >::const_iterator layer2_iter;
379 if (((*layer2_iter).first)==0)
continue;
380 if (((*layer2_iter).first)==1)
386 if (((*layer2_iter).first-maxLayer) > 1)
break;
389 vector<Int_t>vecMdt = (*layer2_iter).second;
390 Float_t corrDist = -1;
392 TVector3 corrPos(0., 0., 0.);
394 for (
size_t hit_iter = 0; hit_iter < vecMdt.size(); ++hit_iter)
397 mdtHit->Position(newPos);
398 Float_t hitDist = (oldPos-newPos).Mag2();
399 deltaAngle = direction.Angle(newPos-oldPos);
400 direction = newPos-oldPos;
401 if ( (corrDist<0.) || (corrDist > hitDist) )
404 corrId = vecMdt[hit_iter];
407 if ( (hitDist>0.) && ((
TMath::Sqrt(hitDist)/layerDist) < 2.5)) layerMult++;
410 if ( (corrDist>0.) && ((
TMath::Sqrt(corrDist)/layerDist) < 2.5))
420 maxLayer = (*layer2_iter).first;
437 TVector3 oldPos(0., 0., 0.);
438 TVector3 newPos(0., 0., 0.);
440 for (
size_t iMap = 0; iMap < vecMdt0.size(); iMap++)
442 Int_t layerCount = 1, maxLayer = 0;
443 Float_t layerDist = 0., ironDist = 0.;
446 map<Int_t, TVector3>::const_iterator hit_direction_iter;
447 map<Int_t, Float_t>::const_iterator hit_distance_iter;
455 direction = (*hit_direction_iter).second;
456 Float_t dist_layer0_lhetrack = (*hit_distance_iter).second;
463 mdtHit0->Position(oldPos);
470 map<Int_t, vector<Int_t> >::const_iterator layer_iter;
473 if (((*layer_iter).first)==0)
continue;
474 if (((*layer_iter).first-maxLayer) > 1)
break;
476 vector<Int_t>vecMdt = (*layer_iter).second;
477 Float_t corrDist = -1;
479 TVector3 corrPos(0., 0., 0.);
481 for (
size_t hit_iter = 0; hit_iter < vecMdt.size(); ++hit_iter)
484 mdtHit->Position(newPos);
485 Float_t hitDist = (oldPos-newPos).Mag2();
486 deltaAngle = direction.Angle(newPos-oldPos);
487 direction = newPos-oldPos;
488 if ( (corrDist<0.) || (corrDist > hitDist) )
491 corrId = vecMdt[hit_iter];
494 if ( (hitDist>0.) && ((
TMath::Sqrt(hitDist)/layerDist) < 2.5) ) layerMult++;
497 if ( (corrDist>0.) && ((
TMath::Sqrt(corrDist)/layerDist) < 2.5) )
506 maxLayer = (*layer_iter).first;
523 TVector3 oldPos(0., 0., 0.);
524 TVector3 newPos(0., 0., 0.);
526 for (
size_t iMap = 0; iMap < vecMdt0.size(); iMap++)
528 Int_t layerCount = 1, maxLayer = 0;
529 Float_t layerDist = 0;
532 map<Int_t, TVector3>::const_iterator hit_direction_iter;
533 map<Int_t, Float_t>::const_iterator hit_distance_iter;
541 direction = (*hit_direction_iter).second;
542 Float_t dist_layer0_lhetrack = (*hit_distance_iter).second;
549 mdtHit0->Position(oldPos);
556 map<Int_t, vector<Int_t> >::const_iterator layer_iter;
559 if (((*layer_iter).first)==0)
continue;
560 if (((*layer_iter).first-maxLayer) > 1)
break;
562 vector<Int_t>vecMdt = (*layer_iter).second;
563 Float_t corrDist = -1;
565 TVector3 corrPos(0., 0., 0.);
567 for (
size_t hit_iter = 0; hit_iter < vecMdt.size(); ++hit_iter)
570 mdtHit->Position(newPos);
571 Float_t hitDist = (oldPos-newPos).Mag2();
572 deltaAngle = direction.Angle(newPos-oldPos);
573 direction = newPos-oldPos;
574 if ( (corrDist<0.) || (corrDist > hitDist) )
577 corrId = vecMdt[hit_iter];
580 if ( (hitDist>0.) && ((
TMath::Sqrt(hitDist)/layerDist) < 2.5) ) layerMult++;
583 if ( (corrDist>0.) && ((
TMath::Sqrt(corrDist)/layerDist) < 2.5) )
592 maxLayer = (*layer_iter).first;
610 if (nHits==0)
return kFALSE;
614 for (Int_t iHit=0; iHit<
nHits; iHit++)
646 cout <<
"-E- PndMdtTrkProducer::Init: Wrong MDT Module" << endl;
670 Int_t size = trkRef.GetEntriesFast();
671 return new(trkRef[size])
PndMdtTrk(*track);
687 for (Int_t
i = 0;
i < nTracks;
i++) {
691 if ((par.GetMomentum().Mag()<0.1) || (par.GetMomentum().Mag()>15.) )
continue;
692 FairTrackParH *helix =
new FairTrackParH(&par, ierr);
696 Int_t mdtEntries =
fHitArray->GetEntriesFast();
699 Float_t mdtQuality = 1000000;
702 TVector3 vertex(0., 0., 0.);
703 TVector3 mdtPos(0., 0., 0.);
704 TVector3 momentum(0., 0., 0.);
705 TVector3 momentum_keep(0., 0., 0.);
707 for (Int_t
mm = 0;
mm<mdtEntries;
mm++)
712 mdtHit->Position(mdtPos);
715 FairGeanePro *fProMdt =
new FairGeanePro();
716 fProMdt->SetPoint(mdtPos);
717 fProMdt->PropagateToPCA(1, 1);
718 vertex.SetXYZ(-10000, -10000, -10000);
719 FairTrackParH *fRes=
new FairTrackParH();
720 Bool_t rc = fProMdt->Propagate(helix, fRes, -13*helix->GetQ());
723 vertex.SetXYZ(fRes->GetX(), fRes->GetY(), fRes->GetZ());
724 momentum.SetXYZ(fRes->GetPx(), fRes->GetPy(), fRes->GetPz());
731 dist = (mdtPos-vertex).Mag2();
735 dist = (vertex.X()-mdtPos.X())*(vertex.X()-mdtPos.X())+(vertex.Y()-mdtPos.Y())*(vertex.Y()-mdtPos.Y());
739 if ( mdtQuality > dist)
743 momentum_keep = momentum;
749 Float_t mdtCorrCut = 900;
751 if(mdtQuality < mdtCorrCut) {
void SetHitDist(Int_t lay, Float_t dist)
Short_t GetLayerID() const
map< Int_t, vector< Int_t > > mapMdtBarrel
Float_t mdtLayerPos[3][20]
virtual void SetParContainers()
static T Sqrt(const T &x)
virtual void Exec(Option_t *opt)
void SetPersistency(Bool_t val=kTRUE)
void SetLayerDist(Int_t lay, Float_t dist)
void SetHitDeltaAngle(Int_t lay, Float_t angle)
TGeoManager * gGeoManager
void SetMaxLayer(Int_t lay)
virtual void AlgorithmWithLheGenTrack()
void SetHitIndex(Int_t lay, Int_t trackId)
map< Int_t, vector< Int_t > > mapMdtForward
FairTrackParP GetParamLast()
void SetIronDist(Float_t dist)
void SetModule(Int_t mod)
virtual InitStatus Init()
map< Int_t, vector< Int_t > > mapMdtEndcap
Float_t mdtIronThickness[3][20]
map< Int_t, Float_t > mapHitDistance
Short_t GetModule() const
void SetHitMult(Int_t lay, Int_t mult)
PndMdtTrk * AddTrk(PndMdtTrk *track)
void SetLayerCount(Int_t lay)
map< Int_t, TVector3 > mapHitDirection
TClonesArray * fLheGenTrack