FEDRA emulsion software from the OPERA Collaboration
EdbSEQ Class Reference

#include <EdbSEQ.h>

Inheritance diagram for EdbSEQ:
Collaboration diagram for EdbSEQ:

Public Member Functions

void AddExcludeThetaRange (EdbSegP &s)
 
void CalculateDensityMT (EdbH1 &hEq)
 
double DNbt (double t)
 
double DNmt (double t)
 
void Draw ()
 
 EdbSEQ ()
 
void EqualizeMT (TObjArray &mti, TObjArray &mto, Double_t area)
 
void ExcludeThetaRange (TObjArray &mti, TObjArray &mto)
 
double FDNbt (double *x, double *par)
 
double FDNmt (double *x, double *par)
 
bool IsInsideThetaRange (EdbSegP *s)
 
void PreSelection (EdbPattern &pi, TObjArray &po)
 
void PrintLimits ()
 
void ResetExcludeThetaRange ()
 
void Set0 ()
 
void SetChiLimits (float cmin, float cmax)
 
void SetThetaLimits (float tmin, float tmax)
 
void SetWLimits (float wmin, float wmax)
 
void SetXLimits (float xmin, float xmax)
 
void SetYLimits (float ymin, float ymax)
 
TH1F * ThetaPlot (EdbPattern &p, const char *name="theta", const char *title="EdbSEQ theta distribution normalised to area")
 
TH1F * ThetaPlot (TObjArray &arr, const char *name="theta", const char *title="EdbSEQ theta distribution normalised to area")
 
float Wmt (EdbSegP &s)
 
virtual ~EdbSEQ ()
 
- Public Member Functions inherited from EdbSigma
double DAL (double t, double sxy, double sz, double dz)
 
double DALbt (double t)
 
double DALmt (double t)
 
double DAT (double t, double sxy, double dz)
 
double DATbt (double t)
 
double DATmt (double t)
 
double DP (double t, double sxy, double da, double dz)
 
double DPLbt (double t)
 
double DPLmt (double t)
 
double DPTbt (double t)
 
double DPTmt (double t)
 
void Draw ()
 
 EdbSigma ()
 
double FDAL (double *x, double *par)
 
double FDALbt (double *x, double *par)
 
double FDAT (double *x, double *par)
 
double FDPLmt (double *x, double *par)
 
void Set0 ()
 
double SqSum (double a, double b)
 
virtual ~EdbSigma ()
 

Public Attributes

Double_t eArea
 
TObjArray eExcludeThetaRange
 
EdbH1 eHEq
 
int eNP
 
Double_t eNsigma
 
Double_t eS0mt
 
- Public Attributes inherited from EdbSigma
double eDZbase
 
double eDZcell
 
double eDZem
 
double eSaPlate
 
double eSaZone
 
double eSxy
 
double eSxyPlate
 
double eSxyZone
 
double eSz
 

Private Attributes

TVector2 * eChiLimits
 
TVector2 * eThetaLimits
 
TVector2 * eWLimits
 
TVector2 * eXLimits
 
TVector2 * eYLimits
 

Constructor & Destructor Documentation

◆ EdbSEQ()

EdbSEQ::EdbSEQ ( )
inline
32 { ((EdbSigma*)this)->Set0(); Set0();}
void Set0()
Definition: EdbSEQ.cxx:31
Definition: EdbSigma.h:8

◆ ~EdbSEQ()

EdbSEQ::~EdbSEQ ( )
virtual
22 {
23  SafeDelete(eXLimits);
24  SafeDelete(eYLimits);
25  SafeDelete(eWLimits);
26  SafeDelete(eThetaLimits);
27  SafeDelete(eChiLimits);
28 }
TVector2 * eXLimits
Definition: EdbSEQ.h:25
TVector2 * eChiLimits
Definition: EdbSEQ.h:29
TVector2 * eWLimits
Definition: EdbSEQ.h:28
TVector2 * eYLimits
Definition: EdbSEQ.h:26
TVector2 * eThetaLimits
Definition: EdbSEQ.h:27

Member Function Documentation

◆ AddExcludeThetaRange()

void EdbSEQ::AddExcludeThetaRange ( EdbSegP s)
188 {
189  eExcludeThetaRange.Add( new EdbSegP(s) );
190 }
TObjArray eExcludeThetaRange
Definition: EdbSEQ.h:21
Definition: EdbSegP.h:18
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CalculateDensityMT()

void EdbSEQ::CalculateDensityMT ( EdbH1 hEq)
136 {
137  Log(3,"EdbSEQ::CalculateDensityMT","eHEq.N(): %d", eHEq.N());
138  TF1 *fnmt = new TF1("fnmt",this,&EdbSEQ::FDNmt,eHEq.Xmin(),eHEq.Xmax(),0,"EdbSEQ","FDNmt");
139  fnmt->SetTitle("dNmt/dTheta in 1 view density function");
140  fnmt->SetNpx(eNP);
141  double *x=new double[eNP];
142  double *w=new double[eNP];
143  fnmt->CalcGaussLegendreSamplingPoints(eNP,x,w,1e-15);
144  int n = eHEq.N();
145  for(int i=0; i<n; i++) {
146  float tmi=i*eHEq.Xbin();
147  float tma=(i+1)*eHEq.Xbin();
148  double sbin = fnmt->IntegralFast(eNP,x,w,tmi,tma);
149  Log(3,"EdbSEQ::CalculateDensityMT","i,eNP,x,w,tmi,tma: %d %d %f %f %f %f %lf", i,eNP,x,w,tmi,tma, sbin );
150  if(sbin>0 && sbin<kMaxInt-2) eHEq.SetBin(i, int(sbin)+1 );
151  //Log(3,"EdbSEQ::CalculateDensityMT","Integral(%f,%f) = %f", tmi, tma, float(sbin) );
152  }
153  Log(3,"EdbSEQ::CalculateDensityMT","Integral(0,0.6) = %f", float(fnmt->IntegralFast(eNP,x,w,0,0.6)) );
154 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
float Xbin() const
Definition: EdbCell1.h:56
int N() const
Definition: EdbCell1.h:48
void SetBin(int ix, int n)
Definition: EdbCell1.h:65
float Xmax() const
Definition: EdbCell1.h:55
float Xmin() const
Definition: EdbCell1.h:54
int eNP
Definition: EdbSEQ.h:19
EdbH1 eHEq
Definition: EdbSEQ.h:22
double FDNmt(double *x, double *par)
Definition: EdbSEQ.h:44
void w(int rid=2, int nviews=2)
Definition: test.C:27

◆ DNbt()

double EdbSEQ::DNbt ( double  t)
96 {
97  // return dN/dTheta : the critical number of microtracks for the given
98  // theta range for a view area
99  //printf("t=%f\n",t);
100  double dal0 = SqSum(DALbt(0),eSaPlate);
101  double dal = SqSum(DALbt(t),eSaPlate);
102  double dat = SqSum(DATbt(t),eSaPlate);
103  double dpl = DP( t, SqSum( DPLbt(t),eSxyPlate ), dal, eDZcell );
104  double dpt = DP( t, SqSum( DPTbt(t),eSxyPlate ), dat, eDZcell );
105  double nang = Sin(t)/dat * dal0/dal;
106  return nang * eArea/dpl/dpt /eNsigma/eNsigma/eNsigma/eNsigma;
107 }
TTree * t
Definition: check_shower.C:4
Double_t eArea
Definition: EdbSEQ.h:17
Double_t eNsigma
Definition: EdbSEQ.h:16
double eDZcell
Definition: EdbSigma.h:18
double DPLbt(double t)
Definition: EdbSigma.cxx:100
double eSaPlate
Definition: EdbSigma.h:26
double DALbt(double t)
Definition: EdbSigma.cxx:86
double DATbt(double t)
Definition: EdbSigma.cxx:93
double DP(double t, double sxy, double da, double dz)
Definition: EdbSigma.cxx:49
double DPTbt(double t)
Definition: EdbSigma.cxx:108
double eSxyPlate
Definition: EdbSigma.h:25
double SqSum(double a, double b)
Definition: EdbSigma.h:36

◆ DNmt()

double EdbSEQ::DNmt ( double  t)
83 {
84  // return dN/dTheta : the critical number of microtracks for the given
85  // theta range for a view*nviews area
86 
87  double dpl = DP(t,DPLmt(t),DALmt(t),eDZbase);
88  double dpt = DP(t,DPTmt(t),DATmt(t),eDZbase);
89  double nang = Sin(t)/DATmt(t) * DALmt(0)/DALmt(t);
90  //return nang * eNviews*eS0mt/dpl/dpt /eNsigma/eNsigma/eNsigma/eNsigma;
91  return nang * eArea/dpl/dpt /eNsigma/eNsigma/eNsigma/eNsigma;
92 }
double DATmt(double t)
Definition: EdbSigma.cxx:64
double DPLmt(double t)
Definition: EdbSigma.cxx:71
double DPTmt(double t)
Definition: EdbSigma.cxx:78
double eDZbase
Definition: EdbSigma.h:17
double DALmt(double t)
Definition: EdbSigma.cxx:57

◆ Draw()

void EdbSEQ::Draw ( )
111 {
112  TCanvas *cn = new TCanvas("cn","Critical density",800,600);
113  cn->Divide(2,2);
114 
115  TF1 *fnmt = new TF1("fnmt",this,&EdbSEQ::FDNmt,0.,1.,0,"EdbSEQ","FDNmt");
116  fnmt->SetTitle("dNmt/dTheta in 1 view density function");
117  fnmt->SetNpx(eNP);
118 
119  cn->cd(1);
120  fnmt->Draw();
121  cn->cd(2);
122  fnmt->DrawIntegral();
123 
124  TF1 *fnbt = new TF1("fnbt",this,&EdbSEQ::FDNbt,0.,1.,0,"EdbSEQ","FDNbt");
125  fnbt->SetTitle("dNbt/dTheta in 1 view density function");
126  fnbt->SetNpx(eNP);
127 
128  cn->cd(3);
129  fnbt->Draw();
130  cn->cd(4);
131  fnbt->DrawIntegral();
132 }
double FDNbt(double *x, double *par)
Definition: EdbSEQ.h:47
new TCanvas()

◆ EqualizeMT()

void EdbSEQ::EqualizeMT ( TObjArray &  mti,
TObjArray &  mto,
Double_t  area 
)
219 {
220  // Input: mti - microtracks array
221  // Output: mto - selected microtracks array
222 
223  eArea=area;
224  float tbin=0.02;
225  int nbin= (int)(eThetaLimits->Y()/tbin) + 1;
226  eHEq.InitH1( nbin, 0, (nbin-1)*tbin );
227  CalculateDensityMT(eHEq); // define critical theta density
228  if(gEDBDEBUGLEVEL>2) eHEq.Print();
229 
230  TClonesArray hw("EdbH1",eHEq.N()); // create W-hist per each theta bin
231  TArrayF thres(eHEq.N()); // W-thresholds to be defined
232  for(int i=0; i<eHEq.N(); i++) {
233  new(hw[i]) EdbH1();
234  ((EdbH1*)hw[i])->InitH1( 500, 5.*50, 17.*50. );
235  }
236 
237  int nseg = mti.GetEntriesFast();
238  for(int i=0; i<nseg; i++) {
239  EdbSegP *s = (EdbSegP*)(mti.UncheckedAt(i));
240  int jtheta = eHEq.IX(s->Theta());
241  if(jtheta>eHEq.N()-1) continue;
242  float w = Wmt(*s);
243  ((EdbH1*)hw[jtheta])->Fill(w);
244  }
245 
246  for(int i=0; i<eHEq.N(); i++) {
247  int eccess = ((EdbH1*)hw[i])->Integral() - eHEq.Bin(i);
248  if( eccess <= 0 ) continue; // the threshold remains 0
249 
250  int nsum=0;
251  for(int j=0; j<((EdbH1*)hw[i])->N(); j++) {
252  nsum+=((EdbH1*)hw[i])->Bin(j);
253  if( nsum >= eccess ) { thres[i] = ((EdbH1*)hw[i])->X(j)-((EdbH1*)hw[i])->Xbin(); break; }
254  }
255  }
256 
257  for(int i=0; i<nseg; i++) {
258  EdbSegP *s = (EdbSegP*)(mti.UncheckedAt(i));
259  int jtheta = eHEq.IX(s->Theta());
260  if(jtheta>eHEq.N()-1) continue;
261  float w = Wmt(*s);
262  if( w > thres[jtheta] )
263  if(!IsInsideThetaRange(s))
264  mto.Add(s);
265  }
266 
267  Log(2,"EdbSEQ::EqualizeMT","selected %3.1f\% (%d of %d) segments in area of %7.1f cm²", 100.*mto.GetEntriesFast()/nseg, mto.GetEntriesFast(), nseg, (float)(eArea/1000./1000./10./10.) );
268 }
Definition: EdbCell1.h:17
int Bin(int ix) const
Definition: EdbCell1.h:57
void Print()
Definition: EdbCell1.cpp:160
int IX(float x) const
Definition: EdbCell1.h:50
int InitH1(const EdbH1 &h)
Definition: EdbCell1.h:38
void CalculateDensityMT(EdbH1 &hEq)
Definition: EdbSEQ.cxx:135
float Wmt(EdbSegP &s)
Definition: EdbSEQ.h:60
bool IsInsideThetaRange(EdbSegP *s)
Definition: EdbSEQ.cxx:204
Float_t Theta() const
Definition: EdbSegP.h:181
gEDBDEBUGLEVEL
Definition: energy.C:7

◆ ExcludeThetaRange()

void EdbSEQ::ExcludeThetaRange ( TObjArray &  mti,
TObjArray &  mto 
)
194 {
195  // exclude 1 sigma in theta around all requested segments
196  int nseg = mti.GetEntriesFast();
197  for(int i=0; i<nseg; i++) {
198  EdbSegP *s = (EdbSegP*)(mti.UncheckedAt(i));
199  if(!IsInsideThetaRange(s)) mto.Add(s);
200  }
201 }

◆ FDNbt()

double EdbSEQ::FDNbt ( double *  x,
double *  par 
)
inline
47 {return DNbt(*x);}
double DNbt(double t)
Definition: EdbSEQ.cxx:95

◆ FDNmt()

double EdbSEQ::FDNmt ( double *  x,
double *  par 
)
inline
44 {return DNmt(*x);}
double DNmt(double t)
Definition: EdbSEQ.cxx:82

◆ IsInsideThetaRange()

bool EdbSEQ::IsInsideThetaRange ( EdbSegP s)
205 {
206  // exclude 1 sigma in theta around all requested segments
207  int nrange = eExcludeThetaRange.GetEntriesFast();
208  for(int j=0; j<nrange; j++) {
209  EdbSegP *sex = (EdbSegP*)(eExcludeThetaRange.UncheckedAt(j));
210  float dtx = s->TX() - sex->TX();
211  float dty = s->TY() - sex->TY();
212  if( (dtx*dtx/sex->STX()/sex->STX()+dty*dty/sex->STY()/sex->STY())<1. ) return 1;
213  }
214  return 0;
215 }
Float_t STX() const
Definition: EdbSegP.h:161
Float_t TX() const
Definition: EdbSegP.h:172
Float_t TY() const
Definition: EdbSegP.h:173
Float_t STY() const
Definition: EdbSegP.h:162

◆ PreSelection()

void EdbSEQ::PreSelection ( EdbPattern pi,
TObjArray &  po 
)
158 {
159  int nseg = pi.N();
160  for(int i=0; i<nseg; i++) {
161  EdbSegP *s = pi.GetSegment(i);
162  if(eChiLimits) {
163  if( s->Chi2() < eChiLimits->X() ) continue;
164  if( s->Chi2() > eChiLimits->Y() ) continue;
165  }
166  if(eXLimits) {
167  if( s->X() < eXLimits->X() ) continue;
168  if( s->X() > eXLimits->Y() ) continue;
169  }
170  if(eYLimits) {
171  if( s->Y() < eYLimits->X() ) continue;
172  if( s->Y() > eYLimits->Y() ) continue;
173  }
174  if(eWLimits) {
175  if( s->W() < eWLimits->X() ) continue;
176  if( s->W() > eWLimits->Y() ) continue;
177  }
178  if(eThetaLimits) {
179  if( s->Theta() < eThetaLimits->X() ) continue;
180  if( s->Theta() > eThetaLimits->Y() ) continue;
181  }
182  po.Add(s);
183  }
184 }
Float_t X() const
Definition: EdbSegP.h:170
Float_t Chi2() const
Definition: EdbSegP.h:154
Float_t Y() const
Definition: EdbSegP.h:171
Float_t W() const
Definition: EdbSegP.h:148
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
TProfile * po
Definition: testChi2Ordering.C:29

◆ PrintLimits()

void EdbSEQ::PrintLimits ( )
48 {
49  if(eXLimits) printf("XLimits: %f %f\n",eXLimits->X(),eXLimits->Y());
50  if(eYLimits) printf("YLimits: %f %f\n",eYLimits->X(),eYLimits->Y());
51  if(eWLimits) printf("WLimits: %f %f\n",eWLimits->X(),eWLimits->Y());
52  if(eChiLimits) printf("ChiLimits: %f %f\n",eChiLimits->X(),eChiLimits->Y());
53  if(eThetaLimits) printf("ThetaLimits: %f %f\n",eThetaLimits->X(),eThetaLimits->Y());
54 }

◆ ResetExcludeThetaRange()

void EdbSEQ::ResetExcludeThetaRange ( )
inline
55 {eExcludeThetaRange.Delete();}

◆ Set0()

void EdbSEQ::Set0 ( )
32 {
33  eS0mt = 270.*340.; // area unit for Nseg calculation in microns
34  //eNviews = 1; // number of views used for total area calculation
35  eArea = eS0mt; // effective area of the pattern to be equalize
36  eNsigma=4;
37  eNP = 100;
38  eExcludeThetaRange.SetOwner(1);
39  eXLimits =0;
40  eYLimits =0;
41  eThetaLimits=0;
42  eWLimits =0;
43  eChiLimits =0;
44 }
Double_t eS0mt
Definition: EdbSEQ.h:15

◆ SetChiLimits()

void EdbSEQ::SetChiLimits ( float  cmin,
float  cmax 
)
inline
41 {SafeDelete(eChiLimits); eChiLimits=new TVector2(cmin,cmax);}

◆ SetThetaLimits()

void EdbSEQ::SetThetaLimits ( float  tmin,
float  tmax 
)
inline
40 {SafeDelete(eThetaLimits); eThetaLimits=new TVector2(tmin,tmax);}

◆ SetWLimits()

void EdbSEQ::SetWLimits ( float  wmin,
float  wmax 
)
inline
39 {SafeDelete(eWLimits); eWLimits=new TVector2(wmin,wmax);}

◆ SetXLimits()

void EdbSEQ::SetXLimits ( float  xmin,
float  xmax 
)
inline
37 {SafeDelete(eXLimits); eXLimits=new TVector2(xmin,xmax);}
float xmin
Definition: emthickness.cpp:61
float xmax
Definition: emthickness.cpp:61

◆ SetYLimits()

void EdbSEQ::SetYLimits ( float  ymin,
float  ymax 
)
inline
38 {SafeDelete(eYLimits); eYLimits=new TVector2(ymin,ymax);}
float ymin
Definition: emthickness.cpp:63
float ymax
Definition: emthickness.cpp:63

◆ ThetaPlot() [1/2]

TH1F * EdbSEQ::ThetaPlot ( EdbPattern p,
const char *  name = "theta",
const char *  title = "EdbSEQ theta distribution normalised to area" 
)
58 {
59  int n = arr.N(); if(!n) return 0;
60  TObjArray a(n);
61  for(int i=0; i<n; i++) a.Add(arr.GetSegment(i));
62  return ThetaPlot(a, name, title);
63 }
void a()
Definition: check_aligned.C:59
TH1F * ThetaPlot(TObjArray &arr, const char *name="theta", const char *title="EdbSEQ theta distribution normalised to area")
Definition: EdbSEQ.cxx:66
const char * name
Definition: merge_Energy_SytematicSources_Electron.C:24

◆ ThetaPlot() [2/2]

TH1F * EdbSEQ::ThetaPlot ( TObjArray &  arr,
const char *  name = "theta",
const char *  title = "EdbSEQ theta distribution normalised to area" 
)
67 {
68  int n = arr.GetEntries(); if(!n) return 0;
69  float tbin=0.01;
70  int nbin= (int)(eThetaLimits->Y()/tbin) + 1;
71  TH1F *h = new TH1F( name, Form("%s normalised to area of %8.1f mm²",title,eArea/1000./1000.), nbin, 0., (nbin-1)*tbin );
72  for(int i=0; i<n; i++) {
73  EdbSegP *s = (EdbSegP*)(arr.At(i));
74  h->Fill(s->Theta());
75  }
76  h->GetXaxis()->SetTitle("theta");
77  if(eArea>0) h->Scale(1000000./eArea);
78  return h;
79 }

◆ Wmt()

float EdbSEQ::Wmt ( EdbSegP s)
inline
60 { return s.W()*50. + s.DZ(); }
Float_t DZ() const
Definition: EdbSegP.h:151

Member Data Documentation

◆ eArea

Double_t EdbSEQ::eArea

◆ eChiLimits

TVector2* EdbSEQ::eChiLimits
private

◆ eExcludeThetaRange

TObjArray EdbSEQ::eExcludeThetaRange

◆ eHEq

EdbH1 EdbSEQ::eHEq

◆ eNP

int EdbSEQ::eNP

◆ eNsigma

Double_t EdbSEQ::eNsigma

◆ eS0mt

Double_t EdbSEQ::eS0mt

◆ eThetaLimits

TVector2* EdbSEQ::eThetaLimits
private

◆ eWLimits

TVector2* EdbSEQ::eWLimits
private

◆ eXLimits

TVector2* EdbSEQ::eXLimits
private

◆ eYLimits

TVector2* EdbSEQ::eYLimits
private

The documentation for this class was generated from the following files: