TSharcPhysics.cxx 31.05 KiB
/*****************************************************************************
* Copyright (C) 2009-2013 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: Adrien MATTA contact address: matta@ipno.in2p3.fr *
* *
* Creation Date : November 2012 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: *
* This class hold Sharc treated data *
* *
*---------------------------------------------------------------------------*
* Comment: *
* *
*****************************************************************************/
#include "TSharcPhysics.h"
using namespace Sharc_LOCAL;
// STL
#include <sstream>
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <limits>
// NPL
#include "RootInput.h"
#include "RootOutput.h"
#include "TAsciiFile.h"
// ROOT
#include "TChain.h"
///////////////////////////////////////////////////////////////////////////
ClassImp(TSharcPhysics)
///////////////////////////////////////////////////////////////////////////
TSharcPhysics::TSharcPhysics()
{
EventMultiplicity = 0 ;
m_EventData = new TSharcData ;
m_PreTreatedData = new TSharcData ;
m_EventPhysics = this ;
m_NumberOfDetector = 0 ;
m_MaximumStripMultiplicityAllowed = 10;
//m_StripEnergyMatchingSigma = 0.060 ;
m_StripEnergyMatchingSigma = 50 ;
m_StripEnergyMatchingNumberOfSigma = 3;
// Threshold
m_StripFront_E_RAW_Threshold = 0 ;
m_StripFront_E_Threshold = 0 ;
m_StripBack_E_RAW_Threshold = 0 ;
m_StripBack_E_Threshold = 0 ;
m_Take_E_Front=false;
m_Take_T_Back=true;
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::BuildSimplePhysicalEvent()
{
BuildPhysicalEvent();
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::BuildPhysicalEvent()
{
PreTreat();
bool check_PAD = false ;
if( CheckEvent() == 1 )
{
vector< TVector2 > couple = Match_Front_Back() ;
EventMultiplicity = couple.size();
for(unsigned int i = 0 ; i < couple.size() ; ++i)
{
check_PAD = false ;
int N = m_PreTreatedData->GetFront_DetectorNbr(couple[i].X()) ;
int Front = m_PreTreatedData->GetFront_StripNbr(couple[i].X()) ;
int Back = m_PreTreatedData->GetBack_StripNbr(couple[i].Y()) ;
double Front_E = m_PreTreatedData->GetFront_Energy( couple[i].X() ) ;
double Back_E = m_PreTreatedData->GetBack_Energy( couple[i].Y() ) ;
double Front_T = m_PreTreatedData->GetFront_TimeCFD( couple[i].X() ) ;
double Back_T = m_PreTreatedData->GetBack_TimeCFD ( couple[i].Y() ) ;
DetectorNumber.push_back(N);
StripFront_E.push_back(Front_E);
StripFront_T.push_back(Front_T) ;
StripBack_E.push_back(Back_E) ;
StripBack_T.push_back(Back_T) ;
if(m_Take_E_Front)
Strip_E.push_back(Front_E) ;
else
Strip_E.push_back(Back_E) ;
if(m_Take_T_Back)
Strip_T.push_back(Back_T) ;
else
Strip_T.push_back(Front_T) ;
Strip_Front.push_back(Front) ;
Strip_Back.push_back(Back) ;
// Search for associate PAD
for(unsigned int j = 0 ; j < m_PreTreatedData-> GetMultiplicityPAD() ; ++j){
if(m_PreTreatedData->GetPAD_DetectorNbr(j)==N){
PAD_E.push_back( m_PreTreatedData-> GetPAD_Energy(j)) ;
PAD_T.push_back( m_PreTreatedData-> GetPAD_TimeCFD(j) ) ;
check_PAD = true ;
}
}
if(!check_PAD)
{
PAD_E.push_back(-1000) ;
PAD_T.push_back(-1000) ;
}
}
}
return;
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::PreTreat()
{
ClearPreTreatedData();
// Front
for(unsigned int i = 0 ; i < m_EventData->GetMultiplicityFront() ; ++i){
if( m_EventData->GetFront_Energy(i)>m_StripFront_E_RAW_Threshold && IsValidChannel("Front", m_EventData->GetFront_DetectorNbr(i), m_EventData->GetFront_StripNbr(i)) ){
double Front_E = fStrip_Front_E(m_EventData , i);
if( Front_E > m_StripFront_E_Threshold ){
m_PreTreatedData->SetFront_DetectorNbr( m_EventData->GetFront_DetectorNbr(i) );
m_PreTreatedData->SetFront_StripNbr( m_EventData->GetFront_StripNbr(i) );
m_PreTreatedData->SetFront_TimeCFD( m_EventData->GetFront_TimeCFD(i) );
m_PreTreatedData->SetFront_Energy( Front_E );
}
}
}
// Back
for(unsigned int i = 0 ; i < m_EventData->GetMultiplicityBack() ; ++i){
if( m_EventData->GetBack_Energy(i)>m_StripBack_E_RAW_Threshold && IsValidChannel("Back", m_EventData->GetBack_DetectorNbr(i), m_EventData->GetBack_StripNbr(i)) ){
double Back_E = fStrip_Back_E(m_EventData , i);
if( Back_E > m_StripBack_E_Threshold ){
m_PreTreatedData->SetBack_DetectorNbr( m_EventData->GetBack_DetectorNbr(i) );
m_PreTreatedData->SetBack_StripNbr( m_EventData->GetBack_StripNbr(i) );
m_PreTreatedData->SetBack_TimeCFD( m_EventData->GetBack_TimeCFD(i) );
m_PreTreatedData->SetBack_Energy( Back_E );
}
}
}
// PAD
for(unsigned int i = 0 ; i < m_EventData->GetMultiplicityPAD() ; ++i){
if( m_EventData->GetPAD_Energy(i)>m_PAD_E_RAW_Threshold && IsValidChannel("PAD", m_EventData->GetPAD_DetectorNbr(i),1) ){
double PAD_E = fPAD_E(m_EventData , i);
if( PAD_E > m_PAD_E_Threshold ){
m_PreTreatedData->SetPAD_DetectorNbr( m_EventData->GetPAD_DetectorNbr(i) );
m_PreTreatedData->SetPAD_Energy( PAD_E );
m_PreTreatedData->SetPAD_TimeCFD( m_EventData->GetPAD_TimeCFD(i) );
}
}
}
return;
}
///////////////////////////////////////////////////////////////////////////
int TSharcPhysics :: CheckEvent()
{
// Check the size of the different elements
if( m_PreTreatedData->GetMultiplicityBack() == m_PreTreatedData->GetMultiplicityFront() )
return 1 ; // Regular Event
else
return -1 ; // Rejected Event
}
///////////////////////////////////////////////////////////////////////////
vector < TVector2 > TSharcPhysics :: Match_Front_Back()
{
vector < TVector2 > ArrayOfGoodCouple ;
// Prevent code from treating very high multiplicity Event
// Those event are not physical anyway and that improve speed.
if( m_PreTreatedData->GetMultiplicityFront() > m_MaximumStripMultiplicityAllowed || m_PreTreatedData->GetMultiplicityBack() > m_MaximumStripMultiplicityAllowed )
return ArrayOfGoodCouple;
for(unsigned int i = 0 ; i < m_PreTreatedData->GetMultiplicityFront(); i++) {
for(unsigned int j = 0 ; j < m_PreTreatedData->GetMultiplicityBack(); j++){
// if same detector check energy
if ( m_PreTreatedData->GetFront_DetectorNbr(i) == m_PreTreatedData->GetBack_DetectorNbr(j) ){
// Look if energy match
if( abs( (m_PreTreatedData->GetFront_Energy(i)-m_PreTreatedData->GetBack_Energy(j))/2. ) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma )
ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ;
}
}
}
// Prevent to treat event with ambiguous matchin beetween X and Y
if( ArrayOfGoodCouple.size() > m_PreTreatedData->GetMultiplicityFront() ) ArrayOfGoodCouple.clear() ;
return ArrayOfGoodCouple;
}
////////////////////////////////////////////////////////////////////////////
bool TSharcPhysics :: IsValidChannel(const string DetectorType, const int telescope , const int channel)
{
if(DetectorType == "Front")
return *(m_FrontChannelStatus[telescope-1].begin()+channel-1);
else if(DetectorType == "Back")
return *(m_BackChannelStatus[telescope-1].begin()+channel-1);
else if(DetectorType == "PAD")
return *(m_PADChannelStatus[telescope-1].begin()+channel-1);
else return false;
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::ReadAnalysisConfig()
{
bool ReadingStatus = false;
// path to file
string FileName = "./configs/ConfigSharc.dat";
// open analysis config file
ifstream AnalysisConfigFile;
AnalysisConfigFile.open(FileName.c_str());
if (!AnalysisConfigFile.is_open()) {
cout << " No ConfigSharc.dat found: Default parameter loaded for Analayis " << FileName << endl;
return;
}
cout << " Loading user parameter for Analysis from ConfigSharc.dat " << endl;
// Save it in a TAsciiFile
TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig();
asciiConfig->AppendLine("%%% ConfigSharc.dat %%%");
asciiConfig->Append(FileName.c_str());
asciiConfig->AppendLine("");
// read analysis config file
string LineBuffer,DataBuffer,whatToDo;
while (!AnalysisConfigFile.eof()) {
// Pick-up next line
getline(AnalysisConfigFile, LineBuffer);
// search for "header"
if (LineBuffer.compare(0, 11, "ConfigSharc") == 0) ReadingStatus = true;
// loop on tokens and data
while (ReadingStatus ) {
whatToDo="";
AnalysisConfigFile >> whatToDo;
// Search for comment symbol (%)
if (whatToDo.compare(0, 1, "%") == 0) {
AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' );
}
else if (whatToDo=="MAX_STRIP_MULTIPLICITY") {
AnalysisConfigFile >> DataBuffer;
m_MaximumStripMultiplicityAllowed = atoi(DataBuffer.c_str() );
cout << "MAXIMUN STRIP MULTIPLICITY " << m_MaximumStripMultiplicityAllowed << endl;
}
else if (whatToDo=="STRIP_ENERGY_MATCHING_SIGMA") {
AnalysisConfigFile >> DataBuffer;
m_StripEnergyMatchingSigma = atof(DataBuffer.c_str() );
cout << "STRIP ENERGY MATCHING SIGMA " << m_StripEnergyMatchingSigma <<endl;
}
else if (whatToDo=="STRIP_ENERGY_MATCHING_NUMBER_OF_SIGMA") {
AnalysisConfigFile >> DataBuffer;
m_StripEnergyMatchingNumberOfSigma = atoi(DataBuffer.c_str() );
cout << "STRIP ENERGY MATCHING NUMBER OF SIGMA " << m_StripEnergyMatchingNumberOfSigma << endl;
}
else if (whatToDo== "DISABLE_ALL") {
AnalysisConfigFile >> DataBuffer;
cout << whatToDo << " " << DataBuffer << endl;
int Detector = atoi(DataBuffer.substr(2,1).c_str());
vector< bool > ChannelStatus;
ChannelStatus.resize(24,false);
m_FrontChannelStatus[Detector-1] = ChannelStatus;
ChannelStatus.resize(48,false);
m_BackChannelStatus[Detector-1] = ChannelStatus;
ChannelStatus.resize(1,false);
m_PADChannelStatus[Detector-1] = ChannelStatus;
}
else if (whatToDo == "DISABLE_CHANNEL") {
AnalysisConfigFile >> DataBuffer;
cout << whatToDo << " " << DataBuffer << endl;
int Detector = atoi(DataBuffer.substr(2,1).c_str());
int channel = -1;
if (DataBuffer.compare(3,4,"STRF") == 0) {
channel = atoi(DataBuffer.substr(7).c_str());
*(m_FrontChannelStatus[Detector-1].begin()+channel-1) = false;
}
else if (DataBuffer.compare(3,4,"STRB") == 0) {
channel = atoi(DataBuffer.substr(7).c_str());
*(m_BackChannelStatus[Detector-1].begin()+channel-1) = false;
}
else if (DataBuffer.compare(3,3,"PAD") == 0) {
channel = atoi(DataBuffer.substr(6).c_str());
*(m_PADChannelStatus[Detector-1].begin()+channel-1) = false;
}
else cout << "Warning: detector type for Sharc unknown!" << endl;
}
else if (whatToDo=="TAKE_E_FRONT") {
m_Take_E_Front = true;
cout << whatToDo << endl;
}
else if (whatToDo=="TAKE_E_BACK") {
m_Take_E_Front = false;
cout << whatToDo << endl;
}
else if (whatToDo=="TAKE_T_FRONT") {
m_Take_T_Back = false;
cout << whatToDo << endl;
}
else if (whatToDo=="TAKE_T_BACK") {
m_Take_T_Back = true;
cout << whatToDo << endl;
}
else if (whatToDo=="STRIP_FRONT_E_RAW_THRESHOLD") {
AnalysisConfigFile >> DataBuffer;
m_StripFront_E_RAW_Threshold = atoi(DataBuffer.c_str());
cout << whatToDo << " " << m_StripFront_E_RAW_Threshold << endl;
}
else if (whatToDo=="STRIP_BACK_E_RAW_THRESHOLD") {
AnalysisConfigFile >> DataBuffer;
m_StripBack_E_RAW_Threshold = atoi(DataBuffer.c_str());
cout << whatToDo << " " << m_StripBack_E_RAW_Threshold << endl;
}
else if (whatToDo=="STRIP_FRONT_E_THRESHOLD") {
AnalysisConfigFile >> DataBuffer;
m_StripFront_E_Threshold = atoi(DataBuffer.c_str());
cout << whatToDo << " " << m_StripFront_E_Threshold << endl;
}
else if (whatToDo=="STRIP_BACK_THRESHOLD") {
AnalysisConfigFile >> DataBuffer;
m_StripBack_E_Threshold = atoi(DataBuffer.c_str());
cout << whatToDo << " " << m_StripBack_E_Threshold << endl;
}
else if (whatToDo=="PAD_E_RAW_THRESHOLD") {
AnalysisConfigFile >> DataBuffer;
m_PAD_E_RAW_Threshold = atoi(DataBuffer.c_str());
cout << whatToDo << " " << m_PAD_E_RAW_Threshold << endl;
}
else if (whatToDo=="PAD_E_THRESHOLD") {
AnalysisConfigFile >> DataBuffer;
m_PAD_E_Threshold = atoi(DataBuffer.c_str());
cout << whatToDo << " " << m_PAD_E_Threshold << endl;
}
else {
ReadingStatus = false;
}
}
}
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::Clear()
{
EventMultiplicity = 0;
// Provide a Classification of Event
EventType.clear() ;
// Detector
DetectorNumber.clear() ;
// DSSD
Strip_E.clear() ;
Strip_T.clear() ;
StripFront_E.clear() ;
StripFront_T.clear();
StripBack_E.clear() ;
StripBack_T.clear() ;
Strip_Front.clear() ;
Strip_Back.clear() ;
// PAD
PAD_E.clear() ;
PAD_T.clear() ;
}
///////////////////////////////////////////////////////////////////////////
//// Innherited from VDetector Class ////
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::ReadConfiguration(string Path)
{
ifstream ConfigFile ;
ConfigFile.open(Path.c_str()) ;
string LineBuffer ;
string DataBuffer ;
double R,Phi,Z;
R = 0 ; Phi = 0 ; Z = 0;
TVector3 Pos;
bool check_R = false ;
bool check_Phi = false ;
bool check_Z = false ;
bool ReadingStatusQQQ = false ;
bool ReadingStatusBOX = false ;
bool ReadingStatus = false ;
while (!ConfigFile.eof()){
getline(ConfigFile, LineBuffer);
// cout << LineBuffer << endl;
if (LineBuffer.compare(0, 5, "Sharc") == 0)
ReadingStatus = true;
while (ReadingStatus && !ConfigFile.eof()) {
ConfigFile >> DataBuffer ;
// Comment Line
if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
// CD case
if (DataBuffer=="SharcQQQ"){
cout << "///" << endl ;
cout << "QQQ Quadrant found: " << endl ;
ReadingStatusQQQ = true ;
}
// Box case
else if (DataBuffer=="SharcBOX"){
cout << "///" << endl ;
cout << "Box Detector found: " << endl ;
ReadingStatusBOX = true ;
}
// Reading Block
while(ReadingStatusQQQ){
// Pickup Next Word
ConfigFile >> DataBuffer ;
// Comment Line
if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
//Position method
else if (DataBuffer == "Z=") {
check_Z = true;
ConfigFile >> DataBuffer ;
Z= atof(DataBuffer.c_str());
cout << " Z= " << Z << "mm" << endl;
}
else if (DataBuffer == "R=") {
check_R = true;
ConfigFile >> DataBuffer ;
R= atof(DataBuffer.c_str());
cout << " R= " << R << "mm" << endl;
}
else if (DataBuffer == "Phi=") {
check_Phi = true;
ConfigFile >> DataBuffer ;
Phi= atof(DataBuffer.c_str());
cout << " Phi= " << Phi << "deg" << endl;
}
else if (DataBuffer == "ThicknessDector=") {
/*ignore that*/
}
///////////////////////////////////////////////////
// If no Detector Token and no comment, toggle out
else{
ReadingStatusQQQ = false;
cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ;
exit(1);
}
/////////////////////////////////////////////////
// If All necessary information there, toggle out
if (check_R && check_Phi && check_Z){
ReadingStatusQQQ = false;
AddQQQDetector(R,Phi,Z);
// Reinitialisation of Check Boolean
check_R = false ;
check_Phi = false ;
}
}
while(ReadingStatusBOX){
// Pickup Next Word
ConfigFile >> DataBuffer ;
// Comment Line
if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
//Position method
else if (DataBuffer == "Z=") {
check_Z = true;
ConfigFile >> DataBuffer ;
Z= atof(DataBuffer.c_str());
cout << " Z= " << Z << "mm" << endl;
}
else if (DataBuffer == "ThicknessDector1=") {
/*ignore this */
}
else if (DataBuffer == "ThicknessDector2=") {
/*ignore this */
}
else if (DataBuffer == "ThicknessDector3=") {
/*ignore this */
}
else if (DataBuffer == "ThicknessDector4=") {
/*ignore this */
}
else if (DataBuffer == "ThicknessPAD1=") {
/*ignore this */
}
else if (DataBuffer == "ThicknessPAD2=") {
/*ignore this */
}
else if (DataBuffer == "ThicknessPAD3=") {
/*ignore this */
}
else if (DataBuffer == "ThicknessPAD4=") {
/*ignore this */
}
///////////////////////////////////////////////////
// If no Detector Token and no comment, toggle out
else{
ReadingStatusBOX = false;
cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ;
exit(1);
}
/////////////////////////////////////////////////
// If All necessary information there, toggle out
if (check_Z){
ReadingStatusBOX = false;
AddBoxDetector(Z);
// Reinitialisation of Check Boolean
check_R = false ;
check_Phi = false ;
check_Z = false ;
}
}
}
}
InitializeStandardParameter();
ReadAnalysisConfig();
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::AddParameterToCalibrationManager()
{
CalibrationManager* Cal = CalibrationManager::getInstance();
for(int i = 0 ; i < m_NumberOfDetector ; ++i)
{
for( int j = 0 ; j < 24 ; ++j)
{
Cal->AddParameter("SHARC", "D"+itoa(i+1)+"_STRIP_FRONT"+itoa(j+1)+"_E","SHARC_D"+itoa(i+1)+"_STRIP_FRONT"+itoa(j+1)+"_E") ;
Cal->AddParameter("SHARC", "D"+itoa(i+1)+"_STRIP_FRONT"+itoa(j+1)+"_T","SHARC_D"+itoa(i+1)+"_STRIP_FRONT"+itoa(j+1)+"_T") ;
}
for( int j = 0 ; j < 48 ; ++j)
{
Cal->AddParameter("SHARC", "D"+itoa(i+1)+"_STRIP_BACK"+itoa(j+1)+"_E","SHARC_D"+itoa(i+1)+"_STRIP_BACK"+itoa(j+1)+"_E") ;
Cal->AddParameter("SHARC", "D"+itoa(i+1)+"_STRIP_BACK"+itoa(j+1)+"_T","SHARC_D"+itoa(i+1)+"_STRIP_BACK"+itoa(j+1)+"_T") ;
}
for( int j = 0 ; j < 1 ; ++j)
{
Cal->AddParameter("SHARC", "D"+itoa(i+1)+"_PAD"+itoa(j+1)+"_E","SHARC_D"+itoa(i+1)+"_PAD_E") ;
Cal->AddParameter("SHARC", "D"+itoa(i+1)+"_PAD"+itoa(j+1)+"_T","SHARC_D"+itoa(i+1)+"_PAD_T") ;
}
}
return;
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::InitializeRootInputRaw()
{
TChain* inputChain = RootInput::getInstance()->GetChain() ;
inputChain->SetBranchStatus( "Sharc" , true ) ;
inputChain->SetBranchStatus( "fSharc_*" , true ) ;
inputChain->SetBranchAddress( "Sharc" , &m_EventData ) ;
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::InitializeRootInputPhysics()
{
TChain* inputChain = RootInput::getInstance()->GetChain();
inputChain->SetBranchStatus( "EventMultiplicity" , true );
inputChain->SetBranchStatus( "EventType " , true );
inputChain->SetBranchStatus( "DetectorNumber " , true );
inputChain->SetBranchStatus( "Strip_E " , true );
inputChain->SetBranchStatus( "Strip_T " , true );
inputChain->SetBranchStatus( "StripFront_E " , true );
inputChain->SetBranchStatus( "StripBack_T " , true );
inputChain->SetBranchStatus( "StripFront_E " , true );
inputChain->SetBranchStatus( "StripBack_T " , true );
inputChain->SetBranchStatus( "Strip_Front " , true );
inputChain->SetBranchStatus( "Strip_Back " , true );
inputChain->SetBranchStatus( "PAD_E " , true );
inputChain->SetBranchStatus( "PAD_T " , true );
}
///////////////////////////////////////////////////////////////////////////
void TSharcPhysics::InitializeRootOutput()
{
TTree* outputTree = RootOutput::getInstance()->GetTree();
outputTree->Branch( "Sharc" , "TSharcPhysics" , &m_EventPhysics );
}
///// Specific to SharcArray ////
void TSharcPhysics::AddBoxDetector(double Z)
{
double BOX_Wafer_Width = 52.20;
double BOX_Wafer_Length = 76.20;
int BOX_Wafer_Front_NumberOfStrip = 24 ;
int BOX_Wafer_Back_NumberOfStrip = 48 ;
double StripPitchFront = BOX_Wafer_Length/BOX_Wafer_Front_NumberOfStrip ; //mm
double StripPitchBack = BOX_Wafer_Width/BOX_Wafer_Back_NumberOfStrip ; //mm
TVector3 U; TVector3 V;TVector3 Strip_1_1;
for(int i = 0 ; i < 4 ; i++){
m_NumberOfDetector++;
if(Z<0){// Up Stream
if(i==0) {U=TVector3(1,0,0);V=TVector3(0,0,1); Strip_1_1=TVector3(-36.,42.5,-56.) ;}
else if(i==1) {U=TVector3(0,1,0);V=TVector3(0,0,1); Strip_1_1=TVector3(-42.5,-36.,-56.) ;}
else if(i==2) {U=TVector3(-1,0,0);V=TVector3(0,0,1); Strip_1_1=TVector3(36.,-42.5,-56.) ;}
else if(i==3) {U=TVector3(0,-1,0);V=TVector3(0,0,1); Strip_1_1=TVector3(42.5,36.,-56.) ;}
}
if(Z>0){//Down Stream
if(i==0) {U=TVector3(-1,0,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(36.,40.5,60.) ;}
else if(i==1) {U=TVector3(0,-1,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(-40.5,36.,60.) ;}
else if(i==2) {U=TVector3(1,0,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(-36.,-40.5,60.) ;}
else if(i==3) {U=TVector3(0,1,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(40.5,-36.,60.) ;}
}
// Buffer object to fill Position Array
vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ;
vector< vector< double > > OneBoxStripPositionX ;
vector< vector< double > > OneBoxStripPositionY ;
vector< vector< double > > OneBoxStripPositionZ ;
TVector3 StripCenter = Strip_1_1;
for(int f = 0 ; f < BOX_Wafer_Front_NumberOfStrip ; f++){
lineX.clear() ;
lineY.clear() ;
lineZ.clear() ;
for(int b = 0 ; b < BOX_Wafer_Back_NumberOfStrip ; b++){
StripCenter = Strip_1_1 + ( StripPitchFront*f*U + StripPitchBack*b*V );
lineX.push_back( StripCenter.X() );
lineY.push_back( StripCenter.Y() );
lineZ.push_back( StripCenter.Z() );
// cout << "D" << m_NumberOfDetector << " F"<<f << " B" <<b<< "("<< StripCenter.X() << ";"<<StripCenter.Y()<< ";"<<StripCenter.Z()<<")"<<endl;
}
OneBoxStripPositionX.push_back(lineX);
OneBoxStripPositionY.push_back(lineY);
OneBoxStripPositionZ.push_back(lineZ);
}
m_StripPositionX.push_back( OneBoxStripPositionX ) ;
m_StripPositionY.push_back( OneBoxStripPositionY ) ;
m_StripPositionZ.push_back( OneBoxStripPositionZ ) ;
}
}
void TSharcPhysics::AddQQQDetector( double R,double Phi,double Z){
double QQQ_R_Min = 9.+R-R;
double QQQ_R_Max = 41.0;
double QQQ_Phi_Min = 2.0*M_PI/180. ;
double QQQ_Phi_Max = 83.6*M_PI/180. ;
Phi= Phi*M_PI/180.;
Z= -63.5;
int QQQ_Radial_NumberOfStrip = 16 ;
int QQQ_Sector_NumberOfStrip = 24 ;
double StripPitchSector = (QQQ_Phi_Max-QQQ_Phi_Min)/QQQ_Sector_NumberOfStrip ; //radial strip spacing in rad
double StripPitchRadial = (QQQ_R_Max-QQQ_R_Min)/QQQ_Radial_NumberOfStrip ; // ring strip spacing in mm
TVector3 Strip_1_1;
m_NumberOfDetector++;
Strip_1_1=TVector3(0,0,Z);
// Buffer object to fill Position Array
vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ;
vector< vector< double > > OneQQQStripPositionX ;
vector< vector< double > > OneQQQStripPositionY ;
vector< vector< double > > OneQQQStripPositionZ ;
TVector3 StripCenter = Strip_1_1;
for(int f = 0 ; f < QQQ_Radial_NumberOfStrip ; f++){
lineX.clear() ;
lineY.clear() ;
lineZ.clear() ;
for(int b = 0 ; b < QQQ_Sector_NumberOfStrip ; b++){
StripCenter = Strip_1_1;
StripCenter.SetY(QQQ_R_Max-StripPitchRadial*f);
StripCenter.SetZ(Z);
StripCenter.RotateZ(Phi+QQQ_Phi_Min+b*StripPitchSector);
lineX.push_back( StripCenter.X() );
lineY.push_back( StripCenter.Y() );
lineZ.push_back( StripCenter.Z() );
}
OneQQQStripPositionX.push_back(lineX);
OneQQQStripPositionY.push_back(lineY);
OneQQQStripPositionZ.push_back(lineZ);
}
m_StripPositionX.push_back( OneQQQStripPositionX ) ;
m_StripPositionY.push_back( OneQQQStripPositionY ) ;
m_StripPositionZ.push_back( OneQQQStripPositionZ ) ;
return;
}
TVector3 TSharcPhysics::GetDetectorNormal( const int i) const
{
/* TVector3 U = TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 1 ) ,
GetStripPositionY( DetectorNumber[i] , 24 , 1 ) ,
GetStripPositionZ( DetectorNumber[i] , 24 , 1 ) )
-TVector3 ( GetStripPositionX( DetectorNumber[i] , 1 , 1 ) ,
GetStripPositionY( DetectorNumber[i] , 1 , 1 ) ,
GetStripPositionZ( DetectorNumber[i] , 1 , 1 ) );
TVector3 V = TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 48 ) ,
GetStripPositionY( DetectorNumber[i] , 24 , 48 ) ,
GetStripPositionZ( DetectorNumber[i] , 24 , 48 ) )
-TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 1 ) ,
GetStripPositionY( DetectorNumber[i] , 24 , 1 ) ,
GetStripPositionZ( DetectorNumber[i] , 24 , 1 ) );
TVector3 Normal = U.Cross(V);
return(Normal.Unit()) ;*/
return (TVector3(0,0,i));
}
TVector3 TSharcPhysics::GetPositionOfInteraction(const int i) const
{
TVector3 Position = TVector3 ( GetStripPositionX( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) ,
GetStripPositionY( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) ,
GetStripPositionZ( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) ) ;
return(Position) ;
}
void TSharcPhysics::InitializeStandardParameter()
{
// Enable all channel
vector< bool > ChannelStatus;
m_FrontChannelStatus.clear() ;
m_BackChannelStatus.clear() ;
m_PADChannelStatus.clear() ;
ChannelStatus.resize(24,true);
for(int i = 0 ; i < m_NumberOfDetector ; ++i)
{
m_FrontChannelStatus[i] = ChannelStatus;
}
ChannelStatus.resize(48,true);
for(int i = 0 ; i < m_NumberOfDetector ; ++i)
{
m_BackChannelStatus[i] = ChannelStatus;
}
ChannelStatus.resize(1,true);
for(int i = 0 ; i < m_NumberOfDetector ; ++i)
{
m_PADChannelStatus[i] = ChannelStatus;
}
m_MaximumStripMultiplicityAllowed = m_NumberOfDetector ;
return;
}
///////////////////////////////////////////////////////////////////////////
namespace Sharc_LOCAL
{
// tranform an integer to a string
string itoa(unsigned int value)
{
char buffer [33];
sprintf(buffer,"%d",value);
return buffer;
}
// DSSD
// Front
double fStrip_Front_E(const TSharcData* m_EventData , const int i)
{
return CalibrationManager::getInstance()->ApplyCalibration( "SHARC/D" + itoa( m_EventData->GetFront_DetectorNbr(i) ) + "_STRIP_FRONT" + itoa( m_EventData->GetFront_StripNbr(i) ) + "_E",
m_EventData->GetFront_Energy(i) );
}
double fStrip_Front_T(const TSharcData* m_EventData , const int i)
{
return CalibrationManager::getInstance()->ApplyCalibration( "SHARC/D" + itoa( m_EventData->GetFront_DetectorNbr(i) ) + "_STRIP_FRONT" + itoa( m_EventData->GetFront_StripNbr(i) ) +"_T",
m_EventData->GetFront_TimeCFD(i) );
}
// Back
double fStrip_Back_E(const TSharcData* m_EventData , const int i)
{
return CalibrationManager::getInstance()->ApplyCalibration( "SHARC/D" + itoa( m_EventData->GetBack_DetectorNbr(i) ) + "_STRIP_BACK" + itoa( m_EventData->GetBack_StripNbr(i) ) +"_E",
m_EventData->GetBack_Energy(i) );
}
double fStrip_Back_T(const TSharcData* m_EventData , const int i)
{
return CalibrationManager::getInstance()->ApplyCalibration( "SHARC/D" + itoa( m_EventData->GetBack_DetectorNbr(i) ) + "_STRIP_BACK" + itoa( m_EventData->GetBack_StripNbr(i) ) +"_T",
m_EventData->GetFront_TimeCFD(i) );
}
// PAD
double fPAD_E(const TSharcData* m_EventData , const int i)
{
return CalibrationManager::getInstance()->ApplyCalibration( "SHARC/D" + itoa( m_EventData->GetPAD_DetectorNbr(i) ) + "_PAD" +"_E",
m_EventData->GetPAD_Energy(i) );
}
double fPAD_T(const TSharcData* m_EventData , const int i)
{
return CalibrationManager::getInstance()->ApplyCalibration( "SHARC/D" + itoa( m_EventData->GetPAD_DetectorNbr(i) ) + "_PAD" +"_T",
m_EventData->GetPAD_TimeCFD(i) );
}
}