Commit fa42c672 authored by Daniel Winklehner's avatar Daniel Winklehner
Browse files

Major Changes: 1. No more dumping or restarting in LOCAL frame. 2. OPAL-CYCL...

Major Changes: 1. No more dumping or restarting in LOCAL frame. 2. OPAL-CYCL now recalculates reference* variables before dump and saves in H5 file. 3. OPAL correctly reads reference* values and calculates beta*gamma correctly from Ekin (was factor 1000 wrong before) Note: Transformation of bunch data into local frame must now be done in POSTPROCESSING -> upgrade H5root
parent eaaa36d9
......@@ -925,9 +925,12 @@ void PartBunch::computeSelfFields() {
fstr1.close();
INFOMSG("*** FINISHED DUMPING SCALAR FIELD ***" << endl);
#endif
// charge density is in rho_m
IpplTimings::startTimer(compPotenTimer_m);
fs_m->solver_m->computePotential(rho_m, hr_scaled);
IpplTimings::stopTimer(compPotenTimer_m);
//do the multiplication of the grid-cube volume coming
......@@ -1023,7 +1026,7 @@ void PartBunch::computeSelfFields() {
IpplTimings::stopTimer(selfFieldTimer_m);
}
/*
void PartBunch::computeSelfFields_cycl(double gamma) {
IpplTimings::startTimer(selfFieldTimer_m);
......@@ -1065,7 +1068,7 @@ void PartBunch::computeSelfFields_cycl(double gamma) {
/// back Lorentz transformation
eg_m *= Vector_t(gamma, 1.0 / gamma, gamma);
*/
/*
//debug
// output field on the grid points
......@@ -1083,7 +1086,7 @@ void PartBunch::computeSelfFields_cycl(double gamma) {
*gmsg << "Field along z axis E = " << eg_m[m2][m2][i] << " Pot = " << rho_m[m2][m2][i] << endl;
// end debug
*/
/*
/// interpolate electric field at particle positions.
Ef.gather(eg_m, this->R, IntrplCIC_t());
......@@ -1101,7 +1104,7 @@ void PartBunch::computeSelfFields_cycl(double gamma) {
// *gmsg<<"min of bunch is ("<<rmin_m(0)<<", "<<rmin_m(1)<<", "<<rmin_m(2)<<") [m] "<<endl;
IpplTimings::stopTimer(selfFieldTimer_m);
}
*/
/**
* \method computeSelfFields_cycl()
......@@ -1276,13 +1279,34 @@ void PartBunch::computeSelfFields_cycl(double gamma, Vector_t const meanR, Quate
Bf(2) = -betaC * Ef(0);
}
// *gmsg<<"gamma ="<<gamma<<endl;
// *gmsg<<"dx,dy,dz =("<<hr_m[0]<<", "<<hr_m[1]<<", "<<hr_m[2]<<") [m] "<<endl;
// *gmsg<<"max of bunch is ("<<rmax_m(0)<<", "<<rmax_m(1)<<", "<<rmax_m(2)<<") [m] "<<endl;
// *gmsg<<"min of bunch is ("<<rmin_m(0)<<", "<<rmin_m(1)<<", "<<rmin_m(2)<<") [m] "<<endl;
/*
*gmsg << "gamma =" << gamma << endl;
*gmsg << "dx,dy,dz =(" << hr_m[0] << ", " << hr_m[1] << ", " << hr_m[2] << ") [m] " << endl;
*gmsg << "max of bunch is (" << rmax_m(0) << ", " << rmax_m(1) << ", " << rmax_m(2) << ") [m] " << endl;
*gmsg << "min of bunch is (" << rmin_m(0) << ", " << rmin_m(1) << ", " << rmin_m(2) << ") [m] " << endl;
*/
IpplTimings::stopTimer(selfFieldTimer_m);
}
/**
* \method computeSelfFields_cycl()
* \brief Calculates the self electric field from the charge density distribution for use in cyclotrons
* \see ParallelCyclotronTracker
* \warning none yet
*
* Overloaded version for having multiple bins with separate gamma for each bin. This is necessary
* For multi-bunch mode.
*
* Comments -DW:
* I have made some changes in here:
* -) Some refacturing to make more similar to computeSelfFields()
* -) Added meanR and quaternion to be handed to the function (TODO: fall back to meanR = 0 and unit quaternion
* if not specified) so that SAAMG solver knows how to rotate the boundary geometry correctly.
* -) Fixed an error where gamma was not taken into account correctly in direction of movement (y in cyclotron)
* -) Comment: There is no account for image charges in the cyclotron tracker (yet?)!
*/
void PartBunch::computeSelfFields_cycl(int bin, Vector_t const meanR, Quaternion_t const quaternion) {
IpplTimings::startTimer(selfFieldTimer_m);
......@@ -1312,20 +1336,69 @@ void PartBunch::computeSelfFields_cycl(int bin, Vector_t const meanR, Quaternion
double tmp2 = 1.0 / (hr_scaled[0] * hr_scaled[1] * hr_scaled[2]);
rho_m *= tmp2;
// If debug flag is set, dump scalar field (charge density 'rho') into file under ./data/
#ifdef DBG_SCALARFIELD
INFOMSG("*** START DUMPING SCALAR FIELD ***" << endl);
ofstream fstr1;
fstr1.precision(9);
std::ostringstream istr;
istr << fieldDBGStep_m;
string SfileName = OpalData::getInstance()->getInputBasename();
string rho_fn = string("data/") + SfileName + string("-rho_scalar-") + string(istr.str());
fstr1.open(rho_fn.c_str(), ios::out);
NDIndex<3> myidx1 = getFieldLayout().getLocalNDIndex();
for(int x = myidx1[0].first(); x <= myidx1[0].last(); x++) {
for(int y = myidx1[1].first(); y <= myidx1[1].last(); y++) {
for(int z = myidx1[2].first(); z <= myidx1[2].last(); z++) {
fstr1 << x + 1 << " " << y + 1 << " " << z + 1 << " " << rho_m[x][y][z].get() << endl;
}
}
}
fstr1.close();
INFOMSG("*** FINISHED DUMPING SCALAR FIELD ***" << endl);
#endif
/// now charge density is in rho_m
/// calculate Possion equation (without coefficient: -1/(eps))
IpplTimings::startTimer(compPotenTimer_m);
fs_m->solver_m->computePotential(rho_m, hr_scaled);
//do the multiplication of the grid-cube volume coming
//from the discretization of the convolution integral.
//this is only necessary for the FFT solver
//FIXME: later move this scaling into FFTPoissonSolver
IpplTimings::stopTimer(compPotenTimer_m);
// Do the multiplication of the grid-cube volume coming from the discretization of the convolution integral.
// This is only necessary for the FFT solver. FIXME: later move this scaling into FFTPoissonSolver
if(fs_m->getFieldSolverType() == "FFT" || fs_m->getFieldSolverType() == "FFTBOX")
rho_m *= hr_scaled[0] * hr_scaled[1] * hr_scaled[2];
/// retrive coefficient: -1/(eps)
rho_m *= getCouplingConstant();
// If debug flag is set, dump scalar field (potential 'phi') into file under ./data/
#ifdef DBG_SCALARFIELD
INFOMSG("*** START DUMPING SCALAR FIELD ***" << endl);
ofstream fstr2;
fstr2.precision(9);
string phi_fn = string("data/") + SfileName + string("-phi_scalar-") + string(istr.str());
fstr2.open(phi_fn.c_str(), ios::out);
NDIndex<3> myidx = getFieldLayout().getLocalNDIndex();
for(int x = myidx[0].first(); x <= myidx[0].last(); x++) {
for(int y = myidx[1].first(); y <= myidx[1].last(); y++) {
for(int z = myidx[2].first(); z <= myidx[2].last(); z++) {
fstr2 << x + 1 << " " << y + 1 << " " << z + 1 << " " << rho_m[x][y][z].get() << endl;
}
}
}
fstr2.close();
INFOMSG("*** FINISHED DUMPING SCALAR FIELD ***" << endl);
#endif
/// calculate electric field vectors from field potential
eg_m = -Grad(rho_m, eg_m);
......@@ -1336,8 +1409,8 @@ void PartBunch::computeSelfFields_cycl(int bin, Vector_t const meanR, Quaternion
eg_m *= Vector_t(gamma, 1.0 / gamma, gamma);
/*
//debug
// output field on the grid points
// Immediate debug output:
// Output potential and e-field along the x-, y-, and z-axes
int m1 = (int)nr_m[0]-1;
int m2 = (int)nr_m[0]/2;
......@@ -1350,29 +1423,65 @@ void PartBunch::computeSelfFields_cycl(int bin, Vector_t const meanR, Quaternion
for (int i=0; i<m1; i++ )
*gmsg << "Field along z axis E = " << eg_m[m2][m2][i] << " Pot = " << rho_m[m2][m2][i] << endl;
// end debug
// End debug
*/
/// interpolate electric field at particle positions.
// If debug flag is set, dump vector field (electric field) into file under ./data/
#ifdef DBG_SCALARFIELD
INFOMSG("*** START DUMPING E FIELD ***" << endl);
//ostringstream oss;
//MPI_File file;
//MPI_Status status;
//MPI_Info fileinfo;
//MPI_File_open(Ippl::getComm(), "rho_scalar", MPI_MODE_WRONLY | MPI_MODE_CREATE, fileinfo, &file);
ofstream fstr;
fstr.precision(9);
string e_field = string("data/") + SfileName + string("-e_field-") + string(istr.str());
fstr.open(e_field.c_str(), ios::out);
NDIndex<3> myidxx = getFieldLayout().getLocalNDIndex();
for(int x = myidxx[0].first(); x <= myidxx[0].last(); x++) {
for(int y = myidxx[1].first(); y <= myidxx[1].last(); y++) {
for(int z = myidxx[2].first(); z <= myidxx[2].last(); z++) {
fstr << x + 1 << " " << y + 1 << " " << z + 1 << " " << eg_m[x][y][z].get() << endl;
}
}
}
fstr.close();
fieldDBGStep_m++;
//MPI_File_write_shared(file, (char*)oss.str().c_str(), oss.str().length(), MPI_CHAR, &status);
//MPI_File_close(&file);
INFOMSG("*** FINISHED DUMPING E FIELD ***" << endl);
#endif
/// Interpolate electric field at particle positions.
Eftmp.gather(eg_m, this->R, IntrplCIC_t());
/// calculate coefficient
/// Calculate coefficient
double betaC = sqrt(gamma * gamma - 1.0) / gamma / Physics::c;
/// calculate B_bin field from E_bin field accumulate B and E field
/// Calculate B_bin field from E_bin field accumulate B and E field
Bf(0) = Bf(0) + betaC * Eftmp(2);
Bf(2) = Bf(2) - betaC * Eftmp(0);
Ef += Eftmp;
}
// *gmsg<<"gamma ="<<gamma<<endl;
// *gmsg<<"dx,dy,dz =("<<hr_m[0]<<", "<<hr_m[1]<<", "<<hr_m[2]<<") [m] "<<endl;
// *gmsg<<"max of bunch is ("<<rmax_m(0)<<", "<<rmax_m(1)<<", "<<rmax_m(2)<<") [m] "<<endl;
// *gmsg<<"min of bunch is ("<<rmin_m(0)<<", "<<rmin_m(1)<<", "<<rmin_m(2)<<") [m] "<<endl;
/*
*gmsg << "gamma =" << gamma << endl;
*gmsg << "dx,dy,dz =(" << hr_m[0] << ", " << hr_m[1] << ", " << hr_m[2] << ") [m] " << endl;
*gmsg << "max of bunch is (" << rmax_m(0) << ", " << rmax_m(1) << ", " << rmax_m(2) << ") [m] " << endl;
*gmsg << "min of bunch is (" << rmin_m(0) << ", " << rmin_m(1) << ", " << rmin_m(2) << ") [m] " << endl;
*/
IpplTimings::stopTimer(selfFieldTimer_m);
}
/*
void PartBunch::computeSelfFields_cycl(int bin) {
IpplTimings::startTimer(selfFieldTimer_m);
......@@ -1416,7 +1525,7 @@ void PartBunch::computeSelfFields_cycl(int bin) {
/// back Lorentz transformation
eg_m *= Vector_t(gamma, 1.0 / gamma, gamma);
*/
/*
//debug
// output field on the grid points
......@@ -1434,7 +1543,7 @@ void PartBunch::computeSelfFields_cycl(int bin) {
*gmsg << "Field along z axis E = " << eg_m[m2][m2][i] << " Pot = " << rho_m[m2][m2][i] << endl;
// end debug
*/
/*
/// interpolate electric field at particle positions.
Eftmp.gather(eg_m, this->R, IntrplCIC_t());
......@@ -1453,7 +1562,7 @@ void PartBunch::computeSelfFields_cycl(int bin) {
// *gmsg<<"min of bunch is ("<<rmin_m(0)<<", "<<rmin_m(1)<<", "<<rmin_m(2)<<") [m] "<<endl;
IpplTimings::stopTimer(selfFieldTimer_m);
}
*/
void PartBunch::setBCAllOpen() {
for(int i = 0; i < 2 * 3; ++i) {
......
......@@ -275,16 +275,19 @@ public:
void computeSelfFields();
/** /brief used for self fields with binned distribution */
void computeSelfFields(int b);
void computeSelfFields(int b);
void computeSelfFields_cycl(double gamma);
void computeSelfFields_cycl(int b);
//void computeSelfFields_cycl(double gamma);
//void computeSelfFields_cycl(int b);
// Overload computeselffields with versions that have meanR and the quaternion of the
// Replaced computeSelfFields_cycl() with versions that have meanR and the quaternion of the
// rotation of the particle bunch in order to take into account the rotation
// when finding the boundary conditions for the fieldsolver -DW
void computeSelfFields_cycl(double gamma, Vector_t const meanR, Vektor<double, 4> const quaternion);
void computeSelfFields_cycl(int b, Vector_t const meanR, Vektor<double, 4> const quaternion);
// when finding the boundary conditions for the fieldsolver. -DW
void computeSelfFields_cycl(double gamma, Vector_t const meanR=Vector_t(0.0, 0.0, 0.0),
Quaternion_t const quaternion=Quaternion_t(1.0, 0.0, 0.0, 0.0));
void computeSelfFields_cycl(int b, Vector_t const meanR=Vector_t(0.0, 0.0, 0.0),
Quaternion_t const quaternion=Quaternion_t(1.0, 0.0, 0.0, 0.0));
void resetInterpolationCache(bool clearCache = false);
......
......@@ -154,8 +154,11 @@ public:
virtual void setPr(double x) { } ;
virtual void setPt(double x) { } ;
virtual void setPz(double x) { } ;
virtual void setR(double x) { } ;
virtual void setTheta(double x) { } ;
virtual void setZ(double x) { } ;
virtual void setBeGa(double x) { } ;
......
This diff is collapsed.
......@@ -163,8 +163,11 @@ public:
inline void setParaAutoMode(const double para) {CoeffDBunches_m = para; }
inline void setPr(double x) {referencePr = x;}
inline void setPt(double x) {referencePt = x;}
inline void setPz(double x) {referencePz = x;}
inline void setR(double x) {referenceR = x;}
inline void setTheta(double x) {referenceTheta = x;}
inline void setZ(double x) {referenceZ = x;}
inline void setBeGa(double x) {bega = x;}
void bgf_main_collision_test();
......
......@@ -748,6 +748,11 @@ void Distribution::DoRestartOpalCycl(PartBunch &beam, size_t Np, int restartStep
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
referencePz_m = 0.0;
rc = H5ReadStepAttribFloat64(H5file, "REFPZ",&referencePz_m);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5ReadStepAttribFloat64(H5file, "REFR",&referenceR_m);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
......@@ -756,6 +761,11 @@ void Distribution::DoRestartOpalCycl(PartBunch &beam, size_t Np, int restartStep
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
referenceZ_m = 0.0;
rc = H5ReadStepAttribFloat64(H5file, "REFZ",&referenceZ_m);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
double meanE;
rc = H5ReadStepAttribFloat64(H5file, "ENERGY", &meanE);
if(rc != H5_SUCCESS)
......@@ -768,14 +778,17 @@ void Distribution::DoRestartOpalCycl(PartBunch &beam, size_t Np, int restartStep
beam.setLPath(pathLength);
*gmsg << "* Restart Energy " << meanE << "(MeV) Path lenght " << pathLength << " (m)" << endl;
*gmsg << "* Restart Energy = " << meanE << " (MeV), Path lenght = " << pathLength << " (m)" << endl;
*gmsg << "beam.getM() = " << beam.getM() << endl;
double ga = 1 + meanE/beam.getM()*1E3;
// beam.getM() in eV, meanE in MeV had to change 1e3 to 1e6 -DW
double ga = 1 + meanE/beam.getM()*1.0e6;
double be = sqrt(1.0-(1.0/(ga*ga)));
bega_m = be*ga;
*gmsg << "* Restart Energy " << meanE << " ga= " << ga << " be= " << be << endl;
*gmsg << "* Restart Energy = " << meanE << " (MeV), gamma = " << ga << ", beta = " << be << endl;
std::unique_ptr<char[]> varray(new char[(localN)*sizeof(double)]);
......
......@@ -177,10 +177,13 @@ public:
void ShiftBeam(double &maxTOrZ, double &minTOrZ);
// in case if OPAL-cycl in restart mode
double GetBeGa() {return bega_m;}
double GetPr() {return referencePr_m;}
double GetPt() {return referencePt_m;}
double GetPz() {return referencePz_m;}
double GetR() {return referenceR_m;}
double GetTheta() {return referenceTheta_m;}
double GetBeGa() {return bega_m;}
double GetZ() {return referenceZ_m;}
private:
......@@ -389,11 +392,13 @@ private:
double cutoff_m;
double referencePr_m;
double referencePt_m;
double referencePz_m = 0.0;
double referenceR_m;
double referenceTheta_m;
double referenceZ_m = 0.0;
double bega_m;
};
inline Inform &operator<<(Inform &os, const Distribution &d) {
......
......@@ -927,7 +927,10 @@ void DataSink::writePhaseSpace(PartBunch &beam, Vector_t FDext[], double sposHea
int DataSink::writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double meanEnergy, double refPr, double refR, double refTheta) {
int DataSink::writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double meanEnergy,
double refPr, double refPt, double refPz,
double refR, double refTheta, double refZ,
double azimuth, double elevation) {
if (!doHDF5_m) return -1;
//if (beam.getLocalNum() == 0) return -1; //TEMP for testing -DW
......@@ -969,8 +972,7 @@ int DataSink::writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double mea
h5_int64_t globalTrackStep = (h5_int64_t)beam.getGlobalTrackStep();
h5_int64_t numBunch = (h5_int64_t)beam.getNumBunch();
h5_int64_t SteptoLastInj = (h5_int64_t)beam.getSteptoLastInj();
///Get the particle decomposition from all the compute nodes.
std::unique_ptr<size_t[]> locN(new size_t[Ippl::getNodes()]);
std::unique_ptr<size_t[]> globN(new size_t[Ippl::getNodes()]);
......@@ -991,11 +993,11 @@ int DataSink::writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double mea
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribInt64(H5file_m, "LocalTrackStep", &localTrackStep, 1);
rc = H5WriteStepAttribInt64(H5file_m, "LocalTrackStep", &localTrackStep, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribInt64(H5file_m, "GlobalTrackStep", &globalTrackStep, 1);
rc = H5WriteStepAttribInt64(H5file_m, "GlobalTrackStep", &globalTrackStep, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
......@@ -1095,6 +1097,14 @@ int DataSink::writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double mea
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribFloat64(H5file_m, "REFPT", (h5_float64_t *)&refPt, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribFloat64(H5file_m, "REFPZ", (h5_float64_t *)&refPz, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribFloat64(H5file_m, "REFR", (h5_float64_t *)&refR, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
......@@ -1103,6 +1113,18 @@ int DataSink::writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double mea
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribFloat64(H5file_m, "REFZ", (h5_float64_t *)&refZ, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribFloat64(H5file_m, "AZIMUTH", (h5_float64_t *)&azimuth, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
rc = H5WriteStepAttribFloat64(H5file_m, "ELEVATION", (h5_float64_t *)&elevation, 1);
if(rc != H5_SUCCESS)
ERRORMSG("H5 rc= " << rc << " in " << __FILE__ << " @ line " << __LINE__ << endl);
/// Write particle mass and charge per particle. (Consider making these file attributes.)
double mpart = 1.0e-9 * beam.getM();
double Q = beam.getCharge();
......@@ -1825,7 +1847,7 @@ void DataSink::doWriteStatData(PartBunch &beam, Vector_t FDext[], double sposHea
/// header information.
ofstream os_statData;
ofstream os_lBalData;
double Q = beam.getCharge();
double Q = beam.getCharge();
if(Ippl::myNode() == 0) {
if(firstWriteToStat_m) {
......
......@@ -186,7 +186,10 @@ public:
* \param E average energy (MeB)
* \return Returns the number of the time step just written.
*/
int writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double E, double refPr, double refR, double refTheta);
int writePhaseSpace_cycl(PartBunch &beam, Vector_t FDext[], double E,
double refPr, double refPt, double refPz,
double refR, double refTheta, double refZ,
double azimuth, double elevation);
/** \brief Dumps Phase Space for Envelope trakcer to H5 file.
*
......
......@@ -620,10 +620,16 @@ void TrackRun::execute() {
itsTracker->setNumBunch(specifiedNumBunch);
if(OPAL->inRestartRun()) {
itsTracker->setPr(dist->GetPr());
itsTracker->setR(dist->GetR());
itsTracker->setTheta(dist->GetTheta());
itsTracker->setBeGa(dist->GetBeGa());
itsTracker->setBeGa(dist->GetBeGa());
itsTracker->setPr(dist->GetPr());
itsTracker->setPt(dist->GetPt());
itsTracker->setPz(dist->GetPz());
itsTracker->setR(dist->GetR());
itsTracker->setTheta(dist->GetTheta());
itsTracker->setZ(dist->GetZ());
}
// statistical data are calculated (rms, eps etc.)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment