-
Notifications
You must be signed in to change notification settings - Fork 105
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implementation of the Tprev/Tnext task. #892
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
/****************************************************************************** | ||
* Copyright (C) 2019 GSI Helmholtzzentrum für Schwerionenforschung GmbH * | ||
* Copyright (C) 2019-2023 Members of R3B Collaboration * | ||
* * | ||
* This software is distributed under the terms of the * | ||
* GNU General Public Licence (GPL) version 3, * | ||
* copied verbatim in the file "LICENSE". * | ||
* * | ||
* In applying this license GSI does not waive the privileges and immunities * | ||
* granted to it by virtue of its status as an Intergovernmental Organization * | ||
* or submit itself to any jurisdiction. * | ||
******************************************************************************/ | ||
|
||
#include "R3BTprevTnext.h" | ||
#include "FairLogger.h" | ||
#include "FairRootManager.h" | ||
#include "FairRunAna.h" | ||
#include "FairRuntimeDb.h" | ||
#include "R3BEventHeader.h" | ||
#include "R3BMSOffsetPar.h" | ||
#include "R3BSamplerMappedData.h" | ||
#include "R3BShared.h" | ||
#include "TClonesArray.h" | ||
#include "TMath.h" | ||
#include "TObjArray.h" | ||
#include "TRandom.h" | ||
#include <cstdlib> | ||
#include <iostream> | ||
R3BTprevTnext::R3BTprevTnext() | ||
: R3BTprevTnext("R3B Tprev/Tnext", 1) | ||
{ | ||
} | ||
|
||
R3BTprevTnext::R3BTprevTnext(const TString& name, Int_t iVerbose) | ||
: FairTask(name, iVerbose) | ||
{ | ||
} | ||
|
||
InitStatus R3BTprevTnext::Init() | ||
{ | ||
|
||
FairRootManager* rootManager = FairRootManager::Instance(); | ||
if (rootManager == nullptr) | ||
{ | ||
LOG(error) << "FairRootManager not opened!"; | ||
return kFATAL; | ||
} | ||
|
||
FairRuntimeDb* rtdb = FairRuntimeDb::instance(); | ||
if (rtdb == nullptr) | ||
{ | ||
LOG(error) << "FairRuntimeDb not opened!"; | ||
return kFATAL; | ||
} | ||
|
||
fR3BEventHeader = dynamic_cast<R3BEventHeader*>(rootManager->GetObject("EventHeader.")); | ||
if (fR3BEventHeader == nullptr) | ||
{ | ||
LOG(error) << "R3BTprevTnext::Init() EventHeader. not found"; | ||
return kFATAL; | ||
} | ||
|
||
fSamplerMapped = dynamic_cast<TClonesArray*>(rootManager->GetObject("SamplerMapped")); | ||
if (fSamplerMapped == nullptr) | ||
{ | ||
LOG(error) << "SamplerMapped not found or wrong type."; | ||
return kFATAL; | ||
} | ||
|
||
fSamplerMSMapped = dynamic_cast<TClonesArray*>(rootManager->GetObject("SamplerMSMapped")); | ||
if (fSamplerMSMapped == nullptr) | ||
{ | ||
LOG(error) << "SamplerMSMapped not found or wrong type."; | ||
return kFATAL; | ||
} | ||
|
||
fMSOffsetPar = dynamic_cast<R3BMSOffsetPar*>(rtdb->getContainer("MSOffsetPar")); | ||
if (fMSOffsetPar == nullptr) | ||
{ | ||
LOG(error) << "Could not find MSOffsetPar container!"; | ||
return kFATAL; | ||
} | ||
|
||
return kSUCCESS; | ||
} | ||
|
||
void R3BTprevTnext::Exec(Option_t* /*opt*/) | ||
{ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. constexpr auto NOTFOUND = -10.0; If you ever return these, I would make the constants a public part of the class interface. If you only use them internally, put them with CLOCK_PERIOD. |
||
Double_t fTprev = INVALID_TPTN; // Initialization with invalid values. | ||
Double_t fTnext = INVALID_TPTN; | ||
Int_t dMScounter = 0; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. First, please add // number of sampler hits in coincidence with MS |
||
const Int_t sampHits = fSamplerMapped->GetEntriesFast(); | ||
const Int_t sampmsHits = fSamplerMSMapped->GetEntriesFast(); | ||
const Double_t MSOffset = fMSOffsetPar->GetMSOffset(); | ||
Double_t SAMPTime = 0; | ||
Double_t SAMPMSTime = 0; | ||
if (sampmsHits == 1 && sampHits > 0) | ||
{ | ||
R3BSamplerMappedData* SAMPMapped = nullptr; | ||
R3BSamplerMappedData* SAMPMSMapped = nullptr; | ||
SAMPMSMapped = dynamic_cast<R3BSamplerMappedData*>(fSamplerMSMapped->At(0)); | ||
SAMPMSTime = SAMPMSMapped->GetTime(); | ||
for (Int_t i = 0; i < sampHits; ++i) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe put this for-loop into another member function and give it a nice name indicating the meaning? |
||
{ | ||
SAMPMapped = dynamic_cast<R3BSamplerMappedData*>(fSamplerMapped->At(i)); | ||
SAMPTime = SAMPMapped->GetTime(); | ||
auto tpn = SAMPTime - SAMPMSTime - MSOffset; | ||
if (tpn < -fDelta_clk) | ||
{ | ||
fTprev = -CLOCK_PERIOD * tpn; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. While I am not sure that the above code is correct as is, I am sure that the code could be simplified. This way, iff fTPrev or fTNext or both are never set, they automatically contain the invalid value. Also, if sawMS is false for more than a small fraction of events, then something terrible has happened (likely the offset is wrong). We should complain periodically with LOG(error). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, seems like a good idea, but again, I need some time to understand completely. But I will come with something |
||
if (abs(tpn) <= fDelta_clk) | ||
{ | ||
++dMScounter; | ||
} | ||
if (tpn > fDelta_clk) | ||
{ | ||
fTnext = CLOCK_PERIOD * tpn; | ||
break; | ||
} | ||
} | ||
} | ||
else | ||
{ | ||
This comment was marked as resolved.
Sorry, something went wrong. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You are right |
||
fR3BEventHeader->SetTprev(INVALID_EVENT); | ||
fR3BEventHeader->SetTnext(INVALID_EVENT); | ||
return; | ||
} | ||
|
||
if (dMScounter == | ||
0) // This if statement checks if there is no Hit correspondent to the MSHit even after the first if statement | ||
{ | ||
fTprev = ERROR_NO_MS; | ||
fTnext = ERROR_NO_MS; | ||
} | ||
else if (dMScounter > 1) | ||
{ | ||
fTprev = ERROR_MULTI_MS; | ||
fTnext = ERROR_MULTI_MS; | ||
} | ||
else if (dMScounter == 1) | ||
{ | ||
if (fTprev == INVALID_TPTN) | ||
{ | ||
fTprev = fNo_record_time; | ||
} | ||
if (fTnext == INVALID_TPTN) | ||
{ | ||
fTnext = fNo_record_time; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would replace the last if block with:
That way, whenever there is no previous/next hit, the "NoRecord" value will be used. For the special case of one hit (no previous and no next hit), both of these will automatically be set to that value. |
||
} | ||
fR3BEventHeader->SetTprev(fTprev); | ||
fR3BEventHeader->SetTnext(fTnext); | ||
} | ||
|
||
ClassImp(R3BTprevTnext) // NOLINT |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/****************************************************************************** | ||
* Copyright (C) 2019 GSI Helmholtzzentrum für Schwerionenforschung GmbH * | ||
* Copyright (C) 2019-2023 Members of R3B Collaboration * | ||
* * | ||
* This software is distributed under the terms of the * | ||
* GNU General Public Licence (GPL) version 3, * | ||
* copied verbatim in the file "LICENSE". * | ||
* * | ||
* In applying this license GSI does not waive the privileges and immunities * | ||
* granted to it by virtue of its status as an Intergovernmental Organization * | ||
* or submit itself to any jurisdiction. * | ||
******************************************************************************/ | ||
|
||
#pragma once | ||
|
||
#include "FairTask.h" | ||
#include "R3BMSOffsetPar.h" | ||
class TClonesArray; | ||
class R3BMSOffsetPar; | ||
class R3BEventHeader; | ||
class R3BSamplerMappedData; | ||
class R3BTprevTnext : public FairTask | ||
{ | ||
public: | ||
/** Default constructor **/ | ||
R3BTprevTnext(); | ||
|
||
/** Standard constructor **/ | ||
explicit R3BTprevTnext(const TString& name, Int_t iVerbose = 1); | ||
|
||
/** Virtual method Init **/ | ||
InitStatus Init() override; | ||
|
||
/** Virtual method Exec **/ | ||
void Exec(Option_t* opt) override; | ||
|
||
void SetNoRecordTimeGap(Double_t No_Record_Time_Gap) | ||
{ | ||
fNo_record_time = No_Record_Time_Gap; | ||
} // Setter for a value of Tprev/Tnext if there is no recorded hit before and/or after the MS | ||
void SetDelta_clk(Double_t clock) { fDelta_clk = clock; } | ||
|
||
static constexpr auto CLOCK_PERIOD = 10; // ns | ||
static constexpr auto ERROR_NO_MS = -30; // Assigned value for events where there is no MS | ||
static constexpr auto INVALID_TPTN = -10; // Assigned value for invalid or nonexistent TPrev or TNext | ||
static constexpr auto ERROR_MULTI_MS = -20; // Assigned value for events where there are multiple MS | ||
static constexpr auto INVALID_EVENT = -40; // Assigned value for events where the MS was not correctly written | ||
private: | ||
R3BMSOffsetPar* fMSOffsetPar = nullptr; | ||
TClonesArray* fSamplerMapped = nullptr; | ||
TClonesArray* fSamplerMSMapped = nullptr; | ||
R3BEventHeader* fR3BEventHeader = nullptr; /**< Event header - input data. */ | ||
Double_t fDelta_clk = 1.0; | ||
Double_t fNo_record_time = 2e3; | ||
|
||
ClassDefOverride(R3BTprevTnext, 1); // NOLINT | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would prefer if you did one of the following:
assert(fSamplerMapped)
If you just return kFATAL, FairRoot is (hopefully) going to report which initialization of a Task failed, but not why exactly.