GeneralSort without trace is done
This commit is contained in:
parent
aa6a70d805
commit
38cf50ce5c
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -3,6 +3,9 @@ working/Settings
|
||||||
|
|
||||||
EventBuilder
|
EventBuilder
|
||||||
*.root
|
*.root
|
||||||
|
*.pcm
|
||||||
|
*.d
|
||||||
|
*.so
|
||||||
|
|
||||||
data_raw
|
data_raw
|
||||||
root_data
|
root_data
|
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
|
@ -70,7 +70,12 @@
|
||||||
"qdatetime": "cpp",
|
"qdatetime": "cpp",
|
||||||
"fstream": "cpp",
|
"fstream": "cpp",
|
||||||
"allocator": "cpp",
|
"allocator": "cpp",
|
||||||
"qsignalmapper": "cpp"
|
"qsignalmapper": "cpp",
|
||||||
|
"GeneralSort.C": "cpp",
|
||||||
|
"forward_list": "cpp",
|
||||||
|
"ChainMonitors.C": "cpp",
|
||||||
|
"GeneralSortAgent.C": "cpp",
|
||||||
|
"kaka.C": "cpp"
|
||||||
},
|
},
|
||||||
|
|
||||||
"better-comments.multilineComments": true,
|
"better-comments.multilineComments": true,
|
||||||
|
|
29
SOLARIS.sh
29
SOLARIS.sh
|
@ -1,23 +1,36 @@
|
||||||
#=================== Main
|
|
||||||
unset SOLARISSYS
|
#========== this script define the SOLARISANADIR as global env.
|
||||||
|
|
||||||
|
unset SOLARISANADIR
|
||||||
|
|
||||||
SOURCE=${BASH_ARGV[0]}
|
SOURCE=${BASH_ARGV[0]}
|
||||||
PCName=$(uname -n)
|
PCName=$(uname -n)
|
||||||
if [ $(uname -n) == "solaris-daq" ]; then
|
if [ $(uname -n) == "solaris-daq" ]; then
|
||||||
SOLARISSYS=~/Analysis
|
SOLARISANADIR=~/Analysis
|
||||||
else
|
else
|
||||||
if [ $(pwd) == $HOME ]; then
|
if [ $(pwd) == $HOME ]; then
|
||||||
SOLARISSYS=$(dirname ${SOURCE})
|
SOLARISANADIR=$(dirname ${SOURCE})
|
||||||
|
|
||||||
if [[ ${SOLARISSYS} == *"$HOME"* ]]; then
|
if [[ ${SOLARISANADIR} == *"$HOME"* ]]; then
|
||||||
dummpy=0
|
dummpy=0
|
||||||
else
|
else
|
||||||
SOLARISSYS=${HOME}/$SOLARISSYS
|
SOLARISANADIR=${HOME}/$SOLARISANADIR
|
||||||
fi
|
fi
|
||||||
|
|
||||||
else
|
else
|
||||||
SOLARISSYS=$(pwd)
|
SOLARISANADIR=$(pwd)
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export SOLARISSYS
|
export SOLARISANADIR
|
||||||
|
|
||||||
|
echo "####### set global variable SOLARISANADIR = ${SOLARISANADIR}"
|
||||||
|
|
||||||
|
export PATH=$PATH:$SOLARISANADIR/armory
|
||||||
|
|
||||||
|
echo "####### add ${SOLARISANADIR}/armory into PATH"
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
|
||||||
|
alias 2Working='cd ${SOLARISANADIR}/working'
|
||||||
|
|
80
SetupNewExp
80
SetupNewExp
|
@ -9,70 +9,7 @@
|
||||||
##
|
##
|
||||||
####################################################
|
####################################################
|
||||||
|
|
||||||
|
source armory/Process_BasicConfig
|
||||||
RED='\033[1;31m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
ORANGE='\033[0;33m'
|
|
||||||
GREEN='\033[1;32m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
Cyan='\033[0;36m'
|
|
||||||
NC='\033[0m' #no color
|
|
||||||
|
|
||||||
|
|
||||||
############## need to distingish mac and daq
|
|
||||||
Arch="$(uname -s)"
|
|
||||||
PCName="$(hostname)"
|
|
||||||
PCID=-1 #if PCID == 1 (DAQ), 2 (MAC), -1(OTHER)
|
|
||||||
|
|
||||||
#------ Set up data folder, check disk space
|
|
||||||
echo -e "${YELLOW} 0) ################## Check computer name and arch. ${NC}"
|
|
||||||
echo "PC name : ${PCName}"
|
|
||||||
echo "Archetech: ${Arch}"
|
|
||||||
|
|
||||||
if [ ${Arch} == "Linux" ] && [ ${PCName} == "solaris-daq" ]; then
|
|
||||||
|
|
||||||
PCID=1
|
|
||||||
|
|
||||||
pathsSetting=${HOME}/SOLARIS_QT6_DAQ/programSettings.txt
|
|
||||||
if [ -e ${pathsSetting} ]; then
|
|
||||||
echo "Found DAQ programSettings.txt for paths settings"
|
|
||||||
|
|
||||||
analysisPath=$(cat ${pathsSetting} | head -n 2 | tail -n 1)
|
|
||||||
|
|
||||||
if [ "${analysisPath}" = "$(pwd)" ]; then
|
|
||||||
echo "The analysisPath from ${analysisPath} is same as the present folder $(pwd)"
|
|
||||||
else
|
|
||||||
echo "The analysisPath from ${analysisPath} is different from present folder $(pwd). Abort."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
rawDataPathParent=$(cat ${pathsSetting} | head -n 3 | tail -n 1)
|
|
||||||
rootDataPathParent=$(cat ${pathsSetting} | head -n 4 | tail -n 1)
|
|
||||||
|
|
||||||
databaseIP=$(cat ${pathsSetting} | head -n 6 | tail -n 1)
|
|
||||||
databaseName=$(cat ${pathsSetting} | head -n 7 | tail -n 1)
|
|
||||||
|
|
||||||
#echo ${rawDataPathParent}
|
|
||||||
#echo ${rootDataPathParent}
|
|
||||||
#echo ${databaseIP}
|
|
||||||
#echo ${databaseName}
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
echo "${RED} Cannot found DAQ programSettings.txt for path settings ${NC}"
|
|
||||||
echo "Seek Ryan for help"
|
|
||||||
exit
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ ${Arch} == "Darwin" ] && [ ${PCName} == "SOLARISs-Mac-Studio.local" ]; then
|
|
||||||
PCID=2
|
|
||||||
rawDataPathParent=${HOME}/experimentalData/
|
|
||||||
rootDataPathParent=${HOME}/experimentalData/
|
|
||||||
fi
|
|
||||||
|
|
||||||
############### Check is git exist
|
############### Check is git exist
|
||||||
isGitExist=0
|
isGitExist=0
|
||||||
|
@ -105,11 +42,10 @@ echo " 6) Tell Database SetupNewExp change exp. (only from the DAQ)"
|
||||||
echo " 7) git push (if new exp.)"
|
echo " 7) git push (if new exp.)"
|
||||||
echo "============================================================="
|
echo "============================================================="
|
||||||
|
|
||||||
|
|
||||||
expName=$1
|
expName=$1
|
||||||
|
|
||||||
############### this will define global enviroment varibales, like the analysis path, export armory
|
############### this will define global enviroment varibales, like the analysis path, export armory
|
||||||
#source SOLARIS.sh
|
source SOLARIS.sh
|
||||||
|
|
||||||
############### Check git
|
############### Check git
|
||||||
echo -e "${YELLOW} 1) ################## Git Fetch ${NC}"
|
echo -e "${YELLOW} 1) ################## Git Fetch ${NC}"
|
||||||
|
@ -146,7 +82,7 @@ else
|
||||||
|
|
||||||
if [ ${PCID} -eq 1 ]; then
|
if [ ${PCID} -eq 1 ]; then
|
||||||
|
|
||||||
echo -e "You are going to create a${GREEN} NEW ${NC}branch ${Cyan}${expName}${NC} from branch : $(git branch --show-current)"
|
echo -e "You are going to create a${GREEN} NEW ${NC}branch ${CYAN}${expName}${NC} from branch : $(git branch --show-current)"
|
||||||
read -p "Are you sure? (Y/N) " createNewBranch
|
read -p "Are you sure? (Y/N) " createNewBranch
|
||||||
if [ ${createNewBranch} == "Y" ]; then
|
if [ ${createNewBranch} == "Y" ]; then
|
||||||
git checkout -b ${expName}
|
git checkout -b ${expName}
|
||||||
|
@ -156,7 +92,7 @@ else
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
echo -e "${Cyan} ONLY the DAQ machines can create branch ${NC}"
|
echo -e "${CYAN} ONLY the DAQ machines can create branch ${NC}"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -190,6 +126,7 @@ if [ ${isBranchExist} -eq 0 ]; then
|
||||||
echo "rootDataPath=${rootDataPathParent}"/${expName} >> ${expNamePath}
|
echo "rootDataPath=${rootDataPathParent}"/${expName} >> ${expNamePath}
|
||||||
echo "runID=0" >> ${expNamePath}
|
echo "runID=0" >> ${expNamePath}
|
||||||
echo "elogID=0" >> ${expNamePath}
|
echo "elogID=0" >> ${expNamePath}
|
||||||
|
echo "#------------end of file." >> ${expNamePath}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "${YELLOW} 4) ################## making new folders in ${rawDataPathParent} ${NC}"
|
echo -e "${YELLOW} 4) ################## making new folders in ${rawDataPathParent} ${NC}"
|
||||||
|
@ -231,11 +168,14 @@ if [ ${PCID} -eq 1 ]; then
|
||||||
echo -e "=================== Tell the database"
|
echo -e "=================== Tell the database"
|
||||||
|
|
||||||
haha1=${databaseIP}"/write?db="${databaseName}
|
haha1=${databaseIP}"/write?db="${databaseName}
|
||||||
haha2="RunID,start=0 value=0,expName=\"${expName}\",comment=\"New_experiment_[${expName}]_was_created\""
|
|
||||||
|
|
||||||
|
if [ ${isBranchExist} -eq 0 ]; then
|
||||||
|
haha2="RunID,start=0 value=0,expName=\"${expName}\",comment=\"New_experiment_[${expName}]_was_created.\""
|
||||||
|
else
|
||||||
|
haha2="RunID,start=0 value=0,expName=\"${expName}\",comment=\"New_experiment_[${expName}]_was_switched.\""
|
||||||
|
fi
|
||||||
#echo $haha1
|
#echo $haha1
|
||||||
#echo $haha2
|
#echo $haha2
|
||||||
|
|
||||||
curl -s -v -XPOST "$haha1" --data-binary "$haha2" --max-time 1 --connect-timeout 1
|
curl -s -v -XPOST "$haha1" --data-binary "$haha2" --max-time 1 --connect-timeout 1
|
||||||
|
|
||||||
#===== clean up working if it is new
|
#===== clean up working if it is new
|
||||||
|
|
65
armory/AnalysisLib.h
Normal file
65
armory/AnalysisLib.h
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#ifndef ANALYSIS_LIB_H
|
||||||
|
#define ANALYSIS_LIB_H
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
std::vector<int> ExtractDetNum(std::vector<std::vector<int>> mapping, std::vector<std::string> detName, std::vector<int> detMaxID){
|
||||||
|
std::vector<int> detNum;
|
||||||
|
for( int i = 0; i < (int) detName.size(); i ++) detNum.push_back(0);
|
||||||
|
for( int i = 0; i < (int) mapping.size(); i ++){
|
||||||
|
for( int j = 0; j < (int) mapping[i].size(); j++){
|
||||||
|
if( mapping[i][j] < 0) continue;
|
||||||
|
for( int k = 0; k < (int) detName.size() ; k ++ ){
|
||||||
|
int low = (k == 0 ? 0 : detMaxID[k-1]);
|
||||||
|
int high = detMaxID[k];
|
||||||
|
if( low <= mapping[i][j] && mapping[i][j] < high ) {
|
||||||
|
detNum[k]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return detNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintMapping(std::vector<std::vector<int>> mapping, std::vector<std::string> detName, std::vector<int> detMaxID){
|
||||||
|
|
||||||
|
//------------ Red Green Yellow Cyan
|
||||||
|
std::vector<const char* > Color = {"\033[31m", "\033[32m", "\033[33m", "\033[36m"};
|
||||||
|
|
||||||
|
printf("==================================== Mapping ===================================\n");
|
||||||
|
std::vector<int> detNum = ExtractDetNum(mapping, detName, detMaxID);
|
||||||
|
for(int i = 0 ; i < (int) detName.size(); i++) {
|
||||||
|
printf(" %2d | %7s | %3d | %3d - %3d\n", i, detName[i].c_str(), detNum[i], (i == 0 ? 0 : detMaxID[i-1]), detMaxID[i]);
|
||||||
|
}
|
||||||
|
for( int i = 0; i < (int) mapping.size(); i++){
|
||||||
|
printf("Digi-%d ------------------------------------------------------------------------ \n", i);
|
||||||
|
int colorIndex = -1;
|
||||||
|
for( int j = 0; j < (int) mapping[i].size(); j++){
|
||||||
|
if( mapping[i][j] < 0 ){
|
||||||
|
printf("%4d,", mapping[i][j]);
|
||||||
|
}else{
|
||||||
|
for( int k = 0; k < (int) detName.size() ; k ++ ){
|
||||||
|
int low = (k == 0 ? 0 : detMaxID[k-1]);
|
||||||
|
int high = detMaxID[k];
|
||||||
|
if( low <= mapping[i][j] && mapping[i][j] < high ) {
|
||||||
|
if( k == 0 ) {
|
||||||
|
colorIndex = (colorIndex + 1) % 3;
|
||||||
|
}else{
|
||||||
|
colorIndex = 3;
|
||||||
|
}
|
||||||
|
printf("%s%4d\033[0m,", Color[colorIndex], mapping[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( j % 16 == 15 ) printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("================================================================================\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -6,8 +6,9 @@
|
||||||
#include "TTree.h"
|
#include "TTree.h"
|
||||||
#include "TMath.h"
|
#include "TMath.h"
|
||||||
#include "TString.h"
|
#include "TString.h"
|
||||||
#include "TClonesArray.h"
|
#include "TMacro.h"
|
||||||
#include "TVector.h"
|
//#include "TClonesArray.h" // plan to save trace as TVector with TClonesArray
|
||||||
|
//#include "TVector.h"
|
||||||
|
|
||||||
#define MAX_ID 64
|
#define MAX_ID 64
|
||||||
#define MAX_TRACE_LEN 2500
|
#define MAX_TRACE_LEN 2500
|
||||||
|
@ -41,14 +42,18 @@ int bd[MAX_ID] = {0};
|
||||||
int ch[MAX_ID] = {0};
|
int ch[MAX_ID] = {0};
|
||||||
int e[MAX_ID] = {0};
|
int e[MAX_ID] = {0};
|
||||||
unsigned long long e_t[MAX_ID] = {0};
|
unsigned long long e_t[MAX_ID] = {0};
|
||||||
|
unsigned short lowFlag[MAX_ID] = {0};
|
||||||
|
unsigned short highFlag[MAX_ID] = {0};
|
||||||
int traceLen[MAX_ID] = {0};
|
int traceLen[MAX_ID] = {0};
|
||||||
int trace[MAX_ID][MAX_TRACE_LEN] = {0};
|
int trace[MAX_ID][MAX_TRACE_LEN] = {0};
|
||||||
|
|
||||||
void fillData(int &fileID, const bool &saveTrace){
|
void fillData(int &fileID, const bool &saveTrace){
|
||||||
bd[multi] = fileID;
|
bd[multi] = fileID;
|
||||||
ch[multi] = evt[fileID]->channel;
|
ch[multi] = evt[fileID]->channel;
|
||||||
e[multi] = evt[fileID]->energy;
|
e[multi] = evt[fileID]->energy;
|
||||||
e_t[multi] = evt[fileID]->timestamp;
|
e_t[multi] = evt[fileID]->timestamp;
|
||||||
|
lowFlag[multi] = evt[fileID]->flags_low_priority;
|
||||||
|
highFlag[multi] = evt[fileID]->flags_high_priority;
|
||||||
|
|
||||||
if( saveTrace ){
|
if( saveTrace ){
|
||||||
traceLen[multi] = evt[fileID]->traceLenght;
|
traceLen[multi] = evt[fileID]->traceLenght;
|
||||||
|
@ -108,19 +113,20 @@ int main(int argc, char ** argv){
|
||||||
|
|
||||||
TTree * tree = new TTree("tree", outFileName);
|
TTree * tree = new TTree("tree", outFileName);
|
||||||
|
|
||||||
tree->Branch("evID", &evID, "event_ID/l");
|
tree->Branch("evID", &evID, "event_ID/l");
|
||||||
tree->Branch("multi", &multi, "multi/I");
|
tree->Branch("multi", &multi, "multi/I");
|
||||||
tree->Branch("bd", bd, "board[multi]/I");
|
tree->Branch("bd", bd, "board[multi]/I");
|
||||||
tree->Branch("ch", ch, "channel[multi]/I");
|
tree->Branch("ch", ch, "channel[multi]/I");
|
||||||
tree->Branch("e", e, "energy[multi]/I");
|
tree->Branch("e", e, "energy[multi]/I");
|
||||||
tree->Branch("e_t", e_t, "energy_timestamp[multi]/l");
|
tree->Branch("e_t", e_t, "energy_timestamp[multi]/l");
|
||||||
|
tree->Branch("lowFlag", lowFlag, "lowFlag[multi]/s");
|
||||||
|
tree->Branch("highFlag", highFlag, "highFlag[multi]/s");
|
||||||
|
|
||||||
if( saveTrace){
|
if( saveTrace){
|
||||||
tree->Branch("tl", traceLen, "traceLen[multi]/I");
|
tree->Branch("tl", traceLen, "traceLen[multi]/I");
|
||||||
tree->Branch("trace", trace, Form("trace[multi][%d]/I", MAX_TRACE_LEN));
|
tree->Branch("trace", trace, Form("trace[multi][%d]/I", MAX_TRACE_LEN));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
reader = new SolReader*[nFile];
|
reader = new SolReader*[nFile];
|
||||||
evt = new Event *[nFile];
|
evt = new Event *[nFile];
|
||||||
|
|
||||||
|
@ -141,6 +147,9 @@ int main(int argc, char ** argv){
|
||||||
findEarliestTime(nFile, fileID);
|
findEarliestTime(nFile, fileID);
|
||||||
fillData(fileID, saveTrace);
|
fillData(fileID, saveTrace);
|
||||||
|
|
||||||
|
unsigned long firstTimeStamp = evt[fileID]->timestamp;
|
||||||
|
unsigned long lastTimeStamp = 0;
|
||||||
|
|
||||||
int last_precentage = 0;
|
int last_precentage = 0;
|
||||||
|
|
||||||
unsigned count = 1;
|
unsigned count = 1;
|
||||||
|
@ -163,6 +172,9 @@ int main(int argc, char ** argv){
|
||||||
}
|
}
|
||||||
|
|
||||||
count ++;
|
count ++;
|
||||||
|
|
||||||
|
if( count == totNumEvent ) lastTimeStamp = evt[fileID]->timestamp;
|
||||||
|
|
||||||
int percentage = count * 100/totNumEvent;
|
int percentage = count * 100/totNumEvent;
|
||||||
|
|
||||||
if( percentage > last_precentage ) {
|
if( percentage > last_precentage ) {
|
||||||
|
@ -175,8 +187,24 @@ int main(int argc, char ** argv){
|
||||||
outRootFile->cd();
|
outRootFile->cd();
|
||||||
tree->Write();
|
tree->Write();
|
||||||
|
|
||||||
printf("===================================== done. ");
|
|
||||||
printf("Number of Event Built is %lld .\n", evID);
|
//======== Save timestamp as TMacro
|
||||||
|
TMacro timeStamp;
|
||||||
|
TString str;
|
||||||
|
str.Form("%lu", firstTimeStamp); timeStamp.AddLine( str.Data() );
|
||||||
|
str.Form("%lu", lastTimeStamp); timeStamp.AddLine( str.Data() );
|
||||||
|
|
||||||
|
timeStamp.Write("timeStamp");
|
||||||
|
|
||||||
|
|
||||||
|
printf("===================================== done. \n");
|
||||||
|
printf("Number of Event Built : %lld\n", evID);
|
||||||
|
printf(" first timestamp : %lu \n", firstTimeStamp);
|
||||||
|
printf(" last timestamp : %lu \n", lastTimeStamp);
|
||||||
|
unsigned long duration = lastTimeStamp - firstTimeStamp;
|
||||||
|
printf(" total duration : %lu = %.2f sec \n", duration, duration * tick2ns * 1.0 / 1e9 );
|
||||||
|
printf("===================================== end of summary. \n");
|
||||||
|
|
||||||
|
|
||||||
//^############## delete new
|
//^############## delete new
|
||||||
for( int i = 0; i < nFile; i++) delete reader[i];
|
for( int i = 0; i < nFile; i++) delete reader[i];
|
||||||
|
|
152
armory/GeneralSort.C
Normal file
152
armory/GeneralSort.C
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
#define GeneralSort_cxx
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "GeneralSort.h"
|
||||||
|
|
||||||
|
#include <TH2.h>
|
||||||
|
#include <TStyle.h>
|
||||||
|
#include <TString.h>
|
||||||
|
#include <TMath.h>
|
||||||
|
|
||||||
|
//^##############################################################
|
||||||
|
Bool_t GeneralSort::Process(Long64_t entry){
|
||||||
|
|
||||||
|
if( entry < 2 ) printf("%s %lld\n", __func__, entry);
|
||||||
|
|
||||||
|
///initialization
|
||||||
|
for( int i = 0; i < detNum[0]; i++){
|
||||||
|
eE[i] = TMath::QuietNaN();
|
||||||
|
xf[i] = TMath::QuietNaN();
|
||||||
|
xn[i] = TMath::QuietNaN();
|
||||||
|
eT [i] = 0;
|
||||||
|
xfT[i] = 0;
|
||||||
|
xnT[i] = 0;
|
||||||
|
|
||||||
|
if( isTraceExist && traceMethod > 0 ){
|
||||||
|
teE[i] = TMath::QuietNaN();
|
||||||
|
teT[i] = TMath::QuietNaN();
|
||||||
|
teR[i] = TMath::QuietNaN();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int i = 0; i < detNum[1]; i++){
|
||||||
|
rdt[i] = TMath::QuietNaN();
|
||||||
|
rdtT[i] = 0;
|
||||||
|
if( isTraceExist && traceMethod > 0 ){
|
||||||
|
trdt[i] = TMath::QuietNaN();
|
||||||
|
trdtT[i] = TMath::QuietNaN();
|
||||||
|
trdtR[i] = TMath::QuietNaN();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
multi = 0;
|
||||||
|
b_event_ID->GetEntry(entry);
|
||||||
|
b_multi->GetEntry(entry);
|
||||||
|
b_bd->GetEntry(entry);
|
||||||
|
b_ch->GetEntry(entry);
|
||||||
|
b_e->GetEntry(entry);
|
||||||
|
b_e_t->GetEntry(entry);
|
||||||
|
|
||||||
|
|
||||||
|
for( int i = 0 ; i < multi; i++){
|
||||||
|
int detID = mapping[bd[i]][ch[i]];
|
||||||
|
int kindIndex = -1;
|
||||||
|
|
||||||
|
for( int g = 0; g < (int) detMaxID.size(); g ++){
|
||||||
|
int low = ( g == 0 ? 0 : detMaxID[g-1]);
|
||||||
|
int high = detMaxID[g];
|
||||||
|
|
||||||
|
if( low <= detID && detID < high ){
|
||||||
|
|
||||||
|
//************** array
|
||||||
|
if( g == 0 ){
|
||||||
|
kindIndex = (kindIndex + 1) % 3;
|
||||||
|
switch (kindIndex){
|
||||||
|
case 0 : { eE[detID] = e[i] * detParity[g]; eT[detID] = e_t[i]; } break;
|
||||||
|
case 1 : { xf[detID] = e[i] * detParity[g]; xfT[detID] = e_t[i]; } break;
|
||||||
|
case 2 : { xn[detID] = e[i] * detParity[g]; xnT[detID] = e_t[i]; } break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//************** rdt
|
||||||
|
if( g == 1 ){
|
||||||
|
detID = detID - detMaxID[g-1];
|
||||||
|
rdt[detID] = e[i] * detParity[g]; rdtT[detID] = e_t[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if( isTraceExist && traceMethod >= 0 ){
|
||||||
|
|
||||||
|
int countTrace = 0;
|
||||||
|
|
||||||
|
arr->Clear("C");
|
||||||
|
|
||||||
|
for( int i = 0; i < multi; i++){
|
||||||
|
int detID = mapping[bd[i]][ch[i]];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
newTree->Fill();
|
||||||
|
|
||||||
|
return kTRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//^##############################################################
|
||||||
|
void GeneralSort::Terminate(){
|
||||||
|
|
||||||
|
printf("========================= %s\n", __func__);
|
||||||
|
|
||||||
|
TString option = GetOption();
|
||||||
|
TObjArray * tokens = option.Tokenize(",");
|
||||||
|
traceMethod = ((TObjString*) tokens->At(0))->String().Atoi();
|
||||||
|
saveFileName = ((TObjString*) tokens->At(1))->String();
|
||||||
|
|
||||||
|
//get entries
|
||||||
|
saveFile = TFile::Open(saveFileName);
|
||||||
|
if( saveFile->IsOpen() ){
|
||||||
|
TTree * tree = (TTree*) saveFile->FindObjectAny("gen_tree");
|
||||||
|
int validCount = tree->GetEntries();
|
||||||
|
|
||||||
|
saveFile->Close();
|
||||||
|
|
||||||
|
printf("=======================================================\n");
|
||||||
|
PrintTraceMethod();
|
||||||
|
printf("----- saved as \033[1;33m%s\033[0m. valid event: %d\n", saveFileName.Data() , validCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//^##############################################################
|
||||||
|
void GeneralSort::Begin(TTree * tree){
|
||||||
|
|
||||||
|
printf( "=================================================================\n");
|
||||||
|
printf( "===================== SOLARIS GeneralSort.C =================\n");
|
||||||
|
printf( "=================================================================\n");
|
||||||
|
|
||||||
|
PrintMapping(mapping, detName, detMaxID);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GeneralSort::SlaveBegin(TTree * /*tree*/){
|
||||||
|
printf("%s\n", __func__);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GeneralSort::SlaveTerminate(){
|
||||||
|
printf("%s\n", __func__);
|
||||||
|
saveFile->cd();
|
||||||
|
newTree->Write();
|
||||||
|
fOutput->Add(proofFile);
|
||||||
|
saveFile->Close();
|
||||||
|
}
|
275
armory/GeneralSort.h
Normal file
275
armory/GeneralSort.h
Normal file
|
@ -0,0 +1,275 @@
|
||||||
|
#ifndef GeneralSort_h
|
||||||
|
#define GeneralSort_h
|
||||||
|
|
||||||
|
#include <TROOT.h>
|
||||||
|
#include <TChain.h>
|
||||||
|
#include <TFile.h>
|
||||||
|
#include <TSelector.h>
|
||||||
|
#include <TObjString.h>
|
||||||
|
#include <TGraph.h>
|
||||||
|
#include <TClonesArray.h>
|
||||||
|
#include <TF1.h>
|
||||||
|
#include <TProofOutputFile.h>
|
||||||
|
|
||||||
|
/*********************************=======
|
||||||
|
|
||||||
|
the sequence of each method
|
||||||
|
|
||||||
|
1) Begin (master, stdout)
|
||||||
|
2) SlaveBegin (slave)
|
||||||
|
3) Init
|
||||||
|
4) Notify
|
||||||
|
5) Process (looping each event)
|
||||||
|
6) SlaveTerminate
|
||||||
|
7) Terminate
|
||||||
|
|
||||||
|
// variable in the Master will not pass to Slave
|
||||||
|
|
||||||
|
******************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/// in Process_Sort, copy the GeneralSortMapping.h to ~/.proof/working/
|
||||||
|
#include "../working/Mapping.h"
|
||||||
|
#include "../armory/AnalysisLib.h"
|
||||||
|
|
||||||
|
double fitFunc(double * x, double * par){
|
||||||
|
/// par[0] = A
|
||||||
|
/// par[1] = t0
|
||||||
|
/// par[2] = rise time
|
||||||
|
/// par[3] = baseline
|
||||||
|
/// par[4] = decay
|
||||||
|
/// par[5] = pre-rise slope
|
||||||
|
|
||||||
|
if( x[0] < par[1] ) return par[3] + par[5] * (x[0]-par[1]);
|
||||||
|
|
||||||
|
return par[3] + par[0] * (1 - TMath::Exp(- (x[0] - par[1]) / par[2]) ) * TMath::Exp(- (x[0] - par[1]) / par[4]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Header file for the classes stored in the TTree if any.
|
||||||
|
class GeneralSort : public TSelector {
|
||||||
|
public :
|
||||||
|
TTree *fChain; //!pointer to the analyzed TTree or TChain
|
||||||
|
|
||||||
|
// Fixed size dimensions of array or collections stored in the TTree if any.
|
||||||
|
|
||||||
|
// Declaration of leaf types
|
||||||
|
ULong64_t evID;
|
||||||
|
Int_t multi;
|
||||||
|
Int_t bd[100]; //[multi]
|
||||||
|
Int_t ch[100]; //[multi]
|
||||||
|
Int_t e[100]; //[multi]
|
||||||
|
ULong64_t e_t[100]; //[multi]
|
||||||
|
UShort_t lowFlag[100]; //[multi]
|
||||||
|
UShort_t highFlag[100]; //[multi]
|
||||||
|
Int_t tl[100]; //[multi]
|
||||||
|
Int_t trace[100][2500]; //[multi]
|
||||||
|
|
||||||
|
// List of branches
|
||||||
|
TBranch *b_event_ID; //!
|
||||||
|
TBranch *b_multi; //!
|
||||||
|
TBranch *b_bd; //!
|
||||||
|
TBranch *b_ch; //!
|
||||||
|
TBranch *b_e; //!
|
||||||
|
TBranch *b_e_t; //!
|
||||||
|
TBranch *b_lowFlag; //!
|
||||||
|
TBranch *b_highFlag; //!
|
||||||
|
TBranch *b_tl; //!
|
||||||
|
TBranch *b_trace; //!
|
||||||
|
|
||||||
|
GeneralSort(TTree * /*tree*/ =0) : fChain(0) {
|
||||||
|
printf("constructor :: %s\n", __func__);
|
||||||
|
|
||||||
|
isTraceExist = false;
|
||||||
|
traceMethod = 0; // -1 = ignore trace, 0 = no trace fit, 1 = fit, 2 = trapezoid
|
||||||
|
|
||||||
|
}
|
||||||
|
virtual ~GeneralSort() { }
|
||||||
|
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(GeneralSort,0);
|
||||||
|
|
||||||
|
bool isTraceExist;
|
||||||
|
int traceMethod;
|
||||||
|
|
||||||
|
void SetTraceMethod(int methodID) {traceMethod = methodID;}
|
||||||
|
void PrintTraceMethod();
|
||||||
|
|
||||||
|
std::vector<int> detNum;
|
||||||
|
|
||||||
|
TString saveFileName;
|
||||||
|
TFile * saveFile; //!
|
||||||
|
TProofOutputFile * proofFile; //!
|
||||||
|
TTree * newTree; //!
|
||||||
|
|
||||||
|
//TODO ---- 2D array
|
||||||
|
Float_t *eE; //!
|
||||||
|
ULong64_t *eT; //!
|
||||||
|
|
||||||
|
Float_t *xf ; //!
|
||||||
|
ULong64_t *xfT; //!
|
||||||
|
|
||||||
|
Float_t *xn ; //!
|
||||||
|
ULong64_t *xnT; //!
|
||||||
|
|
||||||
|
Float_t *rdt ; //!
|
||||||
|
ULong64_t *rdtT; //!
|
||||||
|
|
||||||
|
//trace
|
||||||
|
TClonesArray * arr ;//!
|
||||||
|
TGraph * gTrace; //!
|
||||||
|
TClonesArray * arrTrapezoid ;//!
|
||||||
|
TGraph * gTrapezoid; //!
|
||||||
|
|
||||||
|
Float_t *teE; //!
|
||||||
|
Float_t *teT; //!
|
||||||
|
Float_t *teR; //!
|
||||||
|
|
||||||
|
Float_t *trdt ; //!
|
||||||
|
Float_t *trdtT ; //!
|
||||||
|
Float_t *trdtR ; //!
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GeneralSort_cxx
|
||||||
|
|
||||||
|
//^##############################################################
|
||||||
|
void GeneralSort::Init(TTree *tree){
|
||||||
|
|
||||||
|
printf("%s\n", __func__);
|
||||||
|
|
||||||
|
// Set branch addresses and branch pointers
|
||||||
|
if (!tree) return;
|
||||||
|
fChain = tree;
|
||||||
|
fChain->SetMakeClass(1);
|
||||||
|
|
||||||
|
fChain->SetBranchAddress("evID", &evID, &b_event_ID);
|
||||||
|
fChain->SetBranchAddress("multi", &multi, &b_multi);
|
||||||
|
fChain->SetBranchAddress("bd", bd, &b_bd);
|
||||||
|
fChain->SetBranchAddress("ch", ch, &b_ch);
|
||||||
|
fChain->SetBranchAddress("e", e, &b_e);
|
||||||
|
fChain->SetBranchAddress("e_t", e_t, &b_e_t);
|
||||||
|
fChain->SetBranchAddress("lowFlag", lowFlag, &b_lowFlag);
|
||||||
|
fChain->SetBranchAddress("highFlag", highFlag, &b_highFlag);
|
||||||
|
|
||||||
|
TBranch * br = (TBranch *) fChain->GetListOfBranches()->FindObject("tl");
|
||||||
|
if( br == NULL ){
|
||||||
|
printf(" ++++++++ no Trace.\n");
|
||||||
|
isTraceExist = false;
|
||||||
|
}else{
|
||||||
|
isTraceExist = true;
|
||||||
|
fChain->SetBranchAddress("tl", tl, &b_tl);
|
||||||
|
fChain->SetBranchAddress("trace", trace, &b_trace);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long NumEntries = fChain->GetEntries();
|
||||||
|
printf( "========== total Entry : %ld\n", NumEntries);
|
||||||
|
|
||||||
|
//########################### Get Option
|
||||||
|
TString option = GetOption();
|
||||||
|
TObjArray * tokens = option.Tokenize(",");
|
||||||
|
traceMethod = ((TObjString*) tokens->At(0))->String().Atoi();
|
||||||
|
saveFileName = ((TObjString*) tokens->At(1))->String();
|
||||||
|
|
||||||
|
if( isTraceExist ){
|
||||||
|
PrintTraceMethod();
|
||||||
|
}else{
|
||||||
|
printf("++++++++ no Trace found\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
proofFile = new TProofOutputFile(saveFileName, "M");
|
||||||
|
saveFile = proofFile->OpenFile("RECREATE");
|
||||||
|
|
||||||
|
newTree = new TTree("gen_tree", "Tree After GeneralSort");
|
||||||
|
newTree->SetDirectory(saveFile);
|
||||||
|
newTree->AutoSave();
|
||||||
|
|
||||||
|
detNum = ExtractDetNum(mapping, detName, detMaxID);
|
||||||
|
|
||||||
|
eE = new Float_t[detNum[0]];
|
||||||
|
xf = new Float_t[detNum[0]];
|
||||||
|
xn = new Float_t[detNum[0]];
|
||||||
|
eT = new ULong64_t[detNum[0]];
|
||||||
|
xfT = new ULong64_t[detNum[0]];
|
||||||
|
xnT = new ULong64_t[detNum[0]];
|
||||||
|
|
||||||
|
rdt = new Float_t[detNum[1]];
|
||||||
|
rdtT = new ULong64_t[detNum[1]];
|
||||||
|
|
||||||
|
newTree->Branch("e", eE, Form("Energy[%d]/F", detNum[0]));
|
||||||
|
newTree->Branch("e_t", eT, Form("Energy_Timestamp[%d]/l", detNum[0]));
|
||||||
|
|
||||||
|
newTree->Branch("xf", xf, Form("XF[%d]/F", detNum[0]));
|
||||||
|
newTree->Branch("xf_t", xfT, Form("XF_Timestamp[%d]/l", detNum[0]));
|
||||||
|
|
||||||
|
newTree->Branch("xn", xn, Form("XN[%d]/F", detNum[0]));
|
||||||
|
newTree->Branch("xn_t", xnT, Form("XN_Timestamp[%d]/l", detNum[0]));
|
||||||
|
|
||||||
|
newTree->Branch("rdt", rdt, Form("Recoil[%d]/F", detNum[1]));
|
||||||
|
newTree->Branch("rdt_t", rdtT, Form("Recoil_Timestamp[%d]/l", detNum[1]));
|
||||||
|
|
||||||
|
if( isTraceExist && traceMethod >= 0){
|
||||||
|
|
||||||
|
arr = new TClonesArray("TGraph");
|
||||||
|
|
||||||
|
newTree->Branch("trace", arr, 256000);
|
||||||
|
arr->BypassStreamer();
|
||||||
|
|
||||||
|
if( traceMethod > 0 ){
|
||||||
|
|
||||||
|
teE = new Float_t[detNum[0]];
|
||||||
|
teT = new Float_t[detNum[0]];
|
||||||
|
teR = new Float_t[detNum[0]];
|
||||||
|
|
||||||
|
trdt = new Float_t[detNum[1]];
|
||||||
|
trdtT = new Float_t[detNum[1]];
|
||||||
|
trdtR = new Float_t[detNum[1]];
|
||||||
|
|
||||||
|
newTree->Branch("te", teE, Form("Trace_Energy[%d]/F", detNum[0]));
|
||||||
|
newTree->Branch("te_t", teT, Form("Trace_Energy_Time[%d]/F", detNum[0]));
|
||||||
|
newTree->Branch("te_r", teR, Form("Trace_Energy_RiseTime[%d]/F", detNum[0]));
|
||||||
|
|
||||||
|
newTree->Branch("trdt", trdt , Form("Trace_RDT[%d]/F", detNum[1]));
|
||||||
|
newTree->Branch("trdt_t", trdtT, Form("Trace_RDT_Time[%d]/F", detNum[1]));
|
||||||
|
newTree->Branch("trdt_r", trdtR, Form("Trace_RDT_RiseTime[%d]/F", detNum[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printf("---- end of Init %s\n ", __func__);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool_t GeneralSort::Notify(){
|
||||||
|
printf("%s\n", __func__);
|
||||||
|
return kTRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GeneralSort::PrintTraceMethod(){
|
||||||
|
const char* traceMethodStr;
|
||||||
|
switch(traceMethod) {
|
||||||
|
case -1 : traceMethodStr = "Ignore Trace"; break;
|
||||||
|
case 0 : traceMethodStr = "Copy"; break;
|
||||||
|
case 1 : traceMethodStr = "Fit"; break;
|
||||||
|
case 2 : traceMethodStr = "Trapezoid"; break;
|
||||||
|
default: traceMethodStr = "Unknown"; break;
|
||||||
|
}
|
||||||
|
printf(" Trace method ? %s \n", traceMethodStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // #ifdef GeneralSort_cxx
|
32
armory/GeneralSortAgent.C
Normal file
32
armory/GeneralSortAgent.C
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
|
||||||
|
#include "TTree.h"
|
||||||
|
#include "TProof.h"
|
||||||
|
#include "TChain.h"
|
||||||
|
|
||||||
|
void GeneralSortAgent(Int_t runNum, int nWorker = 1, int traceMethod = 0){
|
||||||
|
|
||||||
|
TString name;
|
||||||
|
name.Form("../root_data/run%03d.root", runNum);
|
||||||
|
|
||||||
|
TChain * chain = new TChain("tree");
|
||||||
|
chain->Add(name);
|
||||||
|
|
||||||
|
chain->GetListOfFiles()->Print();
|
||||||
|
|
||||||
|
printf("----------------------------\n");
|
||||||
|
|
||||||
|
TProof * p = TProof::Open("", Form("workers=%d", abs(nWorker)));
|
||||||
|
p->ShowCache();
|
||||||
|
printf("----------------------------\n");
|
||||||
|
|
||||||
|
TString option;
|
||||||
|
|
||||||
|
//this is the option for TSelector, the first one is traceMethod, 2nd is save fileName;
|
||||||
|
option.Form("%d,../root_data/gen_run%03d.root", traceMethod, runNum);
|
||||||
|
|
||||||
|
chain->SetProof();
|
||||||
|
chain->Process("../armory/GeneralSort.C+", option);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
68
armory/Process_BasicConfig
Normal file
68
armory/Process_BasicConfig
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#!/bin/bash -l
|
||||||
|
|
||||||
|
##############################################
|
||||||
|
#
|
||||||
|
# This script define color, PCID, and dataPath
|
||||||
|
#
|
||||||
|
##############################################
|
||||||
|
|
||||||
|
RED='\033[1;31m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
ORANGE='\033[0;33m'
|
||||||
|
GREEN='\033[1;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m' #no color
|
||||||
|
LRED='\033[1;91m'
|
||||||
|
|
||||||
|
############## need to distingish mac and daq
|
||||||
|
Arch="$(uname -s)"
|
||||||
|
PCName="$(hostname)"
|
||||||
|
PCID=-1 #if PCID == 1 (DAQ), 2 (MAC), -1(OTHER)
|
||||||
|
|
||||||
|
#------ Set up data folder, check disk space
|
||||||
|
echo -e "${YELLOW} ##################### Check computer name and arch. ${NC}"
|
||||||
|
echo "PC name : ${PCName}"
|
||||||
|
echo "Archetech: ${Arch}"
|
||||||
|
|
||||||
|
if [ ${Arch} == "Linux" ] && [ ${PCName} == "solaris-daq" ]; then
|
||||||
|
|
||||||
|
PCID=1
|
||||||
|
|
||||||
|
pathsSetting=${HOME}/SOLARIS_QT6_DAQ/programSettings.txt
|
||||||
|
if [ -e ${pathsSetting} ]; then
|
||||||
|
#echo "Found DAQ programSettings.txt for paths settings"
|
||||||
|
|
||||||
|
analysisPath=$(cat ${pathsSetting} | head -n 2 | tail -n 1)
|
||||||
|
|
||||||
|
if [ ! "${analysisPath}" = "$SOLARISANADIR" ]; then
|
||||||
|
echo "The analysisPath from ${analysisPath} is different from present folder $SOLARISANADIR. Abort."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
rawDataPathParent=$(cat ${pathsSetting} | head -n 3 | tail -n 1)
|
||||||
|
rootDataPathParent=$(cat ${pathsSetting} | head -n 4 | tail -n 1)
|
||||||
|
|
||||||
|
databaseIP=$(cat ${pathsSetting} | head -n 6 | tail -n 1)
|
||||||
|
databaseName=$(cat ${pathsSetting} | head -n 7 | tail -n 1)
|
||||||
|
|
||||||
|
#echo ${rawDataPathParent}
|
||||||
|
#echo ${rootDataPathParent}
|
||||||
|
#echo ${databaseIP}
|
||||||
|
#echo ${databaseName}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
echo "${RED} Cannot found DAQ programSettings.txt for path settings ${NC}"
|
||||||
|
echo "Seek Ryan for help"
|
||||||
|
exit
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${Arch} == "Darwin" ] && [ ${PCName} == "SOLARISs-Mac-Studio.local" ]; then
|
||||||
|
PCID=2
|
||||||
|
rawDataPathParent=${HOME}/experimentalData/
|
||||||
|
rootDataPathParent=${HOME}/experimentalData/
|
||||||
|
fi
|
84
armory/Process_EventBuilder
Normal file
84
armory/Process_EventBuilder
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
################################################ EventBuilder
|
||||||
|
RUN=$1
|
||||||
|
EventBld=$2
|
||||||
|
|
||||||
|
rawDataPath=${SOLARISANADIR}/data_raw
|
||||||
|
rootDataPath=${SOLARISANADIR}/root_data
|
||||||
|
|
||||||
|
rawDataPattern="${rawDataPath}/${expName}_${RUN}_"
|
||||||
|
rootDataName="${rootDataPath}/run${RUN}.root"
|
||||||
|
|
||||||
|
dir=$(pwd)
|
||||||
|
cd ${SOLARISANADIR}/armory
|
||||||
|
make
|
||||||
|
cd ${dir}
|
||||||
|
|
||||||
|
#==== check raw data exist
|
||||||
|
isRawDataExist=`ls -1 ${rawDataPattern}* 2>/dev/null | wc -l`
|
||||||
|
|
||||||
|
if [ ! $isRawDataExist -gt 0 ]; then
|
||||||
|
echo -e "${LRED}################# Run Data not exist. Abort ${NC}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${CYAN} ============== list of files ${NC}"
|
||||||
|
\du -h ${rawDataPattern}*
|
||||||
|
|
||||||
|
totSize=$(\du -hc ${rawDataPattern}* | tail -n 1 | awk '{print $1}')
|
||||||
|
echo -e "${CYAN} ============== total file size : ${totSize}${NC}"
|
||||||
|
|
||||||
|
|
||||||
|
#==== check raw data timeStamp
|
||||||
|
if [ ${Arch} == "Linux" ]; then
|
||||||
|
rawDataTime=`stat -c "%Z" ${rawDataPattern}* | sort -rn | head -1`
|
||||||
|
else
|
||||||
|
rawDataTime=`stat -f "%Sm" -t "%Y%m%d%H%M%S" ${rawDataPattern}* | sort -rn | head -1`
|
||||||
|
fi
|
||||||
|
|
||||||
|
#==== check if root data exist
|
||||||
|
isRootDataExist=`ls -1 $rootDataName 2>/dev/null | wc -l`
|
||||||
|
|
||||||
|
#==== if merged data exist, check timeStamp
|
||||||
|
if [ ${isRootDataExist} -gt 0 ]; then
|
||||||
|
if [ ${Arch} == "Linux" ]; then
|
||||||
|
rootDataTime=`stat -c "%Z" $rootDataName | sort -rn | head -1`
|
||||||
|
else
|
||||||
|
rootDataTime=`stat -f "%Sm" -t "%Y%m%d%H%M%S" $rootDataName | sort -rn | head -1`
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
rootDataTime=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ ${EventBld} -eq 0 ]; then
|
||||||
|
|
||||||
|
echo -e "${LRED}>>>>>>>>>>>>>>>>>>>>> Event Building Skipped by user. ${NC}"
|
||||||
|
|
||||||
|
elif [ ${EventBld} -ge 1 ]; then
|
||||||
|
|
||||||
|
if [ ${rawDataTime} -ge ${rootDataTime} ]; then
|
||||||
|
|
||||||
|
echo -e "${LRED}>>>>>>>>>>>>>>>>>>>>> Event Building $(date) ${NC}"
|
||||||
|
if [ ${EventBld} -eq 1 ]; then
|
||||||
|
EventBuilder $rootDataName ${timeWin} 0 `ls -1 ${rawDataPattern}*`
|
||||||
|
elif [ ${EventBld} -eq 2 ]; then
|
||||||
|
EventBuilder $rootDataName ${timeWin} 1 `ls -1 ${rawDataPattern}*`
|
||||||
|
fi
|
||||||
|
echo -e "${LRED}<<<<<<<<<<<<<<<< Done Event Building $(date) ${NC}"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}Merged data are newer than raw data. No need to merged again.${NC}"
|
||||||
|
echo -e "${GREEN}You can Force merging using option -${EventBld}, ${ORANGE} see ./process_run.sh -help${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
echo -e "${LRED}>>>>>>>>>>>>>>> Force Event Building $(date) ${NC}"
|
||||||
|
if [ ${EventBld} -eq -1 ]; then
|
||||||
|
EventBuilder $rootDataName ${timeWin} 0 `ls -1 ${rawDataPattern}*`
|
||||||
|
elif [ ${EventBld} -eq -2 ]; then
|
||||||
|
EventBuilder $rootDataName ${timeWin} 1 `ls -1 ${rawDataPattern}*`
|
||||||
|
fi
|
||||||
|
echo -e "${LRED}<<<<<<<<<<<<<<<< Done Event Building $(date) ${NC}"
|
||||||
|
|
||||||
|
fi
|
17
armory/Process_MultiRuns
Executable file
17
armory/Process_MultiRuns
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z $SOLARISANADIR ]; then
|
||||||
|
echo "###### env variable SOLARISANADIR not defined. Abort. Please run the SOLARIS.sh."
|
||||||
|
echo "better add \"source <path_to_SOLARIS.sh>\" into .bashrc"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -eq 0 ] || [ $# -eq 1 ] || [ $1 == "-help" ]; then
|
||||||
|
echo "$./process_MultiRuns [RunNum1] [RunNum2] [EventBuild] [GeneralSort]"
|
||||||
|
echo " RunNum1 = start run number"
|
||||||
|
echo " RunNum2 = stop run number"
|
||||||
|
echo " EventBld = 2/1/0* || 2 = with Trace"
|
||||||
|
echo " GenralSort = n/1/0* || 1 = GeneralSort.C, n = GeneralSortTraceProof.C with n-worker"
|
||||||
|
echo " * negative option = force "
|
||||||
|
exit 1
|
||||||
|
fi;
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
|
@ -1,10 +1,18 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z $SOLARISANADIR ]; then
|
||||||
|
echo "###### env variable SOLARISANADIR not defined. Abort. Please run the SOLARIS.sh."
|
||||||
|
echo "better add \"source <path_to_SOLARIS.sh>\" into .bashrc"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
if [ $# -eq 0 ] || [ $1 == "-help" ]; then
|
if [ $# -eq 0 ] || [ $1 == "-help" ]; then
|
||||||
echo "$ Proess_Run [RunNum] [EventBuild] [Monitor]"
|
echo "$ Proess_Run [RunNum] [EventBuild] [GeneralSort] [Monitor]"
|
||||||
echo " RunNum = run number / \"lastRun\" "
|
echo " RunNum = run number / \"lastRun\" "
|
||||||
echo " EventBld = 2/1/0/-1/-2 || 2 = with Trace"
|
echo " EventBld = 2/1/0/-1/-2 || 2 = with Trace"
|
||||||
echo " Monitors = 2/1/0 || 1 = single run, 2 = using the list in ChainMonitors.C"
|
echo " GeneralSort = n/0/-n || n = number of worker"
|
||||||
|
echo " Monitors = 2/1/0 || 1 = single run, 2 = using the list in ChainMonitors.C"
|
||||||
echo " 10 = single run and post to websrv, 20 = list runs and post to websrv"
|
echo " 10 = single run and post to websrv, 20 = list runs and post to websrv"
|
||||||
echo ""
|
echo ""
|
||||||
echo " **** When feeding trace data to Monitors, the EventBld flag must be 2 or -2."
|
echo " **** When feeding trace data to Monitors, the EventBld flag must be 2 or -2."
|
||||||
|
@ -14,7 +22,23 @@ fi;
|
||||||
|
|
||||||
|
|
||||||
RUN=$1
|
RUN=$1
|
||||||
EventBld=$2
|
runNum=$1
|
||||||
|
EventBld=0
|
||||||
|
nWorker=1
|
||||||
|
isMonitor=0
|
||||||
|
|
||||||
|
if [ $# -ge 2 ]; then EventBld=$2; fi
|
||||||
|
if [ $# -ge 3 ]; then nWorker=$3; fi
|
||||||
|
if [ $# -ge 4 ]; then isMonitor=$4; fi
|
||||||
|
|
||||||
|
timeWin=100000
|
||||||
|
|
||||||
|
source ${SOLARISANADIR}/armory/Process_BasicConfig
|
||||||
|
source ${SOLARISANADIR}/working/expName.sh
|
||||||
|
|
||||||
|
if [ "$RUN" == "lastRun" ]; then
|
||||||
|
RUN=$runID
|
||||||
|
fi
|
||||||
|
|
||||||
#padding
|
#padding
|
||||||
if [ "${RUN:0:1}" == "0" ]; then
|
if [ "${RUN:0:1}" == "0" ]; then
|
||||||
|
@ -24,14 +48,36 @@ else
|
||||||
fi
|
fi
|
||||||
RUN=$(printf '%03d' ${RUN})
|
RUN=$(printf '%03d' ${RUN})
|
||||||
|
|
||||||
source ~/Analysis/working/expName.sh
|
####################################
|
||||||
|
if [ ${PCID} -eq 1 ]; then
|
||||||
|
source Process_EventBuilder $RUN ${EventBld}
|
||||||
|
fi
|
||||||
|
|
||||||
ls -1 ${rawDataPath}/${expName}_${RUN}_*
|
if [ ${PCID} -eq 2 ]; then
|
||||||
|
## Dwonlaod Data
|
||||||
|
echo "Downlaod data"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ${EventBld} -neq 0 ]; then
|
#################################### GeneralSort
|
||||||
|
|
||||||
if [ ${EventBld} -eq 1 ]; then
|
if [ ${nWorker} -eq 0 ]; then
|
||||||
./EventBuilder ${rawDataPath}/${expName}_${RUN}.root 100 0 `ls -1 ${rawDataPath}/${expName}_${RUN}_*`
|
|
||||||
fi
|
echo -e "${LRED}>>>>>>>>>>>>>>>>>>>>> GeneralSort Skipped by user. ${NC}"
|
||||||
|
|
||||||
|
else
|
||||||
|
source $ROOTSYS/bin/thisroot.sh
|
||||||
|
|
||||||
|
mkdir ~/.proof/working
|
||||||
|
cp ${SOLARISANADIR}/working/Mapping.h ~/.proof/working/.
|
||||||
|
mkdir ~/.proof/armory
|
||||||
|
cp ${SOLARISANADIR}/armory/AnalysisLib.h ~/.proof/armory/.
|
||||||
|
|
||||||
|
root -l -q -b "${SOLARISANADIR}/armory/GeneralSortAgent.C($runNum, ${nWorker})"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
#################################### Monitor
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
48
working/ChainMonitors.C
Normal file
48
working/ChainMonitors.C
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
#include "Monitors.C+" // the plus sign mean compilation
|
||||||
|
|
||||||
|
void ChainMonitors(int RUNNUM = -1, int RUNNUM2 = -1, bool saveCanvas = false, bool isTraceON = false) {
|
||||||
|
|
||||||
|
///default saveCanvas = false, no save Cavas
|
||||||
|
/// = true, save Canvas
|
||||||
|
|
||||||
|
TChain * chain = new TChain("gen_tree");
|
||||||
|
|
||||||
|
if( RUNNUM == -1){
|
||||||
|
/// this list only for manual Chain sort
|
||||||
|
///********** start Marker for AutoCalibration.
|
||||||
|
|
||||||
|
///chain->Add("../root_data/gen_run135.root");
|
||||||
|
///chain->Add("../root_data/trace_run135.root");
|
||||||
|
|
||||||
|
///********** end Marker for AutoCalibration.
|
||||||
|
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
|
TString fileName;
|
||||||
|
int endRUNNUM = RUNNUM2;
|
||||||
|
if( RUNNUM2 == -1) endRUNNUM = RUNNUM;
|
||||||
|
|
||||||
|
for( int i = RUNNUM ; i <= endRUNNUM ; i++){
|
||||||
|
|
||||||
|
if( isTraceON == false )fileName.Form("../root_data/gen_run%03d.root", i);
|
||||||
|
if( isTraceON == true ) fileName.Form("../root_data/trace_run%03d.root", i);
|
||||||
|
chain->Add(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printf("\033[0;31m========================================== Number of Files : %2d\n",chain->GetListOfFiles()->GetEntries());
|
||||||
|
chain->GetListOfFiles()->Print();
|
||||||
|
printf("========================================== Number of Files : %2d\033[0m\n",chain->GetListOfFiles()->GetEntries());
|
||||||
|
printf(" number of entries : %llu \n", chain->GetEntries());
|
||||||
|
|
||||||
|
//Simple call TSelector
|
||||||
|
//chain->Process("Monitors.C+");
|
||||||
|
|
||||||
|
//Some input to TSelector
|
||||||
|
Monitors * selector = new Monitors();
|
||||||
|
if( saveCanvas ) selector->printControl(0); //quit after terminated
|
||||||
|
chain->Process(selector, "");
|
||||||
|
|
||||||
|
}
|
|
@ -17,54 +17,45 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
//#define NARRAY 60
|
const std::vector<std::string> detName = {"Array", "Recoil"}; //C= The comment "//C=" is an indicator DON't Remove
|
||||||
//#define NRDT 10
|
const std::vector<int> detMaxID = { 100, 200}; //C# The comment "//C#" is an indicator DON't Remove
|
||||||
|
const std::vector<int> detParity = { 1, 1};
|
||||||
#define PARITYARRAY 1
|
|
||||||
#define PARITYRDT 1
|
|
||||||
|
|
||||||
//#define NDIGITIZER 4
|
|
||||||
//#define NCHANNEL 64 // number of channel per digitizer
|
|
||||||
|
|
||||||
std::vector<std::string> detName = {"Array", "Recoil"}; //*= The comment "//*=" is an indicator DON't Remove
|
|
||||||
std::vector<int> detMaxID = { 100, 200}; //*# The comment "//*#" is an indicator DON't Remove
|
|
||||||
|
|
||||||
//!The mapping[i] must match as the IP setting in the DAQ
|
//!The mapping[i] must match as the IP setting in the DAQ
|
||||||
|
|
||||||
std::vector<std::vector<int>> mapping = {
|
const std::vector<std::vector<int>> mapping = {
|
||||||
{
|
{
|
||||||
//* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove
|
//C 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove "//C " is an indcator
|
||||||
0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, -1, /// 0 - 15
|
0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, -1, /// 0 - 15
|
||||||
5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, -1, /// 16 - 31
|
5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, -1, /// 16 - 31
|
||||||
10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, -1, /// 32 - 47
|
10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, -1, /// 32 - 47
|
||||||
15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, -1 /// 48 - 63
|
15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, -1 /// 48 - 63
|
||||||
//*------------- end of a digitizer // this line is an indicator DON'T Remove
|
//C------------- end of a digitizer // this line is an indicator DON'T Remove "//C-" is an indcator
|
||||||
},
|
},
|
||||||
//^{
|
//^{
|
||||||
//^//* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove
|
//^//C 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove "//C " is an indcator
|
||||||
//^ 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, -1, /// 0 - 15
|
//^ 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, -1, /// 0 - 15
|
||||||
//^ 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, -1, /// 16 - 31
|
//^ 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, -1, /// 16 - 31
|
||||||
//^ 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, -1, /// 32 - 47
|
//^ 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, -1, /// 32 - 47
|
||||||
//^ 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, -1 /// 48 - 63
|
//^ 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, -1 /// 48 - 63
|
||||||
//^//*------------- end of a digitizer // this line is an indicator DON'T Remove
|
//^//C------------- end of a digitizer // this line is an indicator DON'T Remove "//C-" is an indcator
|
||||||
//^},
|
//^},
|
||||||
//^{
|
//^{
|
||||||
//^//* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove
|
//^//C 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove "//C " is an indcator
|
||||||
//^ 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, -1, /// 0 - 15
|
//^ 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, -1, /// 0 - 15
|
||||||
//^ 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, -1, /// 16 - 31
|
//^ 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, -1, /// 16 - 31
|
||||||
//^ 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, -1, /// 32 - 47
|
//^ 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, -1, /// 32 - 47
|
||||||
//^ 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, -1 /// 48 - 63
|
//^ 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, -1 /// 48 - 63
|
||||||
//^//*------------- end of a digitizer // this line is an indicator DON'T Remove
|
//^//C------------- end of a digitizer // this line is an indicator DON'T Remove "//C-" is an indcator
|
||||||
//^},
|
//^},
|
||||||
{
|
{
|
||||||
//* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove
|
//C 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // this line is an indicator DON'T Remove "//C " is an indcator
|
||||||
100, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, -1, -1, -1, /// 0 - 15
|
100, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, -1, -1, -1, /// 0 - 15
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /// 16 - 31
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /// 16 - 31
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /// 32 - 47
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /// 32 - 47
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /// 48 - 63
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /// 48 - 63
|
||||||
//*------------- end of a digitizer // this line is an indicator DON'T Remove
|
//C------------- end of a digitizer // this line is an indicator DON'T Remove "//C-" is an indcator
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//& if all array is arrange like this, no need kind mapping. it is always e, xf, xn
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
expName=Master
|
expName=Master
|
||||||
rawDataPath=/mnt/data0/Master
|
rawDataPath=/mnt/data0/Master
|
||||||
rootDataPath=/mnt/data1/Master
|
rootDataPath=/mnt/data1/Master
|
||||||
runID=1
|
runID=21
|
||||||
elogID=14
|
elogID=59
|
||||||
//------------end of file.
|
#------------end of file.
|
|
@ -43,7 +43,7 @@ void script(){
|
||||||
reader->GetFilePos(),
|
reader->GetFilePos(),
|
||||||
reader->GetFileSize());
|
reader->GetFileSize());
|
||||||
evt->PrintAll();
|
evt->PrintAll();
|
||||||
evt->PrintAllTrace();
|
//evt->PrintAllTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
h1->Fill(evt->timestamp);
|
h1->Fill(evt->timestamp);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user