12 memset(fKilled, 0,
sizeof(fKilled));
13 memset(fCorrLR, 0,
sizeof(fCorrLR));
14 memset(fCorrTimeShift, 0,
sizeof(fCorrTimeShift));
19 fFillHist = fill_hist;
23 fSignalVelosity = 0.06;
26 fSignalVelosity = 0.0585;
28 fMaxDelta = (fStripLength * 0.5 + 3.0) * fSignalVelosity;
31 for (Int_t
i = 0;
i < fNStrMax;
i++) {
32 fSignalVelosityStr[
i] = fSignalVelosity;
39 fName = Form(
"TOF400_Plane_%d", NPlane);
41 fName = Form(
"TOF700_Plane_%d", NPlane);
45 fHistListStat =
new TList();
46 fHistListdt =
new TList();
49 Name = Form(
"Hist_HitByCh_%s", fName.Data());
50 hHitByCh =
new TH1I(Name, Name, fNStrMax + 1, -0.5, fNStrMax + 0.5);
51 fHistListStat->Add(hHitByCh);
54 Name = Form(
"Hist_HitPerEv_%s", fName.Data());
55 hHitPerEv =
new TH1I(Name, Name, fNStrMax + 1, -0.5, fNStrMax + 0.5);
56 fHistListStat->Add(hHitPerEv);
59 Name = Form(
"Hist_HitLR_%s", fName.Data());
60 hHitLR =
new TH2I(Name, Name, fNStrMax, 0, fNStrMax, fNStrMax, 0, fNStrMax);
61 fHistListStat->Add(hHitLR);
64 Name = Form(
"Hist_XY_%s", fName.Data());
65 hXY =
new TH2I(Name, Name, 400, -250, 250, 120, -75, 75);
66 fHistListStat->Add(hXY);
68 hDy_near =
new TH1S(Form(
"hDy_near_%s", fName.Data()), Form(
"hDy_near_%s", fName.Data()), 400, -20, 20);
70 new TH1S(Form(
"hDtime_near_%s", fName.Data()), Form(
"hDtime_near_%s", fName.Data()), 400, -10, 10);
72 new TH1S(Form(
"hDWidth_near_%s", fName.Data()), Form(
"hDWidth_near_%s", fName.Data()), 256, -28., 28.);
73 hTempDtimeDy_near =
new TH2S(Form(
"hTempDtimeDy_near_%s", fName.Data()),
74 Form(
"hTempDtimeDy_near_%s", fName.Data()), 400, -10, 10, 200, -10, 10);
75 hDy_acros =
new TH1S(Form(
"hDy_acros_%s", fName.Data()), Form(
"hDy_acros_%s", fName.Data()), 400, -20, 20);
77 new TH1S(Form(
"hDtime_acros_%s", fName.Data()), Form(
"hDtime_acros_%s", fName.Data()), 400, -10, 10);
79 new TH1S(Form(
"hDWidth_acros_%s", fName.Data()), Form(
"hDWidth_acros_%s", fName.Data()), 256, -28., 28.);
80 hTempDtimeDy_acros =
new TH2S(Form(
"hTempDtimeDy_acros_%s", fName.Data()),
81 Form(
"hTempDtimeDy_acros_%s", fName.Data()), 400, -10, 10, 200, -10, 10);
82 fHistListStat->Add(hDy_near);
83 fHistListStat->Add(hDtime_near);
84 fHistListStat->Add(hDWidth_near);
85 fHistListStat->Add(hTempDtimeDy_near);
86 fHistListStat->Add(hDy_acros);
87 fHistListStat->Add(hDtime_acros);
88 fHistListStat->Add(hDWidth_acros);
89 fHistListStat->Add(hTempDtimeDy_acros);
91 for (Int_t
i = 0;
i < fNStrMax + 1;
i++) {
93 new TH2S(Form(
"dt_vs_WidthDet_str_%d_%s",
i, fName.Data()),
94 Form(
"dt_vs_WidthDet_str_%d_%s",
i, fName.Data()), 1024, 0, 50, 1024, -12, 12);
95 fHistListdt->Add(hdT_vs_WidthDet[
i]);
97 for (Int_t
i = 0;
i < fNStrMax + 1;
i++) {
98 hdT_vs_WidthT0[
i] =
new TH2S(Form(
"dt_vs_WidthT0_str_%d_%s",
i, fName.Data()),
99 Form(
"dt_vs_WidthT0_str_%d_%s",
i, fName.Data()), 1024, 0, 50, 1024, -12, 12);
100 fHistListdt->Add(hdT_vs_WidthT0[
i]);
102 for (Int_t
i = 0;
i < fNStrMax + 1;
i++) {
104 new TH1I(Form(
"dt_str_%d_%s",
i, fName.Data()), Form(
"dt_str_%d_%s",
i, fName.Data()), 1024, -12, 12);
105 fHistListdt->Add(hdT[
i]);
118 hTempDtimeDy_near = NULL;
121 hDWidth_acros = NULL;
122 hTempDtimeDy_acros = NULL;
124 for (Int_t
i = 0;
i < fNStrMax + 1;
i++) {
125 hdT_vs_WidthDet[
i] = NULL;
126 hdT_vs_WidthT0[
i] = NULL;
137 memset(fTimeL, 0,
sizeof(fTimeL));
138 memset(fTimeR, 0,
sizeof(fTimeR));
139 memset(fTimeLtemp, 0,
sizeof(fTimeLtemp));
140 memset(fTimeRtemp, 0,
sizeof(fTimeRtemp));
141 memset(fTime, 0,
sizeof(fTime));
142 memset(fWidthL, 0,
sizeof(fWidthL));
143 memset(fWidthR, 0,
sizeof(fWidthR));
144 memset(fWidthLtemp, 0,
sizeof(fWidthLtemp));
145 memset(fWidthRtemp, 0,
sizeof(fWidthRtemp));
146 memset(fWidth, 0,
sizeof(fWidth));
147 memset(fFlagHit, 0,
sizeof(fFlagHit));
148 memset(fTof, 0,
sizeof(fTof));
149 memset(fDigitL, 0,
sizeof(fDigitL));
150 memset(fDigitR, 0,
sizeof(fDigitR));
151 memset(fHit, 0,
sizeof(fHit));
152 memset(fIndexL, 0,
sizeof(fIndexL));
153 memset(fIndexR, 0,
sizeof(fIndexR));
157 vHitsL.reserve(fNStrMax);
158 vHitsL.resize(fNStrMax);
161 vHitsR.reserve(fNStrMax);
162 vHitsR.resize(fNStrMax);
164 for (Int_t
i = 0;
i < fNStrMax;
i++) {
165 fCrossPoint[
i].SetXYZ(0., 0., 0.);
177 if (fStrip < 0 || fStrip > fNStr || fKilled[fStrip])
182 <<
" Plane = " << TofDigit->
GetPlane() <<
"; Strip " << TofDigit->
GetStrip() <<
"; Side "
185 if (TofDigit->
GetSide() == 0 && fKillSide != 0)
186 fTimeLtemp[fStrip] = TofDigit->
GetTime() - 2. * fCorrLR[fStrip];
187 else if (TofDigit->
GetSide() == 1 && fKillSide != 1)
188 fTimeLtemp[fStrip] = TofDigit->
GetTime();
193 cout <<
"Setting Shift: strip # " << fStrip <<
" shift val " << fCorrLR[fStrip] <<
"; shifted timeL "
194 << fTimeLtemp[fStrip] <<
"\n";
198 fIndexLtemp[fStrip] = ind;
200 std::vector<Double_t> tempVector;
201 tempVector.reserve(3);
202 tempVector.push_back(fTimeLtemp[fStrip]);
203 tempVector.push_back(fWidthLtemp[fStrip]);
204 tempVector.push_back(ind);
206 if (TofDigit->
GetSide() == 0) {
207 vHitsL.at(fStrip).push_back(tempVector);
211 vHitsR.at(fStrip).push_back(tempVector);
215 vHitsR.at(fStrip).push_back(tempVector);
219 vHitsL.at(fStrip).push_back(tempVector);
231 fKilled[NumberOfStrip] = kTRUE;
238 fKillSide = NumberOfSide;
252 cout << endl <<
" Plane " << fNPlane << endl;
253 for (Int_t
i = 0;
i < fNStr;
i++) {
254 if (vHitsL[
i].empty() || vHitsR[
i].empty())
257 cout <<
" Strip " <<
i << endl;
259 for (Int_t iL = 0; iL < (int)vHitsL.at(
i).size(); iL++)
260 for (Int_t iR = 0; iR < (int)vHitsR.at(
i).size(); iR++) {
262 fTimeL[
i] = vHitsL.at(
i).at(iL).at(0);
263 fTimeR[
i] = vHitsR.at(
i).at(iR).at(0);
265 fWidthL[
i] = vHitsL.at(
i).at(iL).at(1);
266 fWidthR[
i] = vHitsR.at(
i).at(iR).at(1);
268 fIndexL[
i] = vHitsL.at(
i).at(iL).at(2);
269 fIndexR[
i] = vHitsR.at(
i).at(iR).at(2);
272 cout <<
"iL = " << iL <<
": time = " << fTimeL[
i] <<
"; amp = " << fWidthL[
i]
273 <<
"; ind = " << fIndexL[
i] << endl;
274 cout <<
"iR = " << iR <<
": time = " << fTimeR[
i] <<
"; amp = " << fWidthR[
i]
275 <<
"; ind = " << fIndexR[
i] << endl;
277 if (!GetCrossPoint(
i, fTimeL[
i], fTimeR[
i]))
280 fWidth[
i] = fWidthL[
i] + fWidthR[
i];
281 fTime[
i] = (fTimeL[
i] + fTimeR[
i]) * 0.5;
282 fTof[
i] = CalculateDt(
i);
286 if (fVerbose > 2 || printnow != 0)
287 printf(
"Hit on Plane#%d Strip#%d\n\tTime = %.3f; (X,Y,Z) = %.3f, %.3f, %.3f\n", fNPlane,
i,
288 fTof[
i], fCrossPoint[
i].X(), fCrossPoint[
i].Y(), fCrossPoint[
i].Z());
290 hdT_vs_WidthDet[
i]->Fill(fWidth[
i], fTof[
i]);
291 hdT_vs_WidthT0[
i]->Fill(fT0->
GetAmp(), fTof[
i]);
292 hdT[
i]->Fill(fTof[
i]);
293 hdT_vs_WidthDet[fNStr]->Fill(fWidth[
i], fTof[
i]);
294 hdT_vs_WidthT0[fNStr]->Fill(fT0->
GetAmp(), fTof[
i]);
295 hdT[fNStr]->Fill(fTof[
i]);
297 if (fFlagHit[
i - 1] == kTRUE) {
298 hDy_near->Fill(fCrossPoint[
i].Y() - fCrossPoint[
i - 1].Y());
299 hDtime_near->Fill(fTof[
i] - fTof[
i - 1]);
300 hDWidth_near->Fill(fWidth[
i] - fWidth[
i - 1]);
301 hTempDtimeDy_near->Fill(fTof[
i] - fTof[
i - 1], fCrossPoint[
i].Y() - fCrossPoint[
i - 1].Y());
304 if (fFlagHit[
i - 2] == kTRUE) {
305 hDy_acros->Fill(fCrossPoint[
i].Y() - fCrossPoint[
i - 2].Y());
306 hDtime_acros->Fill(fTof[
i] - fTof[
i - 2]);
307 hDWidth_acros->Fill(fWidth[
i] - fWidth[
i - 2]);
308 hTempDtimeDy_acros->Fill(fTof[
i] - fTof[
i - 2],
309 fCrossPoint[
i].Y() - fCrossPoint[
i - 2].Y());
312 TString Name = TofHit->GetClass()->GetName();
313 if (Name ==
"BmnTofHit") {
316 }
else if (Name ==
"BmnTOF1Conteiner") {
318 AddConteiner(
i, TofHit);
329 printf(
"Total number of hits on Plane#%d is %d\n\n", fNPlane, fHit_Per_Ev);
335void BmnTOF1Detector::AddHit(Int_t Str, TClonesArray* TofHit)
338 fVectorTemp.SetXYZ(0.5, 0.36, 1.);
341 BmnTofHit* pHit =
new ((*TofHit)[TofHit->GetEntriesFast()])
342 BmnTofHit(UID, fCrossPoint[Str], fVectorTemp, FormIndex(fIndexL[Str], fIndexR[Str]));
346 pHit->SetTimeStamp(fTof[Str]);
347 pHit->AddLink(FairLink(0x1, -1));
348 pHit->AddLink(FairLink(0x2, -1));
349 pHit->AddLink(FairLink(0x4, UID));
360void BmnTOF1Detector::AddConteiner(Int_t Str, TClonesArray* TofHit)
363 new ((*TofHit)[TofHit->GetEntriesFast()])
364 BmnTOF1Conteiner(fNPlane, Str, fTimeL[Str], fTimeR[Str], fTime[Str], fWidthL[Str], fWidthR[Str], fWidth[Str],
365 fCrossPoint[Str].x(), fCrossPoint[Str].y(), fCrossPoint[Str].z(), fT0->
GetTime(),
366 fT0->
GetAmp(), fTof[Str], fIndexL[Str], fIndexR[Str]);
371void BmnTOF1Detector::FillHist()
373 hHitPerEv->Fill(fHit_Per_Ev);
374 for (Int_t
i = 0;
i < fNStr;
i++)
375 for (Int_t j = 0; j < fNStr; j++) {
376 if (fWidthL[
i] != 0 && fWidthR[j] != 0) {
380 hXY->Fill(fCrossPoint[
i].x(), fCrossPoint[
i].y());
388Double_t BmnTOF1Detector::CalculateDt(Int_t Str = 0)
393 dt = fTime[Str] - fT0->
GetTime() + fCommonTimeShift;
395 printf(
"Calculate dt\n raw dt = %.3f\n", dt);
402 if (funT0[Str] != NULL)
403 dt = dt - funT0[Str]->Eval(T0Amp);
405 printf(
"After T0 corr dt = %.3f\t", dt);
407 if (gSlew[Str] != NULL) {
408 dt = dt - gSlew[Str]->Eval(fWidth[Str]);
410 printf(
"After RPC corr dt = %.3f\t", dt);
413 if (funRPC[Str] != NULL) {
414 dt = dt - funRPC[Str]->Eval(fWidth[Str]);
416 printf(
"After RPC corr dt = %.3f\t", dt);
419 dt = dt + fCorrTimeShift[Str];
421 printf(
"After Shift on Proton mass dt = %.3f\n", dt);
433 return fHistListStat;
454 Double_t CorrFit, CorrMean;
456 TString dir = Form(
"%s%s%s", getenv(
"VMCWORKDIR"),
"/input/", NameFile.Data());
459 f_corr.getline(line, 256);
460 f_corr.getline(line, 256);
461 if (f_corr.is_open() == kTRUE) {
462 while (!f_corr.eof()) {
464 f_corr >> Pl >> St >> CorrFit >> CorrMean;
466 f_corr >> Pl >> St >> CorrMean;
468 fCorrLR[St] = CorrMean;
476 cout <<
"File " << NameFile.Data() <<
" for LR correction is not found" << endl;
477 cout <<
"Check " << dir.Data() <<
" folder for file" << endl;
487 TString PathToFile = Form(
"%s%s%s", getenv(
"VMCWORKDIR"),
"/input/", NameFile.Data());
488 TString name, dirname;
490 TFile* f_corr =
new TFile(PathToFile.Data(),
"READ");
491 if (f_corr->IsOpen()) {
492 dirname = Form(
"Plane_%d", fNPlane);
493 f_corr->cd(dirname.Data());
494 Dir = f_corr->CurrentDirectory();
495 for (Int_t
i = 0;
i < fNStr;
i++) {
496 name = Form(
"T0_TA_Plane%d_Str%d", fNPlane,
i);
497 funT0[
i] = (TF1*)Dir->Get(name.Data());
498 if (funT0[
i] == NULL && fVerbose >= 1)
499 printf(
"funT0[%d] is NULL\n",
i);
500 name = Form(
"Rpc_TA_Plane%d_Str%d", fNPlane,
i);
501 gSlew[
i] = (TGraphErrors*)Dir->Get(name.Data());
502 if (gSlew[
i] == NULL && fVerbose >= 1)
503 printf(
"gSlew[%d] is NULL\n",
i);
506 cout <<
"File " << NameFile.Data() <<
" for Slewing correction is not found" << endl;
507 cout <<
"Check " << PathToFile.Data() <<
" folder for file" << endl;
521 TString dir = Form(
"%s%s%s", getenv(
"VMCWORKDIR"),
"/input/", NameFile.Data());
523 f_corr.getline(line, 256);
526 f_corr.getline(line, 256);
528 fCommonTimeShift = atof(line);
531 f_corr.getline(line, 256);
537 if (f_corr.is_open() == kTRUE) {
538 while (!f_corr.eof()) {
539 f_corr >> Pl >> St >> Temp;
541 fCorrTimeShift[St] = Temp;
546 cout <<
"File " << NameFile.Data() <<
" for TimeShift correction is not found" << endl;
547 cout <<
"Check " << dir.Data() <<
" folder for file" << endl;
556Bool_t BmnTOF1Detector::GetCrossPoint(Int_t NStrip, Double_t tL, Double_t tR)
559 fVectorTemp.SetXYZ(0., 0., 0.);
561 double dtt = (tL - tR) * 0.5;
562 double dL = dtt / fSignalVelosityStr[NStrip];
571 fVectorTemp(0) = dL * TMath::Cos(fStripAngle[NStrip].X());
572 fVectorTemp(1) = dL * TMath::Cos(fStripAngle[NStrip].Y());
573 fVectorTemp(2) = dL * TMath::Cos(fStripAngle[NStrip].Z());
575 fCrossPoint[NStrip].SetXYZ(0., 0., 0.);
576 fCrossPoint[NStrip] = fCentrStrip[NStrip] + fVectorTemp;
588 TString PathToFile = Form(
"%s%s%s", getenv(
"VMCWORKDIR"),
"/macro/run/geometry_run/", NameFile.Data());
589 TFile* geoFile =
new TFile(PathToFile,
"READ");
590 if (!geoFile->IsOpen()) {
591 cout <<
"Error: could not open ROOT file with geometry: " + NameFile << endl;
594 TList* keyList = geoFile->GetListOfKeys();
596 TKey* key = (TKey*)next();
597 TString className(key->GetClassName());
598 if (className.BeginsWith(
"TGeoManager"))
601 cout <<
"Error: TGeoManager isn't top element in geometry file " + NameFile << endl;
616 pGeoUtils->~BmnTof1GeoUtils();
628 for (Int_t
i = 0;
i < fNStrMax;
i++) {
632 if (pStrip == NULL) {
638 fCentrStrip[
i] = pStrip->
center;
641 fVectorTemp = (pStrip->
C + pStrip->
D) * 0.5 - (pStrip->
A + pStrip->
B) * 0.5;
643 fVectorTemp = (pStrip->
B + pStrip->
C) * 0.5 - (pStrip->
A + pStrip->
D) * 0.5;
647 fStripAngle[
i](0) = fVectorTemp.Angle(x);
648 fStripAngle[
i](1) = fVectorTemp.Angle(y);
649 fStripAngle[
i](2) = fVectorTemp.Angle(z);
665 if (Str < 0 || Str > fNStr)
668 XYZ->SetXYZ(fCrossPoint[Str].x(), fCrossPoint[Str].y(), fCrossPoint[Str].z());
681 if (NULL == LMinusRTime)
683 *LMinusRTime = (fTimeL[Str] - fTimeR[Str]) * 0.5;
721 TFile* fileout =
new TFile(NameFile.Data(),
"UPDATE");
726 Name = Form(
"Tof400_%s", fName.Data());
727 Dir = fileout->mkdir(Name.Data());
732 DirStat = Dir->mkdir(
"Statistic");
736 fHistListStat->Write();
740 DirdT = Dir->mkdir(
"dt");
744 fHistListdt->Write();
756Int_t BmnTOF1Detector::FormIndex(Int_t IndL, Int_t IndR)
758 if (IndL > fHalfMaxInt || IndR > fHalfMaxInt)
761 Index = (IndL << 16) + IndR;
773 TString dir = Form(
"%s%s%s", getenv(
"VMCWORKDIR"),
"/input/", NameFile.Data());
775 f_corr.getline(line, 256);
778 if (f_corr.is_open() == kTRUE) {
779 while (!f_corr.eof()) {
780 f_corr >> Pl >> St >> Temp;
781 if (Pl == fNPlane && St == fNStr) {
782 fSignalVelosity = Temp;
783 fMaxDelta = (fStripLength * 0.5 + 3.0) * fSignalVelosity;
787 if (Pl == fNPlane && St < fNStr) {
788 fSignalVelosityStr[St] = Temp;
792 cout <<
"File " << NameFile.Data() <<
" for TimeShift correction is not found" << endl;
793 cout <<
"Check " << dir.Data() <<
" folder for file" << endl;
void memset(T *dest, T i, size_t num)
uses binary expansion of copied volume for speed up
void SetModule(Int_t mod)
void SetUpperClusterIndex(Int_t idx)
void SetDetId(DetectorId det)
void SetStation(Short_t st)
void SetLowerClusterIndex(Int_t idx)
Bool_t GetXYZTime(Int_t Str, TVector3 *XYZ, Double_t *ToF)
void SetStripLength(Double_t l)
Bool_t SetGeoFile(TString NameFile)
Int_t FindHitsNew(BmnTrigDigit *T0, TClonesArray *TofHit, int printnaw)
Bool_t SetCorrLR(TString NameFile)
void KillSide(Int_t NumberOfSide)
Double_t GetWidth(Int_t Str)
Bool_t GetLRTime(Int_t Str, Double_t *LMinusRTime)
Bool_t SetCorrTimeShift(TString NameFile)
Double_t GetWidthR(Int_t Str)
void KillStrip(Int_t NumberOfStrip)
Bool_t SetDigitNew(BmnTof1Digit *TofDigit, Int_t ind=-1)
Double_t GetTime(Int_t Str)
Double_t GetWidthL(Int_t Str)
Bool_t SetGeo(BmnTof1GeoUtils *pGeoUtils)
Bool_t SetSpeedOfSignal(TString NameFile)
Bool_t SetCorrSlewing(TString NameFile)
Bool_t SaveHistToFile(TString NameFile)
Int_t GetVolumeUID() const
Float_t GetAmplitude() const
const LStrip1 * FindStrip(Int_t UID)
Int_t ParseTGeoManager701(bool useMCinput, bool forced=false, Int_t verbose=0)
Int_t ParseTGeoManager(bool useMCinput, bool forced=false, Int_t verbose=0)
Double_t GetLength() const