if (qs.size() < 2) throw std::invalid_argument(Exception(String("joint waypoint text file must contain at least 2 'waypoint' vectors"))); init(qs,times,deltas); } else { // output std::ostringstream out; // comment header out << "# Joint waypoint trajectory [joint positions & times (at-end)]" << std::endl; out << "# the following line should be 'absolute' for absolute qi's & t values or 'relative' if the vectors represent inter-waypoint deltas dqi's & dt" << std::endl; out << "absolute" << std::endl; // not "relative" out << "# q0 q1 ... qn t" << std::endl; std::ostream::fmtflags savedFlags = out.setf(std::ios_base::dec | std::ios_base::right); Int savedPrec = out.precision(10); Int savedWidth = out.width(13); const Int dof=qs[0].size(); // this is a hack, as under gcc the flags don't appear to stay set after an output op (!?) #define setflags \ out.setf(std::ios_base::dec | std::ios_base::right); \ out.precision(10); \ out.width(13); setflags; for(Int i=0; i<qs.size(); i++) { Vector q(qs[i]); Time t(times[i]);
//____________________________________________________________________ int geometry_tpc_v5() { gROOT->LoadMacro("$VMCWORKDIR/macro/mpd/geometry/mpdshape.class.C"); gROOT->LoadClass("Mpdshape"); const char* filename = "tpc_v5.geo"; // output file f = new ofstream(filename, ios::out | ios::trunc); // streams std::ostringstream points, position, rotation; points.setf(ios::showpoint); points.setf(ios::fixed); points << setprecision(6); position.setf(ios::showpoint); position.setf(ios::fixed); position << setprecision(6); rotation.setf(ios::showpoint); rotation.setf(ios::fixed); rotation << setprecision(6); // create full tpc volume Fill_TUBE(tpc_z, TpcInnRad, TpcOutRad); // std::cout << points.str() << endl; Mpdshape* tube = new Mpdshape(f, "tpcChamber1", "cave", "TUBE", "air", points.str()); tube->SetSegment(0); tube->DumpToFile(); build_wall("In", TpcInnRad); build_wall("Out", TpcOutRad - wall_thickness); delete tube; // =========================================================== // make TPC membrane Clear(); Double_t xWidth,yWidth,zWidth,kx,my,kz,phi_cent; // make membrane zWidth = mem_thick; Fill_TUBE(zWidth, TpcInnRad + wall_thickness, TpcOutRad - wall_thickness); Mpdshape* membrane = new Mpdshape(f, "tpc01mb", "tpcChamber1", "TUBE", "rohacellhf71", points.str()); membrane->SetPosition(0., 0., 0.); membrane->DumpToFile(); #ifdef SENSIT // =========================================================== // TPC sensitive volume // make half of sensitive volume zWidth = .5*(tpc_drift_z - mem_thick); Fill_TUBE(zWidth, TpcInnRad + wall_thickness, TpcOutRad - wall_thickness); Mpdshape* tpchalf = new Mpdshape(f, "tpc01mod", "tpcChamber1", "TUBE", "air", points.str()); tpchalf->SetSegment(1); tpchalf->SetPosition(0., 0., tpc_drift_z - zWidth); tpchalf->SetRotation(" 1. 0. 0. 0. 1. 0. 0. 0. 1."); tpchalf->DumpWithIncrement(); // make field cage FieldCage(zWidth); // make sectors internal_sector(); // second half sens vol tpchalf->SetPosition(0., 0., -tpc_drift_z + zWidth); tpchalf->SetRotation(" 1. 0. 0. 0. 1. 0. 0. 0. -1."); tpchalf->DumpToFile(); #endif #ifdef ENDCAP // =========================================================== // Begin EndCap // =========================================================== zWidth =.5*(tpc_z - tpc_drift_z); Fill_TUBE(zWidth, TpcInnRad, TpcOutRad); // endcap Mpdshape* tpcendcap = new Mpdshape(f, "tpc01ec", "tpcChamber1", "TUBE", "air", points.str()); tpcendcap->SetSegment(1); Double_t z_ec = zWidth + tpc_drift_z; tpcendcap->SetPosition(0., 0., z_ec); tpcendcap->SetRotation(" 1. 0. 0. 0. 1. 0. 0. 0. 1."); tpcendcap->DumpWithIncrement(); //============================================================ // Flanches //============================================================ // al flanch outer Fill_TUBE(.5*flanch_thickness, outer_flanch_in_rad, TpcOutRad); Mpdshape* flanch = new Mpdshape(f, "tpc01of", "tpc01ec#1", "TUBE", "aluminium", points.str()); flanch->SetPosition(0., 0., .5*flanch_thickness - zWidth ); flanch->DumpToFile(); // al flanch inner South Fill_TUBE(.5*flanch_thickness, TpcInnRad, inner_flanch_out_rad); flanch->SetVolumeName("tpc01if"); flanch->SetMedia("aluminium"); flanch->SetPoints(points.str()); flanch->DumpToFile(); // ========== Ribs ============================ xWidth = 0.5*rib_width_x; // x - half-dimension of block yWidth = .5*(TMath::Sqrt(TpcOutRad*TpcOutRad - xWidth*xWidth) - TpcInnRad); // y - half-dimension of block zWidth = .5*rib_width_z; // z - half-dimension of block kz = flanch_thickness + rib_pos_z - zWidth; // tpc ribs Fill_BOX(xWidth, yWidth, zWidth); Mpdshape* tpcrib = new Mpdshape(f, "tpc01Rib", "tpc01ec#1", "BOX", "aluminium", points.str(), position.str()); tpcrib->SetSegment(1); Double_t center_rad = TpcInnRad + yWidth; // cout << "center_rad_rib: " << center_rad << "\n"; for (Int_t k = 0; k < Nsect; k++) { phi_cent = k*phi_step + .5*phi_step; Double_t kx = center_rad* TMath::Cos(phi_cent); Double_t my = center_rad* TMath::Sin(phi_cent); Double_t zRot = step*k - 90. + .5*step; tpcrib->SetPosition(kx, my, kz); tpcrib->SetRotation(zRot, 0.0, .0); tpcrib->DumpWithIncrement(); } external_sector(); // second end-cup: tpcendcap->SetPosition(0., 0., -z_ec); tpcendcap->SetRotation(" 1. 0. 0. 0. 1. 0. 0. 0. -1."); tpcendcap->DumpToFile(); #endif // close geometry file f->close(); }