Пример #1
0
TEveLine* random_line(TRandom& rnd, Int_t n, Float_t delta)
{
   TEveLine* line = new TEveLine;
   line->SetMainColor(kGreen);

   Float_t x = 0, y = 0, z = 0;
   for (Int_t i=0; i<n; ++i)
   {
      line->SetNextPoint(x, y, z);
      x += rnd.Uniform(0, delta);
      y += rnd.Uniform(0, delta);
      z += rnd.Uniform(0, delta);
   }

   return line;
}
Пример #2
0
void projection()
{
   TFile::SetCacheFileDir(".");
   TEveManager::Create();

   // camera
   TEveScene* s = gEve->SpawnNewScene("Projected Event");
   gEve->GetDefaultViewer()->AddScene(s);
   TGLViewer* v = gEve->GetDefaultGLViewer();
   v->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   TGLOrthoCamera* cam = (TGLOrthoCamera*) v->CurrentCamera();
   cam->SetZoomMinMax(0.2, 20);

   // projections
   TEveProjectionManager* mng =
      new TEveProjectionManager(TEveProjection::kPT_RPhi);
   s->AddElement(mng);
   TEveProjectionAxes* axes = new TEveProjectionAxes(mng);
   axes->SetTitle("TEveProjections demo");
   s->AddElement(axes);
   gEve->AddToListTree(axes, kTRUE);
   gEve->AddToListTree(mng, kTRUE);

   // Simple geometry
   TFile* geom = TFile::Open(esd_geom_file_name, "CACHEREAD");
   if (!geom)
      return;

   TEveGeoShapeExtract* gse = (TEveGeoShapeExtract*) geom->Get("Gentle");
   TEveGeoShape* gsre = TEveGeoShape::ImportShapeExtract(gse, 0);
   geom->Close();
   delete geom;
   gsre->SetPickableRecursively(kTRUE);
   gEve->AddGlobalElement(gsre);
   gEve->GetGlobalScene()->SetRnrState(kFALSE);
   mng->ImportElements(gsre);

   TEveLine* line = new TEveLine;
   line->SetMainColor(kGreen);
   for (Int_t i=0; i<160; ++i)
      line->SetNextPoint(120*sin(0.2*i), 120*cos(0.2*i), 80-i);
   gEve->AddElement(line);
   mng->ImportElements(line);
   line->SetRnrSelf(kFALSE);

   gEve->Redraw3D(kTRUE);
}
Пример #3
0
void compound()
{
   TEveManager::Create();

   TEveLine* ml = new TEveLine;
   ml->SetMainColor(kRed);
   ml->SetLineStyle(2);
   ml->SetLineWidth(3);
   gEve->InsertVizDBEntry("BigLine", ml);

   TEveCompound* cmp = new TEveCompound;
   cmp->SetMainColor(kGreen);
   gEve->AddElement(cmp);

   TRandom rnd(0);

   cmp->OpenCompound();

   cmp->AddElement(random_line(rnd, 20, 10));
   cmp->AddElement(random_line(rnd, 20, 10));

   TEveLine* line = random_line(rnd, 20, 12);
   line->ApplyVizTag("BigLine");
   cmp->AddElement(line);

   cmp->CloseCompound();

   // Projected view
   TEveViewer *viewer = gEve->SpawnNewViewer("Projected");
   TEveScene  *scene  = gEve->SpawnNewScene("Projected Event");
   viewer->AddScene(scene);
   {
      TGLViewer* v = viewer->GetGLViewer();
      v->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   }

   // projections
   TEveProjectionManager* mng = new TEveProjectionManager(TEveProjection::kPT_RPhi);
   scene->AddElement(mng);
   TEveProjectionAxes* axes = new TEveProjectionAxes(mng);
   scene->AddElement(axes);
   gEve->AddToListTree(axes, kTRUE);
   gEve->AddToListTree(mng, kTRUE);

   mng->ImportElements(cmp);

   gEve->Redraw3D(kTRUE);
}
Пример #4
0
void EveSingleTrackDisplay(const Ntuple& nt,const double zmin,const double zmax,const unsigned int color,const double Scale_xy,unsigned int verbose)
// use euclidian coordinates X_2, Y_2, Z_2 if available, x,y, z or s  otherwise
// zmin, zmax  --  tricky for rings, check also x not to jump to other side
//
//  using root global   gEve
//
// with  TEveLine    as in tutorial  compound.C
//
// TEve  has concept of tracks with vertex, momentum and optional reference points, maybe overkill
// en->ExpandIntoListTreesRecursively();
// TEveTrackList *gTrackList = new TEveTrackList("MyTracks");
// cout << " gTrackList=" << gTrackList << " defined" << '\n';
//
{
  bool goto_CM_units=true;
  if(verbose) cout << __FILE__ << " " << __PRETTY_FUNCTION__ << " line " << __LINE__ << " start verbose=" << verbose << " nt.Noent()=" << nt.Noent() << " Scale_xy=" << Scale_xy << " goto_CM_units=" << goto_CM_units << '\n';
  bool SaveTrack=true;
  if(gEve==NULL)
  {
    cout << "*** Error *** Eve not setup. Do first   StartEveWithGeomDisplay" << '\n';
    return;
  }
  string dir,fname;
  string full_ntuple_fname=nt.GetFname();
  GetDirFname(full_ntuple_fname,dir,fname);
  string fname_no_ext=WithoutExtension(fname);
  cout << "now plot track file with fname_no_ext=" << fname_no_ext << '\n';

  unsigned int n=nt.Noent();
  double xt[n],yt[n],zt[n];
  const vector<const char*> koord =GetKoordNames(nt);;
  const valarray<double> xvec=nt.GetVar(koord[0]);
  const valarray<double> yvec=nt.GetVar(koord[1]);
  const valarray<double> zvec=nt.GetVar(koord[2]);

  vector<int> iElList; // http://www.cplusplus.com/reference/vector/vector/
  // find elements in allowed z range,  tricky in rings, check also for x not to jumo to other side
  double zstart=0;
  if(zmin<0) // start on negative side, go to zero
  {
    for(unsigned int i=0;i<nt.Noent();++i) if(zvec[i] < zstart && zvec[i] >= zmin && fabs(xvec[i])< zmax ) iElList.push_back(i);
    zstart=1.e-10; // put to some positive small value, to avoid to plot the zero point again on the positive side
  }
  // now the positive side
  for(unsigned int i=0;i<nt.Noent();++i) if(zvec[i] >= zstart && fabs(xvec[i])< zmax ) { iElList.push_back(i); if(zvec[i] >= zmax) break; }

  for(unsigned int i=0; i<n; ++i) xt[i]=Scale_xy*xvec[i];
  for(unsigned int i=0; i<n; ++i) yt[i]=Scale_xy*yvec[i];
  for(unsigned int i=0; i<n; ++i) zt[i]=         zvec[i];
  // order in increasing z

  if(verbose) cout << __FILE__ << " " << __PRETTY_FUNCTION__ << " line " << __LINE__ << " goto_CM_units=" << goto_CM_units << " zmin=" << zmin << " zmax=" << zmax << '\n';

  TEveLine* line = new TEveLine(fname_no_ext.c_str()); // give the line the name of the track file
  line->SetMainColor(kBlack);
  for(unsigned int j=0;j<iElList.size();++j) // --- loop over elements and plot range
  {
    unsigned int i=iElList[j];
    //if(zt[i]>=zmin && zt[i]<=zmax && fabs(xt[i])< zmax) // draw
    //{
    if(verbose>1 && i<1000) cout << " j=" << setw(3) << j << " i=" << setw(3) << i << " x=" << setw(12) << xt[i] << " y=" << setw(12) << yt[i] << " z=" << setw(10) << zt[i] << '\n';
    if(goto_CM_units) { xt[i]*=100; yt[i]*=100; zt[i]*=100; } // unit change only just before drawing with SetNextPoint
    line->SetNextPoint(xt[i],yt[i],zt[i]);
    //}
  }
  if(verbose>1) cout << __FILE__ << " " << __PRETTY_FUNCTION__ << " line " << __LINE__ << '\n';

  gEve->AddElement(line);
  if(SaveTrack) // save track in root format -   such that it can be read without need for my root extensions
  { // http://root.cern.ch/drupal/content/how-read-objects-file
    string line_fname=WithoutExtension(fname)+string(".root");  // http://root.cern.ch/root/html/TGObject.html
    if(verbose) cout << __FILE__ << " " << __PRETTY_FUNCTION__ << " line " << __LINE__ << " line->SaveAs(" << line_fname << ")" << '\n';
    line->SaveAs(line_fname.c_str());  // TEveLine::SaveAs       where is this ?   cd /opt/local/include/root ;  find . -type f -exec cat {} \; | grep -R SaveAs
  }
  if(verbose>2) cout << __FILE__ << " " << __PRETTY_FUNCTION__ << " line " << __LINE__ << " before gEve->Redraw3D()"<< '\n';
  gEve->Redraw3D();
  if(verbose>2) cout << __FILE__ << " " << __PRETTY_FUNCTION__ << " line " << __LINE__  << " after gEve->Redraw3D()"<< '\n';
}
void set_momentum_vectors()
{

   TString str1;
   TString str2;

   Bool_t draw = kFALSE;

   TEveElement::List_i i = gEve->GetEventScene()->FirstChild()->BeginChildren();
   TEveElement::List_i j = gEve->GetEventScene()->FirstChild()->EndChildren();
   TEveElement::List_i k;

   TEveElementList* momentumVectorList = new TEveElementList("Momentum Vectors");

   Double_t maxMomentum = 0;
   Double_t vectorLength = 600.0;

   Double_t x1 = 0;
   Double_t y1 = 0;
   Double_t z1 = 0;

   Double_t x2 = 0;
   Double_t y2 = 0;
   Double_t z2 = 0;

   //==============================================
   // find highest momentum (to normalize)
   //==============================================

   for(k = i; k != j; k++)
   {
      TEveElement* element = (TEveElement*) *k;

      str1 = element->GetElementName();

      if(str1.Contains("Tracks") || str1.Contains("tracks"))
      {

         TEveElement::List_i m = element->BeginChildren();
         TEveElement::List_i n = element->EndChildren();
         TEveElement::List_i l;

         for(l = m; l != n; l++)
         {
            TEveElement* trackType = (TEveElement*) *l;
            str2 = trackType->GetElementName();

            if(str2.Contains("Sigma < 3"))
            {
               if(trackType->HasChildren())
               {

                  TEveElement::List_i x = trackType->BeginChildren();
                  TEveElement::List_i y = trackType->EndChildren();
                  TEveElement::List_i z;

                  for(z = x; z != y; z++)
                  {

                     IlcEveTrack* trackSingle1 = dynamic_cast<IlcEveTrack*>((TEveElement*) *z);

                     if(trackSingle1->GetESDTrack()->P() > maxMomentum)
                       maxMomentum = trackSingle1->GetESDTrack()->P();

                  }
               }
            }


            if(str2.Contains("3 < Sigma < 5"))
            {

               if(trackType->HasChildren())
               {

                  TEveElement::List_i x = trackType->BeginChildren();
                  TEveElement::List_i y = trackType->EndChildren();
                  TEveElement::List_i z;

                  for(z = x; z != y; z++)
                  {

                     IlcEveTrack* trackSingle1 = dynamic_cast<IlcEveTrack*>((TEveElement*) *z);

                     if(trackSingle1->GetESDTrack()->P() > maxMomentum)
                       maxMomentum = trackSingle1->GetESDTrack()->P();

                  }
               }
            }

            if(str2.Contains("5 < Sigma"))
            {

               if(trackType->HasChildren())
               {

                  TEveElement::List_i x = trackType->BeginChildren();
                  TEveElement::List_i y = trackType->EndChildren();
                  TEveElement::List_i z;

                  for(z = x; z != y; z++)
                  {

                     IlcEveTrack* trackSingle1 = dynamic_cast<IlcEveTrack*>((TEveElement*) *z);

                     if(trackSingle1->GetESDTrack()->P() > maxMomentum)
                       maxMomentum = trackSingle1->GetESDTrack()->P();


                  }
               }
            }
         }
      }
   }

   //==============================================
   // clean the display
   //==============================================
/*
   if(!drawWithTracks)

      for(k = i; k != j; k++)
      {
         TEveElement* element = (TEveElement*) *k;

         str1 = element->GetElementName();

         element->SetRnrSelf(kFALSE);

         if(element->HasChildren())
            element->SetRnrChildren(kFALSE);

      }

   }
*/
   //==============================================
   // draw momentum vectors
   //==============================================

   if(maxMomentum)
      vectorLength = vectorLength/maxMomentum;
//      vectorLength = vectorLength/TMath::Log(maxMomentum);

   for(k = i; k != j; k++)
   {
      TEveElement* element = (TEveElement*) *k;

      str1 = element->GetElementName();

      if(str1.Contains("Tracks") || str1.Contains("tracks"))
      {

         TEveElement::List_i m = element->BeginChildren();
         TEveElement::List_i n = element->EndChildren();
         TEveElement::List_i l;

         for(l = m; l != n; l++)
         {
            TEveElement* trackType = (TEveElement*) *l;
            str2 = trackType->GetElementName();

            trackType->SetRnrSelf(kFALSE);

            if(trackType->HasChildren())
               trackType->SetRnrChildren(kFALSE);

            if(str2.Contains("Sigma < 3"))
            {

               if(trackType->HasChildren())
               {

                  TEveElementList* momentumVectorList1 = new TEveElementList("sigma < 3");

                  TEveElement::List_i x = trackType->BeginChildren();
                  TEveElement::List_i y = trackType->EndChildren();
                  TEveElement::List_i z;

                  for(z = x; z != y; z++)
                  {

                     IlcEveTrack* trackSingle1 = dynamic_cast<IlcEveTrack*>((TEveElement*) *z);

                     TEveLine* momentumVector = new TEveLine(TString::Format("Momentum Vector"));

                     x1 = trackSingle1->GetESDTrack()->Xv();
                     y1 = trackSingle1->GetESDTrack()->Yv();
                     z1 = trackSingle1->GetESDTrack()->Zv();

                     momentumVector->SetPoint(0, x1, y1, z1);

                     x2 = x1+vectorLength*trackSingle1->GetESDTrack()->Px();
                     y2 = y1+vectorLength*trackSingle1->GetESDTrack()->Py();
                     z2 = z1+vectorLength*trackSingle1->GetESDTrack()->Pz();

                     momentumVector->SetPoint(1, x2, y2, z2);

/*
                     if(trackSingle1->GetESDTrack()->Charge() == -1)
                        momentumVector->SetLineColor(kGreen);
                     else
                        momentumVector->SetLineColor(kRed);
*/
                     momentumVector->SetLineColor(kRed);

                     momentumVector->SetLineWidth(1);
                     momentumVector->SetLineStyle(0);
                     momentumVector->SetTitle(Form("%f GeV/c", trackSingle1->GetESDTrack()->P()));

                     momentumVectorList1->AddElement(momentumVector);

                  }

//                  gEve->AddElement(momentumVectorList1);
                  momentumVectorList->AddElement(momentumVectorList1);

                  draw = kTRUE;

               }
            }


            if(str2.Contains("3 < Sigma < 5"))
            {

               if(trackType->HasChildren())
               {

                  TEveElement::List_i x = trackType->BeginChildren();
                  TEveElement::List_i y = trackType->EndChildren();
                  TEveElement::List_i z;

                  TEveElementList* momentumVectorList2 = new TEveElementList("3 < sigma < 5");

                  for(z = x; z != y; z++)
                  {

                     IlcEveTrack* trackSingle1 = dynamic_cast<IlcEveTrack*>((TEveElement*) *z);

                     TEveLine* momentumVector = new TEveLine(TString::Format("Momentum Vector"));

                     x1 = trackSingle1->GetESDTrack()->Xv();
                     y1 = trackSingle1->GetESDTrack()->Yv();
                     z1 = trackSingle1->GetESDTrack()->Zv();

                     momentumVector->SetPoint(0, x1, y1, z1);

                     x2 = x1+vectorLength*trackSingle1->GetESDTrack()->Px();
                     y2 = y1+vectorLength*trackSingle1->GetESDTrack()->Py();
                     z2 = z1+vectorLength*trackSingle1->GetESDTrack()->Pz();

                     momentumVector->SetPoint(1, x2, y2, z2);
/*
                     if(trackSingle1->GetESDTrack()->Charge() == -1)
                        momentumVector->SetLineColor(kGreen+2);
                     else
                        momentumVector->SetLineColor(kRed+2);
*/
                     momentumVector->SetLineColor(kRed+2);

                     momentumVector->SetLineWidth(1);
                     momentumVector->SetLineStyle(0);
                     momentumVector->SetTitle(Form("%f GeV/c", trackSingle1->GetESDTrack()->P()));

                     momentumVectorList2->AddElement(momentumVector);

                  }

//                  gEve->AddElement(momentumVectorList2);
                  momentumVectorList->AddElement(momentumVectorList2);

                  draw = kTRUE;

               }
            }

            if(str2.Contains("5 < Sigma"))
            {

               if(trackType->HasChildren())
               {

                  TEveElementList* momentumVectorList3 = new TEveElementList("5 < sigma");

                  TEveElement::List_i x = trackType->BeginChildren();
                  TEveElement::List_i y = trackType->EndChildren();
                  TEveElement::List_i z;

                  for(z = x; z != y; z++)
                  {

                     IlcEveTrack* trackSingle1 = dynamic_cast<IlcEveTrack*>((TEveElement*) *z);

                     TEveLine* momentumVector = new TEveLine(TString::Format("Momentum Vector"));

                     x1 = trackSingle1->GetESDTrack()->Xv();
                     y1 = trackSingle1->GetESDTrack()->Yv();
                     z1 = trackSingle1->GetESDTrack()->Zv();

                     momentumVector->SetPoint(0, x1, y1, z1);

                     x2 = x1+vectorLength*trackSingle1->GetESDTrack()->Px();
                     y2 = y1+vectorLength*trackSingle1->GetESDTrack()->Py();
                     z2 = z1+vectorLength*trackSingle1->GetESDTrack()->Pz();

                     momentumVector->SetPoint(1, x2, y2, z2);
/*
                     if(trackSingle1->GetESDTrack()->Charge() == -1)
                        momentumVector->SetLineColor(kGreen+3);
                     else
                        momentumVector->SetLineColor(kRed+3);
*/
                     momentumVector->SetLineColor(kRed+3);

                     momentumVector->SetLineWidth(1);
                     momentumVector->SetLineStyle(0);
                     momentumVector->SetTitle(Form("%f GeV/c", trackSingle1->GetESDTrack()->P()));

                     momentumVectorList3->AddElement(momentumVector);

                  }

                  //gEve->AddElement(momentumVectorList3);
                  momentumVectorList->AddElement(momentumVectorList3);

                  draw = kTRUE;

               }
            }
         }
      }
   }
 
  gEve->AddElement(momentumVectorList);

  TEveElement* top = gEve->GetCurrentEvent();

  IlcEveMultiView *mv = IlcEveMultiView::Instance();

  mv->DestroyEventRPhi();
  mv->DestroyEventRhoZ();

  mv->ImportEventRPhi(top);
  mv->ImportEventRhoZ(top);

  gEve->FullRedraw3D(kFALSE, kTRUE);

}