#include "hshowerhitdigitizer.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hshowerdetector.h"
#include "hcategory.h"
#include "hmatrixcategory.h"
#include "hlinearcategory.h"
#include "hlocation.h"
#include "hgeantshower.h"
#include "hshowergeantwire.h"
#include "hshowerdigipar.h"
#include "hshowergeometry.h"
#include "hdebug.h"
#include "hades.h"
#include "showerdef.h"
#include <math.h>
#include <stdlib.h>
#include "TRandom.h"
ClassImp(HShowerHitDigitizer)
HShowerHitDigitizer::HShowerHitDigitizer(const Text_t *name,const Text_t *title,
                            Float_t unit) : HShowerDigitizer(name,title)
{
    piconst = 2 * acos(0.);
    fUnit = unit;  
}
HShowerHitDigitizer::HShowerHitDigitizer()
{
    piconst = 2*acos(0.);
    fUnit = 10.;
}
HShowerHitDigitizer::~HShowerHitDigitizer(void)
{
}
Bool_t HShowerHitDigitizer::init() {
    printf("initialization of shower hit digitizer \n");
HCategory *pCat;
HShowerDetector *pShowerDet = (HShowerDetector*)gHades->getSetup()
                                           ->getDetector("Shower");
    pCat=gHades->getCurrentEvent()->getCategory(catShowerGeantRaw);
    if( ! pCat)
    {
        pCat=pShowerDet->buildCategory(catShowerGeantRaw);
        if( ! pCat)
            return kFALSE;
        else
            gHades->getCurrentEvent()
                         ->addCategory(catShowerGeantRaw, pCat, "Simul");
    }
    setInCat(pCat);
    pCat=gHades->getCurrentEvent()->getCategory(catShowerGeantWire);
    if( ! pCat)
    {
        pCat=pShowerDet->buildCategory(catShowerGeantWire);
        if( ! pCat)
            return kFALSE;
        else
            gHades->getCurrentEvent()
                         ->addCategory(catShowerGeantWire, pCat, "Shower");
    }
    setOutCat(pCat);
    return HShowerDigitizer::init();
}
HShowerHitDigitizer& HShowerHitDigitizer::operator=(HShowerHitDigitizer &c)
{
    return c;
}
Bool_t HShowerHitDigitizer::digitize(TObject *pHit)
{
  Bool_t nResult = kFALSE;
#if DEBUG_LEVEL>2
    gDebuger->enterFunc("HShowerHitDigitizer::execute");
    gDebuger->message("category points to %p", pHit);
#endif
  HGeantShower *pGeantHit = (HGeantShower*)pHit;
    if (pGeantHit)
    {
        nResult = digiHits(pGeantHit);
    }
#if DEBUG_LEVEL>2
    gDebuger->leaveFunc("HShowerHitDigitizer::execute");
#endif
    return nResult;
}
Bool_t HShowerHitDigitizer::digiHits(HGeantShower *simhit)
{
HLocation         fLoc;
HShowerGeantWire *pGeantWire = NULL;
Float_t             x_exit, y_exit;
Int_t             nDet, nSector;
Int_t             nFiredWire, nFiredWireIn, nFiredWireOut;
Float_t           fE, fTheta, fPhi, fBeta;
Float_t           fX, fY;
Float_t           fNewX, fNewY;
Float_t           fQ, fThick;
Float_t           fTan;
Int_t             i;
Float_t           fY0, fY1;
    nDet = simhit->getModule();
    nSector = simhit->getSector();
    simhit->getHit(fE, fX, fY, fBeta);
    simhit->getIncidence(fTheta, fPhi);
    fX /= fUnit;   
    fY /= fUnit;
    Int_t nCol, nRow;
    HShowerPad *pPad = pGeometry->getPadParam(nDet)->getPad(fX,fY);
    if (pPad==0) return kFALSE;
    pPad->getPadPos(&nRow,&nCol);
    if(!pDigiPar->checkEfficiency(nSector,nDet,nRow,nCol,fBeta)) return kFALSE;
        
    fTheta = (TMath::Pi()/180.0) * fTheta;
    fPhi   = (TMath::Pi()/180.0) * fPhi;
    HShowerWireTab *phWires = pGeometry->getWireTab(nDet);
    fThick        = pDigiPar->getThickDet();
    fTan = tan(fTheta);
    x_exit = fX + fThick* fTan * cos(fPhi);
    y_exit = fY + fThick* fTan * sin(fPhi);
    nFiredWireIn = phWires->lookupWire(fY);
    if(nFiredWireIn == -1) {
      
      return kFALSE;
    }
    nFiredWireOut = phWires->lookupWire(y_exit);
    if(nFiredWireOut == -1) {
      
      return kFALSE;
    }
    if(nFiredWireIn > nFiredWireOut) {   
        i = nFiredWireIn;
        nFiredWireIn  = nFiredWireOut;
        nFiredWireOut = i;
    }
    for(nFiredWire = nFiredWireIn; nFiredWire <= nFiredWireOut; nFiredWire++)
    {
        fNewY = phWires->getWirePos(nFiredWire);
        if(nFiredWireOut == nFiredWireIn)
        {
                
            fNewX = 0.5 * (fX + x_exit); 
        }
        else
        {
                
            if(nFiredWire == nFiredWireIn)
                fY0 = fY;
            else
            {
                    
                fY0 = 0.5 * (phWires->getWirePos(nFiredWire - 1) + fNewY);
            }
            if(nFiredWire == nFiredWireOut)
                fY1 = y_exit;
            else
            {
                fY1 = 0.5 * (fNewY
                            + phWires->getWirePos(nFiredWire + 1));
            }
                
            fNewX = fX + 0.5 * (x_exit - fX) * (fY1 + fY0 - 2 * fY)
                            / (y_exit - fY);
        }
        if((fQ = pDigiPar->getCharge(nSector, nDet, fBeta)) > 0.0f)
        {
            pGeantWire = (HShowerGeantWire*)((HLinearCategory*)getOutCat())
                                                          ->getNewSlot(fLoc);
            if(pGeantWire != NULL)
            {
                pGeantWire = new(pGeantWire) HShowerGeantWire;
                pGeantWire->setWireNr(nFiredWire);
                pGeantWire->setXY(fNewX, fNewY);
                pGeantWire->setCharge(fQ);
                pGeantWire->setModule(nDet);
                pGeantWire->setSector(nSector);
                pGeantWire->setTrack(simhit->getTrack());
            }
        }
    }
    return kTRUE;
}
 hshowerhitdigitizer.cc:10  hshowerhitdigitizer.cc:11  hshowerhitdigitizer.cc:12  hshowerhitdigitizer.cc:13  hshowerhitdigitizer.cc:14  hshowerhitdigitizer.cc:15  hshowerhitdigitizer.cc:16  hshowerhitdigitizer.cc:17  hshowerhitdigitizer.cc:18  hshowerhitdigitizer.cc:19  hshowerhitdigitizer.cc:20  hshowerhitdigitizer.cc:21  hshowerhitdigitizer.cc:22  hshowerhitdigitizer.cc:23  hshowerhitdigitizer.cc:24  hshowerhitdigitizer.cc:25  hshowerhitdigitizer.cc:26  hshowerhitdigitizer.cc:27  hshowerhitdigitizer.cc:28  hshowerhitdigitizer.cc:29  hshowerhitdigitizer.cc:30  hshowerhitdigitizer.cc:31  hshowerhitdigitizer.cc:32  hshowerhitdigitizer.cc:33  hshowerhitdigitizer.cc:34  hshowerhitdigitizer.cc:35  hshowerhitdigitizer.cc:36  hshowerhitdigitizer.cc:37  hshowerhitdigitizer.cc:38  hshowerhitdigitizer.cc:39  hshowerhitdigitizer.cc:40  hshowerhitdigitizer.cc:41  hshowerhitdigitizer.cc:42  hshowerhitdigitizer.cc:43  hshowerhitdigitizer.cc:44  hshowerhitdigitizer.cc:45  hshowerhitdigitizer.cc:46  hshowerhitdigitizer.cc:47  hshowerhitdigitizer.cc:48  hshowerhitdigitizer.cc:49  hshowerhitdigitizer.cc:50  hshowerhitdigitizer.cc:51  hshowerhitdigitizer.cc:52  hshowerhitdigitizer.cc:53  hshowerhitdigitizer.cc:54  hshowerhitdigitizer.cc:55  hshowerhitdigitizer.cc:56  hshowerhitdigitizer.cc:57  hshowerhitdigitizer.cc:58  hshowerhitdigitizer.cc:59  hshowerhitdigitizer.cc:60  hshowerhitdigitizer.cc:61  hshowerhitdigitizer.cc:62  hshowerhitdigitizer.cc:63  hshowerhitdigitizer.cc:64  hshowerhitdigitizer.cc:65  hshowerhitdigitizer.cc:66  hshowerhitdigitizer.cc:67  hshowerhitdigitizer.cc:68  hshowerhitdigitizer.cc:69  hshowerhitdigitizer.cc:70  hshowerhitdigitizer.cc:71  hshowerhitdigitizer.cc:72  hshowerhitdigitizer.cc:73  hshowerhitdigitizer.cc:74  hshowerhitdigitizer.cc:75  hshowerhitdigitizer.cc:76  hshowerhitdigitizer.cc:77  hshowerhitdigitizer.cc:78  hshowerhitdigitizer.cc:79  hshowerhitdigitizer.cc:80  hshowerhitdigitizer.cc:81  hshowerhitdigitizer.cc:82  hshowerhitdigitizer.cc:83  hshowerhitdigitizer.cc:84  hshowerhitdigitizer.cc:85  hshowerhitdigitizer.cc:86  hshowerhitdigitizer.cc:87  hshowerhitdigitizer.cc:88  hshowerhitdigitizer.cc:89  hshowerhitdigitizer.cc:90  hshowerhitdigitizer.cc:91  hshowerhitdigitizer.cc:92  hshowerhitdigitizer.cc:93  hshowerhitdigitizer.cc:94  hshowerhitdigitizer.cc:95  hshowerhitdigitizer.cc:96  hshowerhitdigitizer.cc:97  hshowerhitdigitizer.cc:98  hshowerhitdigitizer.cc:99  hshowerhitdigitizer.cc:100  hshowerhitdigitizer.cc:101  hshowerhitdigitizer.cc:102  hshowerhitdigitizer.cc:103  hshowerhitdigitizer.cc:104  hshowerhitdigitizer.cc:105  hshowerhitdigitizer.cc:106  hshowerhitdigitizer.cc:107  hshowerhitdigitizer.cc:108  hshowerhitdigitizer.cc:109  hshowerhitdigitizer.cc:110  hshowerhitdigitizer.cc:111  hshowerhitdigitizer.cc:112  hshowerhitdigitizer.cc:113  hshowerhitdigitizer.cc:114  hshowerhitdigitizer.cc:115  hshowerhitdigitizer.cc:116  hshowerhitdigitizer.cc:117  hshowerhitdigitizer.cc:118  hshowerhitdigitizer.cc:119  hshowerhitdigitizer.cc:120  hshowerhitdigitizer.cc:121  hshowerhitdigitizer.cc:122  hshowerhitdigitizer.cc:123  hshowerhitdigitizer.cc:124  hshowerhitdigitizer.cc:125  hshowerhitdigitizer.cc:126  hshowerhitdigitizer.cc:127  hshowerhitdigitizer.cc:128  hshowerhitdigitizer.cc:129  hshowerhitdigitizer.cc:130  hshowerhitdigitizer.cc:131  hshowerhitdigitizer.cc:132  hshowerhitdigitizer.cc:133  hshowerhitdigitizer.cc:134  hshowerhitdigitizer.cc:135  hshowerhitdigitizer.cc:136  hshowerhitdigitizer.cc:137  hshowerhitdigitizer.cc:138  hshowerhitdigitizer.cc:139  hshowerhitdigitizer.cc:140  hshowerhitdigitizer.cc:141  hshowerhitdigitizer.cc:142  hshowerhitdigitizer.cc:143  hshowerhitdigitizer.cc:144  hshowerhitdigitizer.cc:145  hshowerhitdigitizer.cc:146  hshowerhitdigitizer.cc:147  hshowerhitdigitizer.cc:148  hshowerhitdigitizer.cc:149  hshowerhitdigitizer.cc:150  hshowerhitdigitizer.cc:151  hshowerhitdigitizer.cc:152  hshowerhitdigitizer.cc:153  hshowerhitdigitizer.cc:154  hshowerhitdigitizer.cc:155  hshowerhitdigitizer.cc:156  hshowerhitdigitizer.cc:157  hshowerhitdigitizer.cc:158  hshowerhitdigitizer.cc:159  hshowerhitdigitizer.cc:160  hshowerhitdigitizer.cc:161  hshowerhitdigitizer.cc:162  hshowerhitdigitizer.cc:163  hshowerhitdigitizer.cc:164  hshowerhitdigitizer.cc:165  hshowerhitdigitizer.cc:166  hshowerhitdigitizer.cc:167  hshowerhitdigitizer.cc:168  hshowerhitdigitizer.cc:169  hshowerhitdigitizer.cc:170  hshowerhitdigitizer.cc:171  hshowerhitdigitizer.cc:172  hshowerhitdigitizer.cc:173  hshowerhitdigitizer.cc:174  hshowerhitdigitizer.cc:175  hshowerhitdigitizer.cc:176  hshowerhitdigitizer.cc:177  hshowerhitdigitizer.cc:178  hshowerhitdigitizer.cc:179  hshowerhitdigitizer.cc:180  hshowerhitdigitizer.cc:181  hshowerhitdigitizer.cc:182  hshowerhitdigitizer.cc:183  hshowerhitdigitizer.cc:184  hshowerhitdigitizer.cc:185  hshowerhitdigitizer.cc:186  hshowerhitdigitizer.cc:187  hshowerhitdigitizer.cc:188  hshowerhitdigitizer.cc:189  hshowerhitdigitizer.cc:190  hshowerhitdigitizer.cc:191  hshowerhitdigitizer.cc:192  hshowerhitdigitizer.cc:193  hshowerhitdigitizer.cc:194  hshowerhitdigitizer.cc:195  hshowerhitdigitizer.cc:196  hshowerhitdigitizer.cc:197  hshowerhitdigitizer.cc:198  hshowerhitdigitizer.cc:199  hshowerhitdigitizer.cc:200  hshowerhitdigitizer.cc:201  hshowerhitdigitizer.cc:202  hshowerhitdigitizer.cc:203  hshowerhitdigitizer.cc:204  hshowerhitdigitizer.cc:205  hshowerhitdigitizer.cc:206  hshowerhitdigitizer.cc:207  hshowerhitdigitizer.cc:208  hshowerhitdigitizer.cc:209  hshowerhitdigitizer.cc:210  hshowerhitdigitizer.cc:211  hshowerhitdigitizer.cc:212  hshowerhitdigitizer.cc:213  hshowerhitdigitizer.cc:214  hshowerhitdigitizer.cc:215  hshowerhitdigitizer.cc:216  hshowerhitdigitizer.cc:217  hshowerhitdigitizer.cc:218  hshowerhitdigitizer.cc:219  hshowerhitdigitizer.cc:220  hshowerhitdigitizer.cc:221  hshowerhitdigitizer.cc:222  hshowerhitdigitizer.cc:223  hshowerhitdigitizer.cc:224  hshowerhitdigitizer.cc:225  hshowerhitdigitizer.cc:226  hshowerhitdigitizer.cc:227  hshowerhitdigitizer.cc:228  hshowerhitdigitizer.cc:229  hshowerhitdigitizer.cc:230  hshowerhitdigitizer.cc:231  hshowerhitdigitizer.cc:232  hshowerhitdigitizer.cc:233  hshowerhitdigitizer.cc:234  hshowerhitdigitizer.cc:235  hshowerhitdigitizer.cc:236  hshowerhitdigitizer.cc:237  hshowerhitdigitizer.cc:238  hshowerhitdigitizer.cc:239  hshowerhitdigitizer.cc:240  hshowerhitdigitizer.cc:241  hshowerhitdigitizer.cc:242  hshowerhitdigitizer.cc:243  hshowerhitdigitizer.cc:244  hshowerhitdigitizer.cc:245  hshowerhitdigitizer.cc:246  hshowerhitdigitizer.cc:247  hshowerhitdigitizer.cc:248  hshowerhitdigitizer.cc:249  hshowerhitdigitizer.cc:250  hshowerhitdigitizer.cc:251  hshowerhitdigitizer.cc:252  hshowerhitdigitizer.cc:253  hshowerhitdigitizer.cc:254  hshowerhitdigitizer.cc:255  hshowerhitdigitizer.cc:256  hshowerhitdigitizer.cc:257  hshowerhitdigitizer.cc:258  hshowerhitdigitizer.cc:259  hshowerhitdigitizer.cc:260  hshowerhitdigitizer.cc:261  hshowerhitdigitizer.cc:262  hshowerhitdigitizer.cc:263  hshowerhitdigitizer.cc:264  hshowerhitdigitizer.cc:265  hshowerhitdigitizer.cc:266  hshowerhitdigitizer.cc:267  hshowerhitdigitizer.cc:268  hshowerhitdigitizer.cc:269  hshowerhitdigitizer.cc:270  hshowerhitdigitizer.cc:271  hshowerhitdigitizer.cc:272  hshowerhitdigitizer.cc:273  hshowerhitdigitizer.cc:274  hshowerhitdigitizer.cc:275  hshowerhitdigitizer.cc:276  hshowerhitdigitizer.cc:277  hshowerhitdigitizer.cc:278  hshowerhitdigitizer.cc:279  hshowerhitdigitizer.cc:280  hshowerhitdigitizer.cc:281  hshowerhitdigitizer.cc:282  hshowerhitdigitizer.cc:283  hshowerhitdigitizer.cc:284  hshowerhitdigitizer.cc:285  hshowerhitdigitizer.cc:286  hshowerhitdigitizer.cc:287  hshowerhitdigitizer.cc:288  hshowerhitdigitizer.cc:289  hshowerhitdigitizer.cc:290  hshowerhitdigitizer.cc:291  hshowerhitdigitizer.cc:292  hshowerhitdigitizer.cc:293  hshowerhitdigitizer.cc:294  hshowerhitdigitizer.cc:295  hshowerhitdigitizer.cc:296  hshowerhitdigitizer.cc:297  hshowerhitdigitizer.cc:298  hshowerhitdigitizer.cc:299  hshowerhitdigitizer.cc:300  hshowerhitdigitizer.cc:301  hshowerhitdigitizer.cc:302  hshowerhitdigitizer.cc:303  hshowerhitdigitizer.cc:304  hshowerhitdigitizer.cc:305  hshowerhitdigitizer.cc:306  hshowerhitdigitizer.cc:307  hshowerhitdigitizer.cc:308  hshowerhitdigitizer.cc:309  hshowerhitdigitizer.cc:310  hshowerhitdigitizer.cc:311  hshowerhitdigitizer.cc:312  hshowerhitdigitizer.cc:313  hshowerhitdigitizer.cc:314  hshowerhitdigitizer.cc:315