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  G4int npart = avertex->GetNumberOfParticle();
876  if (npart != 1)
877  edm::LogVerbatim("FP420Test") << "FP420Test: My warning: NumberOfPrimaryPart != 1 --> = " << npart;
878  if (npart == 0)
879  edm::LogVerbatim("FP420Test") << "FP420Test End Of Event ERR: no NumberOfParticle";
880 
881  // find just primary track: track pointer: thePrim
882  if (thePrim == nullptr)
883  thePrim = avertex->GetPrimary(trackID);
884 
885  if (thePrim != nullptr) {
886  // primary vertex:
887  G4double vx = 0., vy = 0., vz = 0.;
888  vx = avertex->GetX0();
889  vy = avertex->GetY0();
890  vz = avertex->GetZ0();
891  //UserNtuples->fillh01(vx);
892  //UserNtuples->fillh02(vy);
893  //UserNtuples->fillh03(vz);
894  theHistManager->getHisto("VtxX")->Fill(vx);
895  theHistManager->getHisto("VtxY")->Fill(vy);
896  theHistManager->getHisto("VtxZ")->Fill(vz);
897  }
898  }
899  // prim.vertex loop end
900 
901  //=========================== thePrim != 0 ================================================================================
902  if (thePrim != nullptr) {
903  // inline G4ParticleDefinition * GetG4code() const
904  // inline G4PrimaryParticle * GetNext() const
905  // inline G4PrimaryParticle * GetDaughter() const
906 
907  // prim.vertex
908  //int ivert = 0 ;
909  //G4PrimaryVertex* avertex = (*evt)()->GetPrimaryVertex(ivert);
910  //G4double vx=0.,vy=0.,vz=0.;
911  //vx = avertex->GetX0();
912  //vy = avertex->GetY0();
913  //vz = avertex->GetZ0();
914 
915  //
916  // number of secondary particles deposited their energy along primary track
917  //UserNtuples->fillg518(numofpart,1.);
918  if (lastpo.z() < z4 && lastpo.perp() < 100.) {
919  //UserNtuples->fillg536(numofpart,1.);
920  }
921  //
922 
923  // direction !!!
924  G4ThreeVector mom = thePrim->GetMomentum();
925 
926  double phi = atan2(mom.y(), mom.x());
927  if (phi < 0.)
928  phi += twopi;
929  double phigrad = phi * 180. / pi;
930 
931  double th = mom.theta();
932  double eta = -log(tan(th / 2));
933  // works OK:
934  // double costheta =mom.z()/sqrt(mom.x()*mom.x()+mom.y()*mom.y()+mom.z()*mom.z());
935  // double theta = acos(min(max(costheta,double(-1.)),double(1.)));
936 
937  //UserNtuples->fillh04(eta);
938  //UserNtuples->fillh05(phigrad);
939  //UserNtuples->fillh06(th);
940 
941  //UserNtuples->fillg13(lastpo.x(),1.);
942  //UserNtuples->fillg14(lastpo.y(),1.);
943  //UserNtuples->fillg15(lastpo.z(),1.);
944 
945  theHistManager->getHisto("PrimaryEta")->Fill(eta);
946  theHistManager->getHisto("PrimaryPhigrad")->Fill(phigrad);
947  theHistManager->getHisto("PrimaryTh")->Fill(th * 180. / pi);
948 
949  theHistManager->getHisto("PrimaryLastpoZ")->Fill(lastpo.z());
950  if (lastpo.z() < z4) {
951  theHistManager->getHisto("PrimaryLastpoX")->Fill(lastpo.x());
952  theHistManager->getHisto("PrimaryLastpoY")->Fill(lastpo.y());
953  }
954  if (numofpart > 4) {
955  theHistManager->getHisto("XLastpoNumofpart")->Fill(lastpo.x());
956  theHistManager->getHisto("YLastpoNumofpart")->Fill(lastpo.y());
957  }
958 
959  // ==========================================================================
960 
961  // hit map for FP420
962  // ==================================
963 
964  std::map<int, float, std::less<int> > themap;
965  std::map<int, float, std::less<int> > themap1;
966 
967  std::map<int, float, std::less<int> > themapxy;
968  std::map<int, float, std::less<int> > themapz;
969  // access to the G4 hit collections: -----> this work OK:
970 
971  // edm::LogInfo("FP420Test") << "1";
972  G4HCofThisEvent* allHC = (*evt)()->GetHCofThisEvent();
973  // edm::LogInfo("FP420Test") << "2";
974  if (verbosity > 0) {
975  edm::LogVerbatim("FP420Test") << "FP420Test: accessed all HC";
976  ;
977  }
978  int CAFIid = G4SDManager::GetSDMpointer()->GetCollectionID("FP420SI");
979  // edm::LogInfo("FP420Test") << "3";
980  // edm::LogVerbatim("FP420Test") << " CAFIid = " << CAFIid;;
981 
982  FP420G4HitCollection* theCAFI = (FP420G4HitCollection*)allHC->GetHC(CAFIid);
983  // CaloG4HitCollection* theCAFI = (CaloG4HitCollection*) allHC->GetHC(CAFIid);
984  if (verbosity > 0) {
985  //edm::LogVerbatim("FP420Test") << "FP420Test: theCAFI = " << theCAFI;
986  edm::LogVerbatim("FP420Test") << "FP420Test: theCAFI->entries = " << theCAFI->entries();
987  }
988  // edm::LogInfo("FP420Test") << "theCAFI->entries="<< theCAFI->entries();
989  theHistManager->getHisto("NumberOfHits")->Fill(theCAFI->entries());
990 
991  // access to the G4 hit collections ----> variant 2: give 0 hits
992  // FP420G4HitCollection * theCAFI;
993  // theCAFI = new FP420G4HitCollection();
994  // ==========================================================================
995  // Silicon Hit collection start
996  //0) if particle goes into flat beam pipe below detector:
997  int varia; // = 0 -all; =1 - MI; =2 - noMI
998  // Select MI or noMI over all 3 stations
999  // 1)MI:
1000  // if particle goes through window into detector:
1001  // lastpoint of track in lateral dir. outside the detector and inside in z
1002  // lastpoint of track in lateral dir. outside the detector and inside in z
1003  // for all except zzzmarta.xml
1004  // if( lastpo.z()<z4 || abs(lastpo.x())> 5. || lastpo.y()< 10.2 || lastpo.y()>30.2 ) {
1005  // for zzzmarta.xml
1006  // if( lastpo.z()<z4 || abs(lastpo.x())> 10. || lastpo.y()< 3.2 || lastpo.y()>43.2 ) {
1007  if (lastpo.z() < z4) {
1008  // if( lastpo.z()<z4 && lastpo.perp()< 100. ) {
1009  // if(lastpo.z()<z4 || lastpo.perp()> 45.) {
1010  //UserNtuples->fillg66(theCAFI->entries(),1.);
1011  varia = 1;
1012  } else {
1013  // 2) no MI start in detector:
1014  //UserNtuples->fillg31(numofpart,1.);
1015  //UserNtuples->fillg67(theCAFI->entries(),1.);
1016  varia = 2;
1017  } // no MI end:
1018  int nhits = theCAFI->entries();
1019  for (int j = 0; j < nhits; j++) {
1020  FP420G4Hit* aHit = (*theCAFI)[j];
1021  G4ThreeVector hitPoint = aHit->getEntry();
1022  double zz = hitPoint.z();
1023  theHistManager->getHisto("zHits")->Fill(zz);
1024  if (tracklength0 > 8300.)
1025  theHistManager->getHisto("zHitsTrLoLe")->Fill(zz);
1026  }
1027  // varia = 0;
1028  // if( varia == 0) {
1029  if (varia == 2) {
1030  // .............
1031  // number of hits < 50
1032  // if(theCAFI->entries() <50) {
1033  // if(theCAFI->entries() > 0) {
1034  // if(theCAFI->entries() > -1) {
1035  // .............
1036  int nhit11 = 0, nhit12 = 0, nhit13 = 0;
1037  double totallosenergy = 0.;
1038  for (int j = 0; j < nhits; j++) {
1039  FP420G4Hit* aHit = (*theCAFI)[j];
1040 
1041  G4ThreeVector hitEntryLocalPoint = aHit->getEntryLocalP();
1042  G4ThreeVector hitExitLocalPoint = aHit->getExitLocalP();
1043  G4ThreeVector hitPoint = aHit->getEntry();
1044  // double elmenergy = aHit->getEM();
1045  // double hadrenergy = aHit->getHadr();
1046  // double incidentEnergyHit = aHit->getIncidentEnergy();
1047  int trackIDhit = aHit->getTrackID();
1048  unsigned int unitID = aHit->getUnitID();
1049  // double timeslice = aHit->getTimeSlice();
1050  // int timesliceID = aHit->getTimeSliceID();
1051  // double depenergy = aHit->getEnergyDeposit();
1052  // float pabs = aHit->getPabs();
1053  // float tof = aHit->getTof();
1054  double losenergy = aHit->getEnergyLoss();
1055  // int particletype = aHit->getParticleType();
1056  // float thetaEntry = aHit->getThetaAtEntry();
1057  // float phiEntry = aHit->getPhiAtEntry();
1058  // float xEntry = aHit->getX();
1059  // float yEntry = aHit->getY();
1060  // float zEntry = aHit->getZ();
1061  // int parentID = aHit->getParentId();
1062  // float vxget = aHit->getVx();
1063  // float vyget = aHit->getVy();
1064  // float vzget = aHit->getVz();
1065 
1066  // double th_hit = hitPoint.theta();
1067  // double eta_hit = -log(tan(th_hit/2));
1068  // double phi_hit = hitPoint.phi();
1069  // if (phi_hit < 0.) phi_hit += twopi;
1070  // double phigrad_hit = phi_hit*180./pi;
1071  //UserNtuples->fillg60(eta_hit,losenergy);
1072  //UserNtuples->fillg61(eta_hit,1.);
1073  //UserNtuples->fillg62(phigrad_hit,losenergy);
1074  //UserNtuples->fillg63(phigrad_hit,1.);
1075 
1076  // double xx = hitPoint.x();
1077  // double yy = hitPoint.y();
1078  double zz = hitPoint.z();
1079 
1080  theHistManager->getHisto("zHitsnoMI")->Fill(zz);
1081 
1082  if (verbosity > 2) {
1083  edm::LogVerbatim("FP420Test") << "FP420Test:zHits = " << zz;
1084  }
1085  // double rr = hitPoint.perp();
1086  /*
1087  if(aHit->getTrackID() == 1) {
1088  emu += aHit->getEnergyDeposit();} else {
1089  erest += aHit->getEnergyDeposit();}
1090  */
1091 
1092  //collect lost in Si en.of hits in every plane and put it into themap[]
1093  //UserNtuples->fillg30(losenergy,1.);
1094  themap[unitID] += losenergy;
1095  totallosenergy += losenergy;
1096 
1097  int det, zside, sector, zmodule;
1098  // CaloNumberingPacker::unpackCastorIndex(unitID, det, zside, sector, zmodule);
1099  FP420NumberingScheme::unpackFP420Index(unitID, det, zside, sector, zmodule);
1100  int justlayer = FP420NumberingScheme::unpackLayerIndex(rn00, zside); // 1,2
1101  if (justlayer < 1 || justlayer > 2) {
1102  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG justlayer= " << justlayer;
1103  }
1104  // zside=1,2 ; zmodule=1,10 ; sector=1,3
1105  //UserNtuples->fillg44(float(sector),1.);
1106  //UserNtuples->fillg45(float(zmodule),1.);
1107  //UserNtuples->fillg46(float(zside),1.);
1108  // int sScale = 20;
1109  // intindex is a continues numbering of FP420
1110  //int zScale = 2; unsigned int intindex = sScale*(sector - 1)+zScale*(zmodule - 1)+zside; //intindex=1-30:X,Y,X,Y,X,Y...
1111  // int zScale = 10; unsigned int intindex = sScale*(sector - 1)+zScale*(zside - 1)+zmodule; //intindex=1-30:XXXXXXXXXX,YYYYYYYYYY,...
1112  //UserNtuples->fillg40(float(intindex),1.);
1113  //UserNtuples->fillg48(float(intindex),losenergy);
1114  //
1115  //=======================================
1116  // G4ThreeVector middle = (hitExitLocalPoint+hitEntryLocalPoint)/2.;
1117  G4ThreeVector middle = (hitExitLocalPoint - hitEntryLocalPoint) / 2.;
1118  themapz[unitID] = hitPoint.z() + fabs(middle.z());
1119  if (verbosity > 2) {
1120  edm::LogVerbatim("FP420Test") << "1111111111111111111111111111111111111111111111111111111111111111111111111 ";
1121  edm::LogVerbatim("FP420Test") << "FP420Test: det, zside, sector, zmodule = " << det << zside << sector
1122  << zmodule;
1123  edm::LogVerbatim("FP420Test") << "FP420Test: justlayer = " << justlayer;
1124  edm::LogVerbatim("FP420Test") << "FP420Test: hitExitLocalPoint = " << hitExitLocalPoint;
1125  edm::LogVerbatim("FP420Test") << "FP420Test: hitEntryLocalPoint = " << hitEntryLocalPoint;
1126  edm::LogVerbatim("FP420Test") << "FP420Test: middle= " << middle;
1127  edm::LogVerbatim("FP420Test") << "FP420Test: hitPoint.z()-419000.= " << hitPoint.z() - 419000.;
1128 
1129  edm::LogVerbatim("FP420Test") << "FP420Test:zHits-419000. = " << themapz[unitID] - 419000.;
1130  }
1131  //=======================================
1132  // Y
1133  if (zside == 1) {
1134  //UserNtuples->fillg24(losenergy,1.);
1135  if (losenergy > 0.00003) {
1136  themap1[unitID] += 1.;
1137  }
1138  }
1139  //X
1140  if (zside == 2) {
1141  //UserNtuples->fillg25(losenergy,1.);
1142  if (losenergy > 0.00005) {
1143  themap1[unitID] += 1.;
1144  }
1145  }
1146  // }
1147  //
1148  if (sector == 1) {
1149  nhit11 += 1;
1150  //UserNtuples->fillg33(rr,1.);
1151  //UserNtuples->fillg11(yy,1.);
1152  }
1153  if (sector == 2) {
1154  nhit12 += 1;
1155  //UserNtuples->fillg34(rr,1.);
1156  //UserNtuples->fillg86(yy,1.);
1157  }
1158  if (sector == 3) {
1159  nhit13 += 1;
1160  //UserNtuples->fillg35(rr,1.);
1161  //UserNtuples->fillg87(yy,1.);
1162  }
1163  //UserNtuples->fillg10(xx,1.);
1164  //UserNtuples->fillg12(zz,1.);
1165  //UserNtuples->fillg32(rr,1.);
1166 
1167  // =========
1168  // double xPrimAtZhit = vx + (zz-vz)*tan(th)*cos(phi);
1169  // double yPrimAtZhit = vy + (zz-vz)*tan(th)*sin(phi);
1170 
1171  // double dx = xPrimAtZhit - xx;
1172  // double dy = yPrimAtZhit - yy;
1173 
1174  // Select SD hits
1175  // if(rr<120.) {
1176  // Select MI or noMI over all 3 stations
1177  if (lastpo.z() < z4 && lastpo.perp() < 120.) {
1178  // MIonly:
1179  //UserNtuples->fillg16(lastpo.z(),1.);
1180  //UserNtuples->fillg18(zz,1.);
1181  // Station I
1182  if (zz < z2) {
1183  //UserNtuples->fillg54(dx,1.);
1184  //UserNtuples->fillg55(dy,1.);
1185  }
1186  // Station II
1187  if (zz < z3 && zz > z2) {
1188  //UserNtuples->fillg50(dx,1.);
1189  //UserNtuples->fillg51(dy,1.);
1190  }
1191  // Station III
1192  if (zz < z4 && zz > z3) {
1193  //UserNtuples->fillg64(dx,1.);
1194  //UserNtuples->fillg65(dy,1.);
1195  //UserNtuples->filld209(xx,yy,1.);
1196  }
1197  } else {
1198  // no MIonly:
1199  //UserNtuples->fillg17(lastpo.z(),1.);
1200  //UserNtuples->fillg19(zz,1.);
1201  //UserNtuples->fillg74(incidentEnergyHit,1.);
1202  //UserNtuples->fillg75(float(trackIDhit),1.);
1203  // Station I
1204  if (zz < z2) {
1205  //UserNtuples->fillg56(dx,1.);
1206  //UserNtuples->fillg57(dy,1.);
1207  //UserNtuples->fillg20(numofpart,1.);
1208  //UserNtuples->fillg21(sumEnerDeposit,1.);
1209  if (zside == 1) {
1210  //UserNtuples->fillg26(losenergy,1.);
1211  }
1212  if (zside == 2) {
1213  //UserNtuples->fillg76(losenergy,1.);
1214  }
1215  if (trackIDhit == 1) {
1216  //UserNtuples->fillg70(dx,1.);
1217  //UserNtuples->fillg71(incidentEnergyHit,1.);
1218  //UserNtuples->fillg79(losenergy,1.);
1219  } else {
1220  //UserNtuples->fillg82(dx,1.);
1221  }
1222  }
1223  // Station II
1224  if (zz < z3 && zz > z2) {
1225  //UserNtuples->fillg52(dx,1.);
1226  //UserNtuples->fillg53(dy,1.);
1227  //UserNtuples->fillg22(numofpart,1.);
1228  //UserNtuples->fillg23(sumEnerDeposit,1.);
1229  //UserNtuples->fillg80(incidentEnergyHit,1.);
1230  //UserNtuples->fillg81(float(trackIDhit),1.);
1231  if (zside == 1) {
1232  //UserNtuples->fillg27(losenergy,1.);
1233  }
1234  if (zside == 2) {
1235  //UserNtuples->fillg77(losenergy,1.);
1236  }
1237  if (trackIDhit == 1) {
1238  //UserNtuples->fillg72(dx,1.);
1239  //UserNtuples->fillg73(incidentEnergyHit,1.);
1240  } else {
1241  //UserNtuples->fillg83(dx,1.);
1242  }
1243  }
1244  // Station III
1245  if (zz < z4 && zz > z3) {
1246  //UserNtuples->fillg68(dx,1.);
1247  //UserNtuples->fillg69(dy,1.);
1248  //UserNtuples->filld210(xx,yy,1.);
1249  //UserNtuples->fillg22(numofpart,1.);
1250  //UserNtuples->fillg23(sumEnerDeposit,1.);
1251  if (zside == 1) {
1252  //UserNtuples->fillg28(losenergy,1.);
1253  }
1254  if (zside == 2) {
1255  //UserNtuples->fillg78(losenergy,1.);
1256  }
1257  }
1258  } // MIonly or noMIonly ENDED
1259  // }
1260 
1261  // !!!!!!!!!!!!!
1262 
1263  } // for loop on all hits ENDED ENDED ENDED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1264 
1265  // !!!!!!!!!!!!!
1266 
1267  //======================================================================================================SUMHIT
1268  //UserNtuples->fillg29(totallosenergy,1.);
1269  //UserNtuples->fillg36(nhit11,1.);
1270  //UserNtuples->fillg37(nhit12,1.);
1271  //UserNtuples->fillg38(nhit13,1.);
1272  //======================================================================================================SUMHIT
1273  // int rn00=3;//test only with 2 sensors in superlayer, not 4
1274  // int rn00=rn0;//always
1275  if (verbosity > 2) {
1276  edm::LogVerbatim("FP420Test") << "22222222222222222222222222222222222222222222222222222222222222222222222222 ";
1277  }
1278  int det = 1;
1279  int allplacesforsensors = 7;
1280  for (int sector = 1; sector < sn0; sector++) {
1281  for (int zmodule = 1; zmodule < pn0; zmodule++) {
1282  for (int zsideinorder = 1; zsideinorder < allplacesforsensors; zsideinorder++) {
1283  int zside = FP420NumberingScheme::realzside(rn00, zsideinorder); //1,3,5,2,4,6
1284  if (verbosity > 2) {
1285  edm::LogVerbatim("FP420Test") << "FP420Test: sector= " << sector << " zmodule= " << zmodule
1286  << " zsideinorder= " << zsideinorder << " zside= " << zside;
1287  }
1288  if (zside != 0) {
1289  int justlayer = FP420NumberingScheme::unpackLayerIndex(rn00, zside); // 1,2
1290  if (justlayer < 1 || justlayer > 2) {
1291  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG justlayer= " << justlayer;
1292  }
1293  int copyinlayer = FP420NumberingScheme::unpackCopyIndex(rn00, zside); // 1,2,3
1294  if (copyinlayer < 1 || copyinlayer > 3) {
1295  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG copyinlayer= " << copyinlayer;
1296  }
1297  int orientation = FP420NumberingScheme::unpackOrientation(rn00, zside); // Front: = 1; Back: = 2
1298  if (orientation < 1 || orientation > 2) {
1299  edm::LogVerbatim("FP420Test") << "FP420Test:WRONG orientation= " << orientation;
1300  }
1301 
1302  // iu is a continues numbering of planes(!) over two arm FP420 set up
1303  int detfixed =
1304  1; // use this treatment for each set up arm, hence no sense to do it defferently for +FP420 and -FP420;
1305  // and ...[ii] massives have prepared in such a way
1306  unsigned int ii =
1307  FP420NumberingScheme::packMYIndex(rn00, pn0, sn0, detfixed, justlayer, sector, zmodule) - 1;
1308  // ii = 0-19 --> 20 items
1309  if (verbosity > 2) {
1310  edm::LogVerbatim("FP420Test")
1311  << "FP420Test: justlayer = " << justlayer << " copyinlayer = " << copyinlayer
1312  << " orientation = " << orientation << " ii= " << ii;
1313  }
1314  double zdiststat = 0.;
1315  if (sn0 < 4) {
1316  if (sector == 2)
1317  zdiststat = zD3;
1318  } else {
1319  if (sector == 2)
1320  zdiststat = zD2;
1321  if (sector == 3)
1322  zdiststat = zD3;
1323  }
1324  double kplane = -(pn0 - 1) / 2 - 0.5 + (zmodule - 1); //-3.5 +0...5 = -3.5,-2.5,-1.5,+2.5,+1.5
1325  double zcurrent = zinibeg + z420 + (zSiStep - zSiPlane) / 2 + kplane * zSiStep + zdiststat;
1326  //double zcurrent = zinibeg +(zSiStep-zSiPlane)/2 + kplane*zSiStep + (sector-1)*zUnit;
1327  if (verbosity > 2) {
1328  edm::LogVerbatim("FP420Test") << "FP420Test: Leftzcurrent-419000. = " << zcurrent - 419000.;
1329  edm::LogVerbatim("FP420Test") << "FP420Test: zGapLDet = " << zGapLDet;
1330  }
1331  if (justlayer == 1) {
1332  if (orientation == 1)
1333  zcurrent += (zGapLDet + zSiDet / 2);
1334  if (orientation == 2)
1335  zcurrent += zBlade - (zGapLDet + zSiDet / 2);
1336  }
1337  if (justlayer == 2) {
1338  if (orientation == 1)
1339  zcurrent += (zGapLDet + zSiDet / 2) + zBlade + gapBlade;
1340  if (orientation == 2)
1341  zcurrent += 2 * zBlade + gapBlade - (zGapLDet + zSiDet / 2);
1342  }
1343  // .
1344  //
1345  if (det == 2)
1346  zcurrent = -zcurrent;
1347  //
1348  if (verbosity > 2) {
1349  edm::LogVerbatim("FP420Test") << "FP420Test: zcurrent-419000. = " << zcurrent - 419000.;
1350  }
1351  //================================== end of for loops in continuius number iu:
1352  } //if(zside!=0
1353  } // for superlayer
1354  } // for zmodule
1355  } // for sector
1356 
1357  if (verbosity > 2) {
1358  edm::LogVerbatim("FP420Test")
1359  << "----------------------------------------------------------------------------- ";
1360  }
1361 
1362  //======================================================================================================CHECK
1363  if (totallosenergy == 0.0) {
1364  edm::LogVerbatim("FP420Test") << "FP420Test: number of hits = " << theCAFI->entries();
1365  for (int j = 0; j < nhits; j++) {
1366  FP420G4Hit* aHit = (*theCAFI)[j];
1367  double losenergy = aHit->getEnergyLoss();
1368  edm::LogVerbatim("FP420Test") << " j hits = " << j << "losenergy = " << losenergy;
1369  }
1370  }
1371  //======================================================================================================CHECK
1372 
1373  //====================================================================================================== HIT START
1374 
1375  // FIBRE Hit collected analysis
1376  double totalEnergy = 0.;
1377  int nhitsX = 0, nhitsY = 0, nsumhit = 0;
1378  for (int sector = 1; sector < 4; sector++) {
1379  int nhitsecX = 0, nhitsecY = 0;
1380  for (int zmodule = 1; zmodule < 11; zmodule++) {
1381  for (int zside = 1; zside < 3; zside++) {
1382  int det = 1;
1383  // int nhit = 0;
1384  // int sScale = 20;
1385  int index = FP420NumberingScheme::packFP420Index(det, zside, sector, zmodule);
1386  double theTotalEnergy = themap[index];
1387  // X planes
1388  if (zside < 2) {
1389  //UserNtuples->fillg47(theTotalEnergy,1.);
1390  if (theTotalEnergy > 0.00003) {
1391  nhitsX += 1;
1392  // nhitsecX += themap1[index];
1393  // nhit=1;
1394  }
1395  }
1396  // Y planes
1397  else {
1398  //UserNtuples->fillg49(theTotalEnergy,1.);
1399  if (theTotalEnergy > 0.00005) {
1400  nhitsY += 1;
1401  // nhitsecY += themap1[index];
1402  // nhit=1;
1403  }
1404  }
1405  // intindex is a continues numbering of FP420
1406  // int zScale=2; unsigned int intindex = sScale*(sector - 1)+zScale*(zmodule - 1)+zside;
1407  // int zScale=10; unsigned int intindex = sScale*(sector - 1)+zScale*(zside - 1)+zmodule;
1408  //UserNtuples->fillg41(float(intindex),theTotalEnergy);
1409  //UserNtuples->fillg42(float(intindex),1.);
1410  //UserNtuples->fillp208(float(intindex),float(nhit),1.);
1411  //UserNtuples->fillp211(float(intindex),float(themap1[index]),1.);
1412  totalEnergy += themap[index];
1413  } // for
1414  } // for
1415  //UserNtuples->fillg39(nhitsecY,1.);
1416  if (nhitsecX > 10 || nhitsecY > 10) {
1417  nsumhit += 1;
1418  //UserNtuples->fillp213(float(sector),float(1.),1.);
1419  } else { //UserNtuples->fillp213(float(sector),float(0.),1.);
1420  }
1421  } // for
1422  //====================================================================================================== HIT END
1423 
1424  //====================================================================================================== HIT ALL
1425  //UserNtuples->fillg43(totalEnergy,1.);
1426  //UserNtuples->fillg58(nhitsX,1.);
1427  //UserNtuples->fillg59(nhitsY,1.);
1428  // if( nsumhit !=0 ) { //UserNtuples->fillp212(vy,float(1.),1.);
1429  if (nsumhit >= 2) { //UserNtuples->fillp212(vy,float(1.),1.);
1430  } else { //UserNtuples->fillp212(vy,float(0.),1.);
1431  }
1432 
1433  //====================================================================================================== HIT ALL
1434 
1435  //====================================================================================================== number of hits
1436  // .............
1437  // } // number of hits < 50
1438  // .............
1439  } // MI or no MI or all - end
1440 
1441  } // primary end
1442  //=========================== thePrim != 0 end ===
1443  // ==========================================================================
1444  if (verbosity > 0) {
1445  edm::LogVerbatim("FP420Test") << "FP420Test: END OF Event " << (*evt)()->GetEventID();
1446  }
1447 }
1448 
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:124
~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:103
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:121
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
def pv(vc)
Definition: MetAnalyzer.py:7
double zinCalo
Definition: FP420Test.cc:128
G4String detName(const G4VTouchable *, int, int) const
Definition: FP420Test.cc:825
G4ThreeVector getEntryLocalP() const
Definition: FP420G4Hit.cc:106
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
static unsigned int packFP420Index(int det, int zside, int station, int superplane)
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:140
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:109
~Fp420AnalysisHistManager() override
Definition: FP420Test.cc:271
double zBlade
Definition: FP420Test.cc:145