FEDRA emulsion software from the OPERA Collaboration
EdbEDAOperationTab Class Reference

#include <EdbEDATabs.h>

Collaboration diagram for EdbEDAOperationTab:

Public Member Functions

void AttachToVertex (EdbVertex *v, TObjArray *tracks)
 
void AttachToVertexButton ()
 
void ConnectTracks (EdbTrackP *t0, EdbTrackP *t1)
 
void ConnectTracksButton (void)
 
void DisconnectTracks (void)
 
void DumpTrack (EdbTrackP *t, FILE *fp=NULL, int run=99, int plate_coordinate=1)
 
void DumpTracksButton (void)
 
 EdbEDAOperationTab (void)
 
void MoveToTrackSetButton ()
 
void Redo (void)
 
void RemoveSegment (void)
 

Private Types

enum  {
  kNone , kConnect , kDisconnect , kRemoveSegment ,
  kAttarchToVertex
}
 

Private Attributes

TEveBrowser * browser
 
int eLastOperation
 
EdbEDATrackSeteSet
 
EdbTrackPeT0org
 
EdbTrackPeT0p
 
EdbTrackPeT1org
 
EdbTrackPeT1p
 
TGMainFrame * frame
 
TGNumberEntryField * fRun
 

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
private
Enumerator
kNone 
kConnect 
kDisconnect 
kRemoveSegment 
kAttarchToVertex 
@ kRemoveSegment
Definition: EdbEDATabs.h:168
@ kAttarchToVertex
Definition: EdbEDATabs.h:168
@ kConnect
Definition: EdbEDATabs.h:168
@ kDisconnect
Definition: EdbEDATabs.h:168
@ kNone
Definition: EdbEDATabs.h:168

Constructor & Destructor Documentation

◆ EdbEDAOperationTab()

EdbEDAOperationTab::EdbEDAOperationTab ( void  )
758  browser = gEve->GetBrowser();
759  browser->StartEmbedding(TRootBrowser::kBottom);
760 
761  frame = new TGMainFrame(gClient->GetRoot());
762  frame->SetWindowName("XX GUI");
763  frame->SetCleanup(kDeepCleanup);
764 
765  TGLabel *fLabel;
766  TGTextButton *fb;
767 
768  int posy=10;
769  int posx=10;
770  int dx=0;
771  fLabel = new TGLabel(frame,"For Track :");
772  fLabel->MoveResize(posx,posy,dx=80,20);
773 
774  posx+=dx+10;
775  fb = new TGTextButton(frame,"Connect");
776  fb->MoveResize(posx,posy,dx=80,20);
777  fb->Connect("Clicked()","EdbEDAOperationTab",this,"ConnectTracksButton()");
778 
779  posx+=dx+10;
780  fb = new TGTextButton(frame,"Disconnect");
781  fb->MoveResize(posx,posy,dx=80,20);
782  fb->Connect("Clicked()","EdbEDAOperationTab",this,"DisconnectTracks()");
783 
784  posx+=dx+10;
785  fb = new TGTextButton(frame,"RemoveSegment");
786  fb->MoveResize(posx,posy,dx=100,20);
787  fb->Connect("Clicked()","EdbEDAOperationTab",this,"RemoveSegment()");
788 
789  posx+=dx+20;
790  fb = new TGTextButton(frame,"Attach to Vtx");
791  fb->MoveResize(posx,posy,dx=100,20);
792  fb->Connect("Clicked()","EdbEDAOperationTab",this,"AttachToVertexButton()");
793  fb->SetToolTipText( "Attach selected tracks to the selected vertex (red).\n"
794  "the vertex position will not be re-calculated.");
795 
796 
797  posx+=dx+20;
798  fb = new TGTextButton(frame,"Move to TrackSet");
799  fb->MoveResize(posx,posy,dx=100,20);
800  fb->Connect("Clicked()","EdbEDAOperationTab",this,"MoveToTrackSetButton()");
801  fb->SetToolTipText("Move current selected tracks to a different track set.");
802 
803  posx+=dx+30;
804  fb = new TGTextButton(frame,"Dump text");
805  fb->MoveResize(posx,posy,dx=100,20);
806  fb->Connect("Clicked()","EdbEDAOperationTab",this,"DumpTracksButton()");
807  fb->SetToolTipText("Dump all segments of the selected tracks to a text file.\nthis would be usefull when you want to show a volume scan data with another volume scan data.");
808 
809 /* posx+=dx+10;
810  fLabel = new TGLabel(frame,"Run");
811  fLabel->MoveResize(posx,posy,dx=25,20);
812  posx+=dx+5;
813  fRun = new TGNumberEntryField(frame,-1, 2000);
814  fRun->MoveResize(posx,posy,dx=45,20);
815  fRun->SetToolTipText("Run number.");
816 */
817 
818 
819  posy+=20;
820  posx=10;
821  fb = new TGTextButton(frame,"Redo");
822  fb->MoveResize(posx,posy,dx=80,20);
823  fb->Connect("Clicked()","EdbEDAOperationTab",this,"Redo()");
824 
825  frame->MapSubwindows();
826  frame->Resize();
827  frame->MapWindow();
828 
829  browser->StopEmbedding();
830  browser->SetTabTitle("Operation", 2);
831 }
TGMainFrame * frame
Definition: EdbEDATabs.h:162
int eLastOperation
Definition: EdbEDATabs.h:167
TEveBrowser * browser
Definition: EdbEDATabs.h:161

Member Function Documentation

◆ AttachToVertex()

void EdbEDAOperationTab::AttachToVertex ( EdbVertex v,
TObjArray *  tracks 
)
834  {
835  ErrorMessage("Under construction.");
836 }
void ErrorMessage(const char *title, const char *message)
Definition: EdbEDAUtil.C:479

◆ AttachToVertexButton()

void EdbEDAOperationTab::AttachToVertexButton ( )
837  {
838  ErrorMessage("Under construction.");
839 }

◆ ConnectTracks()

void EdbEDAOperationTab::ConnectTracks ( EdbTrackP t0,
EdbTrackP t1 
)
875  {
876 
877  printf("Connect track %d (pl %02d -> %02d) and track %d (pl %02d -> %02d), remove %d\n",
878  t0->ID(), t0->GetSegmentFirst()->Plate(), t0->GetSegmentLast()->Plate(),
879  t1->ID(), t1->GetSegmentFirst()->Plate(), t1->GetSegmentLast()->Plate(), t1->ID());
880  int i,j;
881 
882  // store values for redo
883  eT0org=new EdbTrackP;
884  eT0org->Copy(*t0);
885  eT0p = t0;
886  eT1p = t1;
887  eSet = gEDA->GetTrackSet(t1);
889 
890  // add segments from t1 into t0.
891  for(i=0;i<t1->N();i++) {
892  EdbSegP *s1 = t1->GetSegment(i);
893  EdbSegP *s0;
894  int flag_double=0;
895  for(j=0;j<t0->N();j++) { // check double entry in a plate.
896  s0 = t0->GetSegment(j);
897  if(s1->Plate()==s0->Plate()) {
898  flag_double=1;
899  break;
900  }
901  }
902  if(flag_double){
903  // doesn't do anything.
904 
905  /*
906  // if 2 segment in a plate, put priority on smaller flag. as result, priority SF>SB>MAN>TS.
907  if(t0->Flag()<=t1->Flag()) {}
908  else {
909  t0->RemoveSegment(s0);
910  t0->AddSegment(s1);
911  }
912  */
913  printf("double segment on plate %d. ignore the segments from track %d.\n", s1->Plate(), t1->ID());
914  }
915  else t0->AddSegment(s1);
916  }
917 
918  t0->SetNpl();
919  t0->SetSegmentsTrack();
920  t0->SetCounters();
921 
922  // set t1->N() = 0
923  gEDA->RemoveTrackBase(t1);
924 }
EdbEDA * gEDA
Definition: EdbEDA.C:3
EdbEDATrackSet * eSet
Definition: EdbEDATabs.h:166
EdbTrackP * eT0org
Definition: EdbEDATabs.h:165
EdbTrackP * eT1p
Definition: EdbEDATabs.h:165
EdbTrackP * eT0p
Definition: EdbEDATabs.h:165
EdbEDATrackSet * GetTrackSet(int i)
Definition: EdbEDA.h:617
void RemoveTrackBase(EdbTrackP *t)
Definition: EdbEDA.h:640
Definition: EdbSegP.h:18
Int_t ID() const
Definition: EdbSegP.h:144
Int_t Plate() const
Definition: EdbSegP.h:156
Definition: EdbPattern.h:118
void AddSegment(EdbSegP *s)
Definition: EdbPattern.h:219
EdbSegP * GetSegmentFirst() const
Definition: EdbPattern.h:194
EdbSegP * GetSegmentLast() const
Definition: EdbPattern.h:195
Int_t N() const
Definition: EdbPattern.h:182
void Copy(const EdbTrackP &tr)
Definition: EdbPattern.cxx:516
void SetNpl(int npl)
Definition: EdbPattern.h:173
int SetSegmentsTrack(int id)
Definition: EdbPattern.h:252
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:200
void SetCounters()
Definition: EdbPattern.h:164
EdbSegP * s1
Definition: tlg2pattern.C:30

◆ ConnectTracksButton()

void EdbEDAOperationTab::ConnectTracksButton ( void  )
928  {
929 
930  TObjArray *selected_tracks = gEDA->GetSelectedTracks();
931  if(selected_tracks->GetEntriesFast()<=1){
932  printf("Select 2 tracks (segments) to be connected.\n");
933  return;
934  }
935 
936  // t0 is the parent
937  EdbTrackP *t0 = (EdbTrackP *) selected_tracks->At(0);
938  EdbTrackP *t1 = (EdbTrackP *) selected_tracks->At(1);
939 
940  EdbEDATrackSet *set0 = gEDA->GetTrackSet(t0);
941  EdbEDATrackSet *set1 = gEDA->GetTrackSet(t1);
942 
943  // if 2 tracks are from same TrackSet, sort by Z
944  if( set0==set1 ){
945  // soarted by the Z of first segment. (EdbTrackP is sortable)
946  selected_tracks->Sort();
947  // most upstream segment is the parent by default
948  t0 = (EdbTrackP *) selected_tracks->At(0);
949  t1 = (EdbTrackP *) selected_tracks->At(1);
950  }
951 
952  // if the t0 is from BT && t1 from TS, set parent as TS.
953  if(set0==gEDA->GetTrackSet("BT")&&set1==gEDA->GetTrackSet("TS")){
954  EdbTrackP *temp=t1;
955  t1=t0; t0=temp;
956  }
957 
958  ConnectTracks(t0,t1); // merge t1 into t0.
959 
960  gEDA->Redraw();
961 }
void ConnectTracks(EdbTrackP *t0, EdbTrackP *t1)
Definition: EdbEDATabs.C:875
TObjArray * GetSelectedTracks(void)
Definition: EdbEDA.h:417
Definition: EdbEDATrackSet.h:178
void Redraw()
Definition: EdbEDA.h:680

◆ DisconnectTracks()

void EdbEDAOperationTab::DisconnectTracks ( void  )
966  {
967  TObjArray *selected_tracks = gEDA->GetSelectedTracks();
968  TObjArray *selected = gEDA->GetSelected();
969  EdbTrackP *t = (EdbTrackP *) selected_tracks->At(0);
970  EdbSegP *ss = (EdbSegP *) selected->At(0);
971 
972 
973  if(t==NULL||ss==NULL) {
974  ErrorMessage("Select a segment! (most upstream segment of downstream track)");
975  return;
976  }
977  if(!IsSegment(ss)){
978  ErrorMessage("Select a segment! (most upstream segment of downstream track)");
979  return;
980  }
981 
982  if(ss==t->GetSegmentFirst()) {
983  ErrorMessage("Select a segment! (most upstream segment of downstream track)");
984  return;
985  }
986 
987  printf("Disconnect a track into 2 tracks by a selected segment.\n");
988 
989 
991 
992  EdbTrackP *tnew = new EdbTrackP;
993  set->AddTrack(tnew);
994 
995  tnew->Set(set->N()-1, ss->X(),ss->Y(),ss->TX(),ss->TY(),ss->W(),ss->Flag());
996  tnew->SetZ(ss->Z());
997  tnew->SetPID(ss->PID());
998 
999  eT0org=new EdbTrackP;
1000  eT0org->Copy(*t); // store values for Redo.
1001  eT0p = t;
1002  eT1p = tnew;
1004 
1005  for(int i=0;i<t->N();i++){
1006  EdbSegP *s = t->GetSegment(i);
1007  EdbSegP *sf = t->GetSegmentF(i);
1008  if(s->Compare(ss)>=0) {
1009  t->RemoveSegment(s);
1010  //t->RemoveSegmentF(s);
1011  tnew->AddSegment(s);
1012  tnew->AddSegmentF(sf);
1013  i--;
1014  }
1015  }
1016  tnew->SetSegmentsTrack();
1017  tnew->SetCounters();
1018 
1019  gEDA->Redraw();
1020 }
TTree * t
Definition: check_shower.C:4
TObjArray * GetSelected(void)
Definition: EdbEDA.h:405
void SetPID(int pid)
Definition: EdbSegP.h:126
void SetZ(float z)
Definition: EdbSegP.h:122
Int_t Compare(const TObject *obj) const
Definition: EdbSegP.cxx:446
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:86
void AddSegmentF(EdbSegP *s)
Definition: EdbPattern.h:238
EdbScanSet * set
Definition: emtraceback.cpp:14
ss
Definition: energy.C:62
int IsSegment(TObject *o)
Definition: EdbEDAUtil.C:29
#define NULL
Definition: nidaqmx.h:84
EdbSegP * s
Definition: tlg2pattern.C:32

◆ DumpTrack()

void EdbEDAOperationTab::DumpTrack ( EdbTrackP t,
FILE *  fp = NULL,
int  run = 99,
int  plate_coordinate = 1 
)
1075  {
1076 
1077  for(int i=0; i<t->N(); i++){
1078  EdbSegP *s0 = t->GetSegment(i);
1079  EdbSegP *s = new EdbSegP(*s0);
1080  int ipl = s->Plate();
1081  if(plate_coordinate){
1082  EdbAffine2D *aff0 = gEDA->GetAffine(ipl);
1083  EdbAffine2D *aff = new EdbAffine2D(*aff0);
1084  aff->Invert();
1085  s->Transform(aff);
1086  delete aff;
1087  }
1088  fprintf(fp,"%5d %2d %2d %8.1f %8.1f %7.4f %7.4f %d %4d\n",
1089  t->ID(), ipl, (int)s->W(), s->X(), s->Y(), s->TX(), s->TY(), plate_coordinate, run);
1090  delete s;
1091  }
1092 
1093 }
Definition: EdbAffine.h:17
void Invert()
Definition: EdbAffine.cxx:103
EdbAffine2D * GetAffine(int ipl)
Definition: EdbEDA.C:197
Float_t TX() const
Definition: EdbSegP.h:172
Float_t X() const
Definition: EdbSegP.h:170
Float_t Y() const
Definition: EdbSegP.h:171
Float_t W() const
Definition: EdbSegP.h:148
Float_t TY() const
Definition: EdbSegP.h:173
virtual void Transform(const EdbAffine2D *a)
EdbRun * run
Definition: check_raw.C:38

◆ DumpTracksButton()

void EdbEDAOperationTab::DumpTracksButton ( void  )
1095  {
1096  FILE *fp;
1097 
1098  char defaultname[256];
1099  if(gEDA->NSelectedTracks()==1) sprintf(defaultname,"track%d.txt", gEDA->GetSelectedTrack()->ID());
1100  else sprintf(defaultname,"track.txt");
1101 
1102  TGFileInfo *fi=new TGFileInfo;
1103  fi->fIniDir = StrDup(".");
1104  const char *filetypes[] = { "track text", "*.txt", "All files","*",0,0};
1105  fi->fFileTypes = filetypes;
1106  fi->fFilename = defaultname;
1107  new TGFileDialog(gClient->GetRoot(), gEve->GetMainWindow(), kFDSave, fi);
1108 
1109  if(fi->fFilename==NULL) return;
1110  if(strlen(fi->fFilename)==0) return;
1111 
1112  int plate_coordinate = EdbEDAUtil::AskYesNo("Save in plate codinate?");
1113 
1114 
1115  fp=fopen(fi->fFilename,"wt");
1116 
1117  if(fp==NULL) {
1118  ErrorMessage(Form("File open error : %s\n", fi->fFilename));
1119  return;
1120  }
1121 
1122  for(int i=0; i<gEDA->NSelectedTracks();i++){
1123  DumpTrack(gEDA->GetSelectedTrack(i), fp, 99, plate_coordinate);
1124  //DumpTrack(gEDA->GetSelectedTrack(i), fRun->GetIntNumber(), fp);
1125  }
1126 
1127  fclose(fp);
1128 
1129  printf("%d tracks was writen in %s\n", gEDA->NSelectedTracks(), fi->fFilename);
1130  delete fi;
1131 }
void DumpTrack(EdbTrackP *t, FILE *fp=NULL, int run=99, int plate_coordinate=1)
Definition: EdbEDATabs.C:1075
EdbTrackP * GetSelectedTrack(int i=-1)
Definition: EdbEDA.h:421
int NSelectedTracks()
Definition: EdbEDA.h:419
fclose(pFile)
bool AskYesNo(const char *message)
Definition: EdbEDAUtil.C:484

◆ MoveToTrackSetButton()

void EdbEDAOperationTab::MoveToTrackSetButton ( )
841  {
842 
843  if( gEDA->NSelectedTracks()==0) {
844  ErrorMessage("Please select one or more tracks.");
845  return;
846  }
847 
848  int isel;
849  new EdbEDATrackSetList(gEDA->GetTrackSets(), &isel, "Select Track set");
850  EdbEDATrackSet *set = isel!=-1 ? gEDA->GetTrackSet(isel) : NULL;
851 
852 
853  if(set==NULL){
854  ErrorMessage("TrackSet is not selected. stop.");
855  return;
856  }
857 
858  printf("Selected = %s\n", set->GetName());
859  for(int i=0;i<gEDA->NSelectedTracks(); i++){
861  EdbEDATrackSet *set0 = gEDA->GetTrackSet(t);
862  if(set==set0) continue;
863  set->AddTrack(t);
864  set0->RemoveTrack(t);
865  set0->RemoveTrackBase(t);
866  printf("track %5d move from TrackSet %s to %s.\n", t->ID(), set0->GetName(), set->GetName());
867  }
868  gEDA->Redraw();
869 
870 }
Definition: EdbEDATabs.h:188
void RemoveTrack(EdbTrackP *t)
Definition: EdbEDATrackSet.h:324
void RemoveTrackBase(EdbTrackP *t)
Definition: EdbEDATrackSet.h:323
TObjArray * GetTrackSets()
Definition: EdbEDA.h:638

◆ Redo()

void EdbEDAOperationTab::Redo ( void  )
1057  {
1058  if(eLastOperation==kNone) return;
1059  if(eLastOperation==kConnect){
1060  *eT0p=*eT0org;
1061  eSet->AddTrack(eT1p); //
1062  }
1064  *eT0p=*eT0org; //
1066  }
1068  *eT0p=*eT0org;
1069  }
1070 
1072  gEDA->Redraw();
1073 }
void AddTrack(EdbTrackP *t)
Definition: EdbEDATrackSet.h:277

◆ RemoveSegment()

void EdbEDAOperationTab::RemoveSegment ( void  )
1022  {
1023  TObjArray *selected_tracks = gEDA->GetSelectedTracks();
1024  TObjArray *selected = gEDA->GetSelected();
1025  EdbTrackP *t = (EdbTrackP *) selected_tracks->At(0);
1026  EdbSegP *ss = (EdbSegP *) selected->At(0);
1027 
1028  if(t->N()==1){
1029  ErrorMessage("There is only one segment. Cannot remove.");
1030  return;
1031  }
1032 
1033  if(t==NULL||ss==NULL) {
1034  ErrorMessage("Select a segment! \n");
1035  return;
1036  }
1037  if(!IsSegment(ss)){
1038  ErrorMessage("Select a segment! \n");
1039  return;
1040  }
1041 
1042  printf("Remove Segment Disconnect a track into 2 tracks by a selected segment.\n");
1043 
1044  eT0org=new EdbTrackP;
1045  eT0org->Copy(*t); // store values for Redo.
1046  eT0p=t;
1047 
1048  t->RemoveSegment(ss);
1050 
1051  t->SetSegmentsTrack();
1052  t->SetCounters();
1053 
1054  gEDA->Redraw();
1055 }

Member Data Documentation

◆ browser

TEveBrowser* EdbEDAOperationTab::browser
private

◆ eLastOperation

int EdbEDAOperationTab::eLastOperation
private

◆ eSet

EdbEDATrackSet* EdbEDAOperationTab::eSet
private

◆ eT0org

EdbTrackP* EdbEDAOperationTab::eT0org
private

◆ eT0p

EdbTrackP * EdbEDAOperationTab::eT0p
private

◆ eT1org

EdbTrackP * EdbEDAOperationTab::eT1org
private

◆ eT1p

EdbTrackP * EdbEDAOperationTab::eT1p
private

◆ frame

TGMainFrame* EdbEDAOperationTab::frame
private

◆ fRun

TGNumberEntryField* EdbEDAOperationTab::fRun
private

The documentation for this class was generated from the following files: