FairRoot/PandaRoot
PndEmcCorrBump.cxx
Go to the documentation of this file.
1 //---------------------------------------------------------------------
2 // File and Version Information:
3 // $Id: $
4 //
5 // Description:
6 // This object constructs a list of clusters from a list of digis.
7 // This module use a simple algorithm.
8 // Digis which are in a Cluster are add to this cluster.
9 // If a Digi is in more than one cluster, the clusters are merged.
10 // Digis are added to the cluster if they have an energy above
11 // _digiEnergyTreshold->value().
12 //
13 // Environment:
14 // Software developed for the PANDA Detector at GSI.
15 //
16 // Author List:
17 // Jan Zhong //------------------------------------------------------------------------
18 
19 #include "PndEmcCorrBump.h"
20 #include <assert.h>
21 #include "PndEmcXClMoments.h"
22 #include "PndEmcStructure.h"
23 #include "PndEmcMapper.h"
24 #include "PndEmcGeoPar.h"
25 #include "PndEmcDigiPar.h"
26 #include "PndEmcRecoPar.h"
27 #include "PndEmcCluster.h"
28 #include "PndEmcDigi.h"
29 #include "PndEmcBump.h"
30 #include "PndEmcSharedDigi.h"
31 #include "PndMCTrack.h"
33 #include "FairRootManager.h"
34 #include "FairRunAna.h"
35 #include "FairRuntimeDb.h"
36 #include "PndEmcDigiCalibrator.h"
37 #include "TClonesArray.h"
38 #include "TStopwatch.h"
39 #include "TROOT.h"
40 
41 #include <iostream>
42 //#include <vector>
43 //#include <set>
44 
45 using std::cout;
46 using std::endl;
47 
49 
50 //Double_t::PndEmcCorrBump::fTimeWindowOfShowerDigi[5][17]={
52 // 22., 15., 9.8, 5.7, 3.0, 2.0, 1.6, 1.3, 1.0, 0.9, 0.8, 0.7, 0.5, 0.3, 0.2, 0.16, 0.14,/*mod=1*/
53 // 22., 15., 9.8, 5.7, 3.0, 2.0, 1.6, 1.3, 1.0, 0.9, 0.8, 0.7, 0.5, 0.3, 0.2, 0.16, 0.14,/*mod=2*/
54 // 7.0, 5.0, 3.6, 2.2, 1.2, 0.8, 0.7, 0.6, 0.5, 0.45,0.38,0.36, 0.27, 0.2, 0.20,0.20, 0.20,/*mod=3*/
55 // 22., 15., 9.8, 5.7, 3.0, 2.0, 1.6, 1.3, 1.0, 0.9, 0.8, 0.7, 0.5, 0.3, 0.2, 0.16, 0.14,/*mod=4*/
56 // 2.3, 1.8, 1.3, 0.9, 0.6, 0.4, 0.3, 0.3, 0.3, 0.3, 0.25,0.25, 0.25, 0.25, 0.25, 0.25, 0.25/*mod=5*/
57 //};
58 //Double_t::PndEmcCorrBump::fTimeWindowOfSeedDigi[5][17]={
60 // 14., 14., 9.4, 4.7, 3.0, 2.1, 1.6, 1.3, 1.1, 0.9, 0.8, 0.7, 0.5, 0.3, 0.2, 0.16, 0.14,/*mod=1*/
61 // 14., 14., 9.4, 4.7, 3.0, 2.1, 1.6, 1.3, 1.1, 0.9, 0.8, 0.7, 0.5, 0.3, 0.2, 0.16, 0.14,/*mod=2*/
62 // 7.0, 5.0, 3.6, 2.2, 1.2, 0.8, 0.7, 0.6, 0.5, 0.45,0.38,0.36, 0.27, 0.2, 0.20,0.20, 0.20,/*mod=3*/
63 // 14., 14., 9.4, 4.7, 3.0, 2.1, 1.6, 1.3, 1.0, 0.9, 0.8, 0.7, 0.5, 0.3, 0.2, 0.16, 0.14,/*mod=4*/
64 // 2.3, 1.8, 1.3, 0.9, 0.6, 0.4, 0.3, 0.3, 0.3, 0.3, 0.25,0.25, 0.25, 0.25, 0.25, 0.25, 0.25/*mod=5*/
65 //};
66 
67 std::ostream& operator<<(std::ostream& os, const TVector3& pos)
68 {
69  os<<"("<<pos[0]<<','<<pos[1]<<','<<pos[2]<<")";
70  return os;
71 }
72 
74 fDigiArray(0), fSharedDigiArray(0), fBumpArray(0), fMapVersion(0), fGeoPar(new PndEmcGeoPar()), fDigiPar(new PndEmcDigiPar()), fRecoPar(new PndEmcRecoPar()), fVerbose(verbose), fStoreClusters(storeclusters)
75 {
76 }
77 
78 //--------------
79 // Destructor --
80 //--------------
81 
83 {
84 }
85 
86 // ----- Public method Init -------------------------------
87 InitStatus PndEmcCorrBump::Init()
88 {
90  // Get RootManager
91  FairRootManager* ioman = FairRootManager::Instance();
92  if ( ! ioman )
93  {
94  cout << "-E- PndEmcCorrBump::Init: "
95  << "RootManager not instantiated!" << endl;
96  return kFATAL;
97  }
98 
99  // Get input array
100  fDigiArray = dynamic_cast<TClonesArray *>(ioman->GetObject("EmcDigi"));
101  if ( ! fDigiArray ) {
102  cout << "-W- PndEmcCorrBump::Init: "
103  << "No PndEmcDigi array!" << endl;
104  return kERROR;
105  }
106  // Get input array
107  fSharedDigiArray =dynamic_cast<TClonesArray *> ( ioman->GetObject("EmcSharedDigi"));
108  if ( ! fSharedDigiArray ) {
109  cout << "-W- PndEmcCorrBump::Init: "
110  << "No PndEmcSharedDigi array!" << endl;
111  return kERROR;
112  }
113 
114  // Get input array
115  fBumpArray = dynamic_cast<TClonesArray *> (ioman->GetObject("EmcBump"));
116  if ( ! fBumpArray ) {
117  cout << "-W- PndEmcCorrBump::Init: "
118  << "No EmcBump array!" << endl;
119  return kERROR;
120  }
121  fBumpArrayTBD = new TClonesArray("PndEmcBump");
122 
123  if (!strcmp(fRecoPar->GetEmcClusterPosMethod(),"lilo"))
124  {
125  cout<<"Lilo cluster position method"<<endl;
129  }
130 
131  HowManyDigi = 0;
132  HowManyCluster = 0;
133 
134  cout << "-I- PndEmcCorrBump: Intialization successfull" << endl;
135 
136  return kSUCCESS;
137 }
138 
139 
140 void PndEmcCorrBump::Exec(Option_t*)
141 {
142  TStopwatch timer;
143  if (fVerbose>2){
144  timer.Start();
145  }
146  // Reset output array
147  if ( ! fBumpArray ) Fatal("Exec", "No Bump Array");
148 
149  Double_t fEventTime = FairRootManager::Instance()->GetEventTime();
150  if (fVerbose>0){
151  Int_t nDigis = fDigiArray->GetEntriesFast();
152  Int_t nSharedDigis = fSharedDigiArray->GetEntriesFast();
153  cout<<"*************************PndEmcCorrBump*****************************"<<endl;
154  cout<<"Event NO. #"<<fEventCounter<<", EventTime#"<<fEventTime
155  <<", Digis#"<<nDigis<<", SharedDigis#"<<nSharedDigis<<endl;
156  cout<<"********************************************************************"<<endl;
157  cout<<"Before correction, bumps#"<<fBumpArray->GetEntriesFast()
158  <<", BumptoBeDetermined #"<<fBumpArrayTBD->GetEntriesFast()
159  <<", DigitoBeDetermined #"<<PndEmcDigi::fDigiArrayTBD->GetEntriesFast()<<endl;
160  cout<<"********************************************************************"<<endl;
161  //cout<<"------------> fDigiArray#"<<fDigiArray->GetEntriesFast()<<endl;
162  //for(Int_t iDigi=0; iDigi < fDigiArray->GetEntriesFast(); ++iDigi){
163  // PndEmcDigi* theDigi = (PndEmcDigi*)fDigiArray->At(iDigi);
164  // theDigi->Print();
165  // cout<<endl;
166  //}
167  //cout<<"------------> fSharedDigiArray#"<<fSharedDigiArray->GetEntriesFast()<<endl;
168  //for(Int_t iDigi=0; iDigi < fSharedDigiArray->GetEntriesFast(); ++iDigi){
169  // PndEmcSharedDigi* theDigi = (PndEmcSharedDigi*)fSharedDigiArray->At(iDigi);
170  // theDigi->Print();
171  // cout<<endl;
172  //}
173  //if(fSharedDigiArray->GetEntriesFast() != fDigiArray->GetEntriesFast())
174  // cout<<"fSharedDigiArray.size() - fDigiArray.size() ##="<<(fDigiArray->GetEntriesFast()-fSharedDigiArray->GetEntriesFast())<<endl;
175  }
176  //merge buffer bumps into current fBumpArray
177  //Int_t nBumpTBD = fBumpArrayTBD->GetEntriesFast();
178  //for(Int_t ibump = 0; ibump < nBumpTBD; ++ibump ){
179  // PndEmcBump* copy = (PndEmcBump*)fBumpArrayTBD->At(ibump);
180  // new ((*fBumpArray)[nBump++]) PndEmcBump(*copy);
181  //}
182  //fBumpArrayTBD->Delete();
183 
184  //variabes definition
185  std::vector<PndEmcBump*> taggedBumpofToBeDeleted;
186  PndEmcDigi* seedDigi(0);
187  Double_t EnergyOfSeedDigi(-1.), fTimeError(0.), CalibTimeOfaDigi(0.), CalibTimeOfSeedDigi(0.);
188  Int_t TheIndexOfModule;//TheIndexOfEnergy, //[R.K. 01/2017] unused variable?
189  Int_t iDigi = PndEmcDigi::fDigiArrayTBD->GetEntriesFast();
190  Int_t iBump = 0;
191  Bool_t isBumpOK = kTRUE;
192  for(iBump=0; iBump< fBumpArray->GetEntriesFast(); ++iBump)
193  {
194  EnergyOfSeedDigi = -1.;
195  //isBumpOK = kTRUE;
196  PndEmcBump* theBump = (PndEmcBump*)fBumpArray->At(iBump);
197  //find the seed digi with maximum energy
198  const std::vector<Int_t>& listOfDigi = theBump->DigiList();
199  for(size_t id=0;id <listOfDigi.size();++id){
200  PndEmcDigi* theDigi = (PndEmcDigi*)fSharedDigiArray->At(listOfDigi[id]);
201  if(theDigi->GetEnergy() > EnergyOfSeedDigi){
202  seedDigi = theDigi;
203  EnergyOfSeedDigi = theDigi->GetEnergy();
204  }
205  if(fVerbose>1){
206  theDigi->Print();
207  CalibTimeOfaDigi = digiCalibrator.CalibrationEvtTimeByDigi(theDigi, kFALSE);
208  cout<<", CalibrationTimeOfEvent#"<<CalibTimeOfaDigi<<endl;
209  }
210  }
211  theBump->SetEventNo(seedDigi->fEvtNo);
212  //check current bump belongs to current event by event time
213  fTimeError = digiCalibrator.GetTimeResolutionOfDigi(seedDigi);
214  CalibTimeOfSeedDigi = digiCalibrator.CalibrationEvtTimeByDigi(seedDigi, kFALSE);
215  if( CalibTimeOfSeedDigi - fEventTime < 5.*fTimeError){//out of region
216  isBumpOK = kTRUE;
217  }else{
218  taggedBumpofToBeDeleted.push_back(theBump);
219  isBumpOK = kFALSE;
220  }
221  if(fVerbose>0){
222  std::cout<<"Bump["<<iBump<<"], (Nd, E, Es, CalT, EvtT, TimeR, EvtNo)=("
223  <<listOfDigi.size()
224  <<", "<<theBump->energy()
225  <<", "<<EnergyOfSeedDigi
226  <<", "<<CalibTimeOfSeedDigi
227  <<", "<<fEventTime
228  <<", "<<fTimeError
229  <<", "<<seedDigi->fEvtNo//theBump->where()
230  <<") ... ";
231  cout<<(isBumpOK ? "[ OK ]" : "[ Veto ]")<<endl;
232  }
233 
234 
235  //remove digis those time out of region compared to time of seed digi.
236  if(isBumpOK)
237  {
238  Double_t WeightedFactor = 0.;
239  Bool_t DigiStatus = kTRUE;
240  for(size_t id=0;id <listOfDigi.size();++id){
241  PndEmcDigi* theDigi = (PndEmcDigi*)fSharedDigiArray->At(listOfDigi[id]);
242  CalibTimeOfaDigi = digiCalibrator.CalibrationEvtTimeByDigi(theDigi, kFALSE);
243  fTimeError = digiCalibrator.GetTimeResolutionOfDigi(theDigi);
244  if(CalibTimeOfaDigi - CalibTimeOfSeedDigi < 5.*fTimeError )
245  {//time ok
246  if(TMath::Abs(CalibTimeOfaDigi - CalibTimeOfSeedDigi) < 3.*fTimeError){
247  WeightedFactor += 1./fTimeError/fTimeError;
248  }
249  DigiStatus = kTRUE;
250  }else{
251  theBump->removeDigi(fSharedDigiArray, listOfDigi[id]);
252  //save digis to a buffer for analysis in next event
253  //if(CalibTimeOfaDigi - CalibTimeOfSeedDigi > 5.*fTimeError)
254  new((*PndEmcDigi::fDigiArrayTBD)[iDigi++]) PndEmcDigi(*theDigi);
255  DigiStatus = kFALSE;
256  }
257  if(fVerbose>0){
258  TheIndexOfModule = theDigi->GetModule();
259  cout<<"Digi["<<id<<"] of bump["<<iBump<<"], (E, Mod, CalT, EvtT, SigmaT, EvtNO) = ("
260  <<theDigi->GetEnergy()
261  <<", "<<TheIndexOfModule
262  <<", "<<CalibTimeOfaDigi
263  <<", "<<fEventTime
264  <<", "<<fTimeError
265  <<", "<<theDigi->fEvtNo
266  <<(DigiStatus == kTRUE ? ") ... [ OK ]": ") ... [ Veto ]")<<endl;
267  //theDigi->Print();
268  //cout<<endl;
269  }
270  }
271  }
272  }
273  //remove tagged bumps
274  for(size_t ix=0;ix <taggedBumpofToBeDeleted.size();++ix){
275  const std::vector<Int_t>& listOfDigi = taggedBumpofToBeDeleted[ix]->DigiList();
276  //copy all digis of this bump to the buffer PndEmcDigi::fDigiArrayTBD;
277  for(size_t id=0;id <listOfDigi.size();++id){
278  PndEmcDigi* theDigi = (PndEmcDigi*)fSharedDigiArray->At(listOfDigi[id]);
279  new((*PndEmcDigi::fDigiArrayTBD)[iDigi++]) PndEmcDigi(*theDigi);
280  }
281  fBumpArray->Remove(taggedBumpofToBeDeleted[ix]);
282  fBumpArray->Compress();
283  }
284 
285  if(fVerbose > 0){
286  cout<<"******************************************************"<<endl;
287  cout<<"After correction, bumps#"<<fBumpArray->GetEntriesFast()
288  <<", BumptoBeDetermined #"<<fBumpArrayTBD->GetEntriesFast()
289  <<", DigitoBeDetermined #"<<PndEmcDigi::fDigiArrayTBD->GetEntriesFast()<<endl;
290  cout<<"**********************PndEmcCorrBump******************"<<endl;
291  }
292  //remake bump
293  for (Int_t i=0; i<fBumpArray->GetEntriesFast(); i++){
294  PndEmcBump *tmpbump = (PndEmcBump*) fBumpArray->At(i);
295  PndEmcClusterProperties clusterProperties(*tmpbump, fSharedDigiArray);
296  HowManyDigi += tmpbump->NumberOfDigis();
297 
298  if (!tmpbump->IsEnergyValid())
299  tmpbump->SetEnergy(clusterProperties.Energy());
300  if (!tmpbump->IsPositionValid())
301  tmpbump->SetPosition(clusterProperties.Where(fRecoPar->GetEmcClusterPosMethod(), fClusterPosParam));
302  PndEmcXClMoments xClMoments(*tmpbump, fSharedDigiArray);
303  tmpbump->SetZ20(xClMoments.AbsZernikeMoment(2, 0, 15));
304  tmpbump->SetZ53(xClMoments.AbsZernikeMoment(5, 3, 15));
305  tmpbump->SetLatMom(xClMoments.Lat());
306  }
307  HowManyCluster += fBumpArray->GetEntriesFast();
308 
309  fEventCounter++;
310  if (fVerbose>2){
311  timer.Stop();
312  Double_t rtime = timer.RealTime();
313  Double_t ctime = timer.CpuTime();
314  cout << "PndEmcCorrBump, Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
315  }
316 }
317 
318 // Helper function, does not depend on class, identical to the one in PndEmcHitProducer
319 
321 
322  // Get run and runtime database
323  FairRun* run = FairRun::Instance();
324  if ( ! run ) Fatal("SetParContainers", "No analysis run");
325 
326  FairRuntimeDb* db = run->GetRuntimeDb();
327  if ( ! db ) Fatal("SetParContainers", "No runtime database");
328 
329  // Get Emc geometry parameter container
330  fGeoPar = (PndEmcGeoPar*) db->getContainer("PndEmcGeoPar");
331 
332  // Get Emc digitisation parameter container
333  fDigiPar = (PndEmcDigiPar*) db->getContainer("PndEmcDigiPar");
334 
335  // Get Emc reconstruction parameter container
336  fRecoPar = (PndEmcRecoPar*) db->getContainer("PndEmcRecoPar");
337 }
338 
340 {
342  return;
343 }
345 {
346  std::cout<<"*********************************************************"<<std::endl;
347  std::cout<<"PndEmcCorrBump::FinishTask"<<std::endl;
348  std::cout<<"*********************************************************"<<std::endl;
349  std::cout<<"Read digis# "<<HowManyDigi<<std::endl;
350  std::cout<<"Produce cluster# "<<HowManyCluster<<std::endl;
351  std::cout<<"*********************************************************"<<std::endl;
352 }
353 
TVector3 pos
void SetEnergy(Double_t en)
int fVerbose
Definition: poormantracks.C:24
static TClonesArray * fDigiArrayTBD
Definition: PndEmcDigi.h:52
Int_t run
Definition: autocutx.C:47
virtual InitStatus Init()
virtual Double_t GetEnergy() const
Definition: PndEmcDigi.cxx:296
represents the reconstructed hit of one emc crystal
Definition: PndEmcDigi.h:40
Int_t i
Definition: run_full.C:25
Double_t CalibrationEvtTimeByDigi(PndEmcDigi *theDigi, bool PrintOut=kFALSE) const
Double_t val[nBoxes][nFEBox]
Definition: createCalib.C:11
virtual Double_t Lat() const
#define verbose
void SetEventNo(Int_t evtNo)
Definition: PndEmcBump.h:57
bool IsEnergyValid() const
Definition: PndEmcCluster.h:77
TVector3 Where(TString method, std::vector< Double_t > params)
const std::vector< Int_t > & DigiList() const
Definition: PndEmcCluster.h:40
std::ostream & operator<<(std::ostream &o, const PndEventInfo &a)
virtual Double_t AbsZernikeMoment(int n, int m, Double_t R0=15) const
Double_t GetOffsetParmB()
Definition: PndEmcRecoPar.h:22
Double_t GetOffsetParmC()
Definition: PndEmcRecoPar.h:23
static void InitDigiArrayTBD()
Definition: PndEmcDigi.cxx:89
Short_t GetModule() const
Definition: PndEmcDigi.h:103
TClonesArray * fDigiArray
virtual void SetParContainers()
PndEmcDigiCalibrator digiCalibrator
static Int_t fEventCounter
static T Abs(const T &x)
Definition: PndCAMath.h:39
void SetStorageOfData(Bool_t val)
Double_t
Bool_t fStoreClusters
TStopwatch timer
Definition: hit_dirc.C:51
parameter set of Emc digitisation
Definition: PndEmcDigiPar.h:12
std::vector< Double_t > fClusterPosParam
PndEmcRecoPar * fRecoPar
virtual void removeDigi(const TClonesArray *digiArray, Int_t iDigi)
Double_t GetOffsetParmA()
Definition: PndEmcRecoPar.h:21
TClonesArray * fSharedDigiArray
virtual void Exec(Option_t *opt)
Double_t ctime
Definition: hit_dirc.C:114
PndEmcCorrBump(Int_t verbose=0, Bool_t storeclusters=kTRUE)
void SetZ20(Double_t z20)
Int_t NumberOfDigis() const
virtual Double_t Energy() const
void SetZ53(Double_t z53)
Int_t fEvtNo
Definition: PndEmcDigi.h:118
bool IsPositionValid() const
Definition: PndEmcCluster.h:78
PndEmcGeoPar * fGeoPar
virtual Double_t energy() const
ClassImp(PndAnaContFact)
TClonesArray * fBumpArray
void SetPosition(TVector3 pos)
virtual void Print(const Option_t *opt="") const
Definition: PndEmcDigi.cxx:337
Double_t GetTimeResolutionOfDigi(PndEmcDigi *theDigi) const
Text_t * GetEmcClusterPosMethod()
Definition: PndEmcRecoPar.h:20
Double_t rtime
Definition: hit_dirc.C:113
TClonesArray * fBumpArrayTBD
void SetLatMom(Double_t latMom)
represents a reconstructed (splitted) emc cluster
Definition: PndEmcBump.h:34
PndEmcDigiPar * fDigiPar
Parameter set for Emc Reco.
Definition: PndEmcRecoPar.h:12
virtual ~PndEmcCorrBump()