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]);
	
Ejemplo n.º 2
0
//____________________________________________________________________
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(); 

}