Re: [ROOT] Simple event display using TGeo classes

From: Andrei Gheata (Andrei.Gheata@cern.ch)
Date: Mon Dec 08 2003 - 11:28:13 MET


Hi Paolo,

Interesting idea to make use of TGeo classes in this way. The package is 
however not meant for that and for sure a lego plot would be much more 
efficient. On the other hand I agree that you might get some extra 
flexibility with 3D objects.

  Anyhow, your macro produces a crash because it is not enough to delete 
the boxes; the node hierarchy that you have created is still there 
having orphan shape pointers. It is not very good to remove shapes after 
the geometry is closed.

  I propose an other way of doing the same thing - you create all 
shapes/volumes at the beginning and then change the size/matrices for 
the boxes that represent a hit. Have a look at the attached macro. You 
run it once and then call MakeEvents() as many times you want.

Best regards,
Andrei

paolo maestro wrote:
> Hi Rooters,
> I'm trying to do a simple event display for
> a  pixels array detector  using the ROOT geometry package.
> In each event a parallelepiped is associated to each hit  with height
> proportional to the energy deposit and location  corresponding
> to the hit pixel. At the end of the event I would like to clear all the
> hits (parallelepipeds).
> I send you the code in attachment with a dummy generation of events.
> The program  crashes when it enters the loop aimed to clear the hits.
> Why ? Is there an alternative way to do it?
> Thanks
>  Cheers
>                     Paolo
> 
> P.S. I'm using the latest version of ROOT.
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> void EventDisplay()
> {
> //--- Definition of a simple geometry
>   TCanvas* c1=new TCanvas("c1","",700,700);
>    gSystem->Load("libGeom");
>    TGeoManager *gGeoManager = new TGeoManager("ROOT", "Simple geometry");
>    
>    //--- define materials
>    TGeoMaterial *matVacuum = new TGeoMaterial("Vacuum", 0,0,0);  
>    TGeoMedium *Vacuum = new TGeoMedium("Vacuum",1, matVacuum);
>    
>    //Experimental hall
>    TGeoVolume *EXPH = gGeoManager->MakeBox("EXPH",Vacuum, 600., 600., 600.);
>    gGeoManager->SetTopVolume(EXPH);
> 
>    const Int_t Nrow=56,Ncol=52;
>    float xside=1.5,yside=1.3;
> 
>    //Matrix of pixels
>    TGeoVolume *SCDP=gGeoManager->MakeBox("SCDP",Vacuum,xside/2,yside/2,0.04/2);
>    SCDP->SetVisibility(1);
>    SCDP->SetLineColor(3);
>  
>    for(int i=0;i<Nrow;i++)
>      {
>        for(int j=0;j<Ncol;j++)
> 	 {
> 	   float posX=-Ncol*xside/2+(2*j+1)*xside/2;
> 	   float posY=-Nrow*yside/2+(2*i+1)*yside/2;
> 	   float posZ=0;
> 	   EXPH->AddNode(SCDP,i*Ncol+j,new TGeoTranslation(posX,posY,posZ));
> 	 }
>      }
> 
>    gGeoManager->CloseGeometry();
>    gGeoManager->SetVisLevel(4);
>    EXPH->Draw();
> 
> 
>    //generation of 10 dummy events with at most 20 associated hits 
>    TGeoVolume *hit[20];
>    gRandom->SetSeed(0);
>    for(int evt=0;evt<10;evt++)
>      {
>        int nhit=int(20*gRandom->Rndm());
>        cout<<"Nhit "<<nhit<<endl;
>        for(int i=0;i<nhit;i++)
> 	 {   
> 	   int row=int(Nrow*gRandom->Rndm());
> 	   int col=int(Ncol*gRandom->Rndm());
> 	   float edep=gRandom->Rndm()*10;
> 	   hit[i]=gGeoManager->MakeBox("hit",Vacuum,xside/2,yside/2,edep/2);
> 	   
> 	   hit[i]->SetVisibility(1);
> 	   hit[i]->SetLineColor(2);
> 	   float posX=-Ncol*xside/2+(2*col+1)*xside/2;
> 	   float posY=-Nrow*yside/2+(2*row+1)*yside/2;
> 	   EXPH->AddNode(hit[i],i+1,new TGeoTranslation(posX,posY,edep/2));    
> 	 }
> 
>        for(int i=0;i<nhit;i++)
> 	 {
> 	   char buf[10];
> 	   sprintf(buf,"hit_%d",i+1);
> 	   EXPH->GetNode(buf)->Clear();
> 	   hit[i]->ClearShape();
> 	 }
>      }
>       
> }
> 
>    


   const Int_t Nrow=56,Ncol=52;
   float xside=1.5,yside=1.3;

void EventDisplay()
{
//--- Definition of a simple geometry
  TCanvas* c1=new TCanvas("c1","",700,700);
   gSystem->Load("libGeom");
   TGeoManager *gGeoManager = new TGeoManager("ROOT", "Simple geometry");
   
   //--- define materials
   TGeoMaterial *matVacuum = new TGeoMaterial("Vacuum", 0,0,0);  
   TGeoMedium *Vacuum = new TGeoMedium("Vacuum",1, matVacuum);
   
   //Experimental hall
   TGeoVolume *EXPH = gGeoManager->MakeBox("EXPH",Vacuum, 600., 600., 600.);
   gGeoManager->SetTopVolume(EXPH);


   //Matrix of pixels
//   TGeoVolume *SCDP=gGeoManager->MakeBox("SCDP",Vacuum,xside/2,yside/2,0.04/2);
//   SCDP->SetVisibility(1);
//   SCDP->SetLineColor(3);
   TGeoVolume *hit;
   TGeoNode *node;
   TGeoTranslation *trans;
 
   for(int i=0;i<Nrow;i++)
     {
       for(int j=0;j<Ncol;j++)
	 {
	   float posX=-Ncol*xside/2+(2*j+1)*xside/2;
	   float posY=-Nrow*yside/2+(2*i+1)*yside/2;
	   float posZ=0;
	   hit = gGeoManager->MakeBox("HIT",Vacuum, xside/2,yside/2,0.04/2);
	   hit->SetLineColor(kGreen);
	   trans = new TGeoTranslation(posX,posY,posZ);
	   EXPH->AddNode(hit, i*Ncol+j, trans);
	 }
     }

   gGeoManager->CloseGeometry();
   MakeEvents();
   EXPH->Draw();
//   EXPH->Raytrace(); // activate this if you want raytraced-based solid mode in TPad
}

void MakeEvents() {
   //generation of 10 dummy events with at most 20 associated hits 
   ResetDisplay();
   TGeoNode *node;
   TGeoTranslation *trans;
   TGeoVolume *EXPH = gGeoManager->GetVolume("EXPH");
   gRandom->SetSeed(0);
   for(int evt=0;evt<10;evt++)
     {
       int nhit=int(20*gRandom->Rndm());
       cout<<"Nhit "<<nhit<<endl;
       for(int i=0;i<nhit;i++)
	 {   
	   int row=int(Nrow*gRandom->Rndm());
	   int col=int(Ncol*gRandom->Rndm());
	   float edep=gRandom->Rndm()*10;
	   node = EXPH->GetNode(row*Ncol+col);
	   box = (TGeoBBox*)(node->GetVolume()->GetShape());
	   trans = (TGeoTranslation*)node->GetMatrix();
	   box->SetBoxDimensions(xside/2,yside/2,edep/2);
	   trans->SetDz(edep/2);
	   node->GetVolume()->SetLineColor(2);
	 }
     }
     EXPH->Voxelize(""); // now the new geometry is valid for tracking, so you can do
     // even raytracing
     if (gPad) {
        gPad->Modified();
        gPad->Update(); 
     }	
}

void ResetDisplay()
{
   TGeoNode *node;
   TGeoBBox *box;
   TGeoVolume *EXPH = gGeoManager->GetVolume("EXPH");   
   TGeoTranslation *trans;
   
   for(int i=0;i<Nrow;i++) {
      for(int j=0;j<Ncol;j++) {
         node = EXPH->GetNode(i*Ncol+j);
         box = (TGeoBBox*)(node->GetVolume()->GetShape());
         trans = (TGeoTranslation*)node->GetMatrix();
         box->SetBoxDimensions(box->GetDX(),box->GetDY(),0.04/2);
         trans->SetDz(0);
         node->GetVolume()->SetLineColor(kGreen);
      }
   }
}     	   
	   
            
   



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:17 MET