FEDRA emulsion software from the OPERA Collaboration
tagalign.cpp File Reference
#include <TEnv.h>
#include "EdbLog.h"
#include "EdbScanProc.h"
#include "EdbMosaic.h"
#include "EdbMosaicIO.h"
Include dependency graph for tagalign.cpp:

Functions

bool Align2Fragments (EdbPattern &p1, EdbPattern &p2, EdbLayer &l1)
 
int AlignID (EdbID id, TEnv &env)
 
void AlignNewNopar (EdbID id1, EdbID id2, int side, TEnv &cenv, EdbAffine2D *aff, float dz, EdbScanProc &sproc)
 
EdbPatternGetPattern (EdbID id, int side)
 
EdbPatternGetPattern (EdbID id, int side, int do_sub, float xmin, float xmax, float ymin, float ymax)
 
int main (int argc, char *argv[])
 
void print_help_message ()
 
void set_default_par (TEnv &cenv)
 

Function Documentation

◆ Align2Fragments()

bool Align2Fragments ( EdbPattern p1,
EdbPattern p2,
EdbLayer l1 
)
179 {
180  bool success=false;
181  int eMinPeak=25;
182  bool do_transform = true;
183 
185  av.eNoScale = 0; // calculate shift and rotation
186  av.eNoScaleRot = 1; // calculate shift only
187  av.eOffsetMax = 10000.;
188  av.eDZ = 0.;
189  av.eDPHI = 0.02;
190  av.eDoFine = 1;
191  av.eSaveCouples = 1;
192  av.SetSigma( 50, 0.1 );
193  av.eDoublets[0] = av.eDoublets[1]=0.01;
194  av.eDoublets[2] = av.eDoublets[3]=0.0001;
195 
196  av.eSaveCouples=1;
197  av.InitOutputFile( Form( "p%.3d/%d_%d.alt.root", p1.Plate(), p1.ID(), p2.ID() ) );
198  av.Align( p1, p2, 10); //-190
199  EdbAffine2D *affXY = av.eCorrL[0].GetAffineXY();
200  EdbAffine2D *affTXTY = av.eCorrL[0].GetAffineTXTY();
201 
202  /*
203  if(av.eNcoins > eMinPeak )
204  {
205  if(do_transform) p1.Transform( affXY );
206  l1.GetAffineXY()->Transform( affXY );
207  success=true;
208  }
209  */
210 
211  av.CloseOutputFile();
212  return success;
213 }
Definition: EdbAffine.h:17
EdbLayer eCorrL[2]
Definition: EdbAlignmentV.h:25
void InitOutputFile(const char *file="report_al.root", const char *option="RECREATE")
Definition: EdbAlignmentV.cxx:55
void CloseOutputFile()
Definition: EdbAlignmentV.cxx:64
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:121
int ID() const
Definition: EdbPattern.h:328
Int_t Plate() const
Definition: EdbPattern.h:340
Definition: EdbPlateAlignment.h:8
Float_t eOffsetMax
Definition: EdbPlateAlignment.h:12
Bool_t eSaveCouples
Definition: EdbPlateAlignment.h:24
void SetSigma(float spos, float sang)
Definition: EdbPlateAlignment.h:56
Bool_t eDoFine
Definition: EdbPlateAlignment.h:22
Float_t eDZ
Definition: EdbPlateAlignment.h:14
Bool_t eNoScaleRot
Definition: EdbPlateAlignment.h:18
Float_t eDoublets[4]
Definition: EdbPlateAlignment.h:16
Float_t eDPHI
Definition: EdbPlateAlignment.h:15
void Align(EdbPattern &p1, EdbPattern &p2, float dz, int flag=0)
Definition: EdbPlateAlignment.cxx:62
Bool_t eNoScale
Definition: EdbPlateAlignment.h:19

◆ AlignID()

int AlignID ( EdbID  id,
TEnv &  env 
)
140 {
141  EdbMosaicIO mio;
142  TString file;
143  file.Form("p%3.3d/%d.%d.%d.%d.tag.root",
144  id.ePlate, id.eBrick, id.ePlate, id.eMajor, id.eMinor);
145  TFile f( file.Data() );
146  EdbPattern *p1 = (EdbPattern*)(f.Get( Form("gpat%d_1_0",id.ePlate) ) );
147  EdbPattern *p2 = (EdbPattern*)(f.Get( Form("gpat%d_2_0",id.ePlate) ) );
148  p1->SetScanID(id); p1->SetSide(1);
149  p2->SetScanID(id); p2->SetSide(2);
150 
151  EdbLayer la;
152  Align2Fragments( *p1, *p2, la);
153 
154 }
FILE * f
Definition: RecDispMC.C:150
Definition: EdbLayer.h:40
Definition: EdbMosaicIO.h:15
Definition: EdbPattern.h:280
void SetSide(int side)
Definition: EdbPattern.h:321
void SetScanID(EdbID id)
Definition: EdbPattern.h:303
bool Align2Fragments(EdbPattern &p1, EdbPattern &p2, EdbLayer &l1)
Definition: tagalign.cpp:178
TFile * file
Definition: write_pvr.C:3

◆ AlignNewNopar()

void AlignNewNopar ( EdbID  id1,
EdbID  id2,
int  side,
TEnv &  cenv,
EdbAffine2D aff,
float  dz,
EdbScanProc sproc 
)
217 {
218  // Align 2 patterns. All necessary information should be in the envfile
219  // Convension about Z(setted while process): the z of id2 is 0, the z of id1 is (-deltaZ) where
220  // deltaZ readed from aff.par file in a way that pattern of id1 projected
221  // to deltaZ correspond to pattern of id2
222 
224  av.eOffsetMax = cenv.GetValue("fedra.align.OffsetMax" , 1000. );
225  av.SetSigma( cenv.GetValue("fedra.align.SigmaR" , 50. ),
226  cenv.GetValue("fedra.align.SigmaT" , 0.008) );
227  av.eDoFine = cenv.GetValue("fedra.align.DoFine" , 1);
228  av.eDZ = cenv.GetValue("fedra.align.DZ" , 0);
229  av.eDPHI = cenv.GetValue("fedra.align.DPHI" , 0.008 );
230  av.eSaveCouples = cenv.GetValue("fedra.align.SaveCouples" , 1);
231  int do_sub = cenv.GetValue("fedra.align.DoSub", 0);
232  float xmin = cenv.GetValue("fedra.align.Xmin" , 0.);
233  float xmax = cenv.GetValue("fedra.align.Xmax" , 0.);
234  float ymin = cenv.GetValue("fedra.align.Ymin" , 0.);
235  float ymax = cenv.GetValue("fedra.align.Ymax" , 0.);
236 
237  EdbPattern *p1 = GetPattern(id1,side, do_sub, xmin, xmax, ymin, ymax );
238  EdbPattern *p2 = GetPattern(id2,side, do_sub, xmin, xmax, ymin, ymax );
239  if(aff) { aff->Print(); p1->Transform(aff);}
240 
241  TString alfile;
242  sproc.MakeAffName(alfile,id1,id2,"al.root");
243  av.InitOutputFile( alfile );
244  printf("dz = %f \n",dz);
245  av.Align( *p1, *p2 , dz);
246  av.CloseOutputFile();
247  sproc.UpdateAFFPar( id1, id2, av.eCorrL[0], aff );
248 }
brick dz
Definition: RecDispMC.C:107
void Print(Option_t *opt="") const
Definition: EdbAffine.cxx:52
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:154
bool UpdateAFFPar(EdbID id1, EdbID id2, EdbLayer &l, EdbAffine2D *aff0=0)
Definition: EdbScanProc.cxx:1026
void MakeAffName(TString &s, int id1[4], int id2[4], const char *suffix="aff.par")
Definition: EdbScanProc.cxx:1917
EdbScanProc * sproc
Definition: comptonmap.cpp:29
TEnv cenv("emrec")
float xmin
Definition: emthickness.cpp:61
float ymin
Definition: emthickness.cpp:63
float xmax
Definition: emthickness.cpp:61
float ymax
Definition: emthickness.cpp:63
EdbPattern * GetPattern(EdbID id, int side)

◆ GetPattern() [1/2]

EdbPattern* GetPattern ( EdbID  id,
int  side 
)

◆ GetPattern() [2/2]

EdbPattern* GetPattern ( EdbID  id,
int  side,
int  do_sub,
float  xmin,
float  xmax,
float  ymin,
float  ymax 
)
158 {
159  EdbMosaicIO mio;
160  TString file;
161  file.Form("p%3.3d/%d.%d.%d.%d.tag.root",
162  id.ePlate, id.eBrick, id.ePlate, id.eMajor, id.eMinor);
163  TFile f( file.Data() );
164  EdbPattern *p = (EdbPattern*)(f.Get( Form("gpat%d_%d_0",id.ePlate, side) ) );
165  if(!do_sub) {
166  p->SetScanID(id); p->SetSide(side);
167  p->SetSegmentsW(1.);
168  return p;
169  }
170  EdbPattern *psub = p->ExtractSubPatternXY(xmin, xmax, ymin, ymax);
171  delete p;
172  psub->SetScanID(id); psub->SetSide(side);
173  psub->SetSegmentsW(1.);
174  return psub;
175 }
void SetSegmentsW(float w)
Definition: EdbPattern.cxx:293
p
Definition: testBGReduction_AllMethods.C:8

◆ main()

int main ( int  argc,
char *  argv[] 
)
52 {
53  if (argc < 2) { print_help_message(); return 0; }
54 
55  TEnv cenv("tagalignenv");
56  gEDBDEBUGLEVEL = cenv.GetValue("tagalign.EdbDebugLevel" , 1);
57  const char *env = cenv.GetValue("tagalign.env" , "tagalign.rootrc");
58  const char *outdir = cenv.GetValue("tagalign.outdir" , "..");
59 
60  bool do_single = false;
61  bool do_A = false;
62  bool do_B = false;
63  bool do_set = false;
64  bool do_flip = false;
65  EdbID id;
66  EdbID ida, idb;
67  int al_side = cenv.GetValue("fedra.tagalign.AlignSide", 1); // 1, 2, 0-base
68 
69  for(int i=1; i<argc; i++ ) {
70  char *key = argv[i];
71 
72  if(!strncmp(key,"-set=",5))
73  {
74  if(strlen(key)>5) if(id.Set(key+5)) do_set=true;
75  }
76  else if(!strncmp(key,"-id=",4))
77  {
78  if(strlen(key)>4) if(id.Set(key+4)) do_single=true;
79  }
80  else if(!strncmp(key,"-A=",3))
81  {
82  if(strlen(key)>3) if(ida.Set(key+3)) do_A=true;
83  }
84  else if(!strncmp(key,"-B=",3))
85  {
86  if(strlen(key)>3) if(idb.Set(key+3)) do_B=true;
87  }
88  else if(!strncmp(key,"-side=",6))
89  {
90  if(strlen(key)>6) al_side = atoi(key+6);
91  }
92  else if(!strncmp(key,"-v=",3))
93  {
94  if(strlen(key)>3) gEDBDEBUGLEVEL = atoi(key+3);
95  }
96  else if(!strncmp(key,"-flip",5))
97  {
98  do_flip=true;
99  }
100  }
101 
102  if(!(do_single||do_set)&&(!(do_A&&do_B))) { print_help_message(); return 0; }
103  if( do_single&&do_set ) { print_help_message(); return 0; }
104 
106  cenv.SetValue("tagalign.env" , env);
107  cenv.ReadFile( cenv.GetValue("tagalign.env" , "tagalign.rootrc") ,kEnvLocal);
108  cenv.SetValue("tagalign.outdir" , outdir);
109 
111  sproc.eProcDirClient = cenv.GetValue("tagalign.outdir","..");
112  cenv.WriteFile("tagalign.save.rootrc");
113 
114  printf("\n----------------------------------------------------------------------------\n");
115  printf("tagalign %s\n" ,id.AsString() );
116  printf( "----------------------------------------------------------------------------\n\n");
117 
118 
119  if(do_single)
120  {
121  AlignID(id, cenv);
122  }
123  else if(do_A&&do_B)
124  {
125  EdbID id0=ida; id0.ePlate=0;
126  EdbScanSet *ss = sproc.ReadScanSet(id0);
127  if(ss) {
128  EdbAffine2D aff;
129  float dz = 0;
130  if(ss->GetAffP2P(ida.ePlate, idb.ePlate, aff)) dz = ss->GetDZP2P(ida.ePlate, idb.ePlate);
131  AlignNewNopar(ida,idb, al_side, cenv,&aff, dz, sproc);
132  }
133  }
134  cenv.WriteFile("tagalign.save.rootrc");
135  return 1;
136 }
Definition: EdbID.h:7
bool Set(const char *id_string)
Definition: EdbID.cxx:17
Int_t ePlate
Definition: EdbID.h:11
Definition: EdbScanProc.h:12
TString eProcDirClient
Definition: EdbScanProc.h:14
EdbScanSet * ReadScanSet(EdbID id)
Definition: EdbScanProc.cxx:1521
Definition: EdbScanSet.h:11
bool do_set
Definition: emrec.cpp:36
const char * outdir
Definition: emrec.cpp:37
gEDBDEBUGLEVEL
Definition: energy.C:7
ss
Definition: energy.C:62
UInt_t id
Definition: tlg2pattern.C:118
int AlignID(EdbID id, TEnv &env)
Definition: tagalign.cpp:139
void print_help_message()
Definition: tagalign.cpp:16
void AlignNewNopar(EdbID id1, EdbID id2, int side, TEnv &cenv, EdbAffine2D *aff, float dz, EdbScanProc &sproc)
Definition: tagalign.cpp:216
void set_default_par(TEnv &cenv)
Definition: tagalign.cpp:34

◆ print_help_message()

void print_help_message ( )
17 {
18  cout<< "\nUsage: \n";
19  cout<< "\t tagalign -A=ida -B=idb [-v=DEBUG] \n";
20  cout<< "\t tagalign -id=ID [-v=DEBUG] \n";
21 
22  cout<< "\t\t ida - id of the first pattern\n";
23  cout<< "\t\t idb - id of the second pattern \n";
24  cout<< "\t\t ID - id of the mos.root file (align up/down in this case) \n";
25 
26  cout<< "\n If the data location directory if not explicitly defined\n";
27  cout<< " the current directory will be assumed to be the brick directory \n";
28  cout<< "\n If the parameters file (tagalign.rootrc) is not presented - the default \n";
29  cout<< " parameters will be used. After the execution them are saved into tagalign.save.rootrc file\n";
30  cout<<endl;
31 }

◆ set_default_par()

void set_default_par ( TEnv &  cenv)
35 {
36  //set default parameters
37  cenv.SetValue("fedra.align.OffsetMax" , 10000. );
38  cenv.SetValue("fedra.align.SigmaR" , 50. );
39  cenv.SetValue("fedra.align.SigmaT" , 0.008 );
40  cenv.SetValue("fedra.align.DoFine" , 1 );
41  cenv.SetValue("fedra.align.DZ" , 0 );
42  cenv.SetValue("fedra.align.DPHI" , 0.008 );
43  cenv.SetValue("fedra.align.DoSub" , 0 );
44  cenv.SetValue("fedra.align.Xmin" , 0. );
45  cenv.SetValue("fedra.align.Xmax" , 0. );
46  cenv.SetValue("fedra.align.Ymin" , 0. );
47  cenv.SetValue("fedra.align.Ymax" , 0. );
48  cenv.SetValue("fedra.align.SaveCouples" , 1 );
49 }