er  dev
ERLi10Reconstructor.cxx
1 #include "ERLi10Reconstructor.h"
2 
3 #include <vector>
4 
5 #include "TVector3.h"
6 #include "TGeoMatrix.h"
7 #include "TMath.h"
8 #include "TRandom3.h"
9 #include "TDatabasePDG.h"
10 
11 #include "FairRootManager.h"
12 #include "FairRunAna.h"
13 #include "FairRuntimeDb.h"
14 #include<iostream>
15 using namespace std;
16 
17 #include "ERDetectorList.h"
18 #include "ERNDDigi.h"
19 #include "ERRTelescopeHit.h"
20 #include "ERLi10EventHeader.h"
21 
22 
23 // ----------------------------------------------------------------------------
25  : FairTask("ER Li10 reconstruction scheme")
26 ,fRTelescopeHits(NULL)
27 ,fNDHits(NULL)
28 {
29 }
30 // ----------------------------------------------------------------------------
31 
32 // ----------------------------------------------------------------------------
34  : FairTask("ER Li10 reconstruction scheme", verbose)
35 ,fRTelescopeHits(NULL)
36 ,fNDHits(NULL)
37 {
38 }
39 // ----------------------------------------------------------------------------
40 
41 // ----------------------------------------------------------------------------
43 {
44 }
45 // ----------------------------------------------------------------------------
46 
47 // ----------------------------------------------------------------------------
48 void ERLi10Reconstructor::SetParContainers()
49 {
50  // Get run and runtime database
51  FairRunAna* run = FairRunAna::Instance();
52  if ( ! run ) Fatal("SetParContainers", "No analysis run");
53 
54  FairRuntimeDb* rtdb = run->GetRuntimeDb();
55  if ( ! rtdb ) Fatal("SetParContainers", "No runtime database");
56 }
57 // ----------------------------------------------------------------------------
58 
59 // ----------------------------------------------------------------------------
61 {
62  // Get input array
63  FairRootManager* ioman = FairRootManager::Instance();
64  if ( ! ioman ) Fatal("Init", "No FairRootManager");
65 
66  fNDHits = (TClonesArray*) ioman->GetObject("NDHit");
67  if (!fNDHits)
68  Fatal("Init", "Can`t find collection NDHit!");
69 
70  fRTelescopeHits = (TClonesArray*) ioman->GetObject("RTelescopeHit");
71  if (!fRTelescopeHits)
72  Fatal("Init", "Can`t find collection NDHit!");
73 
74  //todo Этот код должен умереть. Не может быть MC информации в реконструкции
75  fMCHeader = (ERLi10MCEventHeader*) ioman->GetObject("MCEventHeader.");
76  if (!fMCHeader)
77  Fatal("Init", "Can`t find MCEventHeader!");
78 
79  return kSUCCESS;
80 }
81 // -------------------------------------------------------------------------
82 
83 // ----- Public method Exec --------------------------------------------
84 void ERLi10Reconstructor::Exec(Option_t* opt)
85 {
86  std::cout << "ERLi10Reconstructor: "<< std::endl;
87  std::cout << "RTelescope Hits: "<< std::endl;
88  for (Int_t iHit = 0; iHit < fRTelescopeHits->GetEntriesFast(); iHit++){
89  ERRTelescopeHit* hit = (ERRTelescopeHit*)fRTelescopeHits->At(iHit);
90  std::cout << iHit << " Eloss:" << hit->Eloss() << " time:" << hit->Time() << std::endl;
91  }
92  std::cout << "ND Hits: "<< std::endl;
93  //Ищем хит с ненулевой вероятностью нейтрона
94  Int_t NDHit = -1;
95  Int_t NDHitNb = 0;
96  for (Int_t iHit = 0; iHit < fNDHits->GetEntriesFast(); iHit++){
97  ERNDDigi* hit = (ERNDDigi*)fNDHits->At(iHit);
98  if (hit->NeutronProb() > 0){
99  NDHit = iHit;
100  NDHitNb++;
101  }
102  std::cout << iHit << " Eloss:" << hit->LightYield() << " time:" << hit->Time() << " NeutronProb:"<< hit->NeutronProb() << std::endl;
103  }
104 
105  FairRunAna* run = FairRunAna::Instance();
106  if ( ! run )
107  Fatal("SetParContainers", "No analysis run");
108  ERLi10EventHeader* header = (ERLi10EventHeader*)run->GetEventHeader();
109 
110  /*
111  Энергия нейтрона находится по времени пролета. Для этого на 1 метр выше по пучку от мишени стоит
112  пластиковый сцинтиллятор (материал как нойрад) толщиной 100 микрон. Момент прохождения пластика налетающим ионом- это старт.
113  Дальше надо пересчитать время на момент взаимодействия (вычесть пролет ионом через 1 метр) , но это не сейчас.
114 
115  Сейчас скорость нейтрона равна расстояние от мишени до центра Стильбена деленная на время между моментом реакции и регистрацией нейтрона в стильбене.
116  Полная энергия нейтрона = масса нейтрона умножить на С а в квадрате и умножить на гамма-фактор,
117  куда в качестве беты входит измеренная скорость делить на С (скорость света в вакууме).
118  */
119 
120  //Пропускаем событие, если количество хитов больше одного
121  if (NDHitNb == 1){
122  ERNDDigi* hit = (ERNDDigi*)fNDHits->At(NDHit);
123  TVector3 hitPos;
124  hit->Position(hitPos);
125  TVector3 reactionPos(0.,0.,fMCHeader->ReactionPos());
126  Float_t L = (hitPos-reactionPos).Mag(); //расстояние от рекции до хита.
127  Float_t Vn = L/(hit->Time()-fMCHeader->ReactionTime());
128  Float_t Mn = TDatabasePDG::Instance()->GetParticle("neutron")->Mass();
129  Float_t beta = Vn/TMath::C();
130  Float_t gamma = 1./TMath::Sqrt(1-beta*beta);
131  Float_t NEnergy = Mn*gamma;
132  }
133  else {
134  header->SetNEnergy(-1);
135  }
136 
137  /*
138  Протон в кремнии полностью поглощается. Центр сегмента говорит о направлении импульса
139  (вектор из точки взаимодействия, пока что центр мишени, потом возможно измерение координат налетающего иона).
140  А энерговыделение в кремнии равно кинетической энергии протона. Все неидеальности прозже в дижитизации.
141  */
142 
143  if (fRTelescopeHits->GetEntriesFast() == 1){
144  ERRTelescopeHit* hit = (ERRTelescopeHit*)fRTelescopeHits->At(0);
145  header->SetPEnergy(hit->Eloss());
146  }
147  else {
148  header->SetPEnergy(-1);
149  }
150 }
151 //----------------------------------------------------------------------------
152 
153 //----------------------------------------------------------------------------
155 {
156  if (fNDHits) {
157  fNDHits->Delete();
158  }
159  if (fRTelescopeHits) {
160  fRTelescopeHits->Delete();
161  }
162 }
163 // ----------------------------------------------------------------------------
164 
165 // ----------------------------------------------------------------------------
167 {
168 
169 }
170 // ----------------------------------------------------------------------------
171 /*
172 // ----------------------------------------------------------------------------
173 ERNDDigi* ERLi10Reconstructor::AddHit(Int_t detID, TVector3& pos, TVector3& dpos,
174  Int_t point_index, Float_t eloss, Float_t time,Float_t neutronProb)
175 {
176  ERNDDigi *hit = new((*fNDHits)[fNDHits->GetEntriesFast()])
177  ERNDDigi(fNDHits->GetEntriesFast(),detID, pos, dpos, point_index, eloss, time, neutronProb);
178  return hit;
179 }
180 // ----------------------------------------------------------------------------
181 */
182 //-----------------------------------------------------------------------------
183 ClassImp(ERLi10Reconstructor)
virtual void Exec(Option_t *opt)
float LightYield() const
Definition: ERNDDigi.h:22
virtual InitStatus Init()