ROOT logo
//*-- AUTHOR : J. Markert

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////
// HMdcCellEff
//
// Container class for the cell efficiency  parameters for HMdcDigitizer
//
////////////////////////////////////////////////////////////////////////////
using namespace std;
#include <stdlib.h>

#include "hmdccelleff.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hpario.h"
#include "hdetpario.h"
#include "TMath.h"

#include <iostream> 
#include <iomanip>

ClassImp(HMdcCellEffAngle)
ClassImp(HMdcCellEffMod)
ClassImp(HMdcCellEff)

HMdcCellEffMod::HMdcCellEffMod(Int_t sec, Int_t mod, Int_t angle) {
  // constructor takes the sector, module and angle
    array = new TObjArray(angle);
    for (Int_t i=0; i<angle; ++i)
        array->AddAt(new HMdcCellEffAngle(),i);
}

HMdcCellEffMod::~HMdcCellEffMod() {
  // destructor
  array->Delete();
  delete array;
}

HMdcCellEff::HMdcCellEff(const Char_t* name,const Char_t* title,
                       const Char_t* context,Int_t n)
            : HParSet(name,title,context) {
  // constructor
  comment="no comment";
  strcpy(detName,"Mdc");
  if (gHades) {
      fMdc=(HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
  } else {
      fMdc = 0;
  }

  array = new TObjArray(n);
  for (Int_t i=0; i<n; i++) array->AddAt( new HMdcCellEffMod(i),i);
}

HMdcCellEff::~HMdcCellEff() {
  // destructor
  array->Delete();
  delete array;
}

Bool_t HMdcCellEff::init(HParIo* inp,Int_t* set) {
  // intitializes the container from an input
    Int_t myset[4]={1,1,1,1};
    HDetParIo* input=inp->getDetParIo("HMdcParIo");
  if (input) return (input->init(this,myset));
  return kFALSE;

}
Int_t HMdcCellEff::write(HParIo* output) {
  // writes the container to an output
  HDetParIo* out=output->getDetParIo("HMdcParIo");
  if (out) return out->write(this);
  return -1;
}

void HMdcCellEff::readline(const Char_t* buf, Int_t* set) {
  // decodes one line read from ascii file I/O and calls HMdcCellEffAngle::fillTime1(...)
  Int_t   mod,angle;
  Float_t maximumR,slopeEff;


  sscanf(buf,"%i%i%f%f", &mod, &angle, &maximumR, &slopeEff);
  Int_t n=mod;

  HMdcCellEffMod &module=(*this)[mod];

  if (angle<=module.getSize())
  {

      HMdcCellEffAngle& rAngle=module[angle];

      rAngle.setFunctionValues(maximumR,slopeEff);
  }
  else
  {
      Error("HMdcCellEff::readline()","array out of bounds");
  }

  set[n]=999;
}

void HMdcCellEff::putAsciiHeader(TString& header) {
  // puts the ascii header to the string used in HMdcParAsciiFileIo
  header=
	"# Cell Efficiency parameters of the HMdcDigitizer\n"
	"# Format: \n"
	"# module  angle maxR slope\n";
}

Bool_t HMdcCellEff::writeline(Char_t *buf, Int_t mod, Int_t angle) {
  // writes one line to the buffer used by ascii file I/O
 Bool_t r = kTRUE;

 HMdcCellEffMod &module = (*this)[mod];
 if (angle<=module.getSize())
 {
     HMdcCellEffAngle& rAngle=module[angle];
     sprintf(buf,"%1i %2i %7.5f %7.5f\n", mod, angle, rAngle.getMaxR(), rAngle.getSlope());
 }
 else
 {
     r = kFALSE;
     Error("HMdcCellEff::writeline()","array out of bounds");
 }
 return r;
}
Int_t HMdcCellEff::calcEfficiency(Int_t m, Float_t r , Float_t b, Float_t l)
{
    // Function checks if given minimum distance from wire is larger than
    // the allowed value (calculated from the level which was set before).
    // If r > rCut the function returns -1 for the efficiency flag.
    //  m : module 0-3
    //  r : mindist from wire [mm]
    //  b : impact angle      [deg]
    //  l : level %
    Int_t status=0;
    Float_t angleDeg=0;
    Int_t angleStep=0;

    if(b<=90  && b>=0)
    {
        angleDeg=90-b;           // 90 deg impact ->0
    }
    else
    {
	if(b<=180 && b> 90 ) angleDeg=90-(180-b);
	if(b<=270 && b> 180) angleDeg=90-(270-b);
	if(b< 360 && b> 270) angleDeg=90-(360-b);
    }
    
    angleStep=((Int_t)((angleDeg)/5));
    if(angleStep==18)angleStep=17; 

    HMdcCellEffAngle& rAngle=(*this)[m][angleStep];
    HMdcCellEffAngle rAngle2;

    if(angleStep<17)
    {
	rAngle2=(*this)[m][angleStep+1];               // pointer to the second set
    }
    else
    {
	rAngle2=(*this)[m][angleStep];
    }
    Float_t rCut=0;
    Float_t slope=0;
    Float_t delta=0;
    Float_t r1=0;
    Float_t r2=0;

    //#################################### calc efficiency cut ######################
    r1= rAngle.getMaxR() +( l*(rAngle.getSlope()));
    r2= rAngle2.getMaxR()+( l*(rAngle2.getSlope()));

    slope= (Float_t) (r2-r1)/5.;
    delta= angleDeg-(angleStep*5);
    rCut=r1+slope*delta;
	if(r > rCut )  // larger distances than rCut are rejected
	{
	    status=-1;
	}
	else
	{
	    status=1;
	}
    return status;
}
Float_t HMdcCellEff::calcEffval(Int_t m, Float_t r , Float_t b, Float_t l)
{
    // Function calculates the efficiency value which would correspond
    // to a cut at the given value of r.
    //  m : module 0-3
    //  r : mindist from wire [mm]
    //  b : impact angle      [deg]
    //  l : level %

    Float_t angleDeg=0;
    Int_t angleStep=0;

    if(b<=90  && b>=0)
    {
        angleDeg=90-b;           // 90 deg impact ->0
    }
    else
    {
	if(b<=180 && b> 90 ) angleDeg=90-(180-b);
	if(b<=270 && b> 180) angleDeg=90-(270-b);
	if(b< 360 && b> 270) angleDeg=90-(360-b);
    }
    
    angleStep=((Int_t)((angleDeg)/5));
    if(angleStep==18)angleStep=17; 

    HMdcCellEffAngle& rAngle=(*this)[m][angleStep];
    HMdcCellEffAngle rAngle2;

    if(angleStep<17)
    {
	rAngle2=(*this)[m][angleStep+1];               // pointer to the second set
    }
    else
    {
	rAngle2=(*this)[m][angleStep];
    }

    Float_t myfraction=0;
    Float_t myslope=0;
    Float_t mydelta=0;
    Float_t d1=0;
    Float_t d2=0;

    if(rAngle.getSlope()!=0 && rAngle2.getSlope()!=0)
    {
	d1=(r - rAngle .getMaxR())/(rAngle.getSlope() );
	d2=(r - rAngle2.getMaxR())/(rAngle2.getSlope());
    }
    else
    {
	if(rAngle.getSlope()!=0 && rAngle2.getSlope()==0)
	{
	    d1=(r - rAngle .getMaxR())/(rAngle.getSlope() );
	    d2=(r - rAngle2.getMaxR())/(-0.001);
	}
	else if(rAngle.getSlope()==0 && rAngle2.getSlope()!=0)
	{
	    d1=(r - rAngle .getMaxR())/(-0.001);
	    d2=(r - rAngle2.getMaxR())/(rAngle2.getSlope());
 
	}
	else
	{
	    d1=(r - rAngle .getMaxR())/(-0.001);
	    d2=(r - rAngle2.getMaxR())/(-0.001);
	}
    }

    if((d1<=100&&d2<=100)&&(d1>=0&&d2>=0)) // both are good
    {
	myslope= (Float_t) (d2-d1)/5.;
	mydelta=angleDeg-(angleStep*5);
	myfraction=100-TMath::Abs(d1+myslope*mydelta);
    }
    else
    {
	if((d1<=100&&d1>=0)) // first is good
	{
	    myfraction=100-TMath::Abs(d1);
	}
	else if((d2<=100&&d2>=0)) // second is good
	{
	    myfraction=100-TMath::Abs(d2);
	}
    }

    if(myfraction>100||myfraction<=0)
    {
	Float_t testR=rAngle.getMaxR();
        if(rAngle2.getMaxR()>rAngle.getMaxR())testR=rAngle2.getMaxR();
	if(r>(testR*0.9))
	{
	    myfraction=100;
	}
	else
	{
          myfraction=0;
	}
    }
    return myfraction;
}

void HMdcCellEff::clear() {
  // clears the container
    for(Int_t m=0;m<getSize();m++) {
	HMdcCellEffMod& mod=(*this)[m];
	for(Int_t a=0;a<mod.getSize();a++) {
	    HMdcCellEffAngle& angle=mod[a];
	    angle.clear();
	}
    }

    status=kFALSE;
    resetInputVersions();
}

 hmdccelleff.cc:1
 hmdccelleff.cc:2
 hmdccelleff.cc:3
 hmdccelleff.cc:4
 hmdccelleff.cc:5
 hmdccelleff.cc:6
 hmdccelleff.cc:7
 hmdccelleff.cc:8
 hmdccelleff.cc:9
 hmdccelleff.cc:10
 hmdccelleff.cc:11
 hmdccelleff.cc:12
 hmdccelleff.cc:13
 hmdccelleff.cc:14
 hmdccelleff.cc:15
 hmdccelleff.cc:16
 hmdccelleff.cc:17
 hmdccelleff.cc:18
 hmdccelleff.cc:19
 hmdccelleff.cc:20
 hmdccelleff.cc:21
 hmdccelleff.cc:22
 hmdccelleff.cc:23
 hmdccelleff.cc:24
 hmdccelleff.cc:25
 hmdccelleff.cc:26
 hmdccelleff.cc:27
 hmdccelleff.cc:28
 hmdccelleff.cc:29
 hmdccelleff.cc:30
 hmdccelleff.cc:31
 hmdccelleff.cc:32
 hmdccelleff.cc:33
 hmdccelleff.cc:34
 hmdccelleff.cc:35
 hmdccelleff.cc:36
 hmdccelleff.cc:37
 hmdccelleff.cc:38
 hmdccelleff.cc:39
 hmdccelleff.cc:40
 hmdccelleff.cc:41
 hmdccelleff.cc:42
 hmdccelleff.cc:43
 hmdccelleff.cc:44
 hmdccelleff.cc:45
 hmdccelleff.cc:46
 hmdccelleff.cc:47
 hmdccelleff.cc:48
 hmdccelleff.cc:49
 hmdccelleff.cc:50
 hmdccelleff.cc:51
 hmdccelleff.cc:52
 hmdccelleff.cc:53
 hmdccelleff.cc:54
 hmdccelleff.cc:55
 hmdccelleff.cc:56
 hmdccelleff.cc:57
 hmdccelleff.cc:58
 hmdccelleff.cc:59
 hmdccelleff.cc:60
 hmdccelleff.cc:61
 hmdccelleff.cc:62
 hmdccelleff.cc:63
 hmdccelleff.cc:64
 hmdccelleff.cc:65
 hmdccelleff.cc:66
 hmdccelleff.cc:67
 hmdccelleff.cc:68
 hmdccelleff.cc:69
 hmdccelleff.cc:70
 hmdccelleff.cc:71
 hmdccelleff.cc:72
 hmdccelleff.cc:73
 hmdccelleff.cc:74
 hmdccelleff.cc:75
 hmdccelleff.cc:76
 hmdccelleff.cc:77
 hmdccelleff.cc:78
 hmdccelleff.cc:79
 hmdccelleff.cc:80
 hmdccelleff.cc:81
 hmdccelleff.cc:82
 hmdccelleff.cc:83
 hmdccelleff.cc:84
 hmdccelleff.cc:85
 hmdccelleff.cc:86
 hmdccelleff.cc:87
 hmdccelleff.cc:88
 hmdccelleff.cc:89
 hmdccelleff.cc:90
 hmdccelleff.cc:91
 hmdccelleff.cc:92
 hmdccelleff.cc:93
 hmdccelleff.cc:94
 hmdccelleff.cc:95
 hmdccelleff.cc:96
 hmdccelleff.cc:97
 hmdccelleff.cc:98
 hmdccelleff.cc:99
 hmdccelleff.cc:100
 hmdccelleff.cc:101
 hmdccelleff.cc:102
 hmdccelleff.cc:103
 hmdccelleff.cc:104
 hmdccelleff.cc:105
 hmdccelleff.cc:106
 hmdccelleff.cc:107
 hmdccelleff.cc:108
 hmdccelleff.cc:109
 hmdccelleff.cc:110
 hmdccelleff.cc:111
 hmdccelleff.cc:112
 hmdccelleff.cc:113
 hmdccelleff.cc:114
 hmdccelleff.cc:115
 hmdccelleff.cc:116
 hmdccelleff.cc:117
 hmdccelleff.cc:118
 hmdccelleff.cc:119
 hmdccelleff.cc:120
 hmdccelleff.cc:121
 hmdccelleff.cc:122
 hmdccelleff.cc:123
 hmdccelleff.cc:124
 hmdccelleff.cc:125
 hmdccelleff.cc:126
 hmdccelleff.cc:127
 hmdccelleff.cc:128
 hmdccelleff.cc:129
 hmdccelleff.cc:130
 hmdccelleff.cc:131
 hmdccelleff.cc:132
 hmdccelleff.cc:133
 hmdccelleff.cc:134
 hmdccelleff.cc:135
 hmdccelleff.cc:136
 hmdccelleff.cc:137
 hmdccelleff.cc:138
 hmdccelleff.cc:139
 hmdccelleff.cc:140
 hmdccelleff.cc:141
 hmdccelleff.cc:142
 hmdccelleff.cc:143
 hmdccelleff.cc:144
 hmdccelleff.cc:145
 hmdccelleff.cc:146
 hmdccelleff.cc:147
 hmdccelleff.cc:148
 hmdccelleff.cc:149
 hmdccelleff.cc:150
 hmdccelleff.cc:151
 hmdccelleff.cc:152
 hmdccelleff.cc:153
 hmdccelleff.cc:154
 hmdccelleff.cc:155
 hmdccelleff.cc:156
 hmdccelleff.cc:157
 hmdccelleff.cc:158
 hmdccelleff.cc:159
 hmdccelleff.cc:160
 hmdccelleff.cc:161
 hmdccelleff.cc:162
 hmdccelleff.cc:163
 hmdccelleff.cc:164
 hmdccelleff.cc:165
 hmdccelleff.cc:166
 hmdccelleff.cc:167
 hmdccelleff.cc:168
 hmdccelleff.cc:169
 hmdccelleff.cc:170
 hmdccelleff.cc:171
 hmdccelleff.cc:172
 hmdccelleff.cc:173
 hmdccelleff.cc:174
 hmdccelleff.cc:175
 hmdccelleff.cc:176
 hmdccelleff.cc:177
 hmdccelleff.cc:178
 hmdccelleff.cc:179
 hmdccelleff.cc:180
 hmdccelleff.cc:181
 hmdccelleff.cc:182
 hmdccelleff.cc:183
 hmdccelleff.cc:184
 hmdccelleff.cc:185
 hmdccelleff.cc:186
 hmdccelleff.cc:187
 hmdccelleff.cc:188
 hmdccelleff.cc:189
 hmdccelleff.cc:190
 hmdccelleff.cc:191
 hmdccelleff.cc:192
 hmdccelleff.cc:193
 hmdccelleff.cc:194
 hmdccelleff.cc:195
 hmdccelleff.cc:196
 hmdccelleff.cc:197
 hmdccelleff.cc:198
 hmdccelleff.cc:199
 hmdccelleff.cc:200
 hmdccelleff.cc:201
 hmdccelleff.cc:202
 hmdccelleff.cc:203
 hmdccelleff.cc:204
 hmdccelleff.cc:205
 hmdccelleff.cc:206
 hmdccelleff.cc:207
 hmdccelleff.cc:208
 hmdccelleff.cc:209
 hmdccelleff.cc:210
 hmdccelleff.cc:211
 hmdccelleff.cc:212
 hmdccelleff.cc:213
 hmdccelleff.cc:214
 hmdccelleff.cc:215
 hmdccelleff.cc:216
 hmdccelleff.cc:217
 hmdccelleff.cc:218
 hmdccelleff.cc:219
 hmdccelleff.cc:220
 hmdccelleff.cc:221
 hmdccelleff.cc:222
 hmdccelleff.cc:223
 hmdccelleff.cc:224
 hmdccelleff.cc:225
 hmdccelleff.cc:226
 hmdccelleff.cc:227
 hmdccelleff.cc:228
 hmdccelleff.cc:229
 hmdccelleff.cc:230
 hmdccelleff.cc:231
 hmdccelleff.cc:232
 hmdccelleff.cc:233
 hmdccelleff.cc:234
 hmdccelleff.cc:235
 hmdccelleff.cc:236
 hmdccelleff.cc:237
 hmdccelleff.cc:238
 hmdccelleff.cc:239
 hmdccelleff.cc:240
 hmdccelleff.cc:241
 hmdccelleff.cc:242
 hmdccelleff.cc:243
 hmdccelleff.cc:244
 hmdccelleff.cc:245
 hmdccelleff.cc:246
 hmdccelleff.cc:247
 hmdccelleff.cc:248
 hmdccelleff.cc:249
 hmdccelleff.cc:250
 hmdccelleff.cc:251
 hmdccelleff.cc:252
 hmdccelleff.cc:253
 hmdccelleff.cc:254
 hmdccelleff.cc:255
 hmdccelleff.cc:256
 hmdccelleff.cc:257
 hmdccelleff.cc:258
 hmdccelleff.cc:259
 hmdccelleff.cc:260
 hmdccelleff.cc:261
 hmdccelleff.cc:262
 hmdccelleff.cc:263
 hmdccelleff.cc:264
 hmdccelleff.cc:265
 hmdccelleff.cc:266
 hmdccelleff.cc:267
 hmdccelleff.cc:268
 hmdccelleff.cc:269
 hmdccelleff.cc:270
 hmdccelleff.cc:271
 hmdccelleff.cc:272
 hmdccelleff.cc:273
 hmdccelleff.cc:274
 hmdccelleff.cc:275
 hmdccelleff.cc:276
 hmdccelleff.cc:277
 hmdccelleff.cc:278
 hmdccelleff.cc:279
 hmdccelleff.cc:280
 hmdccelleff.cc:281
 hmdccelleff.cc:282
 hmdccelleff.cc:283
 hmdccelleff.cc:284
 hmdccelleff.cc:285
 hmdccelleff.cc:286
 hmdccelleff.cc:287
 hmdccelleff.cc:288
 hmdccelleff.cc:289
 hmdccelleff.cc:290
 hmdccelleff.cc:291
 hmdccelleff.cc:292
 hmdccelleff.cc:293
 hmdccelleff.cc:294
 hmdccelleff.cc:295
 hmdccelleff.cc:296
 hmdccelleff.cc:297
 hmdccelleff.cc:298
 hmdccelleff.cc:299
 hmdccelleff.cc:300
 hmdccelleff.cc:301
 hmdccelleff.cc:302
 hmdccelleff.cc:303
 hmdccelleff.cc:304
 hmdccelleff.cc:305
 hmdccelleff.cc:306
 hmdccelleff.cc:307