Newer
Older
/*****************************************************************************
* Copyright (C) 2009-2016 this file is part of the NPTool Project *
* *
* For the licensing terms see $NPTOOL/Licence/NPTool_Licence *
* For the list of contributors see $NPTOOL/Licence/Contributors *
*****************************************************************************/
/*****************************************************************************
* Original Author: Sandra GIRON contact address: giron@ipno.in2p3.fr *
* Benjamin LE CROM lecrom@ipno.in2p3.fr *
* Creation Date : march 2014 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: *
* This class hold exogam treated data *
* *
*---------------------------------------------------------------------------*
* Comment: *
* *
*****************************************************************************/
#include "TExogamPhysics.h"
using namespace EXOGAM_LOCAL;

GIRARD ALCINDOR Valérian
committed
// STL
#include <cmath>

GIRARD ALCINDOR Valérian
committed
#include <iostream>
#include <sstream>
#include <stdlib.h>
// NPL
#include "NPOptionManager.h"

GIRARD ALCINDOR Valérian
committed
#include "NPVDetector.h"
#include "RootInput.h"
#include "RootOutput.h"
// ROOT
#include "TChain.h"
///////////////////////////////////////////////////////////////////////////
ClassImp(TExogamPhysics)

GIRARD ALCINDOR Valérian
committed
///////////////////////////////////////////////////////////////////////////
TExogamPhysics::TExogamPhysics() {
EventMultiplicity = 0;
ECC_Multiplicity = 0;
GOCCE_Multiplicity = 0;
NumberOfHitClover = 0;
NumberOfHitCristal = 0;
m_Spectra = NULL;
NumberOfClover = 0;
PreTreatedData = new TExogamData;
EventData = new TExogamData;
EventPhysics = this;
NumberOfClover = 0;
CloverMult = 0;

GIRARD ALCINDOR Valérian
committed
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::BuildSimplePhysicalEvent() { BuildPhysicalEvent(); }
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::PreTreat() {
Hugo Jacob
committed
/*ClearPreTreatedData();

GIRARD ALCINDOR Valérian
committed
//E
for(unsigned int i = 0 ; i < EventData -> GetECCEMult(); i++) {
UShort_t cristal_E = 10000 ; UShort_t cristal_T = 2000;
//if(IsValidChannel)
{
int clover = EventData -> GetECCEClover(i);
int cristal = EventData -> GetECCECristal(i);

GIRARD ALCINDOR Valérian
committed
if(EventData -> GetECCEEnergy(i) < 3000) cristal_E = CalibrationManager::getInstance()->
ApplyCalibration("EXOGAM/Cl"+ NPL::itoa(clover)+"_Cr"+ NPL::itoa(cristal)+"_Elow", EventData -> GetECCEEnergy(i));
else cristal_E = CalibrationManager::getInstance()->
ApplyCalibration("EXOGAM/Cl"+ NPL::itoa(clover)+"_Cr"+ NPL::itoa(cristal)+"_Ehigh", EventData -> GetECCEEnergy(i));
if(cristal_E > Threshold_ECC)

GIRARD ALCINDOR Valérian
committed
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
{
PreTreatedData->SetECCEClover ( clover ) ;
PreTreatedData->SetECCECristal( cristal ) ;
PreTreatedData->SetECCEEnergy ( cristal_E ) ;
bool checkT = false;
for(unsigned int k = 0; k < EventData -> GetECCTMult(); k++){
if(clover == EventData -> GetECCTClover(k) && cristal == EventData -> GetECCTCristal(k)){
// cout << EventData -> GetECCTTime(k) << endl;
if(EventData -> GetECCTTime(k) < 16383) cristal_T = CalibrationManager::getInstance()->
ApplyCalibration("EXOGAM/Cl"+ NPL::itoa(clover)+"_Cr"+ NPL::itoa(cristal)+"_T", EventData -> GetECCTTime(k)); else
cristal_T = 2500;
//if(cristal_T >5000 && cristal_T !=25000 ) cout << "PreTreat " << cristal_T << " " << EventData ->
GetECCTTime(k) << " " << clover << " " << cristal << " " << EventData->GetECCTMult() << endl;
checkT=true;
PreTreatedData->SetECCTClover (clover ) ;
PreTreatedData->SetECCTCristal( cristal ) ;
PreTreatedData->SetECCTTime ( cristal_T ) ;
ECC_Multiplicity ++;
GOCCE_Multiplicity++;
}
}
if(!checkT) {
PreTreatedData->SetECCTClover (clover ) ;
PreTreatedData->SetECCTCristal( cristal ) ;
PreTreatedData->SetECCTTime ( -1000 ) ;
}
}
}
}
//cout << PreTreatedData-> GetECCTMult() << " " << PreTreatedData-> GetECCEMult() << endl;

GIRARD ALCINDOR Valérian
committed
//GOCCE

GIRARD ALCINDOR Valérian
committed
//E
for(unsigned int i = 0 ; i < EventData -> GetGOCCEEMult(); i++) {

GIRARD ALCINDOR Valérian
committed
UShort_t segment_E = 25000;
//if(IsValidChannel)
{
int clover = EventData -> GetGOCCEEClover(i);
int cristal = EventData -> GetGOCCEECristal(i);
int segment = EventData -> GetGOCCEESegment(i);

GIRARD ALCINDOR Valérian
committed
if(EventData -> GetGOCCEEEnergy(i) > RawThreshold_GOCCE)

GIRARD ALCINDOR Valérian
committed
{
segment_E = CalibrationManager::getInstance()->ApplyCalibration("EXOGAM/Cl"+ NPL::itoa(clover)+"_Cr"+
NPL::itoa(cristal)+"_Seg"+ NPL::itoa(segment)+"_E", EventData -> GetGOCCEEEnergy(i));
if(segment_E > Threshold_GOCCE)
{
PreTreatedData->SetGOCCEEClover ( clover ) ;
PreTreatedData->SetGOCCEECristal( cristal ) ;
PreTreatedData->SetGOCCEESegment( segment ) ;
PreTreatedData->SetGOCCEEEnergy ( segment_E ) ;
}
}

GIRARD ALCINDOR Valérian
committed
{
}
}
}
//cout << "EXOGAM pretreat ok!" << endl;
return;
Hugo Jacob
committed
*/
}
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::BuildPhysicalEvent() {
Hugo Jacob
committed
/*PreTreat();

GIRARD ALCINDOR Valérian
committed
if(PreTreatedData -> GetECCEMult() != PreTreatedData -> GetECCTMult()) cout << PreTreatedData -> GetECCEMult() << " "
<< PreTreatedData -> GetECCTMult() << endl;
for(unsigned int i = 0 ; i < PreTreatedData -> GetECCEMult(); i++) {

GIRARD ALCINDOR Valérian
committed
// cout << i << " " << cristal_E << endl;

GIRARD ALCINDOR Valérian
committed
// if(PreTreatedData->GetECCTTime(i) > 0)
{
ECC_E.push_back(PreTreatedData->GetECCEEnergy(i));
ECC_T.push_back(PreTreatedData->GetECCTTime(i));
ECC_CloverNumber.push_back(PreTreatedData->GetECCEClover(i));
ECC_CristalNumber.push_back(PreTreatedData->GetECCECristal(i));

GIRARD ALCINDOR Valérian
committed
// cout << "BuildPhys " << PreTreatedData->GetECCEClover(i) << " " << PreTreatedData->GetECCECristal(i)<< " " <<
PreTreatedData->GetECCTTime(i) << " " << endl;
}
}

GIRARD ALCINDOR Valérian
committed
for(unsigned int j = 0 ; j < PreTreatedData -> GetGOCCEEMult(); j++) {
GOCCE_E.push_back(PreTreatedData->GetGOCCEEEnergy(j));
GOCCE_CloverNumber.push_back(PreTreatedData->GetGOCCEEClover(j));
GOCCE_CristalNumber.push_back(PreTreatedData->GetGOCCEECristal(j));
GOCCE_SegmentNumber.push_back(PreTreatedData->GetGOCCEESegment(j));
}

GIRARD ALCINDOR Valérian
committed
//int NumberOfHitClover = 0;

GIRARD ALCINDOR Valérian
committed
int DetectorID = -1;

GIRARD ALCINDOR Valérian
committed
for( unsigned short i = 0 ; i < PreTreatedData->GetECCEMult() ; i++ )

GIRARD ALCINDOR Valérian
committed
{
// cout << PreTreatedData->GetECCEClover(i) << endl;
if( PreTreatedData->GetECCEClover(i) != DetectorID)

GIRARD ALCINDOR Valérian
committed
{
if(i==0)
{
NumberOfHitClover++;
}
else if(PreTreatedData->GetECCEClover(i)!= PreTreatedData->GetECCEClover(i-1) )
{
NumberOfHitClover++;
}
}
if(NumberOfHitClover == 4) break;
//clover_mult -> Fill(NumberOfHitClover);

GIRARD ALCINDOR Valérian
committed

GIRARD ALCINDOR Valérian
committed
//cout << "NumberOfHitClover " << NumberOfHitClover << endl;

GIRARD ALCINDOR Valérian
committed
map<int, vector<int> > MapCristal;

GIRARD ALCINDOR Valérian
committed
map<int, vector<int> > MapSegment;
map<int, vector<int> > :: iterator it; // iterator used with MapCristal
map<int, vector<int> > :: iterator at; // iterator used with MapSegment
vector<int> PositionOfCristal_Buffer_ECC;
vector<int> PositionOfSegment_Buffer_GOCCE;

GIRARD ALCINDOR Valérian
committed
//Fill map Cristal
for(int clo = 0; clo < NumberOfClover; clo++)
{
for(unsigned int k = 0; k < ECC_CloverNumber.size(); k++)

GIRARD ALCINDOR Valérian
committed
{
if(ECC_CloverNumber.at(k) == clo) // && ECC_CristalNumber.at(k)== cri )
PositionOfCristal_Buffer_ECC.push_back(k);
}
if(PositionOfCristal_Buffer_ECC.size() != 0) MapCristal[clo] = PositionOfCristal_Buffer_ECC;

GIRARD ALCINDOR Valérian
committed
PositionOfCristal_Buffer_ECC.clear();

GIRARD ALCINDOR Valérian
committed

GIRARD ALCINDOR Valérian
committed
//Fill map Segment
for(int clo = 0; clo < NumberOfClover; clo++)
{
for(int cri = 0; cri < 4 ; cri++)

GIRARD ALCINDOR Valérian
committed
{
// for(int seg = 0; seg < 4 ; seg++)
{
for(unsigned int m = 0; m < GOCCE_CloverNumber.size(); m++)
{
if(GOCCE_CloverNumber.at(m) == clo && GOCCE_CristalNumber.at(m) == cri)// && GOCCE_SegmentNumber.at(m) == seg)
{
// PositionOfSegment_Buffer_GOCCE.push_back(4*clo+cri);
PositionOfSegment_Buffer_GOCCE.push_back(m);
}

GIRARD ALCINDOR Valérian
committed
}
if(PositionOfSegment_Buffer_GOCCE.size() != 0) MapSegment[4*clo+cri] = PositionOfSegment_Buffer_GOCCE;

GIRARD ALCINDOR Valérian
committed
PositionOfSegment_Buffer_GOCCE.clear();
}
}
// Treatment
for(int clo = 0; clo < NumberOfClover ; clo++)
{
double E = 0; double T = 0;
int mult_cristal = 0;
int cristal = -1 , segment;
int cristal_Emax = 0; int cristal_Emin = 0;
int Emax = 0, Emin = 1000000;
int Tmin = 0, Tmax = 0;

GIRARD ALCINDOR Valérian
committed
//ADD-BACK
it = MapCristal.find(clo);
int cristal_cond = 0;

GIRARD ALCINDOR Valérian
committed
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
if(it != MapCristal.end())
{
vector<int> PositionOfCristal = it -> second;
mult_cristal = PositionOfCristal.size();
//if(mult_cristal!=0) cristal_mult -> Fill(mult_cristal);
// ADD-BACK
//cout << "boucle" << endl;
for(unsigned int k = 0; k < PositionOfCristal.size(); k++)
{
int indice = PositionOfCristal.at(k);
cristal_cond += ECC_CristalNumber.at(indice);
// cout << ECC_CristalNumber.at(k) << " " ECC_E.at(k) << endl;
if(mult_cristal < 3)
{
E+= ECC_E.at(indice);
if(ECC_E.at(indice) < Emin) {
cristal_Emin = ECC_CristalNumber.at(indice);
Emin = ECC_E.at(indice);
Tmin = ECC_T.at(indice);
}
if(ECC_E.at(indice) > Emax) {
cristal_Emax = ECC_CristalNumber.at(indice);
Emax = ECC_E.at(indice);
Tmax = ECC_T.at(indice);
}
}
else // case of multiplicity = 3 or 4
{
E = -1; cristal_Emax = -1; cristal_Emin = -1; Tmax = -1; Tmin = -1;
}
// cout << ECC_E.at(indice) << " " << Emax << " " << cristal_Emax << " " << Emin << " " << cristal_Emin << endl;
}
if( (mult_cristal==1) || (mult_cristal ==2 && cristal_cond %2 == 1) )
{
// cout << cristal_cond << endl;
//cristal = cristal_Emax; T = Tmax;
//cout << Emax << " " << cristal_Emax << " " << Emin << " " << cristal_Emin << endl;
if(E > 500) { cristal = cristal_Emax; T = Tmax; }
else { cristal = cristal_Emin; T = Tmin; }
// DOPPLER CORRECTION
at = MapSegment.find(4*clo+cristal);
segment = -1;
if(at != MapSegment.end())
{
vector<int> PositionOfSegment = at -> second; // position of segment k in the vector
int segment_max = -1, E_temp = -1;
for(unsigned int m = 0; m < PositionOfSegment.size(); m++) // loop on hit segments of cristal cri of
clover clo
{
int indice = PositionOfSegment.at(m);
if(GOCCE_E.at(indice) > 0 && GOCCE_CristalNumber.at(indice) == cristal)
{
if( GOCCE_E.at(indice) > E_temp )
{
segment_max = GOCCE_SegmentNumber.at(indice) ;
E_temp = GOCCE_E.at(indice);
}
}
}
segment = segment_max;
}
}
if(E > 0 && cristal != -1 && segment != -1)
{
TotalEnergy_lab.push_back(E);
Time.push_back(T);
CloverNumber.push_back(clo);
CristalNumber.push_back(cristal);
SegmentNumber.push_back(segment);
double theta = GetSegmentAngleTheta(clo, cristal, segment);
Theta.push_back(theta);
double doppler_E = DopplerCorrection(E, theta);
DopplerCorrectedEnergy.push_back(doppler_E);
// cout << E << " " << clo << " " << cristal << " " << segment << " " << theta << " " << doppler_E << endl;
}
} // end of condition over CristalMap
} // loop over NumberOfClover
CloverMult = GetClover_Mult();

GIRARD ALCINDOR Valérian
committed
//cout << "Exogam fine" << endl;
Hugo Jacob
committed
*/

GIRARD ALCINDOR Valérian
committed
}

GIRARD ALCINDOR Valérian
committed
double TExogamPhysics::DopplerCorrection(double E, double Theta) {
double Pi = 3.141592654;
TString filename = "configs/beta.txt";
ifstream file;

GIRARD ALCINDOR Valérian
committed
// cout << filename << endl;
file.open(filename);

GIRARD ALCINDOR Valérian
committed
if (!file)
cout << filename << " was not opened" << endl;
double E_corr = 0;

GIRARD ALCINDOR Valérian
committed
double beta = 0.;
file >> beta;
double gamma = 1. / sqrt(1 - beta * beta);

GIRARD ALCINDOR Valérian
committed
E_corr = gamma * E * (1. - beta * cos(Theta * Pi / 180.));

GIRARD ALCINDOR Valérian
committed
return (E_corr);
}
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::Clear() {
EventMultiplicity = 0;
ECC_Multiplicity = 0;
GOCCE_Multiplicity = 0;

GIRARD ALCINDOR Valérian
committed
NumberOfHitClover = 0;
NumberOfHitCristal = 0;

GIRARD ALCINDOR Valérian
committed
ECC_CloverNumber.clear();
ECC_CristalNumber.clear();
GOCCE_CloverNumber.clear();
GOCCE_CristalNumber.clear();
GOCCE_SegmentNumber.clear();
// ECC

GIRARD ALCINDOR Valérian
committed
ECC_E.clear();
ECC_T.clear();
// GOCCE

GIRARD ALCINDOR Valérian
committed
GOCCE_E.clear();

GIRARD ALCINDOR Valérian
committed
CristalNumber.clear();
SegmentNumber.clear();
CloverNumber.clear();

GIRARD ALCINDOR Valérian
committed
TotalEnergy_lab.clear();
Time.clear();
DopplerCorrectedEnergy.clear();
Position.clear();
Theta.clear();
}
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
//// Innherited from VDetector Class ////
// Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::ReadConfiguration(NPL::InputParser parser) {
vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Exogam");

GIRARD ALCINDOR Valérian
committed
if (NPOptionManager::getInstance()->GetVerboseLevel())
cout << "//// " << blocks.size() << " detectors found " << endl;
vector<string> token = {"ANGLE_FILE"};

GIRARD ALCINDOR Valérian
committed
for (unsigned int i = 0; i < blocks.size(); i++) {
if (blocks[i]->HasTokenList(token)) {
string AngleFile = blocks[i]->GetString("ANGLE_FILE");
AddClover(AngleFile);

GIRARD ALCINDOR Valérian
committed
else {
cout << "ERROR: check your input file formatting " << endl;
exit(1);
}
}
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::InitSpectra() { m_Spectra = new TExogamSpectra(NumberOfClover); }
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::FillSpectra() {
m_Spectra->FillRawSpectra(EventData);
m_Spectra->FillPreTreatedSpectra(PreTreatedData);
m_Spectra->FillPhysicsSpectra(EventPhysics);
}
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::CheckSpectra() { m_Spectra->CheckSpectra(); }
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::ClearSpectra() {
// To be done
}
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
map<string, TH1*> TExogamPhysics::GetSpectra() {
if (m_Spectra)
return m_Spectra->GetMapHisto();

GIRARD ALCINDOR Valérian
committed
else {
map<string, TH1*> empty;
return empty;
}

GIRARD ALCINDOR Valérian
committed
}
//////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::AddClover(string AngleFile) {
ifstream file;
// TString filename = Form("posBaptiste/angles_exogam_clover%d.txt",NumberOfClover);
// TString filename = Form("posz42_simu50mm/angles_exogam_clover%d.txt",NumberOfClover);
// TString filename = Form("posz42_exp_stat_demiring/angles_exogam_clover%d.txt",NumberOfClover);

GIRARD ALCINDOR Valérian
committed
string path = "configs/";
TString filename = path + AngleFile;

GIRARD ALCINDOR Valérian
committed
cout << filename << endl;
file.open(filename);

GIRARD ALCINDOR Valérian
committed
if (!file)
cout << filename << " was not opened" << endl;
vector<double> Angles;
vector<vector<double>> Segment_angles;
vector<vector<vector<double>>> Cristal_angles;
Cristal_angles.clear();

GIRARD ALCINDOR Valérian
committed
double angle;
string buffer;

GIRARD ALCINDOR Valérian
committed
for (int i = 0; i < 4; i++) {
Segment_angles.clear();
for (int j = 0; j < 4; j++) {
Angles.clear();
for (int k = 0; k < 2; k++) {
file >> buffer >> angle;
Angles.push_back(angle); // Theta (k = 0) Phi (k = 1)
// cout << angle << endl;
if (Angles.size() == 2)
cout << "Clover " << NumberOfClover << ": Theta=" << Angles[0] << " Phi=" << Angles[1] << endl;
}
Segment_angles.push_back(Angles);

GIRARD ALCINDOR Valérian
committed
Cristal_angles.push_back(Segment_angles);
}
Clover_Angles_Theta_Phi.push_back(Cristal_angles);
file.close();
NumberOfClover++;

GIRARD ALCINDOR Valérian
committed
}
// Add Parameter to the CalibrationManger

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::AddParameterToCalibrationManager() {
CalibrationManager* Cal = CalibrationManager::getInstance();

GIRARD ALCINDOR Valérian
committed
for (int i = 0; i < NumberOfClover; i++) {
for (int j = 0; j < 4; j++) {
Cal->AddParameter("EXOGAM", "Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_Elow",
"EXOGAM_Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_Elow");
Cal->AddParameter("EXOGAM", "Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_Ehigh",
"EXOGAM_Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_Ehigh");
Cal->AddParameter("EXOGAM", "Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_T",
"EXOGAM_Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_T");
for (int k = 0; k < 4; k++) {
Cal->AddParameter("EXOGAM", "Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_Seg" + NPL::itoa(k) + "_E",
"EXOGAM_Cl" + NPL::itoa(i) + "_Cr" + NPL::itoa(j) + "_Seg" + NPL::itoa(k) + "_E");
}

GIRARD ALCINDOR Valérian
committed
}
}
// Activated associated Branches and link it to the private member DetectorData address
// In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::InitializeRootInputRaw() {
TChain* inputChain = RootInput::getInstance()->GetChain();
inputChain->SetBranchStatus("EXOGAM", true);
inputChain->SetBranchStatus("fEXO_*", true);
inputChain->SetBranchAddress("EXOGAM", &EventData);
/*
TList* outputList = RootOutput::getInstance()->GetList();
clover_mult = new TH1F("clover_mult","clover_mult",20,0,20);
outputList->Add(clover_mult);
cristal_mult = new TH1F("cristal_mult","cristal_mult",20,0,20);
outputList->Add(cristal_mult);
*/
}
/////////////////////////////////////////////////////////////////////
// Activated associated Branches and link it to the private member DetectorPhysics address
// In this method mother Branches (Detector) AND daughter leaf (parameter) have to be activated
void TExogamPhysics::InitializeRootInputPhysics() {
TChain* inputChain = RootInput::getInstance()->GetChain();

GIRARD ALCINDOR Valérian
committed
inputChain->SetBranchStatus("EventMultiplicty", true);
inputChain->SetBranchStatus("ECC_Multiplicity", true);
inputChain->SetBranchStatus("GOCCE_Multiplicity", true);
inputChain->SetBranchStatus("ECC_CloverNumber", true);
inputChain->SetBranchStatus("ECC_CristalNumber", true);
inputChain->SetBranchStatus("GOCCE_CloverNumber", true);
inputChain->SetBranchStatus("GOCCE_CristalNumber", true);
inputChain->SetBranchStatus("GOCCE_SegmentNumber", true);
inputChain->SetBranchStatus("ECC_E", true);
inputChain->SetBranchStatus("ECC_T", true);
inputChain->SetBranchStatus("GOCCE_E", true);
inputChain->SetBranchStatus("CristalNumber", true);
inputChain->SetBranchStatus("SegmentNumber", true);
inputChain->SetBranchStatus("CloverNumber", true);
inputChain->SetBranchStatus("CloverMult", true);
inputChain->SetBranchStatus("TotalEnergy_lab", true);
inputChain->SetBranchStatus("Time", true);
inputChain->SetBranchStatus("DopplerCorrectedEnergy", true);
inputChain->SetBranchStatus("Position", true);
inputChain->SetBranchStatus("Theta", true);
inputChain->SetBranchAddress("EXOGAM", &EventPhysics);
/////////////////////////////////////////////////////////////////////
// Create associated branches and associated private member DetectorPhysics address

GIRARD ALCINDOR Valérian
committed
void TExogamPhysics::InitializeRootOutput() {
TTree* outputTree = RootOutput::getInstance()->GetTree();
outputTree->Branch("EXOGAM", "TExogamPhysics", &EventPhysics);
// control histograms if needed

GIRARD ALCINDOR Valérian
committed
/*
TList* outputList = RootOutput::getInstance()->GetList();
controle = new TH1F("controle","histo de controle",20,0,20);
outputList->Add(controle);
*/
}
///////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
namespace EXOGAM_LOCAL {
// tranform an integer to a string

GIRARD ALCINDOR Valérian
committed
string itoa(int value) {
std::ostringstream o;

GIRARD ALCINDOR Valérian
committed
if (!(o << value))

GIRARD ALCINDOR Valérian
committed
return "";
return o.str();
}

GIRARD ALCINDOR Valérian
committed
} // namespace EXOGAM_LOCAL
/////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Construct Method to be pass to the DetectorFactory //
////////////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
NPL::VDetector* TExogamPhysics::Construct() { return (NPL::VDetector*)new TExogamPhysics(); }
////////////////////////////////////////////////////////////////////////////////
// Registering the construct method to the factory //
////////////////////////////////////////////////////////////////////////////////

GIRARD ALCINDOR Valérian
committed
extern "C" {
class proxy_exogam {
public:
proxy_exogam() {
NPL::DetectorFactory::getInstance()->AddToken("Exogam", "Exogam");
NPL::DetectorFactory::getInstance()->AddDetector("Exogam", TExogamPhysics::Construct);
}