//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class TpcInhFieldDrifter // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Felix Boehmer TUM (original author) // //----------------------------------------------------------- // This Class' Header ------------------ #include "TpcInhFieldDrifter.h" // Collaborating Class Headers -------- #include #include #include #include #include #include #include #include "TpcEFieldCyl.h" #include "TpcGas.h" #include "FairParAsciiFileIo.h" #include "FairRunAna.h" #include "FairRunSim.h" #include "FairParSet.h" #include "FairRuntimeDb.h" #include "TpcDigiPar.h" #include "TpcRungeKutta.h" #include "PndMultiField.h" #include "FairField.h" #include "TpcDigiMapper.h" ClassImp(TpcInhFieldDrifter) // Class Member definitions ----------- TpcInhFieldDrifter:: TpcInhFieldDrifter(const TVector3& eNom, const TVector3& bNom, const double friction, //set friction term manually: const char* outFile, const char* paramFile, const int rBins, const int zBins, const int split, const int zsplit) : foutFile(outFile), fparamFile(paramFile), frBins(rBins), fzBins(zBins), fsplit(split), fsplitz(zsplit), fzstepwidth(10), fManCalc(kFALSE), fUseReadoutWindow(kFALSE) { if(fsplit >= 0 && split >= frBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid row number requested! ABORTING ("<= 0 && zsplit >= fzBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid column number requested! ABORTING"<getGas())->VDrift(); //ffriction = 1e-5 * eNom.Z() / vDrift; // friction term, see Rolandi Blum ffriction=friction; //fvDrift=1e-5*eNom.Z()/friction; fvDrift=0; frunKut = new TpcRungeKutta(1e-16, 1e-6, 1e-2, 1e-3, fsc,(TpcEFieldCyl*) NULL,(FairField*) NULL, friction); frunKut->setConstE(eNom); frunKut->setConstB(bNom); } TpcInhFieldDrifter:: TpcInhFieldDrifter(const TVector3& eNom, const TVector3& bNom, const char* outFile, const char* paramFile, const int rBins, const int zBins, const int split, const int zsplit) : foutFile(outFile), fparamFile(paramFile), frBins(rBins), fzBins(zBins), fsplit(split), fsplitz(zsplit), fzstepwidth(10), fManCalc(kFALSE), fUseReadoutWindow(kFALSE) { if(fsplit >= 0 && split >= frBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid row number requested! ABORTING ("<= 0 && zsplit >= fzBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid column number requested! ABORTING"<getManDriftVel(); if(fvDrift<=0) { fvDrift=fpar->getGas()->VDrift(); std::cout<<"TpcInhFieldDrifter: using drift velocity from gasfile (v="<setConstE(eNom); frunKut->setConstB(bNom); } TpcInhFieldDrifter:: TpcInhFieldDrifter(TpcEFieldCyl* eField, FairField* bField, const char* outFile, const char* paramFile, const int rBins, const int zBins, const int split, const int zsplit) : foutFile(outFile), fparamFile(paramFile), frBins(rBins), fzBins(zBins), fsplit(split), fsplitz(zsplit), fzstepwidth(10), fManCalc(kFALSE), fUseReadoutWindow(kFALSE) { if(fsplit >= 0 && split >= frBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid row number requested! ABORTING ("<= 0 && zsplit >= fzBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid column number requested! ABORTING"<getManDriftVel(); if(fvDrift<=0) { fvDrift=fpar->getGas()->VDrift(); std::cout<<"TpcInhFieldDrifter: using drift velocity from gasfile (v="<nominal()).Z(); ffriction = 1e-5 * eNomZ / fvDrift; // friction term, see Rolandi Blum frunKut = new TpcRungeKutta(1e-16, 1e-6, 1e-2, 1e-3, fsc, eField,bField, ffriction); } TpcInhFieldDrifter:: TpcInhFieldDrifter(const char* eFieldFile, const char* bFieldFile, double beamMom, const char* outFile, const char* paramFile, const int rBins, const int zBins, const int split, const int zsplit) : foutFile(outFile), fparamFile(paramFile), frBins(rBins), fzBins(zBins), fsplit(split), fsplitz(zsplit), fzstepwidth(10), fManCalc(kFALSE), fUseReadoutWindow(kFALSE) { if(fsplit >= 0 && split >= frBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid row number requested! ABORTING ("<= 0 && zsplit >= fzBins) { //in the case split was manually set... std::cout << "TpcInhFieldDrifter::TpcInhFieldDrifter : " <<"invalid column number requested! ABORTING"<getManDriftVel(); if(fvDrift<=0) { fvDrift=fpar->getGas()->VDrift(); std::cout<<"TpcInhFieldDrifter: using drift velocity from gasfile (v="<SetBeamMom(beamMom); PndMultiField* bfield = new PndMultiField("FULL"); bfield->Init(); TpcEFieldCyl* efield = new TpcEFieldCyl(eFieldFile); double eNomZ = (efield->nominal()).Z(); ffriction = 1e-5 * eNomZ / fvDrift; // friction term, see Rolandi Blum frunKut = new TpcRungeKutta(1e-16, 1e-6, 1e-2, 1e-3, fsc, efield, bfield, ffriction); } TpcInhFieldDrifter::~TpcInhFieldDrifter() { delete frunKut; int size = fvelocity_control->size(); for (int i=0; iat(i); delete fvelocity_control; } void TpcInhFieldDrifter::run() { // Calculate the Binning frBinWidth = (double)(ftpcMaxR - ftpcMinR) / frBins; fzBinWidth = (double)(ftpcMaxZ - ftpcMinZ) / fzBins; // Init the fields //TODO: dangerous!!! change to pointers inside for (int nr = 0; nr < frBins; nr++) { fdevX.push_back(std::vector(fzBins, 0)); fdevY.push_back(std::vector(fzBins, 0)); ftime.push_back(std::vector(fzBins, 0)); fstepCount.push_back(std::vector(fzBins, 0)); fpathLength.push_back(std::vector(fzBins, 0)); } fvelocity_control = new std::vector*>; fvelocity_control->push_back(new std::vector(4, 0)); //first position std::cout << "\nCalculating the Deviation Map with Runge-Kutta "<= fzstepwidth * (fsplitz+1) || nz < fzstepwidth * fsplitz) { continue; } } if (fManCalc) { int counts = std::count(fZtoCalc.begin(), fZtoCalc.end(), nz); if (counts==0) continue; } double rPos, zPos, dx, dy, dz, olddz=-1; int backdriftcounter=0; rPos = (double)(ftpcMinR + (nr+0.5)*frBinWidth)/100.; // [m] zPos = (double)(ftpcMinZ + (nz+0.5)*fzBinWidth)/100.; std::cout<<"rPos: "<setTimeStep(1e-16); double time_temp; double mean[4]={0,0,0,0},oldmean[4]={0,0,0,0},diff[4]={0,0,0,0}; bool left_inner=false; bool left_outer=false; for (int i=0; ; i++) // get serious { mean[0]+=x[3]; mean[1]+=x[4]; mean[2]+=x[5]; mean[3]+=sqrt(x[3]*x[3]+x[4]*x[4]); if (x[5]>(ftpcMaxZ)/100. || x[5]<(ftpcMinZ/100.)) { std::cout<<"reached the pads"<(ftpcMaxR)/100.) { std::cout<<"outside of outer Radius"<1e9) { std::cout<<"The Electron will probably never arrive, stopping calculation for this bin\n"; fdevX.at(nr).at(nz) = (100000) * 100; //[cm] fdevY.at(nr).at(nz) = (100000) * 100; break; } */ dx = x[3] - xTemp[0]; dy = x[4] - xTemp[1]; //coordinate changes of the last RK step dz = x[5] - xTemp[2]; fpathLength.at(nr).at(nz) += sqrt(dx*dx + dy*dy + dz*dz); // if (x[5]==0.0005) //build the velocity-control array (in just one bin) //if (nr == (int) std::floor((double)frBins/2) // && nz == (int) std::floor((double)fzBins/2)) //{ //if ((fstepCount.at(nr).at(nz))%1000 == 0) { //std::vector* temp_vec = new std::vector(4); //for(int ii = 0; i <= 2; ii++) // temp_vec->at(ii) = x[ii]; //fill vector with components of V //temp_vec->at(3) = frunKut->getTimeStep(); //fvelocity_control->push_back(temp_vec); // for(unsigned int k=0; k<6; k++) // std::cout<getTimeStep(); // std::cout<= 0) { std::string s; std::stringstream stream; stream << "r"; stream<> s; filename += s; } if(fsplitz >= 0) { std::string s; std::stringstream stream; stream<<"z"; stream<> s; filename += s; } if (fManCalc) { std::string s; std::stringstream stream; stream<<"zb"; stream<>s; filename +=s; } std::ofstream outfile(filename.c_str(), std::fstream::out); std::cout << "\n\n**** Writing Deviation Data to File " << filename << " ****\n"; std::cout<<"fsplit="<=0) { if (nr != fsplit) continue; } for (; nz=0 && !fManCalc){ if (nz >= fzstepwidth *(fsplitz+1) || nz < fzstepwidth * fsplitz ) { continue; } } if (fManCalc) if (std::count(fcalcZbins.begin(), fcalcZbins.end(), nz)==0) { continue; } outfile<size(); // for (int a=0; aat(a)->at(0)*1e-7<<" " // <at(a)->at(1)*1e-7<<" " // <at(a)->at(2)*1e-7<<" " // <at(a)->at(3)*1e9; // } // outfile2<open(fparamFile, "in"); //create dummy run manager and load database FairRunSim* fRun = FairRunSim::Instance(); FairRuntimeDb* rtdb = fRun->GetRuntimeDb(); rtdb->setFirstInput(input); fpar = (TpcDigiPar*) rtdb->getContainer("TpcDigiPar"); fpar->FairParSet::init(); //read in parameters ftpcMinR = fpar->getRMin(); ftpcMaxR = fpar->getRMax(); if(fUseReadoutWindow) { ftpcMinZ = fpar->windowMin(); ftpcMaxZ = fpar->windowMax(); } else { ftpcMinZ=0; ftpcMaxZ=fpar->getZMax(); } std::cout<<"\n\nTpcInhFieldDrifter::initParams()\n" <<"---------- Used Parameters ---------------------------"<