//----------------------------------------------- // 2017.7.18 for ICM (induced charge model) by Taka Kondo (KEK) //----------------------------------------------- #include "Ramo.h" void execute(double& max_clsize) ; TProfile *h, *m_h_phi ; TLegend *leg, *leg1; TLatex *t; void plot_LA_simulation(){ TCanvas *c1 = new TCanvas("c1","A Simple Graph ",300,0,750,560); c1->SetGrid(1); int HV0[3]={75,100,150}; //------------set main parameters and initialization---------------- m_isSCTDigiModel = true; // (old) SCT Digitization model m_isSCTDigiModel = false; // induced charge model m_isNewCrossTalk = false; m_is25nsGate = true ; m_is25nsGate = false ; m_coutLevel = 3; // all details m_coutLevel = 1; // all details m_coutLevel = 0; // 0(print every 2000 event) m_coutLevel = -1; // 0(print every 2000 event) //------------local_phi and eta samplings ------------- int TotalEventNumber =200000; TotalEventNumber =2000; double newClusterSize[100]={}, Vbias[100]={}; int nVbias=0; //-------after initialization changes ----- m_phi_min = -20.; m_phi_max = 10. ; m_eta_min = 1.4; m_eta_max = 1.6 ; m_eh_pairs = 108.; double absEtaL[4]={0.0, 0.4, 0.9, 1.4}; double absEtaH[4]={0.1, 0.6, 1.1, 1.6}; //m_isLandau=true; //----------------- // leg = new TLegend(0.55,0.73,0.95,0.88); double ymax=3.0, ymin=0.9; double xmin = -20., xmax = 10.; int nVD = 0; int VDlist[8] = {+30,-30,-30}; //for (int kVD=0; kVD<8; kVD++) { for (int kVD = 0; kVD<2; kVD++) { //for (int imodel=0; imodel<4; imodel++) { for (int imodel=1; imodel<=1; imodel++) { c1->Divide(3,1); nVD++; m_VD = VDlist[kVD]; switch(imodel){ case 0: m_isNewCrossTalk = false; m_is25nsGate = false ; break; case 1: m_isNewCrossTalk = false; m_is25nsGate = true ; break; case 2: m_isNewCrossTalk = true; m_is25nsGate = false ; break; case 3: m_isNewCrossTalk = true; m_is25nsGate = true ; break; } //---------------------------- for (int iVB=0; iVB<3; iVB++) { c1->cd(iVB+1); m_VB = HV0[iVB]; initialize(); cout<<"imodel, VB = "<=0; ieta--) { m_eta_min = absEtaL[ieta]; m_eta_max = absEtaH[ieta]; sprintf(m_cid,"VB= %d, %d",iVB, ieta); h = new TProfile(m_cid,"HVscan",60, -20., 10., 0., 50.); //------------------------------------ for (int n=0; nGetBinContent(i+1) <=0.) { xx[i] = h->GetXaxis()->GetBinCenter(i+1); yy[i] = h->GetBinContent(i+1); cout< SetMaximum(ymax); h1 -> SetMinimum(ymin); h1 -> SetMarkerColor(nVD); //h -> SetLineColor(1); //h1 -> SetLineColor(nVD); h1 -> GetXaxis()->SetTitle("inc. angle #phi [degree]"); h1 -> GetYaxis()->SetTitle("new cluster size"); h1 -> GetXaxis()->SetLimits(xmin,xmax); h1->GetXaxis()->SetLabelSize(0.07); h1->GetYaxis()->SetLabelSize(0.07); h1->GetXaxis()->SetTitleSize(0.07); h1->GetYaxis()->SetTitleSize(0.07); h1->GetXaxis()->SetTitleOffset(0.60); h1->GetYaxis()->SetTitleOffset(1.25); h1->GetXaxis()->SetLabelOffset(-0.02); h1->GetYaxis()->SetLabelOffset(0.01); h1->SetMarkerColor(ieta+1); h1->SetMarkerSize(0.5); //sprintf(m_cid,"check only at 30ns"); //if(imodel==1)sprintf(m_cid,"check for full 25ns"); //if(imodel==2)sprintf(m_cid,"new crosstalk shape"); //if(imodel==3)sprintf(m_cid,"25 ns + new crosstalk"); if( ieta==3) h1 -> Draw("AP"); else h1 -> Draw("SAME P"); sprintf(m_cid," %3.1f - %3.1f", m_eta_min, m_eta_max) ; leg->AddEntry(h1,m_cid,"p"); } // leg->SetFillColor(10);leg->SetBorderSize(0); //leg->SetTextSize(0.03); leg->Draw(); //gPad->RedrawAxis(); //------------------------------------- leg->SetFillColor(10);leg->SetBorderSize(1); leg->SetTextSize(0.07); leg->Draw(); TLatex *t; t=new TLatex(xmin, (ymax-ymin)*1.01+ymin,"SCT Digitization Model"); if(!m_isSCTDigiModel) t=new TLatex(xmin, (ymax-ymin)*1.01+ymin,"Induced Charge Model"); t->SetTextSize(0.08); t->Draw(); double xx1 = (xmax-xmin)*0.08+xmin; sprintf(m_cid,"V_{FD}=%dV", int(m_VD)); t=new TLatex(xx1, (ymax-ymin)*0.92+ymin,m_cid); t->SetTextSize(0.070); t->Draw(); xx1=(xmax-xmin)*0.50+xmin; sprintf(m_cid,"HV=%dV", int(m_VB)); t=new TLatex(xx1, (ymax-ymin)*0.70+ymin,m_cid); t->SetTextSize(0.090); t->Draw(); } // int Layer=3; // sprintf(m_cid,"B%d Run%d HV=%dV",Layer, run,HV); // TLatex *t= new TLatex(xmin,(ymax-ymin)*1.01+ymin,m_cid); // t->SetTextSize(0.08); t->Draw(); //-------store results----------- sprintf(m_cid,"LA_ICM_%dV_%d.png",int(m_VD),imodel); if(m_isSCTDigiModel) sprintf(m_cid,"LA_sctDigi_%dV_%d.png",int(m_VD),imodel); c1->Print(m_cid); c1->Clear(); } // loop for imodel } // loop for VFD return; } void execute() { m_eventNumber++ ; //--------------- dE/dX fluctuation ------------------------------ double Landau = 108.; if(m_isLandau) { for (int j=0; j<100; j++) { Landau = gRandom->Landau(72., 11.8) ; if (Landau < 500.) break; } } // eh_pairs = number of eh_pairs per micros double eh_pairs = m_eh_pairs * Landau/108. ; //------------------particle track generation------------------------------ double radian = 180./3.141593; double width = m_phi_max - m_phi_min; double phi = m_phi_min + width * gRandom->Uniform(0.0,1.0); width = m_eta_max - m_eta_min; double eta = m_eta_min + width * gRandom->Uniform(0.0,1.0); double z_theta = 2.* atan(exp(-eta)); width = m_x_origin_max - m_x_origin_min; double x_origin = m_x_origin_min + width * gRandom->Uniform(0.0,1.0); // charge = total eh_pair charges in fC double charge = m_bulk_depth * 1.E4 * eh_pairs *1.6E-19/1.E-15; //cout<<"eh_pairs = "<=0 && jstrip < 21) qstrip[jstrip][it] += Q_m2[it]; // m1 jstrip++; if (jstrip >=0 && jstrip < 21) qstrip[jstrip][it] += Q_m1[it]; // 00 jstrip++; if (jstrip >=0 && jstrip < 21) qstrip[jstrip][it] += Q_00[it]; // p1 jstrip++; if (jstrip >=0 && jstrip < 21) qstrip[jstrip][it] += Q_p1[it]; // p2 jstrip++; if (jstrip >=0 && jstrip < 21) qstrip[jstrip][it] += Q_p2[it]; //-----------------print one track result---------------- } // --- end of time bin loop } // -----------------end of one track loop --------------- //-----------------print one track result---------------- if( m_eventNumber < 0 || m_coutLevel > 2 ) { double totalCharge = 0.; for (int it=0; it<200; it++) { sprintf(m_cid,"%d : %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f",it, qstrip[7][it],qstrip[8][it],qstrip[9][it],qstrip[10][it],qstrip[11][it], qstrip[12][it],qstrip[13][it],qstrip[14][it]); cout< m_GateStartTiming + m_GateWidth) break; //skip later charges // add amplified pulses for (int jt = 1 ; jt < 400 ; jt++ ) { // trace every m_transportTimeStap double timeAmp = jt * m_transportTimeStep ; double time = time0 + timeAmp; if (time > m_GateStartTiming + m_GateWidth) break; int itime = time / m_transportTimeStep ; if( itime >= 400) break; double response = Amp_response(timeAmp) * delta_q; double crosstalk = Amp_crosstalk(timeAmp) * delta_q; //cout< "< 0 ) Pulse[istrip-1][itime] += crosstalk; if( istrip < 19) Pulse[istrip+1][itime] += crosstalk; } } } //-------find maximum cluster size within the gate -------- int hit[21]={} ; clusterSize = 0; // for (int it=0; it<400; it++) { double timeOfPulse = (it+0.5) * m_transportTimeStep; if ( timeOfPulse < m_GateStartTiming ) continue; if ( timeOfPulse > m_GateStartTiming + m_GateWidth ) break; //-------print center strip pulses ------------- //if( m_coutLevel > 0 && m_eventNumber < 3) { if( m_coutLevel > 0) { sprintf(m_cid,"%d(%6.3fns) : %5.2f %5.2f %5.2f %5.2f %5.2f %5.2f %5.2f %5.2f",it, (it+0.5)*m_transportTimeStep,Pulse[7][it], Pulse[8][it],Pulse[9][it],Pulse[10][it],Pulse[11][it], Pulse[12][it],Pulse[13][it],Pulse[14][it]); cout<0 || m_eventNumber%2000==0) { for (int i=0; i<21 ; i++ ) cout<