FEDRA emulsion software from the OPERA Collaboration
mostag.cpp File Reference
#include <string.h>
#include <iostream>
#include <TROOT.h>
#include <TStyle.h>
#include <TEnv.h>
#include <TH2F.h>
#include <TCanvas.h>
#include <TPad.h>
#include <TText.h>
#include <TEllipse.h>
#include "EdbLog.h"
#include "EdbAlignmentV.h"
#include "EdbRunAccess.h"
#include "EdbScanProc.h"
#include "EdbMosaic.h"
#include "EdbMosaicIO.h"
#include "EdbLinking.h"
Include dependency graph for mostag.cpp:

Classes

struct  OutHist
 

Functions

void DoubletsFilterOut (EdbPattern &p, EdbMosaicIO &omio)
 
void DrawEllipse (const EdbPattern &ptag, int col, float tsize)
 
void DrawOut (const EdbPattern &ptag, EdbMosaicIO &omio)
 
void FindPeaks (EdbH2 &h2p, EdbPattern &ptag, int npmax, float minVol)
 
void Link (EdbID id, EdbPattern &p1, EdbPattern &p2, EdbPattern &p0)
 
int main (int argc, char *argv[])
 
void Pat2H2 (const EdbPattern &p, EdbH2 &h2p, float thetaMin, float thetaMax, float bin)
 
void print_help_message ()
 
void set_default (TEnv &cenv)
 
void TagSide (EdbID id, EdbPattern &pat, int from, int nfrag, int side, TEnv &cenv, EdbMosaicIO &mio, EdbMosaicIO &omio)
 

Variables

bool do_save_canvas =false
 
bool do_save_gif =false
 
OutHist gOH = {0,0,0,0,0,0}
 
int nPatMin =0
 

Function Documentation

◆ DoubletsFilterOut()

void DoubletsFilterOut ( EdbPattern p,
EdbMosaicIO omio 
)
286 {
287  int checkview =1;
288  int fillhist =1;
289  float dr =1;
290  float dt =0.008;
291  TH2F *hxy=0, *htxty=0;
292  if(fillhist) {
293  gOH.dblxy = new TH2F("dblXY" ,"Doublets DX DY" ,50,-dr,dr,50,-dr,dr);
294  gOH.dbltxty = new TH2F("dblTXTY","Doublets DTX DTY",50,-dt,dt,50,-dt,dt);
295  }
296  EdbAlignmentV adup;
297  adup.eDVsame[0]=adup.eDVsame[1]= dr;
298  adup.eDVsame[2]=adup.eDVsame[3]= dt;
299  adup.FillGuessCell(p,p,1.);
300  adup.FillCombinations();
301  adup.DoubletsFilterOut(checkview, gOH.dblxy, gOH.dbltxty); // assign flag -10 to the duplicated segments
302 
303  //omio.SaveFragmentObj( hxy, p.Plate(), p.Side(), p.ID(), "dblxy");
304  //omio.SaveFragmentObj( htxty, p.Plate(), p.Side(), p.ID(), "dbltxty");
305 
306  //if(eDoDumpDoubletsTree) DumpDoubletsTree(adup,"doublets");
307  //SafeDelete(hxy);
308  //SafeDelete(htxty);
309 }
Definition: EdbAlignmentV.h:13
Float_t eDVsame[4]
Definition: EdbAlignmentV.h:16
int DoubletsFilterOut(int checkview, TH2F *hxy=0, TH2F *htxty=0)
Definition: EdbAlignmentV.cxx:83
void FillGuessCell(EdbPattern &p1, EdbPattern &p2, float binOK=1., float offsetMax=2000.)
Definition: EdbAlignmentV.cxx:919
int FillCombinations()
Definition: EdbAlignmentV.cxx:234
OutHist gOH
Definition: mostag.cpp:42
TH2F * dblxy
Definition: mostag.cpp:35
TH2F * dbltxty
Definition: mostag.cpp:36
p
Definition: testBGReduction_AllMethods.C:8

◆ DrawEllipse()

void DrawEllipse ( const EdbPattern ptag,
int  col,
float  tsize 
)
356 {
357  int np = ptag.N();
358  TText t(0,0,"a");
359  for(int i=0; i<np; i++) {
360  EdbSegP *s = ptag.GetSegment(i);
361  TEllipse *el = new TEllipse( s->X(), s->Y(), 300,300);
362  el->SetFillStyle(0);
363  el->SetLineColor(col);
364  el->Draw();
365  t.SetTextColor(col);
366  t.SetTextSize(tsize);
367  t.DrawText(s->X(), s->Y()+300, Form("%d",i) );
368  }
369 }
TTree * t
Definition: check_shower.C:4
Definition: EdbSegP.h:18
Float_t X() const
Definition: EdbSegP.h:170
Float_t Y() const
Definition: EdbSegP.h:171
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
EdbSegP * s
Definition: tlg2pattern.C:32

◆ DrawOut()

void DrawOut ( const EdbPattern ptag,
EdbMosaicIO omio 
)
195 {
196  gROOT->SetBatch();
197  TCanvas *c = new TCanvas(Form("peaks%d_%d_%d",p.Plate(), p.Side(), p.ID() ),
198  Form("peaks%d_%d_%d",p.Plate(), p.Side(), p.ID() ),
199  1100,600);
200  c->Divide(2,1);
201  c->cd(1)->SetGrid();
202  gOH.xy->Draw("colz");
203  gStyle->SetOptStat("n");
204  DrawEllipse(p, kBlack, 0.02 );
205 
206  TVirtualPad *pad2 = c->cd(2);
207  pad2->Divide(1,2);
208  pad2->cd(1)->SetLogy();
209  gOH.spectrOriginal->Draw();
210  gOH.spectrSmooth->SetLineColor(2);
211  gOH.spectrSmooth->Draw("same");
212  gOH.spectrProc->SetLineColor(3);
213  gOH.spectrProc->Draw("same");
214 
215  TVirtualPad *pdb = pad2->cd(2);
216  pdb->Divide(2,1);
217  pdb->cd(1); gOH.dblxy->Draw("colz");
218  gStyle->SetOptStat("n");
219  pdb->cd(2); gOH.dbltxty->Draw("colz");
220  gStyle->SetOptStat("n");
221 
222  if(do_save_canvas) omio.SaveFragmentObj( c, p.Plate(), p.Side(), p.ID(), "peaks");
223  if(do_save_gif) c->Print( omio.FileName( p.Brick(), p.Plate(), p.Side(), p.ID(), "", ".gif").c_str() );
224  delete c;
225 }
std::string FileName(int brick, int plate, int major, int minor, const char *pref="", const char *suff="")
Definition: EdbMosaicIO.cxx:24
void SaveFragmentObj(TObject *ob, int plate, int side, int id, const char *pref)
Definition: EdbMosaicIO.cxx:46
bool do_save_canvas
Definition: mostag.cpp:45
bool do_save_gif
Definition: mostag.cpp:44
void DrawEllipse(const EdbPattern &ptag, int col, float tsize)
Definition: mostag.cpp:355
TH1F * spectrOriginal
Definition: mostag.cpp:37
TH1F * spectrSmooth
Definition: mostag.cpp:38
TH1F * spectrProc
Definition: mostag.cpp:39
TH2F * xy
Definition: mostag.cpp:40
new TCanvas()

◆ FindPeaks()

void FindPeaks ( EdbH2 h2p,
EdbPattern ptag,
int  npmax,
float  minVol 
)
336 {
337  EdbPeak2 pf(h2p);
338  pf.InitPeaks(npmax);
339  gOH.spectrOriginal = pf.DrawSpectrumN( Form("spO%d_%d_%d",ptag.Plate(), ptag.Side(), ptag.ID()),"original spectrum");
340  pf.Smooth();
341  gOH.xy = pf.DrawH2N( Form("xy%d_%d_%d",ptag.Plate(), ptag.Side(), ptag.ID()),Form("plate:%d side:%d id:%d microtracks xy plot",ptag.Plate(), ptag.Side(), ptag.ID()));
342  gOH.spectrSmooth = pf.DrawSpectrumN( Form("spS%d_%d_%d",ptag.Plate(), ptag.Side(), ptag.ID()),"smoothed spectrum");
343 
344  int ir[2] = {2,2};
345  pf.ProbPeaks(npmax, ir);
346  //pf.Print();
347  for(int i=0; i<npmax; i++)
348  {
349  //printf( "peaks: %d %f %f \n",i, pf.ePeak[i], pf.eMean3[i] );
350  if( pf.ePeak[i] > minVol ) ptag.AddSegment( i, pf.eXpeak[i], pf.eYpeak[i],0,0, pf.ePeak[i] );
351  }
352  gOH.spectrProc = pf.DrawSpectrumN( Form("spP%d_%d_%d",ptag.Plate(), ptag.Side(), ptag.ID()),"processed spectrum");
353 }
int ID() const
Definition: EdbPattern.h:328
Int_t Side() const
Definition: EdbPattern.h:342
Int_t Plate() const
Definition: EdbPattern.h:340
Definition: EdbCell2.h:104
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:71

◆ Link()

void Link ( EdbID  id,
EdbPattern p1,
EdbPattern p2,
EdbPattern p0 
)
167 {
170  sproc.eProcDirClient="..";
172  EdbPlateP *plate = ss->GetPlate(id.ePlate);
173  plate->ResetCorr();
174  p1.SetZ( plate->GetLayer(1)->Z());
175  p2.SetZ( plate->GetLayer(2)->Z());
176  p1.SetSegmentsZ();
177  p2.SetSegmentsZ();
178 
179  TEnv cenv;
180  cenv.SetValue("fedra.link.Sigma0", "100 100 0.1 0.1");
181  cenv.SetValue("fedra.link.shr.ThetaLimits", "0. 1.");
182  cenv.SetValue("fedra.link.DoCorrectAngles", 0);
183  cenv.SetValue("fedra.link.DoCorrectShrinkage", 0);
184 
186  link.InitOutputFile( Form("p%3.3d/%d.%d.%d.%d.%d.tag.cp.root",
187  id.ePlate, id.eBrick, id.ePlate, id.eMajor, id.eMinor, 0) );
188  link.Link( p1, p2, *(plate->GetLayer(2)), *(plate->GetLayer(1)), cenv );
189  link.GetFillPattern(p0);
190  link.CloseOutputFile();
191 }
Definition: EdbID.h:7
Int_t ePlate
Definition: EdbID.h:11
Definition: EdbLinking.h:11
Definition: EdbBrick.h:13
Definition: EdbScanProc.h:12
TString eProcDirClient
Definition: EdbScanProc.h:14
EdbScanSet * ReadScanSet(EdbID id)
Definition: EdbScanProc.cxx:1521
Definition: EdbScanSet.h:11
void SetZ(float z)
Definition: EdbPattern.h:41
void SetSegmentsZ()
Definition: EdbPattern.cxx:275
EdbScanProc * sproc
Definition: comptonmap.cpp:29
TEnv cenv("emrec")
EdbID idset
Definition: emrec.cpp:35
ss
Definition: energy.C:62
Int_t plate
Definition: merge_Energy_SytematicSources_Electron.C:1
UInt_t id
Definition: tlg2pattern.C:118

◆ main()

int main ( int  argc,
char *  argv[] 
)
85 {
86  if (argc < 2) { print_help_message(); return 0; }
87 
88  TEnv cenv("mostagenv");
89  gEDBDEBUGLEVEL = cenv.GetValue("mostag.EdbDebugLevel" , 1);
90  const char *env = cenv.GetValue("mostag.env" , "mostag.rootrc");
91  const char *outdir = cenv.GetValue("mostag.outdir" , "..");
92 
93  bool do_single = false;
94  bool do_set = false;
95  EdbID id;
96  int from_fragment=0;
97  int n_fragments=0;
98 
99  for(int i=1; i<argc; i++ ) {
100  char *key = argv[i];
101 
102  if(!strncmp(key,"-set=",5))
103  {
104  if(strlen(key)>5) if(id.Set(key+5)) do_set=true;
105  }
106  else if(!strncmp(key,"-id=",4))
107  {
108  if(strlen(key)>4) if(id.Set(key+4)) do_single=true;
109  }
110  else if(!strncmp(key,"-from=",6))
111  {
112  if(strlen(key)>6) from_fragment = atoi(key+6);
113  }
114  else if(!strncmp(key,"-nfrag=",7))
115  {
116  if(strlen(key)>7) n_fragments = atoi(key+7);
117  }
118  else if(!strncmp(key,"-v=",3))
119  {
120  if(strlen(key)>3) gEDBDEBUGLEVEL = atoi(key+3);
121  }
122  }
123 
124  if(!(do_single||do_set)) { print_help_message(); return 0; }
125  if( do_single&&do_set ) { print_help_message(); return 0; }
126 
127  set_default(cenv);
128  cenv.SetValue("mostag.env" , env);
129  cenv.ReadFile( cenv.GetValue("mostag.env" , "mostag.rootrc") ,kEnvLocal);
130  cenv.SetValue("mostag.outdir" , outdir);
131 
133  sproc.eProcDirClient = cenv.GetValue("mostag.outdir","..");
134  cenv.WriteFile("mostag.save.rootrc");
135  do_save_gif = cenv.GetValue("fedra.tag.save_gif" , false );
136  do_save_canvas = cenv.GetValue("fedra.tag.save_canvas" , false );
137  nPatMin = cenv.GetValue("fedra.tag.nPatMin" , 1000 );
138 
139  printf("\n----------------------------------------------------------------------------\n");
140  printf("mostag %s\n" ,id.AsString() );
141  printf( "----------------------------------------------------------------------------\n\n");
142 
143 
144  if(do_single)
145  {
146  EdbMosaicIO mio; //input
147  EdbMosaicIO omio; //output
148  mio.Init( Form("p%3.3d/%d.%d.%d.%d.mos.root",
149  id.ePlate, id.eBrick, id.ePlate, id.eMajor, id.eMinor) );
150  omio.Init( Form("p%3.3d/%d.%d.%d.%d.tag.root",
151  id.ePlate, id.eBrick, id.ePlate, id.eMajor, id.eMinor),"RECREATE");
152  EdbPattern pat0,pat1,pat2;
153  TagSide(id, pat1, from_fragment, n_fragments, 1, cenv, mio,omio);
154  TagSide(id, pat2, from_fragment, n_fragments, 2, cenv, mio,omio);
155  Link(id, pat1, pat2, pat0);
156  omio.SaveFragmentObj( &pat1, id.ePlate, 1, 0, "gpat");
157  omio.SaveFragmentObj( &pat2, id.ePlate, 2, 0, "gpat");
158  omio.SaveFragmentObj( &pat0, id.ePlate, 0, 0, "gpat");
159  Log(1,"mostag","save %d + %d => %d to %s",pat1.N(), pat2.N(), pat0.N(), omio.GetFileName() );
160  }
161 
162  cenv.WriteFile("mostag.save.rootrc");
163  return 1;
164 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
Definition: EdbMosaicIO.h:15
void Init(const char *file, Option_t *option="")
Definition: EdbMosaicIO.cxx:16
const char * GetFileName() const
Definition: EdbMosaicIO.h:36
Definition: EdbPattern.h:280
bool do_set
Definition: emrec.cpp:36
const char * outdir
Definition: emrec.cpp:37
gEDBDEBUGLEVEL
Definition: energy.C:7
int n_fragments
Definition: mosalignbeam.cpp:96
int from_fragment
Definition: mosalignbeam.cpp:95
void set_default(TEnv &cenv)
Definition: mostag.cpp:65
void TagSide(EdbID id, EdbPattern &pat, int from, int nfrag, int side, TEnv &cenv, EdbMosaicIO &mio, EdbMosaicIO &omio)
Definition: mostag.cpp:227
void print_help_message()
Definition: mostag.cpp:48
void Link(EdbID id, EdbPattern &p1, EdbPattern &p2, EdbPattern &p0)
Definition: mostag.cpp:166
int nPatMin
Definition: mostag.cpp:46

◆ Pat2H2()

void Pat2H2 ( const EdbPattern p,
EdbH2 h2p,
float  thetaMin,
float  thetaMax,
float  bin 
)
312 {
313  float xbin=bin, ybin=bin;
314  float minx = p.Xmin();
315  float maxx = p.Xmax();
316  float miny = p.Ymin();
317  float maxy = p.Ymax();
318  int nx = (maxx-minx)/xbin;
319  int ny = (maxy-miny)/ybin;
320 
321  h2p.InitH2(nx, minx, maxx, ny, miny, maxy);
322 
323  int n= p.N();
324  for(int i=0; i<n; i++)
325  {
326  EdbSegP *s = p.GetSegment(i);
327  if(s->Flag()>=0) {
328  float t = Sqrt( s->TX()*s->TX() + s->TY()*s->TY() );
329  if( t>=thetaMin && t<=thetaMax )
330  h2p.Fill( s->X(),s->Y() );
331  }
332  }
333 }
int InitH2(const EdbH2 &h)
Definition: EdbCell2.cpp:79
int Fill(float x, float y)
Definition: EdbCell2.h:88
Float_t TX() const
Definition: EdbSegP.h:172
Float_t TY() const
Definition: EdbSegP.h:173
Int_t Flag() const
Definition: EdbSegP.h:146
int nx
Definition: emthickness.cpp:60
float bin
Definition: emthickness.cpp:98
float xbin
Definition: emthickness.cpp:61
int ny
Definition: emthickness.cpp:62
float ybin
Definition: emthickness.cpp:63

◆ print_help_message()

void print_help_message ( )
49 {
50  cout<< "\nUsage: \n";
51  cout<< "\t mostag -id=ID [-from=frag0 -nfrag=N -v=DEBUG] \n";
52 
53  cout<< "\t\t ID - id of the raw.root file formed as BRICK.PLATE.MAJOR.MINOR \n";
54  cout<< "\t\t frag0 - the first fragment (default: 0) \n";
55  cout<< "\t\t N - number of fragments to be processed (default: upto 1000000, stop at first empty) \n";
56 
57  cout<< "\n If the data location directory if not explicitly defined\n";
58  cout<< " the current directory will be assumed to be the brick directory \n";
59  cout<< "\n If the parameters file (mostag.rootrc) is not presented - the default \n";
60  cout<< " parameters will be used. After the execution them are saved into mostag.save.rootrc file\n";
61  cout<<endl;
62 }

◆ set_default()

void set_default ( TEnv &  cenv)
66 {
67  // default parameters for showers tagging
68  cenv.SetValue("fedra.tag.save_gif" , false ); // save gif with plots
69  cenv.SetValue("fedra.tag.save_canvas" , false ); // save canvas objects into root file
70 
71  cenv.SetValue("fedra.tag.NPeaksMax" , 40); // max number of peaks/fragment
72  cenv.SetValue("fedra.tag.MinPeakVolume" , 50.); // depends on the bin size
73  cenv.SetValue("fedra.tag.ThetaLimits" , "0. 1."); // use for tagging tracks in this limits
74  cenv.SetValue("fedra.tag.Bin" , 100 ); // bin size
75  cenv.SetValue("fedra.tag.RemoveDoublets" , "1 2. .01 1"); // yes/no dr dt checkview(0,1,2)
76  cenv.SetValue("fedra.tag.DumpDoubletsTree" , false );
77  cenv.SetValue("fedra.tag.nPatMin" , 1000 ); // min fragment to run tagging
78 
79  cenv.SetValue("mostag.outdir" , "..");
80  cenv.SetValue("mostag.env" , "mostag.rootrc");
81  cenv.SetValue("mostag.EdbDebugLevel" , 1);
82 }

◆ TagSide()

void TagSide ( EdbID  id,
EdbPattern pat,
int  from,
int  nfrag,
int  side,
TEnv &  cenv,
EdbMosaicIO mio,
EdbMosaicIO omio 
)
228 {
229  float minVol = cenv.GetValue("fedra.tag.MinPeakVolume", 50.);
230  int npmax = cenv.GetValue("fedra.tag.NPeaksMax", 40);
231  float bin = cenv.GetValue("fedra.tag.Bin" , 100);
232  float thetaMin=0, thetaMax=1;
233  const char *str = cenv.GetValue("fedra.tag.ThetaLimits" , "0.02 0.5");
234  if(str) sscanf(str,"%f %f", &thetaMin,&thetaMax);
235  Log(1,"TagSide","%d %d with bin= %.1f theta: (%.3f %.3f) npmax=%d minVol=%.1f",
236  nfrag, side, bin, thetaMin,thetaMax, npmax,minVol);
237 
239  sproc.eProcDirClient="..";
240 
241  EdbID id0=id; id0.ePlate=0;
242  EdbScanSet *ss = sproc.ReadScanSet(id0);
243  EdbPlateP *plate = ss->GetPlate(id.ePlate);
244 
245  EdbLayer *mapside = mio.GetCorrMap( id.ePlate, side );
246  int nc=mapside->Map().Ncell();
247  if(from==0&&nfrag==0) nfrag=nc;
248 
249  for( int i=from; i<from+nfrag; i++ )
250  {
251  printf("i=%d\n",i);
252  EdbPattern *p = mio.GetFragment( id.ePlate, side, i, true); // (plate,side,id)
253  printf("n= %d\n",p->N());
254  if(p) if(p->N()>nPatMin)
255  {
256  p->SetScanID(id);
257  DoubletsFilterOut(*p, omio);
258 
259  EdbH2 h2p;
260  Pat2H2(*p, h2p, thetaMin,thetaMax,bin);
261  //printf("Integral = %d \n",h2p.Integral());
262  //gOH.xy = h2p.DrawH2("h","original mt");
263  //omio.SaveFragmentObj( gOH.xy, p->Plate(), p->Side(), p->ID(), "hxy");
264 
265  EdbPattern ptag; ptag.SetScanID(id); ptag.SetSide(side); ptag.SetID(i);
266 
267  FindPeaks(h2p,ptag, npmax, minVol);
268 
269  pat.AddPattern(ptag);
270  Log(1,"TagSide","%d add fragment %d with %d peaks => %d", side, i, ptag.N(), pat.N() );
271 
272  gOH.xy->SetTitle(Form("%s theta:[%.3f,%.3f] bin=%.0f",gOH.xy->GetTitle(),thetaMin,thetaMax,bin));
273  DrawOut(ptag,omio);
274  SafeDelete(gOH.xy);
275  SafeDelete(gOH.spectrOriginal);
276  SafeDelete(gOH.spectrSmooth);
277  SafeDelete(gOH.spectrProc);
278  SafeDelete(gOH.dblxy);
279  SafeDelete(gOH.dbltxty);
280  }
281  if(p) delete p;
282  }
283 }
Definition: EdbCell2.h:19
int Ncell() const
Definition: EdbCell2.h:49
Definition: EdbLayer.h:40
EdbCorrectionMap & Map()
Definition: EdbLayer.h:73
EdbPattern * GetFragment(int plate, int side, int id, bool do_corr)
Definition: EdbMosaicIO.cxx:66
EdbLayer * GetCorrMap(int plate, int side)
Definition: EdbMosaicIO.cxx:121
void SetSide(int side)
Definition: EdbPattern.h:321
void SetID(int id)
Definition: EdbPattern.h:318
Int_t AddPattern(EdbPattern &p)
Definition: EdbPattern.cxx:1563
void SetScanID(EdbID id)
Definition: EdbPattern.h:303
void FindPeaks(EdbH2 &h2p, EdbPattern &ptag, int npmax, float minVol)
Definition: mostag.cpp:335
void DrawOut(const EdbPattern &ptag, EdbMosaicIO &omio)
Definition: mostag.cpp:194
void Pat2H2(const EdbPattern &p, EdbH2 &h2p, float thetaMin, float thetaMax, float bin)
Definition: mostag.cpp:311
void DoubletsFilterOut(EdbPattern &p, EdbMosaicIO &omio)
Definition: mostag.cpp:285

Variable Documentation

◆ do_save_canvas

bool do_save_canvas =false

◆ do_save_gif

bool do_save_gif =false

◆ gOH

OutHist gOH = {0,0,0,0,0,0}

◆ nPatMin

int nPatMin =0