94 #include "hcategory.h"
95 #include "hiterator.h"
96 #include "hlocation.h"
144 Error(
"HRpcDigitizer::init()",
"No RpcGeomCellPar Parameters");
149 Error(
"HRpcDigitizer::init()",
"No RpcDigiPar Parameters");
161 Error(
"HRpcDigitizer::init()",
"No Rpc Detector found");
181 Error(
"HRpcDigitizer::init()",
"HGeant kine input missing");
187 Error(
"HRpcDigitizer::init()",
"HGeant RPC input missing");
222 Int_t RefL=-1,trackNumber,gpid,
mode,ngap,HGeantRpc_version=-1;
223 Int_t nHGeantRpc=0,nDigitizedRpc=0;
281 if(HGeantRpc_version==-1) {
283 if(HGeantRpc_version<=4) {
294 if(HGeantRpc_version<=4) {
313 Warning(
"HRpcDigitizer::execute()",
314 "missing kine entry for track %i, assuming beta=0",trackNumber);
317 gpid = kine->
getID();
322 if(mass < 0 ) Warning(
"HRpcDigitizer::execute()",
323 "unknown particle id %i, assuming proton mass",gpid);
336 if(HGeantRpc_version<=4) {
350 Float_t rnd = gRandom->Uniform(1);
354 for(UInt_t e=0;e<
effi_vec.size();e++) {
366 if(efprev==-1 && rnd >
eff_hit) {
370 if(efprev==-1 && rnd <=
eff_hit) {
374 if((mode==0)||(HGeantRpc_version==5)) {
408 dat->
left .push_back(left);
409 dat->
right.push_back(right);
428 Warning(
"HRpcDigitizer::execute()",
429 "mother of track not found in RPC box! will use RefLDgtr=%i, TrackLDgtr=%i",
443 if(HGeantRpc_version<=4) {
492 if(cdat->
celltr.size()==0) {
495 cdat->
celltr.push_back(celltr);
500 for(UInt_t i=0;i<cdat->
celltr.size();i++){
504 if(celltr->
track == trackNumber)
break;
508 if(celltr->
track != trackNumber) {
511 cdat->
celltr.push_back(celltr);
516 ngap = geantrpc->
getGap();
519 if(celltr->
gaptime[ngap]==0.) {
524 celltr->
track = trackNumber;
531 celltr->
track = trackNumber;
533 Warning(
"HRpcDigitizer::execute()",
534 "reentry of track=%i in Sector=%i Module=%i Cell=%i",
535 trackNumber,fLoc[0],fLoc[1],fLoc[2]);
555 if((mode>0)&&(HGeantRpc_version<=4)&&(nHGeantRpc>0)) {
582 for(UInt_t j = 0; j < cdat->
celltr.size(); j ++) {
595 dat->
left .push_back(left);
596 dat->
right.push_back(right);
615 Warning(
"HRpcDigitizer::execute()",
616 "mother of track not found in RPC box! will use RefLDgtr=%i, TrackLDgtr=%i",
653 if(nDigitizedRpc>0) {
658 vector <Int_t> tracklist;
659 tracklist.reserve(20);
661 for(UInt_t i = 0; i <
rpcobjects.size(); i ++) {
681 dat->
left .push_back(left);
682 dat->
right.push_back(right);
698 if(!cal) Error(
"execute()",
"Error: could not allocate a new slot in HRpcCalSim!");
707 ||(mode>0)||(HGeantRpc_version==5)) {
737 for(UInt_t j = 0; j < 10; j ++) {
738 Track[j] = TrackDgtr[j] = -999;
742 for(UInt_t j = 0; j < dat->
right.size() && ct < 10; j ++ ){
743 Int_t tr = dat->
right[j]->track;
744 if(find(tracklist.begin(),tracklist.end(),tr ) == tracklist.end()){
747 TrackDgtr[ct] = dat->
right[j]->trackDgtr;
748 isAtBox [ct] = dat->
right[j]->isAtBox;
750 tracklist.push_back(tr);
766 for(UInt_t j = 0; j < 10; j ++) {
767 Track[j] = TrackDgtr[j] = -999;
771 for(UInt_t j = 0; j < dat->
left.size() && ct < 10 ; j ++ ){
772 Int_t tr = dat->
left[j]->track;
773 if(find(tracklist.begin(),tracklist.end(),tr) == tracklist.end()){
776 TrackDgtr[ct] = dat->
left[j]->trackDgtr;
777 isAtBox [ct] = dat->
left[j]->isAtBox;
779 tracklist.push_back(tr);
804 for(UInt_t i = 0; i <
rpcobjects.size(); i ++){
826 Int_t detectorID = 0, track_mother = -1, Ref_final = -1;
834 while(kine && detectorID >= 0){
836 if(track_mother == 0) {
913 Float_t geaXLoc = 0.;
914 Float_t beta2,corr_ngap,sigma_T,sigma_el_here,X_smearing,T_smearing;
915 Float_t Qmean,Qwid,Qgap;
942 for(Int_t i = 1; i < 5; i ++) {
943 Float_t w4i=TMath::Binomial(4,i)*TMath::Power(
eff_hit,i)*TMath::Power(
ineff_hit,4-i);
945 corr_ngap += w4i/TMath::Sqrt((Float_t)i);
950 corr_ngap = norm/corr_ngap;
951 sigma_T *= corr_ngap;
952 sigma_el_here *= corr_ngap;
955 T_smearing = gRandom->Gaus(
t_offset,sigma_T);
957 X_smearing = gRandom->Gaus(0.,sigma_el_here);
959 left ->
time = left ->
gtime + T_smearing + X_smearing;
960 right->
time = right->
gtime + T_smearing - X_smearing;
983 for(Int_t i = 1; i < 5; i ++) {
984 Float_t w4i=TMath::Binomial(4,i)*TMath::Power(
eff_hit,i)*TMath::Power(
ineff_hit,4-i);
986 corr_ngap += w4i*TMath::Sqrt((Float_t)i);
992 corr_ngap = norm/corr_ngap;
1003 Qgap = gRandom->Landau(Qmean,Qwid);
1016 if(module<0 || cell<0) {
1022 Float_t atofHit = 0.;
1028 Float_t rxCorner = xCorner - length;
1030 Int_t trackNumber = gea->
getTrack();
1034 Float_t xCornerL=-1e5;
1035 Float_t lengthL=-1e5;
1036 Float_t yCornerL=-1e5;
1037 Float_t rxCornerL=1e-5;
1042 rxCornerL = xCornerL - lengthL;
1045 Float_t angle1 = 0.;
1046 Float_t angle2 = 0.;
1048 angle1 = atan2(xCorner-xCornerL ,yCorner-yCornerL);
1049 angle2 = atan2(rxCorner-rxCornerL,yCorner-yCornerL);
1051 if(cell<30 && cell>27) {
1063 rxCornerL = xCornerL + lengthL;
1064 angle1 = atan2( xCornerL-xCorner,yCornerL-yCorner);
1065 angle2 = atan2(rxCornerL-rxCorner,yCornerL-yCorner);
1068 Float_t distL = -axHit + (xCorner + sin(angle1) * (ayHit-yCorner));
1069 Float_t distR = axHit - (rxCorner + sin(angle2) * (ayHit-yCorner));
1071 return distL<distR ? distL : distR;
void setRefR(Int_t aRefR)
virtual Bool_t addCategory(Cat_t aCat, HCategory *cat, Option_t opt[])=0
Bool_t initParContainer()
void getCellAverage(Float_t gap, Float_t &axHit, Float_t &ayHit, Float_t &azHit, Float_t &atofHit, Float_t &amomHit, Float_t &aeHit, Float_t &aloctrackLength)
static Int_t getEmbeddingRealTrackId()
void setLisAtBoxArray(Bool_t *LisAtBoxarray)
Float_t getLength(Int_t col, Int_t cell)
void setRightTime(Float_t arightTime)
void setRefRDgtr(Int_t aRefRDgtr)
void calc_eff_hit(Int_t mode)
HRuntimeDb * getRuntimeDb(void)
HEvent *& getCurrentEvent(void)
struct HRpcDigitizer::celltrack celltrack
void setTrackRArray(Int_t *trackRarray)
Int_t maxCol
Iterator over HRpcCalSim category.
void setRefL(Int_t aRefL)
Int_t getDetectorID(void)
ClassImp(HDbColumn) HDbColumn
void setRefLDgtr(Int_t aRefLDgtr)
vector< efhits > effi_vec
temporary working array for digitized data
HRpcDigiPar * fDigiPar
Geometrical parameters.
HCategory * fKineCat
Pointer to Cal data category.
HIterator * iterGeantRpc
Digitization parameters.
void setAddress(Short_t aAddress)
void setLeftCharge(Float_t aleftCharge)
vector< gaptrack * > right
HCategory * fCalCat
Pointer to Rpc Geant data category.
void setLeftTime(Float_t aleftTime)
Int_t getParentTrack(void) const
struct HRpcDigitizer::gaptrack gaptrack
Float_t getSmallestTof(Bool_t isRight)
void getCellAverageDigi(Float_t gap, Float_t &axHit, Float_t &atofHit, Float_t &amomHit, Float_t &aloctrackLength)
HRpcGeomCellPar * fGeomCellPar
Pointer to Kine data category.
vector< rpcdat * > rpcobjects
HSpectrometer * getSetup(void)
Float_t getX(Int_t col, Int_t cell)
HDetector * getDetector(const Char_t *name)
void setNTracksL(Int_t anTracksL)
void setVersion(Int_t aHGeantRpc_version)
Float_t getMeanTof(Bool_t isRight)
static Float_t mass(const Int_t id)
const Cat_t catRpcGeantRaw
void setTrackLDgtrArray(Int_t *trackLDgtrarray)
void initVars()
vector of hits for efficiency calculation
void getHitDigi(Float_t &axHit, Float_t &atofHit, Float_t &amomHit, Float_t &aloctrackLength)
Float_t getY(Int_t col, Int_t cell)
HParSet * getContainer(const Text_t *)
HCategory * fGeantRpcCat
Location for new object.
Int_t findMother(Int_t Ref_initial)
vector< celldat * > cellobjects
vector< gaptrack * > left
Float_t getDistanceToXedge(HGeantRpc *gea)
vector< celltrack * > celltr
static Float_t fCropDistance
HIterator * iterRpcCal
Iterator over catRpcGeantRaw category.
Int_t getSector(void) const
void sortTime(Bool_t isRight)
HCategory * buildMatrixCategory(const Text_t *, Float_t)
void digitize_one_hit(gaptrack *left, gaptrack *right, Int_t mode)
void set(Int_t se, Int_t co, Int_t ce, Float_t ax, Float_t ay, Float_t at, Bool_t eff)
virtual HCategory * getCategory(Cat_t aCat)=0
Int_t getCell(void) const
void setTrackRDgtrArray(Int_t *trackRDgtrarray)
void setRightCharge(Float_t arightCharge)
void setNTracksR(Int_t anTracksR)
void setRisAtBoxArray(Bool_t *RisAtBoxarray)
Float_t getSumCharge(Bool_t isRight)
Int_t getColumn(void) const
void setTrackLArray(Int_t *trackLarray)