FairRoot/PandaRoot
runTimestampCheck.C
Go to the documentation of this file.
2  gROOT->Reset();
3  // Verbosity level (0=quiet, 1=event level, 2=track level, 3=debug)
4  Int_t iVerbose = 0;
5 
6  enum DetectorId {
8 
9 
10  TStopwatch timer;
11  timer.Start();
12  gROOT->LoadMacro("$VMCWORKDIR/gconfig/rootlogon.C");
13  rootlogon();
14 
15  // Reco Parameters
16  Double_t stthitlifetime = 200;
17 
18  TString simFileName = "Sim_Dpm_500.root";
19  TString parFileName = "Sim_Dpm_500_params.root";
20  TString digiFileName = "Sim_Dpm_500_digi.root";
21  TString recoFileName = "Sim_Dpm_500_reco.root";
22  TString outFileName = "Sim_Dpm_500_streamdisplay.root";
23 
24  TFile filedigi(digiFileName.Data());
25  TFile filereco(recoFileName.Data());
26  TFile filerecopixel(recoFileName.Data());
27 
28  TTree *treedigi = (TTree*) filedigi.Get("pndsim");
29  //TClonesArray *sttsortedhits = new TClonesArray("PndSttHit");
30  //treedigi->SetBranchAddress("STTSortedHits",&sttsortedhits);
31 
32  TTree *recotree = (TTree*) filereco.Get("pndsim");
33  //TClonesArray *mvdstripreco = new TClonesArray("PndSdsHit");
34  //recotree->SetBranchAddress("MVDHitsStrip",&mvdstripreco);
35  //TClonesArray *mvdpixelreco = new TClonesArray("PndSdsHit");
36  //recotree->SetBranchAddress("MVDHitsPixel",&mvdpixelreco);
37 
38 
39  FairRunAna *fRun = new FairRunAna();
40  fRun->SetInputFile(simFileName.Data());
41  fRun->AddFriend(recoFileName.Data());
42  fRun->AddFriend(digiFileName.Data());
43  fRun->SetOutputFile(outFileName.Data());
44  fRun->Init();
45  //FairRuntimeDb *rtdb = LoadRuntimeDB(parFileName, fRun);
46  FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
47 
48  // load geometry parameters
50  //PndSttMapCreator* mapper = new PndSttMapCreator(fSttParameters);
51  //TClonesArray* tubearray = mapper->FillTubeArray();
52 
53  PndOnlineGeometryManager *online_geometry = new PndOnlineGeometryManager(rtdb, parFileName.Data());
54 
55 
59 
68 
70  PndOnlineHitProducer *online_hit_producer = new PndOnlineHitProducer();
71  online_hit_producer->LoadStream(kSTT, "STTSortedHits");
72  online_hit_producer->LoadStream(kMVD, "MVDHitsStrip");
73  online_hit_producer->LoadStream(kMVD, "MVDHitsPixel");
74 
75 
76  PndOnlineManager *online = new PndOnlineManager();
77  online->AddHitProducer(online_hit_producer);
78  online->AddGeometryManager(online_geometry);
79  online->SetActiveDetector(kSTT,stthitlifetime);
80  //online->SetActiveDetector(kMVD,stthitlifetime);
81 
82  TClonesArray* tubearray = online_geometry->GetDetectorGeometry(kSTT);
83 
84  // load task
85  PndOnlineSttTripletFinder *triplet_finder = new PndOnlineSttTripletFinder(online, tubearray);
86  //triplet_finder->Init();
87  online->AddTask((FairTask*)triplet_finder);
88 
89  // initialize display
90  //TCanvas* c1 = new TCanvas("c1");
91  //c1->Range(-42,-42,42,42);
92  //c1->SetCanvasSize(1200, 1200);
93  TText* mytext = new TText();
94 
95 
96  // event loop!
97  int current_time = 0;
98  //int delta_t = 5;
99  int delta_t = 20;
100  int final_time = 300;
101  online->Init();
102 
103  Int_t timeviolationcount = 0;
104 
105  while( current_time < final_time ) {
106  //online->LoadHits( PndOnlineManager::kHESRRevolution );
107  online->LoadHits( delta_t );
108  //online->LoadHits( current_time );
109  online->Process();
110  //online->Clear();
111  current_time += delta_t;
112 
113 
114  //Draw the results
115  //c1->Clear();
116  //c1->cd();
117  //DrawDetector();
118  //cout << " Drawing stuff " << endl;
119  DrawIsochrones(current_time-stthitlifetime, online->GetFairHitObjectList(kSTT), tubearray, &timeviolationcount);
120  //DrawOnlineTrackVertices(current_time-stthitlifetime, online->GetTrackObjectList());
121  //DrawOnlineTrackHack(current_time-stthitlifetime, online->GetTrackObjectList());
122  //DrawFairHits(drawstackstriphits);
123  //DrawFairHits(drawstackpixelhits);
124  //DrawTripletTracks(innertriplets, midtriplets, 10);
125  //DrawTripletTracks(innertriplets, outertriplets, 45);
126  //DrawTripletTracks(midtriplets, outertriplets, 25);
127 
128 
129  // now print out the triplets
130  //online->PrintTracks();
131  TObjArray *tracks = online->GetTrackObjectList();
132  for(int i=0; i<tracks->GetEntriesFast(); ++i) {
133  PndOnlineTrack *trk_ptr = (PndOnlineTrack *)(tracks->At(i));
134  //cout << " triplet cms; "; trk_ptr->Vertex().Print();
135  }
136 
137 
138  //online->GetTrackList().clear();
139 
140  //mytext->DrawText(-42, -42, TString::Format("%d ns",current_time));
141  //c1->Update();
142  //c1->Print("hitdisplay.png");
143  //c1->Print("hitdisplay.gif+15");
144  }
145 
146  cout << endl << endl << endl << "-----" << endl << "Number of Time Window Violations: " << timeviolationcount << endl << "-----" << endl;
147 
148  // ----- Finish -------------------------------------------------------
149  timer.Stop();
150  Double_t rtime = timer.RealTime();
151  Double_t ctime = timer.CpuTime();
152  cout << endl << endl;
153  cout << "Macro finished succesfully." << endl;
154  cout << "Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
155  cout << endl;
156  // ------------------------------------------------------------------------
157 
158 
159  return 0;
160 }
161 
162 
163 void DrawIsochrones(Int_t currenttime, TObjArray* stthits, TObjArray* stttubes, Int_t* timeviolationcount) {
164  TEllipse mylipse;
165  mylipse.SetFillStyle(0);
166  PndSttTube* tube = 0;
167  PndSttHit* drawhit = 0;
168  Double_t isochrone = 0;
169  Double_t timestamp = 0;
170  Double_t drifttime = 0;
171  Double_t recoisochrone = 0;
172 
173  PndSttSingleStraw stt;
174  //setting the single straw tube simulation constants
175  // 3 options currently available:
176  // TConst(tube radius (cm), gas pressure (bar), Ar%, CO2%)
177  // stt.TConst(0.4, 1, 0.9, 0.1);
178  // stt.TConst(0.5, 1, 0.9, 0.1);
179  stt.TConst(0.5, 2, 0.8, 0.2);
180  // wire positioning
181  stt.PutWireXYZ(0., 0., -75., 0., 0., 75.);
182 
183 
184  cout << "----- Checking Isochrones at " << currenttime << " with " << stthits->GetEntriesFast() << " active Hits." << endl;
185  for(int j = 0; j < stthits->GetEntriesFast(); j++) {
186  drawhit = (PndSttHit*) stthits->At(j);
187  if (!drawhit) {
188  cout << " Error: No Hit Pointer in drawstack." << endl;
189  continue;
190  }
191  //cout << "Tube ID: " << drawhit->GetTubeID() << endl;
192  tube = (PndSttTube*)(stttubes->At(drawhit->GetTubeID()));
193  if (!tube) {
194  cout << " Error: Hit pointed to invalid tube." << endl;
195  continue;
196  }
197  //cout << "Calculating Isochrones." << endl;
198  isochrone = drawhit->GetIsochrone();
199  timestamp = drawhit->GetTimeStamp();
200  if (timestamp>currenttime+200) {
201  cout << " Error: Hit time " << timestamp << " larger than Window end time " << currenttime+200 << endl;
202  (*timeviolationcount)++;
203  continue;
204  }
205  //cout << "MC Isochrone: " << drawhit->GetIsochrone() << endl;
206  //cout << "Hit Timestamp: " << drawhit->GetTimeStamp() << endl;
207  drifttime = timestamp - currenttime;
208  //cout << "Calculating Isochrones: " << isochrone << " " << timestamp << " " << drifttime << " " << recoisochrone << endl;
209  if (drifttime < 0) drifttime = 0;
210  if (drifttime > 245) drifttime = 245;
211  recoisochrone = stt.TimnsToDiscm(drifttime);
212  //cout << "Calculating Isochrones: " << isochrone << " " << timestamp << " " << drifttime << " " << recoisochrone << endl;
213  if (recoisochrone < 0) recoisochrone = 0;
214  if (recoisochrone > 0.5) recoisochrone = 0.5;
215  //cout << "Calculating Isochrones: " << isochrone << " " << timestamp << " " << drifttime << " " << recoisochrone << endl;
216  //std::cout << currenttime << " " << drawhit->GetTubeID() << " " << tube->GetPosition().X() << " " << tube->GetPosition().Y() << " " << tube->GetPosition().Z() << " " << tube->GetWireDirection().X() << " " << tube->GetWireDirection().Y() << " " << tube->GetWireDirection().Z() << " " << timestamp << " " << isochrone << " " << recoisochrone << std::endl;
217  mylipse.SetX1(tube->GetPosition().X());
218  mylipse.SetY1(tube->GetPosition().Y());
219 
220  //conformal transformation
221  //Double_t r2 = tube->GetPosition().X() * tube->GetPosition().X() + tube->GetPosition().Y() * tube->GetPosition().Y();
222  //Double_t u = tube->GetPosition().X() / r2;
223  //Double_t v = tube->GetPosition().Y() / r2;
224  //mylipse.SetX1(500*u);
225  //mylipse.SetY1(500*v);
226 
227  mylipse.SetR1(recoisochrone);
228  mylipse.SetR2(recoisochrone);
229 
230  if (TMath::Abs(recoisochrone-isochrone) < 0.04) {
231  mylipse.SetLineColor(kGreen);
232  } else if (recoisochrone+0.04 < isochrone) {
233  mylipse.SetLineColor(kRed);
234  } else {
235  if ((tube->GetWireDirection().X() == 0) && (tube->GetWireDirection().Y() == 0)) {
236  mylipse.SetLineColor(kBlack);
237  } else {
238  mylipse.SetLineColor(kBlue);
239  }
240  }
241  //if (HasNeighbor(drawhit->GetTubeID(), stthits, stttubes)) {
242  // mylipse.SetFillColor(kGreen);
243  // mylipse.SetFillStyle(1001);
244  //} else {
245  // mylipse.SetFillStyle(0);
246  //}
247  //mylipse.SetFillStyle(0);
248  //mylipse.DrawClone();
249  }
250 }
TFile filereco("MvdStt_Test_reco.root")
Int_t i
Definition: run_full.C:25
void PutWireXYZ(Double_t w1, Double_t w2, Double_t w3, Double_t w4, Double_t w5, Double_t w6)
int runTimestampCheck()
DrawHits * drawhit
Definition: hit_dirc_draw.C:81
FairRunAna * fRun
Definition: hit_dirc.C:58
static T Abs(const T &x)
Definition: PndCAMath.h:39
void DrawIsochrones(Int_t currenttime, TObjArray *stthits, TObjArray *stttubes, Int_t *timeviolationcount)
Double_t GetIsochrone() const
Definition: PndSttHit.h:62
Double_t
TTree * treedigi
TStopwatch timer
Definition: hit_dirc.C:51
TFile filedigi("testdigi.root")
TVector3 GetPosition()
Definition: PndSttTube.cxx:87
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
Int_t GetTubeID() const
Definition: PndSttHit.h:75
Double_t TimnsToDiscm(Double_t time)
Double_t ctime
Definition: hit_dirc.C:114
void TConst(Double_t Radius, Double_t pSTP, Double_t ArP, Double_t CO2P)
Int_t iVerbose
Double_t rtime
Definition: hit_dirc.C:113
TVector3 GetWireDirection()
Definition: PndSttTube.cxx:107