HYDRA_development_version
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
hemcclusterf.cc
Go to the documentation of this file.
1 using namespace std;
2 #include "hemcclusterf.h"
3 #include "hdebug.h"
4 #include "hades.h"
5 #include "hiterator.h"
6 #include "hruntimedb.h"
7 #include "hspectrometer.h"
8 #include "hemcdetector.h"
9 #include "hgeantemc.h"
10 #include "hevent.h"
11 #include "hcategory.h"
12 #include "hemccalsim.h"
13 #include "hemcclustersim.h"
14 #include "rpcdef.h"
15 #include "hrpcclustersim.h"
16 #include "hrpchitsim.h"
17 #include "hemcgeompar.h"
18 #include "hgeomtransform.h"
19 #include "hgeomcompositevolume.h"
20 #include "hgeomvolume.h"
21 #include "hgeomvector.h"
22 #include <iostream>
23 #include <iomanip>
24 
25 //*-- Author : V. Pechenov
26 //*-- Modified : R. Lalik (07.05.2018)
27 
28 /////////////////////////////////////////////////////////////////////
29 //
30 // HEmcClusterF combines neighboring time correlated cells to the cluster,
31 // matches cells to RPC,
32 // calculates cluster mean time (by corrected times)
33 // In simulation the cluster is assigned to the track which has maximal energy deposit
34 //
35 // Algorithm
36 // "0": find cell which has maximal energy deposit (t0 is a time of this cell)
37 // "1": test 8 neighboring cells and add time correlated cells to the cluster
38 // "2": test cells neighboring to added ones in the previous step
39 // "3": test cells neighboring to added ones in the previous step
40 // ...
41 //
42 // Time Correlation
43 // Assumption: first cell fired by this particle has maximal energy deposit
44 // dt0 = tc - V*dc - t0
45 // dt = (tc - V*dc) - (tp - V*dp) ,
46 // where
47 // V = 0.30 ns/cell
48 // cells "c" and "p" are neighboring cells
49 // dc and dp are distances to the cell which has maximal energy deposit (cell from step "0"), units are cells
50 // tc and tp are measured times in cells "c" and "p"
51 // Cells accepted for the cluster must fulfill conditions
52 // dtmin < dt0 < dtmax
53 // &&
54 // dtmin < dt < dtmax
55 //
56 // Matching to RPC
57 // Matching by theta, phi and time
58 // Cluster is marked as matched with RPC if at least one cell in the steps "0" and "1" has a matching with RPC
59 //
60 /////////////////////////////////////////////////////////////////////
61 
63  initData();
64 }
65 
66 HEmcClusterF::HEmcClusterF(const Text_t *name, const Text_t *title) : HReconstructor(name,title) {
67  initData();
68 }
69 
71  fLoc.set(2,0,0);
72  fEmcCalCat = NULL;
73  fClusterCat = NULL;
74  // RPC matching parameters:
75  dThetaSigOffset = 0.1; // (thetaEmc-thetaRpc)/sigmaDTheta+dThSigOffset
76  dThetaScale = 1.61; // dTheta = dThetaSigOffset/dThetaScale
77  dTimeOffset = 0.03; // [ns] (time1 - timeRpcN + dTimeOffset)/sigmaDTof;
78  dTimeCut = 3.; // Nsigma cut for matchin in time
79  dThdPhCut = 3.6; // Nsigma cut for matching in angles
80  dTimeCutNS = 0.; // [ns] cut for the matchin in time if dTimeCutNS > 0 dTimeCut will not used
81  // Cluster finder parameters:
82  cellToCellSpeed = 0.3; // [ns/cell]
83  distOffset = 0.9;
84  timeCutMin = -0.6;
85  timeCutMax = +0.6;
86  addEnergy = 0.;
87  energyCut = 0.;
88  for(Int_t s=0;s<6;s++) {
89  for(Int_t c=0;c<emcMaxComponents;c++) emcCellsLab[s][c] = NULL;
90  }
91 }
92 
94 }
95 
96 Bool_t HEmcClusterF::init(void) {
97 
98  gHades->getRuntimeDb()->getContainer("EmcGeomPar");
99 
100  HEmcDetector* emc = (HEmcDetector*)(gHades->getSetup()->getDetector("Emc"));
101  if (emc == NULL) {
102  Error("HEmcClusterF::init()","No Emc Detector");
103  return kFALSE;
104  }
105 
106  HCategory* fGeantKineCat = gHades->getCurrentEvent()->getCategory(catGeantKine);
107  if (fGeantKineCat) { isSimulation = kTRUE; }
108  else { isSimulation = kFALSE; }
109 
111  if (!fEmcCalCat) {
112  Error("HEmcClusterF::init()","Cal EMC input missing");
113  return kFALSE;
114  }
115 
117  if (!fRpcCat) {
118  Warning("HEmcClusterF::init()","Cluster RPC input missing");
119  return kFALSE;
120  }
121 
122  //Build the Cluster category
124  if (!fClusterCat) {
125  if(isSimulation) { fClusterCat = emc->buildMatrixCategory("HEmcClusterSim",0.5); }
126  else { fClusterCat = emc->buildMatrixCategory("HEmcCluster",0.5); }
128  fClusterCat->setPersistency(kTRUE);
129  }
130 
131  return kTRUE;
132 }
133 
134 Bool_t HEmcClusterF::reinit(void) {
135  sigmaXYmod = 92./TMath::Sqrt(12.); // 92.mm - size of cell (module)
136  HEmcGeomPar *emcGeomPar = (HEmcGeomPar*)(gHades->getRuntimeDb()->getContainer("EmcGeomPar"));
137  HGeomTransform labTrans[6];
138  for(Int_t s=0;s<6;s++) {
139  HModGeomPar* fmodgeom = emcGeomPar->getModule(s);
140  labTrans[s] = fmodgeom->getLabTransform();
141  HGeomCompositeVolume* fMod = fmodgeom->getRefVolume();
142  for(Int_t c=0;c<emcMaxComponents;c++) {
143  HGeomVolume* fVol=fMod->getComponent(c);
144  if(fVol == NULL || fVol->getNumPoints() != 8) {
145  thetaEmcLab[s][c] = 0.;
146  phiEmcLab[s][c] = 0.;
147  sigmaTheta[s][c] = 0.;
148  sigmaPhi[s][c] = 0.;
149  if(emcCellsLab[s][c] != NULL) delete emcCellsLab[s][c];
150  emcCellsLab[s][c] = NULL;
151  continue;
152  }
153  if(emcCellsLab[s][c] == NULL) emcCellsLab[s][c] = new HGeomVector;
154  HGeomVector* p = emcCellsLab[s][c];
155  *p = fVol->getTransform().getTransVector();
156  cellXmod[c] = p->getX();
157  cellYmod[c] = p->getY();
158  *p = labTrans[s].transFrom(*p);
159 
160  // Calc. theta and phi of module(cell)
161  Double_t xy2 = p->getX()*p->getX() + p->getY()*p->getY();
162  Double_t xyz2 = xy2 + p->getZ()*p->getZ();
163  thetaEmcLab[s][c] = TMath::ATan2(TMath::Sqrt(xy2),p->getZ())*TMath::RadToDeg();
164  phiEmcLab[s][c] = TMath::ATan2(p->getY(),p->getX())*TMath::RadToDeg();
165  if(phiEmcLab[s][c] < 0.) phiEmcLab[s][c] += 360.;
166 
167  // Calc. errors of theta and phi
168  sigmaTheta[s][c] = p->getZ()/xyz2 * sigmaXYmod * TMath::RadToDeg();
169  sigmaPhi[s][c] = 1./TMath::Sqrt(xy2) * sigmaXYmod * TMath::RadToDeg();
170  }
171  }
172  return kTRUE;
173 }
174 
176  Int_t nEmcCal = fEmcCalCat->getEntries();
177  for(Int_t sec=0;sec<6;sec++) {
178  HEmcCalSim * calsim = 0;
179  memset(flagUsed,-1,emcMaxComponents);
180 
181  // Collect HEmcCal in one sector
182  for(Int_t e=0; e<nEmcCal; e++) {
183  HEmcCal* cal = (HEmcCal*)fEmcCalCat->getObject(e);
184  if(sec != cal->getSector()) continue;
185  // Test status:
186  if(cal->getStatus() < 0) continue; // Energy < energyCut for sim.data
187  Float_t ener = cal->getEnergy() + addEnergy;
188  if(ener <= energyCut) continue;
189 
190  Int_t cell = cal->getCell();
191  energy[cell] = ener;
192  pSecECells[cell] = cal;
193  flagUsed[cell] = 0;
194  }
195 
196  //======== Cluster finder: ========================
197  while(kTRUE) {
198  Int_t cell = maxEnergyCell();
199  if(cell < 0) break; // all fired cells was used already
200 
201  //======== New cluster: ========================
202  HEmcCal *cal = pSecECells[cell];
203  calsim = dynamic_cast<HEmcCalSim*>(cal);
204 
205  HGeomVector *pemc = emcCellsLab[sec][cell];
206  HGeomVector pos(pemc->getX(),pemc->getY(),pemc->getZ());
207  pos *= energy[cell];
208  Float_t posNorm = energy[cell];
209  Float_t xPos = cellXmod[cell]*energy[cell];
210  Float_t yPos = cellYmod[cell]*energy[cell];
211  Float_t errXYPos = energy[cell]*energy[cell];
212  Float_t time0 = cal->getTime();
213  Float_t clustEnergy = energy[cell];
214  Float_t clustEnErr = calsim==NULL ? 0. : TMath::Power(calsim->getSigmaEnergy(),2);
215  Float_t timeSum = time0*energy[cell];
216  Float_t timeError = calsim==NULL ? 0. : TMath::Power(calsim->getSigmaTime()*energy[cell],2);
217 
218  Float_t qualityDThDPh,qualityDTime;
219  HRpcCluster* pRpcClusF = rpcMatch(cal,qualityDThDPh,qualityDTime);
220  Int_t nMatchedCells = pRpcClusF==NULL ? 0 : 1;
221 
222  listClustCell[0] = cell;
223  pClustCells[0] = cal;
224  flagUsed[cell] = 1;
225  Int_t size = 1;
226  Int_t ind = 0;
227 
228  while(ind<size) {
229  Int_t cind = listClustCell[ind];
230  Float_t distN = ind==0 ? 0. : calcDist(cal,pClustCells[ind]); // dist. max.ener.cell->curr.cell
231  Float_t tCorrN = pClustCells[ind]->getTime();
232  if(ind > 0) tCorrN -= cellToCellSpeed*(distN - distOffset);
233 
234  // Test nearby cells: -------------------------------------
235  for(Int_t i=0;i<8;i++) {
236  Int_t celli = getNearbyCell(cind,i);
237  if(celli < 0) continue;
238  if( flagUsed[celli] != 0 ) continue; // skip cells wich were used already
239  HEmcCal *cali = pSecECells[celli];
240  if(cali == NULL) continue;
241 
242  Float_t dist0 = calcDist(cal,cali); // dist. max.ener.cell->curr.cell
243  Float_t tCorrI = cali->getTime() - cellToCellSpeed*(dist0 - distOffset);
244  Float_t dT0corr = tCorrI - time0;
245  if(dT0corr < timeCutMin || dT0corr > timeCutMax) continue; // 0.6
246  if(ind > 0) {
247  Float_t dTcorr = tCorrI - tCorrN;
248  if(dTcorr < timeCutMin || dTcorr > timeCutMax) continue;
249  }
250  //======== Add to cluster ========================
251 
252  if(isSimulation) {
253  HEmcCalSim *calsim = dynamic_cast<HEmcCalSim*>(cali);
254  clustEnErr += calsim->getSigmaEnergy()*calsim->getSigmaEnergy();
255  timeError += TMath::Power(calsim->getSigmaTime()*energy[celli],2);
256  }
257  if(dist0<1.9) { // Use cells nearby to max.ener.cell only
258  HGeomVector *pemc = emcCellsLab[sec][celli];
259  HGeomVector vc(pemc->getX(),pemc->getY(),pemc->getZ());
260  vc *= energy[celli];
261  pos += vc;
262  posNorm += energy[celli];
263  xPos += cellXmod[celli]*energy[celli];
264  yPos += cellYmod[celli]*energy[celli];
265  errXYPos += energy[celli]*energy[celli];
266  }
267  timeSum += tCorrI*energy[celli];
268  clustEnergy += energy[celli];
269  flagUsed[celli] = 1;
270  listClustCell[size] = celli;
271  pClustCells[size] = cali;
272 
273  // Test RPC matching ----------------------------
274  Float_t qualityDThDPhI,qualityDTimeI;
275  HRpcCluster* pRpcClus = rpcMatch(cali,qualityDThDPhI,qualityDTimeI);
276  if(pRpcClus != NULL) {
277  if(pRpcClus == pRpcClusF) nMatchedCells++;
278  else if(dist0 < 1.9) {
279  nMatchedCells++;
280  if(pRpcClusF == NULL) {
281  pRpcClusF = pRpcClus;
282  qualityDThDPh = qualityDThDPhI;
283  qualityDTime = qualityDTimeI;
284  }
285  }
286  }
287  //-----------------------------------------------
288  size++;
289  }
290  ind++;
291  } //cluter end
292 
293 
294  timeSum /= clustEnergy;
295  timeError = TMath::Sqrt(timeError)/clustEnergy;
296  xPos /= posNorm;
297  yPos /= posNorm;
298  pos /= posNorm;
299  errXYPos = sigmaXYmod*TMath::Sqrt(errXYPos)/posNorm;
300 
301 //--------------------------------------------------------------------------------------
302  // end of cluster
303  fLoc[0] = sec;
304  fLoc[1] = cell;
305  Int_t clustIndex;
306  HEmcCluster* pCluster = (HEmcCluster*)fClusterCat->getSlot(fLoc,&clustIndex);
307  if(pCluster == NULL) {
308  Warning("execute","S.%i No HEmcCluster slot available",sec+1);
309  return 1;
310  }
311 
312  for(Int_t s=0;s<size;s++) pClustCells[s]->setClusterIndex(clustIndex);
313  pCluster = isSimulation ? (HEmcCluster*)(new(pCluster) HEmcClusterSim) : new(pCluster) HEmcCluster;
314  pCluster->setSector(sec);
315  pCluster->setCellList(size,listClustCell);
316  pCluster->setIndex(clustIndex);
317  pCluster->setMaxEnergy(energy[cell]);
318  pCluster->setTime(timeSum);
319  pCluster->setEnergy(clustEnergy);
320  HEmcClusterSim * clsim = dynamic_cast<HEmcClusterSim*>(pCluster);
321  if (clsim)
322  {
323  clsim->setSigmaEnergy(TMath::Sqrt(clustEnErr));
324  clsim->setSigmaTime(timeError);
325  }
326  pCluster->setXYMod(xPos,yPos);
327  pCluster->setSigmaXYMod(errXYPos);
328  pCluster->setXYZLab(pos.getX(),pos.getY(),pos.getZ());
329  Double_t xy = TMath::Sqrt(pos.getX()*pos.getX() + pos.getY()*pos.getY());
330  Double_t theta = TMath::ATan2(xy,pos.getZ())*TMath::RadToDeg();
331  Double_t phi = TMath::ATan2(pos.getY(),pos.getX())*TMath::RadToDeg();
332  if(phi < 0.) phi += 360.;
333  pCluster->setTheta(theta);
334  pCluster->setPhi(phi);
335  pCluster->setCellList(size,listClustCell);
336  if(pRpcClusF != NULL) {
337  pCluster->setRpcIndex(pRpcClusF->getIndex());
338  pCluster->setQualDThDPh(qualityDThDPh);
339  pCluster->setQualDTime(qualityDTime);
340  pCluster->setNMatchedCells(nMatchedCells);
341  }
342 
343  if(isSimulation) { // For sim output:
344  HEmcClusterSim* pClusterSim = (HEmcClusterSim*)pCluster;
345  map<Int_t,Float_t>clTrackEnergy; // For simulation only
346  for(Int_t ind=0;ind<size;ind++) {
347  HEmcCalSim* cal = (HEmcCalSim*)pClustCells[ind];
348  Int_t ntr = cal->getNTracks();
349  if(ntr < 1) continue; // Real track iEmbedded track
350  for(Int_t i=0;i<ntr;i++) {
351  Int_t track = cal->getTrack(i);
352  clTrackEnergy[track] += cal->getTrackEnergy(i); //ener;
353  }
354  }
355 
356  // Sort tracks by enegy deposit
357  vector<pair<Int_t,Float_t> > vEn(clTrackEnergy.begin(),clTrackEnergy.end());
358  if(vEn.size() > 1) sort(vEn.begin(),vEn.end(),cmpEnergy);
359  for(UInt_t i = 0; i < vEn.size(); i++) pClusterSim->setTrack(vEn[i].first,vEn[i].second);
360  if(pRpcClusF != NULL) pClusterSim->setRpcTrack(((HRpcClusterSim*)pRpcClusF)->getTrack());
361  }
362  }
363  }
364  return 0;
365 }
366 
367 HRpcCluster* HEmcClusterF::rpcMatch(HEmcCal* cal,Float_t &qualityDThDPh,Float_t &qualityDTime) {
368 
369  Int_t sec = cal->getSector();
370  Int_t cell = cal->getCell();
371  Float_t time = cal->getTime();
372  Float_t thEmc = thetaEmcLab[sec][cell];
373  Float_t phEmc = phiEmcLab[sec][cell];
374  Float_t sigmaTh = sigmaTheta[sec][cell];
375  Float_t sigmaPh = sigmaPhi[sec][cell];
376  HEmcCalSim *calsim = dynamic_cast<HEmcCalSim*>(cal);
377  Float_t sigmaTm = calsim==NULL ? 0.0 : calsim->getSigmaTime(); // For the real data is not implemented yet
378  HGeomVector *pemc = emcCellsLab[sec][cell];
379  HRpcCluster *out = NULL;
380  qualityDThDPh = 1000000.;
381  qualityDTime = 1000000.;
382 
383  Int_t nRpc = fRpcCat->getEntries();
384  for(Int_t n=0;n<nRpc;n++) {
385  HRpcCluster* rpc = (HRpcCluster*)fRpcCat->getObject(n);
386  if(rpc->getSector() != sec) continue;
387 
388  // Propagate track to the EMC and calculate TOF (timeRpc) to the EMC module
389  Float_t xrl,yrl,zrl;
390  rpc->getXYZLab(xrl,yrl,zrl);
391  Float_t deltaX = pemc->getX()-xrl;
392  Float_t deltaY = pemc->getY()-yrl;
393  Float_t deltaZ = pemc->getZ()-zrl;
394  Float_t distRpcEmc = TMath::Sqrt(deltaX*deltaX+deltaY*deltaY+deltaZ*deltaZ);
395  Float_t timeCorr = distRpcEmc/TMath::Sqrt(xrl*xrl+yrl*yrl+zrl*zrl) * rpc->getTof();
396  Float_t timeRpc = rpc->getTof() + timeCorr;
397 
398  // Calculate quality of matching for angles (dThdPh)
399  Float_t dThSig = ((thEmc -rpc->getTheta())/sigmaTh + dThetaSigOffset)/dThetaScale;
400  Float_t dPhSig = (phEmc - rpc->getPhi())/sigmaPh;
401  Float_t dThdPh = TMath::Sqrt(dThSig*dThSig + dPhSig*dPhSig); // O-shaped cut
402 
403  if(dThdPh > dThdPhCut) continue;
404 
405  Float_t dTOFc = time - timeRpc + dTimeOffset;
406  if(dTimeCutNS > 0.) { // Cut in time by time difference
407  if(TMath::Abs(dTOFc) > dTimeCutNS) continue; // Test matching
408  } else {
409  // Calculate quality of matching for time (dTOFc)
410  Float_t sigTof = rpc->getTOFRMS();
411  dTOFc /= TMath::Sqrt(sigmaTm*sigmaTm + sigTof*sigTof);
412  if(TMath::Abs(dTOFc) > dTimeCut) continue; // Test matching
413  }
414 
415  // Select best matching by smallest value of dTOFc
416  if(TMath::Abs(dTOFc) < TMath::Abs(qualityDTime)) {
417  qualityDThDPh = dThdPh;
418  qualityDTime = dTOFc;
419  out = rpc;
420  }
421 
422  }
423  if(out != NULL) cal->setMatchedRpc();
424  return out;
425 }
426 
427 Int_t HEmcClusterF::maxEnergyCell(void) const {
428  // Find cell with max.energy deposit
429  Int_t cellMax = -1;
430  for(Int_t cell=0; cell<emcMaxComponents; cell++) {
431  if(flagUsed[cell] == 0) {
432  if(cellMax<0 || energy[cell] > energy[cellMax]) cellMax = cell;
433  }
434  }
435  return cellMax;
436 }
437 
438 Float_t HEmcClusterF::calcDist(HEmcCal *cal1,HEmcCal *cal2) const {
439  Float_t dCol = cal1->getColumn() - cal2->getColumn();
440  Float_t dRow = cal1->getRow() - cal2->getRow();
441  return TMath::Sqrt(dCol*dCol+dRow*dRow);
442 }
443 
444 Int_t HEmcClusterF::getNearbyCell(Int_t cell,Int_t i) const {
445  Char_t dColumn[8] = {-1,+1, 0, 0, -1,-1, +1,+1};
446  Char_t dRow[8] = { 0, 0, -1,+1, -1,+1, -1,+1};
447  Int_t row = cell/emcMaxColumns + dRow[i];
448  if(row<0 || row>=emcMaxRows) return -1;
449  Int_t column = cell%emcMaxColumns + dColumn[i];
450  if(column<0 || column>=emcMaxColumns) return -1;
451  return row*emcMaxColumns + column;
452 }
453 
Float_t getTrackEnergy(Short_t n) const
Definition: hemccalsim.h:40
void getXYZLab(Float_t &x, Float_t &y, Float_t &z)
Definition: hrpccluster.h:78
void setCellList(Int_t ncs, UChar_t *list)
virtual Bool_t addCategory(Cat_t aCat, HCategory *cat, Option_t opt[])=0
Float_t dTimeOffset
Definition: hemcclusterf.h:44
HGeomTransform & getTransform()
Definition: hgeomvolume.h:22
Float_t cellYmod[emcMaxComponents]
Definition: hemcclusterf.h:24
UChar_t listClustCell[emcMaxComponents]
Definition: hemcclusterf.h:38
Float_t cellXmod[emcMaxComponents]
Definition: hemcclusterf.h:23
Float_t getTheta()
Definition: hrpccluster.h:59
Float_t sigmaPhi[6][emcMaxComponents]
Definition: hemcclusterf.h:29
Float_t energy[emcMaxComponents]
Definition: hemcclusterf.h:33
void setSigmaXYMod(Float_t sigma)
Definition: hemccluster.h:107
Short_t getIndex()
Definition: hrpccluster.h:66
HGeomCompositeVolume * getRefVolume()
Definition: hdetgeompar.h:20
Short_t getNTracks(void) const
Definition: hemccalsim.h:38
Float_t getSigmaEnergy(void) const
Definition: hemccalsim.h:44
Float_t getEnergy(void) const
Definition: hemccal.h:61
Double_t getZ() const
Definition: hgeomvector.h:24
HGeomVector * emcCellsLab[6][emcMaxComponents]
Definition: hemcclusterf.h:25
HModGeomPar * getModule(const Int_t, const Int_t)
Definition: hdetgeompar.cc:162
HCategory * fEmcCalCat
Definition: hemcclusterf.h:19
void setMatchedRpc(Bool_t f=kTRUE)
Definition: hemccal.h:52
void setQualDThDPh(Float_t q)
Definition: hemccluster.h:94
HCategory * fClusterCat
Definition: hemcclusterf.h:20
void setSigmaEnergy(Float_t e)
void setXYZLab(Float_t x, Float_t y, Float_t z)
Definition: hemccluster.h:108
HEmcClusterF(void)
Definition: hemcclusterf.cc:62
Bool_t isSimulation
Definition: hemcclusterf.h:56
Float_t phiEmcLab[6][emcMaxComponents]
Definition: hemcclusterf.h:28
Int_t maxEnergyCell(void) const
HRuntimeDb * getRuntimeDb(void)
Definition: hades.h:111
Float_t sigmaXYmod
Definition: hemcclusterf.h:30
HEvent *& getCurrentEvent(void)
Definition: hades.cc:422
const Cat_t catGeantKine
Definition: hgeantdef.h:8
Int_t getNumPoints()
Definition: hgeomvolume.h:23
HLocation fLoc
Definition: hemcclusterf.h:18
void setPhi(Float_t a)
Definition: hemccluster.h:110
Int_t n
Char_t getRow(void) const
Definition: hemccal.h:64
ClassImp(HDbColumn) HDbColumn
Definition: hdbcolumn.cc:18
Short_t getStatus(void) const
Definition: hemccal.h:68
Float_t thetaEmcLab[6][emcMaxComponents]
Definition: hemcclusterf.h:26
void setSigmaTime(Float_t t)
Double_t theta
Float_t addEnergy
Definition: hemcclusterf.h:53
void setIndex(Short_t ind)
Definition: hemccluster.h:102
Float_t dTimeCutNS
Definition: hemcclusterf.h:47
void setXYMod(Float_t x, Float_t y)
Definition: hemccluster.h:106
void setRpcIndex(Short_t i)
Definition: hemccluster.h:93
void setTime(Float_t t)
Definition: hemccluster.h:104
HSpectrometer * getSetup(void)
Definition: hades.h:112
HDetector * getDetector(const Char_t *name)
const Cat_t catEmcCluster
Definition: emcdef.h:10
const HGeomVector & getTransVector() const
HEmcCal * pClustCells[emcMaxComponents]
Definition: hemcclusterf.h:39
Char_t getColumn(void) const
Definition: hemccal.h:65
void setTrack(Int_t trackNumber, Float_t energy)
void setQualDTime(Float_t q)
Definition: hemccluster.h:95
void setNMatchedCells(UChar_t n)
Definition: hemccluster.h:96
Hades * gHades
Definition: hades.cc:1213
const Int_t emcMaxColumns
Definition: emcdef.h:13
void setEnergy(Float_t e)
Definition: hemccluster.h:103
Float_t getTime(void) const
Definition: hemccal.h:60
const Cat_t catRpcCluster
Definition: rpcdef.h:10
Int_t getNearbyCell(Int_t cell, Int_t i) const
Float_t dThetaScale
Definition: hemcclusterf.h:43
Float_t cellToCellSpeed
Definition: hemcclusterf.h:49
void setSector(Char_t s)
Definition: hemccluster.h:101
HParSet * getContainer(const Text_t *)
Definition: hruntimedb.cc:124
HGeomVector transFrom(const HGeomVector &p) const
Int_t execute(void)
Float_t dThetaSigOffset
Definition: hemcclusterf.h:42
Float_t sigmaTheta[6][emcMaxComponents]
Definition: hemcclusterf.h:27
void initData(void)
Definition: hemcclusterf.cc:70
Float_t energyCut
Definition: hemcclusterf.h:54
~HEmcClusterF(void)
Definition: hemcclusterf.cc:93
Definition: hemccal.h:8
Int_t getTrack(Short_t n=0) const
Definition: hemccalsim.h:39
Short_t getSector()
Definition: hrpccluster.h:65
UChar_t getCell(void) const
Definition: hemccal.h:63
Float_t distOffset
Definition: hemcclusterf.h:50
Char_t flagUsed[emcMaxComponents]
Definition: hemcclusterf.h:34
Bool_t init(void)
Definition: hemcclusterf.cc:96
Float_t dThdPhCut
Definition: hemcclusterf.h:46
Float_t timeCutMin
Definition: hemcclusterf.h:51
HCategory * buildMatrixCategory(const Text_t *, Float_t)
Definition: hemcdetector.cc:80
Float_t timeCutMax
Definition: hemcclusterf.h:52
const Int_t emcMaxComponents
Definition: emcdef.h:15
void setRpcTrack(Int_t tr)
const Cat_t catEmcCal
Definition: emcdef.h:8
HEmcCal * pSecECells[emcMaxComponents]
Definition: hemcclusterf.h:35
Float_t phi
Definition: drawAccCuts.C:15
virtual HCategory * getCategory(Cat_t aCat)=0
Float_t dTimeCut
Definition: hemcclusterf.h:45
Float_t getPhi()
Definition: hrpccluster.h:60
HGeomTransform & getLabTransform()
Definition: hdetgeompar.h:21
void setMaxEnergy(Float_t e)
Definition: hemccluster.h:105
void setTheta(Float_t a)
Definition: hemccluster.h:109
Float_t getTof()
Definition: hrpccluster.h:51
HRpcCluster * rpcMatch(HEmcCal *cal, Float_t &qualityDThDPh, Float_t &qualityDTime)
HCategory * fRpcCat
Definition: hemcclusterf.h:21
Double_t getX() const
Definition: hgeomvector.h:22
Float_t getTOFRMS()
Definition: hrpccluster.h:64
Char_t getSector(void) const
Definition: hemccal.h:62
Float_t calcDist(HEmcCal *cal1, HEmcCal *cal2) const
const Int_t emcMaxRows
Definition: emcdef.h:12
Double_t getY() const
Definition: hgeomvector.h:23
Float_t getSigmaTime(void) const
Definition: hemccalsim.h:45
static bool cmpEnergy(pair< Int_t, Float_t > p1, pair< Int_t, Float_t > p2)
Definition: hemcclusterf.h:89
Bool_t reinit(void)
HGeomVolume * getComponent(const Int_t)