FairRoot/PandaRoot
Functions | Variables
Algorithms

contains algorithms to find a centeroid of a cluster More...

Functions

 PndSdsChargeWeightingAlgorithms::PndSdsChargeWeightingAlgorithms (TClonesArray *arr)
 
 PndSdsChargeWeightingAlgorithms::PndSdsChargeWeightingAlgorithms (PndSdsChargeWeightingAlgorithms &other)
 
virtual PndSdsChargeWeightingAlgorithms::~PndSdsChargeWeightingAlgorithms ()
 
PndSdsChargeWeightingAlgorithmsPndSdsChargeWeightingAlgorithms::operator= (PndSdsChargeWeightingAlgorithms &other)
 
std::pair< Double_t, Double_tPndSdsChargeWeightingAlgorithms::CenterOfGravity (const PndSdsCluster *Cluster)
 
std::pair< Double_t, Double_tPndSdsChargeWeightingAlgorithms::HeadTail (const PndSdsCluster *Cluster)
 
std::pair< Double_t, Double_tPndSdsChargeWeightingAlgorithms::Eta (const PndSdsCluster *Cluster, const TH2F *PosVsEta)
 
std::pair< Double_t, Double_tPndSdsChargeWeightingAlgorithms::EtaValue (const PndSdsCluster *Cluster, Double_t &stripno, Int_t &NmbOfStrips)
 
std::pair< Double_t, Double_tPndSdsChargeWeightingAlgorithms::Binary (const PndSdsCluster *Cluster)
 
std::pair< Double_t, Double_tPndSdsChargeWeightingAlgorithms::Median (const PndSdsCluster *Cluster)
 
std::pair< Double_t, Double_tPndSdsChargeWeightingAlgorithms::AutoSelect (const PndSdsCluster *Cluster)
 

Variables

TParticlePDG * eta =(TDatabasePDG::Instance())->GetParticle(221)
 

Detailed Description

contains algorithms to find a centeroid of a cluster

The centeroid finding algorithms are: Binary, Median, Center of gravity, Head-Tail and using the Eta-Distribution

Author
Lars Ackermann, Ralf Kliemt
Date
2008 - 2013 cluster_reco

Function Documentation

std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::AutoSelect ( const PndSdsCluster Cluster)

Definition at line 316 of file PndSdsChargeWeightingAlgorithms.cxx.

References PndSdsChargeWeightingAlgorithms::Binary(), PndSdsChargeWeightingAlgorithms::CenterOfGravity(), PndSdsCluster::GetClusterSize(), and PndSdsChargeWeightingAlgorithms::HeadTail().

317 {
318  Warning("auto_select", "Do not use, this selection is still wrong!");
319  switch(Cluster->GetClusterSize())
320  {
321  case 1:
322  return Binary(Cluster);
323  break;
324  case 2:
325  //return eta(Cluster); // switched off (no par file)
326  return CenterOfGravity(Cluster);
327  break;
328  case 3:
329  return CenterOfGravity(Cluster);
330  break;
331  case 4:
332  return CenterOfGravity(Cluster);
333  break;
334  default:
335  return HeadTail(Cluster);
336  break;
337  }
338  return HeadTail(Cluster);
339 }
std::pair< Double_t, Double_t > HeadTail(const PndSdsCluster *Cluster)
Int_t GetClusterSize() const
Definition: PndSdsCluster.h:39
std::pair< Double_t, Double_t > CenterOfGravity(const PndSdsCluster *Cluster)
std::pair< Double_t, Double_t > Binary(const PndSdsCluster *Cluster)
std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::Binary ( const PndSdsCluster Cluster)

Definition at line 151 of file PndSdsChargeWeightingAlgorithms.cxx.

References PndSdsChargeWeightingAlgorithms::DigiCharge(), PndSdsChargeWeightingAlgorithms::DigiStripno(), Double_t, PndSdsChargeWeightingAlgorithms::fVerbose, PndSdsCluster::GetClusterSize(), PndSdsCluster::GetDigiIndex(), i, and sqrt().

Referenced by PndSdsChargeWeightingAlgorithms::AutoSelect(), PndSdsStripClusterTask::CalcMeanCharge(), PndSdsChargeWeightingAlgorithms::CenterOfGravity(), PndSdsChargeWeightingAlgorithms::Eta(), and PndSdsChargeWeightingAlgorithms::HeadTail().

152 {
153  Int_t nrHits = Cluster->GetClusterSize();
154  std::pair<Double_t,Double_t> result;
155  Double_t charge=0.,chargemax=0;
156  Double_t channel=0;
157  for(Int_t i=0;i<nrHits;++i)
158  {
159  charge=DigiCharge(Cluster->GetDigiIndex(i));
160  if( charge > chargemax)
161  { // choose highest signal
162  chargemax=charge;
163  channel=DigiStripno(Cluster->GetDigiIndex(i));
164  }
165  }
166  result.first=channel;
167  result.second=1./sqrt(12.);
168  if(fVerbose>1) Info("Binary","Got a cluster with %i digis. Position %f +- %f chn.",nrHits,result.first,result.second);
169  return result;
170 }
Int_t GetClusterSize() const
Definition: PndSdsCluster.h:39
Int_t i
Definition: run_full.C:25
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Int_t GetDigiIndex(Int_t i) const
Definition: PndSdsCluster.h:40
Double_t
std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::CenterOfGravity ( const PndSdsCluster Cluster)

Definition at line 38 of file PndSdsChargeWeightingAlgorithms.cxx.

References PndSdsChargeWeightingAlgorithms::Binary(), PndSdsChargeWeightingAlgorithms::DigiCharge(), PndSdsChargeWeightingAlgorithms::DigiStripno(), Double_t, PndSdsChargeWeightingAlgorithms::fCalcStrip, PndSdsChargeWeightingAlgorithms::fVerbose, PndSdsCluster::GetClusterSize(), PndSdsCluster::GetDigiIndex(), PndSdsCalcStrip::GetNoise(), PndSdsCalcStrip::GetThreshold(), noise, sqrt(), and threshold.

Referenced by PndSdsChargeWeightingAlgorithms::AutoSelect(), PndSdsStripClusterTask::CalcMeanCharge(), PndSdsChargeWeightingAlgorithms::Eta(), and PndSdsChargeWeightingAlgorithms::HeadTail().

39 {
40  Int_t nrHits = Cluster->GetClusterSize();
41  if(nrHits<2) return Binary(Cluster);
42  std::pair<Double_t,Double_t> result;
43  Double_t x_g=0., chargesum=0, charge=0, stripno=0;
44  Double_t xerror=0.,xtmp=0.,err=0.;
47  Double_t Tthr=threshold/noise;
48 
49  for(Int_t l=0;l<nrHits;++l) // loop over all hits
50  { // ( q_i*chan_i )
51  // x_g= SUM ( ------------ )
52  // ( Q_sum )
53  charge = DigiCharge(Cluster->GetDigiIndex(l));
54  stripno = DigiStripno(Cluster->GetDigiIndex(l));
55  chargesum+=charge;
56  x_g += charge * stripno ;
57  if(fVerbose>2) Info("CenterOfGravity","Adding digi values (stripno,charge) = (%f,%f)",stripno,charge);
58  }
59  x_g = x_g/chargesum;
60  result.first=x_g;
61 
62  Double_t chanmax=DigiStripno(Cluster->GetDigiIndex(nrHits-1));
63  Double_t chanmin=DigiStripno(Cluster->GetDigiIndex(0));
64  for(Int_t l=0;l<nrHits;++l) // loop over all hits
65  {
66  stripno = DigiStripno(Cluster->GetDigiIndex(l));
67  if(stripno>chanmax) chanmax=stripno;
68  if(stripno<chanmin) chanmin=stripno;
69  xtmp = stripno - x_g;
70  xtmp*=xtmp;
71  xerror+=xtmp;
72  }
73  chanmax++;
74  chanmax-=x_g;
75  chanmax*=chanmax;
76  chanmin--;
77  chanmin-=x_g;
78  chanmin*=chanmin;
79  xtmp=chanmax;
80  xtmp+=chanmin;
81  xtmp*=Tthr;
82  xtmp*=Tthr;
83  xtmp/=12.;//Thr is uniform distr.
84  err=xerror;
85  err+=xtmp;
86  err=sqrt(err);
87  err*=noise;
88  err/=chargesum;
89 
90  if (err < 1e-15) Warning("CenterOfGravity","Got bad error value: Cluster with %i digis. Position %f +-%f chn.",nrHits,x_g,xerror);
91  result.second = err;
92 
93  if(fVerbose>1) Info("CenterOfGravity","Got a cluster with %i digis. Position %f +- %f chn.",nrHits,result.first,result.second);
94  return result;
95 }
Int_t GetClusterSize() const
Definition: PndSdsCluster.h:39
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Int_t GetDigiIndex(Int_t i) const
Definition: PndSdsCluster.h:40
Double_t
double threshold
std::pair< Double_t, Double_t > Binary(const PndSdsCluster *Cluster)
Double_t GetThreshold() const
double noise
Double_t GetNoise() const
std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::Eta ( const PndSdsCluster Cluster,
const TH2F *  PosVsEta 
)

Definition at line 214 of file PndSdsChargeWeightingAlgorithms.cxx.

References PndSdsChargeWeightingAlgorithms::Binary(), PndSdsChargeWeightingAlgorithms::CenterOfGravity(), PndSdsChargeWeightingAlgorithms::DigiCharge(), Double_t, PndSdsChargeWeightingAlgorithms::EtaValue(), PndSdsCluster::GetClusterSize(), and PndSdsCluster::GetDigiIndex().

Referenced by PndSdsStripClusterTask::CalcMeanCharge().

215 {
216  Int_t nrHits = Cluster->GetClusterSize();
217 
218  if(nrHits < 2.){return Binary(Cluster);}
219  if(nrHits > 2.){return CenterOfGravity(Cluster);}
220 
221  std::pair<Double_t,Double_t> result;
222  //if(nrHits == 2. && DigiStripno(Cluster->GetDigiIndex(1))-DigiStripno(Cluster->GetDigiIndex(0))==1.)
223 
224  std::pair<Double_t,Double_t> eta_value;
225  Double_t stripno=0.;
226  Int_t NmbOfStrips=0;
227 
228  eta_value = EtaValue(Cluster, stripno, NmbOfStrips);
229 
230  Int_t Clustercharge=(Int_t)ceil((DigiCharge(Cluster->GetDigiIndex(0)) + DigiCharge(Cluster->GetDigiIndex(1)))/2500);
231  if(Clustercharge>21)Clustercharge=21;
232 
233  result.first=stripno + PosVsEta->GetBinContent((Int_t)ceil(eta_value.first * 500.), Clustercharge); //etadist histogram contains 200 bins.
234 
235  result.second=(PosVsEta->GetBinContent((Int_t)ceil((eta_value.first+eta_value.second) * 500.), Clustercharge)
236  - PosVsEta->GetBinContent((Int_t)ceil((eta_value.first-eta_value.second) * 500.), Clustercharge))/2.;
237 
238  return result;
239 }
Int_t GetClusterSize() const
Definition: PndSdsCluster.h:39
Int_t GetDigiIndex(Int_t i) const
Definition: PndSdsCluster.h:40
Double_t
std::pair< Double_t, Double_t > CenterOfGravity(const PndSdsCluster *Cluster)
std::pair< Double_t, Double_t > EtaValue(const PndSdsCluster *Cluster, Double_t &stripno, Int_t &NmbOfStrips)
std::pair< Double_t, Double_t > Binary(const PndSdsCluster *Cluster)
std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::EtaValue ( const PndSdsCluster Cluster,
Double_t stripno,
Int_t &  NmbOfStrips 
)

Definition at line 241 of file PndSdsChargeWeightingAlgorithms.cxx.

References PndSdsChargeWeightingAlgorithms::DigiCharge(), PndSdsChargeWeightingAlgorithms::DigiChargeError(), PndSdsChargeWeightingAlgorithms::DigiStripno(), Double_t, PndSdsChargeWeightingAlgorithms::fCalcStrip, PndSdsChargeWeightingAlgorithms::fDigiArray, PndSdsDigi::GetCharge(), PndSdsCluster::GetClusterSize(), PndSdsCluster::GetDigiIndex(), PndSdsCalcStrip::GetNoise(), noise, and sqrt().

Referenced by PndSdsChargeWeightingAlgorithms::Eta().

242 {
243 
244  Int_t nrHits = Cluster->GetClusterSize();
245  std::pair<Double_t,Double_t> result;
246 
247  if(nrHits==2. && DigiStripno(Cluster->GetDigiIndex(1)) - DigiStripno(Cluster->GetDigiIndex(0))==1.) // 2 strips fired
248  {
249  NmbOfStrips=2;
250  Double_t ql=0., qr=0., noise=0., cherrl=0., cherrr=0.;
252 
253  ql = DigiCharge(Cluster->GetDigiIndex(0));
254  qr = DigiCharge(Cluster->GetDigiIndex(1));
255  cherrr = DigiChargeError(Cluster->GetDigiIndex(1));
256  cherrr = sqrt(noise*noise+cherrr*cherrr);
257 
258  cherrl = DigiChargeError(Cluster->GetDigiIndex(0));
259  cherrl = sqrt(noise*noise+cherrl*cherrl);
260 
261  stripno = DigiStripno(Cluster->GetDigiIndex(0));
262 
263  result.first=qr/(qr+ql);
264 
265  //unused??
266  //PndSdsDigiStrip* digil = (PndSdsDigiStrip*)(fDigiArray->At(Cluster->GetDigiIndex(0)));
267  //PndSdsDigiStrip* digir = (PndSdsDigiStrip*)(fDigiArray->At(Cluster->GetDigiIndex(1)));
268 
269  result.second=sqrt(((ql/(qr+ql))*(1./(qr+ql))*(ql/(qr+ql))*(1./(qr+ql))*cherrr*cherrr)+((qr/(qr+ql))*(1./(qr+ql))*(qr/(qr+ql))*(1./(qr+ql))*cherrl*cherrl));
270  return result;
271  }
272 
273  if(nrHits==3 || (DigiStripno(Cluster->GetDigiIndex(1)) - DigiStripno(Cluster->GetDigiIndex(0))==2. && nrHits==2)) // 3 strips fired, sometimes middle strip is empty
274  {
275 
276  Double_t ql=0., qr=0., qm=0., noise=0., cherrl=0., cherrr=0.;
278  NmbOfStrips=3;
279 
280  if(nrHits==3){
281  ql = DigiCharge(Cluster->GetDigiIndex(0));
282  qm = DigiCharge(Cluster->GetDigiIndex(1));
283  qr = DigiCharge(Cluster->GetDigiIndex(2));
284  cherrr = sqrt(TMath::Power(DigiChargeError(Cluster->GetDigiIndex(2)),2.)+TMath::Power((DigiChargeError(Cluster->GetDigiIndex(1))/2.),2.));
285  cherrl = sqrt(TMath::Power(DigiChargeError(Cluster->GetDigiIndex(0)),2.)+TMath::Power((DigiChargeError(Cluster->GetDigiIndex(1))/2.),2.));
286 
287  }else{
288  ql = DigiCharge(Cluster->GetDigiIndex(0));
289  qr = DigiCharge(Cluster->GetDigiIndex(1));
290  qm=3000.;
291  cherrr = sqrt(TMath::Power(DigiChargeError(Cluster->GetDigiIndex(1)),2.)+TMath::Power((noise/2.),2.));
292  cherrl = sqrt(TMath::Power(DigiChargeError(Cluster->GetDigiIndex(0)),2.)+TMath::Power((noise/2.),2.));
293  PndSdsDigiStrip* digil = (PndSdsDigiStrip*)(fDigiArray->At(Cluster->GetDigiIndex(0)));
294  PndSdsDigiStrip* digir = (PndSdsDigiStrip*)(fDigiArray->At(Cluster->GetDigiIndex(1)));
295  std::cout<<"strip no charge: UNBL: "<<DigiStripno(Cluster->GetDigiIndex(0))<<" "<<digil->GetCharge()<<" "<<DigiStripno(Cluster->GetDigiIndex(1))<<" "<<digir->GetCharge()<<std::endl;
296 
297  }
298 
299  ql+=qm/2.;
300  qr+=qm/2.;
301 
302  cherrr = sqrt(noise*noise+cherrr*cherrr);
303  cherrl = sqrt(noise*noise+cherrr*cherrr);
304  stripno = DigiStripno(Cluster->GetDigiIndex(0));
305  result.first=qr/(qr+ql);
306  result.second=sqrt(((ql/(qr+ql))*(1./(qr+ql))*(ql/(qr+ql))*(1./(qr+ql))*cherrr*cherrr)+((qr/(qr+ql))*(1./(qr+ql))*(qr/(qr+ql))*(1./(qr+ql))*cherrl*cherrl));
307  return result;
308  }
309 
310  result.first=-1.;
311  result.second=-1.;
312  return result;
313 }
Int_t GetClusterSize() const
Definition: PndSdsCluster.h:39
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Class for digitised strip hits.
Double_t GetCharge() const
Definition: PndSdsDigi.h:60
Int_t GetDigiIndex(Int_t i) const
Definition: PndSdsCluster.h:40
Double_t
double noise
Double_t GetNoise() const
std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::HeadTail ( const PndSdsCluster Cluster)

Definition at line 98 of file PndSdsChargeWeightingAlgorithms.cxx.

References PndSdsChargeWeightingAlgorithms::Binary(), PndSdsChargeWeightingAlgorithms::CenterOfGravity(), PndSdsChargeWeightingAlgorithms::DigiCharge(), PndSdsChargeWeightingAlgorithms::DigiStripno(), Double_t, PndSdsChargeWeightingAlgorithms::fCalcStrip, PndSdsCluster::GetClusterSize(), PndSdsCluster::GetDigiIndex(), PndSdsCalcStrip::GetNoise(), noise, sqrt(), and x_h.

Referenced by PndSdsChargeWeightingAlgorithms::AutoSelect(), and PndSdsStripClusterTask::CalcMeanCharge().

99 {
100  Int_t nrHits = Cluster->GetClusterSize();
101  if(nrHits<2) return Binary(Cluster);
102  if(nrHits==2) return CenterOfGravity(Cluster);
103 
104  // We assume that the digis in each cluster are sorted.
105  std::pair<Double_t,Double_t> result;
107 
108  Double_t x_h=DigiStripno(Cluster->GetDigiIndex(0));
109  Double_t x_t=DigiStripno(Cluster->GetDigiIndex(nrHits-1));
110 
111  Double_t Q=0.,q_inner=0., charge=0.,stripno=-1.,err=0.;
112  Int_t k_h=0, k_t=nrHits-1;
113  for (Int_t kk=0;kk<nrHits;kk++)
114  {
115  charge = DigiCharge(Cluster->GetDigiIndex(kk));
116  stripno = DigiStripno(Cluster->GetDigiIndex(kk));
117  Q+=charge;
118  if(x_h>stripno){k_h=kk;x_h=stripno;}
119  if(x_t<stripno){k_t=kk;x_t=stripno;}
120  }
121  Double_t x_ht=x_h+0.5*nrHits;
122  Double_t q_h=DigiCharge(Cluster->GetDigiIndex(k_h));
123  Double_t q_t=DigiCharge(Cluster->GetDigiIndex(k_t));
124  q_inner=Q-q_h-q_t;
125  q_inner /= (nrHits-2.); // this number is just a good estiamte for the charge being lost of such a particle in one strip
126  Double_t w=(q_t-q_h)/(2.*q_inner);
127  x_ht+=w;
128  err=sqrt(2.)*noise/q_inner;
129 
130  result.first=x_ht;
131  result.second=err;
132 
133  return result;
134 }
Int_t GetClusterSize() const
Definition: PndSdsCluster.h:39
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Int_t GetDigiIndex(Int_t i) const
Definition: PndSdsCluster.h:40
Double_t
std::pair< Double_t, Double_t > CenterOfGravity(const PndSdsCluster *Cluster)
std::pair< Double_t, Double_t > Binary(const PndSdsCluster *Cluster)
double noise
Double_t GetNoise() const
std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::Median ( const PndSdsCluster Cluster)

middle coordinate of a strip range

Parameters
Clusterinvestigationg cluster
Returns
coordinate

Definition at line 137 of file PndSdsChargeWeightingAlgorithms.cxx.

References Double_t, PndSdsChargeWeightingAlgorithms::fVerbose, PndSdsCluster::GetClusterSize(), PndSdsCluster::GetDigiIndex(), and sqrt().

138 {
139  Int_t nrHits = Cluster->GetClusterSize();
140  std::pair<Double_t,Double_t> result;
141  Double_t channel=Cluster->GetDigiIndex(0); // assume sorted digis in cluster from k to k+n
142  channel+=0.5*nrHits;
143  result.first=channel;
144  result.second=1./sqrt(12.);
145  if(fVerbose>1) Info("Median","Got a cluster with %i digis. Position %f +- %f chn.",nrHits,result.first,result.second);
146  return result;
147 }
Int_t GetClusterSize() const
Definition: PndSdsCluster.h:39
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Int_t GetDigiIndex(Int_t i) const
Definition: PndSdsCluster.h:40
Double_t
PndSdsChargeWeightingAlgorithms& PndSdsChargeWeightingAlgorithms::operator= ( PndSdsChargeWeightingAlgorithms other)
inline
PndSdsChargeWeightingAlgorithms::PndSdsChargeWeightingAlgorithms ( TClonesArray *  arr)
PndSdsChargeWeightingAlgorithms::PndSdsChargeWeightingAlgorithms ( PndSdsChargeWeightingAlgorithms other)
inline
PndSdsChargeWeightingAlgorithms::~PndSdsChargeWeightingAlgorithms ( )
virtual

Definition at line 25 of file PndSdsChargeWeightingAlgorithms.cxx.

26 {
27 }

Variable Documentation

std::pair< Double_t, Double_t > PndSdsChargeWeightingAlgorithms::eta =(TDatabasePDG::Instance())->GetParticle(221)