FairRoot/PandaRoot
PndSttIsochroneDraw.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndSttIsochroneDraw source file -----
3 // ----- Created 10/12/07 by M. Al-Turany -----
4 // -------------------------------------------------------------------------
5 
6 #include "PndSttIsochroneDraw.h"
7 #include "TEveTrack.h"
8 #include <iostream>
9 #include "TEveTrackPropagator.h"
10 #include "TGeoTrack.h"
11 #include "TClonesArray.h"
12 #include "TObjArray.h"
13 #include "TEveManager.h"
14 #include "FairEventManager.h"
15 #include "PndTrack.h"
16 #include "TLorentzVector.h"
17 #include "TParticle.h"
18 #include "TEveBoxSet.h"
19 #include "TEveGeoShape.h"
20 #include "TGeoMatrix.h"
21 #include "TGeoTube.h"
22 #include "TGeoMatrix.h"
23 #include "PndSttMapCreator.h"
24 #include "PndSttHit.h"
25 #include "PndSttTube.h"
26 #include "PndSttSingleStraw.h"
27 #include "PndSttPoint.h"
28 #include "PndSttTubeMap.h"
29 #include "FairRuntimeDb.h"
30 #include "FairEventHeader.h"
31 #include <string>
32 #include <sstream>
33 using std::cout;
34 using std::endl;
35 
36 // ----- Default constructor -------------------------------------------
37 PndSttIsochroneDraw::PndSttIsochroneDraw(Bool_t ) // propagate //[R.K.03/2017] unused variable(s)
38  : fTimeWindowPlus(0.), fTimeWindowMinus(0.), fStartTime(-1), fUseEventTime(kTRUE), fUseIsochroneTime(kFALSE),
39  fSttHitArray(0), fSttTubeArray(0), fSttParameters(0), fEventManager(0), fEveTrList(0), fListOfIsochrones(0), fListOfTiltedIsochrones(0), fListOfParallelIsochrones(0),
40  fStartFunctor(0), fStopFunctor(0), fEventHeaderBranch(0)
41 {
42 }
43 // -------------------------------------------------------------------------
44 
45 
46 // ----- Standard constructor ------------------------------------------
47 PndSttIsochroneDraw::PndSttIsochroneDraw(const char* name, Bool_t , Int_t iVerbose) // propagate //[R.K.03/2017] unused variable(s)
48  : FairTask(name, iVerbose), fTimeWindowPlus(0.), fTimeWindowMinus(0.), fStartTime(-1), fUseEventTime(kTRUE), fUseIsochroneTime(kFALSE),
49  fSttHitArray(0), fSttTubeArray(0), fSttParameters(0), fEventManager(0), fEveTrList(0), fListOfIsochrones(0), fListOfTiltedIsochrones(0), fListOfParallelIsochrones(0),
50  fStartFunctor(0), fStopFunctor(0), fEventHeaderBranch(0)
51 {
52  // fPro = new FairGeanePro();
53 
54 }
55 
56 
57 // -------------------------------------------------------------------------
59 {
60  if (fVerbose > 1)
61  cout << "PndSttIsochroneDraw::Init()" << endl;
62  if (fSttHitArray == 0){
63  FairRootManager* fManager = FairRootManager::Instance();
64  fSttHitArray = (TClonesArray *) fManager->GetObject(GetName());
65  if (fSttHitArray == 0) {
66  cout << "PndSttIsochroneDraw::Init() branch " << GetName()
67  << " Not found! Task will be deactivated " << endl;
68  SetActive(kFALSE);
69  }
70 
71  fEventManager = FairEventManager::Instance();
72  if (fVerbose > 2)
73  cout << "PndSttIsochroneDraw::Init() get instance of FairEventManager " << endl;
74 
75  if (fSttParameters->GetGeometryType() == 1) {
77  fSttTubeArray = mapper->FillTubeArray();
78  }
79 
80  }
81  fStartFunctor = new StopTime();
82  fStopFunctor = new StopTime();
83 // fCrawler = new PndMCDataCrawler();
84 // fCrawler->Init();
85 // fCrawler->SetStoreIntermediate(kFALSE);
86 
87  if (IsActive())
88  return kSUCCESS;
89  else
90  return kERROR;
91 }
92 
93 // ----- Destructor ----------------------------------------------------
95 {
96  if (fStartFunctor != 0)
97  delete (fStartFunctor);
98  if (fStopFunctor != 0)
99  delete (fStopFunctor);
100 }
101 // -------------------------------------------------------------------------
103 {
104 
105  if (IsActive()) {
106 
107  if (fVerbose > 1)
108  cout << " PndSttIsochroneDraw::Exec " << endl;
109  Reset();
110 
111  fListOfIsochrones = new TEveBoxSet("SttIsochrones");
112  fListOfTiltedIsochrones = new TEveBoxSet("SttTiltedIsochrones");
113  fListOfParallelIsochrones = new TEveBoxSet("SttParallelIsochrones");
114  //fListOfTracks->DestroyElements();
115 
116  gEve->AddElement(fListOfIsochrones, fEventManager);
119  Double_t eventTime = FairRootManager::Instance()->GetEventTime();
120 
121  if (FairRunAna::Instance()->IsTimeStamp()) {
122  std::cout << "Inside TimeStamp" << std::endl;
123  if (fUseEventTime) {
124  fStartTime = eventTime - fTimeWindowMinus;
125  }
126  cout << "EventTime: " << eventTime << " TimeWindow: " << fStartTime
127  << " - " << eventTime + fTimeWindowPlus << std::endl;
128 
129  fSttHitArray = FairRootManager::Instance()->GetData(GetName(),
130  fStartFunctor, fStartTime, fStopFunctor, eventTime + fTimeWindowPlus); //FairRootManager::Instance()->GetEventTime() +
131  std::cout << fStartTime << " " << eventTime + fTimeWindowPlus
132  << " FoundTracks: " << fSttHitArray->GetEntriesFast()
133  << std::endl;
134  }
135 
136  std::cout << "SttHitArray: " << fSttHitArray->GetEntriesFast()
137  << std::endl;
138 
139  for (Int_t i = 0; i < fSttHitArray->GetEntriesFast(); i++) {
140  if (fVerbose > 2)
141  cout << "PndSttIsochroneDraw::Exec " << i << endl;
142 
143  PndSttHit* myHit = (PndSttHit*) fSttHitArray->At(i);
144  std::cout << "STTHits: " << myHit->GetX() << " " << myHit->GetY()
145  << " " << myHit->GetZ() << std::endl;
146  if (0 == myHit) {
147  std::cout << "-E- PndSttIsochroneDraw Hit does not exist! " << i
148  << std::endl;
149  continue;
150  }
151 
152  PndSttTube* myTube = nullptr;
153  if (fSttParameters->GetGeometryType() == 1){
154  myTube = (PndSttTube*) fSttTubeArray->At(myHit->GetTubeID());
155  } else if (fSttParameters->GetGeometryType() == 2){
156  myTube = PndSttTubeMap::Instance()->GetTube(myHit->GetTubeID());
157  }
158 
159  if (nullptr == myTube) {
160  std::cout << "-E- PndSttIsochroneDraw Tube does not exist! "
161  << myHit->GetTubeID() << std::endl;
162  continue;
163  }
164 
165 // std::cout << "Tube: " << myTube->GetHalfLength() << std::endl;
166 
167  Double_t tubeLengthHalf = myTube->GetHalfLength();
168  Double_t radius = 0;
169  Double_t radiusError = 0;
170  if (fUseIsochroneTime == kTRUE) {
171  PndSttSingleStraw straw;
172  Double_t driftTime = myHit->GetTimeStamp() - eventTime;
173  FairMultiLinkedData_Interface* linkData = (FairMultiLinkedData_Interface*)myHit; //fInputData->At(i);
174 
175  //fCrawler->Init();
176  //fCrawler->SetStoreIntermediate(kFALSE);
177  std::cout << "StartLink: " << *linkData << std::endl;
178  FairMultiLinkedData result = linkData->GetLinksWithType(FairRootManager::Instance()->GetBranchId("STTPoint"));
179  //fCrawler->GetInfo(FairMultiLinkedData(*linkData), "STTPoint");
180 
181  std::cout << "Links: " << result << std::endl;
182  if (result.GetNLinks() == 1 && result.GetLink(0).GetType() == FairRootManager::Instance()->GetBranchId("STTPoint")){
183  PndSttPoint* mcPoint = (PndSttPoint*)FairRootManager::Instance()->GetCloneOfLinkData(result.GetLink(0));
184  FairLink evtHeaderLink(-1, result.GetLink(0).GetEntry(), "EventHeader.", -1);
185  FairEventHeader* evtHeader = (FairEventHeader*)FairRootManager::Instance()->GetCloneOfLinkData(evtHeaderLink);
186  if (evtHeader != 0)
187  std::cout << "MCTime: " << evtHeader->GetEventTime() << std::endl;
188  std::cout << "MCRadius: " << mcPoint->GetTrueDistance() << std::endl;// << " MCTime: " << evtHeader->GetEventTime() << std::endl;
189  delete mcPoint;
190  delete evtHeader;
191  }
192  std::cout << "-I- PndSttIsochroneDraw Pulse: " << myHit->GetPulse() << " TimeStamp: " << myHit->GetTimeStamp() << " EventTime " << eventTime << " DriftTime: " << driftTime << std::endl;
193  std::cout << "-I- PndSttIsochroneDraw Radius: " << myHit->GetIsochrone() << " RecoRadius: " << straw.TimnsToDiscm(driftTime) << std::endl;
194 
195  if (driftTime > 0) {
196  radius = straw.TimnsToDiscm(driftTime);
197  } else {
198  std::cout << "-I- PndSttIsochrone Drift time <= 0: " << driftTime << std::endl;
199  continue;
200  }
201  if (radius > myTube->GetRadIn()) {
202  std::cout << "-I- PndSttIsochrone Isochrone with " << radius << " larger than tube radius of " << myTube->GetRadIn() << std::endl;
203  continue;
204  }
205  radiusError = myHit->GetIsochroneError();
206  } else {
207  radius = myHit->GetIsochrone();
208  radiusError = myHit->GetIsochroneError();
209  }
210 // std::cout << "RadiusError " << radiusError << std::endl;
211 
212  TEveGeoShape* myEveShape;
213  myEveShape = new TEveGeoShape("SttTube");
214  radiusError = 0.05;
215  myEveShape->SetShape(
216  new TGeoTube(radius - radiusError, radius + radiusError,
217  tubeLengthHalf));
218 // std::cout << "Wire direction: " << myTube->GetWireDirection().X() << " " << myTube->GetWireDirection().Y() << " " << myTube->GetWireDirection().Z() << std::endl;
219  if (myTube->GetWireDirection().Pt() > 0) {
220  myEveShape->SetMainColor(kYellow);
221  myEveShape->SetMainTransparency(80);
222  } else {
223  myEveShape->SetMainColor(kCyan);
224  }
225  TMatrixT<double> myRotMat = myTube->GetRotationMatrix();
226  Double_t rotArray[9];
227  rotArray[0] = myRotMat(0, 0);
228  rotArray[1] = myRotMat(0, 1);
229  rotArray[2] = myRotMat(0, 2);
230  rotArray[3] = myRotMat(1, 0);
231  rotArray[4] = myRotMat(1, 1);
232  rotArray[5] = myRotMat(1, 2);
233  rotArray[6] = myRotMat(2, 0);
234  rotArray[7] = myRotMat(2, 1);
235  rotArray[8] = myRotMat(2, 2);
236 
237  if (fVerbose > 1) {
238  std::cout << "RotMat NElements: "
239  << myRotMat.GetNoElements() << std::endl;
240 
241  std::cout << myRotMat(0, 0) << " ";
242  std::cout << myRotMat(0, 1) << " ";
243  std::cout << myRotMat(0, 2) << std::endl;
244  std::cout << myRotMat(1, 0) << " ";
245  std::cout << myRotMat(1, 1) << " ";
246  std::cout << myRotMat(1, 2) << std::endl;
247  std::cout << myRotMat(2, 0) << " ";
248  std::cout << myRotMat(2, 1) << " ";
249  std::cout << myRotMat(2, 2) << std::endl;
250  }
251 
252  TGeoHMatrix geoTrans;
253  geoTrans.SetRotation(rotArray);
254  Double_t trans[3];
255  trans[0] = myTube->GetPosition().X();
256  trans[1] = myTube->GetPosition().Y();
257  trans[2] = myTube->GetPosition().Z();
258  if (fSttParameters->GetGeometryType() == 2)
259  trans[2] += tubeLengthHalf + 0.35; //< Todo: The origin of the tube is at the beginning of the tube and not at the center. Skewed straws still do not work.
260  geoTrans.SetTranslation(trans);
261 
262  if (fVerbose > 1) {
263  std::cout << "Translation: " << trans[0] << "/" << trans[1] << "/" << trans[2] << std::endl;
264  }
265 
266  myEveShape->SetTransMatrix(geoTrans);
267  if (radius > 0) {
268  if (myTube->GetWireDirection().Pt() > 0) {
269  fListOfTiltedIsochrones->AddElement(myEveShape);
270  }
271  else {
272  fListOfParallelIsochrones->AddElement(myEveShape);
273  }
274  }
275  }
276  gEve->Redraw3D(kFALSE);
277 // if (fListOfIsochrones) fListOfIsochrones->Delete();
278 // if (fListOfTiltedIsochrones) fListOfTiltedIsochrones->Delete();
279  }
280 }
281 
282 
283 
284 
285 // -------------------------------------------------------------------------
287 {
288  FairRuntimeDb* rtdb = FairRunAna::Instance()->GetRuntimeDb();
289  fSttParameters = (PndGeoSttPar*) rtdb->getContainer("PndGeoSttPar");
290 }
291 
292 // -------------------------------------------------------------------------
294 {
295 
296 }
297 // -------------------------------------------------------------------------
299 {
300 
301  if (fListOfTiltedIsochrones != 0) {
302  // fListOfTiltedIsochrones->Reset();
303 // gEve->PreDeleteElement(fListOfTiltedIsochrones);
304 // gEve->RemoveElement(fListOfTiltedIsochrones, fListOfIsochrones);
305  fListOfTiltedIsochrones->DestroyElements();
306  fListOfTiltedIsochrones->Destroy();
307  }
308 
309  if (fListOfParallelIsochrones != 0){
310 // fListOfIsochrones->Reset();
311 // gEve->PreDeleteElement(fListOfParallelIsochrones);
312 // gEve->RemoveElement(fListOfParallelIsochrones, fListOfIsochrones);
313  fListOfParallelIsochrones->DestroyElements();
314  fListOfParallelIsochrones->Destroy();
315 
316  }
317  if (fListOfIsochrones != 0){
318 // fListOfIsochrones->Reset();
319 // gEve->PreDeleteElement(fListOfIsochrones);
320 // gEve->RemoveElement(fListOfIsochrones, fEventManager);
321  fListOfIsochrones->Destroy();
322  }
323 
324 }
325 
326 
328 {
330 }
331 
333 {
335 }
336 
337 
339 
340 
int fVerbose
Definition: poormantracks.C:24
Double_t GetTrueDistance()
Definition: PndSttPoint.cxx:64
PndGeoSttPar * fSttParameters
virtual void SetTimeWindowMinus(Double_t val)
TEveBoxSet * fListOfParallelIsochrones
Int_t i
Definition: run_full.C:25
Double_t GetHalfLength()
Definition: PndSttTube.cxx:99
Double_t GetPulse() const
Definition: PndSttHit.h:64
Double_t val[nBoxes][nFEBox]
Definition: createCalib.C:11
virtual void Exec(Option_t *option)
PndSttTube * GetTube(int tubeId)
Definition: PndSttTubeMap.h:22
Int_t GetGeometryType()
Definition: PndGeoSttPar.h:28
Double_t GetRadIn()
Definition: PndSttTube.cxx:93
static PndSttTubeMap * Instance()
virtual void SetTimeWindowPlus(Double_t val)
BinaryFunctor * fStopFunctor
TGeoTranslation * trans
virtual InitStatus Init()
BinaryFunctor * fStartFunctor
Double_t GetIsochrone() const
Definition: PndSttHit.h:62
virtual void SetParContainers()
Double_t
TEveBoxSet * fListOfTiltedIsochrones
TVector3 GetPosition()
Definition: PndSttTube.cxx:87
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
FairEventManager * fEventManager
Int_t GetTubeID() const
Definition: PndSttHit.h:75
TClonesArray * FillTubeArray()
Double_t GetIsochroneError() const
Definition: PndSttHit.h:63
PndSttIsochroneDraw(Bool_t propagation=kFALSE)
Double_t TimnsToDiscm(Double_t time)
TString name
TClonesArray * fSttHitArray
TClonesArray * fSttTubeArray
ClassImp(PndAnaContFact)
TEveBoxSet * fListOfIsochrones
Int_t iVerbose
TMatrixT< Double_t > GetRotationMatrix()
Definition: PndSttTube.cxx:90
TVector3 GetWireDirection()
Definition: PndSttTube.cxx:107