////////////////////////////////////////////////////////// // This class has been automatically generated on // Wed May 8 14:49:52 2019 by ROOT version 6.10/06 // from TTree tier2/tier2 // found on file: b19035/Th/NonCollimated/Side/Tier2_tom/20180418-065541-Tier2.root ////////////////////////////////////////////////////////// #ifndef macro01_h #define macro01_h #include #include #include #include #include #include #include // Headers needed by this particular selector #include "TString.h" #include class macro01 : public TSelector { public : TTreeReader fReader; //!the tree reader TTree *fChain = 0; //!pointer to the analyzed TTree or TChain // Readers to access the data (delete the ones you do not need). TTreeReaderArray GEMDFADC_modList = {fReader, "GEMDFADC_modList"}; TTreeReaderArray GEMDFADC_eventNumber = {fReader, "GEMDFADC_eventNumber"}; TTreeReaderArray GEMDFADC_channelID = {fReader, "GEMDFADC_channelID"}; TTreeReaderArray GEMDFADC_timestamp = {fReader, "GEMDFADC_timestamp"}; TTreeReaderArray GEMDFADC_decimalTimestamp = {fReader, "GEMDFADC_decimalTimestamp"}; TTreeReaderArray GEMDFADC_vetoFlag = {fReader, "GEMDFADC_vetoFlag"}; TTreeReaderArray GEMDFADC_vetoSample = {fReader, "GEMDFADC_vetoSample"}; TTreeReaderArray GEMDFADC_eventType = {fReader, "GEMDFADC_eventType"}; TTreeReaderArray GEMDFADC_energy = {fReader, "GEMDFADC_energy"}; TTreeReaderValue> GEMDFADC_channelStatus = {fReader, "GEMDFADC_channelStatus"}; TTreeReaderArray GEMDFADC_waveformTag = {fReader, "GEMDFADC_waveformTag"}; TTreeReaderArray GEMDBaseline_modList = {fReader, "GEMDBaseline_modList"}; TTreeReaderArray GEMDBaseline_baseline = {fReader, "GEMDBaseline_baseline"}; TTreeReaderArray GEMDBaseline_baselineRes = {fReader, "GEMDBaseline_baselineRes"}; TTreeReaderArray GEMDBaseline_baselineSigma = {fReader, "GEMDBaseline_baselineSigma"}; TTreeReaderArray GEMDBaseline_fitExpOffset = {fReader, "GEMDBaseline_fitExpOffset"}; TTreeReaderArray GEMDBaseline_fitExpCoefficient = {fReader, "GEMDBaseline_fitExpCoefficient"}; TTreeReaderArray GEMDBaseline_restoredWfBaseline = {fReader, "GEMDBaseline_restoredWfBaseline"}; TTreeReaderArray GEMDBaseline_restoredWfBaselineRes = {fReader, "GEMDBaseline_restoredWfBaselineRes"}; TTreeReaderArray GEMDBaseline_restoredWfBaselineSigma = {fReader, "GEMDBaseline_restoredWfBaselineSigma"}; TTreeReaderArray GEMDBaselineHF_modList = {fReader, "GEMDBaselineHF_modList"}; TTreeReaderArray GEMDBaselineHF_baseline = {fReader, "GEMDBaselineHF_baseline"}; TTreeReaderArray GEMDBaselineHF_baselineRes = {fReader, "GEMDBaselineHF_baselineRes"}; TTreeReaderArray GEMDBaselineHF_baselineSigma = {fReader, "GEMDBaselineHF_baselineSigma"}; TTreeReaderArray GEMDBaselineHF_fitExpOffset = {fReader, "GEMDBaselineHF_fitExpOffset"}; TTreeReaderArray GEMDBaselineHF_fitExpCoefficient = {fReader, "GEMDBaselineHF_fitExpCoefficient"}; TTreeReaderArray GEMDBaselineHF_restoredWfBaseline = {fReader, "GEMDBaselineHF_restoredWfBaseline"}; TTreeReaderArray GEMDBaselineHF_restoredWfBaselineRes = {fReader, "GEMDBaselineHF_restoredWfBaselineRes"}; TTreeReaderArray GEMDBaselineHF_restoredWfBaselineSigma = {fReader, "GEMDBaselineHF_restoredWfBaselineSigma"}; TTreeReaderArray GEMDTrigger_modList = {fReader, "GEMDTrigger_modList"}; TTreeReaderArray GEMDTrigger_baseline = {fReader, "GEMDTrigger_baseline"}; TTreeReaderArray GEMDTrigger_baselineSigma = {fReader, "GEMDTrigger_baselineSigma"}; TTreeReaderArray GEMDTrigger_trigger = {fReader, "GEMDTrigger_trigger"}; TTreeReaderArray GEMDTrigger_trigger1 = {fReader, "GEMDTrigger_trigger1"}; TTreeReaderArray GEMDTrigger_trigger2 = {fReader, "GEMDTrigger_trigger2"}; TTreeReaderArray GEMDTrigger_trigger3 = {fReader, "GEMDTrigger_trigger3"}; TTreeReaderArray GEMDTrigger_triggerNumber = {fReader, "GEMDTrigger_triggerNumber"}; TTreeReaderArray GEMDTrigger_triggerThr = {fReader, "GEMDTrigger_triggerThr"}; TTreeReaderArray GEMDFTTrigger_modList = {fReader, "GEMDFTTrigger_modList"}; TTreeReaderArray GEMDFTTrigger_baseline = {fReader, "GEMDFTTrigger_baseline"}; TTreeReaderArray GEMDFTTrigger_baselineSigma = {fReader, "GEMDFTTrigger_baselineSigma"}; TTreeReaderArray GEMDFTTrigger_baselineRes = {fReader, "GEMDFTTrigger_baselineRes"}; TTreeReaderArray GEMDFTTrigger_trigger = {fReader, "GEMDFTTrigger_trigger"}; TTreeReaderArray GEMDFTTrigger_trigger1 = {fReader, "GEMDFTTrigger_trigger1"}; TTreeReaderArray GEMDFTTrigger_trigger2 = {fReader, "GEMDFTTrigger_trigger2"}; TTreeReaderArray GEMDFTTrigger_trigger3 = {fReader, "GEMDFTTrigger_trigger3"}; TTreeReaderArray GEMDFTTrigger_triggerNumber = {fReader, "GEMDFTTrigger_triggerNumber"}; TTreeReaderArray GEMDFTTrigger_triggerThr = {fReader, "GEMDFTTrigger_triggerThr"}; TTreeReaderArray GEMDEnergyGauss_modList = {fReader, "GEMDEnergyGauss_modList"}; TTreeReaderArray GEMDEnergyGauss_energy = {fReader, "GEMDEnergyGauss_energy"}; TTreeReaderArray GEMDEnergyGauss_baseline = {fReader, "GEMDEnergyGauss_baseline"}; TTreeReaderArray GEMDEnergyGauss_maxAmpTime = {fReader, "GEMDEnergyGauss_maxAmpTime"}; TTreeReaderArray GEMDRiseTimeLF_modList = {fReader, "GEMDRiseTimeLF_modList"}; TTreeReaderArray GEMDRiseTimeLF_risetime = {fReader, "GEMDRiseTimeLF_risetime"}; TTreeReaderArray GEMDRiseTimeLF_maxAmpAverage = {fReader, "GEMDRiseTimeLF_maxAmpAverage"}; TTreeReaderArray GEMDRiseTimeLF_nPoint = {fReader, "GEMDRiseTimeLF_nPoint"}; TTreeReaderArray GEMDRiseTimeLF_maxAmpTime = {fReader, "GEMDRiseTimeLF_maxAmpTime"}; TTreeReaderArray GEMDRiseTimeLF_lowEdgeAmp = {fReader, "GEMDRiseTimeLF_lowEdgeAmp"}; TTreeReaderArray GEMDRiseTimeLF_lowEdgeTime = {fReader, "GEMDRiseTimeLF_lowEdgeTime"}; TTreeReaderArray GEMDRiseTimeLF_highEdgeAmp = {fReader, "GEMDRiseTimeLF_highEdgeAmp"}; TTreeReaderArray GEMDRiseTimeLF_highEdgeTime = {fReader, "GEMDRiseTimeLF_highEdgeTime"}; TTreeReaderArray GEMDCurrentPSA_modList = {fReader, "GEMDCurrentPSA_modList"}; TTreeReaderArray GEMDCurrentPSA_A = {fReader, "GEMDCurrentPSA_A"}; TTreeReaderArray GEMDCurrentPSA_ATime = {fReader, "GEMDCurrentPSA_ATime"}; TTreeReaderArray GEMDRiseTimeHF1090_modList = {fReader, "GEMDRiseTimeHF1090_modList"}; TTreeReaderArray GEMDRiseTimeHF1090_risetime = {fReader, "GEMDRiseTimeHF1090_risetime"}; TTreeReaderArray GEMDRiseTimeHF1090_maxAmpAverage = {fReader, "GEMDRiseTimeHF1090_maxAmpAverage"}; TTreeReaderArray GEMDRiseTimeHF1090_nPoint = {fReader, "GEMDRiseTimeHF1090_nPoint"}; TTreeReaderArray GEMDRiseTimeHF1090_maxAmpTime = {fReader, "GEMDRiseTimeHF1090_maxAmpTime"}; TTreeReaderArray GEMDRiseTimeHF1090_lowEdgeAmp = {fReader, "GEMDRiseTimeHF1090_lowEdgeAmp"}; TTreeReaderArray GEMDRiseTimeHF1090_lowEdgeTime = {fReader, "GEMDRiseTimeHF1090_lowEdgeTime"}; TTreeReaderArray GEMDRiseTimeHF1090_highEdgeAmp = {fReader, "GEMDRiseTimeHF1090_highEdgeAmp"}; TTreeReaderArray GEMDRiseTimeHF1090_highEdgeTime = {fReader, "GEMDRiseTimeHF1090_highEdgeTime"}; TTreeReaderArray GEMDRiseTimeHF00590_modList = {fReader, "GEMDRiseTimeHF00590_modList"}; TTreeReaderArray GEMDRiseTimeHF00590_risetime = {fReader, "GEMDRiseTimeHF00590_risetime"}; TTreeReaderArray GEMDRiseTimeHF00590_maxAmpAverage = {fReader, "GEMDRiseTimeHF00590_maxAmpAverage"}; TTreeReaderArray GEMDRiseTimeHF00590_nPoint = {fReader, "GEMDRiseTimeHF00590_nPoint"}; TTreeReaderArray GEMDRiseTimeHF00590_maxAmpTime = {fReader, "GEMDRiseTimeHF00590_maxAmpTime"}; TTreeReaderArray GEMDRiseTimeHF00590_lowEdgeAmp = {fReader, "GEMDRiseTimeHF00590_lowEdgeAmp"}; TTreeReaderArray GEMDRiseTimeHF00590_lowEdgeTime = {fReader, "GEMDRiseTimeHF00590_lowEdgeTime"}; TTreeReaderArray GEMDRiseTimeHF00590_highEdgeAmp = {fReader, "GEMDRiseTimeHF00590_highEdgeAmp"}; TTreeReaderArray GEMDRiseTimeHF00590_highEdgeTime = {fReader, "GEMDRiseTimeHF00590_highEdgeTime"}; TTreeReaderArray GEMDRiseTimeHF9799_modList = {fReader, "GEMDRiseTimeHF9799_modList"}; TTreeReaderArray GEMDRiseTimeHF9799_risetime = {fReader, "GEMDRiseTimeHF9799_risetime"}; TTreeReaderArray GEMDRiseTimeHF9799_maxAmpAverage = {fReader, "GEMDRiseTimeHF9799_maxAmpAverage"}; TTreeReaderArray GEMDRiseTimeHF9799_nPoint = {fReader, "GEMDRiseTimeHF9799_nPoint"}; TTreeReaderArray GEMDRiseTimeHF9799_maxAmpTime = {fReader, "GEMDRiseTimeHF9799_maxAmpTime"}; TTreeReaderArray GEMDRiseTimeHF9799_lowEdgeAmp = {fReader, "GEMDRiseTimeHF9799_lowEdgeAmp"}; TTreeReaderArray GEMDRiseTimeHF9799_lowEdgeTime = {fReader, "GEMDRiseTimeHF9799_lowEdgeTime"}; TTreeReaderArray GEMDRiseTimeHF9799_highEdgeAmp = {fReader, "GEMDRiseTimeHF9799_highEdgeAmp"}; TTreeReaderArray GEMDRiseTimeHF9799_highEdgeTime = {fReader, "GEMDRiseTimeHF9799_highEdgeTime"}; TTreeReaderArray GEMDQuality_modList = {fReader, "GEMDQuality_modList"}; TTreeReaderArray GEMDQuality_isgood = {fReader, "GEMDQuality_isgood"}; TTreeReaderArray GEMDQuality_isProcessed = {fReader, "GEMDQuality_isProcessed"}; TTreeReaderArray GEMDQuality_failingModule = {fReader, "GEMDQuality_failingModule"}; // --------------------------------------------------------------------------------------------------- // start of my additions Double_t huhu = 0; Int_t nChannels = 0; TH1F * hSpectrumUncalibrated = 0; TH1F * hSpectrumCalibration = 0; TH1F * hSpectrumCalibrated = 0; bool cut = false; Int_t maxNumberOfPeaksPerPart = 0; Int_t cutPosition = 0; Int_t startCalibrationRegion = 0; Int_t endCalibrationRegion = 0; Int_t endOfInterestingPart = 0; Double_t peakFinderThreshold = 0; std::vector ThalliumPeaks; std::vector BismuthPeaks; std::vector OtherPeaks; std::vector calibrationEnergies; std::string outputDirectory = ""; std::vector channels; std::vector getCalibrationPeaks(TH1 * h, Int_t firstBin, Int_t lastBin, Int_t maxNumberOfPeaksPerPart, Double_t threshold) { // takes an uncalibrated histogram, a range, the maxNumberOfPeaksPerPart and the peak threshold as arguments // and returs a vector containing the positions of the peaks relevant for calibration h->GetXaxis()->SetRange(firstBin, lastBin); TSpectrum * myTSpectrum = new TSpectrum(maxNumberOfPeaksPerPart); Int_t numberOfPeaksFound = myTSpectrum->Search(h, 2, "newnodraw", threshold); // arguments: histo, sigma, ??, threshold Double_t * PositionsArr = myTSpectrum->GetPositionX(); std::vector PositionsVec; PositionsVec.insert( PositionsVec.begin(), PositionsArr, PositionsArr+numberOfPeaksFound ); return PositionsVec; } TGraph* getCalibrationGraph(std::vector PeakPositions, std::vector PeakEnergies) { // takes two vectors as arguments: the position of the calibration peaks in ADC channels and their respective energies // puts them in a graph and fits a function to determine the correlation Int_t nPeaksFound = PeakPositions.size(); Double_t PeakPositionsArray[nPeaksFound]; Double_t PeakEnergiesArray[nPeaksFound]; // bc of compatibility reasons we have to use arrays std::copy( PeakPositions.begin(), PeakPositions.end(), PeakPositionsArray ); std::copy( PeakEnergies.begin(), PeakEnergies.end(), PeakEnergiesArray ); for(Int_t i=0; iGetParameter(0) + channel * f->GetParameter(1); } TGraph* getGraph(std::vector x, std::vector y) { // takes two vectors as arguments: the position of the calibration peaks in ADC channels and their respective energies Int_t n = x.size(); Double_t xArray[n]; Double_t yArray[n]; // bc of compatibility reasons we have to use arrays std::copy( x.begin(), x.end(), xArray ); std::copy( y.begin(), y.end(), yArray ); TGraph * g = new TGraph(n, xArray, yArray); return g; } std::vector fitPeaks(TH1F * hSpectrumCalibration, std::vector coarsePeakPositions, Int_t margin) { std::vector precisePeakPositions (coarsePeakPositions.size()); //TCanvas * cFit = new TCanvas("cFit", "the fitted peaks"); //cFit->SetLogy(); //hSpectrumCalibration->Draw(); TF1 * f1; char funcName[10]; for (Int_t i=0; iSetParameter(0, hSpectrumCalibration->GetMaximum()); // height f1->SetParameter(1, coarsePeakPositions[i]); // mean f1->SetParameter(2, 5); f1->SetParLimits(0, 0, 2 * hSpectrumCalibration->GetMaximum()); // sigma f1->SetParLimits(1, coarsePeakPositions[i]-margin, coarsePeakPositions[i]+margin); f1->SetParLimits(2, 0, 100); hSpectrumCalibration->Fit(f1, "R0+Q"); // "R" = 'use function rage for fitting'; CRUCIAL! //f1->Draw("SAME"); // draw all fitted function onto the histogram precisePeakPositions[i] = f1->GetParameter(1); } //cFit->Write(); //delete cFit; return precisePeakPositions; } /* // FWHM Double_t maximum = f1->GetMaximum(); Double_t HM = 0.5 * maximum; Double_t posMaximum = f1->GetX(maximum, PeakPositions[i]-margin, PeakPositions[i]+margin); // so, over the full range Double_t leftPos = f1->GetX(HM, PeakPositions[i]-margin, posMaximum); // look where the half maximum is reached left from the maximum Double_t rightPos = f1->GetX(HM, posMaximum, PeakPositions[i]+margin); FWHMs[i] = channel2Energy(fit, rightPos) - channel2Energy(fit, leftPos); */ /*virtual std::vector getPeakPositions(TH1 * h, Int_t firstBin, Int_t lastBin, Int_t maxNumberOfPeaksPerPart, Double_t threshold) { // takes an uncalibrated energy spectrum and some other parameters, localizes peaks and returs their positions in terms of ADC channels h->GetXaxis()->SetRange(firstBin, lastBin); TSpectrum * myTSpectrum = new TSpectrum(maxNumberOfPeaksPerPart); Int_t numberOfPeaksFound = myTSpectrum->Search(h, 2, "new", threshold); Double_t * tmp = myTSpectrum->GetPositionX(); std::vector PeakPositions; PeakPositions.insert( PeakPositions.begin(), tmp, tmp+numberOfPeaksFound ); return PeakPositions; */ // end of my additions // --------------------------------------------------------------------------------------------------- macro01(TTree * /*tree*/ =0) { } virtual ~macro01() { } virtual Int_t Version() const { return 2; } virtual void Begin(TTree *tree); virtual void SlaveBegin(TTree *tree); virtual void Init(TTree *tree); virtual Bool_t Notify(); virtual Bool_t Process(Long64_t entry); virtual Int_t GetEntry(Long64_t entry, Int_t getall = 0) { return fChain ? fChain->GetTree()->GetEntry(entry, getall) : 0; } virtual void SetOption(const char *option) { fOption = option; } virtual void SetObject(TObject *obj) { fObject = obj; } virtual void SetInputList(TList *input) { fInput = input; } virtual TList *GetOutputList() const { return fOutput; } virtual void SlaveTerminate(); virtual void Terminate(); ClassDef(macro01,0); }; #endif #ifdef macro01_cxx void macro01::Init(TTree *tree) { // The Init() function is called when the selector needs to initialize // a new tree or chain. Typically here the reader is initialized. // It is normally not necessary to make changes to the generated // code, but the routine can be extended by the user if needed. // Init() will be called many times when running on PROOF // (once per file to be processed). fReader.SetTree(tree); } Bool_t macro01::Notify() { // The Notify() function is called when a new file is opened. This // can be either for a new TTree in a TChain or when when a new TTree // is started when using PROOF. It is normally not necessary to make changes // to the generated code, but the routine can be extended by the // user if needed. The return value is currently not used. return kTRUE; } #endif // #ifdef macro01_cxx