CGEM BOSS 6.6.5.h
BESIII Offline Software System
Loading...
Searching...
No Matches
TRungeFitter Class Reference

A class to fit a TTrackBase object to a 3D line. More...

#include <TRungeFitter.h>

+ Inheritance diagram for TRungeFitter:

Public Member Functions

 TRungeFitter (const std::string &name)
 Constructor.
 
 TRungeFitter (const std::string &name, bool m_sag, int m_prop, bool m_tof)
 
virtual ~TRungeFitter ()
 Destructor.
 
void dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
 dumps debug information.
 
virtual int fit (TTrackBase &) const
 
virtual int fit (TTrackBase &, float t0Offset, int layer) const
 
void innerwall (TRunge &trk, int l_mass, double y[6]) const
 
void sag (bool)
 
const RkFitMaterial getMaterial (int i) const
 
void propagation (int)
 
void tof (bool)
 
void setBesFromGdml (void)
 
- Public Member Functions inherited from TMFitter
 TMFitter (const std::string &name)
 Constructor.
 
virtual ~TMFitter ()
 Destructor.
 
const std::string & name (void) const
 returns name.
 
void dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
 

Public Attributes

std::vector< RkFitCylinder_BesBeamPipeWalls
 
std::vector< RkFitMaterial_BesBeamPipeMaterials
 

Additional Inherited Members

- Protected Member Functions inherited from TMFitter
void fitDone (TTrackBase &) const
 sets the fitted flag. (Bad implementation)
 

Detailed Description

A class to fit a TTrackBase object to a 3D line.

Definition at line 34 of file TRungeFitter.h.

Constructor & Destructor Documentation

◆ TRungeFitter() [1/2]

TRungeFitter::TRungeFitter ( const std::string & name)

Constructor.

Definition at line 90 of file TRungeFitter.cxx.

91 : TMFitter(name),
92 _sag(true),_propagation(1),_tof(false){
93
94 StatusCode scmgn = Gaudi::svcLocator()->service("MagneticFieldSvc",m_pmgnIMF);
95 if(scmgn!=StatusCode::SUCCESS) {
96 std::cout<< __FILE__<<" Unable to open Magnetic field service"<<std::endl;
97 }
98}
const std::string & name(void) const
returns name.
Definition TMFitter.h:73
TMFitter(const std::string &name)
Constructor.
Definition TMFitter.cxx:17

◆ TRungeFitter() [2/2]

TRungeFitter::TRungeFitter ( const std::string & name,
bool m_sag,
int m_prop,
bool m_tof )

Definition at line 99 of file TRungeFitter.cxx.

101 : TMFitter(name),
102 _sag(m_sag),_propagation(m_prop),_tof(m_tof){
103
104 StatusCode scmgn = Gaudi::svcLocator()->service("MagneticFieldSvc",m_pmgnIMF);
105 if(scmgn!=StatusCode::SUCCESS) {
106 std::cout<< "Unable to open Magnetic field service"<<std::endl;
107 }
108}
NTuple::Array< double > m_tof

◆ ~TRungeFitter()

TRungeFitter::~TRungeFitter ( )
virtual

Destructor.

Definition at line 110 of file TRungeFitter.cxx.

110 {
111}

Member Function Documentation

◆ dump()

void TRungeFitter::dump ( const std::string & message = std::string(""),
const std::string & prefix = std::string("") ) const

dumps debug information.

◆ fit() [1/2]

int TRungeFitter::fit ( TTrackBase & tb) const
virtual

Implements TMFitter.

Definition at line 122 of file TRungeFitter.cxx.

122 {
123 return fit(tb,0,-1);
124}
virtual int fit(TTrackBase &) const

Referenced by TrkReco::execute(), and fit().

◆ fit() [2/2]

int TRungeFitter::fit ( TTrackBase & tb,
float t0Offset,
int layer ) const
virtual

Definition at line 126 of file TRungeFitter.cxx.

126 {
127// Argument layer is used for calibration interface in which doca is calculated without measured hit. liucy
128 IMdcCalibFunSvc* l_mdcCalFunSvc;
129 Gaudi::svcLocator() -> service("MdcCalibFunSvc", l_mdcCalFunSvc);
130 //std::cout<<"TRungeFitter::fit start"<<std::endl;
131 //...Type check...
132 if(tb.objectType() != Runge) return TFitUnavailable;
133 TRunge& t = (TRunge&) tb;
134 //...Already fitted ?...
135 if(t.fitted()&&layer==-1) return TFitAlreadyFitted;
136 //...Count # of hits...
137 const AList<TMLink>& cores = t.cores();
138 unsigned nCores = cores.length();
139 unsigned nStereoCores = NStereoHits(cores);
140 TMLink* last=NULL;
141 int lyr=0;
142 int layerid=0;
143 for(int i=0;i<nCores;i++){
144 layerid=(*cores[i]->hit()).wire()->layerId();
145 if(layerid>=lyr){
146 lyr=layerid;
147 last=cores[i];
148 }
149 }
150
151 //...Check # of hits...
152 // if ((nStereoCores < 2) || (nCores - nStereoCores < 3))
153 // return TFitErrorFewHits;
154
155 //...Move pivot to ORIGIN...
156 const HepPoint3D pivot_bak = t.pivot();
157 t.pivot(ORIGIN);
158
159 //...Setup...
160 Vector a(5),da(5);
161 a = t.a();
162 Vector ainitial(a);
163 Vector dDda(5);
164 Vector dchi2da(5);
165 SymMatrix d2chi2d2a(5,0);
166 const SymMatrix zero5(5,0);
167 double chi2;
168 double chi2Old = 0;
169 for(int i=0;i<t.links().length();i++){
170 chi2Old=chi2Old+t.links()[i]->pull();
171 }
172 chi2Old=DBL_MAX;
173 int err = 0;
174
175 double factor = 0.1;
176 Vector beta(5);
177 SymMatrix alpha(5,0);
178 SymMatrix alpha2(5,0);
179
180 double (*d)[5]=new double[nCores][5];
181 // double (*d2)[5]=new double[nCores][5];
182 Vector ea(5);
183
184 float tof;
185 HepVector3D p;
186 unsigned i;
187
188 double distance;
189 double eDistance;
190
191 // ea... init
192 const double ea_init=0.000001;
193 ea[0]=ea_init; //dr
194 ea[1]=ea_init; //phi0
195 ea[2]=ea_init; //kappa
196 ea[3]=ea_init; //dz
197 ea[4]=ea_init; //tanl
198
199 //std::cout<<"TRF ::"<<a[0]<<","<<a[1]<<","<<a[2]<<","<<a[3]<<","<<a[4]<<std::endl;
200
201 //long int lclock0=clock()/1000;
202 //long int lclock=lclock0;
203
204 Vector def_a(t.a());
205 Vector ta(def_a);
206
207 //...Fitting loop...
208 unsigned nTrial = 0;
209 while(nTrial < 100){
210
211 //...Set up...
212 chi2 = 0;
213 for (unsigned j=0;j<5;j++) dchi2da[j]=0;
214 d2chi2d2a=zero5;
215
216 def_a=t.a();
217
218 //#### loop for shifted helix parameter set ####
219 for(unsigned j=0;j<5;j++){
220 ta=def_a;
221 ta[j]+=ea[j];
222 t.a(ta);
223 //...Loop with hits...
224 i=0;
225 //std::cout<<"TRF:: cores="<<cores.length()<<std::endl;
226 while(TMLink * l = cores[i++]){
227 //...Cal. closest points...
228 t.approach(* l,tof,p,_BesBeamPipeMaterials[0],_sag);
229 const HepPoint3D& onTrack=l->positionOnTrack();
230 const HepPoint3D& onWire=l->positionOnWire();
231 d[i-1][j]=(onTrack-onWire).mag();
232 //std::cout<<"TRF:: i="<<i<<std::endl;
233 }//end of loop with hits
234 //lclock=clock()/1000;
235 //std::cout<<"TRF clock="<<lclock-lclock0<<std::endl;
236 //lclock0=lclock;
237 }
238 /*
239 for(int j=0;j<5;j++){
240 ta=def_a;
241 ta[j]-=ea[j];
242 t.a(ta);
243 //...Loop with hits...
244 float tof_dummy;
245 Vector3 p_dummy;
246 unsigned i=0;
247 while(TMLink* l = cores[i++]){
248 //...Cal. closest points...
249 t.approach(*l,tof_dummy,p_dummy,_sag);
250 const HepPoint3D& onTrack=l->positionOnTrack();
251 const HepPoint3D& onWire=l->positionOnWire();
252 d2[i-1][j]=(onTrack-onWire).mag();
253 }//end of loop with hits
254 }
255 */
256 t.a(def_a);
257
258 //#### original parameter set and calc. chi2 ####
259 //...Loop with hits...
260 i=0;
261 while(TMLink * l = cores[i++]){
262 const TMDCWireHit& h = * l->hit();
263 //...Cal. closest points...
264 if(t.approach(* l,tof,p,_BesBeamPipeMaterials[0],_sag)<0){
265 std::cout<<"TrkReco:TRF:: bad wire"<<std::endl;
266 continue;
267 }
268 int layerId=h.wire()->layerId();
269 const HepPoint3D& onTrack=l->positionOnTrack();
270 const HepPoint3D& onWire=l->positionOnWire();
271 unsigned leftRight = WireHitRight;
272 if (onWire.cross(onTrack).z() < 0.) leftRight = WireHitLeft;
273
274 //...Obtain drift distance and its error...
275 if ((t0Offset == 0.) && (_propagation==0) && (! _tof)) {
276 //...No correction...
277 distance = l->drift(leftRight);
278 eDistance = h.dDrift(leftRight);
279 }else{
280 //...T0 and propagation corrections...
281 int wire = h.wire()->id();
282 int wirelocal=h.wire()->localId();
283 int side = leftRight;
284 if (side==0) side = 0;
285 float tp[3] = {p.x(),p.y(),p.z()};
286 float x[3] = {onWire.x(), onWire.y(), onWire.z()};
287 double tprop = l_mdcCalFunSvc->getTprop(layerId,onWire.z()*10.);
288 double timeWalk = l_mdcCalFunSvc->getTimeWalk(layerId, h.reccdc()->adc);
289 double T0 = l_mdcCalFunSvc->getT0(layerId,wirelocal);
290 double drifttime = h.reccdc()->tdc - tof - tprop - timeWalk -T0;
291 l->setDriftTime(drifttime);
292 float dist;
293 float edist;
294 int prop = _propagation;
295 const double x0 = t.helix().pivot().x();
296 const double y0 = t.helix().pivot().y();
297 Hep3Vector pivot_helix(x0,y0,0);
298 const double dr = t.helix().a()[0];
299 const double phi0 = t.helix().a()[1];
300 const double kappa = t.helix().a()[2];
301 const double dz = t.helix().a()[3];
302 const double tanl = t.helix().a()[4];
303
304 const double Bz = -1000*(m_pmgnIMF->getReferField());
305 const double alpha = 333.564095 / Bz;
306
307 const double cox = x0 + dr*cos(phi0)- alpha*cos(phi0)/kappa;
308 const double coy = y0 + dr*sin(phi0) - alpha*sin(phi0)/kappa;
309 HepPoint3D dir(onTrack.y()-coy,cox-onTrack.x(),0);
310 double pos_phi=onWire.phi();
311 double dir_phi=dir.phi();
312 while(pos_phi>pi){pos_phi-=pi;}
313 while(pos_phi<0){pos_phi+=pi;}
314 while(dir_phi>pi){dir_phi-=pi;}
315 while(dir_phi<0){dir_phi+=pi;}
316 double entrangle=dir_phi-pos_phi;
317 while(entrangle>pi/2)entrangle-=pi;
318 while(entrangle<(-1)*pi/2)entrangle+=pi;
319 dist = l_mdcCalFunSvc->driftTimeToDist(drifttime,layerId, wirelocal, side, entrangle);
320 dist= dist/10;//mm->cmo
321 if(layer==-1||layerId!=layer){
322 edist = l_mdcCalFunSvc->getSigma(layerId, side, dist, entrangle,tanl,onWire.z()*10,h.reccdc()->adc); }
323 else if(layerId==layer){edist=99999999;}
324 edist = edist/10;
325 distance = (double) dist;
326 eDistance = (double) edist;
327
328 }
329 double eDistance2=eDistance*eDistance;
330
331 //...Residual...
332 const double d0 = (onTrack-onWire).mag();
333 //if(d0>2) std::cout<<"TRF:: strange dist. d0="<<d0<<" x="<<distance
334 // <<" ex="<<eDistance<<std::endl;
335 double dDistance = d0 - distance;
336
337 //...dDda...
338 for(int j=0;j<5;j++){
339 dDda[j]=(d[i-1][j]-d0)/ea[j];
340 //if(dDda[j]==0) std::cout<<"TRF:: dDda=0 j="<<j<<" ea="<<ea[j]<<std::endl;
341 }
342 // for(int j=0;j<5;j++) dDda[j]=(d[i-1][j]-d2[i-1][j])/ea[j]/2.;
343 //...Chi2 related...
344 dchi2da += (dDistance / eDistance2) * dDda;
345 d2chi2d2a += vT_times_v(dDda) / eDistance2;
346 double pChi2 = dDistance * dDistance / eDistance2;
347 chi2 += pChi2;
348 //if(!(pChi2<0 || pChi2>=0)){
349 // std::cout<<"TRF:: pChi2="<<pChi2<<" X="<<d0<<" fx="<<distance
350 // <<" ex="<<eDistance<<std::endl;
351 //}
352
353 //...Store results...
354 if(layer==-1){
355 l->update(onTrack, onWire, leftRight, pChi2);
356 l->drift(distance,0);
357 l->drift(distance,1);
358 l->dDrift(eDistance,0);
359 l->dDrift(eDistance,1);
360 }
361
362 else if(layerId==layer){
363 l->distance((onTrack-onWire).mag());
364 }
365 }//end of loop with hits
366
367 //...Check condition...
368 double change = chi2Old - chi2;
369 if (0 <= change && change < 0.01) break;
370 if (change < 0.) {
371 factor *= 100;
372 a += da; //recover
373 if(-0.01 < change){
374 d2chi2d2a=alpha;
375 chi2=chi2Old;
376 break;
377 }
378 }else if(change > 0.){
379 chi2Old = chi2;
380 factor *= 0.1;
381 alpha=d2chi2d2a;
382 beta=dchi2da;
383 }else if(nTrial==0){
384 chi2Old = chi2;
385 factor *= 0.1;
386 alpha=d2chi2d2a;
387 beta=dchi2da;
388 }else{
389 std::cout<<"TrkReco:TRF:: bad chi2 = "<<chi2<<std::endl;
390 err=TFitFailed;
391// break; // protection for nan
392 return err;
393 }
394 alpha2=alpha;
395 for(unsigned j=0;j<5;j++) alpha2[j][j]*=(1+factor);
396 //...Cal. helix parameters for next loop...
397 da = solve(alpha2,beta);
398
399 //lclock=clock()/1000;
400 //std::cout<<"TRF "<<nTrial<<": "
401 // <<"cl="<<lclock-lclock0<<": "
402 // <<a[0]<<","<<a[1]<<","<<a[2]<<","<<a[3]<<","<<a[4]<<" "
403 // <<chi2<<"/"<<nCores<<":"<<factor
404 // <<" :da "<<da[0]<<","<<da[1]<<","<<da[2]<<","<<da[3]<<","<<da[4]<<std::endl;
405 //lclock0=lclock;
406
407 a -= da;
408 t.a(a);
409 //ea = 0.0001*da;
410 for(i=0;i<5;i++){
411 ea[i]=0.0001*abs(da[i]);
412 if(ea[i]>ea_init) ea[i]=ea_init;
413 if(ea[i]<1.0e-10) ea[i]=1.0e-10;
414 }
415 ++nTrial;
416 }
417 //std::cout<<"TRungeFitter:: nTrial="<<nTrial<<std::endl;
418
419 //...Cal. error matrix...
420 SymMatrix Ea(5,0);
421 unsigned dim;
422 dim=5;
423 Ea = d2chi2d2a.inverse(err);
424 if(nCores){
425 t.approach(*last,tof,p,_BesBeamPipeMaterials[0],_sag);}
426 // consider the material effect beam pipe.
427 double y_[6]={0,0,0,0,0,0};
428 t.SetFirst(y_);//obtain the momentum of the first layer
429 int lmass=0;
430 innerwall(t,lmass,y_);// consider the material layer by layer
431 int nsign=a[2]/abs(a[2]);
432 // Update the helix parameter (momentum part.)
433 a[4]=y_[5]/sqrt(y_[4]*y_[4]+y_[3]*y_[3]);
434 a[2]=nsign*1/sqrt(y_[4]*y_[4]+y_[3]*y_[3]);
435 //...Store information...
436 if(! err&&layer==-1){
437 t.a(a);
438 t.Ea(Ea);
439 t._fitted = true;
440 }else if(! err&&layer!=-1){
441 t.a(ainitial);
442// t.Ea(Ea);
443 t._fitted = true;
444 }else{
445 err = TFitFailed;
446 }
447
448 t._ndf = nCores - dim;
449 t._chi2 = chi2;
450
451 //...Recover pivot...
452 t.pivot(pivot_bak);
453
454 delete [] d;
455 // delete [] d2;
456
457 return err;
458}
double sin(const BesAngle a)
Definition BesAngle.h:210
double cos(const BesAngle a)
Definition BesAngle.h:213
double length
Double_t x[10]
double abs(const EvtComplex &c)
const double alpha
#define DBL_MAX
Definition KalFitAlg.h:13
const HepPoint3D ORIGIN
Constants.
Definition TMDCUtil.cxx:47
#define WireHitLeft
Definition TMDCWireHit.h:21
#define WireHitRight
Definition TMDCWireHit.h:22
#define TFitAlreadyFitted
Definition TMFitter.h:28
#define TFitFailed
Definition TMFitter.h:30
#define TFitUnavailable
Definition TMFitter.h:31
#define Runge
Definition TRunge.h:19
virtual double getReferField()=0
virtual double driftTimeToDist(double drifttime, int layid, int cellid, int lr, double entrance=0.0) const =0
virtual double getSigma(int layid, int lr, double dist, double entrance=0.0, double tanlam=0.0, double z=0.0, double Q=1000.0) const =0
virtual double getTprop(int lay, double z) const =0
virtual double getT0(int layid, int cellid) const =0
virtual double getTimeWalk(int layid, double Q) const =0
struct MdcRec_wirhit * reccdc(void) const
returns a pointer to RECMDC_WIRHIT.
float dDrift(unsigned) const
returns drift distance error.
const TMDCWire *const wire(void) const
returns a pointer to a TMDCWire.
unsigned id(void) const
returns id.
Definition TMDCWire.h:207
unsigned localId(void) const
returns local id in a wire layer.
Definition TMDCWire.h:213
unsigned layerId(void) const
returns layer id.
Definition TMDCWire.h:219
void innerwall(TRunge &trk, int l_mass, double y[6]) const
std::vector< RkFitMaterial > _BesBeamPipeMaterials
void tof(bool)
A class to represent a track in tracking.
Definition TRunge.h:65
virtual unsigned objectType(void) const
returns object type.
Definition TTrackBase.h:268
int t()
Definition t.c:1
const float pi
Definition vector3.h:133

◆ getMaterial()

const RkFitMaterial TRungeFitter::getMaterial ( int i) const

◆ innerwall()

void TRungeFitter::innerwall ( TRunge & trk,
int l_mass,
double y[6] ) const

Definition at line 671 of file TRungeFitter.cxx.

671 {
672 for(int i = 0; i < _BesBeamPipeWalls.size(); i++) {
673 _BesBeamPipeWalls[i].updateTrack(track,y);
674 }
675}
std::vector< RkFitCylinder > _BesBeamPipeWalls

Referenced by fit().

◆ propagation()

void TRungeFitter::propagation ( int _in)

Definition at line 116 of file TRungeFitter.cxx.

116 {
117 _propagation = _in;
118}

◆ sag()

void TRungeFitter::sag ( bool _in)

Definition at line 113 of file TRungeFitter.cxx.

113 {
114 _sag = _in;
115}

◆ setBesFromGdml()

void TRungeFitter::setBesFromGdml ( void )

mdcgas

inner wall aluminium

air

outer beryllium pipe

cooling oil

inner beryllium pipe

gold

now construct the cylinders

innerwall of inner drift chamber

outer air, be attention the calculation of the radius and thick of the air cylinder is special

outer Beryllium layer

oil layer

inner Beryllium layer

gold layer

Definition at line 459 of file TRungeFitter.cxx.

459 {
460 int i(0);
461 double Z(0.),A(0.),Ionization(0.),Density(0.),Radlen(0.);
462
463 G4LogicalVolume *logicalMdc = 0;
464 MdcG4Geo* aMdcG4Geo = new MdcG4Geo();
465 logicalMdc = aMdcG4Geo->GetTopVolume();
466
467 /// mdcgas
468 G4Material* mdcMaterial = logicalMdc->GetMaterial();
469
470 for(i=0; i<mdcMaterial->GetElementVector()->size(); i++){
471 Z += (mdcMaterial->GetElement(i)->GetZ())*
472 (mdcMaterial->GetFractionVector()[i]);
473 A += (mdcMaterial->GetElement(i)->GetA())*
474 (mdcMaterial->GetFractionVector()[i]);
475 }
476 Ionization = mdcMaterial->GetIonisation()->GetMeanExcitationEnergy();
477 Density = mdcMaterial->GetDensity()/(g/cm3);
478 Radlen = mdcMaterial->GetRadlen();
479 RkFitMaterial FitMdcMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.);
480 cout<<"mdcgas: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<endl;
481 _BesBeamPipeMaterials.push_back(FitMdcMaterial);
482 //RkFitTrack::mdcGasRadlen_ = Radlen/10.;
483
484 /// inner wall aluminium
485 G4LogicalVolume* innerwallVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalMdcSegment2"));
486 G4Material* innerwallMaterial = innerwallVolume->GetMaterial();
487 G4Tubs* innerwallTub = dynamic_cast<G4Tubs*>(innerwallVolume->GetSolid());
488
489 Z = 0.;
490 A = 0.;
491 for(i=0; i<innerwallMaterial->GetElementVector()->size(); i++){
492 Z += (innerwallMaterial->GetElement(i)->GetZ())*
493 (innerwallMaterial->GetFractionVector()[i]);
494 A += (innerwallMaterial->GetElement(i)->GetA())*
495 (innerwallMaterial->GetFractionVector()[i]);
496 }
497
498 Ionization = innerwallMaterial->GetIonisation()->GetMeanExcitationEnergy();
499 Density = innerwallMaterial->GetDensity()/(g/cm3);
500 Radlen = innerwallMaterial->GetRadlen();
501 cout<<"Mdc innerwall, Al: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<endl;
502 RkFitMaterial FitInnerwallMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.);
503 _BesBeamPipeMaterials.push_back(FitInnerwallMaterial);
504
505 ///////////////////////////////////////////////////////////////////////////////////////////////////
506 G4LogicalVolume *logicalBes = 0;
507 BesG4Geo* aBesG4Geo = new BesG4Geo();
508 logicalBes = aBesG4Geo->GetTopVolume();
509
510 /// air
511 G4LogicalVolume* logicalAirVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalWorld"));
512 G4Material* airMaterial = logicalAirVolume->GetMaterial();
513 Z = 0.;
514 A = 0.;
515 for(i=0; i<airMaterial->GetElementVector()->size(); i++){
516 Z += (airMaterial->GetElement(i)->GetZ())*
517 (airMaterial->GetFractionVector()[i]);
518 A += (airMaterial->GetElement(i)->GetA())*
519 (airMaterial->GetFractionVector()[i]);
520 }
521 Ionization = airMaterial->GetIonisation()->GetMeanExcitationEnergy();
522 Density = airMaterial->GetDensity()/(g/cm3);
523 Radlen = airMaterial->GetRadlen();
524 cout<<"air: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<endl;
525 RkFitMaterial FitAirMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.);
526 _BesBeamPipeMaterials.push_back(FitAirMaterial);
527
528 /// outer beryllium pipe
529 G4LogicalVolume* logicalOuterBeVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalouterBe"));
530 G4Material* outerBeMaterial = logicalOuterBeVolume->GetMaterial();
531
532 G4Tubs* outerBeTub = dynamic_cast<G4Tubs*>(logicalOuterBeVolume->GetSolid());
533 Z = 0.;
534 A = 0.;
535 for(i=0; i<outerBeMaterial->GetElementVector()->size(); i++){
536 Z += (outerBeMaterial->GetElement(i)->GetZ())*
537 (outerBeMaterial->GetFractionVector()[i]);
538 A += (outerBeMaterial->GetElement(i)->GetA())*
539 (outerBeMaterial->GetFractionVector()[i]);
540 }
541 Ionization = outerBeMaterial->GetIonisation()->GetMeanExcitationEnergy();
542 Density = outerBeMaterial->GetDensity()/(g/cm3);
543 Radlen = outerBeMaterial->GetRadlen();
544 cout<<"outer beryllium: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<endl;
545 RkFitMaterial FitOuterBeMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.);
546 _BesBeamPipeMaterials.push_back(FitOuterBeMaterial);
547
548 /// cooling oil
549 G4LogicalVolume* logicalOilLayerVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicaloilLayer"));
550 G4Material* oilLayerMaterial = logicalOilLayerVolume->GetMaterial();
551 G4Tubs* oilLayerTub = dynamic_cast<G4Tubs*>(logicalOilLayerVolume->GetSolid());
552
553 Z = 0.;
554 A = 0.;
555 for(i=0; i<oilLayerMaterial->GetElementVector()->size(); i++){
556 Z += (oilLayerMaterial->GetElement(i)->GetZ())*
557 (oilLayerMaterial->GetFractionVector()[i]);
558 A += (oilLayerMaterial->GetElement(i)->GetA())*
559 (oilLayerMaterial->GetFractionVector()[i]);
560 }
561 Ionization = oilLayerMaterial->GetIonisation()->GetMeanExcitationEnergy();
562 Density = oilLayerMaterial->GetDensity()/(g/cm3);
563 Radlen = oilLayerMaterial->GetRadlen();
564 cout<<"cooling oil: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<endl;
565 RkFitMaterial FitOilLayerMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.);
566 _BesBeamPipeMaterials.push_back(FitOilLayerMaterial);
567
568
569 /// inner beryllium pipe
570 G4LogicalVolume* logicalInnerBeVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalinnerBe"));
571
572 G4Material* innerBeMaterial = logicalInnerBeVolume->GetMaterial();
573 G4Tubs* innerBeTub = dynamic_cast<G4Tubs*>(logicalInnerBeVolume->GetSolid());
574 Z = 0.;
575 A = 0.;
576 for(i=0; i<innerBeMaterial->GetElementVector()->size(); i++){
577 Z += (innerBeMaterial->GetElement(i)->GetZ())*
578 (innerBeMaterial->GetFractionVector()[i]);
579 A += (innerBeMaterial->GetElement(i)->GetA())*
580 (innerBeMaterial->GetFractionVector()[i]);
581 }
582 Ionization = innerBeMaterial->GetIonisation()->GetMeanExcitationEnergy();
583 Density = innerBeMaterial->GetDensity()/(g/cm3);
584 Radlen = innerBeMaterial->GetRadlen();
585 cout<<"inner beryllium: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<endl;
586 RkFitMaterial FitInnerBeMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.);
587 _BesBeamPipeMaterials.push_back(FitInnerBeMaterial);
588
589
590 /// gold
591 G4LogicalVolume* logicalGoldLayerVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalgoldLayer"));
592 G4Material* goldLayerMaterial = logicalGoldLayerVolume->GetMaterial();
593 G4Tubs* goldLayerTub = dynamic_cast<G4Tubs*>(logicalGoldLayerVolume->GetSolid());
594
595 Z = 0.;
596 A = 0.;
597 for(i=0; i<goldLayerMaterial->GetElementVector()->size(); i++){
598 Z += (goldLayerMaterial->GetElement(i)->GetZ())*
599 (goldLayerMaterial->GetFractionVector()[i]);
600 A += (goldLayerMaterial->GetElement(i)->GetA())*
601 (goldLayerMaterial->GetFractionVector()[i]);
602 }
603 Ionization = goldLayerMaterial->GetIonisation()->GetMeanExcitationEnergy();
604 Density = goldLayerMaterial->GetDensity()/(g/cm3);
605 Radlen = goldLayerMaterial->GetRadlen();
606 cout<<"gold layer: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<endl;
607 RkFitMaterial FitGoldLayerMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.);
608 _BesBeamPipeMaterials.push_back(FitGoldLayerMaterial);
609
610
611 /// now construct the cylinders
612 double radius, thick, length , z0;
613
614 /// innerwall of inner drift chamber
615 radius = innerwallTub->GetInnerRadius()/(cm);
616 thick = innerwallTub->GetOuterRadius()/(cm) - innerwallTub->GetInnerRadius()/(cm);
617 length = 2.0*innerwallTub->GetZHalfLength()/(cm);
618 z0 = 0.0;
619 cout<<"innerwall: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<endl;
620 RkFitCylinder innerwallCylinder(&_BesBeamPipeMaterials[1], radius, thick, length , z0);
621 _BesBeamPipeWalls.push_back(innerwallCylinder);
622
623 /// outer air, be attention the calculation of the radius and thick of the air cylinder is special
624 radius = outerBeTub->GetOuterRadius()/(cm);
625 thick = innerwallTub->GetInnerRadius()/(cm) - outerBeTub->GetOuterRadius()/(cm);
626 length = 2.0*innerwallTub->GetZHalfLength()/(cm);
627 z0 = 0.0;
628 cout<<"outer air: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<endl;
629 RkFitCylinder outerAirCylinder(&_BesBeamPipeMaterials[2], radius, thick, length , z0);
630 _BesBeamPipeWalls.push_back(outerAirCylinder);
631
632 /// outer Beryllium layer
633 radius = outerBeTub->GetInnerRadius()/(cm);
634 thick = outerBeTub->GetOuterRadius()/(cm) - outerBeTub->GetInnerRadius()/(cm);
635 length = 2.0*outerBeTub->GetZHalfLength()/(cm);
636 z0 = 0.0;
637 cout<<"outer Be: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<endl;
638 RkFitCylinder outerBeCylinder(&_BesBeamPipeMaterials[3], radius, thick, length , z0);
639 _BesBeamPipeWalls.push_back(outerBeCylinder);
640
641 /// oil layer
642 radius = oilLayerTub->GetInnerRadius()/(cm);
643 thick = oilLayerTub->GetOuterRadius()/(cm) - oilLayerTub->GetInnerRadius()/(cm);
644 length = 2.0*oilLayerTub->GetZHalfLength()/(cm);
645 z0 = 0.0;
646 cout<<"oil layer: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<endl;
647 RkFitCylinder oilLayerCylinder(&_BesBeamPipeMaterials[4], radius, thick, length , z0);
648 _BesBeamPipeWalls.push_back(oilLayerCylinder);
649
650 /// inner Beryllium layer
651 radius = innerBeTub->GetInnerRadius()/(cm);
652 thick = innerBeTub->GetOuterRadius()/(cm) - innerBeTub->GetInnerRadius()/(cm);
653 length = 2.0*innerBeTub->GetZHalfLength()/(cm);
654 z0 = 0.0;
655 cout<<"inner Be: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<endl;
656 RkFitCylinder innerBeCylinder(&_BesBeamPipeMaterials[5], radius, thick, length , z0);
657 _BesBeamPipeWalls.push_back(innerBeCylinder);
658
659 /// gold layer
660 radius = goldLayerTub->GetInnerRadius()/(cm);
661 thick = goldLayerTub->GetOuterRadius()/(cm) - goldLayerTub->GetInnerRadius()/(cm);
662 length = 2.0*goldLayerTub->GetZHalfLength()/(cm);
663 z0 = 0.0;
664 cout<<"gold layer: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<endl;
665 RkFitCylinder goldLayerCylinder(&_BesBeamPipeMaterials[6], radius, thick, length , z0);
666 _BesBeamPipeWalls.push_back(goldLayerCylinder);
667 delete aMdcG4Geo;
668 delete aBesG4Geo;
669}//end of setBesFromGdml
Cylinder is an Element whose shape is a cylinder.
G4LogicalVolume * GetTopVolume()
Get the top(world) volume;.

◆ tof()

void TRungeFitter::tof ( bool _in)

Definition at line 119 of file TRungeFitter.cxx.

119 {
120 _tof = _in;
121}

Referenced by fit().

Member Data Documentation

◆ _BesBeamPipeMaterials

std::vector<RkFitMaterial> TRungeFitter::_BesBeamPipeMaterials

Definition at line 58 of file TRungeFitter.h.

Referenced by fit(), and setBesFromGdml().

◆ _BesBeamPipeWalls

std::vector<RkFitCylinder> TRungeFitter::_BesBeamPipeWalls

Definition at line 57 of file TRungeFitter.h.

Referenced by innerwall(), and setBesFromGdml().


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