CMS 3D CMS Logo

FP420Test.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 
4 // system include files
5 #include <iostream>
6 #include <map>
7 #include <string>
8 //
9 // user include files
17 //
30 // to retreive hits
33 // G4 stuff
34 #include "G4HCofThisEvent.hh"
35 #include "G4ProcessManager.hh"
36 #include "G4SDManager.hh"
37 #include "G4Step.hh"
38 #include "G4Track.hh"
39 #include "G4TransportationManager.hh"
40 #include "G4UserEventAction.hh"
41 #include "G4VProcess.hh"
42 #include "G4VTouchable.hh"
43 
44 #include <CLHEP/Random/Randomize.h>
45 #include <CLHEP/Units/GlobalSystemOfUnits.h>
46 #include <CLHEP/Units/GlobalPhysicalConstants.h>
47 
48 //================================================================
49 // Root stuff
50 #include "TROOT.h"
51 #include "TFile.h"
52 #include "TH1.h"
53 #include "TH2.h"
54 #include "TProfile.h"
55 #include "TNtuple.h"
56 #include "TRandom.h"
57 #include "TLorentzVector.h"
58 #include "TUnixSystem.h"
59 #include "TSystem.h"
60 #include "TMath.h"
61 #include "TF1.h"
62 #include "TObjArray.h"
63 #include "TObjString.h"
64 #include "TNamed.h"
65 
66 class Fp420AnalysisHistManager : public TNamed {
67 public:
68  Fp420AnalysisHistManager(const TString& managername);
69  ~Fp420AnalysisHistManager() override;
70 
71  TH1F* getHisto(Int_t Number);
72  TH1F* getHisto(const TObjString& histname);
73 
74  TH2F* getHisto2(Int_t Number);
75  TH2F* getHisto2(const TObjString& histname);
76 
77  void writeToFile(const TString& fOutputFile, const TString& fRecreateFile);
78 
79 private:
80  void bookHistos();
81  void storeWeights();
82  void histInit(const char* name, const char* title, Int_t nbinsx, Axis_t xlow, Axis_t xup);
83  void histInit(
84  const char* name, const char* title, Int_t nbinsx, Axis_t xlow, Axis_t xup, Int_t nbinsy, Axis_t ylow, Axis_t yup);
85 
86  const char* fTypeTitle;
87  TObjArray* fHistArray;
88  TObjArray* fHistNamesArray;
89 };
90 
91 class FP420Test : public SimWatcher,
92  public Observer<const BeginOfJob*>,
93  public Observer<const BeginOfRun*>,
94  public Observer<const EndOfRun*>,
95  public Observer<const BeginOfEvent*>,
96  public Observer<const BeginOfTrack*>,
97  public Observer<const G4Step*>,
98  public Observer<const EndOfTrack*>,
99  public Observer<const EndOfEvent*> {
100 public:
101  FP420Test(const edm::ParameterSet& p);
102  ~FP420Test() override;
103 
104 private:
105  // observer classes
106  void update(const BeginOfJob* run) override;
107  void update(const BeginOfRun* run) override;
108  void update(const EndOfRun* run) override;
109  void update(const BeginOfEvent* evt) override;
110  void update(const BeginOfTrack* trk) override;
111  void update(const G4Step* step) override;
112  void update(const EndOfTrack* trk) override;
113  void update(const EndOfEvent* evt) override;
114 
115 private:
116  // Utilities to get detector levels during a step
117 
118  int detLevels(const G4VTouchable*) const;
119  G4String detName(const G4VTouchable*, int, int) const;
120  void detectorLevel(const G4VTouchable*, int&, int*, G4String*) const;
121 
122  //UHB_Analysis* UserNtuples;
123 
124  int iev;
125  int itrk;
126  G4double entot0, tracklength0;
127 
128  double rinCalo, zinCalo;
131 
132  // sumEnerDeposit - all deposited energy on all steps ; sumStepl - length in steel !!!
134  // numofpart - # particles produced along primary track
136  // last point of the primary track
137  G4ThreeVector lastpo;
138 
139  // z:
140  double z1, z2, z3, z4, zD2, zD3;
141  int sn0, dn0, pn0, rn0;
142  int rn00;
143  double zSiDet, z420;
145  double zBlade, gapBlade;
146 
147  Float_t fp420eventarray[1];
151 
152  Fp420AnalysisHistManager* theHistManager; //Histogram Manager of the analysis
153  std::string fDataLabel; // Data type label
154  std::string fOutputFile; // The output file name
155  std::string fRecreateFile; // Recreate the file flag, default="RECREATE"
156 };
157 
158 //================================================================
160 //================================================================
162  //constructor
163  edm::ParameterSet m_Anal = p.getParameter<edm::ParameterSet>("FP420Test");
164  verbosity = m_Anal.getParameter<int>("Verbosity");
165  //verbosity = 1;
166 
167  fDataLabel = m_Anal.getParameter<std::string>("FDataLabel");
168  fOutputFile = m_Anal.getParameter<std::string>("FOutputFile");
169  fRecreateFile = m_Anal.getParameter<std::string>("FRecreateFile");
170 
171  if (verbosity > 0) {
172  edm::LogVerbatim("FP420Test") << "============================================================================";
173  edm::LogVerbatim("FP420Test") << "FP420Testconstructor :: Initialized as observer";
174  }
175  // Initialization:
176 
177  pn0 = 6;
178  sn0 = 3;
179  rn00 = 7;
180 
181  z420 = 420000.0; // mm
182  zD2 = 4000.0; // mm
183  zD3 = 8000.0; // mm
184  //
185  zBlade = 5.00;
186  gapBlade = 1.6;
187  double gapSupplane = 1.6;
188  zSiPlane = 2 * zBlade + gapBlade + gapSupplane;
189 
190  double zKapton = 0.1;
191  zSiStep = zSiPlane + zKapton;
192 
193  double zBoundDet = 0.020;
194  double zSiElectr = 0.250;
195  double zCeramDet = 0.500;
196  //
197  zSiDet = 0.250;
198  zGapLDet = zBlade / 2 - (zSiDet + zSiElectr + zBoundDet + zCeramDet / 2);
199  //
200  // zSiStation = 5*(2*(5.+1.6)+0.1)+2*6.+1.0 = 79.5
201  double zSiStation = (pn0 - 1) * (2 * (zBlade + gapBlade) + zKapton) + 2 * 6. + 0.0; // = 78.5
202  // 11.=e1, 12.=e2 in zzzrectangle.xml
203  double eee1 = 11.;
204  double eee2 = 12.;
205 
206  zinibeg = (eee1 - eee2) / 2.;
207 
208  z1 = zinibeg + (zSiStation + 10.) / 2 + z420; // z1 - right after 1st Station
209  z2 = z1 + zD2; //z2 - right after middle Station
210  z3 = z1 + zD3; //z3 - right after last Station
211  z4 = z1 + 2 * zD3;
212  //==================================
213 
214  fp420eventntuple = new TNtuple("NTfp420event", "NTfp420event", "evt");
215 
216  whichevent = 0;
217 
218  // fDataLabel = "defaultData";
219  // fOutputFile = "TheAnlysis.root";
220  // fRecreateFile = "RECREATE";
221 
223 
224  if (verbosity > 0) {
225  edm::LogVerbatim("FP420Test") << "FP420Test constructor :: Initialized Fp420AnalysisHistManager";
226  }
227 }
228 
230  // delete UserNtuples;
231 
232  TFile fp420OutputFile("newntfp420.root", "RECREATE");
233  edm::LogVerbatim("FP420Test") << "FP420 output root file has been created";
234  fp420eventntuple->Write();
235  edm::LogVerbatim("FP420Test") << "FP420 output root file has been written";
236  fp420OutputFile.Close();
237  edm::LogVerbatim("FP420Test") << "FP420 output root file has been closed";
238  delete fp420eventntuple;
239  edm::LogVerbatim("FP420Test") << "FP420 output root file pointer has been deleted";
240 
241  //------->while end
242 
243  // Write histograms to file
245  if (verbosity > 0) {
246  edm::LogVerbatim("FP420Test") << std::endl << "FP420Test Destructor --------> End of FP420Test : ";
247  }
248 }
249 
250 //================================================================
251 // Histoes:
252 //-----------------------------------------------------------------------------
253 
255  // The Constructor
256 
257  fTypeTitle = managername;
258  fHistArray = new TObjArray(); // Array to store histos
259  fHistNamesArray = new TObjArray(); // Array to store histos's names
260 
261  TH1::AddDirectory(kFALSE);
262  bookHistos();
263 
264  fHistArray->Compress(); // Removes empty space
265  fHistNamesArray->Compress();
266 
267  // storeWeights(); // Store the weights
268 }
269 //-----------------------------------------------------------------------------
270 
272  // The Destructor
273 
274  if (fHistArray) {
275  fHistArray->Delete();
276  delete fHistArray;
277  }
278 
279  if (fHistNamesArray) {
280  fHistNamesArray->Delete();
281  delete fHistNamesArray;
282  }
283 }
284 //-----------------------------------------------------------------------------
285 
287  // at Start: (mm)
288  histInit("PrimaryEta", "Primary Eta", 100, 9., 12.);
289  histInit("PrimaryPhigrad", "Primary Phigrad", 100, 0., 360.);
290  histInit("PrimaryTh", "Primary Th", 100, 0., 180.);
291  histInit("PrimaryLastpoZ", "Primary Lastpo Z", 100, -200., 430000.);
292  histInit("PrimaryLastpoX", "Primary Lastpo X Z<z4", 100, -30., 30.);
293  histInit("PrimaryLastpoY", "Primary Lastpo Y Z<z4", 100, -30., 30.);
294  histInit("XLastpoNumofpart", "Primary Lastpo X n>10", 100, -30., 30.);
295  histInit("YLastpoNumofpart", "Primary Lastpo Y n>10", 100, -30., 30.);
296  histInit("VtxX", "Vtx X", 100, -50., 50.);
297  histInit("VtxY", "Vtx Y", 100, -50., 50.);
298  histInit("VtxZ", "Vtx Z", 100, -200., 430000.);
299  // Book the histograms and add them to the array
300  histInit("SumEDep", "This is sum Energy deposited", 100, -1, 199.);
301  histInit("TrackL", "This is TrackL", 100, 0., 12000.);
302  histInit("zHits", "z Hits all events", 100, 400000., 430000.);
303  histInit("zHitsnoMI", "z Hits no MI", 100, 400000., 430000.);
304  histInit("zHitsTrLoLe", "z Hits TrLength bigger 8300", 100, 400000., 430000.);
305  histInit("NumberOfHits", "NumberOfHits", 100, 0., 300.);
306 }
307 
308 //-----------------------------------------------------------------------------
309 
310 void Fp420AnalysisHistManager::writeToFile(const TString& fOutputFile, const TString& fRecreateFile) {
311  //Write to file = fOutputFile
312 
313  edm::LogVerbatim("FP420Test") << "================================================================";
314  edm::LogVerbatim("FP420Test") << " Write this Analysis to File " << fOutputFile;
315  edm::LogVerbatim("FP420Test") << "================================================================";
316 
317  TFile* file = new TFile(fOutputFile, fRecreateFile);
318 
319  fHistArray->Write();
320  file->Close();
321 }
322 //-----------------------------------------------------------------------------
323 
324 void Fp420AnalysisHistManager::histInit(const char* name, const char* title, Int_t nbinsx, Axis_t xlow, Axis_t xup) {
325  // Add histograms and histograms names to the array
326 
327  char* newtitle = new char[strlen(title) + strlen(fTypeTitle) + 5];
328  strcpy(newtitle, title);
329  strcat(newtitle, " (");
330  strcat(newtitle, fTypeTitle);
331  strcat(newtitle, ") ");
332  fHistArray->AddLast((new TH1F(name, newtitle, nbinsx, xlow, xup)));
333  fHistNamesArray->AddLast(new TObjString(name));
334 }
335 //-----------------------------------------------------------------------------
336 
338  const char* name, const char* title, Int_t nbinsx, Axis_t xlow, Axis_t xup, Int_t nbinsy, Axis_t ylow, Axis_t yup) {
339  // Add histograms and histograms names to the array
340 
341  char* newtitle = new char[strlen(title) + strlen(fTypeTitle) + 5];
342  strcpy(newtitle, title);
343  strcat(newtitle, " (");
344  strcat(newtitle, fTypeTitle);
345  strcat(newtitle, ") ");
346  fHistArray->AddLast((new TH2F(name, newtitle, nbinsx, xlow, xup, nbinsy, ylow, yup)));
347  fHistNamesArray->AddLast(new TObjString(name));
348 }
349 //-----------------------------------------------------------------------------
350 
352  // Get a histogram from the array with index = Number
353 
354  if (Number <= fHistArray->GetLast() && fHistArray->At(Number) != (TObject*)nullptr) {
355  return (TH1F*)(fHistArray->At(Number));
356 
357  } else {
358  edm::LogVerbatim("FP420Test") << "!!!!!!!!!!!!!!!!!!getHisto!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
359  edm::LogVerbatim("FP420Test") << " WARNING ERROR - HIST ID INCORRECT (TOO HIGH) - " << Number;
360  edm::LogVerbatim("FP420Test") << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
361 
362  return (TH1F*)(fHistArray->At(0));
363  }
364 }
365 //-----------------------------------------------------------------------------
366 
368  // Get a histogram from the array with index = Number
369 
370  if (Number <= fHistArray->GetLast() && fHistArray->At(Number) != (TObject*)nullptr) {
371  return (TH2F*)(fHistArray->At(Number));
372 
373  } else {
374  edm::LogVerbatim("FP420Test") << "!!!!!!!!!!!!!!!!getHisto2!!!!!!!!!!!!!!!!!!!!!!!!!!!";
375  edm::LogVerbatim("FP420Test") << " WARNING ERROR - HIST ID INCORRECT (TOO HIGH) - " << Number;
376  edm::LogVerbatim("FP420Test") << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
377 
378  return (TH2F*)(fHistArray->At(0));
379  }
380 }
381 //-----------------------------------------------------------------------------
382 
383 TH1F* Fp420AnalysisHistManager::getHisto(const TObjString& histname) {
384  // Get a histogram from the array with name = histname
385 
386  Int_t index = fHistNamesArray->IndexOf(&histname);
387  return getHisto(index);
388 }
389 //-----------------------------------------------------------------------------
390 
391 TH2F* Fp420AnalysisHistManager::getHisto2(const TObjString& histname) {
392  // Get a histogram from the array with name = histname
393 
394  Int_t index = fHistNamesArray->IndexOf(&histname);
395  return getHisto2(index);
396 }
397 //-----------------------------------------------------------------------------
398 
400  // Add structure to each histogram to store the weights
401 
402  for (int i = 0; i < fHistArray->GetEntries(); i++) {
403  ((TH1F*)(fHistArray->At(i)))->Sumw2();
404  }
405 }
406 
407 // Histoes end :
408 
409 //================================================================
410 
411 // using several observers
412 
413 //==================================================================== per JOB
414 void FP420Test::update(const BeginOfJob* job) {
415  //job
416  edm::LogVerbatim("FP420Test") << "FP420Test:beggining of job";
417  ;
418 }
419 
420 //==================================================================== per RUN
422  //run
423 
424  edm::LogVerbatim("FP420Test") << std::endl << "FP420Test:: Begining of Run";
425 }
426 
427 void FP420Test::update(const EndOfRun* run) { ; }
428 
429 //=================================================================== per EVENT
430 void FP420Test::update(const BeginOfEvent* evt) {
431  iev = (*evt)()->GetEventID();
432  if (verbosity > 0) {
433  edm::LogVerbatim("FP420Test") << "FP420Test:update Event number = " << iev;
434  }
435  whichevent++;
436 }
437 
438 //=================================================================== per Track
439 void FP420Test::update(const BeginOfTrack* trk) {
440  itrk = (*trk)()->GetTrackID();
441  if (verbosity > 1) {
442  edm::LogVerbatim("FP420Test") << "FP420Test:update BeginOfTrack number = " << itrk;
443  }
444  if (itrk == 1) {
445  sumEnerDeposit = 0.;
446  numofpart = 0;
447  sumStepl = 0.;
448  sumStepc = 0.;
449  tracklength0 = 0.;
450  }
451 }
452 
453 //=================================================================== per EndOfTrack
454 void FP420Test::update(const EndOfTrack* trk) {
455  itrk = (*trk)()->GetTrackID();
456  if (verbosity > 1) {
457  edm::LogVerbatim("FP420Test") << "FP420Test:update EndOfTrack number = " << itrk;
458  }
459  if (itrk == 1) {
460  G4double tracklength = (*trk)()->GetTrackLength(); // Accumulated track length
461 
462  theHistManager->getHisto("SumEDep")->Fill(sumEnerDeposit);
463  theHistManager->getHisto("TrackL")->Fill(tracklength);
464 
465  // direction !!!
466  G4ThreeVector vert_mom = (*trk)()->GetVertexMomentumDirection();
467  G4ThreeVector vert_pos = (*trk)()->GetVertexPosition(); // vertex ,where this track was created
468 
469  // float eta = 0.5 * log( (1.+vert_mom.z()) / (1.-vert_mom.z()) );
470  // float phi = atan2(vert_mom.y(),vert_mom.x());
471  // if (phi < 0.) phi += twopi;
472  // float phigrad = phi*180./pi;
473 
474  // float XV = vert_pos.x(); // mm
475  // float YV = vert_pos.y(); // mm
476  //UserNtuples->fillg543(phigrad,1.);
477  //UserNtuples->fillp203(phigrad,sumStepl,1.);
478  //UserNtuples->fillg544(XV,1.);
479  //UserNtuples->fillp201(XV,sumStepl,1.);
480  //UserNtuples->fillg545(YV,1.);
481  //UserNtuples->fillp202(YV,sumStepl,1.);
482 
483  //UserNtuples->fillg524(eta,1.);
484 
485  //UserNtuples->fillg534(sumStepl,1.);
486  //UserNtuples->fillg535(eta,sumStepl);
487  //UserNtuples->fillp207(eta,sumStepl,1.);
488  //UserNtuples->filld217(eta,sumStepl,1.);
489  //UserNtuples->filld220(phigrad,sumStepl,1.);
490  //UserNtuples->filld221(XV,sumStepl,1.);
491  //UserNtuples->filld222(YV,sumStepl,1.);
492  //UserNtuples->fillg537(sumStepc,1.);
493  //UserNtuples->fillg84(sumStepl,1.);
494 
495  // MI = (multiple interactions):
496  if (tracklength < z4) {
497  // //UserNtuples->fillp208(eta,tracklength,1.);
498  //UserNtuples->filld218(eta,tracklength,1.);
499  //UserNtuples->fillg538(sumStepc,1.);
500  //UserNtuples->fillg85(sumStepl,1.);
501  }
502 
503  // last step information
504  const G4Step* aStep = (*trk)()->GetStep();
505  // G4int csn = (*trk)()->GetCurrentStepNumber();
506  // G4double sl = (*trk)()->GetStepLength();
507  // preStep
508  G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
509  lastpo = preStepPoint->GetPosition();
510 
511  // Analysis:
512  if (lastpo.z() < z1 && lastpo.perp() < 100.) {
513  //UserNtuples->fillg525(eta,1.);
514  //UserNtuples->fillg546(XV,1.);
515  //UserNtuples->fillg551(YV,1.);
516  //UserNtuples->fillg556(phigrad,1.);
517  }
518  if ((lastpo.z() > z1 && lastpo.z() < z2) && lastpo.perp() < 100.) {
519  //UserNtuples->fillg526(eta,1.);
520  //UserNtuples->fillg547(XV,1.);
521  //UserNtuples->fillg552(YV,1.);
522  //UserNtuples->fillg557(phigrad,1.);
523  }
524  if (lastpo.z() < z2 && lastpo.perp() < 100.) {
525  //UserNtuples->fillg527(eta,1.);
526  //UserNtuples->fillg548(XV,1.);
527  //UserNtuples->fillg553(YV,1.);
528  //UserNtuples->fillg558(phigrad,1.);
529  //UserNtuples->fillg521(lastpo.x(),1.);
530  //UserNtuples->fillg522(lastpo.y(),1.);
531  //UserNtuples->fillg523(lastpo.z(),1.);
532  }
533  if (lastpo.z() < z3 && lastpo.perp() < 100.) {
534  //UserNtuples->fillg528(eta,1.);
535  //UserNtuples->fillg549(XV,1.);
536  //UserNtuples->fillg554(YV,1.);
537  //UserNtuples->fillg559(phigrad,1.);
538  }
539  if (lastpo.z() < z4 && lastpo.perp() < 100.) {
540  //UserNtuples->fillg529(eta,1.);
541  //UserNtuples->fillg550(XV,1.);
542  //UserNtuples->fillg555(YV,1.);
543  //UserNtuples->fillg560(phigrad,1.);
544  //UserNtuples->fillg531(lastpo.x(),1.);
545  //UserNtuples->fillg532(lastpo.y(),1.);
546  //UserNtuples->fillg533(lastpo.z(),1.);
547  }
548  }
549 }
550 
551 // ====================================================
552 
553 //=================================================================== each STEP
554 void FP420Test::update(const G4Step* aStep) {
555  // ==========================================================================
556 
557  if (verbosity > 2) {
558  G4int stepnumber = aStep->GetTrack()->GetCurrentStepNumber();
559  edm::LogVerbatim("FP420Test") << "FP420Test:update Step number = " << stepnumber;
560  }
561  // track on aStep: !
562  G4Track* theTrack = aStep->GetTrack();
563  TrackInformation* trkInfo = dynamic_cast<TrackInformation*>(theTrack->GetUserInformation());
564  if (trkInfo == nullptr) {
565  edm::LogVerbatim("FP420Test") << "FP420Test on aStep: No trk info !!!! abort ";
566  }
567  G4int id = theTrack->GetTrackID();
568  G4String particleType = theTrack->GetDefinition()->GetParticleName(); // !!!
569  G4int parentID = theTrack->GetParentID(); // !!!
570  G4TrackStatus trackstatus = theTrack->GetTrackStatus(); // !!!
571  G4double tracklength = theTrack->GetTrackLength(); // Accumulated track length
572  G4ThreeVector trackmom = theTrack->GetMomentum();
573  G4double entot = theTrack->GetTotalEnergy(); // !!! deposited on step
574  G4int curstepnumber = theTrack->GetCurrentStepNumber();
575  // const G4ThreeVector& vert_pos = theTrack->GetVertexPosition(); // vertex ,where this track was created
576  // const G4ThreeVector& vert_mom = theTrack->GetVertexMomentumDirection();
577 
578  // double costheta =vert_mom.z()/sqrt(vert_mom.x()*vert_mom.x()+vert_mom.y()*vert_mom.y()+vert_mom.z()*vert_mom.z());
579  // double theta = acos(min(max(costheta,double(-1.)),double(1.)));
580  // float eta = -log(tan(theta/2));
581  // double phi = -1000.;
582  // if (vert_mom.x() != 0) phi = atan2(vert_mom.y(),vert_mom.x());
583  // if (phi < 0.) phi += twopi;
584  // double phigrad = phi*360./twopi;
585 
586  //G4double trackvel = theTrack->GetVelocity();
587 
588  //edm::LogVerbatim("FP420Test") << " trackstatus= " << trackstatus << " entot= " << entot ;
589 
590  // step points: !
591  G4double stepl = aStep->GetStepLength();
592  G4double EnerDeposit = aStep->GetTotalEnergyDeposit();
593  // pointers: !
594  //G4VPhysicalVolume* physvol = theTrack->GetVolume();
595  //G4VPhysicalVolume* nextphysvol = theTrack->GetNextVolume();
596  //G4Material* materialtr = theTrack->GetMaterial();
597  //G4Material* nextmaterialtr = theTrack->GetNextMaterial();
598 
599  // preStep
600  G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
601  const G4ThreeVector& preposition = preStepPoint->GetPosition();
602  G4ThreeVector prelocalpoint = theTrack->GetTouchable()->GetHistory()->GetTopTransform().TransformPoint(preposition);
603  G4VPhysicalVolume* currentPV = preStepPoint->GetPhysicalVolume();
604  const G4String& prename = currentPV->GetName();
605 
606  const G4VTouchable* pre_touch = preStepPoint->GetTouchable();
607  int pre_levels = detLevels(pre_touch);
608 
609  G4String name1[20];
610  int copyno1[20];
611  for (int i = 0; i < 20; ++i) {
612  name1[i] = "";
613  copyno1[i] = 0;
614  }
615  if (pre_levels > 0) {
616  detectorLevel(pre_touch, pre_levels, copyno1, name1);
617  }
618 
619  // gen_track:
620  // id=1 parentID=1 trackstatus=0,2 tracklength(accumulated) curstepnumber entot vert_pos
621  if (id == 1) {
622  // on 1-st step:
623  if (curstepnumber == 1) {
624  entot0 = entot;
625  //UserNtuples->fillg519(entot0,1.);
626  }
627 
628  // on every step:
629 
630  // for Copper:
631  if (prename == "SBST") {
632  sumStepc += stepl;
633  // =========
634  }
635  // for ststeel:
636  // if(prename == "SBSTs") {
637  if (prename == "SBSTs") {
638  sumStepl += stepl;
639  // =========
640  }
641  // =========
642  // =========
643 
644  // exclude last track point if it is in SD (MI was started their)
645  if (trackstatus != 2) {
646  // for SD: Si Det.: SISTATION:SIPLANE:(SIDETL+BOUNDDET +SIDETR + CERAMDET)
647  if (prename == "SIDETL" || prename == "SIDETR") {
648  if (prename == "SIDETL") {
649  //UserNtuples->fillg569(EnerDeposit,1.);
650  }
651  if (prename == "SIDETR") {
652  //UserNtuples->fillg570(EnerDeposit,1.);
653  }
654 
655  // double numbcont = 10.*(copyno1[2]-1)+copyno1[3];
656 
657  // =========
658  // double xx = preposition.x();
659  // double yy = preposition.y();
660  // double zz = preposition.z();
661  // =========
662  //UserNtuples->fillg580(theta,1.);
663  //UserNtuples->fillg07(phigrad,1.);
664  // double xPrimAtZhit = vert_pos.x() + (zz-vert_pos.z())*tan(theta)*cos(phi);
665  // double yPrimAtZhit = vert_pos.y() + (zz-vert_pos.z())*tan(theta)*sin(phi);
666  // =========
667  // double dx = xPrimAtZhit - xx;
668  // double dy = yPrimAtZhit - yy;
669  // =========
670 
671  // //UserNtuples->fillp212(numbcont,dx,1.);
672  // //UserNtuples->fillp213(numbcont,dy,1.);
673  // =========
674 
675  // last step of current SD Volume:
676  G4String posname = aStep->GetPostStepPoint()->GetPhysicalVolume()->GetName();
677  if ((prename == "SIDETL" && posname != "SIDETL") || (prename == "SIDETR" && posname != "SIDETR")) {
678  if (name1[2] == "SISTATION") {
679  //UserNtuples->fillg539(copyno1[2],1.);
680  }
681  if (name1[3] == "SIPLANE") {
682  //UserNtuples->fillg540(copyno1[3],1.);
683  }
684 
685  if (prename == "SIDETL") {
686  //UserNtuples->fillg541(EnerDeposit,1.);
687  //UserNtuples->fillg561(numbcont,1.);
688  if (copyno1[2] < 2) {
689  //UserNtuples->fillg571(dx,1.);
690  } else if (copyno1[2] < 3) {
691  //UserNtuples->fillg563(dx,1.);
692  if (copyno1[3] < 2) {
693  } else if (copyno1[3] < 3) {
694  //UserNtuples->fillg572(dx,1.);
695  } else if (copyno1[3] < 4) {
696  //UserNtuples->fillg573(dx,1.);
697  } else if (copyno1[3] < 5) {
698  //UserNtuples->fillg574(dx,1.);
699  } else if (copyno1[3] < 6) {
700  //UserNtuples->fillg575(dx,1.);
701  } else if (copyno1[3] < 7) {
702  //UserNtuples->fillg576(dx,1.);
703  } else if (copyno1[3] < 8) {
704  //UserNtuples->fillg577(dx,1.);
705  } else if (copyno1[3] < 9) {
706  //UserNtuples->fillg578(dx,1.);
707  } else if (copyno1[3] < 10) {
708  //UserNtuples->fillg579(dx,1.);
709  }
710  } else if (copyno1[2] < 4) {
711  //UserNtuples->fillg565(dx,1.);
712  } else if (copyno1[2] < 5) {
713  //UserNtuples->fillg567(dx,1.);
714  }
715  }
716  if (prename == "SIDETR") {
717  //UserNtuples->fillg542(EnerDeposit,1.);
718  //UserNtuples->fillg562(numbcont,1.);
719  if (copyno1[2] < 2) {
720  //UserNtuples->fillg581(dy,1.);
721  } else if (copyno1[2] < 3) {
722  //UserNtuples->fillg564(dy,1.);
723  if (copyno1[3] < 2) {
724  } else if (copyno1[3] < 3) {
725  //UserNtuples->fillg582(dy,1.);
726  } else if (copyno1[3] < 4) {
727  //UserNtuples->fillg583(dy,1.);
728  } else if (copyno1[3] < 5) {
729  //UserNtuples->fillg584(dy,1.);
730  } else if (copyno1[3] < 6) {
731  //UserNtuples->fillg585(dy,1.);
732  } else if (copyno1[3] < 7) {
733  //UserNtuples->fillg586(dy,1.);
734  } else if (copyno1[3] < 8) {
735  //UserNtuples->fillg587(dy,1.);
736  } else if (copyno1[3] < 9) {
737  //UserNtuples->fillg588(dy,1.);
738  } else if (copyno1[3] < 10) {
739  //UserNtuples->fillg589(dy,1.);
740  }
741  } else if (copyno1[2] < 4) {
742  //UserNtuples->fillg566(dy,1.);
743  } else if (copyno1[2] < 5) {
744  //UserNtuples->fillg568(dy,1.);
745  }
746  }
747  }
748  }
749  // end of prenames SIDETL // SIDETR
750  }
751  // end of trackstatus != 2
752 
753  // deposition of energy on steps along primary track
754  //UserNtuples->fillg500(EnerDeposit,1.);
755  // collect sum deposited energy on all steps along primary track
756  sumEnerDeposit += EnerDeposit;
757  // position of step for primary track:
758  //UserNtuples->fillg501(preposition.x(),1.);
759  //UserNtuples->fillg502(preposition.y(),1.);
760  //UserNtuples->fillg503(preposition.z(),1.);
761  //UserNtuples->fillg504(preposition.x(),EnerDeposit);
762  //UserNtuples->fillg505(preposition.y(),EnerDeposit);
763  //UserNtuples->fillg506(preposition.z(),EnerDeposit);
764  // 2D step coordinates weighted by energy deposited on step
765  // //UserNtuples->fillp201(preposition.x(),preposition.y(),EnerDeposit);
766  // //UserNtuples->fillp202(preposition.x(),preposition.z(),EnerDeposit);
767  // //UserNtuples->fillp203(preposition.y(),preposition.z(),EnerDeposit);
768  //UserNtuples->filld204(preposition.x(),preposition.y(),EnerDeposit);
769  //UserNtuples->filld205(preposition.x(),preposition.z(),EnerDeposit);
770  //UserNtuples->filld206(preposition.y(),preposition.z(),EnerDeposit);
771  //UserNtuples->filld223(preposition.y(),preposition.z(),EnerDeposit);
772  // last step of primary track
773  if (trackstatus == 2) {
774  // primary track length
775  // //UserNtuples->fillg508(tracklength,1.);
776  tracklength0 = tracklength;
777  // how many steps primary track consist
778  //UserNtuples->fillg509(curstepnumber,1.);
779  // tot. energy of primary track at the end of trajectory(before disappeare)
780  //UserNtuples->fillg510((entot0-entot),1.);
781  //UserNtuples->fillg520((entot0-entot),1.);
782  }
783  }
784  // end of primary track !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
785 
786  if (parentID == 1 && curstepnumber == 1) {
787  // particles deposit their energy along primary track
788  numofpart += 1;
789  // energy of radiated particle
790  //UserNtuples->fillg511(entot,1.);
791  // coordinates of radiated particle
792  //UserNtuples->fillg512(vert_pos.x(),1.);
793  //UserNtuples->fillg513(vert_pos.y(),1.);
794  //UserNtuples->fillg514(vert_pos.z(),1.);
795  //UserNtuples->fillg515(vert_pos.x(),entot);
796  //UserNtuples->fillg516(vert_pos.y(),entot);
797  //UserNtuples->fillg517(vert_pos.z(),entot);
798 
799  //UserNtuples->filld214(vert_pos.x(),vert_pos.y(),1.);
800  //UserNtuples->filld215(vert_pos.x(),vert_pos.z(),1.);
801  //UserNtuples->filld216(vert_pos.y(),vert_pos.z(),1.);
802  //UserNtuples->filld219(vert_pos.y(),vert_pos.z(),1.);
803  //UserNtuples->filld224(vert_pos.y(),vert_pos.z(),1.);
804  if (prename == "SBST") {
805  //UserNtuples->filld225(vert_pos.y(),vert_pos.z(),1.);
806  }
807  if (prename == "SBSTs") {
808  //UserNtuples->filld226(vert_pos.y(),vert_pos.z(),1.);
809  }
810  }
811 
812  // ==========================================================================
813 }
814 // ==========================================================================
815 // ==========================================================================
816 int FP420Test::detLevels(const G4VTouchable* touch) const {
817  //Return number of levels
818  if (touch)
819  return ((touch->GetHistoryDepth()) + 1);
820  else
821  return 0;
822 }
823 // ==========================================================================
824 
825 G4String FP420Test::detName(const G4VTouchable* touch, int level, int currentlevel) const {
826  //Go down to current level
827  if (level > 0 && level >= currentlevel) {
828  int ii = level - currentlevel;
829  return touch->GetVolume(ii)->GetName();
830  } else {
831  return "NotFound";
832  }
833 }
834 
835 void FP420Test::detectorLevel(const G4VTouchable* touch, int& level, int* copyno, G4String* name) const {
836  //Get name and copy numbers
837  if (level > 0) {
838  for (int ii = 0; ii < level; ii++) {
839  int i = level - ii - 1;
840  G4VPhysicalVolume* pv = touch->GetVolume(i);
841  if (pv != nullptr)
842  name[ii] = pv->GetName();
843  else
844  name[ii] = "Unknown";
845  copyno[ii] = touch->GetReplicaNumber(i);
846  }
847  }
848 }
849 // ==========================================================================
850 
851 //=================================================================== End Of Event
852 void FP420Test::update(const EndOfEvent* evt) {
853  // ==========================================================================
854 
855  if (verbosity > 1) {
856  iev = (*evt)()->GetEventID();
857  edm::LogVerbatim("FP420Test") << "FP420Test:update EndOfEvent = " << iev;
858  }
859  // Fill-in ntuple
861 
862  //
863  int trackID = 0;
864  G4PrimaryParticle* thePrim = nullptr;
865 
866  // prim.vertex:
867  G4int nvertex = (*evt)()->GetNumberOfPrimaryVertex();
868  if (nvertex != 1)
869  edm::LogVerbatim("FP420Test") << "FP420Test: My warning: NumberOfPrimaryVertex != 1 --> = " << nvertex;
870 
871  for (int i = 0; i < nvertex; i++) {
872  G4PrimaryVertex* avertex = (*evt)()->GetPrimaryVertex(i);
873  if (avertex == nullptr) {
874  edm::LogVerbatim("FP420Test") << "FP420Test End Of Event ERR: pointer to vertex = 0";
875  continue;
876  }
877  G4int npart = avertex->GetNumberOfParticle();
878  if (npart != 1)
879  edm::LogVerbatim("FP420Test") << "FP420Test: My warning: NumberOfPrimaryPart != 1 --> = " << npart;
880  if (npart == 0)
881  edm::LogVerbatim("FP420Test") << "FP420Test End Of Event ERR: no NumberOfParticle";
882 
883  // find just primary track: track pointer: thePrim
884  if (thePrim == nullptr)
885  thePrim = avertex->GetPrimary(trackID);
886 
887  if (thePrim != nullptr) {
888  // primary vertex:
889  G4double vx = 0., vy = 0., vz = 0.;
890  vx = avertex->GetX0();
891  vy = avertex->GetY0();
892  vz = avertex->GetZ0();
893  //UserNtuples->fillh01(vx);
894  //UserNtuples->fillh02(vy);
895  //UserNtuples->fillh03(vz);
896  theHistManager->getHisto("VtxX")->Fill(vx);
897  theHistManager->getHisto("VtxY")->Fill(vy);
898  theHistManager->getHisto("VtxZ")->Fill(vz);
899  }
900  }
901  // prim.vertex loop end
902 
903  //=========================== thePrim != 0 ================================================================================
904  if (thePrim != nullptr) {
905  // inline G4ParticleDefinition * GetG4code() const
906  // inline G4PrimaryParticle * GetNext() const
907  // inline G4PrimaryParticle * GetDaughter() const
908 
909  // prim.vertex
910  //int ivert = 0 ;
911  //G4PrimaryVertex* avertex = (*evt)()->GetPrimaryVertex(ivert);
912  //G4double vx=0.,vy=0.,vz=0.;
913  //vx = avertex->GetX0();
914  //vy = avertex->GetY0();
915  //vz = avertex->GetZ0();
916 
917  //
918  // number of secondary particles deposited their energy along primary track
919  //UserNtuples->fillg518(numofpart,1.);
920  if (lastpo.z() < z4 && lastpo.perp() < 100.) {
921  //UserNtuples->fillg536(numofpart,1.);
922  }
923  //
924 
925  // direction !!!
926  G4ThreeVector mom = thePrim->GetMomentum();
927 
928  double phi = atan2(mom.y(), mom.x());
929  if (phi < 0.)
930  phi += twopi;
931  double phigrad = phi * 180. / pi;
932 
933  double th = mom.theta();
934  double eta = -log(tan(th / 2));
935  // works OK:
936  // double costheta =mom.z()/sqrt(mom.x()*mom.x()+mom.y()*mom.y()+mom.z()*mom.z());
937  // double theta = acos(min(max(costheta,double(-1.)),double(1.)));
938 
939  //UserNtuples->fillh04(eta);
940  //UserNtuples->fillh05(phigrad);
941  //UserNtuples->fillh06(th);
942 
943  //UserNtuples->fillg13(lastpo.x(),1.);
944  //UserNtuples->fillg14(lastpo.y(),1.);
945  //UserNtuples->fillg15(lastpo.z(),1.);
946 
947  theHistManager->getHisto("PrimaryEta")->Fill(eta);
948  theHistManager->getHisto("PrimaryPhigrad")->Fill(phigrad);
949  theHistManager->getHisto("PrimaryTh")->Fill(th * 180. / pi);
950 
951  theHistManager->getHisto("PrimaryLastpoZ")->Fill(lastpo.z());
952  if (lastpo.z() < z4) {
953  theHistManager->getHisto("PrimaryLastpoX")->Fill(lastpo.x());
954  theHistManager->getHisto("PrimaryLastpoY")->Fill(lastpo.y());
955  }
956  if (numofpart > 4) {
957  theHistManager->getHisto("XLastpoNumofpart")->Fill(lastpo.x());
958  theHistManager->getHisto("YLastpoNumofpart")->Fill(lastpo.y());
959  }
960 
961  // ==========================================================================
962 
963  // hit map for FP420
964  // ==================================
965 
966  std::map<int, float, std::less<int> > themap;
967  std::map<int, float, std::less<int> > themap1;
968 
969  std::map<int, float, std::less<int> > themapxy;
970  std::map<int, float, std::less<int> > themapz;
971  // access to the G4 hit collections: -----> this work OK:
972 
973  // edm::LogInfo("FP420Test") << "1";
974  G4HCofThisEvent* allHC = (*evt)()->GetHCofThisEvent();
975  // edm::LogInfo("FP420Test") << "2";
976  if (verbosity > 0) {
977  edm::LogVerbatim("FP420Test") << "FP420Test: accessed all HC";
978  ;
979  }
980  int CAFIid = G4SDManager::GetSDMpointer()->GetCollectionID("FP420SI");
981  // edm::LogInfo("FP420Test") << "3";
982  // edm::LogVerbatim("FP420Test") << " CAFIid = " << CAFIid;;
983 
984  FP420G4HitCollection* theCAFI = (FP420G4HitCollection*)allHC->GetHC(CAFIid);
985  // CaloG4HitCollection* theCAFI = (CaloG4HitCollection*) allHC->GetHC(CAFIid);
986  if (verbosity > 0) {
987  //edm::LogVerbatim("FP420Test") << "FP420Test: theCAFI = " << theCAFI;
988  edm::LogVerbatim("FP420Test") << "FP420Test: theCAFI->entries = " << theCAFI->entries();
989  }
990  // edm::LogInfo("FP420Test") << "theCAFI->entries="<< theCAFI->entries();
991  theHistManager->getHisto("NumberOfHits")->Fill(theCAFI->entries());
992 
993  // access to the G4 hit collections ----> variant 2: give 0 hits
994  // FP420G4HitCollection * theCAFI;
995  // theCAFI = new FP420G4HitCollection();
996  // ==========================================================================
997  // Silicon Hit collection start
998  //0) if particle goes into flat beam pipe below detector:
999  int varia; // = 0 -all; =1 - MI; =2 - noMI
1000  // Select MI or noMI over all 3 stations
1001  // 1)MI:
1002  // if particle goes through window into detector:
1003  // lastpoint of track in lateral dir. outside the detector and inside in z
1004  // lastpoint of track in lateral dir. outside the detector and inside in z
1005  // for all except zzzmarta.xml
1006  // if( lastpo.z()<z4 || abs(lastpo.x())> 5. || lastpo.y()< 10.2 || lastpo.y()>30.2 ) {
1007  // for zzzmarta.xml
1008  // if( lastpo.z()<z4 || abs(lastpo.x())> 10. || lastpo.y()< 3.2 || lastpo.y()>43.2 ) {
1009  if (lastpo.z() < z4) {
1010  // if( lastpo.z()<z4 && lastpo.perp()< 100. ) {
1011  // if(lastpo.z()<z4 || lastpo.perp()> 45.) {
1012  //UserNtuples->fillg66(theCAFI->entries(),1.);
1013  varia = 1;
1014  } else {
1015  // 2) no MI start in detector:
1016  //UserNtuples->fillg31(numofpart,1.);
1017  //UserNtuples->fillg67(theCAFI->entries(),1.);
1018  varia = 2;
1019  } // no MI end:
1020  int nhits = theCAFI->entries();
1021  for (int j = 0; j < nhits; j++) {
1022  FP420G4Hit* aHit = (*theCAFI)[j];
1023  G4ThreeVector hitPoint = aHit->getEntry();
1024  double zz = hitPoint.z();
1025  theHistManager->getHisto("zHits")->Fill(zz);
1026  if (tracklength0 > 8300.)
1027  theHistManager->getHisto("zHitsTrLoLe")->Fill(zz);
1028  }
1029  // varia = 0;
1030  // if( varia == 0) {
1031  if (varia == 2) {
1032  // .............
1033  // number of hits < 50
1034  // if(theCAFI->entries() <50) {
1035  // if(theCAFI->entries() > 0) {
1036  // if(theCAFI->entries() > -1) {
1037  // .............
1038  //int nhit11 = 0, nhit12 = 0, nhit13 = 0;
1039  double totallosenergy = 0.;
1040  for (int j = 0; j < nhits; j++) {
1041  FP420G4Hit* aHit = (*theCAFI)[j];
1042 
1043  G4ThreeVector hitEntryLocalPoint = aHit->getEntryLocalP();
1044  G4ThreeVector hitExitLocalPoint = aHit->getExitLocalP();
1045  G4ThreeVector hitPoint = aHit->getEntry();
1046  // double elmenergy = aHit->getEM();
1047  // double hadrenergy = aHit->getHadr();
1048  // double incidentEnergyHit = aHit->getIncidentEnergy();
1049  int trackIDhit = aHit->getTrackID();
1050  unsigned int unitID = aHit->getUnitID();
1051  // double timeslice = aHit->getTimeSlice();
1052  // int timesliceID = aHit->getTimeSliceID();
1053  // double depenergy = aHit->getEnergyDeposit();
1054  // float pabs = aHit->getPabs();
1055  // float tof = aHit->getTof();
1056  double losenergy = aHit->getEnergyLoss();
1057  // int particletype = aHit->getParticleType();
1058  // float thetaEntry = aHit->getThetaAtEntry();
1059  // float phiEntry = aHit->getPhiAtEntry();
1060  // float xEntry = aHit->getX();
1061  // float yEntry = aHit->getY();
1062  // float zEntry = aHit->getZ();
1063  // int parentID = aHit->getParentId();
1064  // float vxget = aHit->getVx();
1065  // float vyget = aHit->getVy();
1066  // float vzget = aHit->getVz();
1067 
1068  // double th_hit = hitPoint.theta();
1069  // double eta_hit = -log(tan(th_hit/2));
1070  // double phi_hit = hitPoint.phi();
1071  // if (phi_hit < 0.) phi_hit += twopi;
1072  // double phigrad_hit = phi_hit*180./pi;
1073  //UserNtuples->fillg60(eta_hit,losenergy);
1074  //UserNtuples->fillg61(eta_hit,1.);
1075  //UserNtuples->fillg62(phigrad_hit,losenergy);
1076  //UserNtuples->fillg63(phigrad_hit,1.);
1077 
1078  // double xx = hitPoint.x();
1079  // double yy = hitPoint.y();
1080  double zz = hitPoint.z();
1081 
1082  theHistManager->getHisto("zHitsnoMI")->Fill(zz);
1083 
1084  if (verbosity > 2) {
1085  edm::LogVerbatim("FP420Test") << "FP420Test:zHits = " << zz;
1086  }
1087  // double rr = hitPoint.perp();
1088  /*
1089  if(aHit->getTrackID() == 1) {
1090  emu += aHit->getEnergyDeposit();} else {
1091  erest += aHit->getEnergyDeposit();}
1092  */
1093 
1094  //collect lost in Si en.of hits in every plane and put it into themap[]
1095  //UserNtuples->fillg30(losenergy,1.);
1096  themap[unitID] += losenergy;
1097  totallosenergy += losenergy;
1098 
1099  int det, zside, sector, zmodule;
1100  // CaloNumberingPacker::unpackCastorIndex(unitID, det, zside, sector, zmodule);
1101  FP420NumberingScheme::unpackFP420Index(unitID, det, zside, sector, zmodule);
1102  int justlayer = FP420NumberingScheme::unpackLayerIndex(rn00, zside); // 1,2
1103  if (justlayer < 1 || justlayer > 2) {
1104  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG justlayer= " << justlayer;
1105  }
1106  // zside=1,2 ; zmodule=1,10 ; sector=1,3
1107  //UserNtuples->fillg44(float(sector),1.);
1108  //UserNtuples->fillg45(float(zmodule),1.);
1109  //UserNtuples->fillg46(float(zside),1.);
1110  // int sScale = 20;
1111  // intindex is a continues numbering of FP420
1112  //int zScale = 2; unsigned int intindex = sScale*(sector - 1)+zScale*(zmodule - 1)+zside; //intindex=1-30:X,Y,X,Y,X,Y...
1113  // int zScale = 10; unsigned int intindex = sScale*(sector - 1)+zScale*(zside - 1)+zmodule; //intindex=1-30:XXXXXXXXXX,YYYYYYYYYY,...
1114  //UserNtuples->fillg40(float(intindex),1.);
1115  //UserNtuples->fillg48(float(intindex),losenergy);
1116  //
1117  //=======================================
1118  // G4ThreeVector middle = (hitExitLocalPoint+hitEntryLocalPoint)/2.;
1119  G4ThreeVector middle = (hitExitLocalPoint - hitEntryLocalPoint) / 2.;
1120  themapz[unitID] = hitPoint.z() + fabs(middle.z());
1121  if (verbosity > 2) {
1122  edm::LogVerbatim("FP420Test") << "1111111111111111111111111111111111111111111111111111111111111111111111111 ";
1123  edm::LogVerbatim("FP420Test") << "FP420Test: det, zside, sector, zmodule = " << det << zside << sector
1124  << zmodule;
1125  edm::LogVerbatim("FP420Test") << "FP420Test: justlayer = " << justlayer;
1126  edm::LogVerbatim("FP420Test") << "FP420Test: hitExitLocalPoint = " << hitExitLocalPoint;
1127  edm::LogVerbatim("FP420Test") << "FP420Test: hitEntryLocalPoint = " << hitEntryLocalPoint;
1128  edm::LogVerbatim("FP420Test") << "FP420Test: middle= " << middle;
1129  edm::LogVerbatim("FP420Test") << "FP420Test: hitPoint.z()-419000.= " << hitPoint.z() - 419000.;
1130 
1131  edm::LogVerbatim("FP420Test") << "FP420Test:zHits-419000. = " << themapz[unitID] - 419000.;
1132  }
1133  //=======================================
1134  // Y
1135  if (zside == 1) {
1136  //UserNtuples->fillg24(losenergy,1.);
1137  if (losenergy > 0.00003) {
1138  themap1[unitID] += 1.;
1139  }
1140  }
1141  //X
1142  if (zside == 2) {
1143  //UserNtuples->fillg25(losenergy,1.);
1144  if (losenergy > 0.00005) {
1145  themap1[unitID] += 1.;
1146  }
1147  }
1148  // }
1149  //
1150  /*
1151  if (sector == 1) {
1152  nhit11 += 1;
1153  //UserNtuples->fillg33(rr,1.);
1154  //UserNtuples->fillg11(yy,1.);
1155  }
1156  if (sector == 2) {
1157  nhit12 += 1;
1158  //UserNtuples->fillg34(rr,1.);
1159  //UserNtuples->fillg86(yy,1.);
1160  }
1161  if (sector == 3) {
1162  nhit13 += 1;
1163  //UserNtuples->fillg35(rr,1.);
1164  //UserNtuples->fillg87(yy,1.);
1165  }
1166  */
1167  //UserNtuples->fillg10(xx,1.);
1168  //UserNtuples->fillg12(zz,1.);
1169  //UserNtuples->fillg32(rr,1.);
1170 
1171  // =========
1172  // double xPrimAtZhit = vx + (zz-vz)*tan(th)*cos(phi);
1173  // double yPrimAtZhit = vy + (zz-vz)*tan(th)*sin(phi);
1174 
1175  // double dx = xPrimAtZhit - xx;
1176  // double dy = yPrimAtZhit - yy;
1177 
1178  // Select SD hits
1179  // if(rr<120.) {
1180  // Select MI or noMI over all 3 stations
1181  if (lastpo.z() < z4 && lastpo.perp() < 120.) {
1182  // MIonly:
1183  //UserNtuples->fillg16(lastpo.z(),1.);
1184  //UserNtuples->fillg18(zz,1.);
1185  // Station I
1186  if (zz < z2) {
1187  //UserNtuples->fillg54(dx,1.);
1188  //UserNtuples->fillg55(dy,1.);
1189  }
1190  // Station II
1191  if (zz < z3 && zz > z2) {
1192  //UserNtuples->fillg50(dx,1.);
1193  //UserNtuples->fillg51(dy,1.);
1194  }
1195  // Station III
1196  if (zz < z4 && zz > z3) {
1197  //UserNtuples->fillg64(dx,1.);
1198  //UserNtuples->fillg65(dy,1.);
1199  //UserNtuples->filld209(xx,yy,1.);
1200  }
1201  } else {
1202  // no MIonly:
1203  //UserNtuples->fillg17(lastpo.z(),1.);
1204  //UserNtuples->fillg19(zz,1.);
1205  //UserNtuples->fillg74(incidentEnergyHit,1.);
1206  //UserNtuples->fillg75(float(trackIDhit),1.);
1207  // Station I
1208  if (zz < z2) {
1209  //UserNtuples->fillg56(dx,1.);
1210  //UserNtuples->fillg57(dy,1.);
1211  //UserNtuples->fillg20(numofpart,1.);
1212  //UserNtuples->fillg21(sumEnerDeposit,1.);
1213  if (zside == 1) {
1214  //UserNtuples->fillg26(losenergy,1.);
1215  }
1216  if (zside == 2) {
1217  //UserNtuples->fillg76(losenergy,1.);
1218  }
1219  if (trackIDhit == 1) {
1220  //UserNtuples->fillg70(dx,1.);
1221  //UserNtuples->fillg71(incidentEnergyHit,1.);
1222  //UserNtuples->fillg79(losenergy,1.);
1223  } else {
1224  //UserNtuples->fillg82(dx,1.);
1225  }
1226  }
1227  // Station II
1228  if (zz < z3 && zz > z2) {
1229  //UserNtuples->fillg52(dx,1.);
1230  //UserNtuples->fillg53(dy,1.);
1231  //UserNtuples->fillg22(numofpart,1.);
1232  //UserNtuples->fillg23(sumEnerDeposit,1.);
1233  //UserNtuples->fillg80(incidentEnergyHit,1.);
1234  //UserNtuples->fillg81(float(trackIDhit),1.);
1235  if (zside == 1) {
1236  //UserNtuples->fillg27(losenergy,1.);
1237  }
1238  if (zside == 2) {
1239  //UserNtuples->fillg77(losenergy,1.);
1240  }
1241  if (trackIDhit == 1) {
1242  //UserNtuples->fillg72(dx,1.);
1243  //UserNtuples->fillg73(incidentEnergyHit,1.);
1244  } else {
1245  //UserNtuples->fillg83(dx,1.);
1246  }
1247  }
1248  // Station III
1249  if (zz < z4 && zz > z3) {
1250  //UserNtuples->fillg68(dx,1.);
1251  //UserNtuples->fillg69(dy,1.);
1252  //UserNtuples->filld210(xx,yy,1.);
1253  //UserNtuples->fillg22(numofpart,1.);
1254  //UserNtuples->fillg23(sumEnerDeposit,1.);
1255  if (zside == 1) {
1256  //UserNtuples->fillg28(losenergy,1.);
1257  }
1258  if (zside == 2) {
1259  //UserNtuples->fillg78(losenergy,1.);
1260  }
1261  }
1262  } // MIonly or noMIonly ENDED
1263  // }
1264 
1265  // !!!!!!!!!!!!!
1266 
1267  } // for loop on all hits ENDED ENDED ENDED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1268 
1269  // !!!!!!!!!!!!!
1270 
1271  //======================================================================================================SUMHIT
1272  //UserNtuples->fillg29(totallosenergy,1.);
1273  //UserNtuples->fillg36(nhit11,1.);
1274  //UserNtuples->fillg37(nhit12,1.);
1275  //UserNtuples->fillg38(nhit13,1.);
1276  //======================================================================================================SUMHIT
1277  // int rn00=3;//test only with 2 sensors in superlayer, not 4
1278  // int rn00=rn0;//always
1279  if (verbosity > 2) {
1280  edm::LogVerbatim("FP420Test") << "22222222222222222222222222222222222222222222222222222222222222222222222222 ";
1281  }
1282  int det = 1;
1283  int allplacesforsensors = 7;
1284  for (int sector = 1; sector < sn0; sector++) {
1285  for (int zmodule = 1; zmodule < pn0; zmodule++) {
1286  for (int zsideinorder = 1; zsideinorder < allplacesforsensors; zsideinorder++) {
1287  int zside = FP420NumberingScheme::realzside(rn00, zsideinorder); //1,3,5,2,4,6
1288  if (verbosity > 2) {
1289  edm::LogVerbatim("FP420Test") << "FP420Test: sector= " << sector << " zmodule= " << zmodule
1290  << " zsideinorder= " << zsideinorder << " zside= " << zside;
1291  }
1292  if (zside != 0) {
1293  int justlayer = FP420NumberingScheme::unpackLayerIndex(rn00, zside); // 1,2
1294  if (justlayer < 1 || justlayer > 2) {
1295  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG justlayer= " << justlayer;
1296  }
1297  int copyinlayer = FP420NumberingScheme::unpackCopyIndex(rn00, zside); // 1,2,3
1298  if (copyinlayer < 1 || copyinlayer > 3) {
1299  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG copyinlayer= " << copyinlayer;
1300  }
1301  int orientation = FP420NumberingScheme::unpackOrientation(rn00, zside); // Front: = 1; Back: = 2
1302  if (orientation < 1 || orientation > 2) {
1303  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG orientation= " << orientation;
1304  }
1305 
1306  // iu is a continues numbering of planes(!) over two arm FP420 set up
1307  int detfixed =
1308  1; // use this treatment for each set up arm, hence no sense to do it defferently for +FP420 and -FP420;
1309  // and ...[ii] massives have prepared in such a way
1310  unsigned int ii =
1311  FP420NumberingScheme::packMYIndex(rn00, pn0, sn0, detfixed, justlayer, sector, zmodule) - 1;
1312  // ii = 0-19 --> 20 items
1313  if (verbosity > 2) {
1314  edm::LogVerbatim("FP420Test")
1315  << "FP420Test: justlayer = " << justlayer << " copyinlayer = " << copyinlayer
1316  << " orientation = " << orientation << " ii= " << ii;
1317  }
1318  double zdiststat = 0.;
1319  if (sn0 < 4) {
1320  if (sector == 2)
1321  zdiststat = zD3;
1322  } else {
1323  if (sector == 2)
1324  zdiststat = zD2;
1325  if (sector == 3)
1326  zdiststat = zD3;
1327  }
1328  double kplane = -(pn0 - 1) / 2 - 0.5 + (zmodule - 1); //-3.5 +0...5 = -3.5,-2.5,-1.5,+2.5,+1.5
1329  double zcurrent = zinibeg + z420 + (zSiStep - zSiPlane) / 2 + kplane * zSiStep + zdiststat;
1330  //double zcurrent = zinibeg +(zSiStep-zSiPlane)/2 + kplane*zSiStep + (sector-1)*zUnit;
1331  if (verbosity > 2) {
1332  edm::LogVerbatim("FP420Test") << "FP420Test: Leftzcurrent-419000. = " << zcurrent - 419000.;
1333  edm::LogVerbatim("FP420Test") << "FP420Test: zGapLDet = " << zGapLDet;
1334  }
1335  if (justlayer == 1) {
1336  if (orientation == 1)
1337  zcurrent += (zGapLDet + zSiDet / 2);
1338  if (orientation == 2)
1339  zcurrent += zBlade - (zGapLDet + zSiDet / 2);
1340  }
1341  if (justlayer == 2) {
1342  if (orientation == 1)
1343  zcurrent += (zGapLDet + zSiDet / 2) + zBlade + gapBlade;
1344  if (orientation == 2)
1345  zcurrent += 2 * zBlade + gapBlade - (zGapLDet + zSiDet / 2);
1346  }
1347  // .
1348  //
1349  if (det == 2)
1350  zcurrent = -zcurrent;
1351  //
1352  if (verbosity > 2) {
1353  edm::LogVerbatim("FP420Test") << "FP420Test: zcurrent-419000. = " << zcurrent - 419000.;
1354  }
1355  //================================== end of for loops in continuius number iu:
1356  } //if(zside!=0
1357  } // for superlayer
1358  } // for zmodule
1359  } // for sector
1360 
1361  if (verbosity > 2) {
1362  edm::LogVerbatim("FP420Test")
1363  << "----------------------------------------------------------------------------- ";
1364  }
1365 
1366  //======================================================================================================CHECK
1367  if (totallosenergy == 0.0) {
1368  edm::LogVerbatim("FP420Test") << "FP420Test: number of hits = " << theCAFI->entries();
1369  for (int j = 0; j < nhits; j++) {
1370  FP420G4Hit* aHit = (*theCAFI)[j];
1371  double losenergy = aHit->getEnergyLoss();
1372  edm::LogVerbatim("FP420Test") << " j hits = " << j << "losenergy = " << losenergy;
1373  }
1374  }
1375  //======================================================================================================CHECK
1376 
1377  //====================================================================================================== HIT START
1378 
1379  // FIBRE Hit collected analysis
1380  /*
1381  double totalEnergy = 0.;
1382  int nhitsX = 0, nhitsY = 0, nsumhit = 0;
1383  for (int sector = 1; sector < 4; sector++) {
1384  int nhitsecX = 0, nhitsecY = 0;
1385  for (int zmodule = 1; zmodule < 11; zmodule++) {
1386  for (int zside = 1; zside < 3; zside++) {
1387  int det = 1;
1388  // int nhit = 0;
1389  // int sScale = 20;
1390  int index = FP420NumberingScheme::packFP420Index(det, zside, sector, zmodule);
1391  double theTotalEnergy = themap[index];
1392  // X planes
1393  if (zside < 2) {
1394  //UserNtuples->fillg47(theTotalEnergy,1.);
1395  if (theTotalEnergy > 0.00003) {
1396  nhitsX += 1;
1397  // nhitsecX += themap1[index];
1398  // nhit=1;
1399  }
1400  }
1401  // Y planes
1402  else {
1403  //UserNtuples->fillg49(theTotalEnergy,1.);
1404  if (theTotalEnergy > 0.00005) {
1405  nhitsY += 1;
1406  // nhitsecY += themap1[index];
1407  // nhit=1;
1408  }
1409  }
1410  // intindex is a continues numbering of FP420
1411  // int zScale=2; unsigned int intindex = sScale*(sector - 1)+zScale*(zmodule - 1)+zside;
1412  // int zScale=10; unsigned int intindex = sScale*(sector - 1)+zScale*(zside - 1)+zmodule;
1413  //UserNtuples->fillg41(float(intindex),theTotalEnergy);
1414  //UserNtuples->fillg42(float(intindex),1.);
1415  //UserNtuples->fillp208(float(intindex),float(nhit),1.);
1416  //UserNtuples->fillp211(float(intindex),float(themap1[index]),1.);
1417  totalEnergy += themap[index];
1418  } // for
1419  } // for
1420  //UserNtuples->fillg39(nhitsecY,1.);
1421  if (nhitsecX > 10 || nhitsecY > 10) {
1422  nsumhit += 1;
1423  //UserNtuples->fillp213(float(sector),float(1.),1.);
1424  } else { //UserNtuples->fillp213(float(sector),float(0.),1.);
1425  }
1426  } // for
1427  //====================================================================================================== HIT END
1428 
1429  //====================================================================================================== HIT ALL
1430  //UserNtuples->fillg43(totalEnergy,1.);
1431  //UserNtuples->fillg58(nhitsX,1.);
1432  //UserNtuples->fillg59(nhitsY,1.);
1433  // if( nsumhit !=0 ) { //UserNtuples->fillp212(vy,float(1.),1.);
1434  if (nsumhit >= 2) { //UserNtuples->fillp212(vy,float(1.),1.);
1435  } else { //UserNtuples->fillp212(vy,float(0.),1.);
1436  }
1437  */
1438  //====================================================================================================== HIT ALL
1439 
1440  //====================================================================================================== number of hits
1441  // .............
1442  // } // number of hits < 50
1443  // .............
1444  } // MI or no MI or all - end
1445 
1446  } // primary end
1447  //=========================== thePrim != 0 end ===
1448  // ==========================================================================
1449  if (verbosity > 0) {
1450  edm::LogVerbatim("FP420Test") << "FP420Test: END OF Event " << (*evt)()->GetEventID();
1451  }
1452 }
1453 
static int unpackCopyIndex(int rn0, int zside)
void update(const BeginOfJob *run) override
This routine will be called when the appropriate signal arrives.
Definition: FP420Test.cc:414
Log< level::Info, true > LogVerbatim
double z4
Definition: FP420Test.cc:140
#define DEFINE_SIMWATCHER(type)
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
G4double sumEnerDeposit
Definition: FP420Test.cc:133
void writeToFile(const TString &fOutputFile, const TString &fRecreateFile)
Definition: FP420Test.cc:310
const char * fTypeTitle
Definition: FP420Test.cc:86
static int realzside(int rn0, int zsideinorder)
static void unpackFP420Index(const unsigned int &idx, int &det, int &zside, int &station, int &superplane)
double zinibeg
Definition: FP420Test.cc:144
double z2
Definition: FP420Test.cc:140
int verbosity
Definition: FP420Test.cc:130
TFile fp420OutputFile
Definition: FP420Test.cc:149
double npart
Definition: HydjetWrapper.h:46
FP420Test(const edm::ParameterSet &p)
Definition: FP420Test.cc:161
int zside(DetId const &)
static int unpackLayerIndex(int rn0, int zside)
std::string fRecreateFile
Definition: FP420Test.cc:155
double zGapLDet
Definition: FP420Test.cc:144
unsigned int getUnitID() const
Definition: FP420G4Hit.cc:125
~FP420Test() override
Definition: FP420Test.cc:229
G4ThreeVector lastpo
Definition: FP420Test.cc:137
const Double_t pi
ntfp420_elements
Definition: FP420Test.cc:159
static unsigned packMYIndex(int rn0, int pn0, int sn0, int det, int zside, int sector, int zmodule)
G4ThreeVector getEntry() const
Definition: FP420G4Hit.cc:104
Fp420AnalysisHistManager * theHistManager
Definition: FP420Test.cc:152
double zD2
Definition: FP420Test.cc:140
std::string fOutputFile
Definition: FP420Test.cc:154
double zBoundDet
Definition: FP420Test.cc:144
unsigned int getTrackID() const
Definition: FP420G4Hit.cc:122
void detectorLevel(const G4VTouchable *, int &, int *, G4String *) const
Definition: FP420Test.cc:835
Fp420AnalysisHistManager(const TString &managername)
Definition: FP420Test.cc:254
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
int whichevent
Definition: FP420Test.cc:150
double zinCalo
Definition: FP420Test.cc:128
G4String detName(const G4VTouchable *, int, int) const
Definition: FP420Test.cc:825
G4ThreeVector getEntryLocalP() const
Definition: FP420G4Hit.cc:107
double zD3
Definition: FP420Test.cc:140
double zSiPlane
Definition: FP420Test.cc:144
double z3
Definition: FP420Test.cc:140
Float_t fp420eventarray[1]
Definition: FP420Test.cc:147
double z1
Definition: FP420Test.cc:140
G4double entot0
Definition: FP420Test.cc:126
G4double sumStepl
Definition: FP420Test.cc:133
TH1F * getHisto(Int_t Number)
Definition: FP420Test.cc:351
ii
Definition: cuy.py:589
double z420
Definition: FP420Test.cc:143
int detLevels(const G4VTouchable *) const
Definition: FP420Test.cc:816
G4THitsCollection< FP420G4Hit > FP420G4HitCollection
int lastTrackID
Definition: FP420Test.cc:129
double zSiStep
Definition: FP420Test.cc:144
int numofpart
Definition: FP420Test.cc:135
void histInit(const char *name, const char *title, Int_t nbinsx, Axis_t xlow, Axis_t xup)
Definition: FP420Test.cc:324
double gapBlade
Definition: FP420Test.cc:145
double rinCalo
Definition: FP420Test.cc:128
TObjArray * fHistArray
Definition: FP420Test.cc:87
G4double sumStepc
Definition: FP420Test.cc:133
TH2F * getHisto2(Int_t Number)
Definition: FP420Test.cc:367
double zSiDet
Definition: FP420Test.cc:143
G4double tracklength0
Definition: FP420Test.cc:126
step
Definition: StallMonitor.cc:98
float getEnergyLoss() const
Definition: FP420G4Hit.cc:141
static int unpackOrientation(int rn0, int zside)
TNtuple * fp420eventntuple
Definition: FP420Test.cc:148
std::string fDataLabel
Definition: FP420Test.cc:153
TObjArray * fHistNamesArray
Definition: FP420Test.cc:88
G4ThreeVector getExitLocalP() const
Definition: FP420G4Hit.cc:110
~Fp420AnalysisHistManager() override
Definition: FP420Test.cc:271
double zBlade
Definition: FP420Test.cc:145