67 fNeulandClusters.init();
69 FairRootManager* ioman = FairRootManager::Instance();
72 LOG(fatal) <<
"R3BNeulandClusterMon::Init: No FairRootManager";
76 if (fIs3DTrackEnabled)
79 fh3 =
new TH3D(
"hClusters",
"hClusters", 60, 1400, 1700, 50, -125, 125, 50, -125, 125);
80 fh3->SetTitle(
"NeuLAND Clusters");
81 fh3->GetXaxis()->SetTitle(
"Z");
82 fh3->GetYaxis()->SetTitle(
"X");
83 fh3->GetZaxis()->SetTitle(
"Y");
85 ioman->Register(fOutput,
"Cluster TH3Ds in NeuLAND", fh3, kTRUE);
88 TH1::AddDirectory(kFALSE);
90 fhClusters =
new TH1D(
"nClusters",
"Number of clusters in one event", 100, 0, 100);
91 fhClusterSize =
new TH1D(
"ClusterSize",
"Number of Digis for each Cluster", 100, 0, 100);
92 fhClusterEnergy =
new TH1D(
"ClusterEnergy",
"Energy for each Cluster", 2000, 0., 2000.);
93 fhClusterEnergyVSSize =
94 new TH2D(
"ClusterEnergyVSSize",
"Energy for each Cluster vs Cluster Size", 2000, 0., 2000., 100, 0., 100.);
95 fhClusterTime =
new TH1D(
"ClusterTime",
"Time for each Cluster", 5000, 0., 500.);
96 fhClusterEToF =
new TH1D(
"ClusterEToF",
"Cluster EToF", 2000, 0, 2000);
97 fhClusterRValue =
new TH1D(
"ClusterRValue",
"Log Cluster R Value", 20000, -10, 1);
100 new TH2D(
"ClusterSizeVSEToF",
"Number of Digis for each Cluster vs EToF", 100, 0, 100, 2000, 0, 2000);
101 fhClusterEnergyVSEToF =
102 new TH2D(
"ClusterEnergyVSEToF",
"Energy for each Cluster vs EToF", 2000, 0., 2000., 2000, 0, 2000);
103 fhClusterEnergyVSSizeVSEToF =
new TH3D(
"ClusterEnergyVSSizeVSEToF",
104 "Energy for each Cluster vs Cluster Size vs EToF",
115 fhENFromScatterVSEToF =
new TH2D(
"ENFromScatterVSEToF",
"ENFromScatterVSEToF", 1000, 0, 1000, 1000, 0, 1000);
117 fhClusterNumberVSEnergy =
118 new TH2D(
"ClusterNumberEtot",
"Number of Clusters vs. Total Energy", 200, 0, 2000, 50, 0, 50);
119 fhClusterNumberVSEnergy->GetXaxis()->SetTitle(
"Total energy [MeV]");
120 fhClusterNumberVSEnergy->GetYaxis()->SetTitle(
"Number of Clusters");
122 fhClusterEToFVSEnergy =
123 new TH2D(
"ClusterEToFVSEnergy",
"Cluster E_{ToF} vs. Cluster Energy", 100, 0, 1000, 100, 0, 1000);
124 fhClusterEToFVSEnergy->GetXaxis()->SetTitle(
"Cluster E_{ToF} [MeV]");
125 fhClusterEToFVSEnergy->GetYaxis()->SetTitle(
"Cluster E [MeV]");
127 fhClusterEToFVSTime =
new TH2D(
"ClusterEToFVSTime",
"Cluster E_{ToF} vs. Cluster Time", 100, 0, 1000, 500, 0, 500);
128 fhClusterEToFVSTime->GetXaxis()->SetTitle(
"Cluster E_{ToF} [MeV]");
129 fhClusterEToFVSTime->GetYaxis()->SetTitle(
"Cluster t [ns]");
131 fhClusterEVSTime =
new TH2D(
"ClusterEVSTime",
"Cluster E vs. Cluster Time", 250, 0, 250, 500, 0, 250);
132 fhClusterEVSTime->GetXaxis()->SetTitle(
"Cluster E [MeV]");
133 fhClusterEVSTime->GetYaxis()->SetTitle(
"Cluster t [ns]");
135 fhClusterLastMinusFirstDigiMagVSEnergy =
new TH2D(
136 "ClusterLastMinusFirstDigiMagVSEnergy",
"ClusterLastMinusFirstDigiMagVSEnergy", 101, 0, 100, 60, 0, 600);
138 fhClusterForemostMinusCentroidVSEnergy =
139 new TH2D(
"ClusterForemostMinusCentroidVSEnergy",
140 "Distance between Foremost Digi and Energy Centroid vs Cluster Energy",
147 fhClusterForemostMinusCentroidVSEnergy->GetXaxis()->SetTitle(
"|#vec{r_{z_{min}}}-#vec{r_{EC}}| [cm]");
148 fhClusterForemostMinusCentroidVSEnergy->GetYaxis()->SetTitle(
"Cluster Energy [MeV]");
150 fhClusterForemostMinusMaxEnergyDigiPosVSEnergy =
151 new TH2D(
"ClusterForemostMinusMaxEnergyDigiPosVSEnergy",
152 "Distance between Foremost Digi and Max Energy Digi vs Cluster Energy",
159 fhClusterForemostMinusMaxEnergyDigiPosVSEnergy->GetXaxis()->SetTitle(
"|#vec{r_{z_{min}}}-#vec{r_{E_{max}}}| [cm]");
160 fhClusterForemostMinusMaxEnergyDigiPosVSEnergy->GetYaxis()->SetTitle(
"Cluster Energy [MeV]");
162 fhClusterCentroidMinusFirstDigiPosVSEnergy =
163 new TH2D(
"ClusterCentroidMinusFirstDigiPosVSEnergy",
164 "Distance between Cluster Energy Centroid and First Hit vs Cluster Energy",
171 fhClusterCentroidMinusFirstDigiPosVSEnergy->GetXaxis()->SetTitle(
"|#vec{r_{EC}}-#vec{r_{t_{min}}}| [cm]");
172 fhClusterCentroidMinusFirstDigiPosVSEnergy->GetYaxis()->SetTitle(
"Cluster Energy [MeV]");
174 fhClusterMaxEnergyDigiMinusFirstDigiPosVSEnergy =
175 new TH2D(
"ClusterMaxEnergyDigiMinusFirstDigiPosVSEnergy",
176 "Distance between Max Energy Digi and First Digi vs Cluster Energy",
183 fhClusterMaxEnergyDigiMinusFirstDigiPosVSEnergy->GetXaxis()->SetTitle(
"|#vec{r_{E_{max}}}-#vec{r_{t_{min}}}| [cm]");
184 fhClusterMaxEnergyDigiMinusFirstDigiPosVSEnergy->GetYaxis()->SetTitle(
"Cluster Energy [MeV]");
186 fhClusterMaxEnergyDigiMinusCentroidVSEnergy =
187 new TH2D(
"ClusterMaxEnergyDigiMinusCentroidVSEnergy",
188 "Distance between Max Energy Digi and Energy Centroid vs Cluster Energy",
195 fhClusterMaxEnergyDigiMinusCentroidVSEnergy->GetXaxis()->SetTitle(
"|#vec{r_{E_{max}}}-#vec{r_{EC}}| [cm]");
196 fhClusterMaxEnergyDigiMinusCentroidVSEnergy->GetYaxis()->SetTitle(
"Cluster Energy [MeV]");
198 fhClusterEnergyMomentVSEnergy =
199 new TH2D(
"ClusterEnergyMomentVSEnergy",
"Cluster Energy Moment VS Energy", 100, 0, 100, 60, 0, 600);
200 fhClusterEnergyMomentVSEnergy->GetXaxis()->SetTitle(
"|#vec{EM}| [cm]");
201 fhClusterEnergyMomentVSEnergy->GetYaxis()->SetTitle(
"Cluster Energy [MeV]");
203 fhClusterEnergyMoment =
new TH1D(
"ClusterEnergyMoment",
"Cluster Energy Moment", 100, 0, 100);
204 fhClusterMaxEnergyDigiMinusFirstDigiMag =
205 new TH1D(
"ClusterMaxEnergyDigiMinusFirstDigiMag",
"ClusterMaxEnergyDigiMinusFirstDigiMag", 100, 0, 1000);
207 fhClusterEnergyMomentVSClusterSize =
208 new TH2D(
"ClusterEnergyMomentVSClusterSize",
"Cluster Energy Moment VS Cluster Size", 100, 0, 100, 30, 0, 30);
210 fhEToFVSEelastic =
new TH2D(
"EToFVSEelastic",
"EToFVSEelastic", 50, 0, 1000, 50, 10, 1000);
211 fhScatteredNEnergyVSAngle =
new TH2D(
"ScatteredNEnergyVSAngle",
"ScatteredNEnergyVSAngle", 50, 0, 1000, 50, 0, 3.2);
212 fhScatteredNEnergyVSEdep =
new TH2D(
"ScatteredNEnergyVSEdep",
"ScatteredNEnergyVSEdep", 100, 0, 1000, 100, 0, 1000);
214 fhScatterAngleVSRecoilAngle =
215 new TH2D(
"ScatterAngleVSRecoilAngle",
"ScatterAngleVSRecoilAngle", 50, 0, 3.2, 50, 0, 3.2);
217 fhSumAngleVSRatioErecoEtof =
new TH2D(
"SumAngleVSRatioErecoEtof",
"SumAngleVSRatioErecoEtof", 50, 0, 3.2, 50, 0, 2);
218 fhClusterEnergyVSScatteredRecoilAngle =
219 new TH2D(
"ClusterEnergyVSScatteredRecoilAngle",
"ClusterEnergyVSScatteredRecoilAngle", 50, 0, 1000, 50, 0, 3.2);
220 fhClusterEnergyVSScatteredNeutronAngle =
new TH2D(
221 "ClusterEnergyVSScatteredNeutronAngle",
"ClusterEnergyVSScatteredNeutronAngle", 50, 0, 1000, 50, 0, 3.2);
223 fhElasticTargetMass =
new TH2D(
"ElasticTargetMass",
"ElasticTargetMass", 200, -50000, 50000, 100, 0, 1000);
234 fhZ =
new TH1D(
"Z",
"Z", 5000, 0., 5000.);
235 fhZVSEToF =
new TH2D(
"ZVSEToF",
"Z vs EToF", 4000, 1000, 5000, 2000, 0, 2000);
236 fhDistFromCenter =
new TH1D(
"DistFromCenter",
"DistFromCenter", 500, 0., 500.);
237 fhDistFromCenterVSEToF =
new TH2D(
"DistFromCenterVSEToF",
"DistFromCenter vs EToF", 500, 0, 500, 2000, 0, 2000);
239 fhDeltaT =
new TH1D(
"fhDeltaT",
"T_{Last Digi} - T_{First Digi}", 1000, 0, 100);
240 fhForemostMinusFirstDigiTime =
241 new TH1D(
"fhForemostMinusFirstDigiTime",
"T_{Foremost} - T_{First Digi}", 1000, -10, 10);
243 fhThetaEDigi =
new TH2D(
"fhThetaEDigi",
"fhThetaEDigi", 1000, -500, 500, 400, 0, 400);
244 fhThetaEDigiCosTheta =
new TH2D(
"fhThetaEDigiCosTheta",
"fhThetaEDigiCosTheta", 1000, -500, 500, 400, 0, 400);
246 hT =
new TH1D(
"hT",
"Cluster Digi Delta T", 3000, 0., 15.);
247 hTNeigh =
new TH1D(
"hTNeigh",
"Cluster Digi Neigh Delta T", 3000, 0., 15.);
254 fNeulandClustersBuffer = fNeulandClusters.get();
255 fNeulandClustersBuffer.erase(std::remove_if(fNeulandClustersBuffer.begin(),
256 fNeulandClustersBuffer.end(),
258 fNeulandClustersBuffer.end());
260 const auto nClusters = fNeulandClustersBuffer.size();
262 if (fIs3DTrackEnabled)
265 for (
const auto& cluster : fNeulandClustersBuffer)
267 const auto start = cluster.GetFirstHit().GetPosition();
269 fh3->Fill(start.Z(), start.X(), start.Y(), cluster.GetE());
273 const Double_t etot = std::accumulate(fNeulandClustersBuffer.begin(),
274 fNeulandClustersBuffer.end(),
278 fhClusterNumberVSEnergy->Fill(etot, nClusters);
280 fhClusters->Fill(nClusters);
281 for (
const auto& cluster : fNeulandClustersBuffer)
283 fhClusterTime->Fill(cluster.GetT());
284 fhClusterSize->Fill(cluster.GetSize());
285 fhClusterEnergy->Fill(cluster.GetE());
286 fhClusterRValue->Fill(std::log10(cluster.GetRCluster(fBeta)));
287 fhClusterEnergyVSSize->Fill(cluster.GetE(), cluster.GetSize());
288 fhClusterEToF->Fill(cluster.GetFirstHit().GetEToF());
289 fhClusterEToFVSEnergy->Fill(cluster.GetFirstHit().GetEToF(), cluster.GetE());
290 fhClusterEToFVSTime->Fill(cluster.GetFirstHit().GetEToF(), cluster.GetT());
291 fhClusterEVSTime->Fill(cluster.GetFirstHit().GetE(), cluster.GetT());
293 fhClusterEnergyVSEToF->Fill(cluster.GetE(), cluster.GetFirstHit().GetEToF());
294 fhClusterSizeVSEToF->Fill(cluster.GetSize(), cluster.GetFirstHit().GetEToF());
295 fhClusterEnergyVSSizeVSEToF->Fill(cluster.GetE(), cluster.GetSize(), cluster.GetFirstHit().GetEToF());
296 if (cluster.GetSize() > 2)
298 fhClusterForemostMinusCentroidVSEnergy->Fill(
299 (cluster.GetForemostHit().GetPosition() - cluster.GetEnergyCentroid()).Mag(), cluster.GetE());
301 fhClusterForemostMinusMaxEnergyDigiPosVSEnergy->Fill(
302 (cluster.GetForemostHit().GetPosition() - cluster.GetMaxEnergyHit().GetPosition()).Mag(),
305 fhClusterCentroidMinusFirstDigiPosVSEnergy->Fill(
306 (cluster.GetEnergyCentroid() - cluster.GetFirstHit().GetPosition()).Mag(), cluster.GetE());
308 fhClusterMaxEnergyDigiMinusFirstDigiPosVSEnergy->Fill(
309 (cluster.GetMaxEnergyHit().GetPosition() - cluster.GetFirstHit().GetPosition()).Mag(), cluster.GetE());
310 fhClusterMaxEnergyDigiMinusCentroidVSEnergy->Fill(
311 (cluster.GetMaxEnergyHit().GetPosition() - cluster.GetEnergyCentroid()).Mag(), cluster.GetE());
312 fhClusterEnergyMomentVSEnergy->Fill(cluster.GetEnergyMoment(), cluster.GetE());
313 fhClusterEnergyMomentVSClusterSize->Fill(cluster.GetEnergyMoment(), cluster.GetSize());
315 fhClusterLastMinusFirstDigiMagVSEnergy->Fill(
316 (cluster.GetLastHit().GetPosition() - cluster.GetFirstHit().GetPosition()).Mag(), cluster.GetE());
318 fhClusterEnergyMoment->Fill(cluster.GetEnergyMoment());
319 fhClusterMaxEnergyDigiMinusFirstDigiMag->Fill(
320 (cluster.GetMaxEnergyHit().GetPosition() - cluster.GetFirstHit().GetPosition()).Mag());
323 fhZ->Fill(cluster.GetFirstHit().GetPosition().Z());
324 fhZVSEToF->Fill(cluster.GetFirstHit().GetPosition().Z(), cluster.GetEToF());
325 fhDistFromCenter->Fill(std::sqrt(std::pow(cluster.GetFirstHit().GetPosition().X(), 2) +
326 std::pow(cluster.GetFirstHit().GetPosition().Y(), 2)));
327 fhDistFromCenterVSEToF->Fill(std::sqrt(std::pow(cluster.GetFirstHit().GetPosition().X(), 2) +
328 std::pow(cluster.GetFirstHit().GetPosition().Y(), 2)),
330 fhDeltaT->Fill(cluster.GetLastHit().GetT() - cluster.GetFirstHit().GetT());
332 fhForemostMinusFirstDigiTime->Fill(cluster.GetForemostHit().GetT() - cluster.GetFirstHit().GetT());
334 if (cluster.GetSize() > 4)
336 const auto theta =
GetTheta(cluster);
337 for (
const auto& digi : cluster.GetHits())
339 fhThetaEDigi->Fill(theta, digi.GetE());
340 fhThetaEDigiCosTheta->Fill(theta, digi.GetE() * std::cos(theta / rad2deg));
345 std::sort(fNeulandClustersBuffer.begin(),
346 fNeulandClustersBuffer.end(),
349 for (
const auto& cluster : fNeulandClustersBuffer)
351 if (cluster.GetSize() >= 3)
355 fhClusterEnergyVSScatteredRecoilAngle->Fill(cluster.GetE(),
360 for (
auto ita = fNeulandClustersBuffer.cbegin(); ita != fNeulandClustersBuffer.cend(); ita++)
362 for (
auto itb = ita + 1; itb != fNeulandClustersBuffer.cend(); itb++)
371 fhEToFVSEelastic->Fill((*ita).GetFirstHit().GetEToF(), EelasticHeavy);
378 fhClusterEnergyVSScatteredNeutronAngle->Fill((*ita).GetE(),
381 if ((*ita).GetSize() >= 3)
385 fhSumAngleVSRatioErecoEtof->Fill(
394 for (
const auto& cluster : fNeulandClustersBuffer)
396 const auto& digis = cluster.GetHits();
397 for (
auto it1 = digis.begin(); it1 != digis.end(); it1++)
399 for (
auto it2 = it1 + 1; it2 != digis.end(); it2++)
401 if (std::abs(it1->GetPosition().X() - it2->GetPosition().X()) < 7.5 &&
402 std::abs(it1->GetPosition().Y() - it2->GetPosition().Y()) < 7.5 &&
403 std::abs(it1->GetPosition().Z() - it2->GetPosition().Z()) < 7.5)
405 hTNeigh->Fill(std::abs(it1->GetT() - it2->GetT()));
407 hT->Fill(std::abs(it1->GetT() - it2->GetT()));
415 TDirectory* tmp = gDirectory;
416 FairRootManager::Instance()->GetOutFile()->cd();
418 gDirectory->mkdir(fOutput);
419 gDirectory->cd(fOutput);
422 fhClusterSize->Write();
423 fhClusterEnergyVSSize->Write();
424 fhClusterEnergy->Write();
425 fhClusterRValue->Write();
426 fhClusterTime->Write();
427 fhClusterNumberVSEnergy->Write();
428 fhClusterEToF->Write();
429 fhClusterEToFVSEnergy->Write();
430 fhClusterEToFVSTime->Write();
431 fhElasticTargetMass->Write();
433 fhClusterSizeVSEToF->Write();
434 fhClusterEnergyVSEToF->Write();
437 fhClusterForemostMinusCentroidVSEnergy->Write();
438 fhClusterForemostMinusMaxEnergyDigiPosVSEnergy->Write();
439 fhClusterCentroidMinusFirstDigiPosVSEnergy->Write();
440 fhClusterMaxEnergyDigiMinusFirstDigiPosVSEnergy->Write();
441 fhClusterMaxEnergyDigiMinusCentroidVSEnergy->Write();
442 fhClusterEnergyMomentVSEnergy->Write();
443 fhClusterEnergyMomentVSClusterSize->Write();
444 fhClusterEVSTime->Write();
445 fhClusterEnergyMoment->Write();
446 fhClusterMaxEnergyDigiMinusFirstDigiMag->Write();
447 fhClusterLastMinusFirstDigiMagVSEnergy->Write();
449 fhENFromScatterVSEToF->Write();
451 fhEToFVSEelastic->Write();
452 fhScatteredNEnergyVSAngle->Write();
453 fhScatteredNEnergyVSEdep->Write();
454 fhScatterAngleVSRecoilAngle->Write();
455 fhSumAngleVSRatioErecoEtof->Write();
456 fhClusterEnergyVSScatteredRecoilAngle->Write();
457 fhClusterEnergyVSScatteredNeutronAngle->Write();
461 fhDistFromCenter->Write();
462 fhDistFromCenterVSEToF->Write();
464 fhForemostMinusFirstDigiTime->Write();
466 fhThetaEDigi->Write();
467 fhThetaEDigiCosTheta->Write();