FairRoot/PandaRoot
PndTimeStructureAnaTask.cxx
Go to the documentation of this file.
1 /********************************************************************************
2  * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence version 3 (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 // -------------------------------------------------------------------------
9 // ----- PndTimeStructureAnaTaskT source file -----
10 // -------------------------------------------------------------------------
11 
13 
14 #include "FairMultiLinkedData.h" // for FairLink
15 #include "FairRootManager.h" // for FairRootManager
16 #include "FairTimeStamp.h" // for FairTimeStamp
17 #include "FairRunAna.h"
18 
19 #include "PndSdsHit.h"
20 
21 #include <iosfwd> // for ostream
22 #include "TClass.h" // for TClass
23 #include "TClonesArray.h" // for TClonesArray
24 #include "PndMCTrack.h"
25 
26 #include <iostream> // for operator<<, cout, ostream, etc
27 #include <iomanip>
28 #include <vector> // for vector
29 
31 {
32  return kSUCCESS;
33 }
34 
35 // ----- Public method Init --------------------------------------------
37 {
38 
39  FairRootManager* ioman = FairRootManager::Instance();
40  if ( ! ioman ) {
41  std::cout << "-E- PndTimeStructureAnaTaskT::Init: "
42  << "RootManager not instantiated!" << std::endl;
43  return kFATAL;
44  }
45 
46  if(fData.size() == 0){
47 
48  fData.push_back(DataObject("MVDSortedPixelDigis"));
49  fData.push_back(DataObject("MVDSortedStripDigis"));
50  fData.push_back(DataObject("STTSortedHits"));
51  fData.push_back(DataObject("GEMDigiSorted"));
52  fData.push_back(DataObject("SciTSortedHit"));
53  fDataPrim.push_back(DataObject("MVDSortedPixelDigisPrim"));
54  fDataPrim.push_back(DataObject("MVDSortedStripDigisPrim"));
55  fDataPrim.push_back(DataObject("STTSortedHitsPrim"));
56  fDataPrim.push_back(DataObject("GEMDigiSortedPrim"));
57  fDataPrim.push_back(DataObject("SciTSortedHitPrim"));
58  }
59 
60  for (size_t i = 0; i < fData.size(); i++){
61  fData[i].fBranch = (TClonesArray*)ioman->GetObject(fData[i].fBranchName);
62  }
63 
64  fHistoMixedEvents = new TH1D("hMixedEvents","hMixedEvents", fData.size(), 0, fData.size());
65  fHistoMixedEventsPrim = new TH1D("hMixedEventsPrim","hMixedEventsPrim", fDataPrim.size(), 0, fDataPrim.size());
66 
67  return kSUCCESS;
68 }
69 // -------------------------------------------------------------------------
70 
71 // ----- Public method Exec --------------------------------------------
73 {
74  std::cout << " ------------- Event " << FairRootManager::Instance()->GetEntryNr() << " ----------------" << std::endl;
75  bool primaryParticle = false;
76  PndMCTrack* mcTrack = 0;
77  for (size_t i = 0; i < fData.size(); i++){
78  for (int j = 0; j < fData[i].fBranch->GetEntries(); j++){
79  FairTimeStamp* data = (FairTimeStamp*)fData[i].fBranch->At(j);
80  FairMultiLinkedData links = data->GetLinksWithType(FairRootManager::Instance()->GetBranchId("MCTrack"));
81 // std::cout << fData[i].fBranchName.Data() << " " << j << " : " << *data << std::endl;
82  Int_t currentEventNr = -1;
83  if (links.GetNLinks() > 0){
84  currentEventNr = links.GetLink(0).GetEntry();
85  mcTrack = (PndMCTrack*)FairRootManager::Instance()->GetCloneOfLinkData(links.GetLink(0));
86  if (mcTrack != 0)
87  if (mcTrack->GetMotherID() < 0){
88  primaryParticle = true;
89 // std::cout << "Primary Particle found!" << std::endl;
90  }
91  }
92  if (currentEventNr < 0) continue;
93 // if(links.GetNLinks() > 1)
94 // std::cout << fData[i].fBranchName.Data() << " : " << links << std::endl;
95 // std::cout << "CurrentEventNr: " << currentEventNr << " : OldEventNr " << fData[i].fOldEventNr << std::endl;
96  if (fData[i].fEventStartStopMap.count(currentEventNr) == 0){
97  fData[i].fEventStartStopMap[currentEventNr] = std::pair<Double_t, Double_t>(data->GetTimeStamp(), data->GetTimeStamp());
98  }
99  else{
100  fData[i].fEventStartStopMap[currentEventNr].second = data->GetTimeStamp();
101  }
102  if (currentEventNr < fData[i].fOldEventNr){
103  if (fData[i].fEventMixture == kFALSE){
104  fHistoMixedEvents->Fill(i);
105  fData[i].fEventMixture = kTRUE;
106  std::cout << "Event Mixture!" << std::endl;
107  }
108  }
109  else if (currentEventNr == fData[i].fOldEventNr){
110  fData[i].fEventHisto->Fill(data->GetTimeStamp() - fData[i].fOldTimeStamp);
111  fData[i].fOldTimeStamp = data->GetTimeStamp();
112 
113  } else {
114 // std::cout << "HistoFilled: " << data->GetTimeStamp() << " - " << fData[i].fOldTimeStamp << data->GetTimeStamp() - fData[i].fOldTimeStamp << std::endl;
115  fData[i].fTimeHisto->Fill(data->GetTimeStamp() - fData[i].fOldTimeStamp);
116  fData[i].fOldTimeStamp = data->GetTimeStamp();
117  fData[i].fOldEventNr = currentEventNr;
118  fData[i].fEventMixture = kFALSE;
119 
120  }
121 
122  if (primaryParticle){
123  if (fDataPrim[i].fEventStartStopMap.count(currentEventNr) == 0){
124  fDataPrim[i].fEventStartStopMap[currentEventNr] = std::pair<Double_t, Double_t>(data->GetTimeStamp(), data->GetTimeStamp());
125  }
126  else{
127  fDataPrim[i].fEventStartStopMap[currentEventNr].second = data->GetTimeStamp();
128  }
129  if (currentEventNr < fDataPrim[i].fOldEventNr){
130  if (fDataPrim[i].fEventMixture == kFALSE){
131  fHistoMixedEventsPrim->Fill(i);
132  fDataPrim[i].fEventMixture = kTRUE;
133  std::cout << "Event Mixture!" << std::endl;
134  }
135  }
136  else if (currentEventNr == fDataPrim[i].fOldEventNr){
137  fDataPrim[i].fEventHisto->Fill(data->GetTimeStamp() - fDataPrim[i].fOldTimeStamp);
138  fDataPrim[i].fOldTimeStamp = data->GetTimeStamp();
139 
140  } else {
141 // std::cout << "PrimHistoFilled: " << data->GetTimeStamp() << " - " << fDataPrim[i].fOldTimeStamp << data->GetTimeStamp() - fDataPrim[i].fOldTimeStamp << std::endl;
142  fDataPrim[i].fTimeHisto->Fill(data->GetTimeStamp() - fDataPrim[i].fOldTimeStamp);
143  fDataPrim[i].fOldTimeStamp = data->GetTimeStamp();
144  fDataPrim[i].fOldEventNr = currentEventNr;
145  fDataPrim[i].fEventMixture = kFALSE;
146 
147  }
148  }
149  }
150  }
151 }
152 
153 // -------------------------------------------------------------------------
154 
156 {
157  // fOutputArray->Delete();
158 }
159 
161 {
162  for (size_t i = 0; i < fData.size(); i++){
163  fData[i].fTimeHisto->Write();
164  fData[i].fEventHisto->Write();
165  for (std::map<Int_t, std::pair<Double_t, Double_t> >::iterator iter = fData[i].fEventStartStopMap.begin(); iter != fData[i].fEventStartStopMap.end(); iter++) {
166  fData[i].fEventDiffHisto->Fill(iter->second.second - iter->second.first);
167  }
168  fData[i].fEventDiffHisto->Write();
169  fData[i].FillGraphs();
170  fData[i].fEventGap->Write();
171  fData[i].fOverlap->Write();
172 
173  fData[i].fEventGapPerc->Write();
174  fData[i].fOverlapPerc->Write();
175 
176  fDataPrim[i].fTimeHisto->Write();
177  fDataPrim[i].fEventHisto->Write();
178  for (std::map<Int_t, std::pair<Double_t, Double_t> >::iterator iter = fDataPrim[i].fEventStartStopMap.begin(); iter != fDataPrim[i].fEventStartStopMap.end(); iter++) {
179  fDataPrim[i].fEventDiffHisto->Fill(iter->second.second - iter->second.first);
180  }
181  fDataPrim[i].fEventDiffHisto->Write();
182  fDataPrim[i].FillGraphs();
183  fDataPrim[i].fEventGap->Write();
184  fDataPrim[i].fOverlap->Write();
185 
186  fDataPrim[i].fEventGapPerc->Write();
187  fDataPrim[i].fOverlapPerc->Write();
188  }
189  fHistoMixedEvents->Write();
190  fHistoMixedEventsPrim->Write();
191 }
192 
std::vector< DataObject > fData
Int_t i
Definition: run_full.C:25
std::vector< DataObject > fDataPrim
PndTransMap * map
Definition: sim_emc_apd.C:99
virtual void Exec(Option_t *opt)
ClassImp(PndTimeStructureAnaTask)
Int_t GetMotherID() const
Definition: PndMCTrack.h:74