Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Anomalous couplings histograms merged #644

Open
wants to merge 56 commits into
base: 102x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
fc0caf7
first try for an anomalous couplings class operating on histograms
hroskes May 28, 2018
a5a5450
instantiate
hroskes May 29, 2018
17419dc
fix diffNuisances
hroskes Jun 29, 2018
2bba1b5
Need algorithm in 94X
usarica Aug 5, 2018
4c0fbcf
Might be more efficient to pass by reference
usarica Aug 5, 2018
366187e
Merge branch 'usarica-81x-root606' into 94x
nucleosynthesis Aug 6, 2018
6ee56e8
Merge remote-tracking branch 'origin/81x-root606' into 94x
nucleosynthesis Sep 17, 2018
5923869
Remove assert on reference passed pdf
nucleosynthesis Sep 17, 2018
99d9020
Merge branch '94x' of github.com:cms-analysis/HiggsAnalysis-CombinedL…
hroskes Oct 16, 2018
9d0e74a
minor fixes
hroskes Nov 20, 2018
3c437fb
Merge branch '81x-root606' of github.com:cms-analysis/HiggsAnalysis-C…
hroskes Nov 20, 2018
031c141
error message instead of a segmentation fault
hroskes Nov 20, 2018
3610836
fixes in HZZAnomalousCouplingsFromHistograms
hroskes Nov 20, 2018
b6a65ad
new classes to reduce duplicated code
hroskes Dec 28, 2018
0ad81a8
possibility to leave out RV or RF (e.g. for ggH only fits)
hroskes Dec 28, 2018
a0c78fc
enable turnoff for the histogram class
hroskes Dec 28, 2018
0381f43
fix for rare cases when x == last bin edge + tiny number
hroskes Dec 30, 2018
905e08d
Merge branch 'saveSpecifiedNuis-group' of github.com:hroskes/HiggsAna…
hroskes Jan 4, 2019
821aa7c
Merge branch '81x-root606' of github.com:cms-analysis/HiggsAnalysis-C…
hroskes Jan 10, 2019
3f28d29
Merge branch '102x' of github.com:cms-analysis/HiggsAnalysis-Combined…
hroskes Mar 10, 2019
63315b8
generalizing to more couplings
hroskes Apr 18, 2019
72573fd
fix
hroskes Apr 18, 2019
6d6961e
scale L1 by 10000
hroskes Apr 29, 2019
a59bd80
Merge branch '102x' of github.com:cms-analysis/HiggsAnalysis-Combined…
hroskes May 20, 2019
c1d21a5
fix scaling by 10000
hroskes May 21, 2019
f1091ec
use actual ranges instead of a kill switch
hroskes May 21, 2019
a8ef814
order matters now
hroskes May 21, 2019
3864894
allow fais to be relative, e.g. fa2 = fa2relative * (1-fa3)
hroskes Jun 6, 2019
627c1a4
more general structure that allows for defining fa1 earlier in the se…
hroskes Jun 7, 2019
a4a8348
fixes for fa1
hroskes Jun 7, 2019
c0d5876
separate allowPMF by coupling
hroskes Jun 16, 2019
441b66f
allow RooCategories to have flatParam
hroskes Jun 17, 2019
fd4d19b
alternative input methods for HZZAnomalousCouplingsFromHistograms
hroskes Jun 20, 2019
9c60922
Merge branch '102x-fix-big-addpdf' of github.com:cms-analysis/HiggsAn…
hroskes Jul 5, 2019
376e160
allow VH process (ZH+WH combined)
hroskes Jul 16, 2019
e545ae8
less printing
hroskes Jul 31, 2019
18f9d80
run with fa3ggH and fCPttH
hroskes Aug 13, 2019
205e7cb
relate ggH and ttH
hroskes Aug 16, 2019
caa0c46
fix spelling
hroskes Aug 18, 2019
fcaf67f
fully implement Hff stuff
hroskes Aug 18, 2019
d8862da
class to put systematics in the datacard with linear interpolation in…
hroskes Aug 19, 2019
9e9f336
fix relationship between Htt and Hgg
hroskes Aug 19, 2019
706b911
this didn't make sense
hroskes Sep 25, 2019
2236fdf
class for anomalous couplings as couplings instead of fractions
hroskes Oct 2, 2019
4d37f2b
new gammaH and EFT
skyriacoCMS Feb 4, 2020
0e0d9fe
fixes
skyriacoCMS Feb 4, 2020
cfed1d4
new formulas
skyriacoCMS Feb 5, 2020
1f8d427
Update numbers introduce switch
skyriacoCMS Feb 7, 2020
baa0418
new gamma def
skyriacoCMS Feb 10, 2020
2247bf9
Merge branch '102x' of github.com:hroskes/HiggsAnalysis-CombinedLimit…
hroskes Feb 11, 2020
99639da
Merge branch '102x' of github.com:skyriacoCMS/HiggsAnalysis-CombinedL…
hroskes Feb 11, 2020
ccddbf5
put mZ^2 in the right place
hroskes Feb 14, 2020
121ff17
factor of 4
hroskes Feb 14, 2020
3281a11
Merge branch '102x' of github.com:cms-analysis/HiggsAnalysis-Combined…
hroskes Feb 10, 2021
7af8d8f
HIG-19-009 physics models
skyriaco Feb 11, 2021
b2a46f8
Split Physics model in new file as requested
skyriaco Mar 11, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion interface/FastTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ template <typename U> class FastHistoAxis_t {
}

int FindBin(const U& x) const{
if (x==binEdges_.at(size()-1) && size()>1) return (int)(size()-2);
if (x>=binEdges_.at(size()-1) && size()>1) return (int)(size()-2);
auto bbegin = binEdges_.begin();
auto bend = binEdges_.end();
auto match = std::upper_bound(bbegin, bend, x);
Expand Down
27 changes: 7 additions & 20 deletions interface/HZZ4L_RooSpinZeroPdf_1D_fast.h
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
#ifndef HZZ4L_ROOSPINZEROPDF_1D_FAST
#define HZZ4L_ROOSPINZEROPDF_1D_FAST

#include "RooAbsReal.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooConstVar.h"
#include "RooRealProxy.h"
#include "RooListProxy.h"
#include "HZZ4L_RooSpinZeroPdf_1D_fast_base.h"

#include "RooRealProxy.h"

class HZZ4L_RooSpinZeroPdf_1D_fast : public RooAbsPdf{
class HZZ4L_RooSpinZeroPdf_1D_fast : public HZZ4L_RooSpinZeroPdf_1D_fast_base{
protected:
RooRealProxy fai1;

RooListProxy obsList; // List of observables
RooListProxy coefList; // List of pdf components

virtual double a1Val() const;
virtual double ai1Val() const;
virtual bool isAnomalousCouplingValueValid() const;
public:
HZZ4L_RooSpinZeroPdf_1D_fast();
HZZ4L_RooSpinZeroPdf_1D_fast(
Expand All @@ -24,19 +19,11 @@ class HZZ4L_RooSpinZeroPdf_1D_fast : public RooAbsPdf{
const RooArgList& inObsList,
const RooArgList& inCoefList
);

HZZ4L_RooSpinZeroPdf_1D_fast(const HZZ4L_RooSpinZeroPdf_1D_fast& other, const char* name=0);
virtual TObject* clone(const char* newname) const { return new HZZ4L_RooSpinZeroPdf_1D_fast(*this, newname); }
inline virtual ~HZZ4L_RooSpinZeroPdf_1D_fast(){}

Float_t interpolateFcn(Int_t code, const char* rangeName=0) const;
Double_t evaluate() const;
Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const;
Double_t analyticalIntegral(Int_t code, const char* rangeName=0) const;

protected:
ClassDef(HZZ4L_RooSpinZeroPdf_1D_fast, 1)

};

#endif
30 changes: 30 additions & 0 deletions interface/HZZ4L_RooSpinZeroPdf_1D_fast_a1ai.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef HZZ4L_ROOSPINZEROPDF_1D_FAST_A1AI
#define HZZ4L_ROOSPINZEROPDF_1D_FAST_A1AI

#include "HZZ4L_RooSpinZeroPdf_1D_fast_base.h"

#include "RooRealProxy.h"

class HZZ4L_RooSpinZeroPdf_1D_fast_a1ai : public HZZ4L_RooSpinZeroPdf_1D_fast_base{
protected:
RooRealProxy a1, ai1;
virtual double a1Val() const;
virtual double ai1Val() const;
virtual bool isAnomalousCouplingValueValid() const;
public:
HZZ4L_RooSpinZeroPdf_1D_fast_a1ai();
HZZ4L_RooSpinZeroPdf_1D_fast_a1ai(
const char *name, const char *title,
RooAbsReal& in_a1,
RooAbsReal& in_ai1,
const RooArgList& inObsList,
const RooArgList& inCoefList
);
HZZ4L_RooSpinZeroPdf_1D_fast_a1ai(const HZZ4L_RooSpinZeroPdf_1D_fast_a1ai& other, const char* name=0);
virtual TObject* clone(const char* newname) const { return new HZZ4L_RooSpinZeroPdf_1D_fast_a1ai(*this, newname); }

protected:
ClassDef(HZZ4L_RooSpinZeroPdf_1D_fast_a1ai, 1)
};

#endif
38 changes: 38 additions & 0 deletions interface/HZZ4L_RooSpinZeroPdf_1D_fast_base.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#ifndef HZZ4L_ROOSPINZEROPDF_1D_FAST_BASE
#define HZZ4L_ROOSPINZEROPDF_1D_FAST_BASE

#include "RooAbsReal.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooConstVar.h"
#include "RooListProxy.h"


class HZZ4L_RooSpinZeroPdf_1D_fast_base : public RooAbsPdf{
protected:
RooListProxy obsList; // List of observables
RooListProxy coefList; // List of pdf components

virtual double a1Val() const = 0;
virtual double ai1Val() const = 0;
virtual bool isAnomalousCouplingValueValid() const = 0;

public:
HZZ4L_RooSpinZeroPdf_1D_fast_base();
HZZ4L_RooSpinZeroPdf_1D_fast_base(
const char *name, const char *title,
const RooArgList& inObsList,
const RooArgList& inCoefList
);

HZZ4L_RooSpinZeroPdf_1D_fast_base(const HZZ4L_RooSpinZeroPdf_1D_fast_base& other, const char* name=0);
virtual TObject* clone(const char* newname) const = 0;
inline virtual ~HZZ4L_RooSpinZeroPdf_1D_fast_base(){}

Float_t interpolateFcn(Int_t code, const char* rangeName=0) const;
Double_t evaluate() const;
Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const;
Double_t analyticalIntegral(Int_t code, const char* rangeName=0) const;
};

#endif
27 changes: 7 additions & 20 deletions interface/VVHZZ4L_RooSpinZeroPdf_1D_fast.h
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
#ifndef VVHZZ4L_ROOSPINZEROPDF_1D_FAST
#define VVHZZ4L_ROOSPINZEROPDF_1D_FAST

#include "RooAbsReal.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooConstVar.h"
#include "RooRealProxy.h"
#include "RooListProxy.h"
#include "VVHZZ4L_RooSpinZeroPdf_1D_fast_base.h"

#include "RooRealProxy.h"

class VVHZZ4L_RooSpinZeroPdf_1D_fast : public RooAbsPdf{
class VVHZZ4L_RooSpinZeroPdf_1D_fast : public VVHZZ4L_RooSpinZeroPdf_1D_fast_base{
protected:
RooRealProxy fai1;

RooListProxy obsList; // List of observables
RooListProxy coefList; // List of pdf components

virtual double a1Val() const;
virtual double ai1Val() const;
virtual bool isAnomalousCouplingValueValid() const;
public:
VVHZZ4L_RooSpinZeroPdf_1D_fast();
VVHZZ4L_RooSpinZeroPdf_1D_fast(
Expand All @@ -24,19 +19,11 @@ class VVHZZ4L_RooSpinZeroPdf_1D_fast : public RooAbsPdf{
const RooArgList& inObsList,
const RooArgList& inCoefList
);

VVHZZ4L_RooSpinZeroPdf_1D_fast(const VVHZZ4L_RooSpinZeroPdf_1D_fast& other, const char* name=0);
virtual TObject* clone(const char* newname) const { return new VVHZZ4L_RooSpinZeroPdf_1D_fast(*this, newname); }
inline virtual ~VVHZZ4L_RooSpinZeroPdf_1D_fast(){}

Float_t interpolateFcn(Int_t code, const char* rangeName=0) const;
Double_t evaluate() const;
Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const;
Double_t analyticalIntegral(Int_t code, const char* rangeName=0) const;

protected:
ClassDef(VVHZZ4L_RooSpinZeroPdf_1D_fast, 1)

};

#endif
30 changes: 30 additions & 0 deletions interface/VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef VVHZZ4L_ROOSPINZEROPDF_1D_FAST_A1AI
#define VVHZZ4L_ROOSPINZEROPDF_1D_FAST_A1AI

#include "VVHZZ4L_RooSpinZeroPdf_1D_fast_base.h"

#include "RooRealProxy.h"

class VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai : public VVHZZ4L_RooSpinZeroPdf_1D_fast_base{
protected:
RooRealProxy a1, ai1;
virtual double a1Val() const;
virtual double ai1Val() const;
virtual bool isAnomalousCouplingValueValid() const;
public:
VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai();
VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai(
const char *name, const char *title,
RooAbsReal& in_a1,
RooAbsReal& in_ai1,
const RooArgList& inObsList,
const RooArgList& inCoefList
);
VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai(const VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai& other, const char* name=0);
virtual TObject* clone(const char* newname) const { return new VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai(*this, newname); }

protected:
ClassDef(VVHZZ4L_RooSpinZeroPdf_1D_fast_a1ai, 1)
};

#endif
38 changes: 38 additions & 0 deletions interface/VVHZZ4L_RooSpinZeroPdf_1D_fast_base.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#ifndef VVHZZ4L_ROOSPINZEROPDF_1D_FAST_BASE
#define VVHZZ4L_ROOSPINZEROPDF_1D_FAST_BASE

#include "RooAbsReal.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooConstVar.h"
#include "RooListProxy.h"


class VVHZZ4L_RooSpinZeroPdf_1D_fast_base : public RooAbsPdf{
protected:
RooListProxy obsList; // List of observables
RooListProxy coefList; // List of pdf components

virtual double a1Val() const = 0;
virtual double ai1Val() const = 0;
virtual bool isAnomalousCouplingValueValid() const = 0;

public:
VVHZZ4L_RooSpinZeroPdf_1D_fast_base();
VVHZZ4L_RooSpinZeroPdf_1D_fast_base(
const char *name, const char *title,
const RooArgList& inObsList,
const RooArgList& inCoefList
);

VVHZZ4L_RooSpinZeroPdf_1D_fast_base(const VVHZZ4L_RooSpinZeroPdf_1D_fast_base& other, const char* name=0);
virtual TObject* clone(const char* newname) const = 0;
inline virtual ~VVHZZ4L_RooSpinZeroPdf_1D_fast_base(){}

Float_t interpolateFcn(Int_t code, const char* rangeName=0) const;
Double_t evaluate() const;
Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const;
Double_t analyticalIntegral(Int_t code, const char* rangeName=0) const;
};

#endif
3 changes: 3 additions & 0 deletions python/ModelTools.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ def __init__(self,datacard,options):
def setPhysics(self,physicsModel):
self.physics = physicsModel
self.physics.setModelBuilder(self)
for b in self.DC.bins:
for p in self.DC.exp[b].keys():
self.physics.tellAboutProcess(b, p)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not clear to me why this is needed - the physics model will already have access to the DC object after L108 here, so if you need to loop through bins and processes in your physics model you can already do this before you reach getYieldScale. Or am I missing something?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ajgilbert

Hello Andrew,

About the issue with the RooCategory/flatparameter.
You can find in these paths, the workspace, log and output:
/work-zfs/lhc/heshy/anomalouscouplings/scans/cards_fa3fa2fL1fL1Zg_morecategories_finalforthesis/workspace_lumi137.10_scanfa2_fa2,fL1Zg,fa3,fa1,fL1.root
/work-zfs/lhc/heshy/anomalouscouplings/scans/cards_fa3fa2fL1fL1Zg_morecategories_finalforthesis/log_MultiDimFit_obs_lumi137.10_scanfa2_fa2,fL1Zg,fa3,fa1,fL1.txt
/work-zfs/lhc/heshy/anomalouscouplings/scans/cards_fa3fa2fL1fL1Zg_morecategories_finalforthesis/higgsCombine_obs_lumi137.10_scanfa2_fa2,fL1Zg,fa3,fa1,fL1.MultiDimFit.mH125.root
(the RooCategory in question is sgnCMS_zz4l_fai3, which is the sign of fL1).

About the changes the Physics Model
Basically we need to determine, before we call getYieldScale, whether or not there are anomalous Hff couplings. I accomplished that using this function:
https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/pull/644/files#diff-cb18764af2f0bc5de53451336a743a02148824b812b911c4ba119cc49a994b7eR628-R631
Andrew I can do the modification you suggest here and make a new commit, if you think this is cleaner.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello Andrew,

The paths above for the files need to be updated. Let me do this quickly.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I don't really understand what I'm supposed to checking in this link. To confirm:

  • You will add a new commit to revert the changes in PhysicsModel.py and ModelTools.py?
  • RooCategory/flatParam: as Nick wrote above

Now, turning to the behaviour of combine with the RooCategory, what you say about the behaviour of combine is news to me. it's true that combine will do separate fits and then find the one that gives the lowest NLL but for this one has to declare the parameter as a discrete rather than flatParam - at least thats the behaviour I am aware of

I second this, it is not clear to me that flatParam is needed for floating a discrete parameter. Can you explain more clearly why you think it is, ideally with links to the code?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In reference to the RooCategory/flatParam thing, there is a way that something not declared in the list of discretes can be picked up, by including the runtime definition ADD_DISCRETE_FALLBACK. Then the current version of the code will pick up anything with pdfindex in the name : https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/102x/src/Combine.cc#L1226-L1240

Now the intention was never to then allow the behaviour to pick up any category, but really for debugging certain workspaces (in particular for the diphoton analyses). I think the best would be to just declare sgnCMS_zz4l_fai3 (which is clearly picked up as a discrete parameter in the output log from @skyriacoCMS) as a discrete in the datacard where its needed.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now the intention was never to then allow the behaviour to pick up any category, but really for debugging certain workspaces (in particular for the diphoton analyses). I think the best would be to just declare sgnCMS_zz4l_fai3 (which is clearly picked up as a discrete parameter in the output log from @skyriacoCMS) as a discrete in the datacard where its needed.

That would be not so desirable for us. The point is that you can use the same datacard to run for multiple configurations (in particular the order of defining the anomalous couplings). All couplings get floated, except that the last one is defined as +/-(1 - sum of the others), where only the sign gets floated. That's decided at the time of text2workspace. Of course you can write it in the datacard and make a separate datacard for every configuration, but it's ugly.

Copy link
Contributor

@nucleosynthesis nucleosynthesis Mar 11, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then why can you not use multiple "sign" categories in the datacard and freeze/float the one that are needed for a specific configuration? Then you only need one workspace.

Or an alternative, to avoid writing lines in the datacard, would be to declare the RooCategory for the sign in the model and then add it to the list of discreteParams in the workspace (since that is what is checked in the end when combine is run). This is where they are created when the card is read :

discparams = ROOT.RooArgSet("discreteParams")

, and here is the lines that will pick them up :
RooArgSet *discreteParameters = (RooArgSet*) w->genobj("discreteParams");
CascadeMinimizerGlobalConfigs::O().pdfCategories = RooArgList();
CascadeMinimizerGlobalConfigs::O().allRooMultiPdfParams = RooArgList();
if (discreteParameters != 0) {
TIterator *dp = discreteParameters->createIterator();
while (RooAbsArg *arg = (RooAbsArg*)dp->Next()) {
RooCategory *cat = dynamic_cast<RooCategory*>(arg);

It should be easy enough in the model to do something similar to the first code block such that the second block will spot them as though they were in the card.

Either of these options would avoid changing the behaviour of combine and would be more desirable

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ajgilbert

Hello Andrew, To answer your request on the python files.
I will make a commit that will change the place of the modifications in the ModelTools.py and add them in the new file SpinZeroStructureAC.py
I will see what we can do about PhysicsModel.py.

Thanks for the feedback.

def doModel(self, justCheckPhysicsModel=False):
if not justCheckPhysicsModel: self.doObservables()
self.physics.doParametersOfInterest()
Expand Down
4 changes: 4 additions & 0 deletions python/PhysicsModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ def doParametersOfInterest(self):
def preProcessNuisances(self,nuisances):
"receive the usual list of (name,nofloat,pdf,args,errline) to be edited"
pass # do nothing by default
def tellAboutProcess(self,bin,process):
"tell the physics model to expect this process, in case it needs to know about all the processes"
"before it gets the yield and scale"
pass # do nothing by default
def getYieldScale(self,bin,process):
"Return the name of a RooAbsReal to scale this yield by or the two special values 1 and 0 (don't scale, and set to zero)"
return "r" if self.DC.isSignal[process] else 1;
Expand Down
Loading