16 #include<TApplication.h> 
   22 #include<TClonesArray.h> 
   33 #include<TStopwatch.h> 
   48 #include<FairRunAna.h> 
   49 #include<FairRootManager.h> 
   51 #include<FairRtdbRun.h> 
   52 #include<FairRuntimeDb.h> 
   53 #include<FairParRootFileIo.h> 
   54 #include<FairLogger.h> 
   55 #include<FairTrackParH.h> 
   62 int main(
int __argc,
char *__argv[]) {
 
   72   std::string startStr=
"", momStr=
"", nStr=
"", pathStr=
"", verbStr=
"", outnStr=
"", outrootStr=
"",sectorStr=
"";
 
   74   if( __argc>1 && ( strcmp( __argv[1], 
"-help" ) == 0
 
   75                     || strcmp( __argv[1], 
"--help" ) == 0 ) ){
 
   77     std::cout << 
"This is script for alignment data creation with pixel sensors design \n" 
   78               << 
"with parameters\n" 
   80               <<
"-n Number of events \n" 
   81               <<
"-path path to the file(s) \n" 
   82               <<
"-out name for output file \n" 
   83               <<
"-outhist name for output file with residuals histogram \n" 
   84               <<
"-v verbose Level (if>0, print out some information) \n" 
   90   while ((optind < (__argc-1) ) && (__argv[optind][0]==
'-')) {
 
   92     std::string sw = __argv[optind];
 
   95       startStr = __argv[optind];
 
  100       sectorStr = __argv[optind];
 
  105       nStr = __argv[optind];
 
  110       pathStr = __argv[optind];
 
  115       momStr = __argv[optind];
 
  120       verbStr = __argv[optind];
 
  125       outnStr= __argv[optind];
 
  130       outrootStr= __argv[optind];
 
  134       std::cout<< 
"Unknown switch: " 
  135                << __argv[optind] <<std::endl;
 
  139   while ( (optind < __argc ) && __argv[optind][0]!=
'-' ) optind++;
 
  142   std::stringstream startSStr(startStr), nSStr(nStr), pathSStr(pathStr), verbSStr(verbStr),sectorSStr(sectorStr);
 
  148   sectorSStr>> sectorPos;
 
  149   cout<<
"For data files will be used path: "<<storePath<<endl;
 
  152   output.open(outnStr.c_str());
 
  153   TFile *
f = 
new TFile(outrootStr.c_str(),
"RECREATE");
 
  155   gROOT->Macro(
"$VMCWORKDIR/gconfig/rootlogon.C");
 
  156   gSystem->Load(
"libLmdTrk");
 
  169   TChain tdigiHits(
"pndsim");
 
  170   tdigiHits.Add(DigiFile);
 
  172   TString recHit=storePath+
"/Lumi_reco_";
 
  175   TChain tHits(
"pndsim");
 
  178   TString recHitmerged=storePath+
"/Lumi_recoMerged_";
 
  180   recHitmerged += 
".root";
 
  181   TChain tHitsMerged(
"pndsim");
 
  182   tHitsMerged.Add(recHitmerged);
 
  191   TString trkCand = storePath+
"/Lumi_TCand_";
 
  194   TChain tTrkCand(
"pndsim");
 
  195   tTrkCand.Add(trkCand);
 
  197   TString recTrack = storePath+
"/Lumi_Track_"; 
 
  201   TChain tTrkRec(
"pndsim");
 
  202   tTrkRec.Add(recTrack);
 
  204   TString simMC=storePath+
"/Lumi_MC_";
 
  207   TChain tMC(
"pndsim");
 
  213   TClonesArray* fStripClusterArray;
 
  214   fStripClusterArray = 
new TClonesArray(
"PndSdsClusterPixel");
 
  215   tHits.SetBranchAddress(
"LMDPixelClusterCand",&fStripClusterArray);
 
  216   TClonesArray* fStripDigiArray;
 
  217   fStripDigiArray = 
new TClonesArray(
"PndSdsDigiPixel");
 
  218   tdigiHits.SetBranchAddress(
"LMDPixelDigis",&fStripDigiArray);
 
  222   TClonesArray* rechit_array=
new TClonesArray(
"PndSdsMergedHit");
 
  223   tHitsMerged.SetBranchAddress(
"LMDHitsMerged",&rechit_array);  
 
  229   TClonesArray* trkcand_array=
new TClonesArray(
"PndTrackCand");
 
  230   tTrkCand.SetBranchAddress(
"LMDTrackCand",&trkcand_array); 
 
  236   TClonesArray* rec_trk=
new TClonesArray(
"PndTrack");
 
  237   tTrkRec.SetBranchAddress(
"LMDPndTrack",&rec_trk);  
 
  241   TClonesArray* true_tracks=
new TClonesArray(
"PndMCTrack");
 
  242   tMC.SetBranchAddress(
"MCTrack",&true_tracks);  
 
  244   TClonesArray* true_points=
new TClonesArray(
"PndSdsMCPoint");
 
  245   tMC.SetBranchAddress(
"LMDPoint",&true_points);  
 
  250  TObjArray *m_res_x = 
new TObjArray;
 
  251  TObjArray *m_res_y = 
new TObjArray;
 
  252  TObjArray *m_res_r = 
new TObjArray;
 
  254  TObjArray *m_res_mc_x = 
new TObjArray;
 
  255  TObjArray *m_res_mc_y = 
new TObjArray;
 
  256  TObjArray *m_res_mc_z = 
new TObjArray;
 
  258  double misal_scales[3];
 
  259  const double scaleX = 0.05;
 
  260  const double scaleY = 0.05;
 
  261  const double scaleR = 0.05;
 
  266   (scaleX == 0) ? misal_scales[0] = 1. : misal_scales[0] = 1.*scaleX;
 
  267   (scaleY == 0) ? misal_scales[1] = 1. : misal_scales[1] = 1.*scaleY;
 
  268   (scaleR == 0) ? misal_scales[2] = 1. : misal_scales[2] = 1.*scaleR;
 
  273   TH2F *resx = 
new TH2F(
"resx",
"residuals vs. x; x, cm;#delta_{x}, cm",100,0,45,100,-5.0e-2,5.0e-2);
 
  274   TH2F *resy = 
new TH2F(
"resy",
"residuals vs. y; y, cm;#delta_{y}, cm",100,-15,15,100,-5.0e-2,5.0e-2);
 
  276   TH2F *x_id = 
new TH2F(
"x_id",
"x vs. sensor id; id ;x, cm",400,0,400,1e3,0,45);
 
  277   TH2F *y_id = 
new TH2F(
"y_id",
"y vs. sensor id; id ;y, cm",400,0,400,1e3,-15,15);
 
  278   TH2F *z_id = 
new TH2F(
"z_id",
"z vs. sensor id; id ;z, cm",400,0,400,1e3,-10,60);
 
  279   TNtuple *
nhits = 
new TNtuple(
"nhits",
"hitsInfo",
"xrec:yrec:zrec:errxrec:erryrec:errzrec:xmc:ymc:zmc:half:plane:module:side");
 
  284   TH2F *resxy = 
new TH2F(
"resxy",
"residuals y vs. residuals x; #delta_{x}, cm; #delta_{y}, cm",5000,-2.5e-1,2.5e-1,5000,-2.5e-1,2.5e-1);
 
  285   TH1I *htrks = 
new TH1I(
"trks",
"number of trks/ev",2e1,0,2e1);
 
  329     TString mtx_corr =  storePath+
"/matrices_corrected.txt";
 
  330     TString mtx_perfect = storePath+
"/trafo_matrices_lmd.dat";
 
  332     lmddim -> Read_transformation_matrices(mtx_perfect.Data(), 
false);
 
  333     lmddim -> Read_transformation_matrices(mtx_corr.Data(), 
true);
 
  337     cout<<
"In total there are "<<nEvents<<
" events"<<endl;
 
  339   for (Int_t j=0; j<
nEvents; j++){
 
  341     tTrkCand.GetEntry(j);
 
  344     tHitsMerged.GetEntry(j);
 
  345     tdigiHits.GetEntry(j);
 
  349     const int nRecTrks = rec_trk->GetEntriesFast();
 
  350     icounterALL +=nRecTrks;
 
  353     for (Int_t iN=0; iN<nRecTrks; iN++){
 
  360       TVector3 startlintrk(fFittedTrkP.GetX(),fFittedTrkP.GetY(),fFittedTrkP.GetZ());
 
  361       TVector3 dirlintrk(fFittedTrkP.GetPx(),fFittedTrkP.GetPy(),fFittedTrkP.GetPz());
 
  366       dirlintrk *= 1./dirlintrk.Mag();
 
  370       const int Ntrkcandhits= trkcand->
GetNHits();
 
  372       if(Ntrkcandhits<4) 
continue; 
 
  378       int trkModules[Ntrkcandhits];
 
  379       int trkHalfs[Ntrkcandhits];
 
  382       for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){
 
  387         int ihalf, iplane, imodule, iside, idie, isensor;
 
  389         lmddim->
Get_sensor_by_id(sensorID, ihalf, iplane, imodule, iside, idie, isensor);
 
  390         trkModules[iHit]=ihalf*5+imodule;
 
  391         trkHalfs[iHit]=ihalf;
 
  393         module1=ihalf*5+imodule;
 
  395       bool flagSector = 
true;
 
  397         for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){
 
  398           if(trkModules[iHit]!=sectorPos) flagSector=
false;
 
  402         for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){
 
  403           if(trkHalfs[iHit]!=half1) flagSector=
false;
 
  404           if(trkModules[iHit]!=module1) flagSector=
false;
 
  409       if(!flagSector) 
continue;
 
  411       if(iN==0) htrks->Fill(nRecTrks);
 
  412         for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){
 
  418           int ihalf, iplane, imodule, iside, idie, isensor;
 
  420           lmddim->
Get_sensor_by_id(sensorID, ihalf, iplane, imodule, iside, idie, isensor);
 
  427           TVector3 mcTop,mcTopOUT;
 
  443           TVector3 mcMid = mcTop+(mcTopOUT-mcTop)*0.5;
 
  450           double trkX = startlintrk.X()+dirlintrk.X()*(HitPos.Z()-startlintrk.Z());
 
  451           double trkY = startlintrk.Y()+dirlintrk.Y()*(HitPos.Z()-startlintrk.Z());
 
  452           double trkR = 
sqrt(trkX*trkX+trkY*trkY);
 
  453           double hitR = 
sqrt(HitPos.X()*HitPos.X()+HitPos.Y()*HitPos.Y());
 
  458           double resx_d = HitPos.X()-trkX;
 
  459           double resy_d = HitPos.Y()-trkY;
 
  460           resx->Fill(HitPos.X(),resx_d);
 
  461           resy->Fill(HitPos.Y(),resy_d);
 
  462           resxy->Fill(resx_d,resy_d);
 
  466           x_id->Fill(sensorID,HitPos.X());
 
  467           y_id->Fill(sensorID,HitPos.Y());
 
  468           z_id->Fill(sensorID,HitPos.Z());
 
  472           int glModule = iplane;
 
  473           if(sectorPos>10) glModule = ihalf*4*5+(iplane)*5+imodule;
 
  489           nhits->Fill(HitPosLoc.X(),HitPosLoc.Y(),HitPosLoc.Z(),
sqrt(HitErrLoc(0,0)),
sqrt(HitErrLoc(1,1)),
sqrt(HitErrLoc(2,2)),MCHitPosLoc.X(),MCHitPosLoc.Y(),MCHitPosLoc.Z(),ihalf,iplane,imodule,iside);
 
  490           TVector3 ResRecMC = HitPosLoc - MCHitPosLoc;
 
  496           if((Ntrkcandhits-iHit)>1) endtrk=0;
 
  497           if(flagSector && output>0){
 
  498             output<<HitPosLoc.X()<<
" "<<
sqrt(HitErrLoc(0,0))<<
" ";
 
  499             output<<HitPosLoc.Y()<<
" "<<
sqrt(HitErrLoc(1,1))<<
" ";
 
  501             output<<HitPosLoc.Z()<<
" "<<sectorPos<<
" "; 
 
  502             output<<glModule<<
" "<<endtrk<<endl;
 
  510   cout<<
"This module has "<<icounter<<
" trks from "<<icounterALL<<endl;
 
int main(int argc, char **argv)
TVector3 GetPosition() const 
friend F32vec4 sqrt(const F32vec4 &a)
Int_t GetIndex(int i=0) const 
static PndLmdDim * Instance()
PndTrackCandHit GetSortedHit(UInt_t i)
TVector3 Transform_global_to_lmd_local(const TVector3 &point, bool isvector=false, bool aligned=true)
TVector3 GetPositionOut() const 
FairParRootFileIo * output
Int_t GetDigiIndex(Int_t i) const 
void Get_sensor_by_id(const int sensor_id, int &ihalf, int &iplane, int &imodule, int &iside, int &idie, int &isensor)
TVector3 Transform_lmd_local_to_module_side(const TVector3 &point, int ihalf, int iplane, int imodule, int iside, bool isvector=false, bool aligned=true)
TVector3 GetPosition() const 
Data class to store the digi output of a pixel module. 
Int_t GetClusterIndex() const 
Int_t GetRefIndex() const 
Int_t GetSensorID() const 
FairTrackParP GetParamFirst()
TMatrixT< double > TMatrixD