FEDRA emulsion software from the OPERA Collaboration
mosalignbeam.cpp File Reference
#include <string.h>
#include <iostream>
#include <TRint.h>
#include <TEnv.h>
#include <TChain.h>
#include <TList.h>
#include <TSystem.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 mosalignbeam.cpp:

Functions

bool AlignFragmentToBeam0 (EdbPattern &p1, EdbPattern &p2, EdbLayer &l1, EdbLayer &l2, float offMax, int flag=0)
 
void AlignToBeam (EdbID id, TEnv &env)
 
int main (int argc, char *argv[])
 
void print_help_message ()
 
void set_default_link (TEnv &cenv)
 
void TuneShrinkage (EdbPattern &p1, EdbPattern &p2, EdbLayer &l1, EdbLayer &l2, TEnv &env)
 

Variables

bool do_make_ab0
 
bool do_make_ab1
 
int from_fragment =0
 
int n_fragments =0
 

Function Documentation

◆ AlignFragmentToBeam0()

bool AlignFragmentToBeam0 ( EdbPattern p1,
EdbPattern p2,
EdbLayer l1,
EdbLayer l2,
float  offMax,
int  flag = 0 
)
261 {
262  // Assume 0 angle beam here
263  //
264  bool success=false;
265  int eMinPeak=100;
266  bool do_transform = true;
267 
269  av.eNoScale = 1; // calculate shift and rotation
270  av.eNoScaleRot = 0; // calculate shift only
271  av.eOffsetMax = offMax;
272  av.eDZ = 0.;
273  av.eDPHI = 0.0;
274  av.eDoFine = 1;
275  if(do_make_ab0) av.eSaveCouples = 1;
276  else av.eSaveCouples = 0;
277  av.SetSigma( 0.3, 0.025 );
278  av.eDoublets[0] = av.eDoublets[1]=0.01;
279  av.eDoublets[2] = av.eDoublets[3]=0.0001;
280  av.eDoCorrectAngle = false;
281  av.eSaveCouples=0;
282 
283  if(do_make_ab0)
284  av.InitOutputFile( Form( "p%.3d/%d_%d.ab0.root", p1.ScanID().ePlate, p1.ID(), p2.ID() ) );
285  av.Align( p1, p2, 0, flag); //-190
286  EdbAffine2D *affXY = av.eCorrL[0].GetAffineXY();
287  EdbAffine2D *affTXTY = av.eCorrL[0].GetAffineTXTY();
288 
289  float dtx1 = av.CalcMeanDiff2Const(2,0,0);
290  float dty1 = av.CalcMeanDiff2Const(3,0,0);
291  float dtx2 = av.CalcMeanDiff2Const(2,1,0);
292  float dty2 = av.CalcMeanDiff2Const(3,1,0);
293 
294  EdbAffine2D aa1; aa1.ShiftX(-dtx1); aa1.ShiftY(-dty1);
295  EdbAffine2D aa2; aa2.ShiftX(-dtx2); aa2.ShiftY(-dty2);
296 
297  //printf("\n angular offsets found: %f %f %f %f\n\n", dtx1,dty1,dtx2,dty2);
298 
299  if(av.eNcoins > eMinPeak )
300  {
301  if(do_transform) {
302  p1.Transform( affXY );
303  p1.TransformA( &aa1 );
304  p2.TransformA( &aa2 );
305  }
306  l1.GetAffineXY()->Transform( affXY );
307  l1.GetAffineTXTY()->Transform(aa1);
308  l2.GetAffineTXTY()->Transform(aa2);
309  success=true;
310  }
311 
312  if(do_make_ab0) av.CloseOutputFile();
313  return success;
314 }
Definition: EdbAffine.h:17
void ShiftX(float d)
Definition: EdbAffine.h:64
void ShiftY(float d)
Definition: EdbAffine.h:65
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
Float_t CalcMeanDiff2Const(int ivar, int side, float mean)
Definition: EdbAlignmentV.cxx:577
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 eDoCorrectAngle
Definition: EdbPlateAlignment.h:37
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
void TransformA(const EdbAffine2D *affA)
Definition: EdbPattern.cxx:367
bool do_make_ab0
Definition: mosalignbeam.cpp:93

◆ AlignToBeam()

void AlignToBeam ( EdbID  id,
TEnv &  env 
)
182 {
183  EdbMosaicIO mio;
184  TString file;
185  file.Form("p%3.3d/%d.%d.%d.%d.mos.root",
186  id.ePlate, id.eBrick, id.ePlate, id.eMajor, id.eMinor);
187  mio.Init( file.Data() );
188 
189  bool use_saved_alignment=true;
190 
191  EdbLayer *mapside1 = mio.GetCorrMap( id.ePlate, 1 );
192  EdbLayer *mapside2 = mio.GetCorrMap( id.ePlate, 2 ); // align side 2 to side 1
193  mapside1->SetZ( 97.5); // TODO take it from set.root
194  mapside2->SetZ(-97.5);
195 
196  int first,last;
197  int nc=mapside2->Map().Ncell();
198  if(from_fragment==0&&n_fragments==0)
199  {
200  first=0;
201  last=first+nc;
202  } else
203  {
204  first=from_fragment;
205  last=first+n_fragments;
206  }
207  Log(1,"mosalignbeam::AlignToBeam","with %d fragments [%d:%d] out of %d",
208  last-first, first,last-1,nc);
209 
210  for( int i=first; i<last; i++ )
211  {
212  EdbLayer *l1 = mapside1->Map().GetLayer(i);
213  EdbLayer *l2 = mapside2->Map().GetLayer(i);
214  if(l1&&l2)
215  {
216  if(!use_saved_alignment)
217  {
218  l1->GetAffineXY()->Reset();
219  l2->GetAffineXY()->Reset();
220  l1->GetAffineTXTY()->Reset();
221  l2->GetAffineTXTY()->Reset();
222  }
223  l1->SetZ( mapside1->Z() ); // base thickness is considered fixed...
224  l2->SetZ( mapside2->Z() );
225  EdbPattern *p1 = mio.GetFragment( id.ePlate, 1, i, use_saved_alignment ); //get side 1
226  EdbPattern *p2 = mio.GetFragment( id.ePlate, 2, i, use_saved_alignment ); //get side 2
227  if(p1&&p2)
228  {
229  p1->SetScanID(id);
230  p2->SetScanID(id);
231  p1->SetSegmentsFlag(0);
232  p2->SetSegmentsFlag(0);
233  Log(1,"mosalignbeam::AlignFragmentToBeam","fragment %d: %d & %d", p1->ID(), p1->N(),p2->N() );
234 
235  AlignFragmentToBeam0(*p2, *p1, *l2,*l1, 10 ); //align 2 to 1 using parallel beam tracks
236  AlignFragmentToBeam0(*p2, *p1, *l2,*l1, 5 ); //align 2 to 1 using parallel beam tracks
237  AlignFragmentToBeam0(*p2, *p1, *l2,*l1, 3, -10); //align 2 to 1 using parallel beam tracks, exclude segs by flag
238 
239  TuneShrinkage(*p2, *p1, *l2,*l1, cenv); // shrinkage correction using non-beam tracks
240  }
241  SafeDelete(p1);
242  SafeDelete(p2);
243  }
244  }
245  mio.Close();
246  if( !gSystem->AccessPathName(file.Data()) )
247  {
248  if( !gSystem->AccessPathName(file.Data(),kWritePermission ) )
249  {
250  mio.Init( file.Data(), "UPDATE" );
251  mio.SaveCorrMap( id.ePlate, 1, *mapside1 );
252  mio.SaveCorrMap( id.ePlate, 2, *mapside2 );
253  mio.Close();
254  Log(1,"mosalignbeam","%s maps saved into %s",id.AsString(),file.Data());
255  } else Log(1,"mosalignbeam","Error: file %s is not writable!",file.Data());
256  } else Log(1,"mosalignbeam","Error: file %s is not accessible!",file.Data());
257 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
void Reset()
Definition: EdbAffine.cxx:72
EdbLayer * GetLayer(float x, float y)
Definition: EdbLayer.h:24
int Ncell() const
Definition: EdbCell2.h:49
Definition: EdbLayer.h:40
EdbCorrectionMap & Map()
Definition: EdbLayer.h:73
void SetZ(float z)
Definition: EdbLayer.h:101
float Z() const
Definition: EdbLayer.h:78
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
void Close()
Definition: EdbMosaicIO.h:39
Definition: EdbPattern.h:280
void SetScanID(EdbID id)
Definition: EdbPattern.h:303
void SetSegmentsFlag(int flag)
Definition: EdbPattern.cxx:302
Int_t N() const
Definition: EdbPattern.h:89
TEnv cenv("emrec")
bool AlignFragmentToBeam0(EdbPattern &p1, EdbPattern &p2, EdbLayer &l1, EdbLayer &l2, float offMax, int flag=0)
Definition: mosalignbeam.cpp:260
void TuneShrinkage(EdbPattern &p1, EdbPattern &p2, EdbLayer &l1, EdbLayer &l2, TEnv &env)
Definition: mosalignbeam.cpp:317
int n_fragments
Definition: mosalignbeam.cpp:96
int from_fragment
Definition: mosalignbeam.cpp:95
TFile * file
Definition: write_pvr.C:3

◆ main()

int main ( int  argc,
char *  argv[] 
)
99 {
100  if (argc < 2) { print_help_message(); return 0; }
101 
102  TEnv cenv("mosalignbeamenv");
103  gEDBDEBUGLEVEL = cenv.GetValue("mosalignbeam.EdbDebugLevel" , 1);
104  const char *env = cenv.GetValue("mosalignbeam.env" , "mosalignbeam.rootrc");
105  const char *outdir = cenv.GetValue("mosalignbeam.outdir" , "..");
106 
107  bool do_single = false;
108  bool do_set = false;
109  bool do_merge = false;
110  EdbID id;
111 
112  for(int i=1; i<argc; i++ ) {
113  char *key = argv[i];
114 
115  if(!strncmp(key,"-set=",5))
116  {
117  if(strlen(key)>5) if(id.Set(key+5)) do_set=true;
118  }
119  else if(!strncmp(key,"-id=",4))
120  {
121  if(strlen(key)>4) if(id.Set(key+4)) do_single=true;
122  }
123  else if(!strncmp(key,"-from=",6))
124  {
125  if(strlen(key)>6) from_fragment = atoi(key+6);
126  }
127  else if(!strncmp(key,"-nfrag=",7))
128  {
129  if(strlen(key)>7) n_fragments = atoi(key+7);
130  }
131  else if(!strncmp(key,"-merge",6))
132  {
133  do_merge=true;
134  }
135  else if(!strncmp(key,"-v=",3))
136  {
137  if(strlen(key)>3) gEDBDEBUGLEVEL = atoi(key+3);
138  }
139  }
140 
141  if(!(do_single||do_set)) { print_help_message(); return 0; }
142  if( do_single&&do_set ) { print_help_message(); return 0; }
143 
145  cenv.SetValue("mosalignbeam.env" , env);
146  cenv.ReadFile( cenv.GetValue("mosalignbeam.env" , "mosalignbeam.rootrc") ,kEnvLocal);
147  cenv.SetValue("mosalignbeam.outdir" , outdir);
148 
150  sproc.eProcDirClient = cenv.GetValue("mosalignbeam.outdir","..");
151  cenv.WriteFile("mosalignbeam.save.rootrc");
152 
153  printf("\n----------------------------------------------------------------------------\n");
154  printf("mosalignbeam %s\n" ,id.AsString() );
155  printf( "----------------------------------------------------------------------------\n\n");
156 
157  do_make_ab0 = cenv.GetValue("fedra.mosalignbeam.make_ab0",0);
158  do_make_ab1 = cenv.GetValue("fedra.mosalignbeam.make_ab1",0);
159 
160  if(do_single)
161  {
162  AlignToBeam(id, cenv);
163  }
164  else if(do_set)
165  {
167  if(ss) {
168  int n = ss->eIDS.GetSize();
169  for(int i=0; i<n; i++) {
170  EdbID *id_pl = ss->GetID(i);
171  if(id_pl) AlignToBeam(*id_pl, cenv);
172  }
173  }
174  }
175 
176  cenv.WriteFile("mosalignbeam.save.rootrc");
177  return 1;
178 }
Definition: EdbID.h:7
Definition: EdbScanProc.h:12
TString eProcDirClient
Definition: EdbScanProc.h:14
EdbScanSet * ReadScanSet(EdbID id)
Definition: EdbScanProc.cxx:1521
Definition: EdbScanSet.h:11
EdbScanProc * sproc
Definition: comptonmap.cpp:29
bool do_set
Definition: emrec.cpp:36
const char * outdir
Definition: emrec.cpp:37
gEDBDEBUGLEVEL
Definition: energy.C:7
ss
Definition: energy.C:62
void AlignToBeam(EdbID id, TEnv &env)
Definition: mosalignbeam.cpp:181
void print_help_message()
Definition: mosalignbeam.cpp:25
void set_default_link(TEnv &cenv)
Definition: mosalignbeam.cpp:44
bool do_make_ab1
Definition: mosalignbeam.cpp:94
UInt_t id
Definition: tlg2pattern.C:118

◆ print_help_message()

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

◆ set_default_link()

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

◆ TuneShrinkage()

void TuneShrinkage ( EdbPattern p1,
EdbPattern p2,
EdbLayer l1,
EdbLayer l2,
TEnv &  env 
)
318 {
320  if(do_make_ab1)
321  {
322  link.InitOutputFile( Form( "p%.3d/%d_%d.ab1.root", p1.ScanID().ePlate, p1.ID(), p2.ID() ) );
323  }
324  else env.SetValue("fedra.link.DumpDoubletsTree" , false );
325  link.Link( p1, p2, l1, l2, env );
326  l1.SetShrinkage( l1.Shr()*link.eL1.Shr() );
327  l2.SetShrinkage( l2.Shr()*link.eL2.Shr() );
328  Log(1,"mosalignbeam:TuneShrinkage","%f %f",l1.Shr(),l2.Shr());
329  if(do_make_ab1) link.CloseOutputFile();
330 }
float Shr() const
Definition: EdbLayer.h:90
void SetShrinkage(float shr)
Definition: EdbLayer.h:100
Definition: EdbLinking.h:11

Variable Documentation

◆ do_make_ab0

bool do_make_ab0

◆ do_make_ab1

bool do_make_ab1

◆ from_fragment

int from_fragment =0

◆ n_fragments

int n_fragments =0