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