FEDRA emulsion software from the OPERA Collaboration
mosalign.cpp File Reference
#include <string.h>
#include <iostream>
#include <TRint.h>
#include <TEnv.h>
#include <TChain.h>
#include <TList.h>
#include "EdbLog.h"
#include "EdbRunAccess.h"
#include "EdbLinking.h"
#include "EdbScanProc.h"
#include "EdbPlateAlignment.h"
#include "EdbMosaic.h"
#include "EdbMosaicIO.h"
#include "EdbAttachPath.h"
Include dependency graph for mosalign.cpp:

Functions

bool Align2Fragments (EdbPattern &p1, EdbPattern &p2, EdbLayer &l1)
 
int AlignSide (EdbID id, int side, TEnv &env)
 
int main (int argc, char *argv[])
 
void print_help_message ()
 
void set_default_link (TEnv &cenv)
 

Function Documentation

◆ Align2Fragments()

bool Align2Fragments ( EdbPattern p1,
EdbPattern p2,
EdbLayer l1 
)
232 {
233  bool success=false;
234  int eMinPeak=100;
235  bool do_transform = true;
236 
238  av.eNoScale = 1; // calculate shift and rotation
239  av.eNoScaleRot = 0; // calculate shift only
240  av.eOffsetMax = 10.;
241  av.eDZ = 0.;
242  av.eDPHI = 0.02;
243  av.eDoFine = 1;
244  av.eSaveCouples = 1;
245  av.SetSigma( 0.3, 0.007 );
246  av.eDoublets[0] = av.eDoublets[1]=0.01;
247  av.eDoublets[2] = av.eDoublets[3]=0.0001;
248 
249  av.eSaveCouples=1;
250  av.InitOutputFile( Form( "p%.3d/%d_%d.alf.root", p1.ScanID().ePlate, p1.ID(), p2.ID() ) );
251  av.Align( p1, p2, 0); //-190
252  EdbAffine2D *affXY = av.eCorrL[0].GetAffineXY();
253  EdbAffine2D *affTXTY = av.eCorrL[0].GetAffineTXTY();
254 
255  if(av.eNcoins > eMinPeak )
256  {
257  if(do_transform) p1.Transform( affXY );
258  l1.GetAffineXY()->Transform( affXY );
259  success=true;
260  }
261 
262  av.CloseOutputFile();
263  return success;
264 }
Definition: EdbAffine.h:17
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
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
Int_t ePlate
Definition: EdbID.h:11
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:121
EdbID ScanID() const
Definition: EdbPattern.h:339
int ID() const
Definition: EdbPattern.h:328
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
Int_t eNcoins
Definition: EdbPlateAlignment.h:26
void Align(EdbPattern &p1, EdbPattern &p2, float dz, int flag=0)
Definition: EdbPlateAlignment.cxx:62
Bool_t eNoScale
Definition: EdbPlateAlignment.h:19
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:154

◆ AlignSide()

int AlignSide ( EdbID  id,
int  side,
TEnv &  env 
)
164 {
165  EdbMosaicIO mio;
166  TString file;
167  file.Form("p%3.3d/%d.%d.%d.%d.mos.root",
168  id.ePlate, id.eBrick, id.ePlate, id.eMajor, id.eMinor);
169  mio.Init( file.Data() );
170 
171  EdbLayer *mapside = mio.GetCorrMap( id.ePlate, side );
172 
173  int nc=mapside->Map().Ncell();
174  EdbAttachPath atp(nc);
175  for( int i=0; i<nc; i++ )
176  {
177  EdbLayer *l = mapside->Map().GetLayer(i);
178  atp.SetPoint(i,l->X(),l->Y(),l->ID());
179  }
180  //atp.SetStartingPosition(0);
181  atp.SetStartingAtCenter();
182  atp.OrderPointsRadial();
183  atp.SetRange(11000);
184  atp.RiseOK( atp.I(0) );
185 
186  int n = atp.N();
187  if(n>1)
188  {
189  for( int i=1; i<n; i++ )
190  {
191  int id1 = atp.ID( atp.I(i) );
192  EdbPattern *p1 = mio.GetFragment( id.ePlate, side, id1, false );
193  p1->SetScanID(id);
194  EdbLayer *l1 = mapside->Map().GetLayer( atp.I(i) );
195  p1->Transform( l1->GetAffineXY() );
196  printf("%d %f (%f %f), %f (%f %f) \n",l1->ID(),
197  l1->X(), p1->Xmin(), p1->Xmax(),l1->Y(), p1->Ymin(), p1->Ymax() );
198 
199  TArrayI list(10);
200  int nn = atp.GetAlignedNeighbours( atp.I(i), list );
201  printf( "nn = %d\n", nn);
202  EdbPattern p2;
203  p2.SetScanID(id);
204  if(nn)
205  {
206  for( int j=0; j<nn; j++ )
207  {
208  EdbPattern *p = mio.GetFragment( id.ePlate, side, list[j], false );
209  EdbLayer *l2 = mapside->Map().GetLayer( list[j] );
210  p2.Transform( l2->GetAffineXY() );
211  p2.AddPattern( *p );
212  delete p;
213  }
214  }
215  if( Align2Fragments(*p1, p2, *l1) ) atp.RiseOK( atp.I(i) );
216  delete p1;
217  }
218  }
219 
220 
221  for( int i=0; i<nc; i++ )
222  {
223  EdbLayer *l = mapside->Map().GetLayer(i);
224  l->GetAffineXY()->Print();
225  }
226  mio.SaveCorrMap( id.ePlate, side, *mapside, file.Data() );
227 
228 }
void Print(Option_t *opt="") const
Definition: EdbAffine.cxx:52
Definition: EdbAttachPath.h:12
EdbLayer * GetLayer(float x, float y)
Definition: EdbLayer.h:24
int Ncell() const
Definition: EdbCell2.h:49
Definition: EdbLayer.h:40
float Y() const
Definition: EdbLayer.h:77
int ID() const
Definition: EdbLayer.h:74
float X() const
Definition: EdbLayer.h:76
EdbCorrectionMap & Map()
Definition: EdbLayer.h:73
Definition: EdbMosaicIO.h:15
void SaveCorrMap(int plate, int side, EdbLayer &l, const char *file)
Definition: EdbMosaicIO.cxx:113
EdbPattern * GetFragment(int plate, int side, int id, bool do_corr)
Definition: EdbMosaicIO.cxx:66
void Init(const char *file, Option_t *option="")
Definition: EdbMosaicIO.cxx:16
EdbLayer * GetCorrMap(int plate, int side)
Definition: EdbMosaicIO.cxx:121
Definition: EdbPattern.h:280
Int_t AddPattern(EdbPattern &p)
Definition: EdbPattern.cxx:1563
void SetScanID(EdbID id)
Definition: EdbPattern.h:303
virtual Float_t Xmax() const
Definition: EdbVirtual.cxx:195
virtual Float_t Ymin() const
Definition: EdbVirtual.cxx:205
virtual Float_t Xmin() const
Definition: EdbVirtual.cxx:185
virtual Float_t Ymax() const
Definition: EdbVirtual.cxx:215
bool Align2Fragments(EdbPattern &p1, EdbPattern &p2, EdbLayer &l1)
Definition: mosalign.cpp:231
p
Definition: testBGReduction_AllMethods.C:8
TFile * file
Definition: write_pvr.C:3

◆ main()

int main ( int  argc,
char *  argv[] 
)
91 {
92  if (argc < 2) { print_help_message(); return 0; }
93 
94  TEnv cenv("mosalignenv");
95  gEDBDEBUGLEVEL = cenv.GetValue("mosalign.EdbDebugLevel" , 1);
96  const char *env = cenv.GetValue("mosalign.env" , "mosalign.rootrc");
97  const char *outdir = cenv.GetValue("mosalign.outdir" , "..");
98 
99  bool do_single = false;
100  bool do_set = false;
101  bool do_merge = false;
102  EdbID id;
103  int from_fragment=0;
104  int n_fragments=1000000;
105 
106  for(int i=1; i<argc; i++ ) {
107  char *key = argv[i];
108 
109  if(!strncmp(key,"-set=",5))
110  {
111  if(strlen(key)>5) if(id.Set(key+5)) do_set=true;
112  }
113  else if(!strncmp(key,"-id=",4))
114  {
115  if(strlen(key)>4) if(id.Set(key+4)) do_single=true;
116  }
117  else if(!strncmp(key,"-from=",6))
118  {
119  if(strlen(key)>6) from_fragment = atoi(key+6);
120  }
121  else if(!strncmp(key,"-nfrag=",7))
122  {
123  if(strlen(key)>7) n_fragments = atoi(key+7);
124  }
125  else if(!strncmp(key,"-merge",6))
126  {
127  do_merge=true;
128  }
129  else if(!strncmp(key,"-v=",3))
130  {
131  if(strlen(key)>3) gEDBDEBUGLEVEL = atoi(key+3);
132  }
133  }
134 
135  if(!(do_single||do_set)) { print_help_message(); return 0; }
136  if( do_single&&do_set ) { print_help_message(); return 0; }
137 
139  cenv.SetValue("mosalign.env" , env);
140  cenv.ReadFile( cenv.GetValue("mosalign.env" , "mosalign.rootrc") ,kEnvLocal);
141  cenv.SetValue("mosalign.outdir" , outdir);
142 
144  sproc.eProcDirClient = cenv.GetValue("mosalign.outdir","..");
145  cenv.WriteFile("mosalign.save.rootrc");
146 
147  printf("\n----------------------------------------------------------------------------\n");
148  printf("mosalign %s\n" ,id.AsString() );
149  printf( "----------------------------------------------------------------------------\n\n");
150 
151 
152  if(do_single)
153  {
154  AlignSide(id, 1, cenv);
155  AlignSide(id, 2, cenv);
156  }
157 
158  cenv.WriteFile("mosalign.save.rootrc");
159  return 1;
160 }
Definition: EdbID.h:7
Definition: EdbScanProc.h:12
TString eProcDirClient
Definition: EdbScanProc.h:14
EdbScanProc * sproc
Definition: comptonmap.cpp:29
TEnv cenv("emrec")
bool do_set
Definition: emrec.cpp:36
const char * outdir
Definition: emrec.cpp:37
gEDBDEBUGLEVEL
Definition: energy.C:7
void print_help_message()
Definition: mosalign.cpp:23
int AlignSide(EdbID id, int side, TEnv &env)
Definition: mosalign.cpp:163
void set_default_link(TEnv &cenv)
Definition: mosalign.cpp:41
int n_fragments
Definition: mosalignbeam.cpp:96
int from_fragment
Definition: mosalignbeam.cpp:95
UInt_t id
Definition: tlg2pattern.C:118

◆ print_help_message()

void print_help_message ( )
24 {
25  cout<< "\nUsage: \n";
26  cout<< "\t mosalign -id=ID [-from=frag0 -nfrag=N -merge -v=DEBUG] \n";
27 
28  cout<< "\t\t ID - id of the raw.root file formed as BRICK.PLATE.MAJOR.MINOR \n";
29  cout<< "\t\t frag0 - the first fragment (default: 0) \n";
30  cout<< "\t\t N - number of fragments to be processed (default: upto 1000000, stop at first empty) \n";
31  cout<< "\t\t merge - merge all fragments into one cp file \n";
32 
33  cout<< "\n If the data location directory if not explicitly defined\n";
34  cout<< " the current directory will be assumed to be the brick directory \n";
35  cout<< "\n If the parameters file (mosalign.rootrc) is not presented - the default \n";
36  cout<< " parameters will be used. After the execution them are saved into mosalign.save.rootrc file\n";
37  cout<<endl;
38 }

◆ set_default_link()

void set_default_link ( TEnv &  cenv)
42 {
43  // default parameters for the new linking
44  cenv.SetValue("fedra.link.AFID" , 1 ); // 1 is usually fine for scanned data; for the db-read data use 0!
45  cenv.SetValue("fedra.link.DoImageCorr" , 0 );
46  cenv.SetValue("fedra.link.ImageCorrSide1" , "1. 1. 0.");
47  cenv.SetValue("fedra.link.ImageCorrSide2" , "1. 1. 0.");
48 
49  cenv.SetValue("fedra.link.DoImageMatrixCorr" , 0 );
50  cenv.SetValue("fedra.link.ImageMatrixCorrSide1" , "");
51  cenv.SetValue("fedra.link.ImageMatrixCorrSide2" , "");
52 
53  cenv.SetValue("fedra.link.CheckUpDownOffset" , 1 ); // check dXdY offsets between up and correspondent down views
54  cenv.SetValue("fedra.link.BinOK" , 6. );
55  cenv.SetValue("fedra.link.NcorrMin" , 100 );
56  cenv.SetValue("fedra.link.DoCorrectShrinkage" , false );
57  cenv.SetValue("fedra.link.read.InvertSides" , 0 );
58  cenv.SetValue("fedra.link.read.HeaderCut" , "1" );
59  cenv.SetValue("fedra.link.read.UseDensityAsW" , false );
60  cenv.SetValue("fedra.link.read.ICUT" , "-1 -500. 500. -500. 500. -1. 1. -1. 1. 0. 50.");
61  cenv.SetValue("fedra.link.RemoveDoublets" , "1 2. .01 1"); //yes/no dr dt checkview(0,1,2)
62  cenv.SetValue("fedra.link.DumpDoubletsTree" , true );
63  cenv.SetValue("fedra.link.shr.NsigmaEQ" , 7.5 );
64  cenv.SetValue("fedra.link.shr.Shr0" , .990 );
65  cenv.SetValue("fedra.link.shr.DShr" , .3 );
66  cenv.SetValue("fedra.link.shr.ThetaLimits" ,"0.0 1.");
67  cenv.SetValue("fedra.link.DoCorrectAngles" , true );
68  cenv.SetValue("fedra.link.ang.Chi2max" , 1.5 );
69  cenv.SetValue("fedra.link.DoFullLinking" , true );
70  cenv.SetValue("fedra.link.full.NsigmaEQ" , 5.5 );
71  cenv.SetValue("fedra.link.full.DR" , 20. );
72  cenv.SetValue("fedra.link.full.DT" , 0.1 );
73  cenv.SetValue("fedra.link.full.CHI2Pmax" , 3. );
74  cenv.SetValue("fedra.link.DoSaveCouples" , true );
75  cenv.SetValue("fedra.link.Sigma0" , "1 1 0.007 0.007");
76  cenv.SetValue("fedra.link.PulsRamp0" , "6 9");
77  cenv.SetValue("fedra.link.PulsRamp04" , "6 9");
78  cenv.SetValue("fedra.link.Degrad" , 5 );
79 
80  cenv.SetValue("fedra.link.LLfunction" , "0.256336-0.16489*x+2.11098*x*x" );
81  cenv.SetValue("fedra.link.CPRankingAlg" , 0 );
82 
83  cenv.SetValue("emlink.reportfileformat" , "pdf" );
84 
85  cenv.SetValue("emlink.outdir" , "..");
86  cenv.SetValue("emlink.env" , "link.rootrc");
87  cenv.SetValue("emlink.EdbDebugLevel" , 1);
88 }